@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,47 @@
1
+ <script lang="ts">
2
+ import { cn } from '@useupup/core/internal'
3
+
4
+ /**
5
+ * Completion checkmark (states-tour.html state E): a sky ring with a tick that
6
+ * DRAWS in and a wrapper that POPS, shown when a file reaches
7
+ * UploadStatus.SUCCESSFUL. Hosts (FilePreview tile, FileRow, FileHero) gate it
8
+ * on status; the fx classes render UNCONDITIONALLY — the shared CSS
9
+ * `data-motion="off"` kill rule is the one gate, so under motion-off the mark
10
+ * simply appears drawn (no draw/pop). aria-hidden: completion is already
11
+ * conveyed textually by the file list's live region + the upload announcement.
12
+ */
13
+ let {
14
+ index = 0,
15
+ class: className = '',
16
+ size = 22,
17
+ }: {
18
+ /** Position in the sorted list — drives the draw/pop stagger (capped at 8). */
19
+ index?: number
20
+ class?: string
21
+ size?: number
22
+ } = $props()
23
+
24
+ const delay = $derived(`${Math.min(index, 8) * 40}ms`)
25
+ </script>
26
+
27
+ <span
28
+ data-upup-slot="file-success"
29
+ aria-hidden="true"
30
+ class={cn('upup-animate-fx-pop upup-inline-flex', className)}
31
+ style={`animation-delay: ${delay}`}
32
+ >
33
+ <svg viewBox="0 0 24 24" width={size} height={size} fill="none" aria-hidden="true">
34
+ <circle cx="12" cy="12" r="11" stroke="#38bdf8" stroke-width="2" />
35
+ <path
36
+ d="M7 12.5l3.2 3.2L17 8.8"
37
+ stroke="#38bdf8"
38
+ stroke-width="2"
39
+ stroke-linecap="round"
40
+ stroke-linejoin="round"
41
+ pathLength="24"
42
+ stroke-dasharray="24"
43
+ class="upup-animate-fx-draw"
44
+ style={`animation-delay: ${delay}`}
45
+ />
46
+ </svg>
47
+ </span>
@@ -0,0 +1,10 @@
1
+ type $$ComponentProps = {
2
+ /** Position in the sorted list — drives the draw/pop stagger (capped at 8). */
3
+ index?: number;
4
+ class?: string;
5
+ size?: number;
6
+ };
7
+ declare const FileSuccessCheck: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type FileSuccessCheck = ReturnType<typeof FileSuccessCheck>;
9
+ export default FileSuccessCheck;
10
+ //# sourceMappingURL=FileSuccessCheck.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileSuccessCheck.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/FileSuccessCheck.svelte.ts"],"names":[],"mappings":"AAKC,KAAK,gBAAgB,GAAI;IACtB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAC;AA+BJ,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ import {
3
+ useUploaderI18n,
4
+ useUploaderTheme,
5
+ useUploaderUploadControls,
6
+ } from '../../context/uploader-context'
7
+ import { isUploadActive, cn } from '@useupup/core/internal'
8
+
9
+ let {
10
+ progress,
11
+ showValue = false,
12
+ progressBarClassName = '',
13
+ class: className = '',
14
+ }: {
15
+ progress: number
16
+ showValue?: boolean
17
+ progressBarClassName?: string
18
+ class?: string
19
+ } = $props()
20
+
21
+ const { isDark: dark, slotOverrides: slotClasses, slots: themeSlots } = useUploaderTheme()
22
+ const { translations: tr } = useUploaderI18n()
23
+ const { upload: { uploadStatus } } = useUploaderUploadControls()
24
+ </script>
25
+
26
+ {#if !!progress || isUploadActive($uploadStatus)}
27
+ <div
28
+ data-testid="upup-progress-bar"
29
+ data-upup-slot="progress-bar"
30
+ role="progressbar"
31
+ aria-valuenow={progress}
32
+ aria-valuemin={0}
33
+ aria-valuemax={100}
34
+ aria-label={tr.uploadProgress}
35
+ class={cn(
36
+ 'upup-flex upup-items-center upup-gap-2',
37
+ className,
38
+ $slotClasses.progressBarContainer,
39
+ $themeSlots?.progressBar?.root,
40
+ )}
41
+ >
42
+ <div
43
+ class={cn(
44
+ 'upup-relative upup-h-[6px] upup-flex-1 upup-overflow-hidden upup-rounded-[4px]',
45
+ $dark ? 'upup-bg-white/[0.12]' : 'upup-bg-[#F5F5F5]',
46
+ progressBarClassName,
47
+ $slotClasses.progressBar,
48
+ $themeSlots?.progressBar?.track,
49
+ )}
50
+ >
51
+ <div
52
+ style={`width: ${progress}%`}
53
+ class={cn(
54
+ 'upup-fx-progress-fill upup-fx-essential upup-h-full',
55
+ $dark ? 'upup-bg-[#38bdf8]' : 'upup-bg-[#0ea5e9]',
56
+ $slotClasses.progressBarInner,
57
+ $themeSlots?.progressBar?.fill,
58
+ )}
59
+ ></div>
60
+ {#if isUploadActive($uploadStatus)}
61
+ <div
62
+ aria-hidden="true"
63
+ class="upup-animate-fx-sheen upup-pointer-events-none upup-absolute upup-inset-y-0 upup-left-0 upup-w-2/5"
64
+ style="background: linear-gradient(90deg, transparent, rgba(255,255,255,0.45), transparent)"
65
+ ></div>
66
+ {/if}
67
+ </div>
68
+ {#if !!showValue}
69
+ <p
70
+ class={cn(
71
+ 'upup-text-xs upup-font-semibold',
72
+ { 'upup-text-white': $dark },
73
+ $slotClasses.progressBarText,
74
+ $themeSlots?.progressBar?.text,
75
+ )}
76
+ >
77
+ {progress}%
78
+ </p>
79
+ {/if}
80
+ </div>
81
+ {/if}
@@ -0,0 +1,10 @@
1
+ type $$ComponentProps = {
2
+ progress: number;
3
+ showValue?: boolean;
4
+ progressBarClassName?: string;
5
+ class?: string;
6
+ };
7
+ declare const ProgressBar: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type ProgressBar = ReturnType<typeof ProgressBar>;
9
+ export default ProgressBar;
10
+ //# sourceMappingURL=ProgressBar.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBar.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/ProgressBar.svelte.ts"],"names":[],"mappings":"AAUC,KAAK,gBAAgB,GAAI;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;AAwDJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { useUploaderTheme } from '../../context/uploader-context'
3
+ import { cn } from '@useupup/core/internal'
4
+ import type { Snippet } from 'svelte'
5
+
6
+ const { isLoading = false, children, ...rest }: { isLoading?: boolean; children?: Snippet; [key: string]: unknown } = $props()
7
+
8
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
9
+ </script>
10
+
11
+ <div
12
+ data-testid="upup-source-view"
13
+ class={cn(
14
+ // Transparent by design: the view body sits directly on the panel's
15
+ // gradient chrome (the old black/[0.075] wash read as a mismatched gray
16
+ // block over the light gradient).
17
+ 'upup-flex upup-items-center upup-justify-center upup-overflow-hidden',
18
+ {
19
+ 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]': isLoading && $dark,
20
+ [$slotClasses.sourceView!]: !isLoading && !!$slotClasses.sourceView,
21
+ [$slotClasses.driveLoading!]: isLoading && !!$slotClasses.driveLoading,
22
+ },
23
+ )}
24
+ {...rest}
25
+ >
26
+ {@render children?.()}
27
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ isLoading?: boolean;
4
+ children?: Snippet;
5
+ [key: string]: unknown;
6
+ };
7
+ declare const SourceViewContainer: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type SourceViewContainer = ReturnType<typeof SourceViewContainer>;
9
+ export default SourceViewContainer;
10
+ //# sourceMappingURL=SourceViewContainer.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceViewContainer.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/SourceViewContainer.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAErC,KAAK,gBAAgB,GAAI;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AA2B9F,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,156 @@
1
+ <script lang="ts">
2
+ import { derived } from 'svelte/store'
3
+ import { formatUiMessage as t, pluralUiMessage as plural } from '@useupup/core'
4
+ import { isUploadActive, cn } from '@useupup/core/internal'
5
+ import {
6
+ useUploaderFiles,
7
+ useUploaderI18n,
8
+ useUploaderOptions,
9
+ useUploaderTheme,
10
+ useUploaderUploadControls,
11
+ useUploaderView,
12
+ } from '../../context/uploader-context'
13
+ import Icon from '../Icon.svelte'
14
+
15
+ let {
16
+ handleCancel,
17
+ forcedList = false,
18
+ hideAddMore = false,
19
+ }: {
20
+ handleCancel: () => void
21
+ /** True when the panel forces the row list (tiles don't fit one row) —
22
+ * the grid/list toggle is hidden in that state. */
23
+ forcedList?: boolean
24
+ /** True in quiet-completion mode after success — hides the add-more
25
+ * control so the completed panel offers no further CTAs. */
26
+ hideAddMore?: boolean
27
+ } = $props()
28
+
29
+ const { files } = useUploaderFiles()
30
+ const { viewMode, setViewMode, openSourceOverlay } = useUploaderView()
31
+ const { translations: tr } = useUploaderI18n()
32
+ const {
33
+ mini,
34
+ limit,
35
+ isProcessing,
36
+ icons: { ContainerAddMoreIcon },
37
+ } = useUploaderOptions()
38
+ const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()
39
+ const { upload: { uploadStatus } } = useUploaderUploadControls()
40
+
41
+ const isUploading = derived(uploadStatus, $s => isUploadActive($s))
42
+ const isLimitReached = derived(files, $f => limit === $f.size)
43
+ </script>
44
+
45
+ {#if !mini}
46
+ <div
47
+ data-testid="upup-header"
48
+ data-upup-slot="header"
49
+ class={cn(
50
+ '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',
51
+ { 'upup-bg-white/5 dark:upup-bg-white/5': $dark },
52
+ $slotClasses.containerHeader,
53
+ )}
54
+ >
55
+ <button
56
+ class={cn(
57
+ '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',
58
+ { 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': $dark },
59
+ $slotClasses.containerCancelButton,
60
+ )}
61
+ onclick={handleCancel}
62
+ disabled={$isUploading || isProcessing}
63
+ >
64
+ {tr.removeAllFiles}
65
+ </button>
66
+ <span
67
+ class={cn(
68
+ 'upup-col-span-4 upup-text-center upup-text-sm upup-text-[#6D6D6D] md:upup-col-span-2',
69
+ { 'upup-text-gray-300 dark:upup-text-gray-300': $dark },
70
+ )}
71
+ >
72
+ {t(plural(tr, 'filesSelected', $files.size), { count: $files.size })}
73
+ </span>
74
+ <div 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">
75
+ <!-- Two-segment grid|list control. Hidden once the row list is
76
+ forced (tiles don't fit one row of the fixed panel). The
77
+ active segment carries the sky highlight; both segments
78
+ always show their icon so the choice is self-evident. -->
79
+ {#if $files.size > 1 && !forcedList}
80
+ <div
81
+ role="group"
82
+ aria-label={tr.switchToGridView}
83
+ data-upup-slot="view-toggle"
84
+ class={cn(
85
+ 'upup-flex upup-items-center upup-gap-0.5 upup-rounded-lg upup-p-0.5',
86
+ $dark ? 'upup-bg-white/[0.06]' : 'upup-bg-black/[0.05]',
87
+ )}
88
+ >
89
+ <button
90
+ data-testid="upup-view-toggle-grid"
91
+ aria-label={tr.switchToGridView}
92
+ aria-pressed={$viewMode === 'grid'}
93
+ title={tr.switchToGridView}
94
+ class={cn(
95
+ 'upup-flex upup-h-6 upup-items-center upup-justify-center upup-gap-1 upup-rounded-md upup-px-1.5 upup-transition-colors',
96
+ $viewMode === 'grid'
97
+ ? 'upup-bg-[#0ea5e9] upup-text-white'
98
+ : $dark
99
+ ? 'upup-text-gray-300 hover:upup-bg-white/10'
100
+ : 'upup-text-gray-500 hover:upup-bg-black/10',
101
+ )}
102
+ onclick={() => setViewMode('grid')}
103
+ >
104
+ <Icon name="layout-grid" size={15} />
105
+ <!-- Label only on the ACTIVE segment, and only at md+
106
+ where the header has room (mini shows no header at
107
+ all). Inactive segment stays icon-only. -->
108
+ {#if $viewMode === 'grid'}
109
+ <span class="upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline">
110
+ {tr.viewGrid}
111
+ </span>
112
+ {/if}
113
+ </button>
114
+ <button
115
+ data-testid="upup-view-toggle-list"
116
+ aria-label={tr.switchToListView}
117
+ aria-pressed={$viewMode === 'list'}
118
+ title={tr.switchToListView}
119
+ class={cn(
120
+ 'upup-flex upup-h-6 upup-items-center upup-justify-center upup-gap-1 upup-rounded-md upup-px-1.5 upup-transition-colors',
121
+ $viewMode === 'list'
122
+ ? 'upup-bg-[#0ea5e9] upup-text-white'
123
+ : $dark
124
+ ? 'upup-text-gray-300 hover:upup-bg-white/10'
125
+ : 'upup-text-gray-500 hover:upup-bg-black/10',
126
+ )}
127
+ onclick={() => setViewMode('list')}
128
+ >
129
+ <Icon name="layout-list" size={15} />
130
+ {#if $viewMode === 'list'}
131
+ <span class="upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline">
132
+ {tr.viewList}
133
+ </span>
134
+ {/if}
135
+ </button>
136
+ </div>
137
+ {/if}
138
+ {#if limit > 1 && !$isLimitReached && !hideAddMore}
139
+ <button
140
+ data-testid="upup-add-more"
141
+ data-placement="header"
142
+ data-upup-slot="add-more"
143
+ class={cn(
144
+ '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]',
145
+ { 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': $dark },
146
+ $slotClasses.containerAddMoreButton,
147
+ )}
148
+ onclick={openSourceOverlay}
149
+ disabled={$isUploading || isProcessing}
150
+ >
151
+ <ContainerAddMoreIcon /> {tr.addMore}
152
+ </button>
153
+ {/if}
154
+ </div>
155
+ </div>
156
+ {/if}
@@ -0,0 +1,13 @@
1
+ type $$ComponentProps = {
2
+ handleCancel: () => void;
3
+ /** True when the panel forces the row list (tiles don't fit one row) —
4
+ * the grid/list toggle is hidden in that state. */
5
+ forcedList?: boolean;
6
+ /** True in quiet-completion mode after success — hides the add-more
7
+ * control so the completed panel offers no further CTAs. */
8
+ hideAddMore?: boolean;
9
+ };
10
+ declare const UploaderHeader: import("svelte").Component<$$ComponentProps, {}, "">;
11
+ type UploaderHeader = ReturnType<typeof UploaderHeader>;
12
+ export default UploaderHeader;
13
+ //# sourceMappingURL=UploaderHeader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploaderHeader.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/shared/UploaderHeader.svelte.ts"],"names":[],"mappings":"AAgBC,KAAK,gBAAgB,GAAI;IACtB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB;wDACoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;iEAC6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAC;AAwGJ,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type Readable } from 'svelte/store';
2
+ export interface UseTilesPerRowReturn {
3
+ /** Reactive tile-per-row count for the currently observed element (0 until
4
+ * measured — see view-mode.ts). */
5
+ tilesPerRow: Readable<number>;
6
+ /** (Re)observe an element with the ResizeObserver. Call it whenever the
7
+ * scroll container the file list binds changes (it mounts after the list
8
+ * first renders); passing null disconnects. */
9
+ observe: (el: HTMLElement | null) => void;
10
+ }
11
+ /**
12
+ * Measure an element's content-box width with a ResizeObserver and derive how
13
+ * many 160px grid tiles fit one row (see view-mode.ts). Returns 0 until measured
14
+ * (SSR / jsdom / pre-paint), which isListViewForced reads as "unknown — don't
15
+ * force list yet". Isolated in its own module so tests can mock the measurement
16
+ * seam without a real layout engine. Mirrors React's lib/use-tiles-per-row.
17
+ */
18
+ export declare function useTilesPerRow(): UseTilesPerRowReturn;
19
+ //# sourceMappingURL=use-tiles-per-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tiles-per-row.d.ts","sourceRoot":"","sources":["../../src/composables/use-tiles-per-row.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGtD,MAAM,WAAW,oBAAoB;IACjC;wCACoC;IACpC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7B;;oDAEgD;IAChD,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,CAqBrD"}
@@ -0,0 +1,30 @@
1
+ import { onDestroy } from 'svelte';
2
+ import { writable } from 'svelte/store';
3
+ import { computeTilesPerRow } from '../lib/view-mode';
4
+ /**
5
+ * Measure an element's content-box width with a ResizeObserver and derive how
6
+ * many 160px grid tiles fit one row (see view-mode.ts). Returns 0 until measured
7
+ * (SSR / jsdom / pre-paint), which isListViewForced reads as "unknown — don't
8
+ * force list yet". Isolated in its own module so tests can mock the measurement
9
+ * seam without a real layout engine. Mirrors React's lib/use-tiles-per-row.
10
+ */
11
+ export function useTilesPerRow() {
12
+ const tilesPerRow = writable(0);
13
+ let ro = null;
14
+ function observe(el) {
15
+ ro?.disconnect();
16
+ ro = null;
17
+ if (!el || typeof ResizeObserver === 'undefined')
18
+ return;
19
+ ro = new ResizeObserver(entries => {
20
+ const next = entries[0]?.contentRect.width ?? 0;
21
+ tilesPerRow.set(computeTilesPerRow(next));
22
+ });
23
+ ro.observe(el);
24
+ }
25
+ onDestroy(() => {
26
+ ro?.disconnect();
27
+ ro = null;
28
+ });
29
+ return { tilesPerRow: { subscribe: tilesPerRow.subscribe }, observe };
30
+ }
@@ -0,0 +1,28 @@
1
+ import { type Readable } from 'svelte/store';
2
+ import { type DriveFile, type DriveFolder } from '@useupup/core';
3
+ import { type DriveBrowserState } from '@useupup/core/internal';
4
+ export interface UseBoxReturn {
5
+ user: Readable<DriveBrowserState['user']>;
6
+ boxFiles: Readable<DriveBrowserState['folder']>;
7
+ logout: () => void;
8
+ authenticate: () => void;
9
+ token: Readable<'active' | undefined>;
10
+ isAuthenticated: Readable<DriveBrowserState['isAuthenticated']>;
11
+ isLoading: Readable<DriveBrowserState['isLoading']>;
12
+ path: Readable<DriveBrowserState['path']>;
13
+ setPath: (newPath: DriveFolder[]) => void;
14
+ handleClick: (file: DriveFile) => void;
15
+ selectedFiles: Readable<DriveBrowserState['selectedFiles']>;
16
+ showLoader: Readable<DriveBrowserState['showLoader']>;
17
+ handleSubmit: () => Promise<void>;
18
+ handleCancelDownload: () => void;
19
+ onSelectCurrentFolder: () => Promise<void>;
20
+ isClickLoading: Readable<DriveBrowserState['isClickLoading']>;
21
+ error: Readable<DriveBrowserState['error']>;
22
+ hasMore: Readable<DriveBrowserState['hasMore']>;
23
+ isLoadingMore: Readable<DriveBrowserState['isLoadingMore']>;
24
+ loadMore: () => Promise<void>;
25
+ }
26
+ export declare function useBox(): UseBoxReturn;
27
+ export default useBox;
28
+ //# sourceMappingURL=useBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBox.d.ts","sourceRoot":"","sources":["../../src/composables/useBox.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAChF,OAAO,EAEH,KAAK,iBAAiB,EACzB,MAAM,wBAAwB,CAAA;AAQ/B,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;IACzC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,KAAK,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACrC,eAAe,EAAE,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAC/D,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAA;IACnD,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;IACzC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,CAAA;IACzC,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IACtC,aAAa,EAAE,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAA;IAC3D,UAAU,EAAE,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAA;IACrD,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAChC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,cAAc,EAAE,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC7D,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3C,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAA;IAC/C,aAAa,EAAE,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAA;IAC3D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED,wBAAgB,MAAM,IAAI,YAAY,CA8DrC;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { onMount, onDestroy } from 'svelte';
2
+ import { derived } from 'svelte/store';
3
+ import { BOX_DESCRIPTOR } from '@useupup/core';
4
+ import { DriveBrowserController, } from '@useupup/core/internal';
5
+ import { useUploaderFiles, useUploaderRuntime, useUploaderSource, } from '../context/uploader-context';
6
+ import { toReadable } from '../lib/to-readable';
7
+ export function useBox() {
8
+ const { core } = useUploaderRuntime();
9
+ const { setActiveSource } = useUploaderSource();
10
+ const { setFiles } = useUploaderFiles();
11
+ if (!core)
12
+ throw new Error('useBox must be used inside an initialized <UpupUploader />');
13
+ const controller = new DriveBrowserController(core, BOX_DESCRIPTOR, {
14
+ onFilesSelected: files => {
15
+ setFiles(files);
16
+ },
17
+ onClose: () => {
18
+ setActiveSource(undefined);
19
+ },
20
+ });
21
+ const state = toReadable(controller);
22
+ onMount(() => {
23
+ controller.init();
24
+ });
25
+ onDestroy(() => {
26
+ controller.destroy();
27
+ });
28
+ return {
29
+ user: derived(state, $s => $s.user),
30
+ boxFiles: derived(state, $s => $s.folder),
31
+ logout: () => {
32
+ controller.signOut();
33
+ },
34
+ authenticate: () => {
35
+ controller.signIn();
36
+ },
37
+ token: derived(state, $s => $s.isAuthenticated ? 'active' : undefined),
38
+ isAuthenticated: derived(state, $s => $s.isAuthenticated),
39
+ isLoading: derived(state, $s => $s.isLoading),
40
+ path: derived(state, $s => $s.path),
41
+ setPath: (newPath) => {
42
+ controller.setPath(newPath);
43
+ },
44
+ handleClick: (file) => {
45
+ controller.handleClick(file);
46
+ },
47
+ selectedFiles: derived(state, $s => $s.selectedFiles),
48
+ showLoader: derived(state, $s => $s.showLoader),
49
+ handleSubmit: () => controller.handleSubmit(),
50
+ handleCancelDownload: () => {
51
+ controller.handleCancelDownload();
52
+ },
53
+ onSelectCurrentFolder: () => controller.onSelectCurrentFolder(),
54
+ isClickLoading: derived(state, $s => $s.isClickLoading),
55
+ error: derived(state, $s => $s.error),
56
+ hasMore: derived(state, $s => $s.hasMore),
57
+ isLoadingMore: derived(state, $s => $s.isLoadingMore),
58
+ loadMore: () => controller.loadMore(),
59
+ };
60
+ }
61
+ export default useBox;
@@ -0,0 +1,23 @@
1
+ import { type Readable, type Writable } from 'svelte/store';
2
+ import { useUploaderI18n, useUploaderOptions, useUploaderTheme } from '../context/uploader-context';
3
+ export declare enum FacingMode {
4
+ Environment = "environment",
5
+ User = "user"
6
+ }
7
+ export interface UseCameraUploaderReturn {
8
+ setVideoEl: (el: HTMLVideoElement | null) => void;
9
+ capturedUrl: Writable<string>;
10
+ facingMode: Writable<FacingMode>;
11
+ newCameraSide: Readable<'front' | 'back'>;
12
+ startCamera: () => Promise<void>;
13
+ stopCamera: () => void;
14
+ capture: () => void;
15
+ clearUrl: () => void;
16
+ handleFetchImage: () => Promise<void>;
17
+ handleCameraSwitch: () => void;
18
+ translations: ReturnType<typeof useUploaderI18n>['translations'];
19
+ props: ReturnType<typeof useUploaderOptions>;
20
+ theme: ReturnType<typeof useUploaderTheme>;
21
+ }
22
+ export default function useCameraUploader(): UseCameraUploaderReturn;
23
+ //# sourceMappingURL=useCameraUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCameraUploader.d.ts","sourceRoot":"","sources":["../../src/composables/useCameraUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,QAAQ,EACb,KAAK,QAAQ,EAChB,MAAM,cAAc,CAAA;AAErB,OAAO,EAEH,eAAe,EACf,kBAAkB,EAGlB,gBAAgB,EACnB,MAAM,6BAA6B,CAAA;AAEpC,oBAAY,UAAU;IAClB,WAAW,gBAAgB;IAC3B,IAAI,SAAS;CAChB;AAED,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAA;IACjD,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IAChC,aAAa,EAAE,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,CAAA;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,YAAY,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,cAAc,CAAC,CAAA;IAChE,KAAK,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;IAC5C,KAAK,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;CAC7C;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,IAAI,uBAAuB,CAwHnE"}