@useupup/vue 3.3.0
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/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/AudioUploader-6ZMGQ3GT.cjs +376 -0
- package/dist/AudioUploader-6ZMGQ3GT.cjs.map +1 -0
- package/dist/AudioUploader-IEWPI3TS.js +376 -0
- package/dist/AudioUploader-IEWPI3TS.js.map +1 -0
- package/dist/BoxUploader-S6CGJLO7.cjs +214 -0
- package/dist/BoxUploader-S6CGJLO7.cjs.map +1 -0
- package/dist/BoxUploader-TIDCYWMC.js +214 -0
- package/dist/BoxUploader-TIDCYWMC.js.map +1 -0
- package/dist/CameraUploader-575RARRY.js +258 -0
- package/dist/CameraUploader-575RARRY.js.map +1 -0
- package/dist/CameraUploader-LBIVBECB.cjs +258 -0
- package/dist/CameraUploader-LBIVBECB.cjs.map +1 -0
- package/dist/DropboxUploader-HTGDBDTB.cjs +216 -0
- package/dist/DropboxUploader-HTGDBDTB.cjs.map +1 -0
- package/dist/DropboxUploader-M2LY2Q32.js +216 -0
- package/dist/DropboxUploader-M2LY2Q32.js.map +1 -0
- package/dist/GoogleDriveUploader-R3WJYLW7.cjs +220 -0
- package/dist/GoogleDriveUploader-R3WJYLW7.cjs.map +1 -0
- package/dist/GoogleDriveUploader-SAY4C2QY.js +220 -0
- package/dist/GoogleDriveUploader-SAY4C2QY.js.map +1 -0
- package/dist/OneDriveUploader-EDB3RJA4.js +219 -0
- package/dist/OneDriveUploader-EDB3RJA4.js.map +1 -0
- package/dist/OneDriveUploader-WYALTOCQ.cjs +219 -0
- package/dist/OneDriveUploader-WYALTOCQ.cjs.map +1 -0
- package/dist/ScreenCaptureUploader-F65CM6OA.js +334 -0
- package/dist/ScreenCaptureUploader-F65CM6OA.js.map +1 -0
- package/dist/ScreenCaptureUploader-TZ74W7WQ.cjs +334 -0
- package/dist/ScreenCaptureUploader-TZ74W7WQ.cjs.map +1 -0
- package/dist/UrlUploader-PXEGUBQ4.js +143 -0
- package/dist/UrlUploader-PXEGUBQ4.js.map +1 -0
- package/dist/UrlUploader-TLYGV433.cjs +143 -0
- package/dist/UrlUploader-TLYGV433.cjs.map +1 -0
- package/dist/assets/logos.d.ts +5 -0
- package/dist/assets/logos.d.ts.map +1 -0
- package/dist/chunk-D32QOALR.cjs +1083 -0
- package/dist/chunk-D32QOALR.cjs.map +1 -0
- package/dist/chunk-GG4ABGXB.cjs +62 -0
- package/dist/chunk-GG4ABGXB.cjs.map +1 -0
- package/dist/chunk-GVB7IFRP.cjs +0 -0
- package/dist/chunk-GVB7IFRP.cjs.map +1 -0
- package/dist/chunk-IXLKUMV2.cjs +55 -0
- package/dist/chunk-IXLKUMV2.cjs.map +1 -0
- package/dist/chunk-M6AHIQ3M.js +62 -0
- package/dist/chunk-M6AHIQ3M.js.map +1 -0
- package/dist/chunk-PPPFIWFQ.js +1083 -0
- package/dist/chunk-PPPFIWFQ.js.map +1 -0
- package/dist/chunk-RZ7RTSRZ.js +55 -0
- package/dist/chunk-RZ7RTSRZ.js.map +1 -0
- package/dist/chunk-X6FZTCNT.js +0 -0
- package/dist/chunk-X6FZTCNT.js.map +1 -0
- package/dist/components/AudioUploader.vue.d.ts +3 -0
- package/dist/components/AudioUploader.vue.d.ts.map +1 -0
- package/dist/components/AudioWaveform.vue.d.ts +16 -0
- package/dist/components/AudioWaveform.vue.d.ts.map +1 -0
- package/dist/components/BoxUploader.vue.d.ts +3 -0
- package/dist/components/BoxUploader.vue.d.ts.map +1 -0
- package/dist/components/CameraUploader.vue.d.ts +3 -0
- package/dist/components/CameraUploader.vue.d.ts.map +1 -0
- package/dist/components/ClientBoxUploader.vue.d.ts +3 -0
- package/dist/components/ClientBoxUploader.vue.d.ts.map +1 -0
- package/dist/components/ClientDropboxUploader.vue.d.ts +3 -0
- package/dist/components/ClientDropboxUploader.vue.d.ts.map +1 -0
- package/dist/components/ClientGoogleDriveUploader.vue.d.ts +3 -0
- package/dist/components/ClientGoogleDriveUploader.vue.d.ts.map +1 -0
- package/dist/components/ClientOneDriveUploader.vue.d.ts +3 -0
- package/dist/components/ClientOneDriveUploader.vue.d.ts.map +1 -0
- package/dist/components/DefaultLoaderIcon.vue.d.ts +3 -0
- package/dist/components/DefaultLoaderIcon.vue.d.ts.map +1 -0
- package/dist/components/DropboxUploader.vue.d.ts +3 -0
- package/dist/components/DropboxUploader.vue.d.ts.map +1 -0
- package/dist/components/FileHero.vue.d.ts +13 -0
- package/dist/components/FileHero.vue.d.ts.map +1 -0
- package/dist/components/FileIcon.vue.d.ts +9 -0
- package/dist/components/FileIcon.vue.d.ts.map +1 -0
- package/dist/components/FileItem.vue.d.ts +14 -0
- package/dist/components/FileItem.vue.d.ts.map +1 -0
- package/dist/components/FileList.vue.d.ts +3 -0
- package/dist/components/FileList.vue.d.ts.map +1 -0
- package/dist/components/FilePreview.vue.d.ts +22 -0
- package/dist/components/FilePreview.vue.d.ts.map +1 -0
- package/dist/components/FilePreviewPortal.vue.d.ts +15 -0
- package/dist/components/FilePreviewPortal.vue.d.ts.map +1 -0
- package/dist/components/FilePreviewThumbnail.vue.d.ts +19 -0
- package/dist/components/FilePreviewThumbnail.vue.d.ts.map +1 -0
- package/dist/components/FileRow.vue.d.ts +17 -0
- package/dist/components/FileRow.vue.d.ts.map +1 -0
- package/dist/components/GoogleDriveUploader.vue.d.ts +3 -0
- package/dist/components/GoogleDriveUploader.vue.d.ts.map +1 -0
- package/dist/components/Icon.d.ts +36 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icons.d.ts +10 -0
- package/dist/components/Icons.d.ts.map +1 -0
- package/dist/components/ImageEditorStub.vue.d.ts +3 -0
- package/dist/components/ImageEditorStub.vue.d.ts.map +1 -0
- package/dist/components/OneDriveUploader.vue.d.ts +3 -0
- package/dist/components/OneDriveUploader.vue.d.ts.map +1 -0
- package/dist/components/ScreenCaptureUploader.vue.d.ts +3 -0
- package/dist/components/ScreenCaptureUploader.vue.d.ts.map +1 -0
- package/dist/components/ServerModeDriveUploader.vue.d.ts +9 -0
- package/dist/components/ServerModeDriveUploader.vue.d.ts.map +1 -0
- package/dist/components/SourceSelector.vue.d.ts +3 -0
- package/dist/components/SourceSelector.vue.d.ts.map +1 -0
- package/dist/components/SourceView.vue.d.ts +3 -0
- package/dist/components/SourceView.vue.d.ts.map +1 -0
- package/dist/components/UploaderPanel.vue.d.ts +3 -0
- package/dist/components/UploaderPanel.vue.d.ts.map +1 -0
- package/dist/components/UrlUploader.vue.d.ts +3 -0
- package/dist/components/UrlUploader.vue.d.ts.map +1 -0
- package/dist/components/shared/DriveAuthFallback.vue.d.ts +12 -0
- package/dist/components/shared/DriveAuthFallback.vue.d.ts.map +1 -0
- package/dist/components/shared/DriveBrowser.vue.d.ts +28 -0
- package/dist/components/shared/DriveBrowser.vue.d.ts.map +1 -0
- package/dist/components/shared/DriveBrowserHeader.vue.d.ts +13 -0
- package/dist/components/shared/DriveBrowserHeader.vue.d.ts.map +1 -0
- package/dist/components/shared/DriveBrowserIcon.vue.d.ts +7 -0
- package/dist/components/shared/DriveBrowserIcon.vue.d.ts.map +1 -0
- package/dist/components/shared/DriveBrowserItem.vue.d.ts +9 -0
- package/dist/components/shared/DriveBrowserItem.vue.d.ts.map +1 -0
- package/dist/components/shared/FileSuccessCheck.vue.d.ts +20 -0
- package/dist/components/shared/FileSuccessCheck.vue.d.ts.map +1 -0
- package/dist/components/shared/ProgressBar.vue.d.ts +11 -0
- package/dist/components/shared/ProgressBar.vue.d.ts.map +1 -0
- package/dist/components/shared/SourceViewContainer.vue.d.ts +18 -0
- package/dist/components/shared/SourceViewContainer.vue.d.ts.map +1 -0
- package/dist/components/shared/UploaderHeader.vue.d.ts +15 -0
- package/dist/components/shared/UploaderHeader.vue.d.ts.map +1 -0
- package/dist/composables/use-tiles-per-row.d.ts +10 -0
- package/dist/composables/use-tiles-per-row.d.ts.map +1 -0
- package/dist/composables/useBox.d.ts +28 -0
- package/dist/composables/useBox.d.ts.map +1 -0
- package/dist/composables/useCameraUploader.d.ts +25 -0
- package/dist/composables/useCameraUploader.d.ts.map +1 -0
- package/dist/composables/useDropbox.d.ts +28 -0
- package/dist/composables/useDropbox.d.ts.map +1 -0
- package/dist/composables/useFetchFileByUrl.d.ts +8 -0
- package/dist/composables/useFetchFileByUrl.d.ts.map +1 -0
- package/dist/composables/useGoogleDrive.d.ts +28 -0
- package/dist/composables/useGoogleDrive.d.ts.map +1 -0
- package/dist/composables/useOneDrive.d.ts +29 -0
- package/dist/composables/useOneDrive.d.ts.map +1 -0
- package/dist/composables/useSSEProcessing.d.ts +19 -0
- package/dist/composables/useSSEProcessing.d.ts.map +1 -0
- package/dist/composables/useServerModeDrive.d.ts +17 -0
- package/dist/composables/useServerModeDrive.d.ts.map +1 -0
- package/dist/composables/useSourceSelector.d.ts +13 -0
- package/dist/composables/useSourceSelector.d.ts.map +1 -0
- package/dist/composables/useUploaderController.d.ts +4 -0
- package/dist/composables/useUploaderController.d.ts.map +1 -0
- package/dist/composables/useUploaderPanel.d.ts +13 -0
- package/dist/composables/useUploaderPanel.d.ts.map +1 -0
- package/dist/context/source-view-header-extra.d.ts +4 -0
- package/dist/context/source-view-header-extra.d.ts.map +1 -0
- package/dist/context/uploader-context.d.ts +95 -0
- package/dist/context/uploader-context.d.ts.map +1 -0
- package/dist/index.cjs +4405 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4405 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/constants.d.ts +11 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/view-mode.d.ts +24 -0
- package/dist/lib/view-mode.d.ts.map +1 -0
- package/dist/shared/types.d.ts +15 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/styles.d.ts +4 -0
- package/dist/tailwind-prefixed.css +2508 -0
- package/dist/upup-uploader.vue.d.ts +18 -0
- package/dist/upup-uploader.vue.d.ts.map +1 -0
- package/dist/use-upup-upload.d.ts +38 -0
- package/dist/use-upup-upload.d.ts.map +1 -0
- package/package.json +100 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,4405 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Icon,
|
|
3
|
+
Icon_default,
|
|
4
|
+
provideSourceViewHeaderExtra
|
|
5
|
+
} from "./chunk-RZ7RTSRZ.js";
|
|
6
|
+
import {
|
|
7
|
+
export_helper_default,
|
|
8
|
+
provideUploaderContext,
|
|
9
|
+
useUploaderContext,
|
|
10
|
+
useUploaderEditor,
|
|
11
|
+
useUploaderFiles,
|
|
12
|
+
useUploaderI18n,
|
|
13
|
+
useUploaderOptions,
|
|
14
|
+
useUploaderRuntime,
|
|
15
|
+
useUploaderSource,
|
|
16
|
+
useUploaderTheme,
|
|
17
|
+
useUploaderUploadControls,
|
|
18
|
+
useUploaderView
|
|
19
|
+
} from "./chunk-X6FZTCNT.js";
|
|
20
|
+
|
|
21
|
+
// src/upup-uploader.vue
|
|
22
|
+
import { defineComponent as _defineComponent17 } from "vue";
|
|
23
|
+
import { cn as cn15 } from "@useupup/core/internal";
|
|
24
|
+
|
|
25
|
+
// src/composables/useUploaderController.ts
|
|
26
|
+
import {
|
|
27
|
+
ref as ref2,
|
|
28
|
+
shallowRef as shallowRef2,
|
|
29
|
+
computed,
|
|
30
|
+
watch,
|
|
31
|
+
onMounted as onMounted2,
|
|
32
|
+
onUnmounted as onUnmounted3,
|
|
33
|
+
defineComponent,
|
|
34
|
+
h
|
|
35
|
+
} from "vue";
|
|
36
|
+
import {
|
|
37
|
+
normalizeUploaderOptions,
|
|
38
|
+
createUploaderController
|
|
39
|
+
} from "@useupup/core/internal";
|
|
40
|
+
|
|
41
|
+
// src/use-upup-upload.ts
|
|
42
|
+
import { ref, shallowRef, onMounted, onUnmounted } from "vue";
|
|
43
|
+
import { UpupCore } from "@useupup/core";
|
|
44
|
+
function useUpupUpload(options) {
|
|
45
|
+
const core = new UpupCore(options);
|
|
46
|
+
const files = shallowRef([...core.files.values()]);
|
|
47
|
+
const status = ref(core.status);
|
|
48
|
+
const progress = ref({ totalFiles: 0, completedFiles: 0, percentage: 0 });
|
|
49
|
+
const error = shallowRef(null);
|
|
50
|
+
const unsubs = [];
|
|
51
|
+
onMounted(() => {
|
|
52
|
+
unsubs.push(
|
|
53
|
+
core.on("state-change", () => {
|
|
54
|
+
files.value = [...core.files.values()];
|
|
55
|
+
status.value = core.status;
|
|
56
|
+
progress.value = core.progress;
|
|
57
|
+
error.value = core.error;
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
const {
|
|
61
|
+
onFileAdded,
|
|
62
|
+
onFileRemoved,
|
|
63
|
+
onUploadProgress,
|
|
64
|
+
onUploadComplete
|
|
65
|
+
} = options;
|
|
66
|
+
if (onFileAdded) {
|
|
67
|
+
unsubs.push(
|
|
68
|
+
core.on("files-added", (...args) => {
|
|
69
|
+
onFileAdded(...args);
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
if (onFileRemoved) {
|
|
74
|
+
unsubs.push(
|
|
75
|
+
core.on("file-removed", (...args) => {
|
|
76
|
+
onFileRemoved(...args);
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (onUploadProgress) {
|
|
81
|
+
unsubs.push(
|
|
82
|
+
core.on("upload-progress", (...args) => {
|
|
83
|
+
onUploadProgress(
|
|
84
|
+
...args
|
|
85
|
+
);
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
if (onUploadComplete) {
|
|
90
|
+
unsubs.push(
|
|
91
|
+
core.on("upload-all-complete", (...args) => {
|
|
92
|
+
onUploadComplete(...args);
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
onUnmounted(() => {
|
|
98
|
+
unsubs.forEach((u) => {
|
|
99
|
+
u();
|
|
100
|
+
});
|
|
101
|
+
core.destroy();
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
files,
|
|
105
|
+
status,
|
|
106
|
+
progress,
|
|
107
|
+
error,
|
|
108
|
+
addFiles: (f) => core.addFiles(f),
|
|
109
|
+
removeFile: (id) => {
|
|
110
|
+
core.removeFile(id);
|
|
111
|
+
},
|
|
112
|
+
removeAll: () => {
|
|
113
|
+
core.removeAll();
|
|
114
|
+
},
|
|
115
|
+
setFiles: (f) => core.setFiles(f),
|
|
116
|
+
reorderFiles: (ids) => {
|
|
117
|
+
core.reorderFiles(ids);
|
|
118
|
+
},
|
|
119
|
+
upload: () => core.upload(),
|
|
120
|
+
pause: () => {
|
|
121
|
+
core.pause();
|
|
122
|
+
},
|
|
123
|
+
resume: () => {
|
|
124
|
+
core.resume();
|
|
125
|
+
},
|
|
126
|
+
cancel: () => {
|
|
127
|
+
core.cancel();
|
|
128
|
+
},
|
|
129
|
+
retry: (id) => core.retry(id),
|
|
130
|
+
// Untyped passthrough — this port's public `on` stays string-typed;
|
|
131
|
+
// the typed CoreEvents surface lives on core itself (F-723). Dynamic
|
|
132
|
+
// names route through the namespaced overload (same runtime dispatch).
|
|
133
|
+
on: (event, handler) => core.on(event, handler),
|
|
134
|
+
ext: core.ext,
|
|
135
|
+
core
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/composables/useSSEProcessing.ts
|
|
140
|
+
import { onUnmounted as onUnmounted2 } from "vue";
|
|
141
|
+
import { SSEProcessor } from "@useupup/core/internal";
|
|
142
|
+
function useSSEProcessing({
|
|
143
|
+
processingEndpoint,
|
|
144
|
+
onFileProcessed,
|
|
145
|
+
onError,
|
|
146
|
+
processingTimeout = 6e4
|
|
147
|
+
}) {
|
|
148
|
+
const processor = new SSEProcessor();
|
|
149
|
+
onUnmounted2(() => {
|
|
150
|
+
processor.destroy();
|
|
151
|
+
});
|
|
152
|
+
function connectSSE(file) {
|
|
153
|
+
const key = file.key;
|
|
154
|
+
if (!processingEndpoint || !onFileProcessed || !key) return;
|
|
155
|
+
processor.subscribe(
|
|
156
|
+
key,
|
|
157
|
+
processingEndpoint,
|
|
158
|
+
(data) => {
|
|
159
|
+
onFileProcessed(file, data);
|
|
160
|
+
},
|
|
161
|
+
(error) => onError == null ? void 0 : onError(error),
|
|
162
|
+
processingTimeout
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return { connectSSE };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/composables/useUploaderController.ts
|
|
169
|
+
var EmptyIcon = defineComponent({ render: () => null });
|
|
170
|
+
var DefaultFileDeleteIcon = defineComponent({
|
|
171
|
+
name: "UpupDefaultFileDeleteIcon",
|
|
172
|
+
inheritAttrs: false,
|
|
173
|
+
// attrs is Record<string, unknown> (SetupContext); narrow the two props Icon accepts.
|
|
174
|
+
setup: (_props, { attrs }) => () => h(Icon, {
|
|
175
|
+
name: "trash",
|
|
176
|
+
class: attrs.class,
|
|
177
|
+
size: attrs.size
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
var DefaultAddMoreIcon = defineComponent({
|
|
181
|
+
name: "UpupDefaultAddMoreIcon",
|
|
182
|
+
inheritAttrs: false,
|
|
183
|
+
setup: (_props, { attrs }) => () => h(Icon, {
|
|
184
|
+
name: "plus",
|
|
185
|
+
class: attrs.class,
|
|
186
|
+
size: attrs.size
|
|
187
|
+
})
|
|
188
|
+
});
|
|
189
|
+
var EMPTY_STYLE = {};
|
|
190
|
+
var DRIVE_SOURCE_LABEL_KEY = {
|
|
191
|
+
googleDrive: "googleDrive",
|
|
192
|
+
oneDrive: "oneDrive",
|
|
193
|
+
dropbox: "dropbox",
|
|
194
|
+
box: "box"
|
|
195
|
+
};
|
|
196
|
+
function useUploaderController(props) {
|
|
197
|
+
const {
|
|
198
|
+
allowedFileTypes: acceptProp = "*",
|
|
199
|
+
mini = false,
|
|
200
|
+
animations = true,
|
|
201
|
+
maxFiles,
|
|
202
|
+
isProcessing = false,
|
|
203
|
+
allowPreview = true,
|
|
204
|
+
folderUpload,
|
|
205
|
+
showBranding = true,
|
|
206
|
+
quietCompletion = false,
|
|
207
|
+
disableDragDrop = false,
|
|
208
|
+
className,
|
|
209
|
+
style,
|
|
210
|
+
maxFileSize: maxFileSizeProp,
|
|
211
|
+
minFileSize: minFileSizeProp,
|
|
212
|
+
maxTotalFileSize: maxTotalFileSizeProp,
|
|
213
|
+
imageCompression = false,
|
|
214
|
+
thumbnailGenerator = false,
|
|
215
|
+
checksumVerification = false,
|
|
216
|
+
webWorker,
|
|
217
|
+
heicConversion = false,
|
|
218
|
+
stripExifData = false,
|
|
219
|
+
contentDeduplication = false,
|
|
220
|
+
crashRecovery = false,
|
|
221
|
+
// No destructure default: `undefined` must reach core so its default-on
|
|
222
|
+
// network awareness applies; only an explicit `false` opts out.
|
|
223
|
+
networkAware,
|
|
224
|
+
sources,
|
|
225
|
+
onError: errorHandler,
|
|
226
|
+
onWarn: warningHandler,
|
|
227
|
+
icons = {},
|
|
228
|
+
i18n,
|
|
229
|
+
onIntegrationClick = () => {
|
|
230
|
+
},
|
|
231
|
+
onFileClick = () => {
|
|
232
|
+
},
|
|
233
|
+
onFileRemoved: onFileRemovedProp,
|
|
234
|
+
onStatusChange,
|
|
235
|
+
onFilesDragOver = () => {
|
|
236
|
+
},
|
|
237
|
+
onFilesDragLeave = () => {
|
|
238
|
+
},
|
|
239
|
+
onFilesDrop = () => {
|
|
240
|
+
},
|
|
241
|
+
onFileTypeMismatch = () => {
|
|
242
|
+
},
|
|
243
|
+
onBeforeFileAdded,
|
|
244
|
+
onRestrictionFailed,
|
|
245
|
+
enablePaste = false,
|
|
246
|
+
autoUpload = false,
|
|
247
|
+
maxConcurrentUploads,
|
|
248
|
+
imageEditor: imageEditorProp,
|
|
249
|
+
onUploadStart = () => {
|
|
250
|
+
},
|
|
251
|
+
onFileUploadStart = () => {
|
|
252
|
+
},
|
|
253
|
+
onFileUploadProgress = () => {
|
|
254
|
+
},
|
|
255
|
+
onFilesUploadProgress = () => {
|
|
256
|
+
},
|
|
257
|
+
onFileUploadComplete = () => {
|
|
258
|
+
},
|
|
259
|
+
onFilesUploadComplete = () => {
|
|
260
|
+
},
|
|
261
|
+
onUploadComplete = () => {
|
|
262
|
+
},
|
|
263
|
+
onFilesSelected = () => {
|
|
264
|
+
},
|
|
265
|
+
onDoneClicked = () => {
|
|
266
|
+
},
|
|
267
|
+
onPrepareFiles,
|
|
268
|
+
provider,
|
|
269
|
+
mode: modeProp,
|
|
270
|
+
uploadEndpoint,
|
|
271
|
+
serverUrl,
|
|
272
|
+
cloudDrives,
|
|
273
|
+
metadata,
|
|
274
|
+
cors,
|
|
275
|
+
maxRetries,
|
|
276
|
+
resumable,
|
|
277
|
+
processingEndpoint,
|
|
278
|
+
onFileProcessed,
|
|
279
|
+
processingTimeout
|
|
280
|
+
} = props;
|
|
281
|
+
function onError(message) {
|
|
282
|
+
errorHandler == null ? void 0 : errorHandler(message);
|
|
283
|
+
}
|
|
284
|
+
function onWarn(message) {
|
|
285
|
+
warningHandler == null ? void 0 : warningHandler(message);
|
|
286
|
+
}
|
|
287
|
+
const factoryOptions = {
|
|
288
|
+
provider,
|
|
289
|
+
mode: modeProp,
|
|
290
|
+
sources,
|
|
291
|
+
uploadEndpoint,
|
|
292
|
+
serverUrl,
|
|
293
|
+
maxFiles,
|
|
294
|
+
theme: props.theme,
|
|
295
|
+
folderUpload,
|
|
296
|
+
cors,
|
|
297
|
+
cloudDrives,
|
|
298
|
+
imageCompression,
|
|
299
|
+
thumbnailGenerator,
|
|
300
|
+
checksumVerification,
|
|
301
|
+
webWorker,
|
|
302
|
+
heicConversion,
|
|
303
|
+
stripExifData,
|
|
304
|
+
contentDeduplication,
|
|
305
|
+
autoUpload,
|
|
306
|
+
maxConcurrentUploads,
|
|
307
|
+
crashRecovery,
|
|
308
|
+
networkAware,
|
|
309
|
+
allowedFileTypes: typeof acceptProp === "string" ? acceptProp : acceptProp.join(","),
|
|
310
|
+
mini,
|
|
311
|
+
animations,
|
|
312
|
+
isProcessing,
|
|
313
|
+
allowPreview,
|
|
314
|
+
showBranding,
|
|
315
|
+
quietCompletion,
|
|
316
|
+
disableDragDrop,
|
|
317
|
+
className,
|
|
318
|
+
maxFileSize: maxFileSizeProp,
|
|
319
|
+
minFileSize: minFileSizeProp,
|
|
320
|
+
maxTotalFileSize: maxTotalFileSizeProp,
|
|
321
|
+
imageEditor: imageEditorProp,
|
|
322
|
+
metadata,
|
|
323
|
+
maxRetries,
|
|
324
|
+
resumable,
|
|
325
|
+
i18n,
|
|
326
|
+
onBeforeFileAdded,
|
|
327
|
+
onError: errorHandler,
|
|
328
|
+
onWarn: warningHandler,
|
|
329
|
+
onUploadStart,
|
|
330
|
+
onFileUploadStart,
|
|
331
|
+
onFileUploadProgress,
|
|
332
|
+
onFilesUploadProgress,
|
|
333
|
+
onFileUploadComplete,
|
|
334
|
+
onFilesUploadComplete,
|
|
335
|
+
onUploadComplete,
|
|
336
|
+
onFilesSelected,
|
|
337
|
+
onDoneClicked,
|
|
338
|
+
onPrepareFiles,
|
|
339
|
+
onFileRemoved: onFileRemovedProp,
|
|
340
|
+
onStatusChange,
|
|
341
|
+
onFileTypeMismatch,
|
|
342
|
+
onRestrictionFailed
|
|
343
|
+
};
|
|
344
|
+
const normalized = normalizeUploaderOptions(factoryOptions);
|
|
345
|
+
const { resolved } = normalized;
|
|
346
|
+
const upload = useUpupUpload(normalized.coreOptions);
|
|
347
|
+
const core = upload.core;
|
|
348
|
+
const { connectSSE } = useSSEProcessing({
|
|
349
|
+
processingEndpoint,
|
|
350
|
+
onFileProcessed,
|
|
351
|
+
onError: (err) => {
|
|
352
|
+
onError(err.message);
|
|
353
|
+
},
|
|
354
|
+
processingTimeout
|
|
355
|
+
});
|
|
356
|
+
const controller = createUploaderController(
|
|
357
|
+
{ core, options: factoryOptions, normalized },
|
|
358
|
+
{
|
|
359
|
+
connectSSE: (file) => {
|
|
360
|
+
connectSSE(file);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
controller.updateCallbacks({
|
|
365
|
+
onError,
|
|
366
|
+
onWarn,
|
|
367
|
+
onUploadStart,
|
|
368
|
+
onFileUploadStart,
|
|
369
|
+
onFileUploadProgress,
|
|
370
|
+
onFilesUploadProgress,
|
|
371
|
+
onFileUploadComplete,
|
|
372
|
+
onFilesUploadComplete,
|
|
373
|
+
onUploadComplete,
|
|
374
|
+
onFilesSelected,
|
|
375
|
+
onDoneClicked,
|
|
376
|
+
onPrepareFiles,
|
|
377
|
+
onFileRemoved: onFileRemovedProp,
|
|
378
|
+
onStatusChange,
|
|
379
|
+
onFileTypeMismatch,
|
|
380
|
+
onRestrictionFailed,
|
|
381
|
+
autoUpload
|
|
382
|
+
});
|
|
383
|
+
const state = shallowRef2(
|
|
384
|
+
controller.orchestrator.getSnapshot()
|
|
385
|
+
);
|
|
386
|
+
const unsub = controller.orchestrator.subscribe(() => {
|
|
387
|
+
state.value = controller.orchestrator.getSnapshot();
|
|
388
|
+
});
|
|
389
|
+
const transientUi = shallowRef2(
|
|
390
|
+
controller.transientUi.getSnapshot()
|
|
391
|
+
);
|
|
392
|
+
const unsubTransient = controller.transientUi.subscribe(() => {
|
|
393
|
+
transientUi.value = controller.transientUi.getSnapshot();
|
|
394
|
+
});
|
|
395
|
+
const motionMode = shallowRef2(controller.motionGate.getSnapshot());
|
|
396
|
+
const unsubMotion = controller.motionGate.subscribe(() => {
|
|
397
|
+
motionMode.value = controller.motionGate.getSnapshot();
|
|
398
|
+
});
|
|
399
|
+
function flagDriveDropRejected(source) {
|
|
400
|
+
const key = DRIVE_SOURCE_LABEL_KEY[source];
|
|
401
|
+
const label = key ? resolved.translations[key] : source;
|
|
402
|
+
controller.transientUi.flagDropRejected(label);
|
|
403
|
+
}
|
|
404
|
+
const themeState = shallowRef2(controller.theme.getSnapshot());
|
|
405
|
+
let unsubTheme = null;
|
|
406
|
+
onMounted2(() => {
|
|
407
|
+
unsubTheme = controller.theme.subscribe(() => {
|
|
408
|
+
themeState.value = controller.theme.getSnapshot();
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
onUnmounted3(() => {
|
|
412
|
+
unsubTheme == null ? void 0 : unsubTheme();
|
|
413
|
+
});
|
|
414
|
+
watch(
|
|
415
|
+
() => props.theme,
|
|
416
|
+
(theme) => {
|
|
417
|
+
controller.theme.setThemeConfig(theme);
|
|
418
|
+
}
|
|
419
|
+
);
|
|
420
|
+
onMounted2(() => {
|
|
421
|
+
controller.init();
|
|
422
|
+
});
|
|
423
|
+
onUnmounted3(() => {
|
|
424
|
+
controller.destroy();
|
|
425
|
+
unsub();
|
|
426
|
+
unsubTransient();
|
|
427
|
+
unsubMotion();
|
|
428
|
+
});
|
|
429
|
+
const inputRef = ref2(null);
|
|
430
|
+
function openFilePicker() {
|
|
431
|
+
var _a;
|
|
432
|
+
(_a = inputRef.value) == null ? void 0 : _a.click();
|
|
433
|
+
}
|
|
434
|
+
const resolvedIcons = computed(() => {
|
|
435
|
+
var _a, _b, _c, _d, _e, _f;
|
|
436
|
+
return {
|
|
437
|
+
ContainerAddMoreIcon: (_a = icons.ContainerAddMoreIcon) != null ? _a : DefaultAddMoreIcon,
|
|
438
|
+
FileDeleteIcon: (_b = icons.FileDeleteIcon) != null ? _b : DefaultFileDeleteIcon,
|
|
439
|
+
CameraCaptureIcon: (_c = icons.CameraCaptureIcon) != null ? _c : EmptyIcon,
|
|
440
|
+
CameraRotateIcon: (_d = icons.CameraRotateIcon) != null ? _d : EmptyIcon,
|
|
441
|
+
CameraDeleteIcon: (_e = icons.CameraDeleteIcon) != null ? _e : EmptyIcon,
|
|
442
|
+
LoaderIcon: (_f = icons.LoaderIcon) != null ? _f : EmptyIcon
|
|
443
|
+
};
|
|
444
|
+
});
|
|
445
|
+
const resolvedStyle = style != null ? style : EMPTY_STYLE;
|
|
446
|
+
return {
|
|
447
|
+
core,
|
|
448
|
+
orchestrator: controller.orchestrator,
|
|
449
|
+
mode: resolved.mode,
|
|
450
|
+
serverUrl: resolved.serverUrl,
|
|
451
|
+
inputRef,
|
|
452
|
+
openFilePicker,
|
|
453
|
+
motionMode: computed(() => motionMode.value),
|
|
454
|
+
// Reactive so consumers re-render when the active source changes.
|
|
455
|
+
activeSource: computed(() => state.value.activeSource),
|
|
456
|
+
setActiveSource: (source) => {
|
|
457
|
+
controller.commands.setActiveSource(source);
|
|
458
|
+
},
|
|
459
|
+
isAddingMore: computed(() => state.value.isAddingMore),
|
|
460
|
+
setIsAddingMore: (v) => {
|
|
461
|
+
controller.commands.setIsAddingMore(v);
|
|
462
|
+
},
|
|
463
|
+
viewMode: computed(() => state.value.viewMode),
|
|
464
|
+
setViewMode: (m) => {
|
|
465
|
+
controller.commands.setViewMode(m);
|
|
466
|
+
},
|
|
467
|
+
sourceOverlayOpen: computed(() => transientUi.value.sourceOverlayOpen),
|
|
468
|
+
sourceOverlayClosing: computed(
|
|
469
|
+
() => transientUi.value.sourceOverlayClosing
|
|
470
|
+
),
|
|
471
|
+
openSourceOverlay: () => {
|
|
472
|
+
controller.transientUi.openSourceOverlay();
|
|
473
|
+
},
|
|
474
|
+
closeSourceOverlay: () => {
|
|
475
|
+
controller.transientUi.closeSourceOverlay();
|
|
476
|
+
},
|
|
477
|
+
dropRejected: computed(() => transientUi.value.dropRejected),
|
|
478
|
+
flagDriveDropRejected,
|
|
479
|
+
isOnline: computed(() => state.value.isOnline),
|
|
480
|
+
translations: resolved.translations,
|
|
481
|
+
translator: resolved.translator,
|
|
482
|
+
lang: resolved.lang,
|
|
483
|
+
dir: resolved.dir,
|
|
484
|
+
theme: {
|
|
485
|
+
// themeMode/isDark stay reactive so `themeMode:'system'` resolves live;
|
|
486
|
+
// tokens/resolved/slotOverrides remain provide-time snapshots (unchanged
|
|
487
|
+
// contract). The resolution lives in core's ThemeStore.
|
|
488
|
+
themeMode: computed(() => themeState.value.themeMode),
|
|
489
|
+
isDark: computed(() => themeState.value.isDark),
|
|
490
|
+
tokens: themeState.value.tokens,
|
|
491
|
+
resolved: themeState.value.resolved,
|
|
492
|
+
slotOverrides: themeState.value.slotOverrides,
|
|
493
|
+
slots: themeState.value.slots
|
|
494
|
+
},
|
|
495
|
+
files: computed(() => state.value.files),
|
|
496
|
+
leavingFileIds: computed(() => transientUi.value.leavingFileIds),
|
|
497
|
+
// handleSetSelectedFiles self-handles addFiles errors and never rejects;
|
|
498
|
+
// route any unexpected rejection to onError to honor the void contract.
|
|
499
|
+
setFiles: (newFiles) => {
|
|
500
|
+
controller.commands.handleSetSelectedFiles(newFiles).catch((err) => {
|
|
501
|
+
onError(err instanceof Error ? err.message : String(err));
|
|
502
|
+
});
|
|
503
|
+
},
|
|
504
|
+
uploadFiles: async (newFiles) => controller.commands.uploadFiles(newFiles),
|
|
505
|
+
resetState: () => {
|
|
506
|
+
controller.commands.resetState();
|
|
507
|
+
},
|
|
508
|
+
replaceFiles: (newFiles) => {
|
|
509
|
+
controller.commands.replaceFiles(newFiles);
|
|
510
|
+
},
|
|
511
|
+
handleDone: () => {
|
|
512
|
+
controller.commands.handleDone();
|
|
513
|
+
},
|
|
514
|
+
handleCancel: () => {
|
|
515
|
+
controller.commands.handleCancel();
|
|
516
|
+
},
|
|
517
|
+
handlePause: () => {
|
|
518
|
+
controller.commands.handlePause();
|
|
519
|
+
},
|
|
520
|
+
handleResume: () => {
|
|
521
|
+
controller.commands.handleResume();
|
|
522
|
+
},
|
|
523
|
+
handleFileRemove: (fileId) => {
|
|
524
|
+
controller.commands.handleFileRemove(fileId);
|
|
525
|
+
},
|
|
526
|
+
editingFile: computed(() => state.value.editingFile),
|
|
527
|
+
openImageEditor: (file) => {
|
|
528
|
+
controller.commands.openImageEditor(file);
|
|
529
|
+
},
|
|
530
|
+
closeImageEditor: () => {
|
|
531
|
+
controller.commands.closeImageEditor();
|
|
532
|
+
},
|
|
533
|
+
saveImageEdit: (editedImageData, mimeType) => {
|
|
534
|
+
controller.commands.saveImageEdit(editedImageData, mimeType);
|
|
535
|
+
},
|
|
536
|
+
replaceFile: (fileId, newFile) => {
|
|
537
|
+
controller.commands.replaceFile(fileId, newFile);
|
|
538
|
+
},
|
|
539
|
+
cloudDrives: resolved.cloudDrives,
|
|
540
|
+
upload: {
|
|
541
|
+
totalProgress: computed(() => state.value.totalProgress),
|
|
542
|
+
filesProgressMap: computed(() => state.value.filesProgressMap),
|
|
543
|
+
startUpload: () => controller.commands.startUpload(),
|
|
544
|
+
retryUpload: (fileId) => controller.commands.retryUpload(fileId),
|
|
545
|
+
uploadStatus: computed(() => state.value.uploadStatus),
|
|
546
|
+
uploadError: computed(() => state.value.uploadError),
|
|
547
|
+
uploadErrorCode: computed(() => state.value.uploadErrorCode),
|
|
548
|
+
uploadSpeed: computed(() => state.value.uploadSpeed),
|
|
549
|
+
uploadEta: computed(() => state.value.uploadEta),
|
|
550
|
+
uploadedBytes: computed(() => state.value.uploadedBytes),
|
|
551
|
+
totalBytes: computed(() => state.value.totalBytes)
|
|
552
|
+
},
|
|
553
|
+
props: {
|
|
554
|
+
mini,
|
|
555
|
+
maxRetries,
|
|
556
|
+
resumable,
|
|
557
|
+
onError,
|
|
558
|
+
onIntegrationClick,
|
|
559
|
+
onFileClick,
|
|
560
|
+
onFilesDragOver,
|
|
561
|
+
onFilesDragLeave,
|
|
562
|
+
onFilesDrop,
|
|
563
|
+
onWarn,
|
|
564
|
+
enablePaste,
|
|
565
|
+
sources: resolved.sources,
|
|
566
|
+
allowedFileTypes: resolved.allowedFileTypes,
|
|
567
|
+
maxFileSize: resolved.maxFileSize,
|
|
568
|
+
limit: resolved.limit,
|
|
569
|
+
isProcessing,
|
|
570
|
+
allowPreview,
|
|
571
|
+
folderUploadAllowDrop: resolved.folderUploadAllowDrop,
|
|
572
|
+
folderPickerButtonVisible: resolved.folderPickerButtonVisible,
|
|
573
|
+
showBranding,
|
|
574
|
+
quietCompletion,
|
|
575
|
+
disableDragDrop,
|
|
576
|
+
className: className != null ? className : "",
|
|
577
|
+
style: resolvedStyle,
|
|
578
|
+
multiple: resolved.multiple,
|
|
579
|
+
icons: resolvedIcons.value,
|
|
580
|
+
imageEditor: resolved.imageEditor
|
|
581
|
+
}
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// src/components/UploaderPanel.vue
|
|
586
|
+
import { defineComponent as _defineComponent15 } from "vue";
|
|
587
|
+
import { computed as computed16, nextTick, ref as ref8, watch as watch4 } from "vue";
|
|
588
|
+
|
|
589
|
+
// src/assets/logos.ts
|
|
590
|
+
var devinoDark = "data:image/png;base64,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";
|
|
591
|
+
var devinoLight = "data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgP+w/w+fcfClL07rlQAAAA5lWElmTU0AKgAAAAgAAAAAAAAA0lOTAAAAAElFTkSuQmCC";
|
|
592
|
+
var logoDark = "data:image/png;base64,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";
|
|
593
|
+
var logoLight = "data:image/png;base64,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";
|
|
594
|
+
|
|
595
|
+
// src/composables/useUploaderPanel.ts
|
|
596
|
+
import {
|
|
597
|
+
computed as computed2,
|
|
598
|
+
shallowRef as shallowRef3,
|
|
599
|
+
onMounted as onMounted3,
|
|
600
|
+
onUnmounted as onUnmounted4
|
|
601
|
+
} from "vue";
|
|
602
|
+
import { DragDropController } from "@useupup/core/internal";
|
|
603
|
+
function useUploaderPanel() {
|
|
604
|
+
const { core, orchestrator } = useUploaderRuntime();
|
|
605
|
+
const { setFiles } = useUploaderFiles();
|
|
606
|
+
const { flagDriveDropRejected } = useUploaderView();
|
|
607
|
+
const options = useUploaderOptions();
|
|
608
|
+
const { disableDragDrop, isProcessing, folderUploadAllowDrop } = options;
|
|
609
|
+
if (!core || !orchestrator) {
|
|
610
|
+
throw new Error("useUploaderPanel must be used inside <UpupUploader />");
|
|
611
|
+
}
|
|
612
|
+
const controller = new DragDropController({
|
|
613
|
+
core,
|
|
614
|
+
orchestrator,
|
|
615
|
+
setFiles,
|
|
616
|
+
// The file list derives from the orchestrator snapshot — derive the
|
|
617
|
+
// border's file count from the same source so it stays in lockstep.
|
|
618
|
+
filesSize: () => orchestrator.getSnapshot().files.size,
|
|
619
|
+
options: () => options,
|
|
620
|
+
props: () => ({ disableDragDrop, isProcessing, folderUploadAllowDrop }),
|
|
621
|
+
onReadonlyDropRejected: (source) => {
|
|
622
|
+
flagDriveDropRejected(source);
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
const snapshot = shallowRef3(controller.getSnapshot());
|
|
626
|
+
let unsub = null;
|
|
627
|
+
onMounted3(() => {
|
|
628
|
+
unsub = controller.subscribe(() => {
|
|
629
|
+
snapshot.value = controller.getSnapshot();
|
|
630
|
+
});
|
|
631
|
+
controller.init();
|
|
632
|
+
});
|
|
633
|
+
onUnmounted4(() => {
|
|
634
|
+
controller.destroy();
|
|
635
|
+
unsub == null ? void 0 : unsub();
|
|
636
|
+
});
|
|
637
|
+
return {
|
|
638
|
+
isDragging: computed2(() => snapshot.value.isDragging),
|
|
639
|
+
absoluteIsDragging: computed2(() => snapshot.value.absoluteIsDragging),
|
|
640
|
+
absoluteHasBorder: computed2(() => snapshot.value.absoluteHasBorder),
|
|
641
|
+
handleDragOver: (e) => {
|
|
642
|
+
controller.handleDragOver(e);
|
|
643
|
+
},
|
|
644
|
+
handleDragLeave: (e) => {
|
|
645
|
+
controller.handleDragLeave(e);
|
|
646
|
+
},
|
|
647
|
+
handleDrop: (e) => controller.handleDrop(e),
|
|
648
|
+
handlePaste: (e) => {
|
|
649
|
+
controller.handlePaste(e);
|
|
650
|
+
}
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// src/components/UploaderPanel.vue
|
|
655
|
+
import { cn as cn13 } from "@useupup/core/internal";
|
|
656
|
+
import { UploadStatus as UploadStatus6, formatUiMessage } from "@useupup/core";
|
|
657
|
+
|
|
658
|
+
// src/components/SourceSelector.vue
|
|
659
|
+
import { defineComponent as _defineComponent } from "vue";
|
|
660
|
+
import { computed as computed4 } from "vue";
|
|
661
|
+
import { formatUiMessage as t, pluralUiMessage as plural } from "@useupup/core";
|
|
662
|
+
import { cn } from "@useupup/core/internal";
|
|
663
|
+
|
|
664
|
+
// src/composables/useSourceSelector.ts
|
|
665
|
+
import { computed as computed3 } from "vue";
|
|
666
|
+
import { FileSource as FileSource2 } from "@useupup/core";
|
|
667
|
+
|
|
668
|
+
// src/lib/constants.ts
|
|
669
|
+
import { FileSource } from "@useupup/core";
|
|
670
|
+
import { defineAsyncComponent } from "vue";
|
|
671
|
+
|
|
672
|
+
// src/components/Icons.ts
|
|
673
|
+
import { defineComponent as defineComponent2, h as h2 } from "vue";
|
|
674
|
+
var MyDeviceIcon = defineComponent2({
|
|
675
|
+
name: "MyDeviceIcon",
|
|
676
|
+
render: () => h2(Icon_default, { name: "my-device" })
|
|
677
|
+
});
|
|
678
|
+
var BoxIcon = defineComponent2({
|
|
679
|
+
name: "BoxIcon",
|
|
680
|
+
render: () => h2(Icon_default, { name: "box" })
|
|
681
|
+
});
|
|
682
|
+
var DropboxIcon = defineComponent2({
|
|
683
|
+
name: "DropboxIcon",
|
|
684
|
+
render: () => h2(Icon_default, { name: "dropbox" })
|
|
685
|
+
});
|
|
686
|
+
var GoogleDriveIcon = defineComponent2({
|
|
687
|
+
name: "GoogleDriveIcon",
|
|
688
|
+
render: () => h2(Icon_default, { name: "google-drive" })
|
|
689
|
+
});
|
|
690
|
+
var OneDriveIcon = defineComponent2({
|
|
691
|
+
name: "OneDriveIcon",
|
|
692
|
+
render: () => h2(Icon_default, { name: "one-drive" })
|
|
693
|
+
});
|
|
694
|
+
var LinkIcon = defineComponent2({
|
|
695
|
+
name: "LinkIcon",
|
|
696
|
+
render: () => h2(Icon_default, { name: "link" })
|
|
697
|
+
});
|
|
698
|
+
var CameraIcon = defineComponent2({
|
|
699
|
+
name: "CameraIcon",
|
|
700
|
+
render: () => h2(Icon_default, { name: "camera" })
|
|
701
|
+
});
|
|
702
|
+
var AudioIcon = defineComponent2({
|
|
703
|
+
name: "AudioIcon",
|
|
704
|
+
render: () => h2(Icon_default, { name: "audio" })
|
|
705
|
+
});
|
|
706
|
+
var ScreenCaptureIcon = defineComponent2({
|
|
707
|
+
name: "ScreenCaptureIcon",
|
|
708
|
+
render: () => h2(Icon_default, { name: "screen-capture" })
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
// src/lib/constants.ts
|
|
712
|
+
import { sourceNameKeys } from "@useupup/core/internal";
|
|
713
|
+
var AudioUploader = defineAsyncComponent(
|
|
714
|
+
() => import("./AudioUploader-IEWPI3TS.js")
|
|
715
|
+
);
|
|
716
|
+
var BoxUploader = defineAsyncComponent(
|
|
717
|
+
() => import("./BoxUploader-TIDCYWMC.js")
|
|
718
|
+
);
|
|
719
|
+
var CameraUploader = defineAsyncComponent(
|
|
720
|
+
() => import("./CameraUploader-575RARRY.js")
|
|
721
|
+
);
|
|
722
|
+
var DropboxUploader = defineAsyncComponent(
|
|
723
|
+
() => import("./DropboxUploader-M2LY2Q32.js")
|
|
724
|
+
);
|
|
725
|
+
var GoogleDriveUploader = defineAsyncComponent(
|
|
726
|
+
() => import("./GoogleDriveUploader-SAY4C2QY.js")
|
|
727
|
+
);
|
|
728
|
+
var OneDriveUploader = defineAsyncComponent(
|
|
729
|
+
() => import("./OneDriveUploader-EDB3RJA4.js")
|
|
730
|
+
);
|
|
731
|
+
var ScreenCaptureUploader = defineAsyncComponent(
|
|
732
|
+
() => import("./ScreenCaptureUploader-F65CM6OA.js")
|
|
733
|
+
);
|
|
734
|
+
var UrlUploader = defineAsyncComponent(
|
|
735
|
+
() => import("./UrlUploader-PXEGUBQ4.js")
|
|
736
|
+
);
|
|
737
|
+
var uploadSourceObject = {
|
|
738
|
+
[FileSource.LOCAL]: {
|
|
739
|
+
id: FileSource.LOCAL,
|
|
740
|
+
nameKey: "myDevice",
|
|
741
|
+
Icon: MyDeviceIcon,
|
|
742
|
+
Component: void 0
|
|
743
|
+
},
|
|
744
|
+
[FileSource.GOOGLE_DRIVE]: {
|
|
745
|
+
id: FileSource.GOOGLE_DRIVE,
|
|
746
|
+
nameKey: "googleDrive",
|
|
747
|
+
Icon: GoogleDriveIcon,
|
|
748
|
+
Component: GoogleDriveUploader
|
|
749
|
+
},
|
|
750
|
+
[FileSource.ONE_DRIVE]: {
|
|
751
|
+
id: FileSource.ONE_DRIVE,
|
|
752
|
+
nameKey: "oneDrive",
|
|
753
|
+
Icon: OneDriveIcon,
|
|
754
|
+
Component: OneDriveUploader
|
|
755
|
+
},
|
|
756
|
+
[FileSource.DROPBOX]: {
|
|
757
|
+
id: FileSource.DROPBOX,
|
|
758
|
+
nameKey: "dropbox",
|
|
759
|
+
Icon: DropboxIcon,
|
|
760
|
+
Component: DropboxUploader
|
|
761
|
+
},
|
|
762
|
+
[FileSource.BOX]: {
|
|
763
|
+
id: FileSource.BOX,
|
|
764
|
+
nameKey: "box",
|
|
765
|
+
Icon: BoxIcon,
|
|
766
|
+
Component: BoxUploader
|
|
767
|
+
},
|
|
768
|
+
[FileSource.URL]: {
|
|
769
|
+
id: FileSource.URL,
|
|
770
|
+
nameKey: "link",
|
|
771
|
+
Icon: LinkIcon,
|
|
772
|
+
Component: UrlUploader
|
|
773
|
+
},
|
|
774
|
+
[FileSource.CAMERA]: {
|
|
775
|
+
id: FileSource.CAMERA,
|
|
776
|
+
nameKey: "camera",
|
|
777
|
+
Icon: CameraIcon,
|
|
778
|
+
Component: CameraUploader
|
|
779
|
+
},
|
|
780
|
+
[FileSource.MICROPHONE]: {
|
|
781
|
+
id: FileSource.MICROPHONE,
|
|
782
|
+
nameKey: "audio",
|
|
783
|
+
Icon: AudioIcon,
|
|
784
|
+
Component: AudioUploader
|
|
785
|
+
},
|
|
786
|
+
[FileSource.SCREEN]: {
|
|
787
|
+
id: FileSource.SCREEN,
|
|
788
|
+
nameKey: "screenCapture",
|
|
789
|
+
Icon: ScreenCaptureIcon,
|
|
790
|
+
Component: ScreenCaptureUploader
|
|
791
|
+
}
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
// src/composables/useSourceSelector.ts
|
|
795
|
+
function useSourceSelector() {
|
|
796
|
+
const { core, openFilePicker } = useUploaderRuntime();
|
|
797
|
+
const { setActiveSource } = useUploaderSource();
|
|
798
|
+
const { setFiles } = useUploaderFiles();
|
|
799
|
+
const { translations } = useUploaderI18n();
|
|
800
|
+
const { sources, onIntegrationClick } = useUploaderOptions();
|
|
801
|
+
const chosenSources = computed3(
|
|
802
|
+
() => Object.values(uploadSourceObject).filter((item) => sources.includes(item.id)).map((item) => ({
|
|
803
|
+
...item,
|
|
804
|
+
name: translations[item.nameKey]
|
|
805
|
+
}))
|
|
806
|
+
);
|
|
807
|
+
function handleSourceClick(sourceId) {
|
|
808
|
+
onIntegrationClick(sourceId);
|
|
809
|
+
core == null ? void 0 : core.emit("source-click", { sourceId });
|
|
810
|
+
if (sourceId === FileSource2.LOCAL) openFilePicker();
|
|
811
|
+
else setActiveSource(sourceId);
|
|
812
|
+
}
|
|
813
|
+
function handleInputFileChange(e) {
|
|
814
|
+
const target = e.target;
|
|
815
|
+
setFiles(Array.from(target.files || []));
|
|
816
|
+
target.value = "";
|
|
817
|
+
}
|
|
818
|
+
return {
|
|
819
|
+
chosenSources,
|
|
820
|
+
handleSourceClick,
|
|
821
|
+
handleInputFileChange
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// src/components/SourceSelector.vue
|
|
826
|
+
import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, createVNode as _createVNode, createTextVNode as _createTextVNode } from "vue";
|
|
827
|
+
var COMPACT_SOURCE_THRESHOLD = 8;
|
|
828
|
+
var _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
829
|
+
__name: "SourceSelector",
|
|
830
|
+
setup(__props, { expose: __expose }) {
|
|
831
|
+
__expose();
|
|
832
|
+
const { core, inputRef, openFilePicker } = useUploaderRuntime();
|
|
833
|
+
const { translations: tr } = useUploaderI18n();
|
|
834
|
+
const { setFiles } = useUploaderFiles();
|
|
835
|
+
const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme();
|
|
836
|
+
const { mini, allowedFileTypes, multiple, limit, maxFileSize, folderPickerButtonVisible } = useUploaderOptions();
|
|
837
|
+
const typeConstraint = computed4(() => {
|
|
838
|
+
if (allowedFileTypes && allowedFileTypes !== "*/*" && allowedFileTypes !== "*") {
|
|
839
|
+
const humanized = allowedFileTypes.split(",").map((s) => s.trim()).map((m) => {
|
|
840
|
+
if (m.startsWith(".")) return m;
|
|
841
|
+
const [type, sub] = m.split("/");
|
|
842
|
+
if (!type || !sub) return m;
|
|
843
|
+
if (sub === "*") return type.charAt(0).toUpperCase() + type.slice(1) + "s";
|
|
844
|
+
return sub.toUpperCase();
|
|
845
|
+
}).join(", ");
|
|
846
|
+
return humanized + " only";
|
|
847
|
+
}
|
|
848
|
+
return null;
|
|
849
|
+
});
|
|
850
|
+
const showFilesLimit = computed4(() => limit > 1);
|
|
851
|
+
const showSizeLimit = computed4(() => !!((maxFileSize == null ? void 0 : maxFileSize.size) && (maxFileSize == null ? void 0 : maxFileSize.unit)));
|
|
852
|
+
const hasLimitsCaption = computed4(() => !!typeConstraint.value || showFilesLimit.value || showSizeLimit.value);
|
|
853
|
+
const { chosenSources, handleSourceClick, handleInputFileChange } = useSourceSelector();
|
|
854
|
+
const compact = computed4(() => chosenSources.value.length > COMPACT_SOURCE_THRESHOLD);
|
|
855
|
+
function handleBrowseFilesClick() {
|
|
856
|
+
if (inputRef.value) {
|
|
857
|
+
inputRef.value.removeAttribute("webkitdirectory");
|
|
858
|
+
inputRef.value.removeAttribute("directory");
|
|
859
|
+
}
|
|
860
|
+
openFilePicker();
|
|
861
|
+
core == null ? void 0 : core.emit("browse-files", {});
|
|
862
|
+
}
|
|
863
|
+
async function handleSelectFolderClick() {
|
|
864
|
+
const fsWindow = window;
|
|
865
|
+
if (fsWindow.showDirectoryPicker) {
|
|
866
|
+
try {
|
|
867
|
+
const directoryHandle = await fsWindow.showDirectoryPicker();
|
|
868
|
+
const collectedFiles = [];
|
|
869
|
+
async function getFiles(dirHandle, path = "") {
|
|
870
|
+
for await (const entry of dirHandle.values()) {
|
|
871
|
+
const newPath = path ? `${path}/${entry.name}` : entry.name;
|
|
872
|
+
if (entry.kind === "file") {
|
|
873
|
+
const pickedFile = await entry.getFile();
|
|
874
|
+
const file = new File([await pickedFile.arrayBuffer()], pickedFile.name, {
|
|
875
|
+
type: pickedFile.type,
|
|
876
|
+
lastModified: pickedFile.lastModified
|
|
877
|
+
});
|
|
878
|
+
try {
|
|
879
|
+
Object.defineProperty(file, "webkitRelativePath", {
|
|
880
|
+
value: newPath,
|
|
881
|
+
configurable: true,
|
|
882
|
+
writable: true
|
|
883
|
+
});
|
|
884
|
+
Object.defineProperty(file, "relativePath", {
|
|
885
|
+
value: newPath,
|
|
886
|
+
configurable: true,
|
|
887
|
+
writable: true
|
|
888
|
+
});
|
|
889
|
+
} catch {
|
|
890
|
+
Object.assign(file, { relativePath: newPath });
|
|
891
|
+
}
|
|
892
|
+
collectedFiles.push(file);
|
|
893
|
+
} else if (entry.kind === "directory") {
|
|
894
|
+
await getFiles(entry, newPath);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
await getFiles(directoryHandle);
|
|
899
|
+
if (collectedFiles.length > 0) {
|
|
900
|
+
setFiles(collectedFiles);
|
|
901
|
+
core == null ? void 0 : core.emit("folder-select", { count: collectedFiles.length });
|
|
902
|
+
if (inputRef.value) inputRef.value.value = "";
|
|
903
|
+
}
|
|
904
|
+
} catch (error) {
|
|
905
|
+
const name = error instanceof DOMException ? error.name : "";
|
|
906
|
+
if (name !== "AbortError") throw error;
|
|
907
|
+
}
|
|
908
|
+
} else {
|
|
909
|
+
if (inputRef.value) {
|
|
910
|
+
inputRef.value.setAttribute("webkitdirectory", "true");
|
|
911
|
+
inputRef.value.setAttribute("directory", "true");
|
|
912
|
+
}
|
|
913
|
+
openFilePicker();
|
|
914
|
+
core == null ? void 0 : core.emit("folder-select", { count: 0 });
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
const __returned__ = {
|
|
918
|
+
COMPACT_SOURCE_THRESHOLD,
|
|
919
|
+
core,
|
|
920
|
+
inputRef,
|
|
921
|
+
openFilePicker,
|
|
922
|
+
tr,
|
|
923
|
+
setFiles,
|
|
924
|
+
dark,
|
|
925
|
+
slotClasses,
|
|
926
|
+
mini,
|
|
927
|
+
allowedFileTypes,
|
|
928
|
+
multiple,
|
|
929
|
+
limit,
|
|
930
|
+
maxFileSize,
|
|
931
|
+
folderPickerButtonVisible,
|
|
932
|
+
typeConstraint,
|
|
933
|
+
showFilesLimit,
|
|
934
|
+
showSizeLimit,
|
|
935
|
+
hasLimitsCaption,
|
|
936
|
+
chosenSources,
|
|
937
|
+
handleSourceClick,
|
|
938
|
+
handleInputFileChange,
|
|
939
|
+
compact,
|
|
940
|
+
handleBrowseFilesClick,
|
|
941
|
+
handleSelectFolderClick,
|
|
942
|
+
get t() {
|
|
943
|
+
return t;
|
|
944
|
+
},
|
|
945
|
+
get plural() {
|
|
946
|
+
return plural;
|
|
947
|
+
},
|
|
948
|
+
get cn() {
|
|
949
|
+
return cn;
|
|
950
|
+
},
|
|
951
|
+
get Icon() {
|
|
952
|
+
return Icon_default;
|
|
953
|
+
}
|
|
954
|
+
};
|
|
955
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
956
|
+
enumerable: false,
|
|
957
|
+
value: true
|
|
958
|
+
});
|
|
959
|
+
return __returned__;
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
var _hoisted_1 = {
|
|
963
|
+
"data-testid": "upup-source-selector",
|
|
964
|
+
"data-upup-slot": "source-selector",
|
|
965
|
+
class: "upup-animate-fx-view upup-relative upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center upup-gap-6 upup-rounded-lg upup-px-4 upup-py-6"
|
|
966
|
+
};
|
|
967
|
+
var _hoisted_2 = ["data-testid", "onClick"];
|
|
968
|
+
var _hoisted_3 = ["accept", "multiple"];
|
|
969
|
+
var _hoisted_4 = { key: 0 };
|
|
970
|
+
var _hoisted_5 = {
|
|
971
|
+
key: 1,
|
|
972
|
+
"aria-hidden": "true"
|
|
973
|
+
};
|
|
974
|
+
var _hoisted_6 = {
|
|
975
|
+
key: 2,
|
|
976
|
+
class: "upup-inline-flex upup-items-center upup-gap-1.5"
|
|
977
|
+
};
|
|
978
|
+
var _hoisted_7 = {
|
|
979
|
+
"aria-hidden": "true",
|
|
980
|
+
class: "upup-inline-flex"
|
|
981
|
+
};
|
|
982
|
+
var _hoisted_8 = {
|
|
983
|
+
key: 3,
|
|
984
|
+
"aria-hidden": "true"
|
|
985
|
+
};
|
|
986
|
+
var _hoisted_9 = {
|
|
987
|
+
key: 4,
|
|
988
|
+
class: "upup-inline-flex upup-items-center upup-gap-1.5"
|
|
989
|
+
};
|
|
990
|
+
var _hoisted_10 = {
|
|
991
|
+
"aria-hidden": "true",
|
|
992
|
+
class: "upup-inline-flex"
|
|
993
|
+
};
|
|
994
|
+
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
995
|
+
var _a, _b, _c, _d;
|
|
996
|
+
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
997
|
+
!$setup.mini ? (_openBlock(), _createElementBlock(
|
|
998
|
+
_Fragment,
|
|
999
|
+
{ key: 0 },
|
|
1000
|
+
[_createElementVNode(
|
|
1001
|
+
"div",
|
|
1002
|
+
{ class: _normalizeClass($setup.cn("upup-flex upup-flex-wrap upup-items-center upup-justify-center upup-gap-x-1.5 upup-gap-y-1 upup-px-2 upup-text-center upup-text-base upup-font-medium md:upup-text-lg", {
|
|
1003
|
+
"upup-text-[#242634]": !$setup.dark,
|
|
1004
|
+
"upup-text-[#e2e8f0] dark:upup-text-[#e2e8f0]": $setup.dark
|
|
1005
|
+
})) },
|
|
1006
|
+
[
|
|
1007
|
+
_createElementVNode(
|
|
1008
|
+
"span",
|
|
1009
|
+
null,
|
|
1010
|
+
_toDisplayString($setup.tr.dropFilesHere),
|
|
1011
|
+
1
|
|
1012
|
+
/* TEXT */
|
|
1013
|
+
),
|
|
1014
|
+
_createElementVNode(
|
|
1015
|
+
"button",
|
|
1016
|
+
{
|
|
1017
|
+
type: "button",
|
|
1018
|
+
"data-testid": "upup-browse-files",
|
|
1019
|
+
class: _normalizeClass($setup.cn("upup-cursor-pointer upup-rounded upup-font-semibold focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8]", {
|
|
1020
|
+
"upup-text-[#0284c7]": !$setup.dark,
|
|
1021
|
+
"upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": $setup.dark
|
|
1022
|
+
})),
|
|
1023
|
+
onClick: $setup.handleBrowseFilesClick
|
|
1024
|
+
},
|
|
1025
|
+
_toDisplayString($setup.tr.browseFiles),
|
|
1026
|
+
3
|
|
1027
|
+
/* TEXT, CLASS */
|
|
1028
|
+
),
|
|
1029
|
+
$setup.folderPickerButtonVisible ? (_openBlock(), _createElementBlock(
|
|
1030
|
+
_Fragment,
|
|
1031
|
+
{ key: 0 },
|
|
1032
|
+
[_createElementVNode(
|
|
1033
|
+
"span",
|
|
1034
|
+
null,
|
|
1035
|
+
_toDisplayString($setup.tr.or),
|
|
1036
|
+
1
|
|
1037
|
+
/* TEXT */
|
|
1038
|
+
), _createElementVNode(
|
|
1039
|
+
"button",
|
|
1040
|
+
{
|
|
1041
|
+
type: "button",
|
|
1042
|
+
class: _normalizeClass($setup.cn("upup-cursor-pointer upup-rounded upup-font-semibold focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8]", {
|
|
1043
|
+
"upup-text-[#0284c7]": !$setup.dark,
|
|
1044
|
+
"upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": $setup.dark
|
|
1045
|
+
})),
|
|
1046
|
+
onClick: $setup.handleSelectFolderClick
|
|
1047
|
+
},
|
|
1048
|
+
_toDisplayString($setup.tr.selectAFolder),
|
|
1049
|
+
3
|
|
1050
|
+
/* TEXT, CLASS */
|
|
1051
|
+
)],
|
|
1052
|
+
64
|
|
1053
|
+
/* STABLE_FRAGMENT */
|
|
1054
|
+
)) : _createCommentVNode("v-if", true),
|
|
1055
|
+
_createElementVNode(
|
|
1056
|
+
"span",
|
|
1057
|
+
null,
|
|
1058
|
+
_toDisplayString($setup.tr.orImportFrom),
|
|
1059
|
+
1
|
|
1060
|
+
/* TEXT */
|
|
1061
|
+
)
|
|
1062
|
+
],
|
|
1063
|
+
2
|
|
1064
|
+
/* CLASS */
|
|
1065
|
+
), _createElementVNode(
|
|
1066
|
+
"div",
|
|
1067
|
+
{ class: _normalizeClass($setup.cn($setup.compact ? "upup-flex upup-max-w-[420px] upup-flex-wrap upup-items-start upup-justify-center upup-gap-x-3 upup-gap-y-4" : "upup-flex upup-max-w-[420px] upup-flex-wrap upup-items-start upup-justify-center upup-gap-x-6 upup-gap-y-5", $setup.slotClasses.sourceButtonList)) },
|
|
1068
|
+
[(_openBlock(true), _createElementBlock(
|
|
1069
|
+
_Fragment,
|
|
1070
|
+
null,
|
|
1071
|
+
_renderList($setup.chosenSources, ({ Icon: SourceIcon, id, name }) => {
|
|
1072
|
+
return _openBlock(), _createElementBlock("button", {
|
|
1073
|
+
key: id,
|
|
1074
|
+
type: "button",
|
|
1075
|
+
"data-testid": `upup-source-${id}`,
|
|
1076
|
+
class: _normalizeClass($setup.cn($setup.compact ? "upup-fx-hover-lift upup-fx-press upup-fx-icon-nudge upup-group upup-flex upup-w-[62px] upup-cursor-pointer upup-flex-col upup-items-center upup-gap-[7px] upup-rounded-[12px] focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8] hover:upup-shadow-none" : "upup-fx-hover-lift upup-fx-press upup-fx-icon-nudge upup-group upup-flex upup-w-[66px] upup-cursor-pointer upup-flex-col upup-items-center upup-gap-[9px] upup-rounded-[14px] focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8] hover:upup-shadow-none", $setup.slotClasses.sourceButton)),
|
|
1077
|
+
onClick: ($event) => $setup.handleSourceClick(id)
|
|
1078
|
+
}, [_createElementVNode(
|
|
1079
|
+
"span",
|
|
1080
|
+
{ class: _normalizeClass($setup.cn($setup.compact ? "upup-flex upup-h-[42px] upup-w-[42px] upup-items-center upup-justify-center upup-rounded-[12px] upup-ring-1 upup-transition-colors" : "upup-flex upup-h-[52px] upup-w-[52px] upup-items-center upup-justify-center upup-rounded-[14px] upup-ring-1 upup-transition-colors", {
|
|
1081
|
+
"upup-bg-white upup-ring-black/[0.07] group-hover:upup-bg-slate-50": !$setup.dark,
|
|
1082
|
+
"upup-bg-white/[0.055] upup-ring-white/[0.06] group-hover:upup-bg-white/[0.09] dark:upup-bg-white/[0.055] dark:upup-ring-white/[0.06]": $setup.dark
|
|
1083
|
+
})) },
|
|
1084
|
+
[(_openBlock(), _createBlock(_resolveDynamicComponent(SourceIcon), { class: _normalizeClass($setup.cn($setup.compact ? "upup-h-8 upup-w-8" : "upup-h-10 upup-w-10", $setup.slotClasses.sourceButtonIcon)) }, null, 8, ["class"]))],
|
|
1085
|
+
2
|
|
1086
|
+
/* CLASS */
|
|
1087
|
+
), _createElementVNode(
|
|
1088
|
+
"span",
|
|
1089
|
+
{ class: _normalizeClass($setup.cn("upup-text-xs upup-leading-none", {
|
|
1090
|
+
"upup-text-[#6D6D6D]": !$setup.dark,
|
|
1091
|
+
"upup-text-[#94a3b8] dark:upup-text-[#94a3b8]": $setup.dark
|
|
1092
|
+
}, $setup.slotClasses.sourceButtonText)) },
|
|
1093
|
+
_toDisplayString(name),
|
|
1094
|
+
3
|
|
1095
|
+
/* TEXT, CLASS */
|
|
1096
|
+
)], 10, _hoisted_2);
|
|
1097
|
+
}),
|
|
1098
|
+
128
|
|
1099
|
+
/* KEYED_FRAGMENT */
|
|
1100
|
+
))],
|
|
1101
|
+
2
|
|
1102
|
+
/* CLASS */
|
|
1103
|
+
)],
|
|
1104
|
+
64
|
|
1105
|
+
/* STABLE_FRAGMENT */
|
|
1106
|
+
)) : _createCommentVNode("v-if", true),
|
|
1107
|
+
_createElementVNode("input", {
|
|
1108
|
+
type: "file",
|
|
1109
|
+
name: "upup-files",
|
|
1110
|
+
accept: $setup.allowedFileTypes,
|
|
1111
|
+
class: "upup-hidden",
|
|
1112
|
+
"data-testid": "upup-file-input",
|
|
1113
|
+
"aria-hidden": "true",
|
|
1114
|
+
tabindex: -1,
|
|
1115
|
+
ref: "inputRef",
|
|
1116
|
+
multiple: $setup.multiple,
|
|
1117
|
+
onChange: _cache[0] || (_cache[0] = (...args) => $setup.handleInputFileChange && $setup.handleInputFileChange(...args))
|
|
1118
|
+
}, null, 40, _hoisted_3),
|
|
1119
|
+
$setup.mini ? (_openBlock(), _createElementBlock("button", {
|
|
1120
|
+
key: 1,
|
|
1121
|
+
type: "button",
|
|
1122
|
+
onClick: $setup.handleBrowseFilesClick,
|
|
1123
|
+
class: "upup-flex upup-cursor-pointer upup-flex-col upup-items-center upup-justify-center upup-gap-2 upup-rounded-lg upup-p-2"
|
|
1124
|
+
}, [_createVNode($setup["Icon"], {
|
|
1125
|
+
name: "upload",
|
|
1126
|
+
size: 32,
|
|
1127
|
+
class: _normalizeClass($setup.cn("upup-h-16 upup-w-16 md:upup-h-20 md:upup-w-20", {
|
|
1128
|
+
"upup-text-[#0B0B0B]": !$setup.dark,
|
|
1129
|
+
"upup-text-white dark:upup-text-white": $setup.dark
|
|
1130
|
+
}))
|
|
1131
|
+
}, null, 8, ["class"]), _createElementVNode(
|
|
1132
|
+
"p",
|
|
1133
|
+
{ class: _normalizeClass($setup.cn("px-6 upup-text-center upup-text-xs", {
|
|
1134
|
+
"upup-text-[#6D6D6D] dark:upup-text-gray-400": !$setup.dark,
|
|
1135
|
+
"upup-text-gray-400 dark:upup-text-gray-500": $setup.dark
|
|
1136
|
+
})) },
|
|
1137
|
+
" Drag or browse to upload ",
|
|
1138
|
+
2
|
|
1139
|
+
/* CLASS */
|
|
1140
|
+
)])) : (_openBlock(), _createElementBlock(
|
|
1141
|
+
_Fragment,
|
|
1142
|
+
{ key: 2 },
|
|
1143
|
+
[$setup.hasLimitsCaption ? (_openBlock(), _createElementBlock(
|
|
1144
|
+
"div",
|
|
1145
|
+
{
|
|
1146
|
+
key: 0,
|
|
1147
|
+
"data-upup-slot": "limits-caption",
|
|
1148
|
+
class: _normalizeClass($setup.cn("upup-flex upup-flex-wrap upup-items-center upup-justify-center upup-gap-x-2.5 upup-gap-y-1 upup-px-3 upup-text-center upup-text-xs", {
|
|
1149
|
+
"upup-text-[#6D6D6D]": !$setup.dark,
|
|
1150
|
+
"upup-text-[#94a3b8] dark:upup-text-[#94a3b8]": $setup.dark
|
|
1151
|
+
}))
|
|
1152
|
+
},
|
|
1153
|
+
[
|
|
1154
|
+
$setup.typeConstraint ? (_openBlock(), _createElementBlock(
|
|
1155
|
+
"span",
|
|
1156
|
+
_hoisted_4,
|
|
1157
|
+
_toDisplayString($setup.typeConstraint),
|
|
1158
|
+
1
|
|
1159
|
+
/* TEXT */
|
|
1160
|
+
)) : _createCommentVNode("v-if", true),
|
|
1161
|
+
$setup.typeConstraint && ($setup.showFilesLimit || $setup.showSizeLimit) ? (_openBlock(), _createElementBlock("span", _hoisted_5, "\xB7")) : _createCommentVNode("v-if", true),
|
|
1162
|
+
$setup.showFilesLimit ? (_openBlock(), _createElementBlock("span", _hoisted_6, [_createElementVNode("span", _hoisted_7, [_createVNode($setup["Icon"], {
|
|
1163
|
+
name: "stacked-files",
|
|
1164
|
+
class: "upup-h-4 upup-w-4"
|
|
1165
|
+
})]), _createTextVNode(
|
|
1166
|
+
" " + _toDisplayString($setup.t($setup.plural($setup.tr, "filesMax", $setup.limit), { count: $setup.limit })),
|
|
1167
|
+
1
|
|
1168
|
+
/* TEXT */
|
|
1169
|
+
)])) : _createCommentVNode("v-if", true),
|
|
1170
|
+
$setup.showFilesLimit && $setup.showSizeLimit ? (_openBlock(), _createElementBlock("span", _hoisted_8, "\xB7")) : _createCommentVNode("v-if", true),
|
|
1171
|
+
$setup.showSizeLimit ? (_openBlock(), _createElementBlock("span", _hoisted_9, [_createElementVNode("span", _hoisted_10, [_createVNode($setup["Icon"], {
|
|
1172
|
+
name: "storage",
|
|
1173
|
+
class: "upup-h-4 upup-w-4"
|
|
1174
|
+
})]), _createTextVNode(
|
|
1175
|
+
" " + _toDisplayString($setup.t($setup.tr.sizeEach, {
|
|
1176
|
+
size: (_b = (_a = $setup.maxFileSize) == null ? void 0 : _a.size) != null ? _b : 0,
|
|
1177
|
+
unit: (_d = (_c = $setup.maxFileSize) == null ? void 0 : _c.unit) != null ? _d : ""
|
|
1178
|
+
})),
|
|
1179
|
+
1
|
|
1180
|
+
/* TEXT */
|
|
1181
|
+
)])) : _createCommentVNode("v-if", true)
|
|
1182
|
+
],
|
|
1183
|
+
2
|
|
1184
|
+
/* CLASS */
|
|
1185
|
+
)) : _createCommentVNode("v-if", true)],
|
|
1186
|
+
64
|
|
1187
|
+
/* STABLE_FRAGMENT */
|
|
1188
|
+
))
|
|
1189
|
+
]);
|
|
1190
|
+
}
|
|
1191
|
+
var SourceSelector_default = /* @__PURE__ */ export_helper_default(_sfc_main, [["render", _sfc_render], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\SourceSelector.vue"]]);
|
|
1192
|
+
|
|
1193
|
+
// src/components/SourceView.vue
|
|
1194
|
+
import { defineComponent as _defineComponent3 } from "vue";
|
|
1195
|
+
import { computed as computed5, ref as ref3, Suspense } from "vue";
|
|
1196
|
+
import { cn as cn2 } from "@useupup/core/internal";
|
|
1197
|
+
|
|
1198
|
+
// src/components/DefaultLoaderIcon.vue
|
|
1199
|
+
import { defineComponent as _defineComponent2 } from "vue";
|
|
1200
|
+
import { openBlock as _openBlock2, createBlock as _createBlock2 } from "vue";
|
|
1201
|
+
var _sfc_main2 = /* @__PURE__ */ _defineComponent2({
|
|
1202
|
+
__name: "DefaultLoaderIcon",
|
|
1203
|
+
setup(__props, { expose: __expose }) {
|
|
1204
|
+
__expose();
|
|
1205
|
+
const __returned__ = { get Icon() {
|
|
1206
|
+
return Icon_default;
|
|
1207
|
+
} };
|
|
1208
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1209
|
+
enumerable: false,
|
|
1210
|
+
value: true
|
|
1211
|
+
});
|
|
1212
|
+
return __returned__;
|
|
1213
|
+
}
|
|
1214
|
+
});
|
|
1215
|
+
function _sfc_render2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1216
|
+
return _openBlock2(), _createBlock2($setup["Icon"], {
|
|
1217
|
+
name: "loader",
|
|
1218
|
+
class: "upup-animate-spin upup-text-3xl upup-text-[#6D6D6D]"
|
|
1219
|
+
});
|
|
1220
|
+
}
|
|
1221
|
+
var DefaultLoaderIcon_default = /* @__PURE__ */ export_helper_default(_sfc_main2, [["render", _sfc_render2], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\DefaultLoaderIcon.vue"]]);
|
|
1222
|
+
|
|
1223
|
+
// src/components/SourceView.vue
|
|
1224
|
+
import { createCommentVNode as _createCommentVNode2, resolveDynamicComponent as _resolveDynamicComponent2, openBlock as _openBlock3, createBlock as _createBlock3, toDisplayString as _toDisplayString2, createElementVNode as _createElementVNode2, normalizeClass as _normalizeClass2, createVNode as _createVNode2, Suspense as _Suspense, withCtx as _withCtx, createElementBlock as _createElementBlock2 } from "vue";
|
|
1225
|
+
var _sfc_main3 = /* @__PURE__ */ _defineComponent3({
|
|
1226
|
+
__name: "SourceView",
|
|
1227
|
+
setup(__props, { expose: __expose }) {
|
|
1228
|
+
__expose();
|
|
1229
|
+
const { core } = useUploaderRuntime();
|
|
1230
|
+
const { activeSource, setActiveSource } = useUploaderSource();
|
|
1231
|
+
const { translations: tr } = useUploaderI18n();
|
|
1232
|
+
const { mini } = useUploaderOptions();
|
|
1233
|
+
const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme();
|
|
1234
|
+
const headerExtraHost = ref3(null);
|
|
1235
|
+
provideSourceViewHeaderExtra(headerExtraHost);
|
|
1236
|
+
const uploadComponent = computed5(() => {
|
|
1237
|
+
var _a;
|
|
1238
|
+
return activeSource.value && ((_a = uploadSourceObject[activeSource.value]) == null ? void 0 : _a.Component);
|
|
1239
|
+
});
|
|
1240
|
+
const sourceIcon = computed5(() => {
|
|
1241
|
+
var _a;
|
|
1242
|
+
return activeSource.value && ((_a = uploadSourceObject[activeSource.value]) == null ? void 0 : _a.Icon);
|
|
1243
|
+
});
|
|
1244
|
+
const sourceName = computed5(() => {
|
|
1245
|
+
const s = activeSource.value;
|
|
1246
|
+
const entry = s ? uploadSourceObject[s] : void 0;
|
|
1247
|
+
return entry ? tr[entry.nameKey] : "";
|
|
1248
|
+
});
|
|
1249
|
+
const shouldRender = computed5(() => !!uploadComponent.value && !mini && !!activeSource.value && !!sourceIcon.value);
|
|
1250
|
+
function handleCancel() {
|
|
1251
|
+
core == null ? void 0 : core.emit("source-view-cancel", { sourceId: activeSource.value });
|
|
1252
|
+
setActiveSource(void 0);
|
|
1253
|
+
}
|
|
1254
|
+
const __returned__ = {
|
|
1255
|
+
core,
|
|
1256
|
+
activeSource,
|
|
1257
|
+
setActiveSource,
|
|
1258
|
+
tr,
|
|
1259
|
+
mini,
|
|
1260
|
+
dark,
|
|
1261
|
+
slotClasses,
|
|
1262
|
+
headerExtraHost,
|
|
1263
|
+
uploadComponent,
|
|
1264
|
+
sourceIcon,
|
|
1265
|
+
sourceName,
|
|
1266
|
+
shouldRender,
|
|
1267
|
+
handleCancel,
|
|
1268
|
+
Suspense,
|
|
1269
|
+
get cn() {
|
|
1270
|
+
return cn2;
|
|
1271
|
+
},
|
|
1272
|
+
DefaultLoaderIcon: DefaultLoaderIcon_default
|
|
1273
|
+
};
|
|
1274
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1275
|
+
enumerable: false,
|
|
1276
|
+
value: true
|
|
1277
|
+
});
|
|
1278
|
+
return __returned__;
|
|
1279
|
+
}
|
|
1280
|
+
});
|
|
1281
|
+
var _hoisted_12 = {
|
|
1282
|
+
key: 0,
|
|
1283
|
+
class: "upup-animate-fx-view upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr]",
|
|
1284
|
+
"data-upup-slot": "source-view"
|
|
1285
|
+
};
|
|
1286
|
+
var _hoisted_22 = { class: "upup-flex upup-items-center upup-gap-2" };
|
|
1287
|
+
var _hoisted_32 = { class: "upup-flex upup-items-center upup-gap-2.5" };
|
|
1288
|
+
var _hoisted_42 = {
|
|
1289
|
+
ref: "headerExtraHost",
|
|
1290
|
+
"data-upup-slot": "source-view-header-extra",
|
|
1291
|
+
class: "upup-flex upup-items-center upup-gap-2.5 empty:upup-hidden"
|
|
1292
|
+
};
|
|
1293
|
+
var _hoisted_52 = { class: "upup-flex upup-h-full upup-items-center upup-justify-center" };
|
|
1294
|
+
function _sfc_render3(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1295
|
+
return $setup.shouldRender ? (_openBlock3(), _createElementBlock2("div", _hoisted_12, [
|
|
1296
|
+
_createCommentVNode2(' Transparent header on the panel gradient (no inner box): the\r\n provider icon + name fill the row; "Back" returns to sources. '),
|
|
1297
|
+
_createElementVNode2(
|
|
1298
|
+
"div",
|
|
1299
|
+
{ class: _normalizeClass2($setup.cn("upup-flex upup-items-center upup-justify-between upup-gap-2 upup-px-3 upup-py-2 upup-text-sm upup-font-medium", $setup.dark ? "upup-text-[#FAFAFA]" : "upup-text-[#0f172a]", $setup.slotClasses.sourceViewHeader)) },
|
|
1300
|
+
[_createElementVNode2("span", _hoisted_22, [(_openBlock3(), _createBlock3(_resolveDynamicComponent2($setup.sourceIcon))), _createElementVNode2(
|
|
1301
|
+
"span",
|
|
1302
|
+
null,
|
|
1303
|
+
_toDisplayString2($setup.sourceName),
|
|
1304
|
+
1
|
|
1305
|
+
/* TEXT */
|
|
1306
|
+
)]), _createElementVNode2("span", _hoisted_32, [_createElementVNode2(
|
|
1307
|
+
"span",
|
|
1308
|
+
_hoisted_42,
|
|
1309
|
+
null,
|
|
1310
|
+
512
|
|
1311
|
+
/* NEED_PATCH */
|
|
1312
|
+
), _createElementVNode2(
|
|
1313
|
+
"button",
|
|
1314
|
+
{
|
|
1315
|
+
class: _normalizeClass2($setup.cn("upup-rounded-md upup-p-1 upup-text-[#0284c7] upup-transition-all upup-duration-300", { "upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": $setup.dark }, $setup.slotClasses.sourceViewCancelButton)),
|
|
1316
|
+
onClick: $setup.handleCancel,
|
|
1317
|
+
type: "button"
|
|
1318
|
+
},
|
|
1319
|
+
_toDisplayString2($setup.tr.overlayBack),
|
|
1320
|
+
3
|
|
1321
|
+
/* TEXT, CLASS */
|
|
1322
|
+
)])],
|
|
1323
|
+
2
|
|
1324
|
+
/* CLASS */
|
|
1325
|
+
),
|
|
1326
|
+
(_openBlock3(), _createBlock3(_Suspense, null, {
|
|
1327
|
+
fallback: _withCtx(() => [_createElementVNode2("div", _hoisted_52, [_createVNode2($setup["DefaultLoaderIcon"])])]),
|
|
1328
|
+
default: _withCtx(() => [(_openBlock3(), _createBlock3(_resolveDynamicComponent2($setup.uploadComponent)))]),
|
|
1329
|
+
_: 1
|
|
1330
|
+
}))
|
|
1331
|
+
])) : _createCommentVNode2("v-if", true);
|
|
1332
|
+
}
|
|
1333
|
+
var SourceView_default = /* @__PURE__ */ export_helper_default(_sfc_main3, [["render", _sfc_render3], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\SourceView.vue"]]);
|
|
1334
|
+
|
|
1335
|
+
// src/components/FileList.vue
|
|
1336
|
+
import { defineComponent as _defineComponent14 } from "vue";
|
|
1337
|
+
import { computed as computed15, ref as ref7 } from "vue";
|
|
1338
|
+
import { useVirtualizer } from "@tanstack/vue-virtual";
|
|
1339
|
+
import { formatUiMessage as t4, pluralUiMessage as plural3, UploadStatus as UploadStatus5 } from "@useupup/core";
|
|
1340
|
+
import { isUploadActive as isUploadActive3, cn as cn12 } from "@useupup/core/internal";
|
|
1341
|
+
|
|
1342
|
+
// src/components/FileItem.vue
|
|
1343
|
+
import { defineComponent as _defineComponent11 } from "vue";
|
|
1344
|
+
import { computed as computed12, ref as ref5 } from "vue";
|
|
1345
|
+
import { cn as cn9 } from "@useupup/core/internal";
|
|
1346
|
+
|
|
1347
|
+
// src/components/FilePreview.vue
|
|
1348
|
+
import { defineComponent as _defineComponent8 } from "vue";
|
|
1349
|
+
import { computed as computed9, watch as watch2 } from "vue";
|
|
1350
|
+
import { UploadStatus as UploadStatus2 } from "@useupup/core";
|
|
1351
|
+
import { fileCanPreviewText, fileGetIsImage, fileGetIsPdf as fileGetIsPdf2, fileGetIsText as fileGetIsText2 } from "@useupup/core/internal";
|
|
1352
|
+
import { cn as cn6, isFileRemovalLocked } from "@useupup/core/internal";
|
|
1353
|
+
|
|
1354
|
+
// src/components/FilePreviewThumbnail.vue
|
|
1355
|
+
import { defineComponent as _defineComponent5 } from "vue";
|
|
1356
|
+
import { computed as computed7 } from "vue";
|
|
1357
|
+
import { fileGetExtension, fileGetIsPdf, fileGetIsText, fileIs3D } from "@useupup/core/internal";
|
|
1358
|
+
import { cn as cn4 } from "@useupup/core/internal";
|
|
1359
|
+
|
|
1360
|
+
// src/components/FileIcon.vue
|
|
1361
|
+
import { defineComponent as _defineComponent4 } from "vue";
|
|
1362
|
+
import { computed as computed6 } from "vue";
|
|
1363
|
+
import { fileTypeIconName } from "@useupup/core";
|
|
1364
|
+
import { cn as cn3 } from "@useupup/core/internal";
|
|
1365
|
+
import { normalizeClass as _normalizeClass3, createVNode as _createVNode3, openBlock as _openBlock4, createElementBlock as _createElementBlock3 } from "vue";
|
|
1366
|
+
var _sfc_main4 = /* @__PURE__ */ _defineComponent4({
|
|
1367
|
+
__name: "FileIcon",
|
|
1368
|
+
props: {
|
|
1369
|
+
extension: {
|
|
1370
|
+
type: String,
|
|
1371
|
+
required: false,
|
|
1372
|
+
default: ""
|
|
1373
|
+
},
|
|
1374
|
+
class: {
|
|
1375
|
+
type: null,
|
|
1376
|
+
required: false
|
|
1377
|
+
}
|
|
1378
|
+
},
|
|
1379
|
+
setup(__props, { expose: __expose }) {
|
|
1380
|
+
__expose();
|
|
1381
|
+
const props = __props;
|
|
1382
|
+
const { isDark: dark } = useUploaderTheme();
|
|
1383
|
+
const iconName = computed6(() => fileTypeIconName(props.extension));
|
|
1384
|
+
const iconClass = computed6(() => cn3("upup-text-5xl upup-text-[#0284c7]", props.class, { "upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": dark.value }));
|
|
1385
|
+
const __returned__ = {
|
|
1386
|
+
props,
|
|
1387
|
+
dark,
|
|
1388
|
+
iconName,
|
|
1389
|
+
iconClass,
|
|
1390
|
+
get Icon() {
|
|
1391
|
+
return Icon_default;
|
|
1392
|
+
}
|
|
1393
|
+
};
|
|
1394
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1395
|
+
enumerable: false,
|
|
1396
|
+
value: true
|
|
1397
|
+
});
|
|
1398
|
+
return __returned__;
|
|
1399
|
+
}
|
|
1400
|
+
});
|
|
1401
|
+
var _hoisted_13 = {
|
|
1402
|
+
class: "upup-inline-flex",
|
|
1403
|
+
"data-testid": "upup-file-icon",
|
|
1404
|
+
"data-upup-slot": "file-icon"
|
|
1405
|
+
};
|
|
1406
|
+
function _sfc_render4(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1407
|
+
return _openBlock4(), _createElementBlock3("span", _hoisted_13, [_createVNode3($setup["Icon"], {
|
|
1408
|
+
name: $setup.iconName,
|
|
1409
|
+
class: _normalizeClass3($setup.iconClass)
|
|
1410
|
+
}, null, 8, ["name", "class"])]);
|
|
1411
|
+
}
|
|
1412
|
+
var FileIcon_default = /* @__PURE__ */ export_helper_default(_sfc_main4, [["render", _sfc_render4], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FileIcon.vue"]]);
|
|
1413
|
+
|
|
1414
|
+
// src/components/FilePreviewThumbnail.vue
|
|
1415
|
+
import { createCommentVNode as _createCommentVNode3, normalizeClass as _normalizeClass4, createVNode as _createVNode4, openBlock as _openBlock5, createElementBlock as _createElementBlock4, toDisplayString as _toDisplayString3, createElementVNode as _createElementVNode3, Fragment as _Fragment2 } from "vue";
|
|
1416
|
+
var _sfc_main5 = /* @__PURE__ */ _defineComponent5({
|
|
1417
|
+
__name: "FilePreviewThumbnail",
|
|
1418
|
+
props: {
|
|
1419
|
+
canPreview: {
|
|
1420
|
+
type: Boolean,
|
|
1421
|
+
required: true
|
|
1422
|
+
},
|
|
1423
|
+
fileType: {
|
|
1424
|
+
type: String,
|
|
1425
|
+
required: true
|
|
1426
|
+
},
|
|
1427
|
+
fileName: {
|
|
1428
|
+
type: String,
|
|
1429
|
+
required: true
|
|
1430
|
+
},
|
|
1431
|
+
fileUrl: {
|
|
1432
|
+
type: String,
|
|
1433
|
+
required: true
|
|
1434
|
+
},
|
|
1435
|
+
fileSize: {
|
|
1436
|
+
type: null,
|
|
1437
|
+
required: false
|
|
1438
|
+
},
|
|
1439
|
+
slotClasses: {
|
|
1440
|
+
type: Object,
|
|
1441
|
+
required: true
|
|
1442
|
+
},
|
|
1443
|
+
allowPreview: {
|
|
1444
|
+
type: Boolean,
|
|
1445
|
+
required: true
|
|
1446
|
+
},
|
|
1447
|
+
labels: {
|
|
1448
|
+
type: Object,
|
|
1449
|
+
required: true
|
|
1450
|
+
}
|
|
1451
|
+
},
|
|
1452
|
+
emits: ["update:canPreview"],
|
|
1453
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
1454
|
+
__expose();
|
|
1455
|
+
const props = __props;
|
|
1456
|
+
const emit = __emit;
|
|
1457
|
+
const extension = computed7(() => fileGetExtension(props.fileType, props.fileName));
|
|
1458
|
+
const is3D = computed7(() => {
|
|
1459
|
+
var _a;
|
|
1460
|
+
return fileIs3D(((_a = extension.value) == null ? void 0 : _a.toLowerCase()) || "");
|
|
1461
|
+
});
|
|
1462
|
+
const isPdf = computed7(() => fileGetIsPdf(props.fileType, props.fileName));
|
|
1463
|
+
const isText = computed7(() => fileGetIsText(props.fileType, props.fileName));
|
|
1464
|
+
function onObjectLoad() {
|
|
1465
|
+
emit("update:canPreview", true);
|
|
1466
|
+
}
|
|
1467
|
+
const __returned__ = {
|
|
1468
|
+
props,
|
|
1469
|
+
emit,
|
|
1470
|
+
extension,
|
|
1471
|
+
is3D,
|
|
1472
|
+
isPdf,
|
|
1473
|
+
isText,
|
|
1474
|
+
onObjectLoad,
|
|
1475
|
+
get cn() {
|
|
1476
|
+
return cn4;
|
|
1477
|
+
},
|
|
1478
|
+
FileIcon: FileIcon_default
|
|
1479
|
+
};
|
|
1480
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1481
|
+
enumerable: false,
|
|
1482
|
+
value: true
|
|
1483
|
+
});
|
|
1484
|
+
return __returned__;
|
|
1485
|
+
}
|
|
1486
|
+
});
|
|
1487
|
+
var _hoisted_14 = {
|
|
1488
|
+
key: 0,
|
|
1489
|
+
class: "upup-flex upup-flex-col upup-items-center upup-gap-2"
|
|
1490
|
+
};
|
|
1491
|
+
var _hoisted_23 = [
|
|
1492
|
+
"data",
|
|
1493
|
+
"name",
|
|
1494
|
+
"type"
|
|
1495
|
+
];
|
|
1496
|
+
var _hoisted_33 = [
|
|
1497
|
+
"data",
|
|
1498
|
+
"name",
|
|
1499
|
+
"type"
|
|
1500
|
+
];
|
|
1501
|
+
function _sfc_render5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1502
|
+
return _openBlock5(), _createElementBlock4(
|
|
1503
|
+
_Fragment2,
|
|
1504
|
+
null,
|
|
1505
|
+
[_createCommentVNode3(" PDFs, 3D files, and oversized text -> static icon "), $setup.isPdf || $setup.is3D || $setup.isText ? (_openBlock5(), _createElementBlock4("div", _hoisted_14, [_createVNode4($setup["FileIcon"], {
|
|
1506
|
+
extension: $setup.extension,
|
|
1507
|
+
class: _normalizeClass4($props.slotClasses.fileIcon)
|
|
1508
|
+
}, null, 8, ["extension", "class"])])) : (_openBlock5(), _createElementBlock4(
|
|
1509
|
+
_Fragment2,
|
|
1510
|
+
{ key: 1 },
|
|
1511
|
+
[!$props.canPreview ? (_openBlock5(), _createElementBlock4(
|
|
1512
|
+
_Fragment2,
|
|
1513
|
+
{ key: 0 },
|
|
1514
|
+
[_createElementVNode3("object", {
|
|
1515
|
+
data: $props.fileUrl,
|
|
1516
|
+
width: "0%",
|
|
1517
|
+
height: "0%",
|
|
1518
|
+
name: $props.fileName,
|
|
1519
|
+
type: $props.fileType,
|
|
1520
|
+
onLoad: $setup.onObjectLoad
|
|
1521
|
+
}, [_createElementVNode3(
|
|
1522
|
+
"p",
|
|
1523
|
+
null,
|
|
1524
|
+
_toDisplayString3($props.labels.loading),
|
|
1525
|
+
1
|
|
1526
|
+
/* TEXT */
|
|
1527
|
+
)], 40, _hoisted_23), _createVNode4($setup["FileIcon"], { extension: $setup.extension }, null, 8, ["extension"])],
|
|
1528
|
+
64
|
|
1529
|
+
/* STABLE_FRAGMENT */
|
|
1530
|
+
)) : _createCommentVNode3("v-if", true), $props.canPreview ? (_openBlock5(), _createElementBlock4(
|
|
1531
|
+
_Fragment2,
|
|
1532
|
+
{ key: 1 },
|
|
1533
|
+
[_createVNode4($setup["FileIcon"], {
|
|
1534
|
+
extension: $setup.extension,
|
|
1535
|
+
class: _normalizeClass4($setup.cn({ "md:upup-hidden": $props.allowPreview }, $props.slotClasses.fileIcon))
|
|
1536
|
+
}, null, 8, ["extension", "class"]), _createElementVNode3(
|
|
1537
|
+
"div",
|
|
1538
|
+
{ class: _normalizeClass4($setup.cn(`upup-relative upup-hidden upup-h-full upup-w-full ${$props.allowPreview ? "md:upup-block" : ""}`)) },
|
|
1539
|
+
[_createElementVNode3("object", {
|
|
1540
|
+
data: $props.fileUrl,
|
|
1541
|
+
width: "100%",
|
|
1542
|
+
height: "100%",
|
|
1543
|
+
name: $props.fileName,
|
|
1544
|
+
type: $props.fileType,
|
|
1545
|
+
class: "upup-absolute upup-h-full upup-w-full"
|
|
1546
|
+
}, [_createElementVNode3(
|
|
1547
|
+
"p",
|
|
1548
|
+
null,
|
|
1549
|
+
_toDisplayString3($props.labels.loading),
|
|
1550
|
+
1
|
|
1551
|
+
/* TEXT */
|
|
1552
|
+
)], 8, _hoisted_33)],
|
|
1553
|
+
2
|
|
1554
|
+
/* CLASS */
|
|
1555
|
+
)],
|
|
1556
|
+
64
|
|
1557
|
+
/* STABLE_FRAGMENT */
|
|
1558
|
+
)) : _createCommentVNode3("v-if", true)],
|
|
1559
|
+
64
|
|
1560
|
+
/* STABLE_FRAGMENT */
|
|
1561
|
+
))],
|
|
1562
|
+
2112
|
|
1563
|
+
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
1564
|
+
);
|
|
1565
|
+
}
|
|
1566
|
+
var FilePreviewThumbnail_default = /* @__PURE__ */ export_helper_default(_sfc_main5, [["render", _sfc_render5], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FilePreviewThumbnail.vue"]]);
|
|
1567
|
+
|
|
1568
|
+
// src/components/shared/ProgressBar.vue
|
|
1569
|
+
import { defineComponent as _defineComponent6 } from "vue";
|
|
1570
|
+
import { isUploadActive, cn as cn5 } from "@useupup/core/internal";
|
|
1571
|
+
import { normalizeClass as _normalizeClass5, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode4, openBlock as _openBlock6, createElementBlock as _createElementBlock5, createCommentVNode as _createCommentVNode4, toDisplayString as _toDisplayString4 } from "vue";
|
|
1572
|
+
var _sfc_main6 = /* @__PURE__ */ _defineComponent6({
|
|
1573
|
+
__name: "ProgressBar",
|
|
1574
|
+
props: {
|
|
1575
|
+
progress: {
|
|
1576
|
+
type: Number,
|
|
1577
|
+
required: true
|
|
1578
|
+
},
|
|
1579
|
+
showValue: {
|
|
1580
|
+
type: Boolean,
|
|
1581
|
+
required: false,
|
|
1582
|
+
default: false
|
|
1583
|
+
},
|
|
1584
|
+
progressBarClassName: {
|
|
1585
|
+
type: String,
|
|
1586
|
+
required: false
|
|
1587
|
+
},
|
|
1588
|
+
class: {
|
|
1589
|
+
type: String,
|
|
1590
|
+
required: false
|
|
1591
|
+
}
|
|
1592
|
+
},
|
|
1593
|
+
setup(__props, { expose: __expose }) {
|
|
1594
|
+
__expose();
|
|
1595
|
+
const props = __props;
|
|
1596
|
+
const { isDark: dark, slotOverrides: slotClasses, slots: themeSlots } = useUploaderTheme();
|
|
1597
|
+
const { translations: tr } = useUploaderI18n();
|
|
1598
|
+
const { upload: { uploadStatus } } = useUploaderUploadControls();
|
|
1599
|
+
const __returned__ = {
|
|
1600
|
+
props,
|
|
1601
|
+
dark,
|
|
1602
|
+
slotClasses,
|
|
1603
|
+
themeSlots,
|
|
1604
|
+
tr,
|
|
1605
|
+
uploadStatus,
|
|
1606
|
+
get isUploadActive() {
|
|
1607
|
+
return isUploadActive;
|
|
1608
|
+
},
|
|
1609
|
+
get cn() {
|
|
1610
|
+
return cn5;
|
|
1611
|
+
}
|
|
1612
|
+
};
|
|
1613
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1614
|
+
enumerable: false,
|
|
1615
|
+
value: true
|
|
1616
|
+
});
|
|
1617
|
+
return __returned__;
|
|
1618
|
+
}
|
|
1619
|
+
});
|
|
1620
|
+
var _hoisted_15 = ["aria-valuenow", "aria-label"];
|
|
1621
|
+
var _hoisted_24 = {
|
|
1622
|
+
key: 0,
|
|
1623
|
+
"aria-hidden": "true",
|
|
1624
|
+
class: "upup-animate-fx-sheen upup-pointer-events-none upup-absolute upup-inset-y-0 upup-left-0 upup-w-2/5",
|
|
1625
|
+
style: { background: "linear-gradient(90deg, transparent, rgba(255,255,255,0.45), transparent)" }
|
|
1626
|
+
};
|
|
1627
|
+
function _sfc_render6(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1628
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1629
|
+
return !!$setup.props.progress || $setup.isUploadActive($setup.uploadStatus) ? (_openBlock6(), _createElementBlock5("div", {
|
|
1630
|
+
key: 0,
|
|
1631
|
+
"data-testid": "upup-progress-bar",
|
|
1632
|
+
"data-upup-slot": "progress-bar",
|
|
1633
|
+
role: "progressbar",
|
|
1634
|
+
"aria-valuenow": $setup.props.progress,
|
|
1635
|
+
"aria-valuemin": 0,
|
|
1636
|
+
"aria-valuemax": 100,
|
|
1637
|
+
"aria-label": $setup.tr.uploadProgress,
|
|
1638
|
+
class: _normalizeClass5($setup.cn("upup-flex upup-items-center upup-gap-2", $setup.props.class, $setup.slotClasses.progressBarContainer, (_b = (_a = $setup.themeSlots) == null ? void 0 : _a.progressBar) == null ? void 0 : _b.root))
|
|
1639
|
+
}, [_createElementVNode4(
|
|
1640
|
+
"div",
|
|
1641
|
+
{ class: _normalizeClass5($setup.cn("upup-relative upup-h-[6px] upup-flex-1 upup-overflow-hidden upup-rounded-[4px]", $setup.dark ? "upup-bg-white/[0.12]" : "upup-bg-[#F5F5F5]", $setup.props.progressBarClassName, $setup.slotClasses.progressBar, (_d = (_c = $setup.themeSlots) == null ? void 0 : _c.progressBar) == null ? void 0 : _d.track)) },
|
|
1642
|
+
[_createElementVNode4(
|
|
1643
|
+
"div",
|
|
1644
|
+
{
|
|
1645
|
+
style: _normalizeStyle({ width: $setup.props.progress + "%" }),
|
|
1646
|
+
class: _normalizeClass5($setup.cn("upup-fx-progress-fill upup-fx-essential upup-h-full", $setup.dark ? "upup-bg-[#38bdf8]" : "upup-bg-[#0ea5e9]", $setup.slotClasses.progressBarInner, (_f = (_e = $setup.themeSlots) == null ? void 0 : _e.progressBar) == null ? void 0 : _f.fill))
|
|
1647
|
+
},
|
|
1648
|
+
null,
|
|
1649
|
+
6
|
|
1650
|
+
/* CLASS, STYLE */
|
|
1651
|
+
), $setup.isUploadActive($setup.uploadStatus) ? (_openBlock6(), _createElementBlock5("div", _hoisted_24)) : _createCommentVNode4("v-if", true)],
|
|
1652
|
+
2
|
|
1653
|
+
/* CLASS */
|
|
1654
|
+
), !!$setup.props.showValue ? (_openBlock6(), _createElementBlock5(
|
|
1655
|
+
"p",
|
|
1656
|
+
{
|
|
1657
|
+
key: 0,
|
|
1658
|
+
class: _normalizeClass5($setup.cn("upup-text-xs upup-font-semibold", { "upup-text-white": $setup.dark }, $setup.slotClasses.progressBarText, (_h = (_g = $setup.themeSlots) == null ? void 0 : _g.progressBar) == null ? void 0 : _h.text))
|
|
1659
|
+
},
|
|
1660
|
+
_toDisplayString4($setup.props.progress) + "% ",
|
|
1661
|
+
3
|
|
1662
|
+
/* TEXT, CLASS */
|
|
1663
|
+
)) : _createCommentVNode4("v-if", true)], 10, _hoisted_15)) : _createCommentVNode4("v-if", true);
|
|
1664
|
+
}
|
|
1665
|
+
var ProgressBar_default = /* @__PURE__ */ export_helper_default(_sfc_main6, [["render", _sfc_render6], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\shared\\ProgressBar.vue"]]);
|
|
1666
|
+
|
|
1667
|
+
// src/components/shared/FileSuccessCheck.vue
|
|
1668
|
+
import { defineComponent as _defineComponent7 } from "vue";
|
|
1669
|
+
import { computed as computed8 } from "vue";
|
|
1670
|
+
import { createElementVNode as _createElementVNode5, normalizeStyle as _normalizeStyle2, openBlock as _openBlock7, createElementBlock as _createElementBlock6 } from "vue";
|
|
1671
|
+
var _sfc_main7 = /* @__PURE__ */ _defineComponent7({
|
|
1672
|
+
__name: "FileSuccessCheck",
|
|
1673
|
+
props: {
|
|
1674
|
+
index: {
|
|
1675
|
+
type: Number,
|
|
1676
|
+
required: false,
|
|
1677
|
+
default: 0
|
|
1678
|
+
},
|
|
1679
|
+
size: {
|
|
1680
|
+
type: Number,
|
|
1681
|
+
required: false,
|
|
1682
|
+
default: 22
|
|
1683
|
+
}
|
|
1684
|
+
},
|
|
1685
|
+
setup(__props, { expose: __expose }) {
|
|
1686
|
+
__expose();
|
|
1687
|
+
const props = __props;
|
|
1688
|
+
const delay = computed8(() => `${Math.min(props.index, 8) * 40}ms`);
|
|
1689
|
+
const __returned__ = {
|
|
1690
|
+
props,
|
|
1691
|
+
delay
|
|
1692
|
+
};
|
|
1693
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1694
|
+
enumerable: false,
|
|
1695
|
+
value: true
|
|
1696
|
+
});
|
|
1697
|
+
return __returned__;
|
|
1698
|
+
}
|
|
1699
|
+
});
|
|
1700
|
+
var _hoisted_16 = ["width", "height"];
|
|
1701
|
+
function _sfc_render7(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1702
|
+
return _openBlock7(), _createElementBlock6(
|
|
1703
|
+
"span",
|
|
1704
|
+
{
|
|
1705
|
+
"data-upup-slot": "file-success",
|
|
1706
|
+
"aria-hidden": "true",
|
|
1707
|
+
class: "upup-animate-fx-pop upup-inline-flex",
|
|
1708
|
+
style: _normalizeStyle2({ animationDelay: $setup.delay })
|
|
1709
|
+
},
|
|
1710
|
+
[(_openBlock7(), _createElementBlock6("svg", {
|
|
1711
|
+
viewBox: "0 0 24 24",
|
|
1712
|
+
width: $props.size,
|
|
1713
|
+
height: $props.size,
|
|
1714
|
+
fill: "none",
|
|
1715
|
+
"aria-hidden": "true"
|
|
1716
|
+
}, [_cache[0] || (_cache[0] = _createElementVNode5(
|
|
1717
|
+
"circle",
|
|
1718
|
+
{
|
|
1719
|
+
cx: "12",
|
|
1720
|
+
cy: "12",
|
|
1721
|
+
r: "11",
|
|
1722
|
+
stroke: "#38bdf8",
|
|
1723
|
+
"stroke-width": "2"
|
|
1724
|
+
},
|
|
1725
|
+
null,
|
|
1726
|
+
-1
|
|
1727
|
+
/* CACHED */
|
|
1728
|
+
)), _createElementVNode5(
|
|
1729
|
+
"path",
|
|
1730
|
+
{
|
|
1731
|
+
d: "M7 12.5l3.2 3.2L17 8.8",
|
|
1732
|
+
stroke: "#38bdf8",
|
|
1733
|
+
"stroke-width": "2",
|
|
1734
|
+
"stroke-linecap": "round",
|
|
1735
|
+
"stroke-linejoin": "round",
|
|
1736
|
+
pathLength: "24",
|
|
1737
|
+
"stroke-dasharray": "24",
|
|
1738
|
+
class: "upup-animate-fx-draw",
|
|
1739
|
+
style: _normalizeStyle2({ animationDelay: $setup.delay })
|
|
1740
|
+
},
|
|
1741
|
+
null,
|
|
1742
|
+
4
|
|
1743
|
+
/* STYLE */
|
|
1744
|
+
)], 8, _hoisted_16))],
|
|
1745
|
+
4
|
|
1746
|
+
/* STYLE */
|
|
1747
|
+
);
|
|
1748
|
+
}
|
|
1749
|
+
var FileSuccessCheck_default = /* @__PURE__ */ export_helper_default(_sfc_main7, [["render", _sfc_render7], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\shared\\FileSuccessCheck.vue"]]);
|
|
1750
|
+
|
|
1751
|
+
// src/components/FilePreview.vue
|
|
1752
|
+
import { createElementVNode as _createElementVNode6, createCommentVNode as _createCommentVNode5, openBlock as _openBlock8, createElementBlock as _createElementBlock7, createVNode as _createVNode5, resolveDynamicComponent as _resolveDynamicComponent3, createBlock as _createBlock4, normalizeClass as _normalizeClass6, normalizeStyle as _normalizeStyle3, toDisplayString as _toDisplayString5 } from "vue";
|
|
1753
|
+
var _sfc_main8 = /* @__PURE__ */ _defineComponent8({
|
|
1754
|
+
__name: "FilePreview",
|
|
1755
|
+
props: {
|
|
1756
|
+
fileName: {
|
|
1757
|
+
type: String,
|
|
1758
|
+
required: true
|
|
1759
|
+
},
|
|
1760
|
+
fileType: {
|
|
1761
|
+
type: String,
|
|
1762
|
+
required: true
|
|
1763
|
+
},
|
|
1764
|
+
fileId: {
|
|
1765
|
+
type: String,
|
|
1766
|
+
required: true
|
|
1767
|
+
},
|
|
1768
|
+
fileUrl: {
|
|
1769
|
+
type: String,
|
|
1770
|
+
required: true
|
|
1771
|
+
},
|
|
1772
|
+
fileSize: {
|
|
1773
|
+
type: Number,
|
|
1774
|
+
required: false
|
|
1775
|
+
},
|
|
1776
|
+
canPreview: {
|
|
1777
|
+
type: Boolean,
|
|
1778
|
+
required: true
|
|
1779
|
+
},
|
|
1780
|
+
onRequestPreview: {
|
|
1781
|
+
type: Function,
|
|
1782
|
+
required: false
|
|
1783
|
+
},
|
|
1784
|
+
index: {
|
|
1785
|
+
type: Number,
|
|
1786
|
+
required: false,
|
|
1787
|
+
default: 0
|
|
1788
|
+
}
|
|
1789
|
+
},
|
|
1790
|
+
emits: ["update:canPreview", "click"],
|
|
1791
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
1792
|
+
__expose();
|
|
1793
|
+
const props = __props;
|
|
1794
|
+
const emit = __emit;
|
|
1795
|
+
const { handleFileRemove, files } = useUploaderFiles();
|
|
1796
|
+
const { translations: tr } = useUploaderI18n();
|
|
1797
|
+
const { upload: { filesProgressMap } } = useUploaderUploadControls();
|
|
1798
|
+
const { icons: { FileDeleteIcon }, allowPreview } = useUploaderOptions();
|
|
1799
|
+
const { isDark: isDarkTheme, slotOverrides: slotClasses, slots: themeSlots } = useUploaderTheme();
|
|
1800
|
+
const isImage = computed9(() => fileGetIsImage(props.fileType));
|
|
1801
|
+
const isVideo = computed9(() => props.fileType.startsWith("video/"));
|
|
1802
|
+
const isPdf = computed9(() => fileGetIsPdf2(props.fileType, props.fileName));
|
|
1803
|
+
const isText = computed9(() => fileGetIsText2(props.fileType, props.fileName));
|
|
1804
|
+
const canPreviewText = computed9(() => fileCanPreviewText(props.fileType, props.fileName, props.fileSize));
|
|
1805
|
+
const progress = computed9(() => {
|
|
1806
|
+
var _a, _b;
|
|
1807
|
+
const fileProgress = filesProgressMap.value[props.fileId];
|
|
1808
|
+
const loaded = (_a = fileProgress == null ? void 0 : fileProgress.loaded) != null ? _a : NaN;
|
|
1809
|
+
const total = (_b = fileProgress == null ? void 0 : fileProgress.total) != null ? _b : NaN;
|
|
1810
|
+
const pct = Math.floor(loaded / total * 100);
|
|
1811
|
+
return Number.isFinite(pct) ? pct : 0;
|
|
1812
|
+
});
|
|
1813
|
+
const fileStatus = computed9(() => {
|
|
1814
|
+
var _a;
|
|
1815
|
+
return (_a = files.value.get(props.fileId)) == null ? void 0 : _a.status;
|
|
1816
|
+
});
|
|
1817
|
+
const isSuccessful = computed9(() => fileStatus.value === UploadStatus2.SUCCESSFUL);
|
|
1818
|
+
watch2([
|
|
1819
|
+
isImage,
|
|
1820
|
+
isPdf,
|
|
1821
|
+
isText,
|
|
1822
|
+
canPreviewText
|
|
1823
|
+
], () => {
|
|
1824
|
+
if ((isImage.value || isPdf.value || isText.value && canPreviewText.value) && !props.canPreview) {
|
|
1825
|
+
emit("update:canPreview", true);
|
|
1826
|
+
}
|
|
1827
|
+
}, { immediate: true });
|
|
1828
|
+
function onHandleFileRemove(e) {
|
|
1829
|
+
e.stopPropagation();
|
|
1830
|
+
handleFileRemove(props.fileId);
|
|
1831
|
+
}
|
|
1832
|
+
function formatFileSize(bytes, t5) {
|
|
1833
|
+
if (!bytes || bytes === 0) return t5.zeroBytes;
|
|
1834
|
+
const k = 1024;
|
|
1835
|
+
const sizes = [
|
|
1836
|
+
t5.bytes,
|
|
1837
|
+
t5.kb,
|
|
1838
|
+
t5.mb,
|
|
1839
|
+
t5.gb
|
|
1840
|
+
];
|
|
1841
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
1842
|
+
return Math.round(bytes / Math.pow(k, i) * 10) / 10 + " " + sizes[i];
|
|
1843
|
+
}
|
|
1844
|
+
function updateCanPreview(val) {
|
|
1845
|
+
emit("update:canPreview", val);
|
|
1846
|
+
}
|
|
1847
|
+
const __returned__ = {
|
|
1848
|
+
props,
|
|
1849
|
+
emit,
|
|
1850
|
+
handleFileRemove,
|
|
1851
|
+
files,
|
|
1852
|
+
tr,
|
|
1853
|
+
filesProgressMap,
|
|
1854
|
+
FileDeleteIcon,
|
|
1855
|
+
allowPreview,
|
|
1856
|
+
isDarkTheme,
|
|
1857
|
+
slotClasses,
|
|
1858
|
+
themeSlots,
|
|
1859
|
+
isImage,
|
|
1860
|
+
isVideo,
|
|
1861
|
+
isPdf,
|
|
1862
|
+
isText,
|
|
1863
|
+
canPreviewText,
|
|
1864
|
+
progress,
|
|
1865
|
+
fileStatus,
|
|
1866
|
+
isSuccessful,
|
|
1867
|
+
onHandleFileRemove,
|
|
1868
|
+
formatFileSize,
|
|
1869
|
+
updateCanPreview,
|
|
1870
|
+
get UploadStatus() {
|
|
1871
|
+
return UploadStatus2;
|
|
1872
|
+
},
|
|
1873
|
+
get cn() {
|
|
1874
|
+
return cn6;
|
|
1875
|
+
},
|
|
1876
|
+
get isFileRemovalLocked() {
|
|
1877
|
+
return isFileRemovalLocked;
|
|
1878
|
+
},
|
|
1879
|
+
FilePreviewThumbnail: FilePreviewThumbnail_default,
|
|
1880
|
+
ProgressBar: ProgressBar_default,
|
|
1881
|
+
FileSuccessCheck: FileSuccessCheck_default
|
|
1882
|
+
};
|
|
1883
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
1884
|
+
enumerable: false,
|
|
1885
|
+
value: true
|
|
1886
|
+
});
|
|
1887
|
+
return __returned__;
|
|
1888
|
+
}
|
|
1889
|
+
});
|
|
1890
|
+
var _hoisted_17 = ["aria-label"];
|
|
1891
|
+
var _hoisted_25 = ["src"];
|
|
1892
|
+
var _hoisted_34 = {
|
|
1893
|
+
key: 1,
|
|
1894
|
+
class: "upup-flex upup-h-full upup-items-center upup-justify-center upup-p-6"
|
|
1895
|
+
};
|
|
1896
|
+
var _hoisted_43 = ["disabled", "aria-label"];
|
|
1897
|
+
var _hoisted_53 = { class: "upup-mt-1 upup-px-0.5" };
|
|
1898
|
+
function _sfc_render8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1899
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
1900
|
+
return _openBlock8(), _createElementBlock7(
|
|
1901
|
+
"div",
|
|
1902
|
+
{
|
|
1903
|
+
class: _normalizeClass6($setup.cn("upup-block upup-w-full", (_b = (_a = $setup.themeSlots) == null ? void 0 : _a.filePreview) == null ? void 0 : _b.root)),
|
|
1904
|
+
"data-testid": "upup-file-preview",
|
|
1905
|
+
"data-upup-slot": "file-preview"
|
|
1906
|
+
},
|
|
1907
|
+
[_createElementVNode6(
|
|
1908
|
+
"div",
|
|
1909
|
+
{
|
|
1910
|
+
class: _normalizeClass6($setup.cn("upup-fx-hover-lift upup-relative upup-h-[160px] upup-w-full upup-overflow-hidden upup-rounded-xl upup-ring-1", "upup-bg-contain upup-bg-center upup-bg-no-repeat", $setup.isDarkTheme ? "upup-bg-white/[0.055] upup-ring-white/[0.08]" : "upup-bg-black/[0.04] upup-ring-black/[0.06]", {
|
|
1911
|
+
[(_c = $setup.slotClasses.fileThumbnailMultiple) != null ? _c : ""]: $setup.slotClasses.fileThumbnailMultiple && $setup.files.size > 1,
|
|
1912
|
+
[(_d = $setup.slotClasses.fileThumbnailSingle) != null ? _d : ""]: $setup.slotClasses.fileThumbnailSingle && $setup.files.size === 1
|
|
1913
|
+
}, (_f = (_e = $setup.themeSlots) == null ? void 0 : _e.filePreview) == null ? void 0 : _f.thumbnail)),
|
|
1914
|
+
style: _normalizeStyle3($setup.isImage ? { backgroundImage: `url(${$props.fileUrl})` } : void 0)
|
|
1915
|
+
},
|
|
1916
|
+
[
|
|
1917
|
+
_createElementVNode6("button", {
|
|
1918
|
+
type: "button",
|
|
1919
|
+
"aria-label": $props.fileName,
|
|
1920
|
+
class: "upup-absolute upup-inset-0 upup-z-0 upup-cursor-pointer",
|
|
1921
|
+
onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("click"))
|
|
1922
|
+
}, null, 8, _hoisted_17),
|
|
1923
|
+
_createCommentVNode5(" First-frame video thumbnail \u2014 no controls chrome (the native\r\n player pill read as broken CSS in a 145px tile). "),
|
|
1924
|
+
$setup.isVideo ? (_openBlock8(), _createElementBlock7("video", {
|
|
1925
|
+
key: 0,
|
|
1926
|
+
src: $props.fileUrl,
|
|
1927
|
+
muted: "",
|
|
1928
|
+
playsinline: "",
|
|
1929
|
+
preload: "metadata",
|
|
1930
|
+
class: "upup-pointer-events-none upup-absolute upup-inset-0 upup-h-full upup-w-full upup-object-cover"
|
|
1931
|
+
}, null, 8, _hoisted_25)) : _createCommentVNode5("v-if", true),
|
|
1932
|
+
!$setup.isImage && !$setup.isVideo ? (_openBlock8(), _createElementBlock7("div", _hoisted_34, [_createVNode5($setup["FilePreviewThumbnail"], {
|
|
1933
|
+
"can-preview": $props.canPreview,
|
|
1934
|
+
"file-type": $props.fileType,
|
|
1935
|
+
"file-name": $props.fileName,
|
|
1936
|
+
"file-url": $props.fileUrl,
|
|
1937
|
+
"file-size": $props.fileSize,
|
|
1938
|
+
"allow-preview": $setup.allowPreview,
|
|
1939
|
+
"slot-classes": $setup.slotClasses,
|
|
1940
|
+
labels: $setup.tr,
|
|
1941
|
+
"onUpdate:canPreview": $setup.updateCanPreview
|
|
1942
|
+
}, null, 8, [
|
|
1943
|
+
"can-preview",
|
|
1944
|
+
"file-type",
|
|
1945
|
+
"file-name",
|
|
1946
|
+
"file-url",
|
|
1947
|
+
"file-size",
|
|
1948
|
+
"allow-preview",
|
|
1949
|
+
"slot-classes",
|
|
1950
|
+
"labels"
|
|
1951
|
+
])])) : _createCommentVNode5("v-if", true),
|
|
1952
|
+
_createCommentVNode5(" Delete disappears once the file has uploaded successfully \u2014 the\r\n completion check is then the only overlay affordance. "),
|
|
1953
|
+
!$setup.isSuccessful ? (_openBlock8(), _createElementBlock7("button", {
|
|
1954
|
+
key: 2,
|
|
1955
|
+
class: _normalizeClass6($setup.cn("upup-fx-remove upup-fx-press upup-absolute upup-right-1.5 upup-top-1.5 upup-z-10", "upup-flex upup-h-[30px] upup-w-[30px] upup-items-center upup-justify-center", "upup-rounded-[8px] upup-bg-[#04080f]/40 upup-text-[#e2e8f0]", "hover:upup-bg-[#04080f]/65", "disabled:upup-cursor-not-allowed disabled:upup-opacity-50", $setup.slotClasses.fileDeleteButton, (_h = (_g = $setup.themeSlots) == null ? void 0 : _g.filePreview) == null ? void 0 : _h.deleteButton)),
|
|
1956
|
+
onClick: $setup.onHandleFileRemove,
|
|
1957
|
+
type: "button",
|
|
1958
|
+
disabled: $setup.isFileRemovalLocked($setup.progress, (_i = $setup.fileStatus) != null ? _i : $setup.UploadStatus.IDLE),
|
|
1959
|
+
"aria-label": $setup.tr.removeFile,
|
|
1960
|
+
"data-testid": "upup-file-remove"
|
|
1961
|
+
}, [(_openBlock8(), _createBlock4(_resolveDynamicComponent3($setup.FileDeleteIcon), { class: "upup-h-5 upup-w-5" }))], 10, _hoisted_43)) : _createCommentVNode5("v-if", true),
|
|
1962
|
+
$setup.isSuccessful ? (_openBlock8(), _createBlock4($setup["FileSuccessCheck"], {
|
|
1963
|
+
key: 3,
|
|
1964
|
+
index: (_j = $props.index) != null ? _j : 0,
|
|
1965
|
+
size: 20,
|
|
1966
|
+
class: "upup-absolute upup-left-1.5 upup-top-1.5 upup-z-10"
|
|
1967
|
+
}, null, 8, ["index"])) : _createCommentVNode5("v-if", true),
|
|
1968
|
+
_createVNode5($setup["ProgressBar"], {
|
|
1969
|
+
class: "upup-absolute upup-bottom-0 upup-left-0 upup-right-0",
|
|
1970
|
+
"progress-bar-class-name": "upup-rounded-t-none upup-rounded-b-md",
|
|
1971
|
+
progress: $setup.progress
|
|
1972
|
+
}, null, 8, ["progress"])
|
|
1973
|
+
],
|
|
1974
|
+
6
|
|
1975
|
+
/* CLASS, STYLE */
|
|
1976
|
+
), _createElementVNode6("div", _hoisted_53, [
|
|
1977
|
+
_createElementVNode6(
|
|
1978
|
+
"div",
|
|
1979
|
+
{ class: _normalizeClass6($setup.cn("upup-truncate upup-text-[13px] upup-font-normal upup-leading-tight upup-text-gray-900", { "upup-text-white": $setup.isDarkTheme }, (_l = (_k = $setup.themeSlots) == null ? void 0 : _k.filePreview) == null ? void 0 : _l.name)) },
|
|
1980
|
+
_toDisplayString5($props.fileName),
|
|
1981
|
+
3
|
|
1982
|
+
/* TEXT, CLASS */
|
|
1983
|
+
),
|
|
1984
|
+
_createElementVNode6(
|
|
1985
|
+
"div",
|
|
1986
|
+
{ class: _normalizeClass6($setup.cn("upup-mt-0.5 upup-text-[11px] upup-leading-tight upup-text-gray-500", { "upup-text-gray-400": $setup.isDarkTheme }, (_n = (_m = $setup.themeSlots) == null ? void 0 : _m.filePreview) == null ? void 0 : _n.size)) },
|
|
1987
|
+
_toDisplayString5($setup.formatFileSize($props.fileSize, $setup.tr)),
|
|
1988
|
+
3
|
|
1989
|
+
/* TEXT, CLASS */
|
|
1990
|
+
),
|
|
1991
|
+
$setup.allowPreview && $props.canPreview ? (_openBlock8(), _createElementBlock7(
|
|
1992
|
+
"button",
|
|
1993
|
+
{
|
|
1994
|
+
key: 0,
|
|
1995
|
+
type: "button",
|
|
1996
|
+
class: _normalizeClass6($setup.cn("upup-mt-1 upup-text-[11px] upup-font-normal upup-leading-tight upup-text-[#0284c7] upup-transition-all hover:upup-text-[#0284c7] hover:upup-underline", { "upup-text-[#38bdf8] hover:upup-text-[#7dd3fc]": $setup.isDarkTheme }, (_p = (_o = $setup.themeSlots) == null ? void 0 : _o.filePreview) == null ? void 0 : _p.previewButton)),
|
|
1997
|
+
onClick: _cache[1] || (_cache[1] = ($event) => {
|
|
1998
|
+
var _a2;
|
|
1999
|
+
return (_a2 = $props.onRequestPreview) == null ? void 0 : _a2.call($props);
|
|
2000
|
+
})
|
|
2001
|
+
},
|
|
2002
|
+
_toDisplayString5($setup.tr.clickToPreview),
|
|
2003
|
+
3
|
|
2004
|
+
/* TEXT, CLASS */
|
|
2005
|
+
)) : _createCommentVNode5("v-if", true)
|
|
2006
|
+
])],
|
|
2007
|
+
2
|
|
2008
|
+
/* CLASS */
|
|
2009
|
+
);
|
|
2010
|
+
}
|
|
2011
|
+
var FilePreview_default = /* @__PURE__ */ export_helper_default(_sfc_main8, [["render", _sfc_render8], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FilePreview.vue"]]);
|
|
2012
|
+
|
|
2013
|
+
// src/components/FilePreviewPortal.vue
|
|
2014
|
+
import { defineComponent as _defineComponent9 } from "vue";
|
|
2015
|
+
import { computed as computed10, onMounted as onMounted4, onUnmounted as onUnmounted5, ref as ref4 } from "vue";
|
|
2016
|
+
import { formatUiMessage as t2 } from "@useupup/core";
|
|
2017
|
+
import { cn as cn7 } from "@useupup/core/internal";
|
|
2018
|
+
import { fileGetIsImage as fileGetIsImage2, fileGetIsPdf as fileGetIsPdf3, fileGetIsText as fileGetIsText3, PREVIEW_MAX_TEXT_SIZE, PREVIEW_TEXT_TRUNCATE_LENGTH } from "@useupup/core/internal";
|
|
2019
|
+
import { createElementVNode as _createElementVNode7, openBlock as _openBlock9, createElementBlock as _createElementBlock8, createCommentVNode as _createCommentVNode6, toDisplayString as _toDisplayString6, Fragment as _Fragment3, normalizeClass as _normalizeClass7, Teleport as _Teleport, createBlock as _createBlock5 } from "vue";
|
|
2020
|
+
var _sfc_main9 = /* @__PURE__ */ _defineComponent9({
|
|
2021
|
+
__name: "FilePreviewPortal",
|
|
2022
|
+
props: {
|
|
2023
|
+
fileUrl: {
|
|
2024
|
+
type: String,
|
|
2025
|
+
required: true
|
|
2026
|
+
},
|
|
2027
|
+
fileName: {
|
|
2028
|
+
type: String,
|
|
2029
|
+
required: true
|
|
2030
|
+
},
|
|
2031
|
+
fileType: {
|
|
2032
|
+
type: String,
|
|
2033
|
+
required: true
|
|
2034
|
+
},
|
|
2035
|
+
fileSize: {
|
|
2036
|
+
type: Number,
|
|
2037
|
+
required: false
|
|
2038
|
+
}
|
|
2039
|
+
},
|
|
2040
|
+
emits: ["close", "stopPropagation"],
|
|
2041
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
2042
|
+
__expose();
|
|
2043
|
+
const props = __props;
|
|
2044
|
+
const emit = __emit;
|
|
2045
|
+
const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme();
|
|
2046
|
+
const { translations: tr } = useUploaderI18n();
|
|
2047
|
+
const isImage = computed10(() => fileGetIsImage2(props.fileType));
|
|
2048
|
+
const isPdf = computed10(() => fileGetIsPdf3(props.fileType, props.fileName));
|
|
2049
|
+
const isText = computed10(() => fileGetIsText3(props.fileType, props.fileName));
|
|
2050
|
+
const isOversizedText = computed10(() => isText.value && props.fileSize !== void 0 && props.fileSize > PREVIEW_MAX_TEXT_SIZE);
|
|
2051
|
+
const textContent = ref4("");
|
|
2052
|
+
const textLoading = ref4(false);
|
|
2053
|
+
const textError = ref4();
|
|
2054
|
+
const isTruncated = ref4(false);
|
|
2055
|
+
function handleKeyDown(event) {
|
|
2056
|
+
if (event.key === "Escape") emit("close");
|
|
2057
|
+
}
|
|
2058
|
+
onMounted4(() => {
|
|
2059
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
2060
|
+
loadText();
|
|
2061
|
+
});
|
|
2062
|
+
onUnmounted5(() => {
|
|
2063
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
2064
|
+
});
|
|
2065
|
+
async function loadText() {
|
|
2066
|
+
var _a;
|
|
2067
|
+
if (!isText.value) return;
|
|
2068
|
+
try {
|
|
2069
|
+
textLoading.value = true;
|
|
2070
|
+
if (isOversizedText.value) {
|
|
2071
|
+
const res = await fetch(props.fileUrl);
|
|
2072
|
+
const reader = (_a = res.body) == null ? void 0 : _a.getReader();
|
|
2073
|
+
if (!reader) throw new Error("Cannot read file");
|
|
2074
|
+
const decoder = new TextDecoder();
|
|
2075
|
+
let result = "";
|
|
2076
|
+
let done = false;
|
|
2077
|
+
while (!done && result.length < PREVIEW_TEXT_TRUNCATE_LENGTH) {
|
|
2078
|
+
const { value, done: streamDone } = await reader.read();
|
|
2079
|
+
done = streamDone;
|
|
2080
|
+
if (value) {
|
|
2081
|
+
result += decoder.decode(value, { stream: !done });
|
|
2082
|
+
}
|
|
2083
|
+
}
|
|
2084
|
+
reader.cancel();
|
|
2085
|
+
const wasTruncated = !done || result.length > PREVIEW_TEXT_TRUNCATE_LENGTH;
|
|
2086
|
+
if (wasTruncated) {
|
|
2087
|
+
result = result.slice(0, PREVIEW_TEXT_TRUNCATE_LENGTH);
|
|
2088
|
+
}
|
|
2089
|
+
isTruncated.value = wasTruncated;
|
|
2090
|
+
textContent.value = result;
|
|
2091
|
+
} else {
|
|
2092
|
+
const res = await fetch(props.fileUrl);
|
|
2093
|
+
textContent.value = await res.text();
|
|
2094
|
+
}
|
|
2095
|
+
} catch (e) {
|
|
2096
|
+
textError.value = (e == null ? void 0 : e.message) || "Preview error";
|
|
2097
|
+
} finally {
|
|
2098
|
+
textLoading.value = false;
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2101
|
+
function onBackdropClick() {
|
|
2102
|
+
emit("close");
|
|
2103
|
+
}
|
|
2104
|
+
function onContentClick(e) {
|
|
2105
|
+
emit("stopPropagation", e);
|
|
2106
|
+
e.stopPropagation();
|
|
2107
|
+
}
|
|
2108
|
+
const __returned__ = {
|
|
2109
|
+
props,
|
|
2110
|
+
emit,
|
|
2111
|
+
dark,
|
|
2112
|
+
slotClasses,
|
|
2113
|
+
tr,
|
|
2114
|
+
isImage,
|
|
2115
|
+
isPdf,
|
|
2116
|
+
isText,
|
|
2117
|
+
isOversizedText,
|
|
2118
|
+
textContent,
|
|
2119
|
+
textLoading,
|
|
2120
|
+
textError,
|
|
2121
|
+
isTruncated,
|
|
2122
|
+
handleKeyDown,
|
|
2123
|
+
loadText,
|
|
2124
|
+
onBackdropClick,
|
|
2125
|
+
onContentClick,
|
|
2126
|
+
get t() {
|
|
2127
|
+
return t2;
|
|
2128
|
+
},
|
|
2129
|
+
get cn() {
|
|
2130
|
+
return cn7;
|
|
2131
|
+
}
|
|
2132
|
+
};
|
|
2133
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
2134
|
+
enumerable: false,
|
|
2135
|
+
value: true
|
|
2136
|
+
});
|
|
2137
|
+
return __returned__;
|
|
2138
|
+
}
|
|
2139
|
+
});
|
|
2140
|
+
var _hoisted_18 = {
|
|
2141
|
+
class: "upup-scope",
|
|
2142
|
+
"data-upup-slot": "file-preview-portal"
|
|
2143
|
+
};
|
|
2144
|
+
var _hoisted_26 = ["aria-label"];
|
|
2145
|
+
var _hoisted_35 = { class: "upup-relative upup-h-[90vh] upup-w-[90vw] upup-p-4" };
|
|
2146
|
+
var _hoisted_44 = ["aria-label"];
|
|
2147
|
+
var _hoisted_54 = ["src", "alt"];
|
|
2148
|
+
var _hoisted_62 = ["src", "title"];
|
|
2149
|
+
var _hoisted_72 = {
|
|
2150
|
+
key: 0,
|
|
2151
|
+
class: "upup-h-full upup-w-full upup-overflow-auto upup-p-4 upup-font-mono upup-text-xs"
|
|
2152
|
+
};
|
|
2153
|
+
var _hoisted_82 = { key: 0 };
|
|
2154
|
+
var _hoisted_92 = { key: 1 };
|
|
2155
|
+
var _hoisted_102 = { class: "upup-whitespace-pre-wrap" };
|
|
2156
|
+
var _hoisted_11 = {
|
|
2157
|
+
key: 0,
|
|
2158
|
+
class: "upup-mt-4 upup-rounded upup-border upup-border-yellow-500/30 upup-bg-yellow-500/10 upup-px-3 upup-py-2 upup-text-xs upup-text-yellow-400"
|
|
2159
|
+
};
|
|
2160
|
+
var _hoisted_122 = [
|
|
2161
|
+
"data",
|
|
2162
|
+
"name",
|
|
2163
|
+
"type"
|
|
2164
|
+
];
|
|
2165
|
+
function _sfc_render9(_ctx, _cache, $props, $setup, $data, $options) {
|
|
2166
|
+
return _openBlock9(), _createBlock5(_Teleport, { to: "body" }, [_createElementVNode7("div", _hoisted_18, [_createElementVNode7("div", {
|
|
2167
|
+
class: "upup-fixed upup-inset-0 upup-z-[2147483647] upup-flex upup-items-center upup-justify-center upup-bg-black/40",
|
|
2168
|
+
role: "dialog",
|
|
2169
|
+
"aria-modal": "true",
|
|
2170
|
+
"aria-label": $props.fileName,
|
|
2171
|
+
onClick: $setup.onBackdropClick
|
|
2172
|
+
}, [_createElementVNode7("div", _hoisted_35, [_createElementVNode7(
|
|
2173
|
+
"div",
|
|
2174
|
+
{
|
|
2175
|
+
class: _normalizeClass7($setup.cn("upup-absolute upup-inset-0 upup-m-4 upup-bg-white", { "upup-bg-[#232323] dark:upup-bg-[#232323]": $setup.dark }, $setup.slotClasses.filePreviewPortal)),
|
|
2176
|
+
onClick: $setup.onContentClick
|
|
2177
|
+
},
|
|
2178
|
+
[
|
|
2179
|
+
_createElementVNode7("button", {
|
|
2180
|
+
type: "button",
|
|
2181
|
+
"aria-label": $setup.tr.cancel,
|
|
2182
|
+
class: "upup-absolute upup-right-3 upup-top-3 upup-z-10 upup-flex upup-size-8 upup-items-center upup-justify-center upup-rounded-full upup-bg-black/70 upup-text-sm upup-font-semibold upup-text-white upup-shadow-sm hover:upup-bg-black focus:upup-outline-none focus:upup-ring-2 focus:upup-ring-white",
|
|
2183
|
+
onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("close"))
|
|
2184
|
+
}, " x ", 8, _hoisted_44),
|
|
2185
|
+
$setup.isImage ? (_openBlock9(), _createElementBlock8("img", {
|
|
2186
|
+
key: 0,
|
|
2187
|
+
src: $props.fileUrl,
|
|
2188
|
+
alt: $props.fileName,
|
|
2189
|
+
class: "upup-h-full upup-w-full upup-rounded upup-object-contain"
|
|
2190
|
+
}, null, 8, _hoisted_54)) : _createCommentVNode6("v-if", true),
|
|
2191
|
+
$setup.isPdf ? (_openBlock9(), _createElementBlock8("embed", {
|
|
2192
|
+
key: 1,
|
|
2193
|
+
src: $props.fileUrl,
|
|
2194
|
+
type: "application/pdf",
|
|
2195
|
+
width: "100%",
|
|
2196
|
+
height: "100%",
|
|
2197
|
+
class: "upup-rounded",
|
|
2198
|
+
title: $props.fileName
|
|
2199
|
+
}, null, 8, _hoisted_62)) : _createCommentVNode6("v-if", true),
|
|
2200
|
+
!$setup.isImage && !$setup.isPdf ? (_openBlock9(), _createElementBlock8(
|
|
2201
|
+
_Fragment3,
|
|
2202
|
+
{ key: 2 },
|
|
2203
|
+
[$setup.isText ? (_openBlock9(), _createElementBlock8("div", _hoisted_72, [
|
|
2204
|
+
$setup.textLoading ? (_openBlock9(), _createElementBlock8(
|
|
2205
|
+
"p",
|
|
2206
|
+
_hoisted_82,
|
|
2207
|
+
_toDisplayString6($setup.tr.loading),
|
|
2208
|
+
1
|
|
2209
|
+
/* TEXT */
|
|
2210
|
+
)) : _createCommentVNode6("v-if", true),
|
|
2211
|
+
$setup.textError ? (_openBlock9(), _createElementBlock8(
|
|
2212
|
+
"p",
|
|
2213
|
+
_hoisted_92,
|
|
2214
|
+
_toDisplayString6($setup.t($setup.tr.previewError, { message: $setup.textError })),
|
|
2215
|
+
1
|
|
2216
|
+
/* TEXT */
|
|
2217
|
+
)) : _createCommentVNode6("v-if", true),
|
|
2218
|
+
!$setup.textLoading && !$setup.textError ? (_openBlock9(), _createElementBlock8(
|
|
2219
|
+
_Fragment3,
|
|
2220
|
+
{ key: 2 },
|
|
2221
|
+
[_createElementVNode7(
|
|
2222
|
+
"pre",
|
|
2223
|
+
_hoisted_102,
|
|
2224
|
+
_toDisplayString6($setup.textContent),
|
|
2225
|
+
1
|
|
2226
|
+
/* TEXT */
|
|
2227
|
+
), $setup.isTruncated ? (_openBlock9(), _createElementBlock8("div", _hoisted_11, " Content truncated - file is too large to preview in full. ")) : _createCommentVNode6("v-if", true)],
|
|
2228
|
+
64
|
|
2229
|
+
/* STABLE_FRAGMENT */
|
|
2230
|
+
)) : _createCommentVNode6("v-if", true)
|
|
2231
|
+
])) : _createCommentVNode6("v-if", true), !$setup.isText ? (_openBlock9(), _createElementBlock8("object", {
|
|
2232
|
+
key: 1,
|
|
2233
|
+
data: $props.fileUrl,
|
|
2234
|
+
width: "100%",
|
|
2235
|
+
height: "100%",
|
|
2236
|
+
name: $props.fileName,
|
|
2237
|
+
type: $props.fileType
|
|
2238
|
+
}, [_createElementVNode7(
|
|
2239
|
+
"p",
|
|
2240
|
+
null,
|
|
2241
|
+
_toDisplayString6($setup.tr.loading),
|
|
2242
|
+
1
|
|
2243
|
+
/* TEXT */
|
|
2244
|
+
)], 8, _hoisted_122)) : _createCommentVNode6("v-if", true)],
|
|
2245
|
+
64
|
|
2246
|
+
/* STABLE_FRAGMENT */
|
|
2247
|
+
)) : _createCommentVNode6("v-if", true)
|
|
2248
|
+
],
|
|
2249
|
+
2
|
|
2250
|
+
/* CLASS */
|
|
2251
|
+
)])], 8, _hoisted_26)])]);
|
|
2252
|
+
}
|
|
2253
|
+
var FilePreviewPortal_default = /* @__PURE__ */ export_helper_default(_sfc_main9, [["render", _sfc_render9], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FilePreviewPortal.vue"]]);
|
|
2254
|
+
|
|
2255
|
+
// src/components/FileRow.vue
|
|
2256
|
+
import { defineComponent as _defineComponent10 } from "vue";
|
|
2257
|
+
import { computed as computed11 } from "vue";
|
|
2258
|
+
import { cn as cn8, isFileRemovalLocked as isFileRemovalLocked2 } from "@useupup/core/internal";
|
|
2259
|
+
import { UploadStatus as UploadStatus3, fileTypeIconName as fileTypeIconName2 } from "@useupup/core";
|
|
2260
|
+
import { fileGetExtension as fileGetExtension2, fileGetIsImage as fileGetIsImage3 } from "@useupup/core/internal";
|
|
2261
|
+
import { createCommentVNode as _createCommentVNode7, openBlock as _openBlock10, createElementBlock as _createElementBlock9, createBlock as _createBlock6, normalizeStyle as _normalizeStyle4, createElementVNode as _createElementVNode8, toDisplayString as _toDisplayString7, normalizeClass as _normalizeClass8, resolveDynamicComponent as _resolveDynamicComponent4 } from "vue";
|
|
2262
|
+
var _sfc_main10 = /* @__PURE__ */ _defineComponent10({
|
|
2263
|
+
__name: "FileRow",
|
|
2264
|
+
props: {
|
|
2265
|
+
file: {
|
|
2266
|
+
type: Object,
|
|
2267
|
+
required: true
|
|
2268
|
+
},
|
|
2269
|
+
index: {
|
|
2270
|
+
type: Number,
|
|
2271
|
+
required: false,
|
|
2272
|
+
default: 0
|
|
2273
|
+
}
|
|
2274
|
+
},
|
|
2275
|
+
setup(__props, { expose: __expose }) {
|
|
2276
|
+
__expose();
|
|
2277
|
+
const ARCHIVE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2278
|
+
"zip",
|
|
2279
|
+
"rar",
|
|
2280
|
+
"7z",
|
|
2281
|
+
"tar",
|
|
2282
|
+
"gz",
|
|
2283
|
+
"bz2",
|
|
2284
|
+
"xz"
|
|
2285
|
+
]);
|
|
2286
|
+
function nonMediaThumb(type2, name) {
|
|
2287
|
+
const ext = fileGetExtension2(type2, name);
|
|
2288
|
+
if (type2.startsWith("audio/")) return {
|
|
2289
|
+
gradient: "linear-gradient(135deg,#a855f7,#6366f1)",
|
|
2290
|
+
icon: "audio"
|
|
2291
|
+
};
|
|
2292
|
+
if (ext === "pdf" || type2 === "application/pdf") return {
|
|
2293
|
+
gradient: "linear-gradient(135deg,#f43f5e,#ec4899)",
|
|
2294
|
+
icon: "file-pdf"
|
|
2295
|
+
};
|
|
2296
|
+
if (ARCHIVE_EXTENSIONS.has(ext) || type2.includes("zip")) return {
|
|
2297
|
+
gradient: "linear-gradient(135deg,#f59e0b,#f97316)",
|
|
2298
|
+
icon: fileTypeIconName2(ext === "zip" ? "zip" : ext)
|
|
2299
|
+
};
|
|
2300
|
+
return {
|
|
2301
|
+
gradient: "linear-gradient(135deg,#0ea5e9,#6366f1)",
|
|
2302
|
+
icon: fileTypeIconName2(ext)
|
|
2303
|
+
};
|
|
2304
|
+
}
|
|
2305
|
+
const props = __props;
|
|
2306
|
+
const { handleFileRemove } = useUploaderFiles();
|
|
2307
|
+
const { translations: tr } = useUploaderI18n();
|
|
2308
|
+
const { icons: { FileDeleteIcon } } = useUploaderOptions();
|
|
2309
|
+
const { isDark: dark } = useUploaderTheme();
|
|
2310
|
+
const { upload: { filesProgressMap } } = useUploaderUploadControls();
|
|
2311
|
+
const type = computed11(() => {
|
|
2312
|
+
var _a;
|
|
2313
|
+
return (_a = props.file.type) != null ? _a : "";
|
|
2314
|
+
});
|
|
2315
|
+
const isImage = computed11(() => fileGetIsImage3(type.value));
|
|
2316
|
+
const isVideo = computed11(() => type.value.startsWith("video/"));
|
|
2317
|
+
const isSuccessful = computed11(() => props.file.status === UploadStatus3.SUCCESSFUL);
|
|
2318
|
+
const thumb = computed11(() => nonMediaThumb(type.value, props.file.name));
|
|
2319
|
+
const thumbStyle = computed11(() => {
|
|
2320
|
+
var _a;
|
|
2321
|
+
return isImage.value ? { backgroundImage: `url(${(_a = props.file.url) != null ? _a : ""})` } : isVideo.value ? void 0 : { background: thumb.value.gradient };
|
|
2322
|
+
});
|
|
2323
|
+
const progress = computed11(() => {
|
|
2324
|
+
var _a, _b;
|
|
2325
|
+
const p = filesProgressMap.value[props.file.id];
|
|
2326
|
+
const loaded = (_a = p == null ? void 0 : p.loaded) != null ? _a : NaN;
|
|
2327
|
+
const total = (_b = p == null ? void 0 : p.total) != null ? _b : NaN;
|
|
2328
|
+
const pct = Math.floor(loaded / total * 100);
|
|
2329
|
+
return Number.isFinite(pct) ? pct : 0;
|
|
2330
|
+
});
|
|
2331
|
+
function formatFileSize(bytes, t5) {
|
|
2332
|
+
if (!bytes || bytes === 0) return t5.zeroBytes;
|
|
2333
|
+
const k = 1024;
|
|
2334
|
+
const sizes = [
|
|
2335
|
+
t5.bytes,
|
|
2336
|
+
t5.kb,
|
|
2337
|
+
t5.mb,
|
|
2338
|
+
t5.gb
|
|
2339
|
+
];
|
|
2340
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
2341
|
+
return Math.round(bytes / Math.pow(k, i) * 10) / 10 + " " + sizes[i];
|
|
2342
|
+
}
|
|
2343
|
+
function onRemove(e) {
|
|
2344
|
+
e.stopPropagation();
|
|
2345
|
+
handleFileRemove(props.file.id);
|
|
2346
|
+
}
|
|
2347
|
+
const __returned__ = {
|
|
2348
|
+
ARCHIVE_EXTENSIONS,
|
|
2349
|
+
nonMediaThumb,
|
|
2350
|
+
props,
|
|
2351
|
+
handleFileRemove,
|
|
2352
|
+
tr,
|
|
2353
|
+
FileDeleteIcon,
|
|
2354
|
+
dark,
|
|
2355
|
+
filesProgressMap,
|
|
2356
|
+
type,
|
|
2357
|
+
isImage,
|
|
2358
|
+
isVideo,
|
|
2359
|
+
isSuccessful,
|
|
2360
|
+
thumb,
|
|
2361
|
+
thumbStyle,
|
|
2362
|
+
progress,
|
|
2363
|
+
formatFileSize,
|
|
2364
|
+
onRemove,
|
|
2365
|
+
get cn() {
|
|
2366
|
+
return cn8;
|
|
2367
|
+
},
|
|
2368
|
+
get isFileRemovalLocked() {
|
|
2369
|
+
return isFileRemovalLocked2;
|
|
2370
|
+
},
|
|
2371
|
+
get Icon() {
|
|
2372
|
+
return Icon_default;
|
|
2373
|
+
},
|
|
2374
|
+
ProgressBar: ProgressBar_default,
|
|
2375
|
+
FileSuccessCheck: FileSuccessCheck_default
|
|
2376
|
+
};
|
|
2377
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
2378
|
+
enumerable: false,
|
|
2379
|
+
value: true
|
|
2380
|
+
});
|
|
2381
|
+
return __returned__;
|
|
2382
|
+
}
|
|
2383
|
+
});
|
|
2384
|
+
var _hoisted_19 = ["src"];
|
|
2385
|
+
var _hoisted_27 = { class: "upup-flex upup-min-w-0 upup-flex-1 upup-flex-col upup-gap-0.5" };
|
|
2386
|
+
var _hoisted_36 = ["disabled", "aria-label"];
|
|
2387
|
+
function _sfc_render10(_ctx, _cache, $props, $setup, $data, $options) {
|
|
2388
|
+
var _a, _b;
|
|
2389
|
+
return _openBlock10(), _createElementBlock9(
|
|
2390
|
+
"div",
|
|
2391
|
+
{ class: _normalizeClass8($setup.cn("upup-fx-hover-lift upup-flex upup-w-full upup-items-center upup-gap-3 upup-rounded-xl upup-px-3 upup-py-2.5 upup-ring-1", $setup.dark ? "upup-bg-white/[0.04] upup-ring-white/[0.07]" : "upup-bg-black/[0.04] upup-ring-black/[0.06]")) },
|
|
2392
|
+
[
|
|
2393
|
+
_createElementVNode8(
|
|
2394
|
+
"div",
|
|
2395
|
+
{
|
|
2396
|
+
class: "upup-relative upup-flex upup-h-10 upup-w-10 upup-flex-none upup-items-center upup-justify-center upup-overflow-hidden upup-rounded-[9px] upup-bg-center upup-bg-cover upup-bg-no-repeat",
|
|
2397
|
+
style: _normalizeStyle4($setup.thumbStyle)
|
|
2398
|
+
},
|
|
2399
|
+
[
|
|
2400
|
+
_createCommentVNode7(" Real first-frame video thumbnail (no controls chrome). Uses the\r\n local object URL, which persists through upload (updateFile keeps\r\n `url`), so the preview survives a completed run. "),
|
|
2401
|
+
$setup.isVideo ? (_openBlock10(), _createElementBlock9("video", {
|
|
2402
|
+
key: 0,
|
|
2403
|
+
src: (_a = $props.file.url) != null ? _a : "",
|
|
2404
|
+
muted: "",
|
|
2405
|
+
playsinline: "",
|
|
2406
|
+
preload: "metadata",
|
|
2407
|
+
class: "upup-pointer-events-none upup-absolute upup-inset-0 upup-h-full upup-w-full upup-object-cover"
|
|
2408
|
+
}, null, 8, _hoisted_19)) : _createCommentVNode7("v-if", true),
|
|
2409
|
+
!$setup.isImage && !$setup.isVideo ? (_openBlock10(), _createBlock6($setup["Icon"], {
|
|
2410
|
+
key: 1,
|
|
2411
|
+
name: $setup.thumb.icon,
|
|
2412
|
+
size: 20,
|
|
2413
|
+
class: "upup-text-white"
|
|
2414
|
+
}, null, 8, ["name"])) : _createCommentVNode7("v-if", true)
|
|
2415
|
+
],
|
|
2416
|
+
4
|
|
2417
|
+
/* STYLE */
|
|
2418
|
+
),
|
|
2419
|
+
_createElementVNode8("div", _hoisted_27, [
|
|
2420
|
+
_createElementVNode8(
|
|
2421
|
+
"div",
|
|
2422
|
+
{ class: _normalizeClass8($setup.cn("upup-truncate upup-text-[13px]", $setup.dark ? "upup-text-[#e2e8f0]" : "upup-text-gray-900")) },
|
|
2423
|
+
_toDisplayString7($props.file.name),
|
|
2424
|
+
3
|
|
2425
|
+
/* TEXT, CLASS */
|
|
2426
|
+
),
|
|
2427
|
+
_createElementVNode8(
|
|
2428
|
+
"div",
|
|
2429
|
+
{ class: _normalizeClass8($setup.cn("upup-text-[12px]", $setup.dark ? "upup-text-[#94a3b8]" : "upup-text-gray-500")) },
|
|
2430
|
+
_toDisplayString7($setup.formatFileSize($props.file.size, $setup.tr)),
|
|
2431
|
+
3
|
|
2432
|
+
/* TEXT, CLASS */
|
|
2433
|
+
),
|
|
2434
|
+
!!$setup.progress ? (_openBlock10(), _createBlock6($setup["ProgressBar"], {
|
|
2435
|
+
key: 0,
|
|
2436
|
+
class: "upup-mt-1",
|
|
2437
|
+
"progress-bar-class-name": "upup-rounded",
|
|
2438
|
+
progress: $setup.progress,
|
|
2439
|
+
"show-value": true
|
|
2440
|
+
}, null, 8, ["progress"])) : _createCommentVNode7("v-if", true)
|
|
2441
|
+
]),
|
|
2442
|
+
$setup.isSuccessful ? (_openBlock10(), _createBlock6($setup["FileSuccessCheck"], {
|
|
2443
|
+
key: 0,
|
|
2444
|
+
index: (_b = $props.index) != null ? _b : 0,
|
|
2445
|
+
size: 22,
|
|
2446
|
+
class: "upup-flex-none"
|
|
2447
|
+
}, null, 8, ["index"])) : _createCommentVNode7("v-if", true),
|
|
2448
|
+
_createCommentVNode7(" Once a file has uploaded successfully its delete control is gone \u2014\r\n the completion check is the only trailing affordance. "),
|
|
2449
|
+
!$setup.isSuccessful ? (_openBlock10(), _createElementBlock9("button", {
|
|
2450
|
+
key: 1,
|
|
2451
|
+
class: _normalizeClass8($setup.cn("upup-fx-remove upup-fx-press upup-flex upup-h-8 upup-w-8 upup-flex-none upup-items-center upup-justify-center upup-rounded-lg", $setup.dark ? "upup-text-[#64748b] hover:upup-bg-white/[0.06]" : "upup-text-gray-500 hover:upup-bg-black/[0.06]", "disabled:upup-cursor-not-allowed disabled:upup-opacity-50")),
|
|
2452
|
+
onClick: $setup.onRemove,
|
|
2453
|
+
type: "button",
|
|
2454
|
+
disabled: $setup.isFileRemovalLocked($setup.progress, $props.file.status),
|
|
2455
|
+
"aria-label": $setup.tr.removeFile,
|
|
2456
|
+
"data-testid": "upup-file-remove"
|
|
2457
|
+
}, [(_openBlock10(), _createBlock6(_resolveDynamicComponent4($setup.FileDeleteIcon), { class: "upup-h-5 upup-w-5" }))], 10, _hoisted_36)) : _createCommentVNode7("v-if", true)
|
|
2458
|
+
],
|
|
2459
|
+
2
|
|
2460
|
+
/* CLASS */
|
|
2461
|
+
);
|
|
2462
|
+
}
|
|
2463
|
+
var FileRow_default = /* @__PURE__ */ export_helper_default(_sfc_main10, [["render", _sfc_render10], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FileRow.vue"]]);
|
|
2464
|
+
|
|
2465
|
+
// src/components/FileItem.vue
|
|
2466
|
+
import { openBlock as _openBlock11, createBlock as _createBlock7, createCommentVNode as _createCommentVNode8, createVNode as _createVNode6, Fragment as _Fragment4, createElementBlock as _createElementBlock10, normalizeClass as _normalizeClass9, normalizeStyle as _normalizeStyle5 } from "vue";
|
|
2467
|
+
var _sfc_main11 = /* @__PURE__ */ _defineComponent11({
|
|
2468
|
+
__name: "FileItem",
|
|
2469
|
+
props: {
|
|
2470
|
+
file: {
|
|
2471
|
+
type: Object,
|
|
2472
|
+
required: true
|
|
2473
|
+
},
|
|
2474
|
+
index: {
|
|
2475
|
+
type: Number,
|
|
2476
|
+
required: false,
|
|
2477
|
+
default: 0
|
|
2478
|
+
},
|
|
2479
|
+
forcedList: {
|
|
2480
|
+
type: Boolean,
|
|
2481
|
+
required: false,
|
|
2482
|
+
default: false
|
|
2483
|
+
}
|
|
2484
|
+
},
|
|
2485
|
+
setup(__props, { expose: __expose }) {
|
|
2486
|
+
__expose();
|
|
2487
|
+
const props = __props;
|
|
2488
|
+
const { core } = useUploaderRuntime();
|
|
2489
|
+
const { files, leavingFileIds } = useUploaderFiles();
|
|
2490
|
+
const { viewMode } = useUploaderView();
|
|
2491
|
+
const { onFileClick } = useUploaderOptions();
|
|
2492
|
+
const { slotOverrides: slotClasses } = useUploaderTheme();
|
|
2493
|
+
const showPreviewPortal = ref5(false);
|
|
2494
|
+
const canPreview = ref5(false);
|
|
2495
|
+
const leaving = computed12(() => leavingFileIds.value.has(props.file.id));
|
|
2496
|
+
function openPreviewPortal() {
|
|
2497
|
+
showPreviewPortal.value = true;
|
|
2498
|
+
core == null ? void 0 : core.emit("file-preview-open", {
|
|
2499
|
+
fileId: props.file.id,
|
|
2500
|
+
fileName: props.file.name
|
|
2501
|
+
});
|
|
2502
|
+
}
|
|
2503
|
+
function closePreviewPortal() {
|
|
2504
|
+
showPreviewPortal.value = false;
|
|
2505
|
+
core == null ? void 0 : core.emit("file-preview-close", {
|
|
2506
|
+
fileId: props.file.id,
|
|
2507
|
+
fileName: props.file.name
|
|
2508
|
+
});
|
|
2509
|
+
}
|
|
2510
|
+
function onStopPropagation(e) {
|
|
2511
|
+
e.stopPropagation();
|
|
2512
|
+
}
|
|
2513
|
+
const __returned__ = {
|
|
2514
|
+
props,
|
|
2515
|
+
core,
|
|
2516
|
+
files,
|
|
2517
|
+
leavingFileIds,
|
|
2518
|
+
viewMode,
|
|
2519
|
+
onFileClick,
|
|
2520
|
+
slotClasses,
|
|
2521
|
+
showPreviewPortal,
|
|
2522
|
+
canPreview,
|
|
2523
|
+
leaving,
|
|
2524
|
+
openPreviewPortal,
|
|
2525
|
+
closePreviewPortal,
|
|
2526
|
+
onStopPropagation,
|
|
2527
|
+
get cn() {
|
|
2528
|
+
return cn9;
|
|
2529
|
+
},
|
|
2530
|
+
FilePreview: FilePreview_default,
|
|
2531
|
+
FilePreviewPortal: FilePreviewPortal_default,
|
|
2532
|
+
FileRow: FileRow_default
|
|
2533
|
+
};
|
|
2534
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
2535
|
+
enumerable: false,
|
|
2536
|
+
value: true
|
|
2537
|
+
});
|
|
2538
|
+
return __returned__;
|
|
2539
|
+
}
|
|
2540
|
+
});
|
|
2541
|
+
function _sfc_render11(_ctx, _cache, $props, $setup, $data, $options) {
|
|
2542
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
2543
|
+
return _openBlock11(), _createElementBlock10(
|
|
2544
|
+
"div",
|
|
2545
|
+
{
|
|
2546
|
+
"data-testid": "upup-file-item",
|
|
2547
|
+
"data-upup-slot": "file-item",
|
|
2548
|
+
role: "listitem",
|
|
2549
|
+
class: _normalizeClass9($setup.cn("upup-animate-fx-enter", "upup-relative upup-flex upup-flex-1 upup-flex-col upup-items-start upup-gap-1 upup-bg-transparent", $setup.leaving && "upup-animate-fx-exit upup-overflow-hidden", {
|
|
2550
|
+
[$setup.slotClasses.fileItemMultiple]: $setup.slotClasses.fileItemMultiple && $setup.files.size > 1,
|
|
2551
|
+
[$setup.slotClasses.fileItemSingle]: $setup.slotClasses.fileItemSingle && $setup.files.size === 1
|
|
2552
|
+
})),
|
|
2553
|
+
style: _normalizeStyle5($setup.leaving ? void 0 : { animationDelay: `${Math.min((_a = $props.index) != null ? _a : 0, 8) * 40}ms` })
|
|
2554
|
+
},
|
|
2555
|
+
[$setup.viewMode === "list" || $props.forcedList ? (_openBlock11(), _createBlock7($setup["FileRow"], {
|
|
2556
|
+
key: 0,
|
|
2557
|
+
file: $props.file,
|
|
2558
|
+
index: (_b = $props.index) != null ? _b : 0
|
|
2559
|
+
}, null, 8, ["file", "index"])) : (_openBlock11(), _createElementBlock10(
|
|
2560
|
+
_Fragment4,
|
|
2561
|
+
{ key: 1 },
|
|
2562
|
+
[_createVNode6($setup["FilePreview"], {
|
|
2563
|
+
"file-name": $props.file.name,
|
|
2564
|
+
"file-type": (_c = $props.file.type) != null ? _c : "",
|
|
2565
|
+
"file-id": $props.file.id,
|
|
2566
|
+
"file-url": (_d = $props.file.url) != null ? _d : "",
|
|
2567
|
+
"file-size": $props.file.size,
|
|
2568
|
+
index: (_e = $props.index) != null ? _e : 0,
|
|
2569
|
+
"can-preview": $setup.canPreview,
|
|
2570
|
+
"on-request-preview": $setup.openPreviewPortal,
|
|
2571
|
+
"onUpdate:canPreview": _cache[0] || (_cache[0] = ($event) => $setup.canPreview = $event),
|
|
2572
|
+
onClick: _cache[1] || (_cache[1] = ($event) => $setup.onFileClick($props.file))
|
|
2573
|
+
}, null, 8, [
|
|
2574
|
+
"file-name",
|
|
2575
|
+
"file-type",
|
|
2576
|
+
"file-id",
|
|
2577
|
+
"file-url",
|
|
2578
|
+
"file-size",
|
|
2579
|
+
"index",
|
|
2580
|
+
"can-preview"
|
|
2581
|
+
]), $setup.canPreview && $setup.showPreviewPortal ? (_openBlock11(), _createBlock7($setup["FilePreviewPortal"], {
|
|
2582
|
+
key: 0,
|
|
2583
|
+
"file-type": (_f = $props.file.type) != null ? _f : "",
|
|
2584
|
+
"file-url": (_g = $props.file.url) != null ? _g : "",
|
|
2585
|
+
"file-name": $props.file.name,
|
|
2586
|
+
"file-size": $props.file.size,
|
|
2587
|
+
onClose: $setup.closePreviewPortal,
|
|
2588
|
+
onStopPropagation: $setup.onStopPropagation
|
|
2589
|
+
}, null, 8, [
|
|
2590
|
+
"file-type",
|
|
2591
|
+
"file-url",
|
|
2592
|
+
"file-name",
|
|
2593
|
+
"file-size"
|
|
2594
|
+
])) : _createCommentVNode8("v-if", true)],
|
|
2595
|
+
64
|
|
2596
|
+
/* STABLE_FRAGMENT */
|
|
2597
|
+
))],
|
|
2598
|
+
6
|
|
2599
|
+
/* CLASS, STYLE */
|
|
2600
|
+
);
|
|
2601
|
+
}
|
|
2602
|
+
var FileItem_default = /* @__PURE__ */ export_helper_default(_sfc_main11, [["render", _sfc_render11], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FileItem.vue"]]);
|
|
2603
|
+
|
|
2604
|
+
// src/components/FileHero.vue
|
|
2605
|
+
import { defineComponent as _defineComponent12 } from "vue";
|
|
2606
|
+
import { computed as computed13 } from "vue";
|
|
2607
|
+
import { cn as cn10, isFileRemovalLocked as isFileRemovalLocked3 } from "@useupup/core/internal";
|
|
2608
|
+
import { UploadStatus as UploadStatus4 } from "@useupup/core";
|
|
2609
|
+
import { fileGetExtension as fileGetExtension3, fileGetIsImage as fileGetIsImage4 } from "@useupup/core/internal";
|
|
2610
|
+
import { openBlock as _openBlock12, createElementBlock as _createElementBlock11, createCommentVNode as _createCommentVNode9, createElementVNode as _createElementVNode9, Fragment as _Fragment5, createVNode as _createVNode7, createBlock as _createBlock8, resolveDynamicComponent as _resolveDynamicComponent5, normalizeClass as _normalizeClass10, toDisplayString as _toDisplayString8 } from "vue";
|
|
2611
|
+
var _sfc_main12 = /* @__PURE__ */ _defineComponent12({
|
|
2612
|
+
__name: "FileHero",
|
|
2613
|
+
props: { file: {
|
|
2614
|
+
type: Object,
|
|
2615
|
+
required: true
|
|
2616
|
+
} },
|
|
2617
|
+
setup(__props, { expose: __expose }) {
|
|
2618
|
+
__expose();
|
|
2619
|
+
const props = __props;
|
|
2620
|
+
const { handleFileRemove } = useUploaderFiles();
|
|
2621
|
+
const { translations: tr } = useUploaderI18n();
|
|
2622
|
+
const { icons: { FileDeleteIcon } } = useUploaderOptions();
|
|
2623
|
+
const { isDark: dark } = useUploaderTheme();
|
|
2624
|
+
const { upload: { filesProgressMap } } = useUploaderUploadControls();
|
|
2625
|
+
const isImage = computed13(() => {
|
|
2626
|
+
var _a;
|
|
2627
|
+
return fileGetIsImage4((_a = props.file.type) != null ? _a : "");
|
|
2628
|
+
});
|
|
2629
|
+
const isVideo = computed13(() => {
|
|
2630
|
+
var _a;
|
|
2631
|
+
return ((_a = props.file.type) != null ? _a : "").startsWith("video/");
|
|
2632
|
+
});
|
|
2633
|
+
const extension = computed13(() => {
|
|
2634
|
+
var _a;
|
|
2635
|
+
return fileGetExtension3((_a = props.file.type) != null ? _a : "", props.file.name);
|
|
2636
|
+
});
|
|
2637
|
+
const progress = computed13(() => {
|
|
2638
|
+
var _a, _b;
|
|
2639
|
+
const p = filesProgressMap.value[props.file.id];
|
|
2640
|
+
const loaded = (_a = p == null ? void 0 : p.loaded) != null ? _a : NaN;
|
|
2641
|
+
const total = (_b = p == null ? void 0 : p.total) != null ? _b : NaN;
|
|
2642
|
+
const pct = Math.floor(loaded / total * 100);
|
|
2643
|
+
return Number.isFinite(pct) ? pct : 0;
|
|
2644
|
+
});
|
|
2645
|
+
function formatFileSize(bytes, t5) {
|
|
2646
|
+
if (!bytes || bytes === 0) return t5.zeroBytes;
|
|
2647
|
+
const k = 1024;
|
|
2648
|
+
const sizes = [
|
|
2649
|
+
t5.bytes,
|
|
2650
|
+
t5.kb,
|
|
2651
|
+
t5.mb,
|
|
2652
|
+
t5.gb
|
|
2653
|
+
];
|
|
2654
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
2655
|
+
return Math.round(bytes / Math.pow(k, i) * 10) / 10 + " " + sizes[i];
|
|
2656
|
+
}
|
|
2657
|
+
function onRemove(e) {
|
|
2658
|
+
e.stopPropagation();
|
|
2659
|
+
handleFileRemove(props.file.id);
|
|
2660
|
+
}
|
|
2661
|
+
const __returned__ = {
|
|
2662
|
+
props,
|
|
2663
|
+
handleFileRemove,
|
|
2664
|
+
tr,
|
|
2665
|
+
FileDeleteIcon,
|
|
2666
|
+
dark,
|
|
2667
|
+
filesProgressMap,
|
|
2668
|
+
isImage,
|
|
2669
|
+
isVideo,
|
|
2670
|
+
extension,
|
|
2671
|
+
progress,
|
|
2672
|
+
formatFileSize,
|
|
2673
|
+
onRemove,
|
|
2674
|
+
get cn() {
|
|
2675
|
+
return cn10;
|
|
2676
|
+
},
|
|
2677
|
+
get isFileRemovalLocked() {
|
|
2678
|
+
return isFileRemovalLocked3;
|
|
2679
|
+
},
|
|
2680
|
+
get UploadStatus() {
|
|
2681
|
+
return UploadStatus4;
|
|
2682
|
+
},
|
|
2683
|
+
FileIcon: FileIcon_default,
|
|
2684
|
+
ProgressBar: ProgressBar_default,
|
|
2685
|
+
FileSuccessCheck: FileSuccessCheck_default
|
|
2686
|
+
};
|
|
2687
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
2688
|
+
enumerable: false,
|
|
2689
|
+
value: true
|
|
2690
|
+
});
|
|
2691
|
+
return __returned__;
|
|
2692
|
+
}
|
|
2693
|
+
});
|
|
2694
|
+
var _hoisted_110 = ["src", "alt"];
|
|
2695
|
+
var _hoisted_28 = ["src"];
|
|
2696
|
+
var _hoisted_37 = {
|
|
2697
|
+
key: 2,
|
|
2698
|
+
class: "upup-flex upup-min-h-0 upup-flex-1 upup-items-center upup-justify-center upup-bg-gradient-to-br upup-from-[#0ea5e9]/10 upup-to-[#7c3aed]/10"
|
|
2699
|
+
};
|
|
2700
|
+
var _hoisted_45 = ["disabled", "aria-label"];
|
|
2701
|
+
function _sfc_render12(_ctx, _cache, $props, $setup, $data, $options) {
|
|
2702
|
+
var _a, _b;
|
|
2703
|
+
return _openBlock12(), _createElementBlock11(
|
|
2704
|
+
"div",
|
|
2705
|
+
{
|
|
2706
|
+
"data-testid": "upup-file-hero",
|
|
2707
|
+
"data-upup-slot": "file-hero",
|
|
2708
|
+
role: "listitem",
|
|
2709
|
+
class: _normalizeClass10($setup.cn("upup-relative upup-flex upup-min-h-0 upup-flex-1 upup-flex-col upup-overflow-hidden upup-rounded-2xl upup-ring-1", $setup.dark ? "upup-bg-white/[0.03] upup-ring-white/[0.08]" : "upup-bg-black/[0.04] upup-ring-black/[0.06]"))
|
|
2710
|
+
},
|
|
2711
|
+
[
|
|
2712
|
+
$setup.isImage ? (_openBlock12(), _createElementBlock11("img", {
|
|
2713
|
+
key: 0,
|
|
2714
|
+
src: (_a = $props.file.url) != null ? _a : "",
|
|
2715
|
+
alt: $props.file.name,
|
|
2716
|
+
class: "upup-min-h-0 upup-flex-1 upup-object-contain"
|
|
2717
|
+
}, null, 8, _hoisted_110)) : $setup.isVideo ? (_openBlock12(), _createElementBlock11(
|
|
2718
|
+
_Fragment5,
|
|
2719
|
+
{ key: 1 },
|
|
2720
|
+
[_createCommentVNode9(' preload="metadata" paints the first frame \u2014 a real thumbnail without\r\n controls chrome. Muted + playsInline keep mobile browsers from\r\n hijacking it into a player. '), _createElementVNode9("video", {
|
|
2721
|
+
src: (_b = $props.file.url) != null ? _b : "",
|
|
2722
|
+
muted: "",
|
|
2723
|
+
playsinline: "",
|
|
2724
|
+
preload: "metadata",
|
|
2725
|
+
class: "upup-pointer-events-none upup-min-h-0 upup-flex-1 upup-object-contain"
|
|
2726
|
+
}, null, 8, _hoisted_28)],
|
|
2727
|
+
2112
|
|
2728
|
+
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
2729
|
+
)) : (_openBlock12(), _createElementBlock11("div", _hoisted_37, [_createVNode7($setup["FileIcon"], { extension: $setup.extension }, null, 8, ["extension"])])),
|
|
2730
|
+
$props.file.status === $setup.UploadStatus.SUCCESSFUL ? (_openBlock12(), _createBlock8($setup["FileSuccessCheck"], {
|
|
2731
|
+
key: 3,
|
|
2732
|
+
class: "upup-absolute upup-left-3 upup-top-3 upup-z-10"
|
|
2733
|
+
})) : _createCommentVNode9("v-if", true),
|
|
2734
|
+
_createCommentVNode9(" Delete is gone once the file has uploaded successfully \u2014 the\r\n completion check (top-left) is the only remaining overlay mark. "),
|
|
2735
|
+
$props.file.status !== $setup.UploadStatus.SUCCESSFUL ? (_openBlock12(), _createElementBlock11("button", {
|
|
2736
|
+
key: 4,
|
|
2737
|
+
class: _normalizeClass10($setup.cn("upup-fx-remove upup-fx-press upup-absolute upup-right-3 upup-top-3 upup-z-10", "upup-flex upup-h-[34px] upup-w-[34px] upup-items-center upup-justify-center", "upup-rounded-[9px] upup-bg-[#04080f]/40 upup-text-[#e2e8f0]", "hover:upup-bg-[#04080f]/65", "disabled:upup-cursor-not-allowed disabled:upup-opacity-50")),
|
|
2738
|
+
onClick: $setup.onRemove,
|
|
2739
|
+
type: "button",
|
|
2740
|
+
disabled: $setup.isFileRemovalLocked($setup.progress, $props.file.status),
|
|
2741
|
+
"aria-label": $setup.tr.removeFile,
|
|
2742
|
+
"data-testid": "upup-file-remove"
|
|
2743
|
+
}, [(_openBlock12(), _createBlock8(_resolveDynamicComponent5($setup.FileDeleteIcon), { class: "upup-h-5 upup-w-5" }))], 10, _hoisted_45)) : _createCommentVNode9("v-if", true),
|
|
2744
|
+
_createCommentVNode9(" Caption scrim: theme-aware (a black scrim over a light hero read as\r\n a dark-mode leak). The progress bar lives INSIDE the scrim flow so\r\n it can never overlap the name/size lines. "),
|
|
2745
|
+
_createElementVNode9(
|
|
2746
|
+
"div",
|
|
2747
|
+
{ class: _normalizeClass10($setup.cn("upup-pointer-events-none upup-absolute upup-inset-x-0 upup-bottom-0 upup-bg-gradient-to-t upup-to-transparent upup-px-[18px] upup-pb-3.5 upup-pt-4", $setup.dark ? "upup-from-[#04080f]/[0.86] upup-via-[#04080f]/50" : "upup-from-white/[0.92] upup-via-white/60")) },
|
|
2748
|
+
[
|
|
2749
|
+
_createElementVNode9(
|
|
2750
|
+
"div",
|
|
2751
|
+
{ class: _normalizeClass10($setup.cn("upup-truncate upup-text-[13px] upup-font-semibold", $setup.dark ? "upup-text-[#e2e8f0]" : "upup-text-[#1e293b]")) },
|
|
2752
|
+
_toDisplayString8($props.file.name),
|
|
2753
|
+
3
|
|
2754
|
+
/* TEXT, CLASS */
|
|
2755
|
+
),
|
|
2756
|
+
_createElementVNode9(
|
|
2757
|
+
"div",
|
|
2758
|
+
{ class: _normalizeClass10($setup.cn("upup-mt-0.5 upup-text-[12px]", $setup.dark ? "upup-text-[#94a3b8]" : "upup-text-[#64748b]")) },
|
|
2759
|
+
_toDisplayString8($setup.formatFileSize($props.file.size, $setup.tr)),
|
|
2760
|
+
3
|
|
2761
|
+
/* TEXT, CLASS */
|
|
2762
|
+
),
|
|
2763
|
+
_createVNode7($setup["ProgressBar"], {
|
|
2764
|
+
class: _normalizeClass10($setup.cn("upup-mt-2", $setup.dark ? "upup-text-white" : "upup-text-[#0f172a]")),
|
|
2765
|
+
"progress-bar-class-name": "upup-rounded",
|
|
2766
|
+
progress: $setup.progress,
|
|
2767
|
+
"show-value": true
|
|
2768
|
+
}, null, 8, ["class", "progress"])
|
|
2769
|
+
],
|
|
2770
|
+
2
|
|
2771
|
+
/* CLASS */
|
|
2772
|
+
)
|
|
2773
|
+
],
|
|
2774
|
+
2
|
|
2775
|
+
/* CLASS */
|
|
2776
|
+
);
|
|
2777
|
+
}
|
|
2778
|
+
var FileHero_default = /* @__PURE__ */ export_helper_default(_sfc_main12, [["render", _sfc_render12], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FileHero.vue"]]);
|
|
2779
|
+
|
|
2780
|
+
// src/components/shared/UploaderHeader.vue
|
|
2781
|
+
import { defineComponent as _defineComponent13 } from "vue";
|
|
2782
|
+
import { computed as computed14 } from "vue";
|
|
2783
|
+
import { formatUiMessage as t3, pluralUiMessage as plural2 } from "@useupup/core";
|
|
2784
|
+
import { isUploadActive as isUploadActive2, cn as cn11 } from "@useupup/core/internal";
|
|
2785
|
+
import { toDisplayString as _toDisplayString9, normalizeClass as _normalizeClass11, createElementVNode as _createElementVNode10, createCommentVNode as _createCommentVNode10, createVNode as _createVNode8, openBlock as _openBlock13, createElementBlock as _createElementBlock12, resolveDynamicComponent as _resolveDynamicComponent6, createBlock as _createBlock9, createTextVNode as _createTextVNode2 } from "vue";
|
|
2786
|
+
var _sfc_main13 = /* @__PURE__ */ _defineComponent13({
|
|
2787
|
+
__name: "UploaderHeader",
|
|
2788
|
+
props: {
|
|
2789
|
+
handleCancel: {
|
|
2790
|
+
type: Function,
|
|
2791
|
+
required: true
|
|
2792
|
+
},
|
|
2793
|
+
forcedList: {
|
|
2794
|
+
type: Boolean,
|
|
2795
|
+
required: false,
|
|
2796
|
+
default: false
|
|
2797
|
+
},
|
|
2798
|
+
hideAddMore: {
|
|
2799
|
+
type: Boolean,
|
|
2800
|
+
required: false,
|
|
2801
|
+
default: false
|
|
2802
|
+
}
|
|
2803
|
+
},
|
|
2804
|
+
setup(__props, { expose: __expose }) {
|
|
2805
|
+
__expose();
|
|
2806
|
+
const props = __props;
|
|
2807
|
+
const { files } = useUploaderFiles();
|
|
2808
|
+
const { viewMode, setViewMode, openSourceOverlay } = useUploaderView();
|
|
2809
|
+
const { translations: tr } = useUploaderI18n();
|
|
2810
|
+
const { mini, limit, isProcessing, icons: { ContainerAddMoreIcon } } = useUploaderOptions();
|
|
2811
|
+
const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme();
|
|
2812
|
+
const { upload: { uploadStatus } } = useUploaderUploadControls();
|
|
2813
|
+
const isUploading = computed14(() => isUploadActive2(uploadStatus.value));
|
|
2814
|
+
const isLimitReached = computed14(() => limit === files.value.size);
|
|
2815
|
+
const __returned__ = {
|
|
2816
|
+
props,
|
|
2817
|
+
files,
|
|
2818
|
+
viewMode,
|
|
2819
|
+
setViewMode,
|
|
2820
|
+
openSourceOverlay,
|
|
2821
|
+
tr,
|
|
2822
|
+
mini,
|
|
2823
|
+
limit,
|
|
2824
|
+
isProcessing,
|
|
2825
|
+
ContainerAddMoreIcon,
|
|
2826
|
+
dark,
|
|
2827
|
+
slotClasses,
|
|
2828
|
+
uploadStatus,
|
|
2829
|
+
isUploading,
|
|
2830
|
+
isLimitReached,
|
|
2831
|
+
get t() {
|
|
2832
|
+
return t3;
|
|
2833
|
+
},
|
|
2834
|
+
get plural() {
|
|
2835
|
+
return plural2;
|
|
2836
|
+
},
|
|
2837
|
+
get cn() {
|
|
2838
|
+
return cn11;
|
|
2839
|
+
},
|
|
2840
|
+
get Icon() {
|
|
2841
|
+
return Icon_default;
|
|
2842
|
+
}
|
|
2843
|
+
};
|
|
2844
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
2845
|
+
enumerable: false,
|
|
2846
|
+
value: true
|
|
2847
|
+
});
|
|
2848
|
+
return __returned__;
|
|
2849
|
+
}
|
|
2850
|
+
});
|
|
2851
|
+
var _hoisted_111 = ["disabled"];
|
|
2852
|
+
var _hoisted_29 = { class: "upup-col-start-3 upup-col-end-5 upup-flex upup-items-center upup-justify-end upup-gap-2 md:upup-col-start-4" };
|
|
2853
|
+
var _hoisted_38 = ["aria-label"];
|
|
2854
|
+
var _hoisted_46 = [
|
|
2855
|
+
"aria-label",
|
|
2856
|
+
"aria-pressed",
|
|
2857
|
+
"title"
|
|
2858
|
+
];
|
|
2859
|
+
var _hoisted_55 = {
|
|
2860
|
+
key: 0,
|
|
2861
|
+
class: "upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline"
|
|
2862
|
+
};
|
|
2863
|
+
var _hoisted_63 = [
|
|
2864
|
+
"aria-label",
|
|
2865
|
+
"aria-pressed",
|
|
2866
|
+
"title"
|
|
2867
|
+
];
|
|
2868
|
+
var _hoisted_73 = {
|
|
2869
|
+
key: 0,
|
|
2870
|
+
class: "upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline"
|
|
2871
|
+
};
|
|
2872
|
+
var _hoisted_83 = ["disabled"];
|
|
2873
|
+
function _sfc_render13(_ctx, _cache, $props, $setup, $data, $options) {
|
|
2874
|
+
return !$setup.mini ? (_openBlock13(), _createElementBlock12(
|
|
2875
|
+
"div",
|
|
2876
|
+
{
|
|
2877
|
+
key: 0,
|
|
2878
|
+
"data-testid": "upup-header",
|
|
2879
|
+
"data-upup-slot": "header",
|
|
2880
|
+
class: _normalizeClass11($setup.cn("upup-shadow-bottom upup-left-0 upup-right-0 upup-top-0 upup-z-10 upup-grid upup-grid-cols-4 upup-grid-rows-2 upup-items-center upup-justify-between upup-rounded-t-lg upup-bg-black/[0.025] upup-px-3 upup-py-2 md:upup-grid-rows-1", { "upup-bg-white/5 dark:upup-bg-white/5": $setup.dark }, $setup.slotClasses.containerHeader))
|
|
2881
|
+
},
|
|
2882
|
+
[
|
|
2883
|
+
_createElementVNode10("button", {
|
|
2884
|
+
class: _normalizeClass11($setup.cn("upup-max-md upup-col-start-1 upup-col-end-3 upup-row-start-2 upup-p-1 upup-text-left upup-text-sm upup-text-[#0284c7] md:upup-col-end-2 md:upup-row-start-1", { "upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": $setup.dark }, $setup.slotClasses.containerCancelButton)),
|
|
2885
|
+
onClick: _cache[0] || (_cache[0] = (...args) => $setup.props.handleCancel && $setup.props.handleCancel(...args)),
|
|
2886
|
+
disabled: $setup.isUploading || $setup.isProcessing
|
|
2887
|
+
}, _toDisplayString9($setup.tr.removeAllFiles), 11, _hoisted_111),
|
|
2888
|
+
_createElementVNode10(
|
|
2889
|
+
"span",
|
|
2890
|
+
{ class: _normalizeClass11($setup.cn("upup-col-span-4 upup-text-center upup-text-sm upup-text-[#6D6D6D] md:upup-col-span-2", { "upup-text-gray-300 dark:upup-text-gray-300": $setup.dark })) },
|
|
2891
|
+
_toDisplayString9($setup.t($setup.plural($setup.tr, "filesSelected", $setup.files.size), { count: $setup.files.size })),
|
|
2892
|
+
3
|
|
2893
|
+
/* TEXT, CLASS */
|
|
2894
|
+
),
|
|
2895
|
+
_createElementVNode10("div", _hoisted_29, [
|
|
2896
|
+
_createCommentVNode10(" Two-segment grid|list control. Hidden once the row list is\r\n forced (tiles don't fit one row of the fixed panel). The\r\n active segment carries the sky highlight; both segments\r\n always show their icon so the choice is self-evident. "),
|
|
2897
|
+
$setup.files.size > 1 && !$props.forcedList ? (_openBlock13(), _createElementBlock12("div", {
|
|
2898
|
+
key: 0,
|
|
2899
|
+
role: "group",
|
|
2900
|
+
"aria-label": $setup.tr.switchToGridView,
|
|
2901
|
+
"data-upup-slot": "view-toggle",
|
|
2902
|
+
class: _normalizeClass11($setup.cn("upup-flex upup-items-center upup-gap-0.5 upup-rounded-lg upup-p-0.5", $setup.dark ? "upup-bg-white/[0.06]" : "upup-bg-black/[0.05]"))
|
|
2903
|
+
}, [_createElementVNode10("button", {
|
|
2904
|
+
"data-testid": "upup-view-toggle-grid",
|
|
2905
|
+
"aria-label": $setup.tr.switchToGridView,
|
|
2906
|
+
"aria-pressed": $setup.viewMode === "grid",
|
|
2907
|
+
title: $setup.tr.switchToGridView,
|
|
2908
|
+
class: _normalizeClass11($setup.cn("upup-flex upup-h-6 upup-items-center upup-justify-center upup-gap-1 upup-rounded-md upup-px-1.5 upup-transition-colors", $setup.viewMode === "grid" ? "upup-bg-[#0ea5e9] upup-text-white" : $setup.dark ? "upup-text-gray-300 hover:upup-bg-white/10" : "upup-text-gray-500 hover:upup-bg-black/10")),
|
|
2909
|
+
onClick: _cache[1] || (_cache[1] = ($event) => $setup.setViewMode("grid"))
|
|
2910
|
+
}, [
|
|
2911
|
+
_createVNode8($setup["Icon"], {
|
|
2912
|
+
name: "layout-grid",
|
|
2913
|
+
size: 15
|
|
2914
|
+
}),
|
|
2915
|
+
_createCommentVNode10(" Label only on the ACTIVE segment, and only at md+\r\n where the header has room (mini shows no header at\r\n all). Inactive segment stays icon-only. "),
|
|
2916
|
+
$setup.viewMode === "grid" ? (_openBlock13(), _createElementBlock12(
|
|
2917
|
+
"span",
|
|
2918
|
+
_hoisted_55,
|
|
2919
|
+
_toDisplayString9($setup.tr.viewGrid),
|
|
2920
|
+
1
|
|
2921
|
+
/* TEXT */
|
|
2922
|
+
)) : _createCommentVNode10("v-if", true)
|
|
2923
|
+
], 10, _hoisted_46), _createElementVNode10("button", {
|
|
2924
|
+
"data-testid": "upup-view-toggle-list",
|
|
2925
|
+
"aria-label": $setup.tr.switchToListView,
|
|
2926
|
+
"aria-pressed": $setup.viewMode === "list",
|
|
2927
|
+
title: $setup.tr.switchToListView,
|
|
2928
|
+
class: _normalizeClass11($setup.cn("upup-flex upup-h-6 upup-items-center upup-justify-center upup-gap-1 upup-rounded-md upup-px-1.5 upup-transition-colors", $setup.viewMode === "list" ? "upup-bg-[#0ea5e9] upup-text-white" : $setup.dark ? "upup-text-gray-300 hover:upup-bg-white/10" : "upup-text-gray-500 hover:upup-bg-black/10")),
|
|
2929
|
+
onClick: _cache[2] || (_cache[2] = ($event) => $setup.setViewMode("list"))
|
|
2930
|
+
}, [_createVNode8($setup["Icon"], {
|
|
2931
|
+
name: "layout-list",
|
|
2932
|
+
size: 15
|
|
2933
|
+
}), $setup.viewMode === "list" ? (_openBlock13(), _createElementBlock12(
|
|
2934
|
+
"span",
|
|
2935
|
+
_hoisted_73,
|
|
2936
|
+
_toDisplayString9($setup.tr.viewList),
|
|
2937
|
+
1
|
|
2938
|
+
/* TEXT */
|
|
2939
|
+
)) : _createCommentVNode10("v-if", true)], 10, _hoisted_63)], 10, _hoisted_38)) : _createCommentVNode10("v-if", true),
|
|
2940
|
+
$setup.limit > 1 && !$setup.isLimitReached && !$props.hideAddMore ? (_openBlock13(), _createElementBlock12("button", {
|
|
2941
|
+
key: 1,
|
|
2942
|
+
"data-testid": "upup-add-more",
|
|
2943
|
+
"data-placement": "header",
|
|
2944
|
+
"data-upup-slot": "add-more",
|
|
2945
|
+
class: _normalizeClass11($setup.cn("upup-fx-hover-lift upup-fx-press upup-inline-flex upup-shrink-0 upup-items-center upup-gap-1 upup-whitespace-nowrap upup-rounded-md upup-border upup-border-dashed upup-border-[#38bdf8]/50 upup-px-2 upup-py-1 upup-text-sm upup-leading-none upup-text-[#0284c7]", { "upup-text-[#38bdf8] dark:upup-text-[#38bdf8]": $setup.dark }, $setup.slotClasses.containerAddMoreButton)),
|
|
2946
|
+
onClick: _cache[3] || (_cache[3] = (...args) => $setup.openSourceOverlay && $setup.openSourceOverlay(...args)),
|
|
2947
|
+
disabled: $setup.isUploading || $setup.isProcessing
|
|
2948
|
+
}, [(_openBlock13(), _createBlock9(_resolveDynamicComponent6($setup.ContainerAddMoreIcon))), _createTextVNode2(
|
|
2949
|
+
" " + _toDisplayString9($setup.tr.addMore),
|
|
2950
|
+
1
|
|
2951
|
+
/* TEXT */
|
|
2952
|
+
)], 10, _hoisted_83)) : _createCommentVNode10("v-if", true)
|
|
2953
|
+
])
|
|
2954
|
+
],
|
|
2955
|
+
2
|
|
2956
|
+
/* CLASS */
|
|
2957
|
+
)) : _createCommentVNode10("v-if", true);
|
|
2958
|
+
}
|
|
2959
|
+
var UploaderHeader_default = /* @__PURE__ */ export_helper_default(_sfc_main13, [["render", _sfc_render13], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\shared\\UploaderHeader.vue"]]);
|
|
2960
|
+
|
|
2961
|
+
// src/lib/view-mode.ts
|
|
2962
|
+
var FILE_TILE_MIN = 160;
|
|
2963
|
+
var FILE_TILE_GAP = 16;
|
|
2964
|
+
function computeTilesPerRow(containerWidth) {
|
|
2965
|
+
if (!Number.isFinite(containerWidth) || containerWidth <= 0) return 0;
|
|
2966
|
+
return Math.max(
|
|
2967
|
+
1,
|
|
2968
|
+
Math.floor(
|
|
2969
|
+
(containerWidth + FILE_TILE_GAP) / (FILE_TILE_MIN + FILE_TILE_GAP)
|
|
2970
|
+
)
|
|
2971
|
+
);
|
|
2972
|
+
}
|
|
2973
|
+
function isListViewForced(fileCount, tilesPerRow) {
|
|
2974
|
+
if (tilesPerRow <= 0) return false;
|
|
2975
|
+
return fileCount > tilesPerRow;
|
|
2976
|
+
}
|
|
2977
|
+
|
|
2978
|
+
// src/composables/use-tiles-per-row.ts
|
|
2979
|
+
import { onMounted as onMounted5, onUnmounted as onUnmounted6, ref as ref6, watch as watch3 } from "vue";
|
|
2980
|
+
function useTilesPerRow(elRef) {
|
|
2981
|
+
const tilesPerRow = ref6(0);
|
|
2982
|
+
let ro = null;
|
|
2983
|
+
function observe(el) {
|
|
2984
|
+
ro == null ? void 0 : ro.disconnect();
|
|
2985
|
+
ro = null;
|
|
2986
|
+
if (!el || typeof ResizeObserver === "undefined") return;
|
|
2987
|
+
ro = new ResizeObserver((entries) => {
|
|
2988
|
+
var _a, _b;
|
|
2989
|
+
const next = (_b = (_a = entries[0]) == null ? void 0 : _a.contentRect.width) != null ? _b : 0;
|
|
2990
|
+
tilesPerRow.value = computeTilesPerRow(next);
|
|
2991
|
+
});
|
|
2992
|
+
ro.observe(el);
|
|
2993
|
+
}
|
|
2994
|
+
onMounted5(() => {
|
|
2995
|
+
observe(elRef.value);
|
|
2996
|
+
});
|
|
2997
|
+
watch3(elRef, (el) => {
|
|
2998
|
+
observe(el);
|
|
2999
|
+
});
|
|
3000
|
+
onUnmounted6(() => {
|
|
3001
|
+
ro == null ? void 0 : ro.disconnect();
|
|
3002
|
+
ro = null;
|
|
3003
|
+
});
|
|
3004
|
+
return tilesPerRow;
|
|
3005
|
+
}
|
|
3006
|
+
|
|
3007
|
+
// src/components/FileList.vue
|
|
3008
|
+
import { toDisplayString as _toDisplayString10, createElementVNode as _createElementVNode11, createVNode as _createVNode9, createCommentVNode as _createCommentVNode11, normalizeClass as _normalizeClass12, openBlock as _openBlock14, createElementBlock as _createElementBlock13, renderList as _renderList2, Fragment as _Fragment6, normalizeStyle as _normalizeStyle6, createBlock as _createBlock10, resolveDynamicComponent as _resolveDynamicComponent7, createTextVNode as _createTextVNode3 } from "vue";
|
|
3009
|
+
var VIRTUAL_SCROLL_THRESHOLD = 20;
|
|
3010
|
+
var ESTIMATED_ITEM_HEIGHT = 76;
|
|
3011
|
+
var _sfc_main14 = /* @__PURE__ */ _defineComponent14({
|
|
3012
|
+
__name: "FileList",
|
|
3013
|
+
setup(__props, { expose: __expose }) {
|
|
3014
|
+
__expose();
|
|
3015
|
+
function formatBytes(bytes) {
|
|
3016
|
+
if (bytes === 0) return "0 B";
|
|
3017
|
+
const k = 1024;
|
|
3018
|
+
const sizes = [
|
|
3019
|
+
"B",
|
|
3020
|
+
"KB",
|
|
3021
|
+
"MB",
|
|
3022
|
+
"GB"
|
|
3023
|
+
];
|
|
3024
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
3025
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + " " + sizes[i];
|
|
3026
|
+
}
|
|
3027
|
+
function formatEta(seconds) {
|
|
3028
|
+
if (seconds <= 0 || !isFinite(seconds)) return "";
|
|
3029
|
+
const m = Math.floor(seconds / 60);
|
|
3030
|
+
const s = seconds % 60;
|
|
3031
|
+
if (m > 0) return `${m}m ${s}s left`;
|
|
3032
|
+
return `${s}s left`;
|
|
3033
|
+
}
|
|
3034
|
+
const { viewMode, sourceOverlayOpen, openSourceOverlay } = useUploaderView();
|
|
3035
|
+
const { activeSource } = useUploaderSource();
|
|
3036
|
+
const { files, leavingFileIds } = useUploaderFiles();
|
|
3037
|
+
const { translations: tr } = useUploaderI18n();
|
|
3038
|
+
const { upload: { startUpload, retryUpload, uploadStatus, uploadError, uploadErrorCode, totalProgress, uploadSpeed, uploadEta, uploadedBytes, totalBytes }, handleDone, handleCancel, handlePause, handleResume } = useUploaderUploadControls();
|
|
3039
|
+
const { isProcessing, resumable, limit, quietCompletion, icons: { ContainerAddMoreIcon } } = useUploaderOptions();
|
|
3040
|
+
const { isDark: dark, slotOverrides: slotClasses, slots: themeSlots } = useUploaderTheme();
|
|
3041
|
+
const scrollRef = ref7(null);
|
|
3042
|
+
const orderedFiles = computed15(() => Array.from(files.value.values()));
|
|
3043
|
+
const isSingle = computed15(() => orderedFiles.value.length === 1);
|
|
3044
|
+
const tilesPerRow = useTilesPerRow(scrollRef);
|
|
3045
|
+
const forcedList = computed15(() => isListViewForced(orderedFiles.value.length, tilesPerRow.value));
|
|
3046
|
+
const effectiveViewMode = computed15(() => forcedList.value ? "list" : viewMode.value);
|
|
3047
|
+
const shouldVirtualize = computed15(() => orderedFiles.value.length >= VIRTUAL_SCROLL_THRESHOLD && effectiveViewMode.value !== "grid");
|
|
3048
|
+
const virtualizer = useVirtualizer(computed15(() => ({
|
|
3049
|
+
count: orderedFiles.value.length,
|
|
3050
|
+
getScrollElement: () => scrollRef.value,
|
|
3051
|
+
estimateSize: () => ESTIMATED_ITEM_HEIGHT,
|
|
3052
|
+
overscan: 5,
|
|
3053
|
+
enabled: shouldVirtualize.value
|
|
3054
|
+
})));
|
|
3055
|
+
const virtualItems = computed15(() => virtualizer.value.getVirtualItems());
|
|
3056
|
+
const virtualRows = computed15(() => virtualItems.value.flatMap((virtualItem) => {
|
|
3057
|
+
const file = orderedFiles.value[virtualItem.index];
|
|
3058
|
+
return file ? [{
|
|
3059
|
+
virtualItem,
|
|
3060
|
+
file
|
|
3061
|
+
}] : [];
|
|
3062
|
+
}));
|
|
3063
|
+
const totalSize = computed15(() => virtualizer.value.getTotalSize());
|
|
3064
|
+
const isUploading = computed15(() => isUploadActive3(uploadStatus.value));
|
|
3065
|
+
const dimmed = computed15(() => sourceOverlayOpen.value || !!activeSource.value);
|
|
3066
|
+
const heroLeaving = computed15(() => isSingle.value && !!orderedFiles.value[0] && leavingFileIds.value.has(orderedFiles.value[0].id));
|
|
3067
|
+
const quietDone = computed15(() => !!quietCompletion && uploadStatus.value === UploadStatus5.SUCCESSFUL);
|
|
3068
|
+
const canAddMore = computed15(() => limit > 1 && files.value.size < limit && !isUploading.value && !isProcessing && !quietDone.value);
|
|
3069
|
+
const isGrid = computed15(() => files.value.size > 1 && effectiveViewMode.value === "grid");
|
|
3070
|
+
const gridStyle = computed15(() => isGrid.value ? { gridTemplateColumns: "repeat(auto-fit, minmax(160px, 1fr))" } : void 0);
|
|
3071
|
+
function onUploadClick() {
|
|
3072
|
+
void startUpload().catch(() => void 0);
|
|
3073
|
+
}
|
|
3074
|
+
function onRetryClick() {
|
|
3075
|
+
void retryUpload().catch(() => void 0);
|
|
3076
|
+
}
|
|
3077
|
+
const __returned__ = {
|
|
3078
|
+
VIRTUAL_SCROLL_THRESHOLD,
|
|
3079
|
+
ESTIMATED_ITEM_HEIGHT,
|
|
3080
|
+
formatBytes,
|
|
3081
|
+
formatEta,
|
|
3082
|
+
viewMode,
|
|
3083
|
+
sourceOverlayOpen,
|
|
3084
|
+
openSourceOverlay,
|
|
3085
|
+
activeSource,
|
|
3086
|
+
files,
|
|
3087
|
+
leavingFileIds,
|
|
3088
|
+
tr,
|
|
3089
|
+
startUpload,
|
|
3090
|
+
retryUpload,
|
|
3091
|
+
uploadStatus,
|
|
3092
|
+
uploadError,
|
|
3093
|
+
uploadErrorCode,
|
|
3094
|
+
totalProgress,
|
|
3095
|
+
uploadSpeed,
|
|
3096
|
+
uploadEta,
|
|
3097
|
+
uploadedBytes,
|
|
3098
|
+
totalBytes,
|
|
3099
|
+
handleDone,
|
|
3100
|
+
handleCancel,
|
|
3101
|
+
handlePause,
|
|
3102
|
+
handleResume,
|
|
3103
|
+
isProcessing,
|
|
3104
|
+
resumable,
|
|
3105
|
+
limit,
|
|
3106
|
+
quietCompletion,
|
|
3107
|
+
ContainerAddMoreIcon,
|
|
3108
|
+
dark,
|
|
3109
|
+
slotClasses,
|
|
3110
|
+
themeSlots,
|
|
3111
|
+
scrollRef,
|
|
3112
|
+
orderedFiles,
|
|
3113
|
+
isSingle,
|
|
3114
|
+
tilesPerRow,
|
|
3115
|
+
forcedList,
|
|
3116
|
+
effectiveViewMode,
|
|
3117
|
+
shouldVirtualize,
|
|
3118
|
+
virtualizer,
|
|
3119
|
+
virtualItems,
|
|
3120
|
+
virtualRows,
|
|
3121
|
+
totalSize,
|
|
3122
|
+
isUploading,
|
|
3123
|
+
dimmed,
|
|
3124
|
+
heroLeaving,
|
|
3125
|
+
quietDone,
|
|
3126
|
+
canAddMore,
|
|
3127
|
+
isGrid,
|
|
3128
|
+
gridStyle,
|
|
3129
|
+
onUploadClick,
|
|
3130
|
+
onRetryClick,
|
|
3131
|
+
get t() {
|
|
3132
|
+
return t4;
|
|
3133
|
+
},
|
|
3134
|
+
get plural() {
|
|
3135
|
+
return plural3;
|
|
3136
|
+
},
|
|
3137
|
+
get UploadStatus() {
|
|
3138
|
+
return UploadStatus5;
|
|
3139
|
+
},
|
|
3140
|
+
get isUploadActive() {
|
|
3141
|
+
return isUploadActive3;
|
|
3142
|
+
},
|
|
3143
|
+
get cn() {
|
|
3144
|
+
return cn12;
|
|
3145
|
+
},
|
|
3146
|
+
get Icon() {
|
|
3147
|
+
return Icon_default;
|
|
3148
|
+
},
|
|
3149
|
+
FileItem: FileItem_default,
|
|
3150
|
+
FileHero: FileHero_default,
|
|
3151
|
+
UploaderHeader: UploaderHeader_default,
|
|
3152
|
+
ProgressBar: ProgressBar_default,
|
|
3153
|
+
FileSuccessCheck: FileSuccessCheck_default
|
|
3154
|
+
};
|
|
3155
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
3156
|
+
enumerable: false,
|
|
3157
|
+
value: true
|
|
3158
|
+
});
|
|
3159
|
+
return __returned__;
|
|
3160
|
+
}
|
|
3161
|
+
});
|
|
3162
|
+
var _hoisted_112 = ["inert"];
|
|
3163
|
+
var _hoisted_210 = {
|
|
3164
|
+
role: "status",
|
|
3165
|
+
"aria-live": "polite",
|
|
3166
|
+
class: "upup-sr-only"
|
|
3167
|
+
};
|
|
3168
|
+
var _hoisted_39 = ["data-index"];
|
|
3169
|
+
var _hoisted_47 = ["disabled"];
|
|
3170
|
+
var _hoisted_56 = ["disabled"];
|
|
3171
|
+
var _hoisted_64 = ["title"];
|
|
3172
|
+
var _hoisted_74 = { class: "upup-flex upup-flex-1 upup-flex-col upup-gap-1" };
|
|
3173
|
+
var _hoisted_84 = { class: "upup-flex upup-items-center upup-gap-2" };
|
|
3174
|
+
var _hoisted_93 = ["aria-label", "title"];
|
|
3175
|
+
var _hoisted_103 = ["aria-label", "title"];
|
|
3176
|
+
var _hoisted_113 = { key: 0 };
|
|
3177
|
+
var _hoisted_123 = { key: 1 };
|
|
3178
|
+
function _sfc_render14(_ctx, _cache, $props, $setup, $data, $options) {
|
|
3179
|
+
var _a, _b, _c, _d, _e;
|
|
3180
|
+
return _openBlock14(), _createElementBlock13("div", {
|
|
3181
|
+
"data-testid": "upup-file-list",
|
|
3182
|
+
"data-upup-slot": "file-list",
|
|
3183
|
+
inert: $setup.dimmed || void 0,
|
|
3184
|
+
class: _normalizeClass12($setup.cn("upup-relative upup-flex upup-h-full upup-flex-col upup-rounded-lg upup-shadow", {
|
|
3185
|
+
"upup-hidden": !$setup.files.size,
|
|
3186
|
+
"upup-opacity-50 upup-blur-[2px] upup-pointer-events-none": $setup.dimmed
|
|
3187
|
+
}, (_b = (_a = $setup.themeSlots) == null ? void 0 : _a.fileList) == null ? void 0 : _b.root))
|
|
3188
|
+
}, [
|
|
3189
|
+
_createElementVNode11(
|
|
3190
|
+
"div",
|
|
3191
|
+
_hoisted_210,
|
|
3192
|
+
_toDisplayString10($setup.t($setup.plural($setup.tr, "filesSelected", $setup.files.size), { count: $setup.files.size })),
|
|
3193
|
+
1
|
|
3194
|
+
/* TEXT */
|
|
3195
|
+
),
|
|
3196
|
+
_createVNode9($setup["UploaderHeader"], {
|
|
3197
|
+
"handle-cancel": $setup.handleCancel,
|
|
3198
|
+
"forced-list": $setup.forcedList,
|
|
3199
|
+
"hide-add-more": $setup.quietDone
|
|
3200
|
+
}, null, 8, [
|
|
3201
|
+
"handle-cancel",
|
|
3202
|
+
"forced-list",
|
|
3203
|
+
"hide-add-more"
|
|
3204
|
+
]),
|
|
3205
|
+
_createCommentVNode11(" Quiet-completion overlay (item 7): checkmark only, no CTAs. The fx\r\n classes on FileSuccessCheck die under data-motion='off' (it then\r\n simply appears drawn), so this satisfies the static-state rule. "),
|
|
3206
|
+
$setup.quietDone ? (_openBlock14(), _createElementBlock13(
|
|
3207
|
+
"div",
|
|
3208
|
+
{
|
|
3209
|
+
key: 0,
|
|
3210
|
+
"data-testid": "upup-complete-check",
|
|
3211
|
+
"data-upup-slot": "complete-check",
|
|
3212
|
+
role: "status",
|
|
3213
|
+
class: _normalizeClass12($setup.cn("upup-absolute upup-inset-0 upup-z-20 upup-flex upup-flex-col upup-items-center upup-justify-center upup-gap-2 upup-rounded-lg upup-backdrop-blur-[1px]", $setup.dark ? "upup-bg-[#04080f]/40" : "upup-bg-white/50"))
|
|
3214
|
+
},
|
|
3215
|
+
[_createVNode9($setup["FileSuccessCheck"], { size: 56 }), _createElementVNode11(
|
|
3216
|
+
"span",
|
|
3217
|
+
{ class: _normalizeClass12($setup.cn("upup-text-sm upup-font-medium", $setup.dark ? "upup-text-[#e2e8f0]" : "upup-text-[#1e293b]")) },
|
|
3218
|
+
_toDisplayString10($setup.tr.announceUploadComplete),
|
|
3219
|
+
3
|
|
3220
|
+
/* TEXT, CLASS */
|
|
3221
|
+
)],
|
|
3222
|
+
2
|
|
3223
|
+
/* CLASS */
|
|
3224
|
+
)) : _createCommentVNode11("v-if", true),
|
|
3225
|
+
_createElementVNode11(
|
|
3226
|
+
"div",
|
|
3227
|
+
{
|
|
3228
|
+
ref: "scrollRef",
|
|
3229
|
+
class: _normalizeClass12($setup.cn("upup-preview-scroll upup-flex upup-flex-1 upup-flex-col upup-overflow-y-auto upup-p-3", $setup.dark ? "upup-bg-transparent" : "upup-bg-black/[0.075]", $setup.slotClasses.fileListContainer))
|
|
3230
|
+
},
|
|
3231
|
+
[
|
|
3232
|
+
_createCommentVNode11(" Single-file HERO "),
|
|
3233
|
+
$setup.isSingle ? (_openBlock14(), _createElementBlock13(
|
|
3234
|
+
"div",
|
|
3235
|
+
{
|
|
3236
|
+
key: 0,
|
|
3237
|
+
role: "list",
|
|
3238
|
+
class: _normalizeClass12($setup.cn("upup-animate-fx-enter upup-flex upup-min-h-0 upup-flex-1 upup-flex-col", $setup.heroLeaving && "upup-animate-fx-exit upup-overflow-hidden"))
|
|
3239
|
+
},
|
|
3240
|
+
[_createVNode9($setup["FileHero"], { file: $setup.orderedFiles[0] }, null, 8, ["file"])],
|
|
3241
|
+
2
|
|
3242
|
+
/* CLASS */
|
|
3243
|
+
)) : $setup.shouldVirtualize ? (_openBlock14(), _createElementBlock13(
|
|
3244
|
+
_Fragment6,
|
|
3245
|
+
{ key: 1 },
|
|
3246
|
+
[_createCommentVNode11(" Virtualized list "), _createElementVNode11(
|
|
3247
|
+
"div",
|
|
3248
|
+
{
|
|
3249
|
+
role: "list",
|
|
3250
|
+
"data-upup-slot": "file-list-virtual",
|
|
3251
|
+
style: _normalizeStyle6({
|
|
3252
|
+
height: $setup.totalSize + "px",
|
|
3253
|
+
position: "relative"
|
|
3254
|
+
}),
|
|
3255
|
+
class: _normalizeClass12($setup.cn($setup.isProcessing && "upup-pointer-events-none upup-opacity-75", "upup-font-[Arial,Helvetica,sans-serif]"))
|
|
3256
|
+
},
|
|
3257
|
+
[(_openBlock14(true), _createElementBlock13(
|
|
3258
|
+
_Fragment6,
|
|
3259
|
+
null,
|
|
3260
|
+
_renderList2($setup.virtualRows, ({ virtualItem, file }) => {
|
|
3261
|
+
return _openBlock14(), _createElementBlock13("div", {
|
|
3262
|
+
key: String(virtualItem.key),
|
|
3263
|
+
"data-index": virtualItem.index,
|
|
3264
|
+
style: _normalizeStyle6({
|
|
3265
|
+
position: "absolute",
|
|
3266
|
+
top: 0,
|
|
3267
|
+
left: 0,
|
|
3268
|
+
width: "100%",
|
|
3269
|
+
transform: `translateY(${virtualItem.start}px)`,
|
|
3270
|
+
paddingBottom: "12px"
|
|
3271
|
+
})
|
|
3272
|
+
}, [_createVNode9($setup["FileItem"], {
|
|
3273
|
+
file,
|
|
3274
|
+
index: virtualItem.index,
|
|
3275
|
+
"forced-list": $setup.forcedList
|
|
3276
|
+
}, null, 8, [
|
|
3277
|
+
"file",
|
|
3278
|
+
"index",
|
|
3279
|
+
"forced-list"
|
|
3280
|
+
])], 12, _hoisted_39);
|
|
3281
|
+
}),
|
|
3282
|
+
128
|
|
3283
|
+
/* KEYED_FRAGMENT */
|
|
3284
|
+
))],
|
|
3285
|
+
6
|
|
3286
|
+
/* CLASS, STYLE */
|
|
3287
|
+
)],
|
|
3288
|
+
2112
|
|
3289
|
+
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
3290
|
+
)) : (_openBlock14(), _createElementBlock13(
|
|
3291
|
+
_Fragment6,
|
|
3292
|
+
{ key: 2 },
|
|
3293
|
+
[_createCommentVNode11(" Standard rendering for small lists and grid mode. Grid is a\r\n single row of auto-fit tiles that STRETCH to fill the row\r\n (minmax(160px,1fr) \u2014 no dead columns at 2/3 files). It is only\r\n reached when the tiles fit one row (else forcedList swaps to the\r\n list), so the grid can never wrap the fixed panel. "), _createElementVNode11(
|
|
3294
|
+
"div",
|
|
3295
|
+
{
|
|
3296
|
+
role: "list",
|
|
3297
|
+
style: _normalizeStyle6($setup.gridStyle),
|
|
3298
|
+
class: _normalizeClass12($setup.cn($setup.isProcessing && "upup-pointer-events-none upup-opacity-75", "upup-font-[Arial,Helvetica,sans-serif]", $setup.isGrid ? "upup-grid upup-gap-4" : "upup-flex upup-flex-col upup-gap-3", {
|
|
3299
|
+
[(_c = $setup.slotClasses.fileListContainerInnerMultiple) != null ? _c : ""]: $setup.slotClasses.fileListContainerInnerMultiple && $setup.files.size > 1,
|
|
3300
|
+
[(_d = $setup.slotClasses.fileListContainerInnerSingle) != null ? _d : ""]: $setup.slotClasses.fileListContainerInnerSingle && $setup.files.size === 1
|
|
3301
|
+
}))
|
|
3302
|
+
},
|
|
3303
|
+
[(_openBlock14(true), _createElementBlock13(
|
|
3304
|
+
_Fragment6,
|
|
3305
|
+
null,
|
|
3306
|
+
_renderList2($setup.orderedFiles, (file, index) => {
|
|
3307
|
+
return _openBlock14(), _createBlock10($setup["FileItem"], {
|
|
3308
|
+
key: file.id,
|
|
3309
|
+
file,
|
|
3310
|
+
index,
|
|
3311
|
+
"forced-list": $setup.forcedList
|
|
3312
|
+
}, null, 8, [
|
|
3313
|
+
"file",
|
|
3314
|
+
"index",
|
|
3315
|
+
"forced-list"
|
|
3316
|
+
]);
|
|
3317
|
+
}),
|
|
3318
|
+
128
|
|
3319
|
+
/* KEYED_FRAGMENT */
|
|
3320
|
+
))],
|
|
3321
|
+
6
|
|
3322
|
+
/* CLASS, STYLE */
|
|
3323
|
+
)],
|
|
3324
|
+
2112
|
|
3325
|
+
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
3326
|
+
)),
|
|
3327
|
+
_createCommentVNode11(' Full-width dashed "Add more" row (spec \xA74 state 3): a second\r\n add-more affordance beneath the list/hero, opening the overlay. '),
|
|
3328
|
+
$setup.canAddMore ? (_openBlock14(), _createElementBlock13("button", {
|
|
3329
|
+
key: 3,
|
|
3330
|
+
"data-testid": "upup-add-more",
|
|
3331
|
+
"data-placement": "footer",
|
|
3332
|
+
"data-upup-slot": "add-more",
|
|
3333
|
+
class: _normalizeClass12($setup.cn("upup-fx-hover-lift upup-fx-press upup-mt-2.5 upup-flex upup-flex-none upup-items-center upup-justify-center upup-gap-2 upup-whitespace-nowrap upup-rounded-xl upup-border-[1.5px] upup-border-dashed upup-px-3 upup-py-2 upup-text-[13px] upup-font-medium", $setup.dark ? "upup-border-white/[0.16] upup-text-[#94a3b8]" : "upup-border-black/[0.16] upup-text-gray-500", $setup.slotClasses.containerAddMoreButton)),
|
|
3334
|
+
onClick: _cache[0] || (_cache[0] = (...args) => $setup.openSourceOverlay && $setup.openSourceOverlay(...args)),
|
|
3335
|
+
disabled: $setup.isUploading || $setup.isProcessing
|
|
3336
|
+
}, [(_openBlock14(), _createBlock10(_resolveDynamicComponent7($setup.ContainerAddMoreIcon))), _createTextVNode3(
|
|
3337
|
+
" " + _toDisplayString10($setup.tr.addMore),
|
|
3338
|
+
1
|
|
3339
|
+
/* TEXT */
|
|
3340
|
+
)], 10, _hoisted_47)) : _createCommentVNode11("v-if", true)
|
|
3341
|
+
],
|
|
3342
|
+
2
|
|
3343
|
+
/* CLASS */
|
|
3344
|
+
),
|
|
3345
|
+
_createElementVNode11(
|
|
3346
|
+
"div",
|
|
3347
|
+
{ class: _normalizeClass12($setup.cn("upup-shadow-top upup-flex upup-items-center upup-gap-3 upup-rounded-b-lg upup-bg-black/[0.025] upup-px-3 upup-py-2", { "upup-bg-white/5 dark:upup-bg-white/5": $setup.dark }, $setup.slotClasses.fileListFooter)) },
|
|
3348
|
+
[
|
|
3349
|
+
_createCommentVNode11(" Primary CTA only in a pre-run/idle state. Once a run is active it\r\n becomes Cancel; when PAUSED it becomes Resume; SUCCESSFUL shows\r\n Done and FAILED shows Retry (below). "),
|
|
3350
|
+
$setup.uploadStatus !== $setup.UploadStatus.SUCCESSFUL && $setup.uploadStatus !== $setup.UploadStatus.FAILED && $setup.uploadStatus !== $setup.UploadStatus.PAUSED && !$setup.isUploading ? (_openBlock14(), _createElementBlock13("button", {
|
|
3351
|
+
key: 0,
|
|
3352
|
+
"data-testid": "upup-upload-btn",
|
|
3353
|
+
class: _normalizeClass12($setup.cn("upup-fx-sheen-sweep upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-full upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white", { "upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]": $setup.dark }, $setup.slotClasses.uploadButton)),
|
|
3354
|
+
onClick: $setup.onUploadClick,
|
|
3355
|
+
disabled: $setup.isUploadActive($setup.uploadStatus) || $setup.isProcessing
|
|
3356
|
+
}, _toDisplayString10($setup.t($setup.plural($setup.tr, "uploadFiles", $setup.files.size), { count: $setup.files.size })), 11, _hoisted_56)) : _createCommentVNode11("v-if", true),
|
|
3357
|
+
$setup.uploadStatus === $setup.UploadStatus.FAILED && $setup.uploadError ? (_openBlock14(), _createElementBlock13("p", {
|
|
3358
|
+
key: 1,
|
|
3359
|
+
"data-testid": "upup-upload-error",
|
|
3360
|
+
"data-upup-slot": "upload-error",
|
|
3361
|
+
title: $setup.uploadErrorCode,
|
|
3362
|
+
class: "upup-mr-auto upup-text-sm upup-text-red-600 dark:upup-text-red-400"
|
|
3363
|
+
}, _toDisplayString10($setup.uploadErrorCode ? $setup.t($setup.tr.uploadFailedWithCode, { code: $setup.uploadErrorCode }) : $setup.t($setup.tr.uploadFailed, { message: $setup.uploadError })), 9, _hoisted_64)) : _createCommentVNode11("v-if", true),
|
|
3364
|
+
$setup.uploadStatus === $setup.UploadStatus.FAILED ? (_openBlock14(), _createElementBlock13(
|
|
3365
|
+
"button",
|
|
3366
|
+
{
|
|
3367
|
+
key: 2,
|
|
3368
|
+
"data-testid": "upup-retry-btn",
|
|
3369
|
+
class: _normalizeClass12($setup.cn("upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-full upup-bg-red-600 upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white", { "upup-bg-red-500 dark:upup-bg-red-500": $setup.dark }, $setup.slotClasses.uploadButton)),
|
|
3370
|
+
onClick: $setup.onRetryClick
|
|
3371
|
+
},
|
|
3372
|
+
_toDisplayString10(((_e = $setup.resumable) == null ? void 0 : _e.protocol) === "multipart" ? $setup.tr.resumeUpload : $setup.tr.retryUpload),
|
|
3373
|
+
3
|
|
3374
|
+
/* TEXT, CLASS */
|
|
3375
|
+
)) : _createCommentVNode11("v-if", true),
|
|
3376
|
+
$setup.uploadStatus === $setup.UploadStatus.SUCCESSFUL && !$setup.quietCompletion ? (_openBlock14(), _createElementBlock13(
|
|
3377
|
+
"button",
|
|
3378
|
+
{
|
|
3379
|
+
key: 3,
|
|
3380
|
+
class: _normalizeClass12($setup.cn("upup-fx-sheen-sweep upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-lg upup-bg-[#0ea5e9] upup-px-3 upup-py-2 upup-text-sm upup-font-medium upup-text-white", { "upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]": $setup.dark }, $setup.slotClasses.uploadDoneButton)),
|
|
3381
|
+
onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleDone && $setup.handleDone(...args))
|
|
3382
|
+
},
|
|
3383
|
+
_toDisplayString10($setup.tr.done),
|
|
3384
|
+
3
|
|
3385
|
+
/* TEXT, CLASS */
|
|
3386
|
+
)) : _createCommentVNode11("v-if", true),
|
|
3387
|
+
_createElementVNode11("div", _hoisted_74, [_createElementVNode11("div", _hoisted_84, [
|
|
3388
|
+
_createCommentVNode11(` Cancel an in-flight run: aborts the active request(s) but\r
|
|
3389
|
+
KEEPS the files (status \u2192 PAUSED) so the run can be\r
|
|
3390
|
+
resumed. A true discard is the header's "remove all". `),
|
|
3391
|
+
$setup.uploadStatus === $setup.UploadStatus.UPLOADING ? (_openBlock14(), _createElementBlock13("button", {
|
|
3392
|
+
key: 0,
|
|
3393
|
+
"data-testid": "upup-upload-cancel",
|
|
3394
|
+
class: _normalizeClass12($setup.cn("upup-fx-press upup-flex upup-h-7 upup-items-center upup-gap-1 upup-whitespace-nowrap upup-rounded-full upup-bg-red-100 upup-px-3 upup-text-xs upup-font-medium upup-text-red-700 upup-transition-colors hover:upup-bg-red-200", { "upup-bg-red-500/20 upup-text-red-100 hover:upup-bg-red-500/30": $setup.dark })),
|
|
3395
|
+
onClick: _cache[2] || (_cache[2] = (...args) => $setup.handlePause && $setup.handlePause(...args)),
|
|
3396
|
+
"aria-label": $setup.tr.cancel,
|
|
3397
|
+
title: $setup.tr.cancel
|
|
3398
|
+
}, [_createVNode9($setup["Icon"], {
|
|
3399
|
+
name: "x",
|
|
3400
|
+
size: 14
|
|
3401
|
+
}), _createTextVNode3(
|
|
3402
|
+
" " + _toDisplayString10($setup.tr.cancel),
|
|
3403
|
+
1
|
|
3404
|
+
/* TEXT */
|
|
3405
|
+
)], 10, _hoisted_93)) : _createCommentVNode11("v-if", true),
|
|
3406
|
+
$setup.uploadStatus === $setup.UploadStatus.PAUSED ? (_openBlock14(), _createElementBlock13("button", {
|
|
3407
|
+
key: 1,
|
|
3408
|
+
"data-testid": "upup-upload-resume",
|
|
3409
|
+
class: _normalizeClass12($setup.cn("upup-fx-press upup-flex upup-h-7 upup-items-center upup-gap-1 upup-whitespace-nowrap upup-rounded-full upup-bg-[#0ea5e9] upup-px-3 upup-text-xs upup-font-medium upup-text-white upup-transition-colors", { "upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]": $setup.dark })),
|
|
3410
|
+
onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleResume && $setup.handleResume(...args)),
|
|
3411
|
+
"aria-label": $setup.tr.resumeUpload,
|
|
3412
|
+
title: $setup.tr.resumeUpload
|
|
3413
|
+
}, [_createVNode9($setup["Icon"], {
|
|
3414
|
+
name: "player-play",
|
|
3415
|
+
size: 14
|
|
3416
|
+
}), _createTextVNode3(
|
|
3417
|
+
" " + _toDisplayString10($setup.tr.resumeUpload),
|
|
3418
|
+
1
|
|
3419
|
+
/* TEXT */
|
|
3420
|
+
)], 10, _hoisted_103)) : _createCommentVNode11("v-if", true),
|
|
3421
|
+
_createVNode9($setup["ProgressBar"], {
|
|
3422
|
+
class: "upup-flex-1",
|
|
3423
|
+
"progress-bar-class-name": "upup-rounded",
|
|
3424
|
+
progress: $setup.totalProgress,
|
|
3425
|
+
"show-value": true
|
|
3426
|
+
}, null, 8, ["progress"])
|
|
3427
|
+
]), ($setup.isUploadActive($setup.uploadStatus) || $setup.uploadStatus === $setup.UploadStatus.PAUSED) && $setup.totalBytes > 0 ? (_openBlock14(), _createElementBlock13(
|
|
3428
|
+
"div",
|
|
3429
|
+
{
|
|
3430
|
+
key: 0,
|
|
3431
|
+
class: _normalizeClass12($setup.cn("upup-flex upup-items-center upup-justify-between upup-text-[11px] upup-text-gray-500", { "upup-text-gray-400": $setup.dark }))
|
|
3432
|
+
},
|
|
3433
|
+
[
|
|
3434
|
+
_createElementVNode11("span", null, [_createTextVNode3(
|
|
3435
|
+
_toDisplayString10($setup.formatBytes($setup.uploadedBytes)) + " of " + _toDisplayString10($setup.formatBytes($setup.totalBytes)) + " ",
|
|
3436
|
+
1
|
|
3437
|
+
/* TEXT */
|
|
3438
|
+
), $setup.uploadSpeed > 0 ? (_openBlock14(), _createElementBlock13(
|
|
3439
|
+
_Fragment6,
|
|
3440
|
+
{ key: 0 },
|
|
3441
|
+
[_createTextVNode3(
|
|
3442
|
+
" \xB7 " + _toDisplayString10($setup.formatBytes($setup.uploadSpeed)) + "/s ",
|
|
3443
|
+
1
|
|
3444
|
+
/* TEXT */
|
|
3445
|
+
)],
|
|
3446
|
+
64
|
|
3447
|
+
/* STABLE_FRAGMENT */
|
|
3448
|
+
)) : _createCommentVNode11("v-if", true)]),
|
|
3449
|
+
$setup.isUploadActive($setup.uploadStatus) && $setup.uploadEta > 0 ? (_openBlock14(), _createElementBlock13(
|
|
3450
|
+
"span",
|
|
3451
|
+
_hoisted_113,
|
|
3452
|
+
_toDisplayString10($setup.formatEta($setup.uploadEta)),
|
|
3453
|
+
1
|
|
3454
|
+
/* TEXT */
|
|
3455
|
+
)) : _createCommentVNode11("v-if", true),
|
|
3456
|
+
$setup.uploadStatus === $setup.UploadStatus.PAUSED ? (_openBlock14(), _createElementBlock13(
|
|
3457
|
+
"span",
|
|
3458
|
+
_hoisted_123,
|
|
3459
|
+
_toDisplayString10($setup.tr.paused),
|
|
3460
|
+
1
|
|
3461
|
+
/* TEXT */
|
|
3462
|
+
)) : _createCommentVNode11("v-if", true)
|
|
3463
|
+
],
|
|
3464
|
+
2
|
|
3465
|
+
/* CLASS */
|
|
3466
|
+
)) : _createCommentVNode11("v-if", true)])
|
|
3467
|
+
],
|
|
3468
|
+
2
|
|
3469
|
+
/* CLASS */
|
|
3470
|
+
)
|
|
3471
|
+
], 10, _hoisted_112);
|
|
3472
|
+
}
|
|
3473
|
+
var FileList_default = /* @__PURE__ */ export_helper_default(_sfc_main14, [["render", _sfc_render14], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\FileList.vue"]]);
|
|
3474
|
+
|
|
3475
|
+
// src/components/UploaderPanel.vue
|
|
3476
|
+
import { toDisplayString as _toDisplayString11, createElementVNode as _createElementVNode12, createCommentVNode as _createCommentVNode12, openBlock as _openBlock15, createElementBlock as _createElementBlock14, normalizeClass as _normalizeClass13, Fragment as _Fragment7, createBlock as _createBlock11, createVNode as _createVNode10 } from "vue";
|
|
3477
|
+
var _sfc_main15 = /* @__PURE__ */ _defineComponent15({
|
|
3478
|
+
__name: "UploaderPanel",
|
|
3479
|
+
setup(__props, { expose: __expose }) {
|
|
3480
|
+
__expose();
|
|
3481
|
+
const { files } = useUploaderFiles();
|
|
3482
|
+
const { activeSource } = useUploaderSource();
|
|
3483
|
+
const { sourceOverlayOpen, sourceOverlayClosing, dropRejected, closeSourceOverlay } = useUploaderView();
|
|
3484
|
+
const { isOnline, motionMode } = useUploaderRuntime();
|
|
3485
|
+
const { translations: tr } = useUploaderI18n();
|
|
3486
|
+
const { isDark: dark } = useUploaderTheme();
|
|
3487
|
+
const { mini, showBranding } = useUploaderOptions();
|
|
3488
|
+
const { upload: { uploadStatus } } = useUploaderUploadControls();
|
|
3489
|
+
const { isDragging, absoluteIsDragging, absoluteHasBorder, handleDragOver, handleDragLeave, handleDrop, handlePaste } = useUploaderPanel();
|
|
3490
|
+
const showDropzoneFrame = computed16(() => absoluteHasBorder.value && !activeSource.value && !sourceOverlayOpen.value && !files.value.size);
|
|
3491
|
+
const hasFiles = computed16(() => files.value.size > 0);
|
|
3492
|
+
const showSourceOverlay = computed16(() => hasFiles.value && (sourceOverlayOpen.value || sourceOverlayClosing.value || !!activeSource.value));
|
|
3493
|
+
const dropEffect = computed16(() => isDragging.value ? "copy" : "none");
|
|
3494
|
+
const overlayRef = ref8(null);
|
|
3495
|
+
let triggerEl = null;
|
|
3496
|
+
let swipeStartY = null;
|
|
3497
|
+
let swiped = false;
|
|
3498
|
+
watch4([sourceOverlayOpen, activeSource], () => {
|
|
3499
|
+
if (!(sourceOverlayOpen.value || activeSource.value)) return;
|
|
3500
|
+
void nextTick(() => {
|
|
3501
|
+
var _a;
|
|
3502
|
+
const overlayEl = overlayRef.value;
|
|
3503
|
+
if (!overlayEl) return;
|
|
3504
|
+
if (!triggerEl && document.activeElement instanceof HTMLElement) triggerEl = document.activeElement;
|
|
3505
|
+
(_a = overlayEl.querySelector("button:not([disabled])")) == null ? void 0 : _a.focus();
|
|
3506
|
+
});
|
|
3507
|
+
});
|
|
3508
|
+
watch4([
|
|
3509
|
+
sourceOverlayOpen,
|
|
3510
|
+
sourceOverlayClosing,
|
|
3511
|
+
activeSource
|
|
3512
|
+
], () => {
|
|
3513
|
+
if (sourceOverlayOpen.value || sourceOverlayClosing.value || activeSource.value) return;
|
|
3514
|
+
const trigger = triggerEl;
|
|
3515
|
+
if (!trigger) return;
|
|
3516
|
+
triggerEl = null;
|
|
3517
|
+
if (trigger.isConnected) trigger.focus();
|
|
3518
|
+
});
|
|
3519
|
+
const uploadAnnouncement = computed16(() => uploadStatus.value === UploadStatus6.UPLOADING ? tr.announceUploadStarted : uploadStatus.value === UploadStatus6.SUCCESSFUL ? tr.announceUploadComplete : uploadStatus.value === UploadStatus6.FAILED ? tr.announceUploadFailed : "");
|
|
3520
|
+
function onGripClick() {
|
|
3521
|
+
if (!swiped) closeSourceOverlay();
|
|
3522
|
+
swiped = false;
|
|
3523
|
+
}
|
|
3524
|
+
function onGripPointerDown(e) {
|
|
3525
|
+
swipeStartY = e.clientY;
|
|
3526
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
3527
|
+
}
|
|
3528
|
+
function onGripPointerMove(e) {
|
|
3529
|
+
const startY = swipeStartY;
|
|
3530
|
+
const sheet = overlayRef.value;
|
|
3531
|
+
if (startY === null || !sheet) return;
|
|
3532
|
+
const dy = Math.max(0, e.clientY - startY);
|
|
3533
|
+
sheet.style.transition = "none";
|
|
3534
|
+
sheet.style.transform = `translateY(${dy}px)`;
|
|
3535
|
+
}
|
|
3536
|
+
function onGripPointerUp(e) {
|
|
3537
|
+
const startY = swipeStartY;
|
|
3538
|
+
const sheet = overlayRef.value;
|
|
3539
|
+
swipeStartY = null;
|
|
3540
|
+
if (startY === null || !sheet) return;
|
|
3541
|
+
const dy = Math.max(0, e.clientY - startY);
|
|
3542
|
+
sheet.style.transition = "";
|
|
3543
|
+
sheet.style.transform = "";
|
|
3544
|
+
if (dy > 72) {
|
|
3545
|
+
swiped = true;
|
|
3546
|
+
closeSourceOverlay();
|
|
3547
|
+
}
|
|
3548
|
+
}
|
|
3549
|
+
function onOverlayKeydown(e) {
|
|
3550
|
+
if (e.key === "Escape" && !sourceOverlayClosing.value) closeSourceOverlay();
|
|
3551
|
+
}
|
|
3552
|
+
const __returned__ = {
|
|
3553
|
+
files,
|
|
3554
|
+
activeSource,
|
|
3555
|
+
sourceOverlayOpen,
|
|
3556
|
+
sourceOverlayClosing,
|
|
3557
|
+
dropRejected,
|
|
3558
|
+
closeSourceOverlay,
|
|
3559
|
+
isOnline,
|
|
3560
|
+
motionMode,
|
|
3561
|
+
tr,
|
|
3562
|
+
dark,
|
|
3563
|
+
mini,
|
|
3564
|
+
showBranding,
|
|
3565
|
+
uploadStatus,
|
|
3566
|
+
isDragging,
|
|
3567
|
+
absoluteIsDragging,
|
|
3568
|
+
absoluteHasBorder,
|
|
3569
|
+
handleDragOver,
|
|
3570
|
+
handleDragLeave,
|
|
3571
|
+
handleDrop,
|
|
3572
|
+
handlePaste,
|
|
3573
|
+
showDropzoneFrame,
|
|
3574
|
+
hasFiles,
|
|
3575
|
+
showSourceOverlay,
|
|
3576
|
+
dropEffect,
|
|
3577
|
+
overlayRef,
|
|
3578
|
+
get triggerEl() {
|
|
3579
|
+
return triggerEl;
|
|
3580
|
+
},
|
|
3581
|
+
set triggerEl(v) {
|
|
3582
|
+
triggerEl = v;
|
|
3583
|
+
},
|
|
3584
|
+
get swipeStartY() {
|
|
3585
|
+
return swipeStartY;
|
|
3586
|
+
},
|
|
3587
|
+
set swipeStartY(v) {
|
|
3588
|
+
swipeStartY = v;
|
|
3589
|
+
},
|
|
3590
|
+
get swiped() {
|
|
3591
|
+
return swiped;
|
|
3592
|
+
},
|
|
3593
|
+
set swiped(v) {
|
|
3594
|
+
swiped = v;
|
|
3595
|
+
},
|
|
3596
|
+
uploadAnnouncement,
|
|
3597
|
+
onGripClick,
|
|
3598
|
+
onGripPointerDown,
|
|
3599
|
+
onGripPointerMove,
|
|
3600
|
+
onGripPointerUp,
|
|
3601
|
+
onOverlayKeydown,
|
|
3602
|
+
get devinoDark() {
|
|
3603
|
+
return devinoDark;
|
|
3604
|
+
},
|
|
3605
|
+
get devinoLight() {
|
|
3606
|
+
return devinoLight;
|
|
3607
|
+
},
|
|
3608
|
+
get logoDark() {
|
|
3609
|
+
return logoDark;
|
|
3610
|
+
},
|
|
3611
|
+
get logoLight() {
|
|
3612
|
+
return logoLight;
|
|
3613
|
+
},
|
|
3614
|
+
get cn() {
|
|
3615
|
+
return cn13;
|
|
3616
|
+
},
|
|
3617
|
+
get formatUiMessage() {
|
|
3618
|
+
return formatUiMessage;
|
|
3619
|
+
},
|
|
3620
|
+
SourceSelector: SourceSelector_default,
|
|
3621
|
+
SourceView: SourceView_default,
|
|
3622
|
+
FileList: FileList_default
|
|
3623
|
+
};
|
|
3624
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
3625
|
+
enumerable: false,
|
|
3626
|
+
value: true
|
|
3627
|
+
});
|
|
3628
|
+
return __returned__;
|
|
3629
|
+
}
|
|
3630
|
+
});
|
|
3631
|
+
var _hoisted_114 = [
|
|
3632
|
+
"data-motion",
|
|
3633
|
+
"aria-label",
|
|
3634
|
+
"aria-dropeffect"
|
|
3635
|
+
];
|
|
3636
|
+
var _hoisted_211 = {
|
|
3637
|
+
role: "status",
|
|
3638
|
+
"aria-live": "polite",
|
|
3639
|
+
class: "upup-sr-only"
|
|
3640
|
+
};
|
|
3641
|
+
var _hoisted_310 = {
|
|
3642
|
+
"data-upup-slot": "dropzone-frame",
|
|
3643
|
+
"aria-hidden": "true",
|
|
3644
|
+
class: "upup-pointer-events-none upup-absolute upup-inset-1 upup-h-[calc(100%-0.5rem)] upup-w-[calc(100%-0.5rem)]"
|
|
3645
|
+
};
|
|
3646
|
+
var _hoisted_48 = ["stroke"];
|
|
3647
|
+
var _hoisted_57 = { class: "upup-relative upup-flex upup-min-h-0 upup-flex-1 upup-flex-col" };
|
|
3648
|
+
var _hoisted_65 = [
|
|
3649
|
+
"role",
|
|
3650
|
+
"aria-modal",
|
|
3651
|
+
"aria-label"
|
|
3652
|
+
];
|
|
3653
|
+
var _hoisted_75 = ["aria-label"];
|
|
3654
|
+
var _hoisted_85 = {
|
|
3655
|
+
key: 5,
|
|
3656
|
+
"data-testid": "upup-branding",
|
|
3657
|
+
class: "upup-flex upup-w-full upup-flex-none upup-flex-col upup-items-center upup-justify-between upup-gap-1 upup-px-6 upup-pb-5 upup-pt-1.5 md:upup-flex-row"
|
|
3658
|
+
};
|
|
3659
|
+
var _hoisted_94 = {
|
|
3660
|
+
href: "https://useupup.com/",
|
|
3661
|
+
target: "_blank",
|
|
3662
|
+
rel: "noopener noreferrer",
|
|
3663
|
+
class: "upup-flex upup-items-center upup-gap-[5px]"
|
|
3664
|
+
};
|
|
3665
|
+
var _hoisted_104 = ["src"];
|
|
3666
|
+
var _hoisted_115 = ["src"];
|
|
3667
|
+
var _hoisted_124 = {
|
|
3668
|
+
href: "https://devino.ca/",
|
|
3669
|
+
target: "_blank",
|
|
3670
|
+
rel: "noopener noreferrer",
|
|
3671
|
+
class: "upup-flex upup-flex-row upup-items-center upup-justify-end upup-gap-1"
|
|
3672
|
+
};
|
|
3673
|
+
var _hoisted_132 = ["src"];
|
|
3674
|
+
var _hoisted_142 = ["src"];
|
|
3675
|
+
function _sfc_render15(_ctx, _cache, $props, $setup, $data, $options) {
|
|
3676
|
+
return _openBlock15(), _createElementBlock14("div", {
|
|
3677
|
+
"data-testid": "upup-dropzone",
|
|
3678
|
+
"data-upup-slot": "uploader-panel",
|
|
3679
|
+
"data-motion": $setup.motionMode,
|
|
3680
|
+
role: "region",
|
|
3681
|
+
"aria-label": $setup.tr.dropzoneLabel,
|
|
3682
|
+
"aria-dropeffect": $setup.dropEffect,
|
|
3683
|
+
class: _normalizeClass13($setup.cn("upup-relative upup-flex upup-flex-1 upup-flex-col upup-overflow-hidden upup-rounded-lg", {
|
|
3684
|
+
"upup-border upup-border-[#0ea5e9]": $setup.absoluteHasBorder && !$setup.showDropzoneFrame,
|
|
3685
|
+
"upup-border-[#38bdf8] dark:upup-border-[#38bdf8]": $setup.absoluteHasBorder && !$setup.showDropzoneFrame && $setup.dark,
|
|
3686
|
+
"upup-border-dashed": !$setup.isDragging && !$setup.showDropzoneFrame,
|
|
3687
|
+
"upup-bg-[#e0f2fe] upup-backdrop-blur-sm": $setup.absoluteIsDragging && !$setup.dark,
|
|
3688
|
+
"upup-bg-[#0b2a3a] upup-backdrop-blur-sm dark:upup-bg-[#0b2a3a]": $setup.absoluteIsDragging && $setup.dark
|
|
3689
|
+
})),
|
|
3690
|
+
onDragover: _cache[0] || (_cache[0] = (...args) => $setup.handleDragOver && $setup.handleDragOver(...args)),
|
|
3691
|
+
onDragleave: _cache[1] || (_cache[1] = (...args) => $setup.handleDragLeave && $setup.handleDragLeave(...args)),
|
|
3692
|
+
onDrop: _cache[2] || (_cache[2] = (...args) => $setup.handleDrop && $setup.handleDrop(...args)),
|
|
3693
|
+
onPaste: _cache[3] || (_cache[3] = (...args) => $setup.handlePaste && $setup.handlePaste(...args))
|
|
3694
|
+
}, [
|
|
3695
|
+
_createElementVNode12(
|
|
3696
|
+
"div",
|
|
3697
|
+
_hoisted_211,
|
|
3698
|
+
_toDisplayString11($setup.uploadAnnouncement),
|
|
3699
|
+
1
|
|
3700
|
+
/* TEXT */
|
|
3701
|
+
),
|
|
3702
|
+
_createCommentVNode12(" Drop-rejection toast: a file was dropped onto a read-only drive\r\n picker (core DragDropController \u2192 transient-UI store). Auto-clears\r\n after the store's 3s window drives an unmount \u2014 no JS timer here. "),
|
|
3703
|
+
$setup.dropRejected ? (_openBlock15(), _createElementBlock14(
|
|
3704
|
+
"div",
|
|
3705
|
+
{
|
|
3706
|
+
key: 0,
|
|
3707
|
+
"data-testid": "upup-drop-rejected-toast",
|
|
3708
|
+
"data-upup-slot": "drop-rejected-toast",
|
|
3709
|
+
role: "status",
|
|
3710
|
+
"aria-live": "polite",
|
|
3711
|
+
class: _normalizeClass13($setup.cn("upup-animate-informer-in upup-absolute upup-inset-x-4 upup-top-4 upup-z-30 upup-flex upup-items-center upup-gap-2.5 upup-rounded-xl upup-px-3.5 upup-py-2.5 upup-text-[13px] upup-leading-snug upup-ring-1", $setup.dark ? "upup-bg-rose-500/[0.14] upup-text-rose-200 upup-ring-rose-400/30" : "upup-bg-rose-50 upup-text-rose-700 upup-ring-rose-300/60"))
|
|
3712
|
+
},
|
|
3713
|
+
[_cache[4] || (_cache[4] = _createElementVNode12(
|
|
3714
|
+
"svg",
|
|
3715
|
+
{
|
|
3716
|
+
viewBox: "0 0 24 24",
|
|
3717
|
+
width: "16",
|
|
3718
|
+
height: "16",
|
|
3719
|
+
fill: "none",
|
|
3720
|
+
stroke: "currentColor",
|
|
3721
|
+
"stroke-width": "1.9",
|
|
3722
|
+
"stroke-linecap": "round",
|
|
3723
|
+
"stroke-linejoin": "round",
|
|
3724
|
+
"aria-hidden": "true",
|
|
3725
|
+
class: "upup-flex-none"
|
|
3726
|
+
},
|
|
3727
|
+
[
|
|
3728
|
+
_createElementVNode12("circle", {
|
|
3729
|
+
cx: "12",
|
|
3730
|
+
cy: "12",
|
|
3731
|
+
r: "9"
|
|
3732
|
+
}),
|
|
3733
|
+
_createElementVNode12("path", { d: "M12 8v4" }),
|
|
3734
|
+
_createElementVNode12("path", { d: "M12 16h.01" })
|
|
3735
|
+
],
|
|
3736
|
+
-1
|
|
3737
|
+
/* CACHED */
|
|
3738
|
+
)), _createElementVNode12(
|
|
3739
|
+
"span",
|
|
3740
|
+
null,
|
|
3741
|
+
_toDisplayString11($setup.formatUiMessage($setup.tr.dropRejected, { provider: $setup.dropRejected })),
|
|
3742
|
+
1
|
|
3743
|
+
/* TEXT */
|
|
3744
|
+
)],
|
|
3745
|
+
2
|
|
3746
|
+
/* CLASS */
|
|
3747
|
+
)) : _createCommentVNode12("v-if", true),
|
|
3748
|
+
!$setup.isOnline ? (_openBlock15(), _createElementBlock14(
|
|
3749
|
+
"div",
|
|
3750
|
+
{
|
|
3751
|
+
key: 1,
|
|
3752
|
+
class: _normalizeClass13($setup.cn("upup-absolute upup-inset-x-0 upup-top-0 upup-z-30 upup-px-3 upup-py-1.5 upup-text-center upup-text-xs upup-font-medium upup-text-white upup-bg-yellow-500", { "upup-bg-yellow-600": $setup.dark }))
|
|
3753
|
+
},
|
|
3754
|
+
" No internet connection \u2014 uploads will resume when you reconnect. ",
|
|
3755
|
+
2
|
|
3756
|
+
/* CLASS */
|
|
3757
|
+
)) : _createCommentVNode12("v-if", true),
|
|
3758
|
+
$setup.showDropzoneFrame ? (_openBlock15(), _createElementBlock14(
|
|
3759
|
+
_Fragment7,
|
|
3760
|
+
{ key: 2 },
|
|
3761
|
+
[_createCommentVNode12(" An <svg> is a replaced element: absolute insets position it but\r\n do NOT stretch it (it keeps the 300x150 default), so the frame\r\n needs its size stated explicitly alongside its inset. Hugs the\r\n panel edge (4px) so the in-frame branding row has breathing\r\n room above the bottom dashes. "), (_openBlock15(), _createElementBlock14("svg", _hoisted_310, [_createElementVNode12("rect", {
|
|
3762
|
+
x: "1",
|
|
3763
|
+
y: "1",
|
|
3764
|
+
rx: "14",
|
|
3765
|
+
ry: "14",
|
|
3766
|
+
fill: "none",
|
|
3767
|
+
"stroke-width": "1.5",
|
|
3768
|
+
"stroke-dasharray": "5 7",
|
|
3769
|
+
stroke: $setup.dark ? $setup.absoluteIsDragging ? "rgba(56,189,248,0.65)" : "rgba(56,189,248,0.35)" : $setup.absoluteIsDragging ? "rgba(2,132,199,0.7)" : "rgba(2,132,199,0.4)",
|
|
3770
|
+
class: _normalizeClass13($setup.cn($setup.absoluteIsDragging && "upup-animate-fx-dash-march")),
|
|
3771
|
+
style: {
|
|
3772
|
+
width: "calc(100% - 2px)",
|
|
3773
|
+
height: "calc(100% - 2px)"
|
|
3774
|
+
}
|
|
3775
|
+
}, null, 10, _hoisted_48)]))],
|
|
3776
|
+
64
|
|
3777
|
+
/* STABLE_FRAGMENT */
|
|
3778
|
+
)) : _createCommentVNode12("v-if", true),
|
|
3779
|
+
_createCommentVNode12(' Drag-over prompt: an explicit "drop it here" affordance (icon +\r\n text) so the drag state never reads as a mere glow. Pointer events\r\n pass through \u2014 the panel underneath owns the drop. '),
|
|
3780
|
+
$setup.absoluteIsDragging ? (_openBlock15(), _createElementBlock14(
|
|
3781
|
+
"div",
|
|
3782
|
+
{
|
|
3783
|
+
key: 3,
|
|
3784
|
+
"data-testid": "upup-drag-overlay",
|
|
3785
|
+
"data-upup-slot": "drag-overlay",
|
|
3786
|
+
"aria-hidden": "true",
|
|
3787
|
+
class: _normalizeClass13($setup.cn("upup-animate-fx-view upup-pointer-events-none upup-absolute upup-inset-0 upup-z-10 upup-flex upup-flex-col upup-items-center upup-justify-center upup-gap-3", $setup.dark ? "upup-bg-[#0b1220]/70" : "upup-bg-white/70"))
|
|
3788
|
+
},
|
|
3789
|
+
[_createElementVNode12(
|
|
3790
|
+
"span",
|
|
3791
|
+
{ class: _normalizeClass13($setup.cn("upup-flex upup-h-16 upup-w-16 upup-items-center upup-justify-center upup-rounded-2xl", $setup.dark ? "upup-bg-[#38bdf8]/15 upup-text-[#38bdf8]" : "upup-bg-[#0284c7]/10 upup-text-[#0284c7]")) },
|
|
3792
|
+
[..._cache[5] || (_cache[5] = [_createElementVNode12(
|
|
3793
|
+
"svg",
|
|
3794
|
+
{
|
|
3795
|
+
viewBox: "0 0 24 24",
|
|
3796
|
+
width: "30",
|
|
3797
|
+
height: "30",
|
|
3798
|
+
fill: "none",
|
|
3799
|
+
stroke: "currentColor",
|
|
3800
|
+
"stroke-width": "1.8",
|
|
3801
|
+
"stroke-linecap": "round",
|
|
3802
|
+
"stroke-linejoin": "round",
|
|
3803
|
+
"aria-hidden": "true"
|
|
3804
|
+
},
|
|
3805
|
+
[
|
|
3806
|
+
_createElementVNode12("path", { d: "M12 4v11" }),
|
|
3807
|
+
_createElementVNode12("path", { d: "m7 10 5 5 5-5" }),
|
|
3808
|
+
_createElementVNode12("path", { d: "M4 17v1a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1" })
|
|
3809
|
+
],
|
|
3810
|
+
-1
|
|
3811
|
+
/* CACHED */
|
|
3812
|
+
)])],
|
|
3813
|
+
2
|
|
3814
|
+
/* CLASS */
|
|
3815
|
+
), _createElementVNode12(
|
|
3816
|
+
"span",
|
|
3817
|
+
{ class: _normalizeClass13($setup.cn("upup-text-[15px] upup-font-semibold", $setup.dark ? "upup-text-[#e2e8f0]" : "upup-text-[#0f172a]")) },
|
|
3818
|
+
_toDisplayString11($setup.tr.dropToUpload),
|
|
3819
|
+
3
|
|
3820
|
+
/* TEXT, CLASS */
|
|
3821
|
+
)],
|
|
3822
|
+
2
|
|
3823
|
+
/* CLASS */
|
|
3824
|
+
)) : _createCommentVNode12("v-if", true),
|
|
3825
|
+
_createCommentVNode12(" Content area (source surface / file list) flexes above the in-panel\r\n branding row so the dashed frame \u2014 inset-1 of this panel \u2014 wraps\r\n EVERYTHING including the brand, per the mock. "),
|
|
3826
|
+
_createElementVNode12("div", _hoisted_57, [
|
|
3827
|
+
_createCommentVNode12(" Idle primary: the source surface fills the panel when empty. "),
|
|
3828
|
+
!$setup.hasFiles ? (_openBlock15(), _createElementBlock14(
|
|
3829
|
+
_Fragment7,
|
|
3830
|
+
{ key: 0 },
|
|
3831
|
+
[$setup.activeSource ? (_openBlock15(), _createBlock11($setup["SourceView"], { key: 0 })) : (_openBlock15(), _createBlock11($setup["SourceSelector"], { key: 1 }))],
|
|
3832
|
+
64
|
|
3833
|
+
/* STABLE_FRAGMENT */
|
|
3834
|
+
)) : _createCommentVNode12("v-if", true),
|
|
3835
|
+
_createVNode10($setup["FileList"])
|
|
3836
|
+
]),
|
|
3837
|
+
_createCommentVNode12(" Add-more DRAWER (states-tour-v2 sheet): the source surface slides\r\n up as a translucent bottom sheet over the dimmed, still-mounted\r\n file list \u2014 the files stay visible behind it so nothing feels lost.\r\n Swipe the grip down (or Escape / the grip click) to close. "),
|
|
3838
|
+
$setup.showSourceOverlay ? (_openBlock15(), _createElementBlock14("div", {
|
|
3839
|
+
key: 4,
|
|
3840
|
+
ref: "overlayRef",
|
|
3841
|
+
"data-upup-slot": "source-overlay",
|
|
3842
|
+
role: $setup.sourceOverlayClosing ? void 0 : "dialog",
|
|
3843
|
+
"aria-modal": $setup.sourceOverlayClosing ? void 0 : "true",
|
|
3844
|
+
"aria-label": $setup.tr.addingMoreFiles,
|
|
3845
|
+
class: _normalizeClass13($setup.cn("upup-absolute upup-inset-x-3 upup-bottom-3 upup-top-11 upup-z-20 upup-flex upup-flex-col upup-overflow-hidden upup-rounded-2xl upup-ring-1 upup-ring-inset upup-backdrop-blur-md", $setup.sourceOverlayClosing ? "upup-fx-overlay-close-slide upup-pointer-events-none" : "upup-fx-overlay-slide", $setup.dark ? "upup-bg-[#0b1220]/[0.85] upup-ring-white/[0.08] upup-shadow-[0_-18px_40px_-18px_rgba(0,0,0,0.65)]" : "upup-bg-white/[0.85] upup-ring-black/[0.08] upup-shadow-[0_-18px_40px_-18px_rgba(15,23,42,0.25)]")),
|
|
3846
|
+
onKeydown: $setup.onOverlayKeydown
|
|
3847
|
+
}, [
|
|
3848
|
+
_createCommentVNode12(" Sheet grip: click closes; drag down past the threshold\r\n closes (pointer capture \u2014 no transitionend reliance). "),
|
|
3849
|
+
_createElementVNode12("button", {
|
|
3850
|
+
type: "button",
|
|
3851
|
+
"data-testid": "upup-sheet-grip",
|
|
3852
|
+
"data-upup-slot": "sheet-grip",
|
|
3853
|
+
"aria-label": $setup.tr.overlayBack,
|
|
3854
|
+
class: "upup-absolute upup-left-1/2 upup-top-1.5 upup-z-10 upup-flex upup-h-6 upup-w-20 upup--translate-x-1/2 upup-cursor-grab upup-touch-none upup-items-center upup-justify-center upup-rounded-full",
|
|
3855
|
+
onClick: $setup.onGripClick,
|
|
3856
|
+
onPointerdown: $setup.onGripPointerDown,
|
|
3857
|
+
onPointermove: $setup.onGripPointerMove,
|
|
3858
|
+
onPointerup: $setup.onGripPointerUp
|
|
3859
|
+
}, [_createElementVNode12(
|
|
3860
|
+
"span",
|
|
3861
|
+
{
|
|
3862
|
+
"aria-hidden": "true",
|
|
3863
|
+
class: _normalizeClass13($setup.cn("upup-h-1 upup-w-10 upup-rounded-full", $setup.dark ? "upup-bg-white/20" : "upup-bg-black/20"))
|
|
3864
|
+
},
|
|
3865
|
+
null,
|
|
3866
|
+
2
|
|
3867
|
+
/* CLASS */
|
|
3868
|
+
)], 40, _hoisted_75),
|
|
3869
|
+
$setup.activeSource ? (_openBlock15(), _createBlock11($setup["SourceView"], { key: 0 })) : (_openBlock15(), _createBlock11($setup["SourceSelector"], { key: 1 }))
|
|
3870
|
+
], 42, _hoisted_65)) : _createCommentVNode12("v-if", true),
|
|
3871
|
+
_createCommentVNode12(" Branding row INSIDE the panel (and the dashed frame). The add-more\r\n sheet slides over it, per the states-tour mock. Hidden while a\r\n source view is active \u2014 the drive browser / camera / url views own\r\n the full panel \u2014 and once files are selected: the file-list screen\r\n needs the vertical space (round-7 item 1). "),
|
|
3872
|
+
!$setup.mini && $setup.showBranding && !$setup.activeSource && !$setup.hasFiles ? (_openBlock15(), _createElementBlock14("div", _hoisted_85, [_createElementVNode12("a", _hoisted_94, [$setup.dark ? (_openBlock15(), _createElementBlock14("img", {
|
|
3873
|
+
key: 0,
|
|
3874
|
+
src: $setup.logoDark,
|
|
3875
|
+
width: 61,
|
|
3876
|
+
height: 13,
|
|
3877
|
+
alt: "logo-dark"
|
|
3878
|
+
}, null, 8, _hoisted_104)) : (_openBlock15(), _createElementBlock14("img", {
|
|
3879
|
+
key: 1,
|
|
3880
|
+
src: $setup.logoLight,
|
|
3881
|
+
width: 61,
|
|
3882
|
+
height: 13,
|
|
3883
|
+
alt: "logo-light"
|
|
3884
|
+
}, null, 8, _hoisted_115))]), _createElementVNode12("a", _hoisted_124, [_createElementVNode12(
|
|
3885
|
+
"span",
|
|
3886
|
+
{ class: _normalizeClass13($setup.cn("upup-mr-0.5 upup-text-xs upup-leading-5 upup-text-[#6D6D6D] md:upup-text-sm", { "upup-text-gray-300 dark:upup-text-gray-300": $setup.dark })) },
|
|
3887
|
+
_toDisplayString11($setup.tr.builtBy),
|
|
3888
|
+
3
|
|
3889
|
+
/* TEXT, CLASS */
|
|
3890
|
+
), $setup.dark ? (_openBlock15(), _createElementBlock14("img", {
|
|
3891
|
+
key: 0,
|
|
3892
|
+
src: $setup.devinoDark,
|
|
3893
|
+
width: 61,
|
|
3894
|
+
height: 13,
|
|
3895
|
+
alt: "logo-dark"
|
|
3896
|
+
}, null, 8, _hoisted_132)) : (_openBlock15(), _createElementBlock14("img", {
|
|
3897
|
+
key: 1,
|
|
3898
|
+
src: $setup.devinoLight,
|
|
3899
|
+
width: 61,
|
|
3900
|
+
height: 13,
|
|
3901
|
+
alt: "logo-light"
|
|
3902
|
+
}, null, 8, _hoisted_142))])])) : _createCommentVNode12("v-if", true)
|
|
3903
|
+
], 42, _hoisted_114);
|
|
3904
|
+
}
|
|
3905
|
+
var UploaderPanel_default = /* @__PURE__ */ export_helper_default(_sfc_main15, [["render", _sfc_render15], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\UploaderPanel.vue"]]);
|
|
3906
|
+
|
|
3907
|
+
// src/components/ImageEditorStub.vue
|
|
3908
|
+
import { defineComponent as _defineComponent16 } from "vue";
|
|
3909
|
+
import { cn as cn14 } from "@useupup/core/internal";
|
|
3910
|
+
import { createElementVNode as _createElementVNode13, toDisplayString as _toDisplayString12, normalizeClass as _normalizeClass14, openBlock as _openBlock16, createElementBlock as _createElementBlock15, createCommentVNode as _createCommentVNode13 } from "vue";
|
|
3911
|
+
var _sfc_main16 = /* @__PURE__ */ _defineComponent16({
|
|
3912
|
+
__name: "ImageEditorStub",
|
|
3913
|
+
setup(__props, { expose: __expose }) {
|
|
3914
|
+
__expose();
|
|
3915
|
+
const { editingFile, closeImageEditor } = useUploaderEditor();
|
|
3916
|
+
const { slotOverrides } = useUploaderTheme();
|
|
3917
|
+
const __returned__ = {
|
|
3918
|
+
editingFile,
|
|
3919
|
+
closeImageEditor,
|
|
3920
|
+
slotOverrides,
|
|
3921
|
+
get cn() {
|
|
3922
|
+
return cn14;
|
|
3923
|
+
}
|
|
3924
|
+
};
|
|
3925
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
3926
|
+
enumerable: false,
|
|
3927
|
+
value: true
|
|
3928
|
+
});
|
|
3929
|
+
return __returned__;
|
|
3930
|
+
}
|
|
3931
|
+
});
|
|
3932
|
+
var _hoisted_116 = { class: "upup-bg-white upup-dark:bg-gray-800 upup-rounded-lg upup-p-8 upup-text-center upup-max-w-sm upup-mx-4 upup-shadow-xl" };
|
|
3933
|
+
var _hoisted_212 = { class: "upup-text-xs upup-text-gray-400 upup-mb-6" };
|
|
3934
|
+
function _sfc_render16(_ctx, _cache, $props, $setup, $data, $options) {
|
|
3935
|
+
return $setup.editingFile ? (_openBlock16(), _createElementBlock15(
|
|
3936
|
+
"div",
|
|
3937
|
+
{
|
|
3938
|
+
key: 0,
|
|
3939
|
+
class: _normalizeClass14($setup.cn("upup-fixed upup-inset-0 upup-z-50 upup-flex upup-items-center upup-justify-center upup-bg-black/50", $setup.slotOverrides["image-editor"])),
|
|
3940
|
+
"data-testid": "upup-image-editor-stub",
|
|
3941
|
+
"data-upup-slot": "image-editor"
|
|
3942
|
+
},
|
|
3943
|
+
[_createElementVNode13("div", _hoisted_116, [
|
|
3944
|
+
_cache[1] || (_cache[1] = _createElementVNode13(
|
|
3945
|
+
"div",
|
|
3946
|
+
{ class: "upup-text-4xl upup-mb-4" },
|
|
3947
|
+
"\u{1F5BC}\uFE0F",
|
|
3948
|
+
-1
|
|
3949
|
+
/* CACHED */
|
|
3950
|
+
)),
|
|
3951
|
+
_cache[2] || (_cache[2] = _createElementVNode13(
|
|
3952
|
+
"h3",
|
|
3953
|
+
{ class: "upup-text-lg upup-font-semibold upup-text-gray-900 upup-dark:text-gray-100 upup-mb-2" },
|
|
3954
|
+
" Image Editor ",
|
|
3955
|
+
-1
|
|
3956
|
+
/* CACHED */
|
|
3957
|
+
)),
|
|
3958
|
+
_cache[3] || (_cache[3] = _createElementVNode13(
|
|
3959
|
+
"p",
|
|
3960
|
+
{ class: "upup-text-sm upup-text-gray-500 upup-dark:text-gray-400 upup-mb-4" },
|
|
3961
|
+
" Image editing is coming soon for Vue. The file has been added as-is. ",
|
|
3962
|
+
-1
|
|
3963
|
+
/* CACHED */
|
|
3964
|
+
)),
|
|
3965
|
+
_createElementVNode13(
|
|
3966
|
+
"p",
|
|
3967
|
+
_hoisted_212,
|
|
3968
|
+
_toDisplayString12($setup.editingFile.name),
|
|
3969
|
+
1
|
|
3970
|
+
/* TEXT */
|
|
3971
|
+
),
|
|
3972
|
+
_createElementVNode13("button", {
|
|
3973
|
+
class: "upup-px-4 upup-py-2 upup-bg-[#0ea5e9] upup-text-white upup-rounded-md hover:upup-bg-[#0284c7] upup-transition-colors",
|
|
3974
|
+
"data-testid": "upup-image-editor-close",
|
|
3975
|
+
onClick: _cache[0] || (_cache[0] = (...args) => $setup.closeImageEditor && $setup.closeImageEditor(...args))
|
|
3976
|
+
}, " Close ")
|
|
3977
|
+
])],
|
|
3978
|
+
2
|
|
3979
|
+
/* CLASS */
|
|
3980
|
+
)) : _createCommentVNode13("v-if", true);
|
|
3981
|
+
}
|
|
3982
|
+
var ImageEditorStub_default = /* @__PURE__ */ export_helper_default(_sfc_main16, [["render", _sfc_render16], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\components\\ImageEditorStub.vue"]]);
|
|
3983
|
+
|
|
3984
|
+
// src/upup-uploader.vue
|
|
3985
|
+
import { renderSlot as _renderSlot, createVNode as _createVNode11, openBlock as _openBlock17, createBlock as _createBlock12, createCommentVNode as _createCommentVNode14, normalizeClass as _normalizeClass15, createElementVNode as _createElementVNode14, normalizeStyle as _normalizeStyle7, createElementBlock as _createElementBlock16 } from "vue";
|
|
3986
|
+
var _sfc_main17 = /* @__PURE__ */ _defineComponent17({
|
|
3987
|
+
__name: "upup-uploader",
|
|
3988
|
+
props: {
|
|
3989
|
+
provider: {
|
|
3990
|
+
type: null,
|
|
3991
|
+
required: false
|
|
3992
|
+
},
|
|
3993
|
+
mode: {
|
|
3994
|
+
type: null,
|
|
3995
|
+
required: false
|
|
3996
|
+
},
|
|
3997
|
+
sources: {
|
|
3998
|
+
type: null,
|
|
3999
|
+
required: false
|
|
4000
|
+
},
|
|
4001
|
+
uploadEndpoint: {
|
|
4002
|
+
type: null,
|
|
4003
|
+
required: false
|
|
4004
|
+
},
|
|
4005
|
+
serverUrl: {
|
|
4006
|
+
type: null,
|
|
4007
|
+
required: false
|
|
4008
|
+
},
|
|
4009
|
+
maxFiles: {
|
|
4010
|
+
type: null,
|
|
4011
|
+
required: false
|
|
4012
|
+
},
|
|
4013
|
+
theme: {
|
|
4014
|
+
type: null,
|
|
4015
|
+
required: false
|
|
4016
|
+
},
|
|
4017
|
+
folderUpload: {
|
|
4018
|
+
type: null,
|
|
4019
|
+
required: false
|
|
4020
|
+
},
|
|
4021
|
+
cors: {
|
|
4022
|
+
type: null,
|
|
4023
|
+
required: false
|
|
4024
|
+
},
|
|
4025
|
+
cloudDrives: {
|
|
4026
|
+
type: null,
|
|
4027
|
+
required: false
|
|
4028
|
+
},
|
|
4029
|
+
imageCompression: {
|
|
4030
|
+
type: Boolean,
|
|
4031
|
+
required: false,
|
|
4032
|
+
skipCheck: true
|
|
4033
|
+
},
|
|
4034
|
+
thumbnailGenerator: {
|
|
4035
|
+
type: Boolean,
|
|
4036
|
+
required: false,
|
|
4037
|
+
skipCheck: true
|
|
4038
|
+
},
|
|
4039
|
+
checksumVerification: {
|
|
4040
|
+
type: Boolean,
|
|
4041
|
+
required: false,
|
|
4042
|
+
skipCheck: true
|
|
4043
|
+
},
|
|
4044
|
+
webWorker: {
|
|
4045
|
+
type: Boolean,
|
|
4046
|
+
required: false,
|
|
4047
|
+
skipCheck: true,
|
|
4048
|
+
default: true
|
|
4049
|
+
},
|
|
4050
|
+
heicConversion: {
|
|
4051
|
+
type: Boolean,
|
|
4052
|
+
required: false,
|
|
4053
|
+
skipCheck: true
|
|
4054
|
+
},
|
|
4055
|
+
stripExifData: {
|
|
4056
|
+
type: Boolean,
|
|
4057
|
+
required: false,
|
|
4058
|
+
skipCheck: true
|
|
4059
|
+
},
|
|
4060
|
+
contentDeduplication: {
|
|
4061
|
+
type: Boolean,
|
|
4062
|
+
required: false,
|
|
4063
|
+
skipCheck: true
|
|
4064
|
+
},
|
|
4065
|
+
autoUpload: {
|
|
4066
|
+
type: Boolean,
|
|
4067
|
+
required: false,
|
|
4068
|
+
skipCheck: true
|
|
4069
|
+
},
|
|
4070
|
+
maxConcurrentUploads: {
|
|
4071
|
+
type: null,
|
|
4072
|
+
required: false
|
|
4073
|
+
},
|
|
4074
|
+
crashRecovery: {
|
|
4075
|
+
type: Boolean,
|
|
4076
|
+
required: false,
|
|
4077
|
+
skipCheck: true
|
|
4078
|
+
},
|
|
4079
|
+
networkAware: {
|
|
4080
|
+
type: Boolean,
|
|
4081
|
+
required: false,
|
|
4082
|
+
skipCheck: true
|
|
4083
|
+
},
|
|
4084
|
+
allowedFileTypes: {
|
|
4085
|
+
type: null,
|
|
4086
|
+
required: false
|
|
4087
|
+
},
|
|
4088
|
+
allowPreview: {
|
|
4089
|
+
type: Boolean,
|
|
4090
|
+
required: false,
|
|
4091
|
+
skipCheck: true,
|
|
4092
|
+
default: true
|
|
4093
|
+
},
|
|
4094
|
+
showBranding: {
|
|
4095
|
+
type: Boolean,
|
|
4096
|
+
required: false,
|
|
4097
|
+
skipCheck: true,
|
|
4098
|
+
default: true
|
|
4099
|
+
},
|
|
4100
|
+
quietCompletion: {
|
|
4101
|
+
type: Boolean,
|
|
4102
|
+
required: false,
|
|
4103
|
+
skipCheck: true
|
|
4104
|
+
},
|
|
4105
|
+
animations: {
|
|
4106
|
+
type: Boolean,
|
|
4107
|
+
required: false,
|
|
4108
|
+
skipCheck: true
|
|
4109
|
+
},
|
|
4110
|
+
disableDragDrop: {
|
|
4111
|
+
type: Boolean,
|
|
4112
|
+
required: false,
|
|
4113
|
+
skipCheck: true
|
|
4114
|
+
},
|
|
4115
|
+
className: {
|
|
4116
|
+
type: null,
|
|
4117
|
+
required: false
|
|
4118
|
+
},
|
|
4119
|
+
isProcessing: {
|
|
4120
|
+
type: Boolean,
|
|
4121
|
+
required: false,
|
|
4122
|
+
skipCheck: true
|
|
4123
|
+
},
|
|
4124
|
+
mini: {
|
|
4125
|
+
type: Boolean,
|
|
4126
|
+
required: false,
|
|
4127
|
+
skipCheck: true
|
|
4128
|
+
},
|
|
4129
|
+
maxFileSize: {
|
|
4130
|
+
type: null,
|
|
4131
|
+
required: false
|
|
4132
|
+
},
|
|
4133
|
+
minFileSize: {
|
|
4134
|
+
type: null,
|
|
4135
|
+
required: false
|
|
4136
|
+
},
|
|
4137
|
+
maxTotalFileSize: {
|
|
4138
|
+
type: null,
|
|
4139
|
+
required: false
|
|
4140
|
+
},
|
|
4141
|
+
imageEditor: {
|
|
4142
|
+
type: [Boolean, Object],
|
|
4143
|
+
required: false,
|
|
4144
|
+
skipCheck: true
|
|
4145
|
+
},
|
|
4146
|
+
metadata: {
|
|
4147
|
+
type: null,
|
|
4148
|
+
required: false
|
|
4149
|
+
},
|
|
4150
|
+
maxRetries: {
|
|
4151
|
+
type: null,
|
|
4152
|
+
required: false
|
|
4153
|
+
},
|
|
4154
|
+
resumable: {
|
|
4155
|
+
type: null,
|
|
4156
|
+
required: false
|
|
4157
|
+
},
|
|
4158
|
+
i18n: {
|
|
4159
|
+
type: null,
|
|
4160
|
+
required: false
|
|
4161
|
+
},
|
|
4162
|
+
onFilesSelected: {
|
|
4163
|
+
type: Function,
|
|
4164
|
+
required: false,
|
|
4165
|
+
skipCheck: true
|
|
4166
|
+
},
|
|
4167
|
+
onDoneClicked: {
|
|
4168
|
+
type: Function,
|
|
4169
|
+
required: false,
|
|
4170
|
+
skipCheck: true
|
|
4171
|
+
},
|
|
4172
|
+
onPrepareFiles: {
|
|
4173
|
+
type: Function,
|
|
4174
|
+
required: false,
|
|
4175
|
+
skipCheck: true
|
|
4176
|
+
},
|
|
4177
|
+
onFileClick: {
|
|
4178
|
+
type: Function,
|
|
4179
|
+
required: false,
|
|
4180
|
+
skipCheck: true
|
|
4181
|
+
},
|
|
4182
|
+
onIntegrationClick: {
|
|
4183
|
+
type: Function,
|
|
4184
|
+
required: false,
|
|
4185
|
+
skipCheck: true
|
|
4186
|
+
},
|
|
4187
|
+
onFileUploadStart: {
|
|
4188
|
+
type: Function,
|
|
4189
|
+
required: false,
|
|
4190
|
+
skipCheck: true
|
|
4191
|
+
},
|
|
4192
|
+
onFileUploadComplete: {
|
|
4193
|
+
type: Function,
|
|
4194
|
+
required: false,
|
|
4195
|
+
skipCheck: true
|
|
4196
|
+
},
|
|
4197
|
+
onFilesUploadComplete: {
|
|
4198
|
+
type: Function,
|
|
4199
|
+
required: false,
|
|
4200
|
+
skipCheck: true
|
|
4201
|
+
},
|
|
4202
|
+
onFileUploadProgress: {
|
|
4203
|
+
type: Function,
|
|
4204
|
+
required: false,
|
|
4205
|
+
skipCheck: true
|
|
4206
|
+
},
|
|
4207
|
+
onFilesUploadProgress: {
|
|
4208
|
+
type: Function,
|
|
4209
|
+
required: false,
|
|
4210
|
+
skipCheck: true
|
|
4211
|
+
},
|
|
4212
|
+
onUploadStart: {
|
|
4213
|
+
type: Function,
|
|
4214
|
+
required: false,
|
|
4215
|
+
skipCheck: true
|
|
4216
|
+
},
|
|
4217
|
+
onUploadComplete: {
|
|
4218
|
+
type: Function,
|
|
4219
|
+
required: false,
|
|
4220
|
+
skipCheck: true
|
|
4221
|
+
},
|
|
4222
|
+
onStatusChange: {
|
|
4223
|
+
type: Function,
|
|
4224
|
+
required: false,
|
|
4225
|
+
skipCheck: true
|
|
4226
|
+
},
|
|
4227
|
+
onFileRemoved: {
|
|
4228
|
+
type: Function,
|
|
4229
|
+
required: false,
|
|
4230
|
+
skipCheck: true
|
|
4231
|
+
},
|
|
4232
|
+
onFilesDragOver: {
|
|
4233
|
+
type: Function,
|
|
4234
|
+
required: false,
|
|
4235
|
+
skipCheck: true
|
|
4236
|
+
},
|
|
4237
|
+
onFilesDragLeave: {
|
|
4238
|
+
type: Function,
|
|
4239
|
+
required: false,
|
|
4240
|
+
skipCheck: true
|
|
4241
|
+
},
|
|
4242
|
+
onFilesDrop: {
|
|
4243
|
+
type: Function,
|
|
4244
|
+
required: false,
|
|
4245
|
+
skipCheck: true
|
|
4246
|
+
},
|
|
4247
|
+
onFileTypeMismatch: {
|
|
4248
|
+
type: Function,
|
|
4249
|
+
required: false,
|
|
4250
|
+
skipCheck: true
|
|
4251
|
+
},
|
|
4252
|
+
onRestrictionFailed: {
|
|
4253
|
+
type: Function,
|
|
4254
|
+
required: false,
|
|
4255
|
+
skipCheck: true
|
|
4256
|
+
},
|
|
4257
|
+
enablePaste: {
|
|
4258
|
+
type: Boolean,
|
|
4259
|
+
required: false,
|
|
4260
|
+
skipCheck: true
|
|
4261
|
+
},
|
|
4262
|
+
onBeforeFileAdded: {
|
|
4263
|
+
type: Function,
|
|
4264
|
+
required: false,
|
|
4265
|
+
skipCheck: true
|
|
4266
|
+
},
|
|
4267
|
+
onError: {
|
|
4268
|
+
type: Function,
|
|
4269
|
+
required: false,
|
|
4270
|
+
skipCheck: true
|
|
4271
|
+
},
|
|
4272
|
+
onWarn: {
|
|
4273
|
+
type: Function,
|
|
4274
|
+
required: false,
|
|
4275
|
+
skipCheck: true
|
|
4276
|
+
},
|
|
4277
|
+
processingEndpoint: {
|
|
4278
|
+
type: null,
|
|
4279
|
+
required: false
|
|
4280
|
+
},
|
|
4281
|
+
onFileProcessed: {
|
|
4282
|
+
type: Function,
|
|
4283
|
+
required: false,
|
|
4284
|
+
skipCheck: true
|
|
4285
|
+
},
|
|
4286
|
+
processingTimeout: {
|
|
4287
|
+
type: null,
|
|
4288
|
+
required: false
|
|
4289
|
+
},
|
|
4290
|
+
icons: {
|
|
4291
|
+
type: null,
|
|
4292
|
+
required: false
|
|
4293
|
+
},
|
|
4294
|
+
style: {
|
|
4295
|
+
type: null,
|
|
4296
|
+
required: false
|
|
4297
|
+
}
|
|
4298
|
+
},
|
|
4299
|
+
setup(__props, { expose: __expose }) {
|
|
4300
|
+
__expose();
|
|
4301
|
+
const props = __props;
|
|
4302
|
+
const ctx = useUploaderController(props);
|
|
4303
|
+
provideUploaderContext(ctx);
|
|
4304
|
+
function onInputChange(e) {
|
|
4305
|
+
var _a;
|
|
4306
|
+
const target = e.target;
|
|
4307
|
+
if ((_a = target.files) == null ? void 0 : _a.length) {
|
|
4308
|
+
ctx.setFiles(Array.from(target.files));
|
|
4309
|
+
target.value = "";
|
|
4310
|
+
}
|
|
4311
|
+
}
|
|
4312
|
+
const __returned__ = {
|
|
4313
|
+
props,
|
|
4314
|
+
ctx,
|
|
4315
|
+
onInputChange,
|
|
4316
|
+
get cn() {
|
|
4317
|
+
return cn15;
|
|
4318
|
+
},
|
|
4319
|
+
UploaderPanel: UploaderPanel_default,
|
|
4320
|
+
ImageEditorStub: ImageEditorStub_default
|
|
4321
|
+
};
|
|
4322
|
+
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
4323
|
+
enumerable: false,
|
|
4324
|
+
value: true
|
|
4325
|
+
});
|
|
4326
|
+
return __returned__;
|
|
4327
|
+
}
|
|
4328
|
+
});
|
|
4329
|
+
var _hoisted_117 = [
|
|
4330
|
+
"data-state",
|
|
4331
|
+
"lang",
|
|
4332
|
+
"dir"
|
|
4333
|
+
];
|
|
4334
|
+
var _hoisted_213 = ["accept", "multiple"];
|
|
4335
|
+
function _sfc_render17(_ctx, _cache, $props, $setup, $data, $options) {
|
|
4336
|
+
var _a, _b, _c;
|
|
4337
|
+
return _openBlock17(), _createElementBlock16("div", {
|
|
4338
|
+
class: _normalizeClass15(`upup-scope upup-h-full upup-w-full ${(_a = $setup.props.className) != null ? _a : ""}`),
|
|
4339
|
+
style: _normalizeStyle7($setup.props.style),
|
|
4340
|
+
"data-testid": "upup-root",
|
|
4341
|
+
"data-upup-slot": "root",
|
|
4342
|
+
"data-state": (_c = (_b = $setup.ctx.upload.uploadStatus.value) == null ? void 0 : _b.toLowerCase()) != null ? _c : "idle",
|
|
4343
|
+
lang: $setup.ctx.lang,
|
|
4344
|
+
dir: $setup.ctx.dir
|
|
4345
|
+
}, [_createElementVNode14(
|
|
4346
|
+
"div",
|
|
4347
|
+
{
|
|
4348
|
+
class: _normalizeClass15($setup.cn("upup-w-full", {
|
|
4349
|
+
"upup-h-[480px] upup-max-w-[600px]": !$setup.ctx.props.mini,
|
|
4350
|
+
"upup-h-auto upup-max-w-[280px]": $setup.ctx.props.mini
|
|
4351
|
+
})),
|
|
4352
|
+
style: _normalizeStyle7($setup.ctx.props.mini ? { aspectRatio: "1 / 1" } : void 0)
|
|
4353
|
+
},
|
|
4354
|
+
[_createElementVNode14(
|
|
4355
|
+
"section",
|
|
4356
|
+
{
|
|
4357
|
+
"data-testid": "upup-container",
|
|
4358
|
+
"aria-labelledby": "drop-instructions",
|
|
4359
|
+
class: _normalizeClass15($setup.cn(`upup-panel-sheen upup-relative ${$setup.ctx.theme.isDark.value ? "upup-panel-sheen-dark upup-bg-gradient-to-b upup-from-[#141b2e] upup-to-[#0a0e1a] upup-ring-1 upup-ring-white/10 upup-shadow-[0_24px_70px_-24px_rgba(2,6,23,0.85)]" : "upup-bg-gradient-to-b upup-from-white upup-to-[#dde6f0] upup-ring-1 upup-ring-slate-200"} upup-flex upup-h-full upup-w-full upup-select-none upup-flex-col upup-gap-3 upup-overflow-hidden upup-rounded-2xl upup-px-5 upup-py-4`, {
|
|
4360
|
+
[$setup.ctx.theme.slotOverrides.containerFull]: $setup.ctx.theme.slotOverrides.containerFull && !$setup.ctx.props.mini,
|
|
4361
|
+
[$setup.ctx.theme.slotOverrides.containerMini]: $setup.ctx.theme.slotOverrides.containerMini && $setup.ctx.props.mini
|
|
4362
|
+
}))
|
|
4363
|
+
},
|
|
4364
|
+
[
|
|
4365
|
+
_renderSlot(_ctx.$slots, "default", {}, () => [_createVNode11($setup["UploaderPanel"])]),
|
|
4366
|
+
$setup.ctx.props.imageEditor.enabled ? (_openBlock17(), _createBlock12($setup["ImageEditorStub"], { key: 0 })) : _createCommentVNode14("v-if", true),
|
|
4367
|
+
_createCommentVNode14(" Branding renders INSIDE UploaderPanel now, so the idle\r\n dashed frame wraps it. ")
|
|
4368
|
+
],
|
|
4369
|
+
2
|
|
4370
|
+
/* CLASS */
|
|
4371
|
+
)],
|
|
4372
|
+
6
|
|
4373
|
+
/* CLASS, STYLE */
|
|
4374
|
+
), _createElementVNode14("input", {
|
|
4375
|
+
ref: "ctx.inputRef",
|
|
4376
|
+
type: "file",
|
|
4377
|
+
accept: $setup.ctx.props.allowedFileTypes,
|
|
4378
|
+
multiple: $setup.ctx.props.multiple,
|
|
4379
|
+
style: { "display": "none" },
|
|
4380
|
+
"data-testid": "upup-file-input",
|
|
4381
|
+
onChange: $setup.onInputChange
|
|
4382
|
+
}, null, 40, _hoisted_213)], 14, _hoisted_117);
|
|
4383
|
+
}
|
|
4384
|
+
var upup_uploader_default = /* @__PURE__ */ export_helper_default(_sfc_main17, [["render", _sfc_render17], ["__file", "C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\vue\\src\\upup-uploader.vue"]]);
|
|
4385
|
+
|
|
4386
|
+
// src/index.ts
|
|
4387
|
+
import { FileSource as FileSource3, StorageProvider, UploadStatus as UploadStatus7 } from "@useupup/core";
|
|
4388
|
+
export {
|
|
4389
|
+
FileSource3 as FileSource,
|
|
4390
|
+
StorageProvider,
|
|
4391
|
+
UploadStatus7 as UploadStatus,
|
|
4392
|
+
upup_uploader_default as UpupUploader,
|
|
4393
|
+
useUploaderContext,
|
|
4394
|
+
useUploaderEditor,
|
|
4395
|
+
useUploaderFiles,
|
|
4396
|
+
useUploaderI18n,
|
|
4397
|
+
useUploaderOptions,
|
|
4398
|
+
useUploaderRuntime,
|
|
4399
|
+
useUploaderSource,
|
|
4400
|
+
useUploaderTheme,
|
|
4401
|
+
useUploaderUploadControls,
|
|
4402
|
+
useUploaderView,
|
|
4403
|
+
useUpupUpload
|
|
4404
|
+
};
|
|
4405
|
+
//# sourceMappingURL=index.js.map
|