@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,60 @@
1
+ <script lang="ts">
2
+ import type { Readable } from 'svelte/store'
3
+ import { type DriveBrowserError, formatUiMessage as t } from '@useupup/core'
4
+ import { cn } from '@useupup/core/internal'
5
+ import { useUploaderI18n, useUploaderTheme } from '../../context/uploader-context'
6
+ import SourceViewContainer from './SourceViewContainer.svelte'
7
+
8
+ const {
9
+ providerName,
10
+ onRetry,
11
+ error,
12
+ dataUpupSlot = 'drive-auth-fallback',
13
+ }: {
14
+ providerName: string
15
+ onRetry: () => void
16
+ error?: Readable<DriveBrowserError | undefined>
17
+ dataUpupSlot?: string
18
+ } = $props()
19
+
20
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
21
+ const { translations: tr } = useUploaderI18n()
22
+ </script>
23
+
24
+ <SourceViewContainer data-upup-slot={dataUpupSlot}>
25
+ <div class="upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-6 upup-text-center">
26
+ {#if error && !!$error}
27
+ <p
28
+ data-testid="upup-drive-error"
29
+ data-upup-slot="drive-error"
30
+ role="alert"
31
+ class="upup-p-4 upup-text-sm upup-text-red-600 dark:upup-text-red-400"
32
+ >
33
+ {t(tr.driveLoadError, { message: $error.message })}
34
+ </p>
35
+ {/if}
36
+ <p
37
+ class={cn(
38
+ 'upup-text-sm upup-text-[#333]',
39
+ {
40
+ 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]': $dark,
41
+ },
42
+ $slotClasses.sourceView,
43
+ )}
44
+ >
45
+ {t(tr.authenticatePrompt, { provider: providerName })}
46
+ </p>
47
+ <button
48
+ type="button"
49
+ class={cn(
50
+ 'upup-rounded-md upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white upup-transition-all upup-duration-300 hover:upup-bg-[#0284c7]',
51
+ {
52
+ 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8] dark:hover:upup-bg-[#0ea5e9]': $dark,
53
+ },
54
+ )}
55
+ onclick={onRetry}
56
+ >
57
+ {t(tr.signInWith, { provider: providerName })}
58
+ </button>
59
+ </div>
60
+ </SourceViewContainer>
@@ -0,0 +1,12 @@
1
+ import type { Readable } from 'svelte/store';
2
+ import { type DriveBrowserError } from '@useupup/core';
3
+ type $$ComponentProps = {
4
+ providerName: string;
5
+ onRetry: () => void;
6
+ error?: Readable<DriveBrowserError | undefined>;
7
+ dataUpupSlot?: string;
8
+ };
9
+ declare const DriveAuthFallback: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type DriveAuthFallback = ReturnType<typeof DriveAuthFallback>;
11
+ export default DriveAuthFallback;
12
+ //# sourceMappingURL=DriveAuthFallback.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriveAuthFallback.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DriveAuthFallback.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,eAAe,CAAA;AAK3E,KAAK,gBAAgB,GAAI;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,QAAQ,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC;AAgDJ,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,209 @@
1
+ <script lang="ts">
2
+ import type { Readable } from 'svelte/store'
3
+ import { type DriveBrowserError, type DriveFile, type DriveFolder, type DriveUser, formatUiMessage as t, pluralUiMessage as plural } from '@useupup/core'
4
+ import { searchDriveFiles, cn } from '@useupup/core/internal'
5
+ import {
6
+ useUploaderI18n,
7
+ useUploaderOptions,
8
+ useUploaderTheme,
9
+ } from '../../context/uploader-context'
10
+ import SourceViewContainer from './SourceViewContainer.svelte'
11
+ import DriveBrowserHeader from './DriveBrowserHeader.svelte'
12
+ import DriveBrowserItem from './DriveBrowserItem.svelte'
13
+
14
+ const {
15
+ isClickLoading,
16
+ driveFiles,
17
+ path,
18
+ setPath,
19
+ user,
20
+ handleSignOut,
21
+ handleClick,
22
+ selectedFiles,
23
+ showLoader,
24
+ handleSubmit,
25
+ handleCancelDownload,
26
+ onSelectCurrentFolder,
27
+ error,
28
+ hasMore,
29
+ isLoadingMore,
30
+ loadMore,
31
+ dataUpupSlot = 'drive-browser',
32
+ }: {
33
+ isClickLoading?: Readable<boolean>
34
+ driveFiles?: Readable<DriveFolder | undefined>
35
+ path: Readable<DriveFolder[]>
36
+ setPath: (newPath: DriveFolder[]) => void
37
+ user?: Readable<DriveUser | undefined>
38
+ handleSignOut: () => Promise<void>
39
+ handleClick: (file: DriveFile) => void | Promise<void>
40
+ selectedFiles: Readable<DriveFile[]>
41
+ showLoader: Readable<boolean>
42
+ handleSubmit: () => Promise<void>
43
+ handleCancelDownload: () => void
44
+ onSelectCurrentFolder?: () => Promise<void> | void
45
+ error?: Readable<DriveBrowserError | undefined>
46
+ hasMore?: Readable<boolean>
47
+ isLoadingMore?: Readable<boolean>
48
+ loadMore?: () => void | Promise<void>
49
+ dataUpupSlot?: string
50
+ } = $props()
51
+
52
+ const { allowedFileTypes, icons } = useUploaderOptions()
53
+ const Loader = icons.LoaderIcon
54
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
55
+ const { translations: tr } = useUploaderI18n()
56
+ let searchTerm = $state('')
57
+
58
+ function filterItems(item: DriveFile, accept: string) {
59
+ if (item.isFolder) return true
60
+ if (!accept || accept === '*') return true
61
+ return accept.split(',').some((pattern) => {
62
+ const p = pattern.trim()
63
+ if (p.startsWith('.')) return item.name.endsWith(p)
64
+ if (p.endsWith('/*')) return item.mimeType.startsWith(p.replace('/*', '/'))
65
+ return item.mimeType === p
66
+ })
67
+ }
68
+
69
+ const items = $derived(
70
+ $path[$path.length - 1]?.children?.filter((item) =>
71
+ filterItems(item, allowedFileTypes),
72
+ ),
73
+ )
74
+
75
+ const displayedItems = $derived(searchDriveFiles(items ?? [], searchTerm) || [])
76
+
77
+ // error short-circuits the perpetual loader — the exact F-123/F-124 symptom.
78
+ const isLoading = $derived(!$error && (($isClickLoading ?? false) || !$driveFiles))
79
+
80
+ function noopClick() { /* disabled click */ }
81
+ </script>
82
+
83
+ <SourceViewContainer isLoading={isLoading} data-upup-slot={dataUpupSlot}>
84
+ {#if isLoading}
85
+ <Loader />
86
+ {:else}
87
+ <div data-testid="upup-drive-browser" class="upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto">
88
+ <DriveBrowserHeader
89
+ showSearch={!!items?.length}
90
+ path={$path}
91
+ {setPath}
92
+ {searchTerm}
93
+ onSearch={(v) => (searchTerm = v)}
94
+ user={$user}
95
+ {handleSignOut}
96
+ />
97
+ {#if !!$path}
98
+ <div
99
+ class={cn(
100
+ 'upup-h-full upup-overflow-y-auto upup-pt-2',
101
+ {
102
+ 'upup-text-[#fafafa] dark:upup-text-[#fafafa]': $dark,
103
+ },
104
+ $slotClasses.driveBody,
105
+ )}
106
+ >
107
+ {#if !!$error}
108
+ <div class="upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center upup-px-6 upup-text-center">
109
+ <p
110
+ data-testid="upup-drive-error"
111
+ data-upup-slot="drive-error"
112
+ role="alert"
113
+ class="upup-text-sm upup-text-red-600 dark:upup-text-red-400"
114
+ >
115
+ {t(tr.driveLoadError, { message: $error.message })}
116
+ </p>
117
+ </div>
118
+ {/if}
119
+ {#if !!displayedItems.length}
120
+ <ul class="upup-p-2">
121
+ {#each displayedItems as file (file.id)}
122
+ <DriveBrowserItem
123
+ {file}
124
+ handleClick={$isClickLoading || $showLoader ? noopClick : handleClick}
125
+ selectedFiles={$selectedFiles}
126
+ />
127
+ {/each}
128
+ </ul>
129
+ {/if}
130
+ {#if !displayedItems.length && !$error}
131
+ <div class="upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center">
132
+ <p class="upup-text-xs upup-opacity-70">
133
+ {tr.noAcceptedFilesFound}
134
+ </p>
135
+ </div>
136
+ {/if}
137
+ {#if !!$hasMore}
138
+ <button
139
+ data-testid="upup-drive-load-more"
140
+ data-upup-slot="drive-load-more"
141
+ class="upup-mx-auto upup-my-2 upup-block upup-rounded-md upup-px-3 upup-py-1.5 upup-text-sm upup-text-[#0284c7] disabled:upup-opacity-50"
142
+ disabled={$isLoadingMore}
143
+ onclick={() => loadMore?.()}
144
+ >
145
+ {$isLoadingMore ? tr.loading : tr.loadMore}
146
+ </button>
147
+ {/if}
148
+ </div>
149
+ {/if}
150
+
151
+ {#if (!!$selectedFiles.length || !!onSelectCurrentFolder) && !$error}
152
+ <div
153
+ class={cn(
154
+ 'upup-flex upup-origin-bottom upup-items-center upup-justify-start upup-gap-4 upup-border-t upup-px-3 upup-py-2',
155
+ $dark
156
+ ? 'upup-border-white/[0.08] upup-text-[#fafafa]'
157
+ : 'upup-border-black/[0.06]',
158
+ $slotClasses.driveFooter,
159
+ )}
160
+ >
161
+ {#if !!onSelectCurrentFolder}
162
+ <button
163
+ class={cn(
164
+ 'upup-rounded-md upup-bg-transparent upup-px-3 upup-py-2 upup-text-sm upup-font-medium upup-text-[#0284c7] upup-transition-all upup-duration-300',
165
+ {
166
+ 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': $dark,
167
+ },
168
+ )}
169
+ disabled={$showLoader}
170
+ onclick={() => onSelectCurrentFolder?.()}
171
+ >
172
+ {tr.selectThisFolder}
173
+ </button>
174
+ {/if}
175
+ <button
176
+ class={cn(
177
+ 'upup-rounded-md upup-bg-[#0ea5e9] upup-px-3 upup-py-2 upup-text-sm upup-font-medium upup-text-white upup-transition-all upup-duration-300',
178
+ {
179
+ 'upup-animate-pulse': $showLoader,
180
+ 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': $dark,
181
+ },
182
+ $slotClasses.driveAddFilesButton,
183
+ )}
184
+ disabled={$showLoader}
185
+ onclick={handleSubmit}
186
+ >
187
+ {t(
188
+ plural(tr, 'addFiles', $selectedFiles.length),
189
+ { count: $selectedFiles.length },
190
+ )}
191
+ </button>
192
+ <button
193
+ class={cn(
194
+ 'upup-ml-auto upup-rounded-md upup-p-1 upup-text-sm upup-text-[#0284c7] upup-transition-all upup-duration-300',
195
+ {
196
+ 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': $dark,
197
+ },
198
+ $slotClasses.driveCancelFilesButton,
199
+ )}
200
+ disabled={$showLoader}
201
+ onclick={handleCancelDownload}
202
+ >
203
+ {tr.cancel}
204
+ </button>
205
+ </div>
206
+ {/if}
207
+ </div>
208
+ {/if}
209
+ </SourceViewContainer>
@@ -0,0 +1,25 @@
1
+ import type { Readable } from 'svelte/store';
2
+ import { type DriveBrowserError, type DriveFile, type DriveFolder, type DriveUser } from '@useupup/core';
3
+ type $$ComponentProps = {
4
+ isClickLoading?: Readable<boolean>;
5
+ driveFiles?: Readable<DriveFolder | undefined>;
6
+ path: Readable<DriveFolder[]>;
7
+ setPath: (newPath: DriveFolder[]) => void;
8
+ user?: Readable<DriveUser | undefined>;
9
+ handleSignOut: () => Promise<void>;
10
+ handleClick: (file: DriveFile) => void | Promise<void>;
11
+ selectedFiles: Readable<DriveFile[]>;
12
+ showLoader: Readable<boolean>;
13
+ handleSubmit: () => Promise<void>;
14
+ handleCancelDownload: () => void;
15
+ onSelectCurrentFolder?: () => Promise<void> | void;
16
+ error?: Readable<DriveBrowserError | undefined>;
17
+ hasMore?: Readable<boolean>;
18
+ isLoadingMore?: Readable<boolean>;
19
+ loadMore?: () => void | Promise<void>;
20
+ dataUpupSlot?: string;
21
+ };
22
+ declare const DriveBrowser: import("svelte").Component<$$ComponentProps, {}, "">;
23
+ type DriveBrowser = ReturnType<typeof DriveBrowser>;
24
+ export default DriveBrowser;
25
+ //# sourceMappingURL=DriveBrowser.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriveBrowser.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DriveBrowser.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAmD,MAAM,eAAe,CAAA;AAWxJ,KAAK,gBAAgB,GAAI;IACtB,cAAc,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;IAC9C,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7B,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,CAAA;IACzC,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,CAAA;IACtC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,aAAa,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;IACpC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAChC,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAClD,KAAK,CAAC,EAAE,QAAQ,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;IAC/C,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC3B,aAAa,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC;AAwJJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,191 @@
1
+ <script lang="ts">
2
+ import { writable } from 'svelte/store'
3
+ import { type DriveFolder, type DriveUser } from '@useupup/core'
4
+ import { cn } from '@useupup/core/internal'
5
+ import {
6
+ useUploaderI18n,
7
+ useUploaderSource,
8
+ useUploaderTheme,
9
+ } from '../../context/uploader-context'
10
+ import {
11
+ useSourceViewHeaderExtra,
12
+ portal,
13
+ } from '../../context/source-view-header-extra'
14
+ import Icon from '../Icon.svelte'
15
+
16
+ const {
17
+ path,
18
+ setPath,
19
+ handleSignOut,
20
+ showSearch,
21
+ searchTerm,
22
+ onSearch,
23
+ user,
24
+ }: {
25
+ path: DriveFolder[]
26
+ setPath: (newPath: DriveFolder[]) => void
27
+ handleSignOut: () => Promise<void>
28
+ showSearch: boolean
29
+ searchTerm: string
30
+ onSearch: (value: string) => void
31
+ user?: DriveUser | undefined
32
+ } = $props()
33
+
34
+ const { setActiveSource } = useUploaderSource()
35
+ const { translations: tr } = useUploaderI18n()
36
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
37
+
38
+ const headerExtraStore =
39
+ useSourceViewHeaderExtra() ?? writable<HTMLElement | null>(null)
40
+
41
+ // Once navigated into a folder we show a Back affordance + the current folder
42
+ // name, not a full breadcrumb trail (long provider folder names blew the row
43
+ // up, and multi-level jumps weren't worth the fragility).
44
+ const navigated = $derived(path.length > 1)
45
+ const currentFolder = $derived(path[path.length - 1])
46
+ const hasFilter = $derived(searchTerm.trim().length > 0)
47
+
48
+ // Collapsed/expanded search lives here; the term itself stays in DriveBrowser.
49
+ let searchOpen = $state(false)
50
+ let searchInputEl = $state<HTMLInputElement | null>(null)
51
+
52
+ // Focus the field the moment it expands.
53
+ $effect(() => {
54
+ if (searchOpen && searchInputEl) searchInputEl.focus()
55
+ })
56
+
57
+ function onLogout() {
58
+ void handleSignOut()
59
+ setActiveSource(undefined)
60
+ }
61
+ </script>
62
+
63
+ {#if user}
64
+ <div data-upup-slot="drive-browser-header">
65
+ <!-- Account controls live in the SourceView header row (portal), next to
66
+ Back, separated by a hairline — not in their own strip. -->
67
+ {#if $headerExtraStore}
68
+ <div style="display: contents" use:portal={$headerExtraStore}>
69
+ <div
70
+ class="upup-relative upup-flex upup-h-6 upup-w-6 upup-items-center upup-justify-center upup-overflow-hidden upup-rounded-full"
71
+ >
72
+ {#if !!user.picture}
73
+ <img
74
+ alt={user.name}
75
+ src={user.picture}
76
+ class="upup-bg-center upup-object-cover"
77
+ />
78
+ {:else}
79
+ <Icon name="user" class="upup-text-xl" />
80
+ {/if}
81
+ </div>
82
+ <button
83
+ class={cn(
84
+ 'upup-hover:upup-underline upup-text-xs upup-font-medium upup-text-[#0284c7]',
85
+ { 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': $dark },
86
+ $slotClasses.driveLogoutButton,
87
+ )}
88
+ onclick={onLogout}
89
+ >
90
+ {tr.logOut}
91
+ </button>
92
+ <span
93
+ aria-hidden="true"
94
+ class={cn('upup-h-4 upup-w-px', $dark ? 'upup-bg-white/15' : 'upup-bg-black/15')}
95
+ ></span>
96
+ </div>
97
+ {/if}
98
+
99
+ {#if showSearch || navigated}
100
+ <div
101
+ class={cn(
102
+ 'upup-flex upup-items-center upup-gap-2.5 upup-px-3 upup-py-2 upup-text-xs upup-font-medium upup-text-[#333]',
103
+ { 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]': $dark },
104
+ $slotClasses.driveHeader,
105
+ )}
106
+ >
107
+ {#if navigated}
108
+ <button
109
+ type="button"
110
+ data-testid="upup-drive-back"
111
+ data-upup-slot="drive-back"
112
+ aria-label={tr.overlayBack}
113
+ class={cn(
114
+ 'upup-fx-hover-lift upup-fx-press upup-flex upup-h-7 upup-w-7 upup-shrink-0 upup-items-center upup-justify-center upup-rounded-lg',
115
+ $dark
116
+ ? 'upup-text-[#e2e8f0] hover:upup-bg-white/[0.08]'
117
+ : 'upup-text-[#334155] hover:upup-bg-black/[0.05]',
118
+ )}
119
+ onclick={() => setPath(path.slice(0, -1))}
120
+ >
121
+ <Icon name="chevron-left" />
122
+ </button>
123
+ {/if}
124
+ {#if navigated && !searchOpen}
125
+ <span
126
+ data-upup-slot="drive-current-folder"
127
+ title={currentFolder?.name}
128
+ class="upup-min-w-0 upup-flex-1 upup-truncate upup-font-medium"
129
+ >
130
+ {currentFolder?.name}
131
+ </span>
132
+ {/if}
133
+ {#if navigated && showSearch && !searchOpen}
134
+ <button
135
+ type="button"
136
+ data-testid="upup-drive-search-toggle"
137
+ data-upup-slot="drive-search-toggle"
138
+ aria-label={tr.search}
139
+ aria-expanded="false"
140
+ class={cn(
141
+ 'upup-fx-hover-lift upup-fx-press upup-ml-auto upup-flex upup-h-7 upup-w-7 upup-shrink-0 upup-items-center upup-justify-center upup-rounded-lg',
142
+ hasFilter
143
+ ? 'upup-text-[#0ea5e9]'
144
+ : $dark
145
+ ? 'upup-text-[#94a3b8] hover:upup-bg-white/[0.08]'
146
+ : 'upup-text-[#64748b] hover:upup-bg-black/[0.05]',
147
+ )}
148
+ onclick={() => (searchOpen = true)}
149
+ >
150
+ <Icon name="search" />
151
+ </button>
152
+ {/if}
153
+ {#if showSearch && (!navigated || searchOpen)}
154
+ <div
155
+ class={cn(
156
+ 'upup-relative upup-min-w-0 upup-flex-1',
157
+ navigated && 'upup-fx-search-expand',
158
+ $slotClasses.driveSearchContainer,
159
+ )}
160
+ >
161
+ <input
162
+ bind:this={searchInputEl}
163
+ type="search"
164
+ name="upup-drive-search"
165
+ data-testid="upup-drive-search-input"
166
+ data-upup-slot="drive-search-input"
167
+ aria-label={tr.search}
168
+ class={cn(
169
+ 'upup-w-full upup-rounded-lg upup-px-3 upup-py-1.5 upup-pl-8 upup-text-xs upup-outline-none upup-ring-1 upup-transition-shadow focus:upup-ring-2 focus:upup-ring-[#38bdf8]',
170
+ $dark
171
+ ? 'upup-bg-white/[0.06] upup-text-[#e2e8f0] upup-ring-white/[0.1] placeholder:upup-text-[#64748b]'
172
+ : 'upup-bg-white upup-text-[#0f172a] upup-ring-black/[0.08] placeholder:upup-text-[#94a3b8]',
173
+ $slotClasses.driveSearchInput,
174
+ )}
175
+ placeholder={tr.search}
176
+ value={searchTerm}
177
+ oninput={(e) => onSearch((e.target as HTMLInputElement).value)}
178
+ onkeydown={(e) => {
179
+ if (e.key === 'Escape') searchOpen = false
180
+ }}
181
+ onblur={() => {
182
+ if (!searchTerm) searchOpen = false
183
+ }}
184
+ />
185
+ <Icon name="search" class="upup-absolute upup-left-2.5 upup-top-1/2 upup--translate-y-1/2 upup-text-[#939393]" />
186
+ </div>
187
+ {/if}
188
+ </div>
189
+ {/if}
190
+ </div>
191
+ {/if}
@@ -0,0 +1,14 @@
1
+ import { type DriveFolder, type DriveUser } from '@useupup/core';
2
+ type $$ComponentProps = {
3
+ path: DriveFolder[];
4
+ setPath: (newPath: DriveFolder[]) => void;
5
+ handleSignOut: () => Promise<void>;
6
+ showSearch: boolean;
7
+ searchTerm: string;
8
+ onSearch: (value: string) => void;
9
+ user?: DriveUser | undefined;
10
+ };
11
+ declare const DriveBrowserHeader: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ type DriveBrowserHeader = ReturnType<typeof DriveBrowserHeader>;
13
+ export default DriveBrowserHeader;
14
+ //# sourceMappingURL=DriveBrowserHeader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriveBrowserHeader.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DriveBrowserHeader.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAa/D,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,WAAW,EAAE,CAAA;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,CAAA;IACzC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAC7B,CAAC;AAmIJ,QAAA,MAAM,kBAAkB,sDAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ import { type DriveFile } from '@useupup/core'
3
+ import { cn, b64EncodeUnicode } from '@useupup/core/internal'
4
+ import { useUploaderTheme } from '../../context/uploader-context'
5
+ import Icon from '../Icon.svelte'
6
+
7
+ const { file }: { file: DriveFile } = $props()
8
+ const { isDark: dark } = useUploaderTheme()
9
+
10
+ function handleImgError(e: Event) {
11
+ const img = e.target as HTMLImageElement
12
+ const svg = `<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M14 3v4a1 1 0 0 0 1 1h4"></path><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"></path></svg>`
13
+ img.src = `data:image/svg+xml;base64,${b64EncodeUnicode(svg)}`
14
+ img.onerror = null
15
+ }
16
+ </script>
17
+
18
+ {#if file.isFolder}
19
+ <i class="upup-flex-grow upup-text-lg">
20
+ <!-- Amber filled folder in both themes — folders read unmistakably as folders. -->
21
+ <Icon name="folder-filled" class="upup-text-[#fbbf24]" />
22
+ </i>
23
+ {:else if !file.thumbnail}
24
+ <i class="upup-flex-grow upup-text-lg">
25
+ <Icon
26
+ name="file"
27
+ class={cn({
28
+ 'upup-text-[#6D6D6D] dark:upup-text-[#6D6D6D]': $dark,
29
+ })}
30
+ />
31
+ </i>
32
+ {:else}
33
+ <img
34
+ src={file.thumbnail}
35
+ alt={file.name}
36
+ class="upup-h-5 upup-w-5 upup-flex-grow upup-rounded-md upup-shadow"
37
+ onerror={handleImgError}
38
+ />
39
+ {/if}
@@ -0,0 +1,8 @@
1
+ import { type DriveFile } from '@useupup/core';
2
+ type $$ComponentProps = {
3
+ file: DriveFile;
4
+ };
5
+ declare const DriveBrowserIcon: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type DriveBrowserIcon = ReturnType<typeof DriveBrowserIcon>;
7
+ export default DriveBrowserIcon;
8
+ //# sourceMappingURL=DriveBrowserIcon.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriveBrowserIcon.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DriveBrowserIcon.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAK7C,KAAK,gBAAgB,GAAI;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAmC9C,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,63 @@
1
+ <script lang="ts">
2
+ import { type DriveFile } from '@useupup/core'
3
+ import { cn } from '@useupup/core/internal'
4
+ import { useUploaderTheme } from '../../context/uploader-context'
5
+ import DriveBrowserIcon from './DriveBrowserIcon.svelte'
6
+
7
+ const { file, handleClick, selectedFiles }: {
8
+ file: DriveFile
9
+ handleClick: (file: DriveFile) => void | Promise<void>
10
+ selectedFiles: DriveFile[]
11
+ } = $props()
12
+
13
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
14
+
15
+ const isFolder = $derived(file.isFolder)
16
+ const isFileSelected = $derived(selectedFiles.filter((f) => f.id === file.id).length)
17
+ </script>
18
+
19
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
20
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
21
+ <div
22
+ data-upup-slot="drive-browser-item"
23
+ class={cn(
24
+ 'upup-fx-hover-lift upup-group upup-mb-1.5 upup-flex upup-cursor-pointer upup-items-center upup-justify-between upup-gap-2 upup-rounded-[11px] upup-px-3 upup-py-2.5 upup-ring-1',
25
+ {
26
+ 'upup-font-medium': isFolder,
27
+ },
28
+ isFileSelected
29
+ ? $dark
30
+ ? 'upup-bg-[#0ea5e9]/10 upup-ring-[#38bdf8]/35'
31
+ : 'upup-bg-[#0ea5e9]/10 upup-ring-[#0ea5e9]/40'
32
+ : $dark
33
+ ? 'upup-bg-white/[0.04] upup-ring-white/[0.06] hover:upup-bg-white/[0.07]'
34
+ : 'upup-bg-black/[0.03] upup-ring-black/[0.06] hover:upup-bg-black/[0.05]',
35
+ {
36
+ [$slotClasses.driveItemContainerDefault!]:
37
+ !isFileSelected && $slotClasses.driveItemContainerDefault,
38
+ [$slotClasses.driveItemContainerSelected!]:
39
+ isFileSelected && $slotClasses.driveItemContainerSelected,
40
+ },
41
+ )}
42
+ onclick={() => handleClick(file)}
43
+ >
44
+ <div
45
+ class={cn(
46
+ 'upup-flex upup-items-center upup-gap-2',
47
+ $slotClasses.driveItemContainerInner,
48
+ )}
49
+ >
50
+ <DriveBrowserIcon {file} />
51
+ <h1
52
+ class={cn(
53
+ 'upup-text-wrap upup-break-all upup-text-xs',
54
+ {
55
+ 'upup-text-[#e0e0e0] dark:upup-text-[#e0e0e0]': $dark,
56
+ },
57
+ $slotClasses.driveItemInnerText,
58
+ )}
59
+ >
60
+ {file.name}
61
+ </h1>
62
+ </div>
63
+ </div>
@@ -0,0 +1,10 @@
1
+ import { type DriveFile } from '@useupup/core';
2
+ type $$ComponentProps = {
3
+ file: DriveFile;
4
+ handleClick: (file: DriveFile) => void | Promise<void>;
5
+ selectedFiles: DriveFile[];
6
+ };
7
+ declare const DriveBrowserItem: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type DriveBrowserItem = ReturnType<typeof DriveBrowserItem>;
9
+ export default DriveBrowserItem;
10
+ //# sourceMappingURL=DriveBrowserItem.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriveBrowserItem.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DriveBrowserItem.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAK7C,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,aAAa,EAAE,SAAS,EAAE,CAAA;CAC3B,CAAC;AAuDJ,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}