@useupup/svelte 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.
Files changed (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/UpupUploader.svelte +96 -0
  4. package/dist/UpupUploader.svelte.d.ts +5 -0
  5. package/dist/UpupUploader.svelte.d.ts.map +1 -0
  6. package/dist/assets/logos.d.ts +5 -0
  7. package/dist/assets/logos.d.ts.map +1 -0
  8. package/dist/assets/logos.js +4 -0
  9. package/dist/components/AudioUploader.svelte +220 -0
  10. package/dist/components/AudioUploader.svelte.d.ts +4 -0
  11. package/dist/components/AudioUploader.svelte.d.ts.map +1 -0
  12. package/dist/components/AudioWaveform.svelte +72 -0
  13. package/dist/components/AudioWaveform.svelte.d.ts +7 -0
  14. package/dist/components/AudioWaveform.svelte.d.ts.map +1 -0
  15. package/dist/components/BoxUploader.svelte +17 -0
  16. package/dist/components/BoxUploader.svelte.d.ts +19 -0
  17. package/dist/components/BoxUploader.svelte.d.ts.map +1 -0
  18. package/dist/components/CameraUploader.svelte +140 -0
  19. package/dist/components/CameraUploader.svelte.d.ts +4 -0
  20. package/dist/components/CameraUploader.svelte.d.ts.map +1 -0
  21. package/dist/components/ClientBoxUploader.svelte +60 -0
  22. package/dist/components/ClientBoxUploader.svelte.d.ts +19 -0
  23. package/dist/components/ClientBoxUploader.svelte.d.ts.map +1 -0
  24. package/dist/components/ClientDropboxUploader.svelte +60 -0
  25. package/dist/components/ClientDropboxUploader.svelte.d.ts +19 -0
  26. package/dist/components/ClientDropboxUploader.svelte.d.ts.map +1 -0
  27. package/dist/components/ClientGoogleDriveUploader.svelte +57 -0
  28. package/dist/components/ClientGoogleDriveUploader.svelte.d.ts +19 -0
  29. package/dist/components/ClientGoogleDriveUploader.svelte.d.ts.map +1 -0
  30. package/dist/components/ClientOneDriveUploader.svelte +60 -0
  31. package/dist/components/ClientOneDriveUploader.svelte.d.ts +19 -0
  32. package/dist/components/ClientOneDriveUploader.svelte.d.ts.map +1 -0
  33. package/dist/components/DefaultAddMoreIcon.svelte +11 -0
  34. package/dist/components/DefaultAddMoreIcon.svelte.d.ts +8 -0
  35. package/dist/components/DefaultAddMoreIcon.svelte.d.ts.map +1 -0
  36. package/dist/components/DefaultLoaderIcon.svelte +5 -0
  37. package/dist/components/DefaultLoaderIcon.svelte.d.ts +19 -0
  38. package/dist/components/DefaultLoaderIcon.svelte.d.ts.map +1 -0
  39. package/dist/components/DropboxUploader.svelte +17 -0
  40. package/dist/components/DropboxUploader.svelte.d.ts +19 -0
  41. package/dist/components/DropboxUploader.svelte.d.ts.map +1 -0
  42. package/dist/components/EmptyIcon.svelte +3 -0
  43. package/dist/components/EmptyIcon.svelte.d.ts +19 -0
  44. package/dist/components/EmptyIcon.svelte.d.ts.map +1 -0
  45. package/dist/components/FileHero.svelte +152 -0
  46. package/dist/components/FileHero.svelte.d.ts +8 -0
  47. package/dist/components/FileHero.svelte.d.ts.map +1 -0
  48. package/dist/components/FileIcon.svelte +23 -0
  49. package/dist/components/FileIcon.svelte.d.ts +8 -0
  50. package/dist/components/FileIcon.svelte.d.ts.map +1 -0
  51. package/dist/components/FileItem.svelte +95 -0
  52. package/dist/components/FileItem.svelte.d.ts +12 -0
  53. package/dist/components/FileItem.svelte.d.ts.map +1 -0
  54. package/dist/components/FileList.svelte +442 -0
  55. package/dist/components/FileList.svelte.d.ts +4 -0
  56. package/dist/components/FileList.svelte.d.ts.map +1 -0
  57. package/dist/components/FilePreview.svelte +218 -0
  58. package/dist/components/FilePreview.svelte.d.ts +17 -0
  59. package/dist/components/FilePreview.svelte.d.ts.map +1 -0
  60. package/dist/components/FilePreviewPortal.svelte +189 -0
  61. package/dist/components/FilePreviewPortal.svelte.d.ts +12 -0
  62. package/dist/components/FilePreviewPortal.svelte.d.ts.map +1 -0
  63. package/dist/components/FilePreviewThumbnail.svelte +87 -0
  64. package/dist/components/FilePreviewThumbnail.svelte.d.ts +17 -0
  65. package/dist/components/FilePreviewThumbnail.svelte.d.ts.map +1 -0
  66. package/dist/components/FileRow.svelte +192 -0
  67. package/dist/components/FileRow.svelte.d.ts +10 -0
  68. package/dist/components/FileRow.svelte.d.ts.map +1 -0
  69. package/dist/components/GoogleDriveUploader.svelte +17 -0
  70. package/dist/components/GoogleDriveUploader.svelte.d.ts +19 -0
  71. package/dist/components/GoogleDriveUploader.svelte.d.ts.map +1 -0
  72. package/dist/components/Icon.svelte +24 -0
  73. package/dist/components/Icon.svelte.d.ts +10 -0
  74. package/dist/components/Icon.svelte.d.ts.map +1 -0
  75. package/dist/components/Icons.d.ts +10 -0
  76. package/dist/components/Icons.d.ts.map +1 -0
  77. package/dist/components/Icons.js +9 -0
  78. package/dist/components/ImageEditorStub.svelte +3 -0
  79. package/dist/components/ImageEditorStub.svelte.d.ts +19 -0
  80. package/dist/components/ImageEditorStub.svelte.d.ts.map +1 -0
  81. package/dist/components/OneDriveUploader.svelte +17 -0
  82. package/dist/components/OneDriveUploader.svelte.d.ts +19 -0
  83. package/dist/components/OneDriveUploader.svelte.d.ts.map +1 -0
  84. package/dist/components/ScreenCaptureUploader.svelte +254 -0
  85. package/dist/components/ScreenCaptureUploader.svelte.d.ts +4 -0
  86. package/dist/components/ScreenCaptureUploader.svelte.d.ts.map +1 -0
  87. package/dist/components/ServerModeDriveUploader.svelte +250 -0
  88. package/dist/components/ServerModeDriveUploader.svelte.d.ts +10 -0
  89. package/dist/components/ServerModeDriveUploader.svelte.d.ts.map +1 -0
  90. package/dist/components/SourceSelector.svelte +292 -0
  91. package/dist/components/SourceSelector.svelte.d.ts +19 -0
  92. package/dist/components/SourceSelector.svelte.d.ts.map +1 -0
  93. package/dist/components/SourceView.svelte +100 -0
  94. package/dist/components/SourceView.svelte.d.ts +4 -0
  95. package/dist/components/SourceView.svelte.d.ts.map +1 -0
  96. package/dist/components/TrashIcon.svelte +11 -0
  97. package/dist/components/TrashIcon.svelte.d.ts +8 -0
  98. package/dist/components/TrashIcon.svelte.d.ts.map +1 -0
  99. package/dist/components/UploaderPanel.svelte +363 -0
  100. package/dist/components/UploaderPanel.svelte.d.ts +4 -0
  101. package/dist/components/UploaderPanel.svelte.d.ts.map +1 -0
  102. package/dist/components/UrlUploader.svelte +71 -0
  103. package/dist/components/UrlUploader.svelte.d.ts +4 -0
  104. package/dist/components/UrlUploader.svelte.d.ts.map +1 -0
  105. package/dist/components/icons/AudioIcon.svelte +5 -0
  106. package/dist/components/icons/AudioIcon.svelte.d.ts +7 -0
  107. package/dist/components/icons/AudioIcon.svelte.d.ts.map +1 -0
  108. package/dist/components/icons/BoxIcon.svelte +5 -0
  109. package/dist/components/icons/BoxIcon.svelte.d.ts +7 -0
  110. package/dist/components/icons/BoxIcon.svelte.d.ts.map +1 -0
  111. package/dist/components/icons/CameraIcon.svelte +5 -0
  112. package/dist/components/icons/CameraIcon.svelte.d.ts +7 -0
  113. package/dist/components/icons/CameraIcon.svelte.d.ts.map +1 -0
  114. package/dist/components/icons/DropboxIcon.svelte +5 -0
  115. package/dist/components/icons/DropboxIcon.svelte.d.ts +7 -0
  116. package/dist/components/icons/DropboxIcon.svelte.d.ts.map +1 -0
  117. package/dist/components/icons/GoogleDriveIcon.svelte +5 -0
  118. package/dist/components/icons/GoogleDriveIcon.svelte.d.ts +7 -0
  119. package/dist/components/icons/GoogleDriveIcon.svelte.d.ts.map +1 -0
  120. package/dist/components/icons/LinkIcon.svelte +5 -0
  121. package/dist/components/icons/LinkIcon.svelte.d.ts +7 -0
  122. package/dist/components/icons/LinkIcon.svelte.d.ts.map +1 -0
  123. package/dist/components/icons/MyDeviceIcon.svelte +5 -0
  124. package/dist/components/icons/MyDeviceIcon.svelte.d.ts +7 -0
  125. package/dist/components/icons/MyDeviceIcon.svelte.d.ts.map +1 -0
  126. package/dist/components/icons/OneDriveIcon.svelte +5 -0
  127. package/dist/components/icons/OneDriveIcon.svelte.d.ts +7 -0
  128. package/dist/components/icons/OneDriveIcon.svelte.d.ts.map +1 -0
  129. package/dist/components/icons/ScreenCaptureIcon.svelte +5 -0
  130. package/dist/components/icons/ScreenCaptureIcon.svelte.d.ts +7 -0
  131. package/dist/components/icons/ScreenCaptureIcon.svelte.d.ts.map +1 -0
  132. package/dist/components/shared/DriveAuthFallback.svelte +60 -0
  133. package/dist/components/shared/DriveAuthFallback.svelte.d.ts +12 -0
  134. package/dist/components/shared/DriveAuthFallback.svelte.d.ts.map +1 -0
  135. package/dist/components/shared/DriveBrowser.svelte +209 -0
  136. package/dist/components/shared/DriveBrowser.svelte.d.ts +25 -0
  137. package/dist/components/shared/DriveBrowser.svelte.d.ts.map +1 -0
  138. package/dist/components/shared/DriveBrowserHeader.svelte +191 -0
  139. package/dist/components/shared/DriveBrowserHeader.svelte.d.ts +14 -0
  140. package/dist/components/shared/DriveBrowserHeader.svelte.d.ts.map +1 -0
  141. package/dist/components/shared/DriveBrowserIcon.svelte +39 -0
  142. package/dist/components/shared/DriveBrowserIcon.svelte.d.ts +8 -0
  143. package/dist/components/shared/DriveBrowserIcon.svelte.d.ts.map +1 -0
  144. package/dist/components/shared/DriveBrowserItem.svelte +63 -0
  145. package/dist/components/shared/DriveBrowserItem.svelte.d.ts +10 -0
  146. package/dist/components/shared/DriveBrowserItem.svelte.d.ts.map +1 -0
  147. package/dist/components/shared/FileSuccessCheck.svelte +47 -0
  148. package/dist/components/shared/FileSuccessCheck.svelte.d.ts +10 -0
  149. package/dist/components/shared/FileSuccessCheck.svelte.d.ts.map +1 -0
  150. package/dist/components/shared/ProgressBar.svelte +81 -0
  151. package/dist/components/shared/ProgressBar.svelte.d.ts +10 -0
  152. package/dist/components/shared/ProgressBar.svelte.d.ts.map +1 -0
  153. package/dist/components/shared/SourceViewContainer.svelte +27 -0
  154. package/dist/components/shared/SourceViewContainer.svelte.d.ts +10 -0
  155. package/dist/components/shared/SourceViewContainer.svelte.d.ts.map +1 -0
  156. package/dist/components/shared/UploaderHeader.svelte +156 -0
  157. package/dist/components/shared/UploaderHeader.svelte.d.ts +13 -0
  158. package/dist/components/shared/UploaderHeader.svelte.d.ts.map +1 -0
  159. package/dist/composables/use-tiles-per-row.d.ts +19 -0
  160. package/dist/composables/use-tiles-per-row.d.ts.map +1 -0
  161. package/dist/composables/use-tiles-per-row.js +30 -0
  162. package/dist/composables/useBox.d.ts +28 -0
  163. package/dist/composables/useBox.d.ts.map +1 -0
  164. package/dist/composables/useBox.js +61 -0
  165. package/dist/composables/useCameraUploader.d.ts +23 -0
  166. package/dist/composables/useCameraUploader.d.ts.map +1 -0
  167. package/dist/composables/useCameraUploader.js +114 -0
  168. package/dist/composables/useDropbox.d.ts +28 -0
  169. package/dist/composables/useDropbox.d.ts.map +1 -0
  170. package/dist/composables/useDropbox.js +61 -0
  171. package/dist/composables/useFetchFileByUrl.d.ts +9 -0
  172. package/dist/composables/useFetchFileByUrl.d.ts.map +1 -0
  173. package/dist/composables/useFetchFileByUrl.js +33 -0
  174. package/dist/composables/useGoogleDrive.d.ts +28 -0
  175. package/dist/composables/useGoogleDrive.d.ts.map +1 -0
  176. package/dist/composables/useGoogleDrive.js +65 -0
  177. package/dist/composables/useOneDrive.d.ts +29 -0
  178. package/dist/composables/useOneDrive.d.ts.map +1 -0
  179. package/dist/composables/useOneDrive.js +64 -0
  180. package/dist/composables/useSSEProcessing.d.ts +20 -0
  181. package/dist/composables/useSSEProcessing.d.ts.map +1 -0
  182. package/dist/composables/useSSEProcessing.js +17 -0
  183. package/dist/composables/useServerModeDrive.d.ts +17 -0
  184. package/dist/composables/useServerModeDrive.d.ts.map +1 -0
  185. package/dist/composables/useServerModeDrive.js +33 -0
  186. package/dist/composables/useSourceSelector.d.ts +13 -0
  187. package/dist/composables/useSourceSelector.d.ts.map +1 -0
  188. package/dist/composables/useSourceSelector.js +36 -0
  189. package/dist/composables/useUploaderPanel.d.ts +12 -0
  190. package/dist/composables/useUploaderPanel.d.ts.map +1 -0
  191. package/dist/composables/useUploaderPanel.js +43 -0
  192. package/dist/context/create-uploader-context.d.ts +4 -0
  193. package/dist/context/create-uploader-context.d.ts.map +1 -0
  194. package/dist/context/create-uploader-context.js +324 -0
  195. package/dist/context/source-view-header-extra.d.ts +14 -0
  196. package/dist/context/source-view-header-extra.d.ts.map +1 -0
  197. package/dist/context/source-view-header-extra.js +41 -0
  198. package/dist/context/uploader-context.d.ts +109 -0
  199. package/dist/context/uploader-context.d.ts.map +1 -0
  200. package/dist/context/uploader-context.js +96 -0
  201. package/dist/index.d.ts +10 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +5 -0
  204. package/dist/lib/constants.d.ts +13 -0
  205. package/dist/lib/constants.d.ts.map +1 -0
  206. package/dist/lib/constants.js +67 -0
  207. package/dist/lib/to-readable.d.ts +14 -0
  208. package/dist/lib/to-readable.d.ts.map +1 -0
  209. package/dist/lib/to-readable.js +15 -0
  210. package/dist/lib/view-mode.d.ts +24 -0
  211. package/dist/lib/view-mode.d.ts.map +1 -0
  212. package/dist/lib/view-mode.js +31 -0
  213. package/dist/shared/types.d.ts +15 -0
  214. package/dist/shared/types.d.ts.map +1 -0
  215. package/dist/shared/types.js +1 -0
  216. package/dist/styles.d.ts +4 -0
  217. package/dist/tailwind-prefixed.css +2479 -0
  218. package/dist/tailwind.css +74 -0
  219. package/dist/use-upup-upload.d.ts +38 -0
  220. package/dist/use-upup-upload.d.ts.map +1 -0
  221. package/dist/use-upup-upload.js +81 -0
  222. package/package.json +101 -0
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { useUploaderRuntime, useUploaderSource } from '../context/uploader-context'
3
+ import ClientOneDriveUploader from './ClientOneDriveUploader.svelte'
4
+ import ServerModeDriveUploader from './ServerModeDriveUploader.svelte'
5
+
6
+ const { mode } = useUploaderRuntime()
7
+ const { setActiveSource } = useUploaderSource()
8
+ </script>
9
+
10
+ {#if mode === 'server'}
11
+ <ServerModeDriveUploader
12
+ provider="one-drive"
13
+ onBack={() => setActiveSource(undefined)}
14
+ />
15
+ {:else}
16
+ <ClientOneDriveUploader />
17
+ {/if}
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const OneDriveUploader: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type OneDriveUploader = InstanceType<typeof OneDriveUploader>;
18
+ export default OneDriveUploader;
19
+ //# sourceMappingURL=OneDriveUploader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OneDriveUploader.svelte.d.ts","sourceRoot":"","sources":["../../src/components/OneDriveUploader.svelte.ts"],"names":[],"mappings":"AAwBA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,gBAAgB;;kBAA+E,CAAC;AACpF,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,254 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte'
3
+ import {
4
+ useUploaderFiles,
5
+ useUploaderSource,
6
+ useUploaderTheme,
7
+ } from '../context/uploader-context'
8
+ import { cn } from '@useupup/core/internal'
9
+ import SourceViewContainer from './shared/SourceViewContainer.svelte'
10
+
11
+ type RecordingState = 'idle' | 'recording' | 'recorded'
12
+
13
+ const { setFiles } = useUploaderFiles()
14
+ const { setActiveSource } = useUploaderSource()
15
+ const { isDark: dark } = useUploaderTheme()
16
+
17
+ let recordingState: RecordingState = $state('idle')
18
+ let duration = $state(0)
19
+ let videoUrl: string | null = $state(null)
20
+ let error: string | null = $state(null)
21
+
22
+ let mediaRecorder: MediaRecorder | null = null
23
+ const chunks: Blob[] = []
24
+ let timerHandle: ReturnType<typeof setInterval> | null = null
25
+ let streamRef: MediaStream | null = null
26
+ let previewEl: HTMLVideoElement | null = null
27
+
28
+ onDestroy(() => {
29
+ if (timerHandle) clearInterval(timerHandle)
30
+ if (videoUrl) URL.revokeObjectURL(videoUrl)
31
+ streamRef?.getTracks().forEach((t) => t.stop())
32
+ })
33
+
34
+ function bindPreview(node: HTMLVideoElement) {
35
+ previewEl = node
36
+ if (streamRef) {
37
+ node.srcObject = streamRef
38
+ void node.play()?.catch(() => {})
39
+ }
40
+ return {
41
+ destroy() {
42
+ if (previewEl === node) previewEl = null
43
+ },
44
+ }
45
+ }
46
+
47
+ async function startRecording() {
48
+ try {
49
+ const stream = await navigator.mediaDevices.getDisplayMedia({
50
+ video: true,
51
+ audio: true,
52
+ })
53
+ streamRef = stream
54
+ chunks.length = 0
55
+
56
+ const videoTrack = stream.getVideoTracks()[0]
57
+ if (videoTrack) {
58
+ videoTrack.onended = () => {
59
+ if (mediaRecorder && mediaRecorder.state !== 'inactive') {
60
+ mediaRecorder.stop()
61
+ }
62
+ if (timerHandle) clearInterval(timerHandle)
63
+ recordingState = 'recorded'
64
+ }
65
+ }
66
+
67
+ const recorder = new MediaRecorder(stream)
68
+ mediaRecorder = recorder
69
+
70
+ recorder.ondataavailable = (e) => {
71
+ if (e.data.size > 0) chunks.push(e.data)
72
+ }
73
+
74
+ recorder.onstop = () => {
75
+ const blob = new Blob(chunks, { type: recorder.mimeType || 'video/webm' })
76
+ videoUrl = URL.createObjectURL(blob)
77
+ stream.getTracks().forEach((t) => t.stop())
78
+ if (previewEl) previewEl.srcObject = null
79
+ }
80
+
81
+ recorder.start()
82
+ recordingState = 'recording'
83
+ duration = 0
84
+ timerHandle = setInterval(() => { duration++ }, 1000)
85
+ } catch {
86
+ error = 'Screen sharing was cancelled or denied. Please try again.'
87
+ }
88
+ }
89
+
90
+ function stopRecording() {
91
+ mediaRecorder?.stop()
92
+ if (timerHandle) clearInterval(timerHandle)
93
+ recordingState = 'recorded'
94
+ }
95
+
96
+ function discardRecording() {
97
+ if (videoUrl) URL.revokeObjectURL(videoUrl)
98
+ videoUrl = null
99
+ duration = 0
100
+ recordingState = 'idle'
101
+ }
102
+
103
+ function addRecording() {
104
+ if (!videoUrl) return
105
+ fetch(videoUrl)
106
+ .then((r) => r.blob())
107
+ .then((blob) => {
108
+ const file = new File([blob], `screen-recording-${Date.now()}.webm`, { type: blob.type })
109
+ setFiles([file])
110
+ setActiveSource(undefined)
111
+ })
112
+ .catch(() => {
113
+ // upup-catch: replaying an in-memory object URL cannot fail in practice; ignore
114
+ })
115
+ }
116
+
117
+ function retryRecording() {
118
+ error = null
119
+ startRecording()
120
+ }
121
+
122
+ function formatTime(s: number) {
123
+ const m = Math.floor(s / 60)
124
+ const sec = s % 60
125
+ return `${m}:${sec.toString().padStart(2, '0')}`
126
+ }
127
+ </script>
128
+
129
+ {#if error}
130
+ <!-- Error state -->
131
+ <SourceViewContainer data-upup-slot="screen-capture-uploader">
132
+ <div class="upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center">
133
+ <p
134
+ class={cn('upup-text-sm upup-text-red-500', {
135
+ 'upup-text-red-400': $dark,
136
+ })}
137
+ >
138
+ {error}
139
+ </p>
140
+ <button
141
+ type="button"
142
+ class={cn(
143
+ 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white',
144
+ {
145
+ 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': $dark,
146
+ },
147
+ )}
148
+ onclick={retryRecording}
149
+ >
150
+ Try Again
151
+ </button>
152
+ </div>
153
+ </SourceViewContainer>
154
+ {:else}
155
+ <!-- Normal state -->
156
+ <SourceViewContainer data-upup-slot="screen-capture-uploader">
157
+ <div class="upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-4">
158
+ <!-- Idle -->
159
+ {#if recordingState === 'idle'}
160
+ <div class="upup-flex upup-flex-col upup-items-center upup-gap-4">
161
+ <div class="upup-flex upup-h-20 upup-w-20 upup-items-center upup-justify-center upup-rounded-full upup-bg-[#0ea5e9]/20">
162
+ <svg
163
+ xmlns="http://www.w3.org/2000/svg"
164
+ width="32"
165
+ height="32"
166
+ viewBox="0 0 24 24"
167
+ fill="none"
168
+ stroke={$dark ? '#38bdf8' : '#0284c7'}
169
+ stroke-width="2"
170
+ stroke-linecap="round"
171
+ stroke-linejoin="round"
172
+ >
173
+ <rect width="20" height="15" x="2" y="3" rx="2" />
174
+ <polyline points="8 21 16 21" />
175
+ <line x1="12" x2="12" y1="18" y2="21" />
176
+ </svg>
177
+ </div>
178
+ <button
179
+ type="button"
180
+ class={cn(
181
+ 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',
182
+ {
183
+ 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]': $dark,
184
+ },
185
+ )}
186
+ onclick={startRecording}
187
+ >
188
+ Share Screen
189
+ </button>
190
+ </div>
191
+ {/if}
192
+
193
+ <!-- Recording -->
194
+ {#if recordingState === 'recording'}
195
+ <div class="upup-relative upup-flex upup-min-h-0 upup-w-full upup-max-w-md upup-flex-1">
196
+ <!-- svelte-ignore a11y_media_has_caption -->
197
+ <video
198
+ use:bindPreview
199
+ muted
200
+ class="upup-min-h-0 upup-w-full upup-flex-1 upup-rounded-lg upup-object-contain"
201
+ ></video>
202
+ <!-- REC chip (states-tour-3 state E): red dot + label + timer.
203
+ The dot's pulse is fx-gated — under motion-off the dot
204
+ stays static so the recording status remains visible. -->
205
+ <div
206
+ data-upup-slot="screen-rec-chip"
207
+ class="upup-absolute upup-left-2.5 upup-top-2.5 upup-flex upup-items-center upup-gap-1.5 upup-rounded-md upup-bg-[#04080f]/60 upup-px-2 upup-py-1 upup-font-mono upup-text-[11px] upup-tabular-nums upup-text-[#fecdd3]"
208
+ >
209
+ <span class="upup-animate-fx-rec-pulse upup-h-2 upup-w-2 upup-rounded-full upup-bg-red-500"></span>
210
+ REC {formatTime(duration)}
211
+ </div>
212
+ </div>
213
+ <button
214
+ type="button"
215
+ class="upup-fx-press upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600"
216
+ onclick={stopRecording}
217
+ >
218
+ Stop Recording
219
+ </button>
220
+ {/if}
221
+
222
+ <!-- Recorded -->
223
+ {#if recordingState === 'recorded' && videoUrl}
224
+ <!-- svelte-ignore a11y_media_has_caption -->
225
+ <video
226
+ controls
227
+ src={videoUrl}
228
+ class="upup-w-full upup-max-w-md upup-min-h-0 upup-flex-1 upup-rounded-lg upup-object-contain"
229
+ ></video>
230
+ <div class="upup-flex upup-gap-3">
231
+ <button
232
+ type="button"
233
+ class="upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600"
234
+ onclick={discardRecording}
235
+ >
236
+ Discard
237
+ </button>
238
+ <button
239
+ type="button"
240
+ class={cn(
241
+ 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',
242
+ {
243
+ 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]': $dark,
244
+ },
245
+ )}
246
+ onclick={addRecording}
247
+ >
248
+ Add Recording
249
+ </button>
250
+ </div>
251
+ {/if}
252
+ </div>
253
+ </SourceViewContainer>
254
+ {/if}
@@ -0,0 +1,4 @@
1
+ declare const ScreenCaptureUploader: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ScreenCaptureUploader = ReturnType<typeof ScreenCaptureUploader>;
3
+ export default ScreenCaptureUploader;
4
+ //# sourceMappingURL=ScreenCaptureUploader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenCaptureUploader.svelte.d.ts","sourceRoot":"","sources":["../../src/components/ScreenCaptureUploader.svelte.ts"],"names":[],"mappings":"AA4NA,QAAA,MAAM,qBAAqB,2DAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,250 @@
1
+ <script lang="ts">
2
+ import { writable, derived } from 'svelte/store'
3
+ import { untrack } from 'svelte'
4
+ import { errorCodeToMessageKey } from '@useupup/core'
5
+ import { cn } from '@useupup/core/internal'
6
+ import {
7
+ useUploaderI18n,
8
+ useUploaderOptions,
9
+ useUploaderTheme,
10
+ } from '../context/uploader-context'
11
+ import {
12
+ useServerModeDrive,
13
+ type ServerDriveFile,
14
+ type ServerModeProvider,
15
+ } from '../composables/useServerModeDrive'
16
+ import SourceViewContainer from './shared/SourceViewContainer.svelte'
17
+ import DriveAuthFallback from './shared/DriveAuthFallback.svelte'
18
+
19
+ let {
20
+ provider,
21
+ onBack,
22
+ dataUpupSlot,
23
+ }: {
24
+ provider: ServerModeProvider
25
+ onBack?: () => void
26
+ dataUpupSlot?: string
27
+ } = $props()
28
+
29
+ const PROVIDER_LABEL: Record<ServerModeProvider, string> = {
30
+ 'google-drive': 'Google Drive',
31
+ 'one-drive': 'OneDrive',
32
+ 'dropbox': 'Dropbox',
33
+ 'box': 'Box',
34
+ }
35
+
36
+ // provider and dataUpupSlot are static props (set once at call sites — never changed).
37
+ // untrack() tells Svelte we intentionally read their initial values outside reactive context.
38
+ const resolvedSlot = untrack(() => dataUpupSlot ?? `drive-browser-${provider}`)
39
+ const { state, search, setSearch, refresh, transfer, startAuth } =
40
+ untrack(() => useServerModeDrive(provider))
41
+
42
+ const { isDark: dark } = useUploaderTheme()
43
+ const { icons } = useUploaderOptions()
44
+ const { translator } = useUploaderI18n()
45
+ const Loader = icons.LoaderIcon
46
+
47
+ const errorText = derived(state, ($state) => {
48
+ if ($state.status !== 'error') return ''
49
+ return $state.code && translator
50
+ ? translator(`errors.${errorCodeToMessageKey($state.code)}`, {
51
+ code: $state.code,
52
+ })
53
+ : $state.message
54
+ })
55
+
56
+ const selected = writable<Set<string>>(new Set())
57
+ const transferring = writable(false)
58
+
59
+ const isLoading = derived(state, ($state) =>
60
+ $state.status === 'loading' || $state.status === 'idle',
61
+ )
62
+ const files = derived(state, ($state): ServerDriveFile[] =>
63
+ $state.status === 'ready' ? $state.files : [],
64
+ )
65
+
66
+ function toggle(id: string) {
67
+ selected.update((prev) => {
68
+ const next = new Set(prev)
69
+ if (next.has(id)) next.delete(id)
70
+ else next.add(id)
71
+ return next
72
+ })
73
+ }
74
+
75
+ async function handleTransfer() {
76
+ transferring.set(true)
77
+ try {
78
+ for (const file of $files.filter((f) => $selected.has(f.id))) {
79
+ const result = await transfer(file)
80
+ if (result.status === 'reauth') {
81
+ startAuth()
82
+ return
83
+ }
84
+ }
85
+ selected.set(new Set())
86
+ onBack?.()
87
+ } finally {
88
+ transferring.set(false)
89
+ }
90
+ }
91
+
92
+ function formatBytes(bytes: number): string {
93
+ if (bytes < 1024) return `${bytes} B`
94
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
95
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
96
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`
97
+ }
98
+ </script>
99
+
100
+ {#if $state.status === 'reauth'}
101
+ <DriveAuthFallback
102
+ providerName={PROVIDER_LABEL[provider]}
103
+ onRetry={startAuth}
104
+ />
105
+ {:else}
106
+ <SourceViewContainer
107
+ isLoading={$isLoading}
108
+ data-upup-slot={resolvedSlot}
109
+ >
110
+ {#if $isLoading}
111
+ <Loader />
112
+ {:else}
113
+ <div
114
+ data-testid="upup-server-drive-browser"
115
+ class="upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto"
116
+ >
117
+ <div
118
+ class={cn(
119
+ 'upup-flex upup-items-center upup-gap-2 upup-border-b upup-px-3 upup-py-2.5',
120
+ $dark
121
+ ? 'upup-border-white/[0.06] upup-text-[#e2e8f0]'
122
+ : 'upup-border-black/[0.06] upup-text-gray-800',
123
+ )}
124
+ data-upup-slot="drive-browser-header"
125
+ >
126
+ <span class="upup-text-sm upup-font-medium">
127
+ {PROVIDER_LABEL[provider]}
128
+ </span>
129
+ <input
130
+ type="search"
131
+ name="upup-drive-search"
132
+ aria-label="Search"
133
+ value={$search}
134
+ oninput={(e) => setSearch((e.target as HTMLInputElement).value)}
135
+ onkeydown={(e) => {
136
+ if (e.key === 'Enter') {
137
+ void refresh({ search: (e.target as HTMLInputElement).value })
138
+ }
139
+ }}
140
+ placeholder="Search…"
141
+ class={cn(
142
+ 'upup-ml-auto upup-rounded upup-border upup-px-2 upup-py-1 upup-text-xs',
143
+ $dark
144
+ ? 'upup-border-gray-700 upup-bg-gray-800 upup-text-gray-100'
145
+ : 'upup-border-gray-300 upup-bg-white',
146
+ )}
147
+ />
148
+ </div>
149
+ <div class="upup-overflow-auto upup-p-2">
150
+ {#if $state.status === 'error'}
151
+ <p
152
+ data-testid="upup-drive-error"
153
+ data-upup-slot="drive-error"
154
+ role="alert"
155
+ class={cn(
156
+ 'upup-p-4 upup-text-sm',
157
+ $dark ? 'upup-text-red-400' : 'upup-text-red-600',
158
+ )}
159
+ >
160
+ {$errorText}
161
+ </p>
162
+ {/if}
163
+ {#each $files as file (file.id)}
164
+ <button
165
+ type="button"
166
+ data-upup-slot="drive-browser-item"
167
+ data-selected={$selected.has(file.id)}
168
+ class={cn(
169
+ 'upup-fx-hover-lift upup-mb-1.5 upup-flex upup-w-full upup-items-center upup-gap-3 upup-rounded-[11px] upup-px-3 upup-py-2.5 upup-text-left upup-text-sm upup-ring-1',
170
+ $selected.has(file.id)
171
+ ? 'upup-bg-[#0ea5e9]/10 upup-ring-[#38bdf8]/35'
172
+ : $dark
173
+ ? 'upup-bg-white/[0.04] upup-text-[#e2e8f0] upup-ring-white/[0.06] hover:upup-bg-white/[0.07]'
174
+ : 'upup-bg-black/[0.03] upup-text-gray-800 upup-ring-black/[0.06] hover:upup-bg-black/[0.05]',
175
+ )}
176
+ onclick={() =>
177
+ file.isFolder
178
+ ? void refresh({ folderId: file.id })
179
+ : toggle(file.id)}
180
+ >
181
+ <span
182
+ class="upup-flex upup-h-[30px] upup-w-[30px] upup-flex-none upup-items-center upup-justify-center upup-rounded-[8px] upup-bg-white/[0.05]"
183
+ aria-hidden="true"
184
+ >
185
+ {#if file.isFolder}
186
+ <svg
187
+ viewBox="0 0 24 24"
188
+ width="17"
189
+ height="17"
190
+ fill="none"
191
+ stroke="#38bdf8"
192
+ stroke-width="1.7"
193
+ stroke-linecap="round"
194
+ stroke-linejoin="round"
195
+ >
196
+ <path d="M3 7a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
197
+ </svg>
198
+ {:else}
199
+ <svg
200
+ viewBox="0 0 24 24"
201
+ width="17"
202
+ height="17"
203
+ fill="none"
204
+ stroke={$dark ? '#94a3b8' : '#64748b'}
205
+ stroke-width="1.6"
206
+ stroke-linecap="round"
207
+ stroke-linejoin="round"
208
+ >
209
+ <path d="M6 3h8l4 4v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z" />
210
+ <path d="M14 3v4h4" />
211
+ </svg>
212
+ {/if}
213
+ </span>
214
+ <span class="upup-flex-1 upup-truncate">{file.name}</span>
215
+ {#if file.size != null && !file.isFolder}
216
+ <span class="upup-text-xs upup-opacity-60">
217
+ {formatBytes(file.size)}
218
+ </span>
219
+ {/if}
220
+ </button>
221
+ {/each}
222
+ </div>
223
+ <div
224
+ class={cn(
225
+ 'upup-flex upup-items-center upup-justify-between upup-gap-2 upup-border-t upup-p-3',
226
+ $dark ? 'upup-border-white/[0.06]' : 'upup-border-black/[0.06]',
227
+ )}
228
+ >
229
+ <button
230
+ type="button"
231
+ class="upup-text-sm upup-opacity-70 hover:upup-opacity-100"
232
+ onclick={() => onBack?.()}
233
+ >
234
+ Cancel
235
+ </button>
236
+ <button
237
+ type="button"
238
+ disabled={$selected.size === 0 || $transferring}
239
+ class="upup-fx-press upup-rounded-lg upup-bg-[#0ea5e9] upup-px-3 upup-py-1.5 upup-text-sm upup-font-medium upup-text-white hover:upup-bg-[#0284c7] disabled:upup-opacity-50"
240
+ onclick={handleTransfer}
241
+ >
242
+ {$transferring
243
+ ? 'Uploading…'
244
+ : `Add files${$selected.size ? ` (${$selected.size})` : ''}`}
245
+ </button>
246
+ </div>
247
+ </div>
248
+ {/if}
249
+ </SourceViewContainer>
250
+ {/if}
@@ -0,0 +1,10 @@
1
+ import { type ServerModeProvider } from '../composables/useServerModeDrive';
2
+ type $$ComponentProps = {
3
+ provider: ServerModeProvider;
4
+ onBack?: () => void;
5
+ dataUpupSlot?: string;
6
+ };
7
+ declare const ServerModeDriveUploader: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type ServerModeDriveUploader = ReturnType<typeof ServerModeDriveUploader>;
9
+ export default ServerModeDriveUploader;
10
+ //# sourceMappingURL=ServerModeDriveUploader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerModeDriveUploader.svelte.d.ts","sourceRoot":"","sources":["../../src/components/ServerModeDriveUploader.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,EAGH,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAA;AAI3C,KAAK,gBAAgB,GAAI;IACtB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC;AAkLJ,QAAA,MAAM,uBAAuB,sDAAwC,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}