@useupup/react 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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/AudioUploader-2WITC5YR.js +298 -0
  4. package/dist/AudioUploader-2WITC5YR.js.map +1 -0
  5. package/dist/AudioUploader-HWP4U6UJ.cjs +298 -0
  6. package/dist/AudioUploader-HWP4U6UJ.cjs.map +1 -0
  7. package/dist/BoxUploader-NEGZOMR4.cjs +172 -0
  8. package/dist/BoxUploader-NEGZOMR4.cjs.map +1 -0
  9. package/dist/BoxUploader-VE5LRJ7M.js +172 -0
  10. package/dist/BoxUploader-VE5LRJ7M.js.map +1 -0
  11. package/dist/CameraUploader-BJ3AU3VS.cjs +200 -0
  12. package/dist/CameraUploader-BJ3AU3VS.cjs.map +1 -0
  13. package/dist/CameraUploader-WF5A6UIS.js +200 -0
  14. package/dist/CameraUploader-WF5A6UIS.js.map +1 -0
  15. package/dist/DropboxUploader-INTOYHJP.cjs +174 -0
  16. package/dist/DropboxUploader-INTOYHJP.cjs.map +1 -0
  17. package/dist/DropboxUploader-VMUYG3OP.js +174 -0
  18. package/dist/DropboxUploader-VMUYG3OP.js.map +1 -0
  19. package/dist/GoogleDriveUploader-CXZUZI6R.cjs +177 -0
  20. package/dist/GoogleDriveUploader-CXZUZI6R.cjs.map +1 -0
  21. package/dist/GoogleDriveUploader-YA56X3QR.js +177 -0
  22. package/dist/GoogleDriveUploader-YA56X3QR.js.map +1 -0
  23. package/dist/ImageEditorInline-GJ3HCPPZ.cjs +185 -0
  24. package/dist/ImageEditorInline-GJ3HCPPZ.cjs.map +1 -0
  25. package/dist/ImageEditorInline-N2NSAODR.js +185 -0
  26. package/dist/ImageEditorInline-N2NSAODR.js.map +1 -0
  27. package/dist/ImageEditorModal-CWKMDVPY.js +236 -0
  28. package/dist/ImageEditorModal-CWKMDVPY.js.map +1 -0
  29. package/dist/ImageEditorModal-XJKPBTVQ.cjs +236 -0
  30. package/dist/ImageEditorModal-XJKPBTVQ.cjs.map +1 -0
  31. package/dist/OneDriveUploader-4RPTY7KT.cjs +175 -0
  32. package/dist/OneDriveUploader-4RPTY7KT.cjs.map +1 -0
  33. package/dist/OneDriveUploader-I25Y6AJP.js +175 -0
  34. package/dist/OneDriveUploader-I25Y6AJP.js.map +1 -0
  35. package/dist/ScreenCaptureUploader-7K6QPD42.cjs +281 -0
  36. package/dist/ScreenCaptureUploader-7K6QPD42.cjs.map +1 -0
  37. package/dist/ScreenCaptureUploader-WKDO4S75.js +281 -0
  38. package/dist/ScreenCaptureUploader-WKDO4S75.js.map +1 -0
  39. package/dist/chunk-6TFTTLOD.js +852 -0
  40. package/dist/chunk-6TFTTLOD.js.map +1 -0
  41. package/dist/chunk-DZQBTC6T.cjs +39 -0
  42. package/dist/chunk-DZQBTC6T.cjs.map +1 -0
  43. package/dist/chunk-GNMEQB32.cjs +195 -0
  44. package/dist/chunk-GNMEQB32.cjs.map +1 -0
  45. package/dist/chunk-IG62MHVQ.cjs +276 -0
  46. package/dist/chunk-IG62MHVQ.cjs.map +1 -0
  47. package/dist/chunk-L3E5OMY7.cjs +852 -0
  48. package/dist/chunk-L3E5OMY7.cjs.map +1 -0
  49. package/dist/chunk-LCMDDPUD.js +276 -0
  50. package/dist/chunk-LCMDDPUD.js.map +1 -0
  51. package/dist/chunk-N4XGN66E.cjs +79 -0
  52. package/dist/chunk-N4XGN66E.cjs.map +1 -0
  53. package/dist/chunk-N7TWHP5Z.js +195 -0
  54. package/dist/chunk-N7TWHP5Z.js.map +1 -0
  55. package/dist/chunk-OXWVO7Z6.cjs +70 -0
  56. package/dist/chunk-OXWVO7Z6.cjs.map +1 -0
  57. package/dist/chunk-PLGHK2Y4.js +79 -0
  58. package/dist/chunk-PLGHK2Y4.js.map +1 -0
  59. package/dist/chunk-SSLP3MEC.js +39 -0
  60. package/dist/chunk-SSLP3MEC.js.map +1 -0
  61. package/dist/chunk-WYMKISZI.js +70 -0
  62. package/dist/chunk-WYMKISZI.js.map +1 -0
  63. package/dist/index.cjs +4219 -0
  64. package/dist/index.cjs.map +1 -0
  65. package/dist/index.d.cts +240 -0
  66. package/dist/index.d.ts +240 -0
  67. package/dist/index.js +4219 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/styles.d.ts +4 -0
  70. package/dist/tailwind-prefixed.css +2529 -0
  71. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/shared/DriveAuthFallback.tsx","../src/components/shared/DriveBrowser.tsx","../src/components/shared/DriveBrowserHeader.tsx","../src/components/shared/DriveBrowserItem.tsx","../src/components/shared/DriveBrowserIcon.tsx","../src/components/ServerModeDriveUploader.tsx","../src/hooks/useServerModeDrive.ts"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\r\nimport { type DriveBrowserError, formatUiMessage as t } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport {\r\n useUploaderI18n,\r\n useUploaderTheme,\r\n} from '../../context/UploaderContext'\r\nimport SourceViewContainer from './SourceViewContainer'\r\n\r\ntype Props = {\r\n providerName: string\r\n onRetry: () => void\r\n /** initGis degradation (F-124) — missing config / GIS failed to attach. */\r\n error?: DriveBrowserError | undefined\r\n 'data-upup-slot'?: string | undefined\r\n}\r\n\r\nexport default function DriveAuthFallback({\r\n providerName,\r\n onRetry,\r\n error,\r\n 'data-upup-slot': dataUpupSlot = 'drive-auth-fallback',\r\n}: Readonly<Props>): React.ReactElement | null {\r\n const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()\r\n const { translations: tr } = useUploaderI18n()\r\n\r\n // One-shot auto sign-in: the provider tile click carries a transient user\r\n // activation (~5s in modern browsers), so kicking the OAuth popup off on\r\n // mount goes straight to the provider instead of an interstitial. If the\r\n // popup is blocked (activation consumed/expired), this view stays as the\r\n // manual fallback. Never auto-retries after an error.\r\n const attemptedRef = useRef(false)\r\n useEffect(() => {\r\n if (attemptedRef.current || error) return\r\n attemptedRef.current = true\r\n onRetry()\r\n }, [error, onRetry])\r\n\r\n return (\r\n <SourceViewContainer data-upup-slot={dataUpupSlot}>\r\n <div className=\"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\">\r\n {!!error && (\r\n <p\r\n data-testid=\"upup-drive-error\"\r\n data-upup-slot=\"drive-error\"\r\n role=\"alert\"\r\n className=\"upup-p-4 upup-text-sm upup-text-red-600 dark:upup-text-red-400\"\r\n >\r\n {t(tr.driveLoadError, { message: error.message })}\r\n </p>\r\n )}\r\n <p\r\n className={cn(\r\n 'upup-text-sm upup-text-[#333]',\r\n {\r\n 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]':\r\n dark,\r\n },\r\n slotClasses.sourceView,\r\n )}\r\n >\r\n {t(tr.authenticatePrompt, { provider: providerName })}\r\n </p>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n '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]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8] dark:hover:upup-bg-[#0ea5e9]':\r\n dark,\r\n },\r\n )}\r\n onClick={onRetry}\r\n >\r\n {t(tr.signInWith, { provider: providerName })}\r\n </button>\r\n </div>\r\n </SourceViewContainer>\r\n )\r\n}\r\n","import React, { Dispatch, SetStateAction, useMemo, useState } from 'react'\r\nimport {\r\n type DriveBrowserError,\r\n type DriveFile,\r\n type DriveFolder,\r\n type DriveUser,\r\n formatUiMessage as t,\r\n pluralUiMessage as plural,\r\n} from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport {\r\n useUploaderI18n,\r\n useUploaderOptions,\r\n useUploaderTheme,\r\n} from '../../context/UploaderContext'\r\nimport { searchDriveFiles } from '../../lib/file'\r\nimport SourceViewContainer from './SourceViewContainer'\r\nimport DriveBrowserHeader from './DriveBrowserHeader'\r\nimport DriveBrowserItem from './DriveBrowserItem'\r\n\r\ntype Props = {\r\n isClickLoading?: boolean | undefined\r\n driveFiles?: DriveFolder | undefined\r\n path: DriveFolder[]\r\n setPath: Dispatch<SetStateAction<DriveFolder[]>>\r\n user?: DriveUser | undefined\r\n handleSignOut: () => Promise<void>\r\n handleClick: (file: DriveFile) => void | Promise<void>\r\n selectedFiles: DriveFile[]\r\n showLoader: boolean\r\n handleSubmit: () => Promise<void>\r\n handleCancelDownload: () => void\r\n onSelectCurrentFolder?: (() => Promise<void> | void) | undefined\r\n /** The one drive browse-failure surface (F-124). Set = show the banner, not the loader. */\r\n error?: DriveBrowserError | undefined\r\n /** Drives the \"Load more\" button (F-125). */\r\n hasMore?: boolean | undefined\r\n isLoadingMore?: boolean | undefined\r\n loadMore?: (() => void | Promise<void>) | undefined\r\n 'data-upup-slot'?: string | undefined\r\n signIn?: (() => void) | undefined\r\n}\r\n\r\nfunction filterItems(item: DriveFile, accept: string) {\r\n if (item.isFolder) return true\r\n if (!accept || accept === '*') return true\r\n return accept.split(',').some(pattern => {\r\n const p = pattern.trim()\r\n if (p.startsWith('.')) return item.name.endsWith(p)\r\n if (p.endsWith('/*'))\r\n return item.mimeType.startsWith(p.replace('/*', '/'))\r\n return item.mimeType === p\r\n })\r\n}\r\n\r\nexport default function DriveBrowser({\r\n isClickLoading = false,\r\n driveFiles,\r\n path,\r\n setPath,\r\n handleClick,\r\n selectedFiles,\r\n showLoader,\r\n handleSubmit,\r\n handleCancelDownload,\r\n onSelectCurrentFolder,\r\n error,\r\n hasMore = false,\r\n isLoadingMore = false,\r\n loadMore,\r\n 'data-upup-slot': dataUpupSlot = 'drive-browser',\r\n ...rest\r\n}: Readonly<Props>): React.ReactElement | null {\r\n const {\r\n allowedFileTypes,\r\n icons: { LoaderIcon },\r\n } = useUploaderOptions()\r\n const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()\r\n const { translations: tr } = useUploaderI18n()\r\n const [searchTerm, setSearchTerm] = useState('')\r\n const items = path[path.length - 1]?.children?.filter(item =>\r\n filterItems(item, allowedFileTypes),\r\n )\r\n const displayedItems = useMemo(\r\n () => searchDriveFiles(items ?? [], searchTerm) || [],\r\n [searchTerm, items],\r\n )\r\n // error short-circuits the perpetual loader — the exact F-123/F-124 symptom\r\n // (a failed load or download previously left the spinner running forever).\r\n const isLoading = !error && (isClickLoading || !driveFiles)\r\n\r\n return (\r\n <SourceViewContainer\r\n isLoading={isLoading}\r\n data-upup-slot={dataUpupSlot}\r\n >\r\n {isLoading ? (\r\n <LoaderIcon />\r\n ) : (\r\n <div\r\n data-testid=\"upup-drive-browser\"\r\n className=\"upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto\"\r\n >\r\n <DriveBrowserHeader\r\n showSearch={!!items?.length}\r\n path={path}\r\n setPath={setPath}\r\n searchTerm={searchTerm}\r\n onSearch={setSearchTerm}\r\n {...rest}\r\n />\r\n {!!path && (\r\n <div\r\n // Transparent on the panel gradient — no inner box.\r\n className={cn(\r\n 'upup-h-full upup-overflow-y-auto upup-pt-2',\r\n {\r\n 'upup-text-[#fafafa] dark:upup-text-[#fafafa]':\r\n dark,\r\n },\r\n slotClasses.driveBody,\r\n )}\r\n >\r\n {/* Error state: a calm centered message, not a\r\n banner strip over an empty list. */}\r\n {!!error && (\r\n <div className=\"upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center upup-px-6 upup-text-center\">\r\n <p\r\n data-testid=\"upup-drive-error\"\r\n data-upup-slot=\"drive-error\"\r\n role=\"alert\"\r\n className=\"upup-text-sm upup-text-red-600 dark:upup-text-red-400\"\r\n >\r\n {t(tr.driveLoadError, {\r\n message: error.message,\r\n })}\r\n </p>\r\n </div>\r\n )}\r\n {!!displayedItems.length && (\r\n <ul className=\"upup-p-2\">\r\n {displayedItems.map(file => {\r\n return (\r\n <DriveBrowserItem\r\n key={file.id}\r\n file={file}\r\n handleClick={\r\n isClickLoading || showLoader\r\n ? () => {}\r\n : handleClick\r\n }\r\n selectedFiles={selectedFiles}\r\n />\r\n )\r\n })}\r\n </ul>\r\n )}\r\n {!displayedItems.length && !error && (\r\n <div className=\"upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center\">\r\n <p className=\"upup-text-xs upup-opacity-70\">\r\n {tr.noAcceptedFilesFound}\r\n </p>\r\n </div>\r\n )}\r\n {hasMore && (\r\n <button\r\n data-testid=\"upup-drive-load-more\"\r\n data-upup-slot=\"drive-load-more\"\r\n onClick={() => {\r\n void loadMore?.()\r\n }}\r\n disabled={isLoadingMore}\r\n className=\"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\"\r\n >\r\n {isLoadingMore ? tr.loading : tr.loadMore}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer only when there is something to act on — never\r\n under an error state. Hairline divider, no inner box. */}\r\n {(!!selectedFiles.length || !!onSelectCurrentFolder) &&\r\n !error && (\r\n <div\r\n className={cn(\r\n 'upup-flex upup-origin-bottom upup-items-center upup-justify-start upup-gap-4 upup-border-t upup-px-3 upup-py-2',\r\n dark\r\n ? 'upup-border-white/[0.08] upup-text-[#fafafa]'\r\n : 'upup-border-black/[0.06]',\r\n slotClasses.driveFooter,\r\n )}\r\n >\r\n {!!onSelectCurrentFolder && (\r\n <button\r\n className={cn(\r\n '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',\r\n {\r\n 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]':\r\n dark,\r\n },\r\n )}\r\n onClick={() => {\r\n void onSelectCurrentFolder?.()\r\n }}\r\n disabled={showLoader}\r\n >\r\n {tr.selectThisFolder}\r\n </button>\r\n )}\r\n <button\r\n className={cn(\r\n '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',\r\n {\r\n 'upup-animate-pulse': showLoader,\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]':\r\n dark,\r\n },\r\n slotClasses.driveAddFilesButton,\r\n )}\r\n onClick={() => {\r\n void handleSubmit()\r\n }}\r\n disabled={showLoader}\r\n >\r\n {t(\r\n plural(\r\n tr,\r\n 'addFiles',\r\n selectedFiles.length,\r\n ),\r\n { count: selectedFiles.length },\r\n )}\r\n </button>\r\n <button\r\n className={cn(\r\n 'upup-ml-auto upup-rounded-md upup-p-1 upup-text-sm upup-text-[#0284c7] upup-transition-all upup-duration-300',\r\n {\r\n 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]':\r\n dark,\r\n },\r\n slotClasses.driveCancelFilesButton,\r\n )}\r\n onClick={handleCancelDownload}\r\n disabled={showLoader}\r\n >\r\n {tr.cancel}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </SourceViewContainer>\r\n )\r\n}\r\n","import React, {\r\n Dispatch,\r\n SetStateAction,\r\n useContext,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { type DriveFolder, type DriveUser } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport Icon from '../Icon'\r\nimport {\r\n useUploaderI18n,\r\n useUploaderSource,\r\n useUploaderTheme,\r\n} from '../../context/UploaderContext'\r\nimport { SourceViewHeaderExtraContext } from '../../context/SourceViewHeaderExtraContext'\r\n\r\ntype Props = {\r\n path: DriveFolder[]\r\n setPath: Dispatch<SetStateAction<DriveFolder[]>>\r\n handleSignOut: () => Promise<void>\r\n showSearch: boolean\r\n searchTerm: string\r\n onSearch: Dispatch<SetStateAction<string>>\r\n user?: DriveUser | undefined\r\n signIn?: (() => void) | undefined\r\n}\r\n\r\nexport default function DriveBrowserHeader({\r\n path,\r\n setPath,\r\n user,\r\n handleSignOut,\r\n showSearch,\r\n onSearch,\r\n searchTerm,\r\n}: Readonly<Props>): React.ReactElement | null {\r\n const { setActiveSource } = useUploaderSource()\r\n const { translations: tr } = useUploaderI18n()\r\n const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()\r\n const headerExtraHost = useContext(SourceViewHeaderExtraContext)\r\n // Collapsed/expanded search lives here; the term itself stays in DriveBrowser.\r\n const [searchOpen, setSearchOpen] = useState(false)\r\n const searchInputRef = useRef<HTMLInputElement>(null)\r\n\r\n // Focus the field the moment it expands.\r\n useEffect(() => {\r\n if (searchOpen) searchInputRef.current?.focus()\r\n }, [searchOpen])\r\n\r\n if (!user) return null\r\n\r\n // Once navigated into a folder we show a Back affordance + the current\r\n // folder name, not a full breadcrumb trail (long provider folder names\r\n // blew the row up, and multi-level jumps weren't worth the fragility).\r\n const navigated = path.length > 1\r\n const currentFolder = path[path.length - 1]\r\n const hasFilter = searchTerm.trim().length > 0\r\n\r\n const searchField = (expand: boolean): React.ReactElement => (\r\n <div\r\n className={cn(\r\n 'upup-relative upup-min-w-0 upup-flex-1',\r\n expand && 'upup-fx-search-expand',\r\n slotClasses.driveSearchContainer,\r\n )}\r\n >\r\n <input\r\n ref={searchInputRef}\r\n type=\"search\"\r\n name=\"upup-drive-search\"\r\n data-testid=\"upup-drive-search-input\"\r\n data-upup-slot=\"drive-search-input\"\r\n aria-label={tr.search}\r\n className={cn(\r\n '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]',\r\n dark\r\n ? 'upup-bg-white/[0.06] upup-text-[#e2e8f0] upup-ring-white/[0.1] placeholder:upup-text-[#64748b]'\r\n : 'upup-bg-white upup-text-[#0f172a] upup-ring-black/[0.08] placeholder:upup-text-[#94a3b8]',\r\n slotClasses.driveSearchInput,\r\n )}\r\n placeholder={tr.search}\r\n value={searchTerm}\r\n onChange={e => {\r\n onSearch(e.currentTarget.value)\r\n }}\r\n onKeyDown={e => {\r\n if (e.key === 'Escape') setSearchOpen(false)\r\n }}\r\n onBlur={() => {\r\n // Collapse only when empty — a live filter must stay visible.\r\n if (!searchTerm) setSearchOpen(false)\r\n }}\r\n />\r\n <Icon\r\n name=\"search\"\r\n className=\"upup-absolute upup-left-2.5 upup-top-1/2 upup--translate-y-1/2 upup-text-[#939393]\"\r\n />\r\n </div>\r\n )\r\n\r\n return (\r\n <div data-upup-slot=\"drive-browser-header\">\r\n {/* Account controls live in the SourceView header row (portal),\r\n next to Back, separated by a hairline — not in their own strip. */}\r\n {!!headerExtraHost &&\r\n createPortal(\r\n <>\r\n <div className=\"upup-relative upup-flex upup-h-6 upup-w-6 upup-items-center upup-justify-center upup-overflow-hidden upup-rounded-full\">\r\n {!!user.picture && (\r\n <img\r\n alt={user.name}\r\n src={user.picture}\r\n className=\"upup-bg-center upup-object-cover\"\r\n />\r\n )}\r\n {!user.picture && (\r\n <Icon name=\"user\" className=\"upup-text-xl\" />\r\n )}\r\n </div>\r\n <button\r\n className={cn(\r\n 'upup-hover:upup-underline upup-text-xs upup-font-medium upup-text-[#0284c7]',\r\n {\r\n 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]':\r\n dark,\r\n },\r\n slotClasses.driveLogoutButton,\r\n )}\r\n onClick={() => {\r\n void handleSignOut()\r\n setActiveSource(undefined)\r\n }}\r\n >\r\n {tr.logOut}\r\n </button>\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'upup-h-4 upup-w-px',\r\n dark ? 'upup-bg-white/15' : 'upup-bg-black/15',\r\n )}\r\n />\r\n </>,\r\n headerExtraHost,\r\n )}\r\n {(navigated || showSearch) && (\r\n <div\r\n className={cn(\r\n 'upup-flex upup-items-center upup-gap-2.5 upup-px-3 upup-py-2 upup-text-xs upup-font-medium upup-text-[#333]',\r\n {\r\n 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]':\r\n dark,\r\n },\r\n slotClasses.driveHeader,\r\n )}\r\n >\r\n {navigated ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n data-testid=\"upup-drive-back\"\r\n data-upup-slot=\"drive-back\"\r\n aria-label={tr.overlayBack}\r\n onClick={() => {\r\n setPath(prev => prev.slice(0, -1))\r\n }}\r\n className={cn(\r\n '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',\r\n dark\r\n ? 'upup-text-[#e2e8f0] hover:upup-bg-white/[0.08]'\r\n : 'upup-text-[#334155] hover:upup-bg-black/[0.05]',\r\n )}\r\n >\r\n <Icon name=\"chevron-left\" />\r\n </button>\r\n {!searchOpen && (\r\n <span\r\n data-upup-slot=\"drive-current-folder\"\r\n title={currentFolder?.name}\r\n className=\"upup-min-w-0 upup-flex-1 upup-truncate upup-font-medium\"\r\n >\r\n {currentFolder?.name}\r\n </span>\r\n )}\r\n {showSearch && !searchOpen && (\r\n <button\r\n type=\"button\"\r\n data-testid=\"upup-drive-search-toggle\"\r\n data-upup-slot=\"drive-search-toggle\"\r\n aria-label={tr.search}\r\n aria-expanded={false}\r\n onClick={() => {\r\n setSearchOpen(true)\r\n }}\r\n className={cn(\r\n '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',\r\n hasFilter\r\n ? 'upup-text-[#0ea5e9]'\r\n : dark\r\n ? 'upup-text-[#94a3b8] hover:upup-bg-white/[0.08]'\r\n : 'upup-text-[#64748b] hover:upup-bg-black/[0.05]',\r\n )}\r\n >\r\n <Icon name=\"search\" />\r\n </button>\r\n )}\r\n {showSearch && searchOpen && searchField(true)}\r\n </>\r\n ) : (\r\n showSearch && searchField(false)\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import React from 'react'\r\nimport { type DriveFile } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { useUploaderTheme } from '../../context/UploaderContext'\r\nimport DriveBrowserIcon from './DriveBrowserIcon'\r\n\r\ntype DriveBrowserItemProps = {\r\n file: DriveFile\r\n handleClick: (file: DriveFile) => void | Promise<void>\r\n selectedFiles: DriveFile[]\r\n}\r\n\r\nexport default function DriveBrowserItem({\r\n file,\r\n selectedFiles,\r\n handleClick,\r\n}: Readonly<DriveBrowserItemProps>): React.ReactElement | null {\r\n const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()\r\n const isFolder = file.isFolder\r\n const isFileSelected = selectedFiles.filter(f => f.id === file.id).length\r\n\r\n return (\r\n <div\r\n data-upup-slot=\"drive-browser-item\"\r\n className={cn(\r\n // Panel-chrome row (states-tour-3 .st3-prow): translucent card +\r\n // hairline ring, sky-tinted selection, subtle lift on hover.\r\n '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',\r\n {\r\n 'upup-font-medium': isFolder,\r\n },\r\n isFileSelected\r\n ? dark\r\n ? 'upup-bg-[#0ea5e9]/10 upup-ring-[#38bdf8]/35'\r\n : 'upup-bg-[#0ea5e9]/10 upup-ring-[#0ea5e9]/40'\r\n : dark\r\n ? 'upup-bg-white/[0.04] upup-ring-white/[0.06] hover:upup-bg-white/[0.07]'\r\n : 'upup-bg-white upup-ring-black/[0.07] hover:upup-bg-slate-50',\r\n {\r\n [slotClasses.driveItemContainerDefault ?? '']:\r\n !isFileSelected &&\r\n slotClasses.driveItemContainerDefault,\r\n [slotClasses.driveItemContainerSelected ?? '']:\r\n isFileSelected &&\r\n slotClasses.driveItemContainerSelected,\r\n },\r\n )}\r\n onClick={() => {\r\n void handleClick(file)\r\n }}\r\n >\r\n <div\r\n className={cn(\r\n 'upup-flex upup-items-center upup-gap-2',\r\n slotClasses.driveItemContainerInner,\r\n )}\r\n >\r\n <DriveBrowserIcon file={file} />\r\n <h1\r\n className={cn(\r\n 'upup-text-wrap upup-break-all upup-text-xs',\r\n {\r\n 'upup-text-[#e0e0e0] dark:upup-text-[#e0e0e0]':\r\n dark,\r\n },\r\n slotClasses.driveItemInnerText,\r\n )}\r\n >\r\n {file.name}\r\n </h1>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import React, { ReactEventHandler } from 'react'\r\nimport { type DriveFile } from '@useupup/core'\r\nimport { b64EncodeUnicode, cn } from '@useupup/core/internal'\r\nimport Icon from '../Icon'\r\nimport { useUploaderTheme } from '../../context/UploaderContext'\r\n\r\nconst handleImgError: ReactEventHandler<HTMLImageElement> = e => {\r\n 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>`\r\n e.currentTarget.src = `data:image/svg+xml;base64,${b64EncodeUnicode(svg)}`\r\n e.currentTarget.onerror = null\r\n}\r\n\r\nexport default function DriveBrowserIcon({\r\n file,\r\n}: {\r\n file: DriveFile\r\n}): React.ReactElement | null {\r\n const { isDark: dark } = useUploaderTheme()\r\n const isFolder = file.isFolder\r\n const src = file.thumbnail\r\n\r\n if (isFolder)\r\n return (\r\n <i className=\"upup-flex-grow upup-text-lg\">\r\n {/* Amber filled folder in both themes — folders read\r\n unmistakably as folders. */}\r\n <Icon name=\"folder-filled\" className=\"upup-text-[#fbbf24]\" />\r\n </i>\r\n )\r\n if (!src)\r\n return (\r\n <i className=\"upup-flex-grow upup-text-lg\">\r\n <Icon\r\n name=\"file\"\r\n className={cn({\r\n 'upup-text-[#6D6D6D] dark:upup-text-[#6D6D6D]': dark,\r\n })}\r\n />\r\n </i>\r\n )\r\n\r\n return (\r\n <img\r\n src={src}\r\n alt={file.name}\r\n className=\"upup-h-5 upup-w-5 upup-flex-grow upup-rounded-md upup-shadow\"\r\n onError={handleImgError}\r\n />\r\n )\r\n}\r\n","import React, { useState } from 'react'\r\nimport {\r\n useUploaderI18n,\r\n useUploaderOptions,\r\n useUploaderTheme,\r\n} from '../context/UploaderContext'\r\nimport {\r\n useServerModeDrive,\r\n type ServerDriveFile,\r\n type ServerModeProvider,\r\n} from '../hooks/useServerModeDrive'\r\nimport SourceViewContainer from './shared/SourceViewContainer'\r\nimport DriveAuthFallback from './shared/DriveAuthFallback'\r\nimport { errorCodeToMessageKey } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\n\r\ntype Props = {\r\n provider: ServerModeProvider\r\n onBack?: () => void\r\n 'data-upup-slot'?: string\r\n}\r\n\r\nconst PROVIDER_LABEL: Record<ServerModeProvider, string> = {\r\n 'google-drive': 'Google Drive',\r\n 'one-drive': 'OneDrive',\r\n dropbox: 'Dropbox',\r\n box: 'Box',\r\n}\r\n\r\nexport default function ServerModeDriveUploader({\r\n provider,\r\n onBack,\r\n 'data-upup-slot': dataUpupSlot = `drive-browser-${provider}`,\r\n}: Readonly<Props>): React.ReactElement | null {\r\n const { isDark: dark } = useUploaderTheme()\r\n const {\r\n icons: { LoaderIcon },\r\n } = useUploaderOptions()\r\n const { translator } = useUploaderI18n()\r\n const { state, search, setSearch, refresh, transfer, startAuth } =\r\n useServerModeDrive(provider)\r\n const [selected, setSelected] = useState<Set<string>>(new Set())\r\n const [transferring, setTransferring] = useState(false)\r\n\r\n if (state.status === 'reauth') {\r\n return (\r\n <DriveAuthFallback\r\n providerName={PROVIDER_LABEL[provider]}\r\n onRetry={startAuth}\r\n />\r\n )\r\n }\r\n\r\n const isLoading = state.status === 'loading' || state.status === 'idle'\r\n const files: ServerDriveFile[] = state.status === 'ready' ? state.files : []\r\n\r\n const toggle = (id: string) => {\r\n setSelected(prev => {\r\n const next = new Set(prev)\r\n if (next.has(id)) next.delete(id)\r\n else next.add(id)\r\n return next\r\n })\r\n }\r\n\r\n const handleTransfer = async () => {\r\n setTransferring(true)\r\n try {\r\n for (const file of files.filter(f => selected.has(f.id))) {\r\n const result = await transfer(file)\r\n if (result.status === 'reauth') {\r\n startAuth()\r\n return\r\n }\r\n }\r\n setSelected(new Set())\r\n onBack?.()\r\n } finally {\r\n setTransferring(false)\r\n }\r\n }\r\n\r\n return (\r\n <SourceViewContainer\r\n isLoading={isLoading}\r\n data-upup-slot={dataUpupSlot}\r\n >\r\n {isLoading ? (\r\n <LoaderIcon />\r\n ) : (\r\n <div\r\n data-testid=\"upup-server-drive-browser\"\r\n className=\"upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto\"\r\n >\r\n <div\r\n className={cn(\r\n 'upup-flex upup-items-center upup-gap-2 upup-border-b upup-px-3 upup-py-2.5',\r\n dark\r\n ? 'upup-border-white/[0.06] upup-text-[#e2e8f0]'\r\n : 'upup-border-black/[0.06] upup-text-gray-800',\r\n )}\r\n data-upup-slot=\"drive-browser-header\"\r\n >\r\n <span className=\"upup-text-sm upup-font-medium\">\r\n {PROVIDER_LABEL[provider]}\r\n </span>\r\n <input\r\n type=\"search\"\r\n name=\"upup-drive-search\"\r\n aria-label=\"Search\"\r\n value={search}\r\n onChange={e => {\r\n setSearch(e.target.value)\r\n }}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n void refresh({\r\n search: e.currentTarget.value,\r\n })\r\n }\r\n }}\r\n placeholder=\"Search…\"\r\n className={cn(\r\n 'upup-ml-auto upup-rounded upup-border upup-px-2 upup-py-1 upup-text-xs',\r\n dark\r\n ? 'upup-border-gray-700 upup-bg-gray-800 upup-text-gray-100'\r\n : 'upup-border-gray-300 upup-bg-white',\r\n )}\r\n />\r\n </div>\r\n <div className=\"upup-overflow-auto upup-p-2\">\r\n {state.status === 'error' && (\r\n <p\r\n data-testid=\"upup-drive-error\"\r\n data-upup-slot=\"drive-error\"\r\n role=\"alert\"\r\n className={cn(\r\n 'upup-p-4 upup-text-sm',\r\n dark\r\n ? 'upup-text-red-400'\r\n : 'upup-text-red-600',\r\n )}\r\n >\r\n {state.code && translator\r\n ? translator(\r\n `errors.${errorCodeToMessageKey(state.code)}`,\r\n { code: state.code },\r\n )\r\n : state.message}\r\n </p>\r\n )}\r\n {files.map(file => {\r\n const isSelected = selected.has(file.id)\r\n return (\r\n <button\r\n key={file.id}\r\n type=\"button\"\r\n onClick={() => {\r\n file.isFolder\r\n ? void refresh({\r\n folderId: file.id,\r\n })\r\n : toggle(file.id)\r\n }}\r\n data-upup-slot=\"drive-browser-item\"\r\n data-selected={isSelected}\r\n className={cn(\r\n // Panel-chrome row (states-tour-3 .st3-prow).\r\n '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',\r\n isSelected\r\n ? 'upup-bg-[#0ea5e9]/10 upup-ring-[#38bdf8]/35'\r\n : dark\r\n ? 'upup-bg-white/[0.04] upup-text-[#e2e8f0] upup-ring-white/[0.06] hover:upup-bg-white/[0.07]'\r\n : 'upup-bg-black/[0.03] upup-text-gray-800 upup-ring-black/[0.06] hover:upup-bg-black/[0.05]',\r\n )}\r\n >\r\n <span\r\n className=\"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]\"\r\n aria-hidden=\"true\"\r\n >\r\n {file.isFolder ? (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"17\"\r\n height=\"17\"\r\n fill=\"none\"\r\n stroke=\"#38bdf8\"\r\n strokeWidth=\"1.7\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <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\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"17\"\r\n height=\"17\"\r\n fill=\"none\"\r\n stroke={\r\n dark ? '#94a3b8' : '#64748b'\r\n }\r\n strokeWidth=\"1.6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M6 3h8l4 4v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\" />\r\n <path d=\"M14 3v4h4\" />\r\n </svg>\r\n )}\r\n </span>\r\n <span className=\"upup-flex-1 upup-truncate\">\r\n {file.name}\r\n </span>\r\n {file.size != null && !file.isFolder && (\r\n <span className=\"upup-text-xs upup-opacity-60\">\r\n {formatBytes(file.size)}\r\n </span>\r\n )}\r\n </button>\r\n )\r\n })}\r\n </div>\r\n <div\r\n className={cn(\r\n 'upup-flex upup-items-center upup-justify-between upup-gap-2 upup-border-t upup-p-3',\r\n dark\r\n ? 'upup-border-white/[0.06]'\r\n : 'upup-border-black/[0.06]',\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"upup-text-sm upup-opacity-70 hover:upup-opacity-100\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n disabled={selected.size === 0 || transferring}\r\n onClick={() => void handleTransfer()}\r\n className=\"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\"\r\n >\r\n {transferring\r\n ? 'Uploading…'\r\n : `Add files${selected.size ? ` (${selected.size})` : ''}`}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </SourceViewContainer>\r\n )\r\n}\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\r\n if (bytes < 1024 * 1024 * 1024)\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\r\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\r\n}\r\n","import { useEffect, useRef, useSyncExternalStore } from 'react'\r\nimport { ServerModeDriveController } from '@useupup/core/internal'\r\nimport type {\r\n ServerDriveSnapshot,\r\n ServerDriveTransferResult,\r\n} from '@useupup/core/internal'\r\nimport type { ServerModeProvider, ServerDriveFile } from '@useupup/core'\r\nimport { useUploaderRuntime } from '../context/UploaderContext'\r\n\r\n// Re-export so existing consumers that imported these from this module keep working.\r\nexport type { ServerModeProvider, ServerDriveFile }\r\n\r\nexport function useServerModeDrive(provider: ServerModeProvider): {\r\n state: ServerDriveSnapshot['state']\r\n folderId: ServerDriveSnapshot['folderId']\r\n setFolderId: (id: string | undefined) => void\r\n search: ServerDriveSnapshot['search']\r\n setSearch: (s: string) => void\r\n refresh: (opts?: { folderId?: string; search?: string }) => Promise<void>\r\n transfer: (file: ServerDriveFile) => Promise<ServerDriveTransferResult>\r\n startAuth: () => void\r\n} {\r\n const { serverUrl } = useUploaderRuntime()\r\n const latest = useRef({ serverUrl })\r\n latest.current = { serverUrl }\r\n\r\n const controllerRef = useRef<ServerModeDriveController | undefined>(\r\n undefined,\r\n )\r\n if (!controllerRef.current) {\r\n controllerRef.current = new ServerModeDriveController({\r\n provider,\r\n serverUrl: () => latest.current.serverUrl,\r\n })\r\n }\r\n const controller = controllerRef.current\r\n\r\n const snap = useSyncExternalStore(\r\n controller.subscribe,\r\n controller.getSnapshot,\r\n )\r\n\r\n useEffect(() => {\r\n controller.init()\r\n return () => {\r\n controller.destroy()\r\n }\r\n }, [controller])\r\n\r\n return {\r\n state: snap.state,\r\n folderId: snap.folderId,\r\n setFolderId: (id: string | undefined) => {\r\n controller.setFolderId(id)\r\n void controller.refresh()\r\n },\r\n search: snap.search,\r\n setSearch: (s: string) => {\r\n controller.setSearch(s)\r\n void controller.refresh()\r\n },\r\n refresh: (opts?: { folderId?: string; search?: string }) =>\r\n controller.refresh(opts),\r\n transfer: (file: ServerDriveFile) => controller.transfer(file),\r\n startAuth: () => {\r\n controller.startAuth()\r\n },\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAgB,WAAW,cAAc;AACzC,SAAiC,mBAAmB,SAAS;AAC7D,SAAS,UAAU;AAsCP,SAEQ,KAFR;AAvBG,SAAR,kBAAmC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB,eAAe;AACrC,GAA+C;AAC3C,QAAM,EAAE,QAAQ,MAAM,eAAe,YAAY,IAAI,iBAAiB;AACtE,QAAM,EAAE,cAAc,GAAG,IAAI,gBAAgB;AAO7C,QAAM,eAAe,OAAO,KAAK;AACjC,YAAU,MAAM;AACZ,QAAI,aAAa,WAAW,MAAO;AACnC,iBAAa,UAAU;AACvB,YAAQ;AAAA,EACZ,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SACI,oBAAC,uBAAoB,kBAAgB,cACjC,+BAAC,SAAI,WAAU,8HACV;AAAA,KAAC,CAAC,SACC;AAAA,MAAC;AAAA;AAAA,QACG,eAAY;AAAA,QACZ,kBAAe;AAAA,QACf,MAAK;AAAA,QACL,WAAU;AAAA,QAET,YAAE,GAAG,gBAAgB,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA;AAAA,IACpD;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA;AAAA,YACI,gDACI;AAAA,UACR;AAAA,UACA,YAAY;AAAA,QAChB;AAAA,QAEC,YAAE,GAAG,oBAAoB,EAAE,UAAU,aAAa,CAAC;AAAA;AAAA,IACxD;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA;AAAA,YACI,iGACI;AAAA,UACR;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,QAER,YAAE,GAAG,YAAY,EAAE,UAAU,aAAa,CAAC;AAAA;AAAA,IAChD;AAAA,KACJ,GACJ;AAER;;;AC/EA,SAA0C,SAAS,YAAAA,iBAAgB;AACnE;AAAA,EAKI,mBAAmBC;AAAA,EACnB,mBAAmB;AAAA,OAChB;AACP,SAAS,MAAAC,WAAU;;;ACTnB;AAAA,EAGI;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,OACG;AACP,SAAS,oBAAoB;AAE7B,SAAS,MAAAC,WAAU;AAoDX,SA+CY,UAxCR,OAAAC,MAPJ,QAAAC,aAAA;AAhCO,SAAR,mBAAoC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAA+C;AAC3C,QAAM,EAAE,gBAAgB,IAAI,kBAAkB;AAC9C,QAAM,EAAE,cAAc,GAAG,IAAI,gBAAgB;AAC7C,QAAM,EAAE,QAAQ,MAAM,eAAe,YAAY,IAAI,iBAAiB;AACtE,QAAM,kBAAkB,WAAW,4BAA4B;AAE/D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,iBAAiBC,QAAyB,IAAI;AAGpD,EAAAC,WAAU,MAAM;AAhDpB;AAiDQ,QAAI,WAAY,sBAAe,YAAf,mBAAwB;AAAA,EAC5C,GAAG,CAAC,UAAU,CAAC;AAEf,MAAI,CAAC,KAAM,QAAO;AAKlB,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,gBAAgB,KAAK,KAAK,SAAS,CAAC;AAC1C,QAAM,YAAY,WAAW,KAAK,EAAE,SAAS;AAE7C,QAAM,cAAc,CAAC,WACjB,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,WAAWG;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAJ;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,MAAK;AAAA,YACL,MAAK;AAAA,YACL,eAAY;AAAA,YACZ,kBAAe;AAAA,YACf,cAAY,GAAG;AAAA,YACf,WAAWI;AAAA,cACP;AAAA,cACA,OACM,mGACA;AAAA,cACN,YAAY;AAAA,YAChB;AAAA,YACA,aAAa,GAAG;AAAA,YAChB,OAAO;AAAA,YACP,UAAU,OAAK;AACX,uBAAS,EAAE,cAAc,KAAK;AAAA,YAClC;AAAA,YACA,WAAW,OAAK;AACZ,kBAAI,EAAE,QAAQ,SAAU,eAAc,KAAK;AAAA,YAC/C;AAAA,YACA,QAAQ,MAAM;AAEV,kBAAI,CAAC,WAAY,eAAc,KAAK;AAAA,YACxC;AAAA;AAAA,QACJ;AAAA,QACA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EACJ;AAGJ,SACI,gBAAAC,MAAC,SAAI,kBAAe,wBAGf;AAAA,KAAC,CAAC,mBACC;AAAA,MACI,gBAAAA,MAAA,YACI;AAAA,wBAAAA,MAAC,SAAI,WAAU,0HACV;AAAA,WAAC,CAAC,KAAK,WACJ,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACG,KAAK,KAAK;AAAA,cACV,KAAK,KAAK;AAAA,cACV,WAAU;AAAA;AAAA,UACd;AAAA,UAEH,CAAC,KAAK,WACH,gBAAAA,KAAC,gBAAK,MAAK,QAAO,WAAU,gBAAe;AAAA,WAEnD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAWI;AAAA,cACP;AAAA,cACA;AAAA,gBACI,gDACI;AAAA,cACR;AAAA,cACA,YAAY;AAAA,YAChB;AAAA,YACA,SAAS,MAAM;AACX,mBAAK,cAAc;AACnB,8BAAgB,MAAS;AAAA,YAC7B;AAAA,YAEC,aAAG;AAAA;AAAA,QACR;AAAA,QACA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAWI;AAAA,cACP;AAAA,cACA,OAAO,qBAAqB;AAAA,YAChC;AAAA;AAAA,QACJ;AAAA,SACJ;AAAA,MACA;AAAA,IACJ;AAAA,KACF,aAAa,eACX,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACG,WAAWI;AAAA,UACP;AAAA,UACA;AAAA,YACI,gDACI;AAAA,UACR;AAAA,UACA,YAAY;AAAA,QAChB;AAAA,QAEC,sBACG,gBAAAH,MAAA,YACI;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,eAAY;AAAA,cACZ,kBAAe;AAAA,cACf,cAAY,GAAG;AAAA,cACf,SAAS,MAAM;AACX,wBAAQ,UAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,cACrC;AAAA,cACA,WAAWI;AAAA,gBACP;AAAA,gBACA,OACM,mDACA;AAAA,cACV;AAAA,cAEA,0BAAAJ,KAAC,gBAAK,MAAK,gBAAe;AAAA;AAAA,UAC9B;AAAA,UACC,CAAC,cACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,kBAAe;AAAA,cACf,OAAO,+CAAe;AAAA,cACtB,WAAU;AAAA,cAET,yDAAe;AAAA;AAAA,UACpB;AAAA,UAEH,cAAc,CAAC,cACZ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,eAAY;AAAA,cACZ,kBAAe;AAAA,cACf,cAAY,GAAG;AAAA,cACf,iBAAe;AAAA,cACf,SAAS,MAAM;AACX,8BAAc,IAAI;AAAA,cACtB;AAAA,cACA,WAAWI;AAAA,gBACP;AAAA,gBACA,YACM,wBACA,OACE,mDACA;AAAA,cACZ;AAAA,cAEA,0BAAAJ,KAAC,gBAAK,MAAK,UAAS;AAAA;AAAA,UACxB;AAAA,UAEH,cAAc,cAAc,YAAY,IAAI;AAAA,WACjD,IAEA,cAAc,YAAY,KAAK;AAAA;AAAA,IAEvC;AAAA,KAER;AAER;;;ACxNA,SAAS,MAAAK,WAAU;;;ACAnB,SAAS,kBAAkB,MAAAC,WAAU;AAwBrB,gBAAAC,YAAA;AApBhB,IAAM,iBAAsD,OAAK;AAC7D,QAAM,MAAM;AACZ,IAAE,cAAc,MAAM,6BAA6B,iBAAiB,GAAG,CAAC;AACxE,IAAE,cAAc,UAAU;AAC9B;AAEe,SAAR,iBAAkC;AAAA,EACrC;AACJ,GAE8B;AAC1B,QAAM,EAAE,QAAQ,KAAK,IAAI,iBAAiB;AAC1C,QAAM,WAAW,KAAK;AACtB,QAAM,MAAM,KAAK;AAEjB,MAAI;AACA,WACI,gBAAAA,KAAC,OAAE,WAAU,+BAGT,0BAAAA,KAAC,gBAAK,MAAK,iBAAgB,WAAU,uBAAsB,GAC/D;AAER,MAAI,CAAC;AACD,WACI,gBAAAA,KAAC,OAAE,WAAU,+BACT,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWC,IAAG;AAAA,UACV,gDAAgD;AAAA,QACpD,CAAC;AAAA;AAAA,IACL,GACJ;AAGR,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,KAAK,KAAK;AAAA,MACV,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,EACb;AAER;;;ADEY,SAMI,OAAAE,MANJ,QAAAC,aAAA;AAvCG,SAAR,iBAAkC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACJ,GAA+D;AAhB/D;AAiBI,QAAM,EAAE,QAAQ,MAAM,eAAe,YAAY,IAAI,iBAAiB;AACtE,QAAM,WAAW,KAAK;AACtB,QAAM,iBAAiB,cAAc,OAAO,OAAK,EAAE,OAAO,KAAK,EAAE,EAAE;AAEnE,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG,kBAAe;AAAA,MACf,WAAWE;AAAA;AAAA;AAAA,QAGP;AAAA,QACA;AAAA,UACI,oBAAoB;AAAA,QACxB;AAAA,QACA,iBACM,OACI,gDACA,gDACJ,OACE,2EACA;AAAA,QACR;AAAA,UACI,EAAC,iBAAY,8BAAZ,YAAyC,EAAE,GACxC,CAAC,kBACD,YAAY;AAAA,UAChB,EAAC,iBAAY,+BAAZ,YAA0C,EAAE,GACzC,kBACA,YAAY;AAAA,QACpB;AAAA,MACJ;AAAA,MACA,SAAS,MAAM;AACX,aAAK,YAAY,IAAI;AAAA,MACzB;AAAA,MAEA,0BAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAWC;AAAA,YACP;AAAA,YACA,YAAY;AAAA,UAChB;AAAA,UAEA;AAAA,4BAAAF,KAAC,oBAAiB,MAAY;AAAA,YAC9B,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAWE;AAAA,kBACP;AAAA,kBACA;AAAA,oBACI,gDACI;AAAA,kBACR;AAAA,kBACA,YAAY;AAAA,gBAChB;AAAA,gBAEC,eAAK;AAAA;AAAA,YACV;AAAA;AAAA;AAAA,MACJ;AAAA;AAAA,EACJ;AAER;;;AFwBgB,gBAAAC,MAeQ,QAAAC,aAfR;AAtDhB,SAAS,YAAY,MAAiB,QAAgB;AAClD,MAAI,KAAK,SAAU,QAAO;AAC1B,MAAI,CAAC,UAAU,WAAW,IAAK,QAAO;AACtC,SAAO,OAAO,MAAM,GAAG,EAAE,KAAK,aAAW;AACrC,UAAM,IAAI,QAAQ,KAAK;AACvB,QAAI,EAAE,WAAW,GAAG,EAAG,QAAO,KAAK,KAAK,SAAS,CAAC;AAClD,QAAI,EAAE,SAAS,IAAI;AACf,aAAO,KAAK,SAAS,WAAW,EAAE,QAAQ,MAAM,GAAG,CAAC;AACxD,WAAO,KAAK,aAAa;AAAA,EAC7B,CAAC;AACL;AAEe,SAAR,aAA8B;AAAA,EACjC,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB;AAAA,EACA,kBAAkB,eAAe;AAAA,EACjC,GAAG;AACP,GAA+C;AAxE/C;AAyEI,QAAM;AAAA,IACF;AAAA,IACA,OAAO,EAAE,WAAW;AAAA,EACxB,IAAI,mBAAmB;AACvB,QAAM,EAAE,QAAQ,MAAM,eAAe,YAAY,IAAI,iBAAiB;AACtE,QAAM,EAAE,cAAc,GAAG,IAAI,gBAAgB;AAC7C,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,EAAE;AAC/C,QAAM,SAAQ,gBAAK,KAAK,SAAS,CAAC,MAApB,mBAAuB,aAAvB,mBAAiC;AAAA,IAAO,UAClD,YAAY,MAAM,gBAAgB;AAAA;AAEtC,QAAM,iBAAiB;AAAA,IACnB,MAAM,iBAAiB,wBAAS,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IACpD,CAAC,YAAY,KAAK;AAAA,EACtB;AAGA,QAAM,YAAY,CAAC,UAAU,kBAAkB,CAAC;AAEhD,SACI,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,kBAAgB;AAAA,MAEf,sBACG,gBAAAA,KAAC,cAAW,IAEZ,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACG,eAAY;AAAA,UACZ,WAAU;AAAA,UAEV;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,YAAY,CAAC,EAAC,+BAAO;AAAA,gBACrB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACT,GAAG;AAAA;AAAA,YACR;AAAA,YACC,CAAC,CAAC,QACC,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAWE;AAAA,kBACP;AAAA,kBACA;AAAA,oBACI,gDACI;AAAA,kBACR;AAAA,kBACA,YAAY;AAAA,gBAChB;AAAA,gBAIC;AAAA,mBAAC,CAAC,SACC,gBAAAH,KAAC,SAAI,WAAU,wGACX,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,eAAY;AAAA,sBACZ,kBAAe;AAAA,sBACf,MAAK;AAAA,sBACL,WAAU;AAAA,sBAET,UAAAI,GAAE,GAAG,gBAAgB;AAAA,wBAClB,SAAS,MAAM;AAAA,sBACnB,CAAC;AAAA;AAAA,kBACL,GACJ;AAAA,kBAEH,CAAC,CAAC,eAAe,UACd,gBAAAJ,KAAC,QAAG,WAAU,YACT,yBAAe,IAAI,UAAQ;AACxB,2BACI,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEG;AAAA,wBACA,aACI,kBAAkB,aACZ,MAAM;AAAA,wBAAC,IACP;AAAA,wBAEV;AAAA;AAAA,sBAPK,KAAK;AAAA,oBAQd;AAAA,kBAER,CAAC,GACL;AAAA,kBAEH,CAAC,eAAe,UAAU,CAAC,SACxB,gBAAAA,KAAC,SAAI,WAAU,6EACX,0BAAAA,KAAC,OAAE,WAAU,gCACR,aAAG,sBACR,GACJ;AAAA,kBAEH,WACG,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,eAAY;AAAA,sBACZ,kBAAe;AAAA,sBACf,SAAS,MAAM;AACX,8BAAK;AAAA,sBACT;AAAA,sBACA,UAAU;AAAA,sBACV,WAAU;AAAA,sBAET,0BAAgB,GAAG,UAAU,GAAG;AAAA;AAAA,kBACrC;AAAA;AAAA;AAAA,YAER;AAAA,aAKF,CAAC,CAAC,cAAc,UAAU,CAAC,CAAC,0BAC1B,CAAC,SACG,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,WAAWE;AAAA,kBACP;AAAA,kBACA,OACM,iDACA;AAAA,kBACN,YAAY;AAAA,gBAChB;AAAA,gBAEC;AAAA,mBAAC,CAAC,yBACC,gBAAAH;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWG;AAAA,wBACP;AAAA,wBACA;AAAA,0BACI,gDACI;AAAA,wBACR;AAAA,sBACJ;AAAA,sBACA,SAAS,MAAM;AACX,8BAAK;AAAA,sBACT;AAAA,sBACA,UAAU;AAAA,sBAET,aAAG;AAAA;AAAA,kBACR;AAAA,kBAEJ,gBAAAH;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWG;AAAA,wBACP;AAAA,wBACA;AAAA,0BACI,sBAAsB;AAAA,0BACtB,4CACI;AAAA,wBACR;AAAA,wBACA,YAAY;AAAA,sBAChB;AAAA,sBACA,SAAS,MAAM;AACX,6BAAK,aAAa;AAAA,sBACtB;AAAA,sBACA,UAAU;AAAA,sBAET,UAAAC;AAAA,wBACG;AAAA,0BACI;AAAA,0BACA;AAAA,0BACA,cAAc;AAAA,wBAClB;AAAA,wBACA,EAAE,OAAO,cAAc,OAAO;AAAA,sBAClC;AAAA;AAAA,kBACJ;AAAA,kBACA,gBAAAJ;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWG;AAAA,wBACP;AAAA,wBACA;AAAA,0BACI,gDACI;AAAA,wBACR;AAAA,wBACA,YAAY;AAAA,sBAChB;AAAA,sBACA,SAAS;AAAA,sBACT,UAAU;AAAA,sBAET,aAAG;AAAA;AAAA,kBACR;AAAA;AAAA;AAAA,YACJ;AAAA;AAAA;AAAA,MAEZ;AAAA;AAAA,EAER;AAER;;;AI9PA,SAAgB,YAAAE,iBAAgB;;;ACAhC,SAAS,aAAAC,YAAW,UAAAC,SAAQ,4BAA4B;AACxD,SAAS,iCAAiC;AAWnC,SAAS,mBAAmB,UASjC;AACE,QAAM,EAAE,UAAU,IAAI,mBAAmB;AACzC,QAAM,SAASC,QAAO,EAAE,UAAU,CAAC;AACnC,SAAO,UAAU,EAAE,UAAU;AAE7B,QAAM,gBAAgBA;AAAA,IAClB;AAAA,EACJ;AACA,MAAI,CAAC,cAAc,SAAS;AACxB,kBAAc,UAAU,IAAI,0BAA0B;AAAA,MAClD;AAAA,MACA,WAAW,MAAM,OAAO,QAAQ;AAAA,IACpC,CAAC;AAAA,EACL;AACA,QAAM,aAAa,cAAc;AAEjC,QAAM,OAAO;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,EACf;AAEA,EAAAC,WAAU,MAAM;AACZ,eAAW,KAAK;AAChB,WAAO,MAAM;AACT,iBAAW,QAAQ;AAAA,IACvB;AAAA,EACJ,GAAG,CAAC,UAAU,CAAC;AAEf,SAAO;AAAA,IACH,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,aAAa,CAAC,OAA2B;AACrC,iBAAW,YAAY,EAAE;AACzB,WAAK,WAAW,QAAQ;AAAA,IAC5B;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,WAAW,CAAC,MAAc;AACtB,iBAAW,UAAU,CAAC;AACtB,WAAK,WAAW,QAAQ;AAAA,IAC5B;AAAA,IACA,SAAS,CAAC,SACN,WAAW,QAAQ,IAAI;AAAA,IAC3B,UAAU,CAAC,SAA0B,WAAW,SAAS,IAAI;AAAA,IAC7D,WAAW,MAAM;AACb,iBAAW,UAAU;AAAA,IACzB;AAAA,EACJ;AACJ;;;ADvDA,SAAS,6BAA6B;AACtC,SAAS,MAAAC,WAAU;AAgCP,gBAAAC,MAgDQ,QAAAC,aAhDR;AAxBZ,IAAM,iBAAqD;AAAA,EACvD,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,SAAS;AAAA,EACT,KAAK;AACT;AAEe,SAAR,wBAAyC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,kBAAkB,eAAe,iBAAiB,QAAQ;AAC9D,GAA+C;AAC3C,QAAM,EAAE,QAAQ,KAAK,IAAI,iBAAiB;AAC1C,QAAM;AAAA,IACF,OAAO,EAAE,WAAW;AAAA,EACxB,IAAI,mBAAmB;AACvB,QAAM,EAAE,WAAW,IAAI,gBAAgB;AACvC,QAAM,EAAE,OAAO,QAAQ,WAAW,SAAS,UAAU,UAAU,IAC3D,mBAAmB,QAAQ;AAC/B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAsB,oBAAI,IAAI,CAAC;AAC/D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AAEtD,MAAI,MAAM,WAAW,UAAU;AAC3B,WACI,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACG,cAAc,eAAe,QAAQ;AAAA,QACrC,SAAS;AAAA;AAAA,IACb;AAAA,EAER;AAEA,QAAM,YAAY,MAAM,WAAW,aAAa,MAAM,WAAW;AACjE,QAAM,QAA2B,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC;AAE3E,QAAM,SAAS,CAAC,OAAe;AAC3B,gBAAY,UAAQ;AAChB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,QAAM,iBAAiB,YAAY;AAC/B,oBAAgB,IAAI;AACpB,QAAI;AACA,iBAAW,QAAQ,MAAM,OAAO,OAAK,SAAS,IAAI,EAAE,EAAE,CAAC,GAAG;AACtD,cAAM,SAAS,MAAM,SAAS,IAAI;AAClC,YAAI,OAAO,WAAW,UAAU;AAC5B,oBAAU;AACV;AAAA,QACJ;AAAA,MACJ;AACA,kBAAY,oBAAI,IAAI,CAAC;AACrB;AAAA,IACJ,UAAE;AACE,sBAAgB,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,kBAAgB;AAAA,MAEf,sBACG,gBAAAA,KAAC,cAAW,IAEZ,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACG,eAAY;AAAA,UACZ,WAAU;AAAA,UAEV;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAWF;AAAA,kBACP;AAAA,kBACA,OACM,iDACA;AAAA,gBACV;AAAA,gBACA,kBAAe;AAAA,gBAEf;AAAA,kCAAAC,KAAC,UAAK,WAAU,iCACX,yBAAe,QAAQ,GAC5B;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,cAAW;AAAA,sBACX,OAAO;AAAA,sBACP,UAAU,OAAK;AACX,kCAAU,EAAE,OAAO,KAAK;AAAA,sBAC5B;AAAA,sBACA,WAAW,OAAK;AACZ,4BAAI,EAAE,QAAQ,SAAS;AACnB,+BAAK,QAAQ;AAAA,4BACT,QAAQ,EAAE,cAAc;AAAA,0BAC5B,CAAC;AAAA,wBACL;AAAA,sBACJ;AAAA,sBACA,aAAY;AAAA,sBACZ,WAAWD;AAAA,wBACP;AAAA,wBACA,OACM,6DACA;AAAA,sBACV;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACJ;AAAA,YACA,gBAAAE,MAAC,SAAI,WAAU,+BACV;AAAA,oBAAM,WAAW,WACd,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,eAAY;AAAA,kBACZ,kBAAe;AAAA,kBACf,MAAK;AAAA,kBACL,WAAWD;AAAA,oBACP;AAAA,oBACA,OACM,sBACA;AAAA,kBACV;AAAA,kBAEC,gBAAM,QAAQ,aACT;AAAA,oBACI,UAAU,sBAAsB,MAAM,IAAI,CAAC;AAAA,oBAC3C,EAAE,MAAM,MAAM,KAAK;AAAA,kBACvB,IACA,MAAM;AAAA;AAAA,cAChB;AAAA,cAEH,MAAM,IAAI,UAAQ;AACf,sBAAM,aAAa,SAAS,IAAI,KAAK,EAAE;AACvC,uBACI,gBAAAE;AAAA,kBAAC;AAAA;AAAA,oBAEG,MAAK;AAAA,oBACL,SAAS,MAAM;AACX,2BAAK,WACC,KAAK,QAAQ;AAAA,wBACT,UAAU,KAAK;AAAA,sBACnB,CAAC,IACD,OAAO,KAAK,EAAE;AAAA,oBACxB;AAAA,oBACA,kBAAe;AAAA,oBACf,iBAAe;AAAA,oBACf,WAAWF;AAAA;AAAA,sBAEP;AAAA,sBACA,aACM,gDACA,OACE,+FACA;AAAA,oBACZ;AAAA,oBAEA;AAAA,sCAAAC;AAAA,wBAAC;AAAA;AAAA,0BACG,WAAU;AAAA,0BACV,eAAY;AAAA,0BAEX,eAAK,WACF,gBAAAA;AAAA,4BAAC;AAAA;AAAA,8BACG,SAAQ;AAAA,8BACR,OAAM;AAAA,8BACN,QAAO;AAAA,8BACP,MAAK;AAAA,8BACL,QAAO;AAAA,8BACP,aAAY;AAAA,8BACZ,eAAc;AAAA,8BACd,gBAAe;AAAA,8BAEf,0BAAAA,KAAC,UAAK,GAAE,6EAA4E;AAAA;AAAA,0BACxF,IAEA,gBAAAC;AAAA,4BAAC;AAAA;AAAA,8BACG,SAAQ;AAAA,8BACR,OAAM;AAAA,8BACN,QAAO;AAAA,8BACP,MAAK;AAAA,8BACL,QACI,OAAO,YAAY;AAAA,8BAEvB,aAAY;AAAA,8BACZ,eAAc;AAAA,8BACd,gBAAe;AAAA,8BAEf;AAAA,gDAAAD,KAAC,UAAK,GAAE,gEAA+D;AAAA,gCACvE,gBAAAA,KAAC,UAAK,GAAE,aAAY;AAAA;AAAA;AAAA,0BACxB;AAAA;AAAA,sBAER;AAAA,sBACA,gBAAAA,KAAC,UAAK,WAAU,6BACX,eAAK,MACV;AAAA,sBACC,KAAK,QAAQ,QAAQ,CAAC,KAAK,YACxB,gBAAAA,KAAC,UAAK,WAAU,gCACX,sBAAY,KAAK,IAAI,GAC1B;AAAA;AAAA;AAAA,kBA9DC,KAAK;AAAA,gBAgEd;AAAA,cAER,CAAC;AAAA,eACL;AAAA,YACA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,WAAWF;AAAA,kBACP;AAAA,kBACA,OACM,6BACA;AAAA,gBACV;AAAA,gBAEA;AAAA,kCAAAC;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBACb;AAAA;AAAA,kBAED;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBACL,UAAU,SAAS,SAAS,KAAK;AAAA,sBACjC,SAAS,MAAM,KAAK,eAAe;AAAA,sBACnC,WAAU;AAAA,sBAET,yBACK,oBACA,YAAY,SAAS,OAAO,KAAK,SAAS,IAAI,MAAM,EAAE;AAAA;AAAA,kBAChE;AAAA;AAAA;AAAA,YACJ;AAAA;AAAA;AAAA,MACJ;AAAA;AAAA,EAER;AAER;AAEA,SAAS,YAAY,OAAuB;AACxC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,MAAI,QAAQ,OAAO,OAAO;AACtB,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAChD,SAAO,IAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,CAAC,CAAC;AACvD;","names":["useState","t","cn","useEffect","useRef","cn","jsx","jsxs","useRef","useEffect","cn","cn","cn","jsx","cn","jsx","jsxs","cn","jsx","jsxs","useState","cn","t","useState","useEffect","useRef","useRef","useEffect","cn","jsx","jsxs","useState"]}
@@ -0,0 +1,39 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkIG62MHVQcjs = require('./chunk-IG62MHVQ.cjs');
4
+
5
+ // src/components/shared/SourceViewContainer.tsx
6
+ var _internal = require('@useupup/core/internal');
7
+ var _jsxruntime = require('react/jsx-runtime');
8
+ function SourceViewContainer({
9
+ children,
10
+ isLoading = false,
11
+ ...rest
12
+ }) {
13
+ var _a, _b;
14
+ const { isDark: dark, slotOverrides: slotClasses } = _chunkIG62MHVQcjs.useUploaderTheme.call(void 0, );
15
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
16
+ "div",
17
+ {
18
+ "data-testid": "upup-source-view",
19
+ className: _internal.cn.call(void 0,
20
+ // Transparent by design: the view body sits directly on the
21
+ // panel's gradient chrome (the old black/[0.075] wash read as
22
+ // a mismatched gray block over the light gradient).
23
+ "upup-flex upup-items-center upup-justify-center upup-overflow-hidden",
24
+ {
25
+ "upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]": isLoading && dark,
26
+ [(_a = slotClasses.sourceView) != null ? _a : ""]: !isLoading && slotClasses.sourceView,
27
+ [(_b = slotClasses.driveLoading) != null ? _b : ""]: isLoading && slotClasses.driveLoading
28
+ }
29
+ ),
30
+ ...rest,
31
+ children
32
+ }
33
+ );
34
+ }
35
+
36
+
37
+
38
+ exports.SourceViewContainer = SourceViewContainer;
39
+ //# sourceMappingURL=chunk-DZQBTC6T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-DZQBTC6T.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;AACA,kDAA2C;AAC3C,+CAAuC;AACvC,SAAS,mBAAmB,CAAC;AAC7B,EAAE,QAAQ;AACV,EAAE,UAAU,EAAE,KAAK;AACnB,EAAE,GAAG;AACL,CAAC,EAAE;AACH,EAAE,IAAI,EAAE,EAAE,EAAE;AACZ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,gDAAgB,CAAE;AACzE,EAAE,uBAAuB,6BAAG;AAC5B,IAAI,KAAK;AACT,IAAI;AACJ,MAAM,aAAa,EAAE,kBAAkB;AACvC,MAAM,SAAS,EAAE,0BAAE;AACnB;AACA;AACA;AACA,QAAQ,sEAAsE;AAC9E,QAAQ;AACR,UAAU,8CAA8C,EAAE,UAAU,GAAG,IAAI;AAC3E,UAAU,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU;AACjG,UAAU,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,YAAY,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;AACxF,QAAQ;AACR,MAAM,CAAC;AACP,MAAM,GAAG,IAAI;AACb,MAAM;AACN,IAAI;AACJ,EAAE,CAAC;AACH;AACA;AACA;AACE;AACF,kDAAC","file":"C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-DZQBTC6T.cjs","sourcesContent":[null]}
@@ -0,0 +1,195 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/lib/imageEditorHelpers.ts
2
+
3
+
4
+
5
+
6
+ var _internal = require('@useupup/core/internal');
7
+ function getFilerobotTheme(isDarkTheme) {
8
+ return isDarkTheme ? {
9
+ palette: {
10
+ "bg-secondary": "#1a1a1a",
11
+ "bg-primary": "#232323",
12
+ "bg-primary-active": "#2d2d2d",
13
+ "bg-stateless": "#2d2d2d",
14
+ "bg-hover": "#3a3a3a",
15
+ "bg-active": "#3a3a3a",
16
+ "accent-primary": "#30C5F7",
17
+ "accent-primary-hover": "#6DD8FB",
18
+ "accent-primary-active": "#6DD8FB",
19
+ accent_1_2_opacity: "rgba(48, 197, 247, 0.12)",
20
+ "accent-stateless": "#30C5F7",
21
+ "icon-primary": "#ffffff",
22
+ "icons-primary": "#ffffff",
23
+ "icons-secondary": "#d1d5db",
24
+ "icons-placeholder": "#9ca3af",
25
+ "borders-secondary": "#374151",
26
+ "borders-primary": "#4b5563",
27
+ "borders-strong": "#6b7280",
28
+ "borders-disabled": "#6b7280",
29
+ "borders-button": "#4b5563",
30
+ "light-shadow": "rgba(0, 0, 0, 0.4)",
31
+ warning: "#f59e0b",
32
+ "txt-primary": "#ffffff",
33
+ "txt-secondary": "#d1d5db",
34
+ "txt-primary-invert": "#232323",
35
+ "txt-secondary-invert": "#1a1a1a",
36
+ "btn-primary-text": "#ffffff",
37
+ "btn-secondary-text": "#d1d5db",
38
+ "btn-disabled-text": "#6b7280",
39
+ "link-stateless": "#d1d5db"
40
+ },
41
+ typography: {
42
+ fontFamily: "inherit"
43
+ }
44
+ } : {
45
+ palette: {
46
+ "bg-secondary": "#f9fafb",
47
+ "bg-primary": "#ffffff",
48
+ "bg-primary-active": "#f3f4f6",
49
+ "bg-stateless": "#ffffff",
50
+ "bg-hover": "#eff6ff",
51
+ "bg-active": "#dbeafe",
52
+ "accent-primary": "#2563eb",
53
+ "accent-primary-hover": "#1d4ed8",
54
+ "accent-primary-active": "#1e40af",
55
+ accent_1_2_opacity: "rgba(37, 99, 235, 0.12)",
56
+ "accent-stateless": "#2563eb",
57
+ "icon-primary": "#111827",
58
+ "icons-primary": "#111827",
59
+ "icons-secondary": "#4b5563",
60
+ "icons-placeholder": "#9ca3af",
61
+ "borders-secondary": "#e5e7eb",
62
+ "borders-primary": "#d1d5db",
63
+ "borders-strong": "#9ca3af",
64
+ "borders-disabled": "#d1d5db",
65
+ "borders-button": "#2563eb",
66
+ "light-shadow": "rgba(15, 23, 42, 0.12)",
67
+ warning: "#d97706",
68
+ "txt-primary": "#111827",
69
+ "txt-secondary": "#4b5563",
70
+ "txt-primary-invert": "#ffffff",
71
+ "txt-secondary-invert": "#f9fafb",
72
+ "btn-primary-text": "#ffffff",
73
+ "btn-secondary-text": "#1d4ed8",
74
+ "btn-disabled-text": "#93c5fd",
75
+ "link-stateless": "#2563eb"
76
+ },
77
+ typography: {
78
+ fontFamily: "inherit"
79
+ }
80
+ };
81
+ }
82
+ function getImageEditorCssOverrides(isDarkTheme) {
83
+ const common = `
84
+ /* Fill container */
85
+ .FIE_root {
86
+ height: 100% !important;
87
+ }
88
+ `;
89
+ return isDarkTheme ? common + `
90
+ /* Input background & border overrides (hardcoded in @scaleflex/ui) */
91
+ [data-upup-theme='dark'] .SfxInput-Base {
92
+ background-color: #2d2d2d !important;
93
+ border-color: #4b5563 !important;
94
+ }
95
+ [data-upup-theme='dark'] .SfxInput-Base:focus-within {
96
+ background-color: #353535 !important;
97
+ border-color: #6b7280 !important;
98
+ }
99
+ [data-upup-theme='dark'] .SfxInput-Base:hover {
100
+ background-color: #353535 !important;
101
+ }
102
+ /* Carousel gradient arrow overrides (hardcoded white in FIE) */
103
+ [data-upup-theme='dark'] .FIE_carousel-prev-button {
104
+ background: linear-gradient(
105
+ 90deg,
106
+ #232323 1.56%,
107
+ rgba(35, 35, 35, 0.89) 52.4%,
108
+ rgba(35, 35, 35, 0.53) 76.04%,
109
+ rgba(35, 35, 35, 0) 100%
110
+ ) !important;
111
+ }
112
+ [data-upup-theme='dark'] .FIE_carousel-next-button {
113
+ background: linear-gradient(
114
+ 270deg,
115
+ #232323 1.56%,
116
+ rgba(35, 35, 35, 0.89) 52.4%,
117
+ rgba(35, 35, 35, 0.53) 76.04%,
118
+ rgba(35, 35, 35, 0) 100%
119
+ ) !important;
120
+ }
121
+ [data-upup-theme='dark'] .FIE_topbar-save-button,
122
+ [data-upup-theme='dark'] .FIE_watermark-add-button {
123
+ background-color: #30c5f7 !important;
124
+ color: #ffffff !important;
125
+ border: none !important;
126
+ }
127
+ [data-upup-theme='dark'] .FIE_topbar-save-button .SfxButton-Label,
128
+ [data-upup-theme='dark'] .FIE_watermark-add-button .SfxButton-Label {
129
+ color: #ffffff !important;
130
+ opacity: 1 !important;
131
+ }
132
+ [data-upup-theme='dark'] .FIE_topbar-save-button:hover,
133
+ [data-upup-theme='dark'] .FIE_topbar-save-button:focus-visible,
134
+ [data-upup-theme='dark'] .FIE_watermark-add-button:hover,
135
+ [data-upup-theme='dark'] .FIE_watermark-add-button:focus-visible {
136
+ background-color: #6dd8fb !important;
137
+ }
138
+ [data-upup-theme='dark'] .FIE_topbar-save-button:active,
139
+ [data-upup-theme='dark'] .FIE_watermark-add-button:active {
140
+ background-color: #27b1df !important;
141
+ }
142
+ [data-upup-theme='dark'] .FIE_topbar-save-button:disabled,
143
+ [data-upup-theme='dark'] .FIE_watermark-add-button:disabled {
144
+ color: #9ca3af !important;
145
+ background-color: rgba(48, 197, 247, 0.12) !important;
146
+ border: 1px solid #4b5563 !important;
147
+ }
148
+ [data-upup-theme='dark'] .FIE_topbar-save-button:disabled .SfxButton-Label,
149
+ [data-upup-theme='dark'] .FIE_watermark-add-button:disabled .SfxButton-Label {
150
+ color: #9ca3af !important;
151
+ opacity: 1 !important;
152
+ }
153
+ ` : common + `
154
+ [data-upup-theme='light'] .FIE_topbar-save-button,
155
+ [data-upup-theme='light'] .FIE_watermark-add-button {
156
+ background-color: #2563eb !important;
157
+ color: #ffffff !important;
158
+ border: 1px solid #2563eb !important;
159
+ }
160
+ [data-upup-theme='light'] .FIE_topbar-save-button .SfxButton-Label,
161
+ [data-upup-theme='light'] .FIE_watermark-add-button .SfxButton-Label {
162
+ color: #ffffff !important;
163
+ opacity: 1 !important;
164
+ }
165
+ [data-upup-theme='light'] .FIE_topbar-save-button:hover,
166
+ [data-upup-theme='light'] .FIE_topbar-save-button:focus-visible,
167
+ [data-upup-theme='light'] .FIE_watermark-add-button:hover,
168
+ [data-upup-theme='light'] .FIE_watermark-add-button:focus-visible {
169
+ background-color: #1d4ed8 !important;
170
+ border-color: #1d4ed8 !important;
171
+ }
172
+ [data-upup-theme='light'] .FIE_topbar-save-button:active,
173
+ [data-upup-theme='light'] .FIE_watermark-add-button:active {
174
+ background-color: #1e40af !important;
175
+ border-color: #1e40af !important;
176
+ }
177
+ [data-upup-theme='light'] .FIE_topbar-save-button:disabled,
178
+ [data-upup-theme='light'] .FIE_watermark-add-button:disabled {
179
+ color: #93c5fd !important;
180
+ background-color: rgba(37, 99, 235, 0.12) !important;
181
+ border: 1px solid #bfdbfe !important;
182
+ }
183
+ [data-upup-theme='light'] .FIE_topbar-save-button:disabled .SfxButton-Label,
184
+ [data-upup-theme='light'] .FIE_watermark-add-button:disabled .SfxButton-Label {
185
+ color: #93c5fd !important;
186
+ opacity: 1 !important;
187
+ }
188
+ `;
189
+ }
190
+
191
+
192
+
193
+
194
+ exports.getFilerobotTheme = getFilerobotTheme; exports.getImageEditorCssOverrides = getImageEditorCssOverrides;
195
+ //# sourceMappingURL=chunk-GNMEQB32.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-GNMEQB32.cjs"],"names":[],"mappings":"AAAA;AACA;AACE;AACA;AACA;AACF,kDAA+B;AAC/B,SAAS,iBAAiB,CAAC,WAAW,EAAE;AACxC,EAAE,OAAO,YAAY,EAAE;AACvB,IAAI,OAAO,EAAE;AACb,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,YAAY,EAAE,SAAS;AAC7B,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,UAAU,EAAE,SAAS;AAC3B,MAAM,WAAW,EAAE,SAAS;AAC5B,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,sBAAsB,EAAE,SAAS;AACvC,MAAM,uBAAuB,EAAE,SAAS;AACxC,MAAM,kBAAkB,EAAE,0BAA0B;AACpD,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,eAAe,EAAE,SAAS;AAChC,MAAM,iBAAiB,EAAE,SAAS;AAClC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,iBAAiB,EAAE,SAAS;AAClC,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,cAAc,EAAE,oBAAoB;AAC1C,MAAM,OAAO,EAAE,SAAS;AACxB,MAAM,aAAa,EAAE,SAAS;AAC9B,MAAM,eAAe,EAAE,SAAS;AAChC,MAAM,oBAAoB,EAAE,SAAS;AACrC,MAAM,sBAAsB,EAAE,SAAS;AACvC,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,oBAAoB,EAAE,SAAS;AACrC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,gBAAgB,EAAE;AACxB,IAAI,CAAC;AACL,IAAI,UAAU,EAAE;AAChB,MAAM,UAAU,EAAE;AAClB,IAAI;AACJ,EAAE,EAAE,EAAE;AACN,IAAI,OAAO,EAAE;AACb,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,YAAY,EAAE,SAAS;AAC7B,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,UAAU,EAAE,SAAS;AAC3B,MAAM,WAAW,EAAE,SAAS;AAC5B,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,sBAAsB,EAAE,SAAS;AACvC,MAAM,uBAAuB,EAAE,SAAS;AACxC,MAAM,kBAAkB,EAAE,yBAAyB;AACnD,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,cAAc,EAAE,SAAS;AAC/B,MAAM,eAAe,EAAE,SAAS;AAChC,MAAM,iBAAiB,EAAE,SAAS;AAClC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,iBAAiB,EAAE,SAAS;AAClC,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,gBAAgB,EAAE,SAAS;AACjC,MAAM,cAAc,EAAE,wBAAwB;AAC9C,MAAM,OAAO,EAAE,SAAS;AACxB,MAAM,aAAa,EAAE,SAAS;AAC9B,MAAM,eAAe,EAAE,SAAS;AAChC,MAAM,oBAAoB,EAAE,SAAS;AACrC,MAAM,sBAAsB,EAAE,SAAS;AACvC,MAAM,kBAAkB,EAAE,SAAS;AACnC,MAAM,oBAAoB,EAAE,SAAS;AACrC,MAAM,mBAAmB,EAAE,SAAS;AACpC,MAAM,gBAAgB,EAAE;AACxB,IAAI,CAAC;AACL,IAAI,UAAU,EAAE;AAChB,MAAM,UAAU,EAAE;AAClB,IAAI;AACJ,EAAE,CAAC;AACH;AACA,SAAS,0BAA0B,CAAC,WAAW,EAAE;AACjD,EAAE,MAAM,OAAO,EAAE,CAAC;AAClB;AACA;AACA;AACA;AACA,IAAI,CAAC;AACL,EAAE,OAAO,YAAY,EAAE,OAAO,EAAE,CAAC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,CAAC;AACT;AACA;AACA;AACE;AACA;AACF,+GAAC","file":"C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-GNMEQB32.cjs","sourcesContent":[null]}