@useupup/angular 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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/README.md +71 -0
  4. package/dist/assets/logos.d.ts +4 -0
  5. package/dist/components/audio-uploader.component.d.ts +48 -0
  6. package/dist/components/audio-waveform.component.d.ts +24 -0
  7. package/dist/components/box-uploader.component.d.ts +22 -0
  8. package/dist/components/camera-uploader.component.d.ts +44 -0
  9. package/dist/components/client-box-uploader.component.d.ts +23 -0
  10. package/dist/components/client-dropbox-uploader.component.d.ts +23 -0
  11. package/dist/components/client-google-drive-uploader.component.d.ts +28 -0
  12. package/dist/components/client-one-drive-uploader.component.d.ts +23 -0
  13. package/dist/components/default-add-more-icon.component.d.ts +12 -0
  14. package/dist/components/dropbox-uploader.component.d.ts +22 -0
  15. package/dist/components/file-hero.component.d.ts +36 -0
  16. package/dist/components/file-icon.component.d.ts +12 -0
  17. package/dist/components/file-item.component.d.ts +28 -0
  18. package/dist/components/file-list.component.d.ts +71 -0
  19. package/dist/components/file-preview-portal.component.d.ts +52 -0
  20. package/dist/components/file-preview-thumbnail.component.d.ts +40 -0
  21. package/dist/components/file-preview.component.d.ts +55 -0
  22. package/dist/components/file-row.component.d.ts +43 -0
  23. package/dist/components/google-drive-uploader.component.d.ts +22 -0
  24. package/dist/components/icon.component.d.ts +17 -0
  25. package/dist/components/icons/audio-icon.component.d.ts +6 -0
  26. package/dist/components/icons/box-icon.component.d.ts +6 -0
  27. package/dist/components/icons/camera-icon.component.d.ts +6 -0
  28. package/dist/components/icons/chevron-left-icon.component.d.ts +6 -0
  29. package/dist/components/icons/default-loader-icon.component.d.ts +5 -0
  30. package/dist/components/icons/dropbox-icon.component.d.ts +6 -0
  31. package/dist/components/icons/empty-icon.component.d.ts +6 -0
  32. package/dist/components/icons/file-icon-svg.component.d.ts +8 -0
  33. package/dist/components/icons/folder-filled-icon.component.d.ts +6 -0
  34. package/dist/components/icons/google-drive-icon.component.d.ts +6 -0
  35. package/dist/components/icons/index.d.ts +25 -0
  36. package/dist/components/icons/layout-grid-icon.component.d.ts +6 -0
  37. package/dist/components/icons/layout-list-icon.component.d.ts +6 -0
  38. package/dist/components/icons/link-icon.component.d.ts +6 -0
  39. package/dist/components/icons/loader-icon.component.d.ts +6 -0
  40. package/dist/components/icons/my-device-icon.component.d.ts +6 -0
  41. package/dist/components/icons/one-drive-icon.component.d.ts +6 -0
  42. package/dist/components/icons/player-pause-filled-icon.component.d.ts +6 -0
  43. package/dist/components/icons/player-play-filled-icon.component.d.ts +6 -0
  44. package/dist/components/icons/screen-capture-icon.component.d.ts +6 -0
  45. package/dist/components/icons/search-icon.component.d.ts +6 -0
  46. package/dist/components/icons/trash-icon.component.d.ts +14 -0
  47. package/dist/components/icons/upload-icon.component.d.ts +7 -0
  48. package/dist/components/icons/user-icon.component.d.ts +6 -0
  49. package/dist/components/icons/x-icon.component.d.ts +6 -0
  50. package/dist/components/image-editor-stub.component.d.ts +13 -0
  51. package/dist/components/one-drive-uploader.component.d.ts +22 -0
  52. package/dist/components/progress-bar.component.d.ts +30 -0
  53. package/dist/components/screen-capture-uploader.component.d.ts +47 -0
  54. package/dist/components/server-mode-drive-uploader.component.d.ts +49 -0
  55. package/dist/components/shared/drive-auth-fallback.component.d.ts +27 -0
  56. package/dist/components/shared/drive-browser-header.component.d.ts +64 -0
  57. package/dist/components/shared/drive-browser-icon.component.d.ts +16 -0
  58. package/dist/components/shared/drive-browser-item.component.d.ts +21 -0
  59. package/dist/components/shared/drive-browser.component.d.ts +52 -0
  60. package/dist/components/shared/file-success-check.component.d.ts +21 -0
  61. package/dist/components/source-selector.component.d.ts +35 -0
  62. package/dist/components/source-view-container.component.d.ts +29 -0
  63. package/dist/components/source-view.component.d.ts +46 -0
  64. package/dist/components/uploader-header.component.d.ts +36 -0
  65. package/dist/components/uploader-panel.component.d.ts +59 -0
  66. package/dist/components/url-uploader.component.d.ts +30 -0
  67. package/dist/context/source-view-header-extra.service.d.ts +21 -0
  68. package/dist/fesm2022/useupup-angular.mjs +9561 -0
  69. package/dist/fesm2022/useupup-angular.mjs.map +1 -0
  70. package/dist/index.d.ts +5 -0
  71. package/dist/lib/to-signal-store.d.ts +20 -0
  72. package/dist/lib/use-sse-processing.d.ts +19 -0
  73. package/dist/lib/use-tiles-per-row.d.ts +18 -0
  74. package/dist/lib/use-upup-upload.d.ts +40 -0
  75. package/dist/lib/view-mode.d.ts +23 -0
  76. package/dist/public-api.d.ts +9 -0
  77. package/dist/services/box.service.d.ts +40 -0
  78. package/dist/services/camera-uploader.service.d.ts +32 -0
  79. package/dist/services/dropbox.service.d.ts +40 -0
  80. package/dist/services/fetch-file-by-url.service.d.ts +17 -0
  81. package/dist/services/google-drive.service.d.ts +47 -0
  82. package/dist/services/one-drive.service.d.ts +39 -0
  83. package/dist/services/server-mode-drive.service.d.ts +30 -0
  84. package/dist/shared/types.d.ts +14 -0
  85. package/dist/styles.d.ts +4 -0
  86. package/dist/tailwind-prefixed.css +2499 -0
  87. package/dist/upup-store.service.d.ts +131 -0
  88. package/dist/upup-uploader.component.d.ts +36 -0
  89. package/package.json +109 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useupup-angular.mjs","sources":["../../src/lib/use-upup-upload.ts","../../src/lib/use-sse-processing.ts","../../src/lib/to-signal-store.ts","../../src/components/icons/empty-icon.component.ts","../../src/components/icon.component.ts","../../src/components/icons/trash-icon.component.ts","../../src/components/default-add-more-icon.component.ts","../../src/upup-store.service.ts","../../src/context/source-view-header-extra.service.ts","../../src/services/fetch-file-by-url.service.ts","../../src/components/source-view-container.component.ts","../../src/components/url-uploader.component.ts","../../src/services/camera-uploader.service.ts","../../src/components/camera-uploader.component.ts","../../src/components/audio-waveform.component.ts","../../src/components/audio-uploader.component.ts","../../src/components/screen-capture-uploader.component.ts","../../src/services/google-drive.service.ts","../../src/components/shared/drive-auth-fallback.component.ts","../../src/components/icons/search-icon.component.ts","../../src/components/icons/chevron-left-icon.component.ts","../../src/components/icons/user-icon.component.ts","../../src/components/shared/drive-browser-header.component.ts","../../src/components/icons/folder-filled-icon.component.ts","../../src/components/icons/file-icon-svg.component.ts","../../src/components/shared/drive-browser-icon.component.ts","../../src/components/shared/drive-browser-item.component.ts","../../src/components/shared/drive-browser.component.ts","../../src/components/client-google-drive-uploader.component.ts","../../src/services/server-mode-drive.service.ts","../../src/components/server-mode-drive-uploader.component.ts","../../src/components/google-drive-uploader.component.ts","../../src/services/one-drive.service.ts","../../src/components/client-one-drive-uploader.component.ts","../../src/components/one-drive-uploader.component.ts","../../src/services/dropbox.service.ts","../../src/components/client-dropbox-uploader.component.ts","../../src/components/dropbox-uploader.component.ts","../../src/services/box.service.ts","../../src/components/client-box-uploader.component.ts","../../src/components/box-uploader.component.ts","../../src/components/image-editor-stub.component.ts","../../src/components/icons/loader-icon.component.ts","../../src/components/icons/default-loader-icon.component.ts","../../src/components/icons/upload-icon.component.ts","../../src/components/icons/player-play-filled-icon.component.ts","../../src/components/icons/player-pause-filled-icon.component.ts","../../src/components/icons/x-icon.component.ts","../../src/components/icons/layout-grid-icon.component.ts","../../src/components/icons/layout-list-icon.component.ts","../../src/components/icons/my-device-icon.component.ts","../../src/components/icons/box-icon.component.ts","../../src/components/icons/dropbox-icon.component.ts","../../src/components/icons/google-drive-icon.component.ts","../../src/components/icons/one-drive-icon.component.ts","../../src/components/icons/link-icon.component.ts","../../src/components/icons/camera-icon.component.ts","../../src/components/icons/audio-icon.component.ts","../../src/components/icons/screen-capture-icon.component.ts","../../src/components/source-view.component.ts","../../src/components/source-selector.component.ts","../../src/components/uploader-header.component.ts","../../src/components/progress-bar.component.ts","../../src/components/file-icon.component.ts","../../src/components/file-preview-thumbnail.component.ts","../../src/components/shared/file-success-check.component.ts","../../src/components/file-preview.component.ts","../../src/components/file-preview-portal.component.ts","../../src/components/file-row.component.ts","../../src/components/file-item.component.ts","../../src/components/file-hero.component.ts","../../src/lib/view-mode.ts","../../src/lib/use-tiles-per-row.ts","../../src/components/file-list.component.ts","../../src/assets/logos.ts","../../src/components/uploader-panel.component.ts","../../src/upup-uploader.component.ts","../../src/useupup-angular.ts"],"sourcesContent":["import { signal, type WritableSignal } from '@angular/core'\r\nimport { UpupCore, UploadStatus } from '@useupup/core'\r\nimport type { CoreOptions, UploadFile, ExtensionMethods } from '@useupup/core'\r\n\r\nexport interface UseUpupUploadOptions extends CoreOptions {\r\n onFileAdded?: (files: UploadFile[]) => void\r\n onFileRemoved?: (file: UploadFile) => void\r\n onUploadProgress?: (progress: {\r\n fileId: string\r\n loaded: number\r\n total: number\r\n }) => void\r\n onUploadComplete?: (files: UploadFile[]) => void\r\n}\r\n\r\nexport interface UpupUploadHandle {\r\n files: WritableSignal<UploadFile[]>\r\n status: WritableSignal<UploadStatus>\r\n progress: WritableSignal<{\r\n totalFiles: number\r\n completedFiles: number\r\n percentage: number\r\n }>\r\n error: WritableSignal<Error | null>\r\n addFiles(files: File[]): Promise<void>\r\n removeFile(id: string): void\r\n removeAll(): void\r\n setFiles(files: File[]): Promise<void>\r\n reorderFiles(ids: string[]): void\r\n upload(): Promise<UploadFile[]>\r\n pause(): void\r\n resume(): void\r\n cancel(): void\r\n retry(fileId?: string): Promise<UploadFile[]>\r\n on(event: string, handler: (payload: unknown) => void): () => void\r\n ext: Record<string, ExtensionMethods>\r\n core: UpupCore\r\n start(): void\r\n destroy(): void\r\n}\r\n\r\n/** Single-use: after destroy() the underlying UpupCore is destroyed; do not call start() again on the same instance. */\r\nexport function createUpupUpload(\r\n options: UseUpupUploadOptions,\r\n): UpupUploadHandle {\r\n const core = new UpupCore(options)\r\n const files = signal<UploadFile[]>([...core.files.values()])\r\n const status = signal<UploadStatus>(core.status)\r\n const progress = signal({ totalFiles: 0, completedFiles: 0, percentage: 0 })\r\n const error = signal<Error | null>(null)\r\n const unsubs: Array<() => void> = []\r\n let started = false\r\n let destroyed = false\r\n\r\n return {\r\n files,\r\n status,\r\n progress,\r\n error,\r\n addFiles: (f: File[]) => core.addFiles(f),\r\n removeFile: (id: string) => {\r\n core.removeFile(id)\r\n },\r\n removeAll: () => {\r\n core.removeAll()\r\n },\r\n setFiles: (f: File[]) => core.setFiles(f),\r\n reorderFiles: (ids: string[]) => {\r\n core.reorderFiles(ids)\r\n },\r\n upload: () => core.upload(),\r\n pause: () => {\r\n core.pause()\r\n },\r\n resume: () => {\r\n core.resume()\r\n },\r\n cancel: () => {\r\n core.cancel()\r\n },\r\n retry: (id?: string) => core.retry(id),\r\n // Untyped passthrough — this port's public `on` stays string-typed;\r\n // the typed CoreEvents surface lives on core itself (F-723). Dynamic\r\n // names route through the namespaced overload (same runtime dispatch).\r\n on: (e: string, h: (payload: unknown) => void) =>\r\n core.on(e as `${string}:${string}`, h),\r\n ext: core.ext,\r\n core,\r\n\r\n start() {\r\n if (started) return\r\n started = true\r\n\r\n // Sync signals on every state-change\r\n unsubs.push(\r\n core.on('state-change', () => {\r\n files.set([...core.files.values()])\r\n status.set(core.status)\r\n progress.set(core.progress)\r\n error.set(core.error)\r\n }),\r\n )\r\n\r\n // Forward optional callbacks.\r\n // core.emit(event, payload) calls handler(payload) — single payload arg.\r\n const onFileAdded = options.onFileAdded\r\n if (onFileAdded) {\r\n unsubs.push(\r\n core.on('files-added', payload => {\r\n onFileAdded(payload)\r\n }),\r\n )\r\n }\r\n const onFileRemoved = options.onFileRemoved\r\n if (onFileRemoved) {\r\n unsubs.push(\r\n core.on('file-removed', payload => {\r\n onFileRemoved(payload)\r\n }),\r\n )\r\n }\r\n const onUploadProgress = options.onUploadProgress\r\n if (onUploadProgress) {\r\n unsubs.push(\r\n core.on('upload-progress', payload => {\r\n onUploadProgress(payload)\r\n }),\r\n )\r\n }\r\n const onUploadComplete = options.onUploadComplete\r\n if (onUploadComplete) {\r\n unsubs.push(\r\n core.on('upload-all-complete', payload => {\r\n onUploadComplete(payload)\r\n }),\r\n )\r\n }\r\n },\r\n\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n unsubs.forEach(u => {\r\n u()\r\n })\r\n unsubs.length = 0\r\n core.destroy()\r\n },\r\n }\r\n}\r\n","import type { UploadFile } from '@useupup/core'\r\nimport { SSEProcessor } from '@useupup/core/internal'\r\n\r\nexport type SSEProcessingOptions = {\r\n processingEndpoint?: string | undefined\r\n onFileProcessed?:\r\n ((file: UploadFile, data: Record<string, unknown>) => void) | undefined\r\n onError?: ((error: Error) => void) | undefined\r\n processingTimeout?: number | undefined\r\n}\r\n\r\n/**\r\n * Framework-free SSE processing helper (ported from @useupup/svelte useSSEProcessing).\r\n * Returns { connectSSE(file), destroy() }.\r\n * - connectSSE opens an EventSource at processingEndpoint?key=file.key.\r\n * - destroy tears down all open EventSources and timers.\r\n *\r\n * No Svelte lifecycle hooks — callers push destroy() into their own cleanup array.\r\n */\r\nexport function createSSEProcessing({\r\n processingEndpoint,\r\n onFileProcessed,\r\n onError,\r\n processingTimeout = 60_000,\r\n}: SSEProcessingOptions): {\r\n connectSSE(file: UploadFile): void\r\n destroy(): void\r\n} {\r\n const processor = new SSEProcessor()\r\n let destroyed = false\r\n\r\n function connectSSE(file: UploadFile): void {\r\n const key = file.key\r\n if (!processingEndpoint || !onFileProcessed || !key) return\r\n\r\n processor.subscribe(\r\n key,\r\n processingEndpoint,\r\n (data: Record<string, unknown>) => {\r\n onFileProcessed(file, data)\r\n },\r\n (error: Error) => onError?.(error),\r\n processingTimeout,\r\n )\r\n }\r\n\r\n function destroy(): void {\r\n if (destroyed) return\r\n destroyed = true\r\n processor.destroy()\r\n }\r\n\r\n return { connectSSE, destroy }\r\n}\r\n","import { signal, type Signal } from '@angular/core'\r\n\r\n/** The subscribe/getSnapshot contract every @useupup/core headless store satisfies. */\r\nexport interface HeadlessStore<S> {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): S\r\n}\r\n\r\n/** The Angular-signal view returned by toSignalStore. Call destroy() in ngOnDestroy / DestroyRef. */\r\nexport interface SignalStore<S> {\r\n state: Signal<S>\r\n destroy: () => void\r\n}\r\n\r\n/**\r\n * Bridge a headless @useupup/core store to an Angular signal. State mirroring only —\r\n * init()/destroy() stay the caller's responsibility (Angular ngOnInit/DestroyRef),\r\n * mirroring @useupup/svelte's toReadable and keeping SSR side-effect-free.\r\n * The orchestrator returns a fresh snapshot object on every change, so Object.is\r\n * (the signal default) always sees a new reference, ensuring no real update is\r\n * silently dropped. destroy() is idempotent — safe to call more than once.\r\n */\r\nexport function toSignalStore<S>(store: HeadlessStore<S>): SignalStore<S> {\r\n const state = signal<S>(store.getSnapshot())\r\n let active = true\r\n const unsub = store.subscribe(() => {\r\n state.set(store.getSnapshot())\r\n })\r\n return {\r\n state,\r\n destroy: () => {\r\n if (!active) return\r\n active = false\r\n unsub()\r\n },\r\n }\r\n}\r\n","import { Component } from '@angular/core'\r\n\r\n/** Renders nothing. Default placeholder for optional icon props. */\r\n@Component({\r\n selector: 'upup-icon-empty',\r\n standalone: true,\r\n template: '',\r\n})\r\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class -- Angular requires a class as the component host; template renders nothing\r\nexport class EmptyIconComponent {}\r\n","import { Component, Input, inject, type OnChanges } from '@angular/core'\r\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser'\r\nimport { ICONS, type IconName } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\n\r\n@Component({\r\n selector: 'upup-icon',\r\n standalone: true,\r\n template: `<svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n [attr.viewBox]=\"def.viewBox\"\r\n [attr.width]=\"px\"\r\n [attr.height]=\"px\"\r\n [attr.fill]=\"def.attrs?.['fill'] ?? null\"\r\n [attr.stroke]=\"def.attrs?.['stroke'] ?? null\"\r\n [attr.stroke-width]=\"def.attrs?.['stroke-width'] ?? null\"\r\n [attr.stroke-linecap]=\"def.attrs?.['stroke-linecap'] ?? null\"\r\n [attr.stroke-linejoin]=\"def.attrs?.['stroke-linejoin'] ?? null\"\r\n [attr.fill-rule]=\"def.attrs?.['fill-rule'] ?? null\"\r\n [class]=\"klass\"\r\n [innerHTML]=\"safeInner\"\r\n ></svg>`,\r\n})\r\nexport class IconComponent implements OnChanges {\r\n private sanitizer = inject(DomSanitizer)\r\n @Input({ required: true }) name!: IconName\r\n @Input() size?: number\r\n @Input('class') className = ''\r\n\r\n def = ICONS['x']\r\n px = 24\r\n klass = ''\r\n safeInner: SafeHtml = ''\r\n\r\n ngOnChanges(): void {\r\n this.def = ICONS[this.name]\r\n this.px = this.size ?? this.def.defaultSize\r\n this.klass = cn(this.def.className, this.className)\r\n this.safeInner = this.sanitizer.bypassSecurityTrustHtml(this.def.inner)\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n/**\r\n * Default file-delete glyph — renders the shared registry 'trash' icon (parity with\r\n * React's react-icons TbTrash default for icons.FileDeleteIcon).\r\n *\r\n * Rendered via NgComponentOutlet (no inputs passed), so the file-card delete-button\r\n * size (upup-h-3 upup-w-3, matching React's <FileDeleteIcon className=\"upup-h-3 upup-w-3\" />)\r\n * is baked as the default class.\r\n */\r\n@Component({\r\n selector: 'upup-icon-trash',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"trash\" [class]=\"className\" />`,\r\n})\r\nexport class TrashIconComponent {\r\n @Input('class') className: string = 'upup-h-3 upup-w-3'\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from './icon.component'\r\n\r\n/**\r\n * Default 'add more' glyph — renders the shared registry 'plus' icon (parity\r\n * with React's DefaultPlusIconComponent / svelte's DefaultAddMoreIcon). This is\r\n * the store's default ContainerAddMoreIcon; healing F-711 (the angular header\r\n * previously defaulted to the empty icon, so no add-more SVG rendered).\r\n */\r\n@Component({\r\n selector: 'upup-default-add-more-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"plus\" [size]=\"size\" />`,\r\n})\r\nexport class DefaultAddMoreIconComponent {\r\n @Input() size?: number\r\n}\r\n","import { Injectable, computed, signal, type Signal } from '@angular/core'\r\nimport {\r\n FileSource,\r\n UploadStatus,\r\n type CloudDrivesConfig,\r\n type UploadFile,\r\n type UiTranslations,\r\n type Translator,\r\n type ResolvedImageEditorOptions,\r\n} from '@useupup/core'\r\nimport {\r\n UploaderOrchestrator,\r\n ThemeStore,\r\n normalizeUploaderOptions,\r\n createUploaderController,\r\n type UploaderControllerOptions,\r\n type UploaderController,\r\n type MotionMode,\r\n type TransientUiSnapshot,\r\n type CloudProvider,\r\n} from '@useupup/core/internal'\r\n\r\n/** Read-only drive provider → flattened i18n label key (the human provider name\r\n * for the drop-rejection toast). Typed `Record<CloudProvider, keyof\r\n * UiTranslations>` so the compiler enforces exhaustiveness against the same\r\n * drive-source union core's DragDropController gates on. */\r\nconst DRIVE_SOURCE_LABEL_KEY: Record<CloudProvider, keyof UiTranslations> = {\r\n googleDrive: 'googleDrive',\r\n oneDrive: 'oneDrive',\r\n dropbox: 'dropbox',\r\n box: 'box',\r\n}\r\nimport { createUpupUpload, type UpupUploadHandle } from './lib/use-upup-upload'\r\nimport { createSSEProcessing } from './lib/use-sse-processing'\r\nimport { toSignalStore, type SignalStore } from './lib/to-signal-store'\r\nimport type { UploaderProps } from './shared/types'\r\nimport { EmptyIconComponent } from './components/icons/empty-icon.component'\r\nimport { TrashIconComponent } from './components/icons/trash-icon.component'\r\nimport { DefaultAddMoreIconComponent } from './components/default-add-more-icon.component'\r\n\r\n// Stable sentinel — avoids allocating a new object on every init() when style is not passed.\r\nconst EMPTY_STYLE: Record<string, string> = {}\r\n\r\ntype OrchSnapshot = ReturnType<UploaderOrchestrator['getSnapshot']>\r\ntype ThemeSnapshot = ReturnType<ThemeStore['getSnapshot']>\r\n\r\n@Injectable() // component-scoped: add to the component's providers:[UpupStore]\r\nexport class UpupStore {\r\n private props?: UploaderProps\r\n private upload!: UpupUploadHandle\r\n private controller!: UploaderController\r\n core!: UpupUploadHandle['core']\r\n private orchState!: SignalStore<OrchSnapshot>\r\n\r\n /** The orchestrator instance, exposed for the dropzone DragDropController. Set during init(). */\r\n get orchestrator(): UploaderOrchestrator {\r\n return this.controller.orchestrator\r\n }\r\n\r\n private themeState!: SignalStore<ThemeSnapshot>\r\n private transientState!: SignalStore<TransientUiSnapshot>\r\n private motionState!: SignalStore<MotionMode>\r\n private started = false\r\n private destroyed = false\r\n private cleanups: Array<() => void> = []\r\n\r\n /** Set during init(); undefined before init() is called. */\r\n mode!: 'client' | 'server'\r\n serverUrl?: string | undefined\r\n\r\n // ── i18n (set during init()) ─────────────────────────────────\r\n translations!: Signal<UiTranslations>\r\n translator!: Translator\r\n lang!: string\r\n dir!: string\r\n\r\n // ── Cloud drive config (set during init()) ───────────────────\r\n cloudDrives?: CloudDrivesConfig | undefined\r\n\r\n // ── Resolved UI options aggregate (set during init()) ────────\r\n uiProps!: {\r\n mini: boolean\r\n maxRetries?: number | undefined\r\n resumable?: UploaderProps['resumable'] | undefined\r\n onError: (message: string) => void\r\n onIntegrationClick: (integrationType: string) => void\r\n onFileClick: (file: UploadFile) => void\r\n onFilesDragOver: (files: File[]) => void\r\n onFilesDragLeave: (files: File[]) => void\r\n onFilesDrop: (files: File[]) => void\r\n onWarn: (message: string) => void\r\n enablePaste: boolean\r\n sources: FileSource[]\r\n allowedFileTypes: string\r\n maxFileSize?: UploaderProps['maxFileSize'] | undefined\r\n limit: number\r\n isProcessing: boolean\r\n allowPreview: boolean\r\n folderUploadAllowDrop: boolean\r\n folderPickerButtonVisible: boolean\r\n showBranding: boolean\r\n quietCompletion: boolean\r\n disableDragDrop: boolean\r\n className: string\r\n style: Record<string, string>\r\n multiple: boolean\r\n icons: {\r\n ContainerAddMoreIcon: unknown\r\n FileDeleteIcon: unknown\r\n CameraCaptureIcon: unknown\r\n CameraRotateIcon: unknown\r\n CameraDeleteIcon: unknown\r\n LoaderIcon: unknown\r\n }\r\n imageEditor: ResolvedImageEditorOptions\r\n }\r\n\r\n // ── orchState computeds ──────────────────────────────────────\r\n files!: Signal<OrchSnapshot['files']>\r\n activeSource!: Signal<FileSource | undefined>\r\n isAddingMore!: Signal<boolean>\r\n viewMode!: Signal<'grid' | 'list'>\r\n isOnline!: Signal<boolean>\r\n editingFile!: Signal<UploadFile | null>\r\n totalProgress!: Signal<number>\r\n filesProgressMap!: Signal<OrchSnapshot['filesProgressMap']>\r\n uploadStatus!: Signal<UploadStatus>\r\n uploadError!: Signal<string | undefined>\r\n uploadErrorCode!: Signal<string | undefined>\r\n uploadSpeed!: Signal<number>\r\n uploadEta!: Signal<number>\r\n uploadedBytes!: Signal<number>\r\n totalBytes!: Signal<number>\r\n editorQueue!: Signal<OrchSnapshot['editorQueue']>\r\n\r\n // ── transient-ui computeds (deferred removal / add-more overlay / toast) ──\r\n leavingFileIds!: Signal<ReadonlySet<string>>\r\n sourceOverlayOpen!: Signal<boolean>\r\n sourceOverlayClosing!: Signal<boolean>\r\n dropRejected!: Signal<string | null>\r\n motionMode!: Signal<MotionMode>\r\n\r\n // ── themeState computeds ─────────────────────────────────────\r\n themeMode!: Signal<ThemeSnapshot['themeMode']>\r\n isDark!: Signal<boolean>\r\n tokens!: Signal<ThemeSnapshot['tokens']>\r\n resolved!: Signal<ThemeSnapshot['resolved']>\r\n slotOverrides!: Signal<ThemeSnapshot['slotOverrides']>\r\n slots!: Signal<ThemeSnapshot['slots']>\r\n\r\n /** Call before init() to provide props. */\r\n setConfig(props: UploaderProps): void {\r\n this.props = props\r\n }\r\n\r\n // Single error/warn routing (mirrors svelte create-uploader-context.ts's onError/onWarn, ~lines 85-90).\r\n private onError(message: string): void {\r\n this.props?.onError?.(message)\r\n }\r\n private onWarn(message: string): void {\r\n this.props?.onWarn?.(message)\r\n }\r\n\r\n init(): void {\r\n // Reset destroyed flag at the TOP so the destroy()→init() rebuild cycle works\r\n // repeatedly (even if init() was never called before this cycle).\r\n this.destroyed = false\r\n\r\n if (this.started) return\r\n this.started = true\r\n\r\n // ── Build factory-compatible options object ───────────────\r\n // UploaderProps.allowedFileTypes is string | string[] | undefined;\r\n // UploaderControllerOptions.allowedFileTypes is string | undefined.\r\n // normalizeUploaderOptions handles both via join cast.\r\n const p = this.props ?? {}\r\n const acceptProp = p.allowedFileTypes ?? '*'\r\n const factoryOptions: UploaderControllerOptions = {\r\n provider: p.provider,\r\n mode: p.mode,\r\n sources: p.sources,\r\n uploadEndpoint: p.uploadEndpoint,\r\n serverUrl: p.serverUrl,\r\n maxFiles: p.maxFiles,\r\n theme: p.theme,\r\n folderUpload: p.folderUpload,\r\n cors: p.cors,\r\n cloudDrives: p.cloudDrives,\r\n imageCompression: p.imageCompression ?? false,\r\n thumbnailGenerator: p.thumbnailGenerator ?? false,\r\n checksumVerification: p.checksumVerification ?? false,\r\n webWorker: p.webWorker,\r\n heicConversion: p.heicConversion ?? false,\r\n stripExifData: p.stripExifData ?? false,\r\n contentDeduplication: p.contentDeduplication ?? false,\r\n autoUpload: p.autoUpload ?? false,\r\n maxConcurrentUploads: p.maxConcurrentUploads,\r\n crashRecovery: p.crashRecovery ?? false,\r\n // No `??` default: `undefined` must reach core so its default-on\r\n // network awareness applies; only an explicit `false` opts out.\r\n networkAware: p.networkAware,\r\n allowedFileTypes:\r\n typeof acceptProp === 'string'\r\n ? acceptProp\r\n : acceptProp.join(','),\r\n mini: p.mini ?? false,\r\n animations: p.animations ?? true,\r\n isProcessing: p.isProcessing ?? false,\r\n allowPreview: p.allowPreview ?? true,\r\n showBranding: p.showBranding ?? true,\r\n quietCompletion: p.quietCompletion ?? false,\r\n disableDragDrop: p.disableDragDrop ?? false,\r\n className: p.className,\r\n maxFileSize: p.maxFileSize,\r\n minFileSize: p.minFileSize,\r\n maxTotalFileSize: p.maxTotalFileSize,\r\n imageEditor: p.imageEditor,\r\n metadata: p.metadata,\r\n maxRetries: p.maxRetries,\r\n resumable: p.resumable,\r\n i18n: p.i18n,\r\n onBeforeFileAdded: p.onBeforeFileAdded,\r\n onError: p.onError,\r\n onWarn: p.onWarn,\r\n onUploadStart: p.onUploadStart ?? (() => {}),\r\n onFileUploadStart: p.onFileUploadStart ?? (() => {}),\r\n onFileUploadProgress: p.onFileUploadProgress ?? (() => {}),\r\n onFilesUploadProgress: p.onFilesUploadProgress ?? (() => {}),\r\n onFileUploadComplete: p.onFileUploadComplete ?? (() => {}),\r\n onFilesUploadComplete: p.onFilesUploadComplete ?? (() => {}),\r\n onUploadComplete: p.onUploadComplete ?? (() => {}),\r\n onFilesSelected: p.onFilesSelected ?? (() => {}),\r\n onDoneClicked: p.onDoneClicked ?? (() => {}),\r\n onPrepareFiles: p.onPrepareFiles,\r\n onFileRemoved: p.onFileRemoved,\r\n onStatusChange: p.onStatusChange,\r\n onFileTypeMismatch: p.onFileTypeMismatch ?? (() => {}),\r\n onRestrictionFailed: p.onRestrictionFailed,\r\n }\r\n\r\n // ── Normalize options (pure) ─────────────────────────────\r\n const normalized = normalizeUploaderOptions(factoryOptions)\r\n const { resolved } = normalized\r\n\r\n // Store resolved scalars for consumers\r\n this.mode = resolved.mode\r\n this.serverUrl = resolved.serverUrl\r\n\r\n // ── Core construction via createUpupUpload (FRESH per init() call) ────────\r\n // Each init() creates a brand-new core + factory so cloud plugins can register\r\n // cleanly (plugin.use() throws on duplicate; no unregister; fresh core avoids this).\r\n this.upload = createUpupUpload({\r\n ...normalized.coreOptions,\r\n onError: (err: unknown) => {\r\n this.onError(\r\n typeof err === 'string' ? err : (err as Error).message,\r\n )\r\n },\r\n })\r\n this.upload.start()\r\n this.core = this.upload.core\r\n\r\n // ── SSE processing ───────────────────────────────────────\r\n const sse = createSSEProcessing({\r\n processingEndpoint: p.processingEndpoint,\r\n onFileProcessed: p.onFileProcessed,\r\n onError: (err: Error) => {\r\n this.onError(err.message)\r\n },\r\n processingTimeout: p.processingTimeout,\r\n })\r\n this.cleanups.push(() => {\r\n sse.destroy()\r\n })\r\n\r\n // ── Uploader controller (FRESH per init() call) ──────────────\r\n // Owns orchestrator, theme, plugin registration, callback proxy,\r\n // status-change dedup, crash recovery, file-input registration.\r\n this.controller = createUploaderController(\r\n { core: this.upload.core, options: factoryOptions, normalized },\r\n {\r\n connectSSE: file => {\r\n sse.connectSSE(file)\r\n },\r\n },\r\n )\r\n\r\n // ── Callback proxy — updateCallbacks feeds the proxy's mutable ref ──\r\n this.controller.updateCallbacks({\r\n onError: (message: string) => {\r\n this.onError(message)\r\n },\r\n onWarn: (message: string) => {\r\n this.onWarn(message)\r\n },\r\n onUploadStart: p.onUploadStart ?? (() => {}),\r\n onFileUploadStart: p.onFileUploadStart ?? (() => {}),\r\n onFileUploadProgress: p.onFileUploadProgress ?? (() => {}),\r\n onFilesUploadProgress: p.onFilesUploadProgress ?? (() => {}),\r\n onFileUploadComplete: p.onFileUploadComplete ?? (() => {}),\r\n onFilesUploadComplete: p.onFilesUploadComplete ?? (() => {}),\r\n onUploadComplete: p.onUploadComplete ?? (() => {}),\r\n onFilesSelected: p.onFilesSelected ?? (() => {}),\r\n onDoneClicked: p.onDoneClicked ?? (() => {}),\r\n onPrepareFiles: p.onPrepareFiles,\r\n onFileRemoved: p.onFileRemoved,\r\n onStatusChange: p.onStatusChange,\r\n onFileTypeMismatch: p.onFileTypeMismatch ?? (() => {}),\r\n onRestrictionFailed: p.onRestrictionFailed,\r\n autoUpload: p.autoUpload ?? false,\r\n })\r\n\r\n // ── Signal bridges (KEEP: toSignalStore separately for orch + theme) ──────\r\n this.orchState = toSignalStore(this.controller.orchestrator)\r\n this.themeState = toSignalStore(this.controller.theme)\r\n this.transientState = toSignalStore(this.controller.transientUi)\r\n this.motionState = toSignalStore(this.controller.motionGate)\r\n\r\n // ── Assign computeds AFTER stores exist ──────────────────\r\n this.files = computed(() => this.orchState.state().files)\r\n this.activeSource = computed(() => this.orchState.state().activeSource)\r\n this.isAddingMore = computed(() => this.orchState.state().isAddingMore)\r\n this.viewMode = computed(() => this.orchState.state().viewMode)\r\n this.isOnline = computed(() => this.orchState.state().isOnline)\r\n this.editingFile = computed(() => this.orchState.state().editingFile)\r\n this.totalProgress = computed(\r\n () => this.orchState.state().totalProgress,\r\n )\r\n this.filesProgressMap = computed(\r\n () => this.orchState.state().filesProgressMap,\r\n )\r\n this.uploadStatus = computed(() => this.orchState.state().uploadStatus)\r\n this.uploadError = computed(\r\n () => this.orchState.state().uploadError as string | undefined,\r\n )\r\n this.uploadErrorCode = computed(\r\n () => this.orchState.state().uploadErrorCode,\r\n )\r\n this.uploadSpeed = computed(() => this.orchState.state().uploadSpeed)\r\n this.uploadEta = computed(() => this.orchState.state().uploadEta)\r\n this.uploadedBytes = computed(\r\n () => this.orchState.state().uploadedBytes,\r\n )\r\n this.totalBytes = computed(() => this.orchState.state().totalBytes)\r\n this.editorQueue = computed(() => this.orchState.state().editorQueue)\r\n this.themeMode = computed(() => this.themeState.state().themeMode)\r\n this.isDark = computed(() => this.themeState.state().isDark)\r\n this.tokens = computed(() => this.themeState.state().tokens)\r\n this.resolved = computed(() => this.themeState.state().resolved)\r\n this.slotOverrides = computed(\r\n () => this.themeState.state().slotOverrides,\r\n )\r\n this.slots = computed(() => this.themeState.state().slots)\r\n this.leavingFileIds = computed(\r\n () => this.transientState.state().leavingFileIds,\r\n )\r\n this.sourceOverlayOpen = computed(\r\n () => this.transientState.state().sourceOverlayOpen,\r\n )\r\n this.sourceOverlayClosing = computed(\r\n () => this.transientState.state().sourceOverlayClosing,\r\n )\r\n this.dropRejected = computed(\r\n () => this.transientState.state().dropRejected,\r\n )\r\n this.motionMode = computed(() => this.motionState.state())\r\n\r\n // ── Factory lifecycle (orchestrator.init + theme.init + plugins + status) ──\r\n this.controller.init()\r\n\r\n // ── Cloud drive config (from factory's resolved, not re-computed inline) ──\r\n this.cloudDrives = resolved.cloudDrives\r\n\r\n // ── i18n (from factory's resolved) ──────────────────────\r\n this.translator = resolved.translator\r\n const resolvedTranslations = resolved.translations\r\n this.translations = signal(resolvedTranslations)\r\n this.lang = resolved.lang\r\n this.dir = resolved.dir\r\n\r\n // ── Icons resolution (framework-specific: Angular Type<unknown>) ──────────\r\n const icons = p.icons ?? {}\r\n const resolvedIcons = {\r\n ContainerAddMoreIcon:\r\n icons.ContainerAddMoreIcon ?? DefaultAddMoreIconComponent,\r\n FileDeleteIcon: icons.FileDeleteIcon ?? TrashIconComponent,\r\n CameraCaptureIcon: icons.CameraCaptureIcon ?? EmptyIconComponent,\r\n CameraRotateIcon: icons.CameraRotateIcon ?? EmptyIconComponent,\r\n CameraDeleteIcon: icons.CameraDeleteIcon ?? EmptyIconComponent,\r\n LoaderIcon: icons.LoaderIcon ?? EmptyIconComponent,\r\n }\r\n\r\n // ── uiProps aggregate (framework-specific fields + resolved scalars) ──────\r\n const resolvedStyle = p.style ?? EMPTY_STYLE\r\n this.uiProps = {\r\n mini: resolved.mini,\r\n maxRetries: p.maxRetries,\r\n resumable: p.resumable,\r\n onError: (message: string) => {\r\n this.onError(message)\r\n },\r\n onIntegrationClick: p.onIntegrationClick ?? (() => {}),\r\n onFileClick: p.onFileClick ?? (() => {}),\r\n onFilesDragOver: p.onFilesDragOver ?? (() => {}),\r\n onFilesDragLeave: p.onFilesDragLeave ?? (() => {}),\r\n onFilesDrop: p.onFilesDrop ?? (() => {}),\r\n onWarn: (message: string) => {\r\n this.onWarn(message)\r\n },\r\n enablePaste: p.enablePaste ?? false,\r\n sources: resolved.sources,\r\n allowedFileTypes: resolved.allowedFileTypes,\r\n maxFileSize: resolved.maxFileSize,\r\n limit: resolved.limit,\r\n isProcessing: p.isProcessing ?? false,\r\n allowPreview: p.allowPreview ?? true,\r\n folderUploadAllowDrop: resolved.folderUploadAllowDrop,\r\n folderPickerButtonVisible: resolved.folderPickerButtonVisible,\r\n showBranding: p.showBranding ?? true,\r\n quietCompletion: p.quietCompletion ?? false,\r\n disableDragDrop: p.disableDragDrop ?? false,\r\n className: p.className ?? '',\r\n style: resolvedStyle,\r\n multiple: resolved.multiple,\r\n icons: resolvedIcons,\r\n imageEditor: resolved.imageEditor,\r\n }\r\n }\r\n\r\n /** Current orchestrator snapshot (synchronous). */\r\n snapshot(): OrchSnapshot {\r\n return this.orchState.state()\r\n }\r\n\r\n // ── Input ref helpers (delegated to factory) ─────────────────\r\n registerFileInput = (el: HTMLInputElement | null): void => {\r\n this.controller.registerFileInput(el)\r\n }\r\n getFileInput = (): HTMLInputElement | null => this.controller.getFileInput()\r\n openFilePicker = (): void => {\r\n this.controller.openFilePicker()\r\n }\r\n\r\n // ── Orchestrator passthroughs (delegated to controller.commands) ───\r\n setActiveSource(a: FileSource | undefined): void {\r\n this.controller.commands.setActiveSource(a)\r\n }\r\n setIsAddingMore(v: boolean): void {\r\n this.controller.commands.setIsAddingMore(v)\r\n }\r\n setViewMode(m: 'grid' | 'list'): void {\r\n this.controller.commands.setViewMode(m)\r\n }\r\n\r\n // ── Add-more source overlay + drop-rejection (core transient-UI store) ──────\r\n openSourceOverlay(): void {\r\n this.controller.transientUi.openSourceOverlay()\r\n }\r\n closeSourceOverlay(): void {\r\n this.controller.transientUi.closeSourceOverlay()\r\n }\r\n /** Core's DragDropController fires this with the read-only drive FileSource;\r\n * resolve its human provider label, then raise the 3s-auto-clear toast. */\r\n flagDriveDropRejected(source: FileSource): void {\r\n const key: keyof UiTranslations | undefined =\r\n DRIVE_SOURCE_LABEL_KEY[source as unknown as CloudProvider]\r\n const label = key ? this.translations()[key] : source\r\n this.controller.transientUi.flagDropRejected(label)\r\n }\r\n\r\n // ── File operations (delegated to controller.commands) ─────────────\r\n async handleSetSelectedFiles(newFiles: File[]): Promise<void> {\r\n await this.controller.commands.handleSetSelectedFiles(newFiles)\r\n }\r\n\r\n handleFileRemove(fileId: string): void {\r\n this.controller.commands.handleFileRemove(fileId)\r\n }\r\n\r\n async uploadFiles(\r\n newFiles: File[] | UploadFile[],\r\n ): Promise<UploadFile[] | undefined> {\r\n return this.controller.commands.uploadFiles(newFiles)\r\n }\r\n\r\n replaceFiles(newFiles: File[] | UploadFile[]): void {\r\n this.controller.commands.replaceFiles(newFiles)\r\n }\r\n\r\n // ── Upload controls (delegated to controller.commands) ─────────────\r\n async startUpload(): Promise<UploadFile[] | undefined> {\r\n return this.controller.commands.startUpload()\r\n }\r\n\r\n async retryUpload(fileId?: string): Promise<UploadFile[] | undefined> {\r\n return this.controller.commands.retryUpload(fileId)\r\n }\r\n\r\n handleCancel(): void {\r\n this.controller.commands.handleCancel()\r\n }\r\n\r\n handlePause(): void {\r\n this.controller.commands.handlePause()\r\n }\r\n\r\n handleResume(): void {\r\n this.controller.commands.handleResume()\r\n }\r\n\r\n handleDone(): void {\r\n this.controller.commands.handleDone()\r\n }\r\n\r\n resetState(): void {\r\n this.controller.commands.resetState()\r\n }\r\n\r\n // ── Image editor passthroughs (delegated to controller.commands) ───\r\n openImageEditor(file: UploadFile): void {\r\n this.controller.commands.openImageEditor(file)\r\n }\r\n closeImageEditor(): void {\r\n this.controller.commands.closeImageEditor()\r\n }\r\n saveImageEdit(editedImageData: string, mimeType?: string): void {\r\n this.controller.commands.saveImageEdit(editedImageData, mimeType)\r\n }\r\n replaceFile(fileId: string, newFile: UploadFile): void {\r\n this.controller.commands.replaceFile(fileId, newFile)\r\n }\r\n\r\n destroy(): void {\r\n if (this.destroyed) return\r\n this.destroyed = true\r\n this.started = false\r\n // cleanups: SSE destroy (+ any other per-init cleanups)\r\n this.cleanups.forEach(c => {\r\n c()\r\n })\r\n this.cleanups.length = 0\r\n this.controller?.destroy() // orchestrator/theme/plugins/status — idempotent\r\n this.orchState?.destroy()\r\n this.themeState?.destroy()\r\n this.transientState?.destroy()\r\n this.motionState?.destroy()\r\n this.upload?.destroy() // createUpupUpload owns core.destroy()\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core'\r\n\r\n/**\r\n * DOM host inside the SourceView header row, just before the Back button.\r\n * A source view portals its right-side header extras into it (e.g. the drive\r\n * browser's avatar + log out + separator) so account controls share the top row\r\n * instead of occupying their own strip. The signal holds null until the host\r\n * span mounts; consumers guard their portal on it. Angular has no <Teleport>, so\r\n * a shared host element + an appendChild portal (in the consuming component) is\r\n * the framework idiom mirroring React's SourceViewHeaderExtraContext /\r\n * Vue's <Teleport> / Svelte's context store + portal action.\r\n *\r\n * Component-scoped: provided at the <upup-uploader> level (alongside UpupStore)\r\n * so SourceView (provider) and the drive uploader (consumer) share one instance.\r\n */\r\n@Injectable()\r\nexport class SourceViewHeaderExtraService {\r\n /** The host element SourceView exposes; null until its header span mounts. */\r\n readonly host = signal<HTMLElement | null>(null)\r\n\r\n setHost(el: HTMLElement | null): void {\r\n this.host.set(el)\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core'\r\nimport { deriveFetchedFileName } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\n\r\nexport { deriveFetchedFileName }\r\n\r\n/**\r\n * Angular port of useFetchFileByUrl (svelte/vue composable).\r\n *\r\n * Fetches a URL → Blob → File using deriveFetchedFileName for the filename.\r\n * Error path calls store.uiProps.onError (svelte parity: composable uses onError\r\n * from useUploaderOptions which resolves to the same callback).\r\n */\r\n@Injectable()\r\nexport class FetchFileByUrlService {\r\n private store = inject(UpupStore)\r\n\r\n readonly loading = signal(false)\r\n\r\n async fetchImage(url: string): Promise<File | undefined> {\r\n if (this.loading()) return undefined\r\n\r\n try {\r\n this.loading.set(true)\r\n const response = await fetch(url)\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch URL: ${response.status}`)\r\n }\r\n const blob = await response.blob()\r\n const fileName = deriveFetchedFileName(url, response, blob)\r\n const file = new File([blob], fileName, { type: blob.type })\r\n this.store.core.emit('url-fetch', { file })\r\n return file\r\n } catch (error) {\r\n this.store.uiProps.onError((error as Error).message)\r\n return undefined\r\n } finally {\r\n this.loading.set(false)\r\n }\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\n\r\n/**\r\n * Content-projection wrapper — port of SourceViewContainer.svelte.\r\n *\r\n * Svelte original:\r\n * <div data-testid=\"upup-source-view\" class={cn('upup-flex upup-items-center …', { … })} ...rest>\r\n * {@render children?.()}\r\n * </div>\r\n *\r\n * Reads: store.isDark(), store.slotOverrides() for conditional classes.\r\n * Inputs:\r\n * - isLoading (boolean, default false) — mirrors the svelte `isLoading` prop.\r\n * - slotName (string, default 'source-view') — replicates svelte's `...rest`\r\n * forwarding of `data-upup-slot` (callers pass \"audio-uploader\",\r\n * \"camera-uploader\", \"url-uploader\", drive-browser slots, etc.).\r\n */\r\n@Component({\r\n selector: 'upup-source-view-container',\r\n standalone: true,\r\n template: `\r\n <div\r\n data-testid=\"upup-source-view\"\r\n [attr.data-upup-slot]=\"slotName\"\r\n [class]=\"containerClass\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n `,\r\n})\r\nexport class SourceViewContainerComponent {\r\n private store = inject(UpupStore)\r\n\r\n @Input() isLoading: boolean = false\r\n /**\r\n * Per-caller slot name forwarded to the inner div's data-upup-slot — mirrors\r\n * svelte AVC's `...rest` spread. Named `slotName` (not `slot`) to avoid the\r\n * native `slot` attribute.\r\n */\r\n @Input() slotName: string = 'source-view'\r\n\r\n get containerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n // Transparent by design: the view body sits directly on the panel's\r\n // gradient chrome (the old black/[0.075] wash read as a mismatched gray\r\n // block over the light gradient).\r\n const parts: string[] = [\r\n 'upup-flex upup-items-center upup-justify-center upup-overflow-hidden',\r\n ]\r\n if (this.isLoading && dark) {\r\n parts.push('upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]')\r\n } else if (!this.isLoading && slotClasses.sourceView) {\r\n parts.push(slotClasses.sourceView)\r\n }\r\n if (this.isLoading && slotClasses.driveLoading) {\r\n parts.push(slotClasses.driveLoading)\r\n }\r\n return parts.join(' ')\r\n }\r\n}\r\n","import { Component, inject, Type } from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { FetchFileByUrlService } from '../services/fetch-file-by-url.service'\r\nimport { SourceViewContainerComponent } from './source-view-container.component'\r\n\r\n/**\r\n * URL uploader leaf — port of UrlUploader.svelte.\r\n *\r\n * Slot name : \"url-uploader\"\r\n * Testid : \"upup-url-uploader\" (on the SourceViewContainer inner div)\r\n *\r\n * Svelte parity:\r\n * - FetchFileByUrlService (Injectable) ↔ useFetchFileByUrl composable\r\n * - store.translations() ↔ tr\r\n * - store.isDark() ↔ $dark\r\n * - store.slotOverrides() ↔ $slotClasses\r\n * - On submit: emit('url-submit'), fetchImage → handleSetSelectedFiles, setActiveSource(undefined)\r\n *\r\n * Note: No @angular/forms dep — two-way bind via (input) + [value] instead of ngModel.\r\n */\r\n@Component({\r\n selector: 'upup-url-uploader',\r\n standalone: true,\r\n imports: [NgComponentOutlet, SourceViewContainerComponent],\r\n providers: [FetchFileByUrlService],\r\n template: `\r\n <upup-source-view-container slotName=\"url-uploader\">\r\n <form (ngSubmit)=\"handleFormSubmit()\" class=\"upup-px-3 upup-py-2\">\r\n <input\r\n type=\"url\"\r\n name=\"upup-url\"\r\n [attr.aria-label]=\"store.translations().enterFileUrl\"\r\n [placeholder]=\"store.translations().enterFileUrl\"\r\n [value]=\"url\"\r\n (input)=\"url = $any($event.target).value\"\r\n [class]=\"urlInputClass\"\r\n />\r\n <button\r\n [class]=\"fetchButtonClass\"\r\n type=\"submit\"\r\n [disabled]=\"!url\"\r\n >\r\n @if (fetchSvc.loading()) {\r\n <ng-container [ngComponentOutlet]=\"loaderIcon\" />\r\n } @else {\r\n {{ store.translations().fetch }}\r\n }\r\n </button>\r\n </form>\r\n </upup-source-view-container>\r\n `,\r\n})\r\nexport class UrlUploaderComponent {\r\n readonly store = inject(UpupStore)\r\n readonly fetchSvc = inject(FetchFileByUrlService)\r\n\r\n url = ''\r\n\r\n get loaderIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.LoaderIcon as Type<unknown>\r\n }\r\n\r\n get urlInputClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-w-full upup-rounded-md upup-border-2 upup-border-[#e0e0e0] upup-bg-transparent upup-px-3 upup-py-2 upup-outline-none',\r\n {\r\n 'upup-border-[#6D6D6D] upup-text-[#6D6D6D] dark:upup-border-[#6D6D6D] dark:upup-text-[#6D6D6D]':\r\n dark,\r\n },\r\n slotClasses.urlInput,\r\n )\r\n }\r\n\r\n get fetchButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-disabled:bg-[#e0e0e0] upup-mt-2 upup-w-full upup-rounded-md upup-bg-[#0ea5e9] upup-p-2 upup-text-white upup-transition-all upup-duration-300',\r\n {\r\n 'upup-disabled:bg-[#6D6D6D] dark:upup-disabled:bg-[#6D6D6D] upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]':\r\n dark,\r\n },\r\n slotClasses.urlFetchButton,\r\n )\r\n }\r\n\r\n async handleFormSubmit(): Promise<void> {\r\n this.store.core.emit('url-submit', { url: this.url })\r\n const file = await this.fetchSvc.fetchImage(this.url)\r\n if (file) {\r\n Object.assign(file, { url: this.url })\r\n await this.store.handleSetSelectedFiles([file])\r\n this.url = ''\r\n this.store.setActiveSource(undefined)\r\n }\r\n }\r\n}\r\n","import { Injectable, inject, signal, computed } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\n\r\nexport enum FacingMode {\r\n Environment = 'environment',\r\n User = 'user',\r\n}\r\n\r\n/**\r\n * Angular port of useCameraUploader (svelte composable).\r\n *\r\n * Manages getUserMedia stream lifecycle, canvas capture → File, facing-mode switch.\r\n * The video element is wired in by the component via setVideoEl() (mirrors svelte's\r\n * bind:this={videoEl} + $effect(() => setVideoEl(videoEl))).\r\n *\r\n * Cleanup: call stopCamera() from ngOnDestroy.\r\n */\r\n@Injectable()\r\nexport class CameraUploaderService {\r\n private store = inject(UpupStore)\r\n\r\n private videoEl: HTMLVideoElement | null = null\r\n private stream: MediaStream | null = null\r\n\r\n readonly capturedUrl = signal('')\r\n readonly facingMode = signal<FacingMode>(FacingMode.Environment)\r\n\r\n /** 'front' when environment-facing (switch button shows \"Switch to front\"), 'back' otherwise. */\r\n readonly newCameraSide = computed(() =>\r\n this.facingMode() === FacingMode.Environment ? 'front' : 'back',\r\n )\r\n\r\n // ── Video element binding ──────────────────────────────────────────────────\r\n\r\n setVideoEl(el: HTMLVideoElement | null): void {\r\n this.videoEl = el\r\n }\r\n\r\n // ── Camera lifecycle ───────────────────────────────────────────────────────\r\n\r\n async startCamera(): Promise<void> {\r\n try {\r\n if (this.stream) {\r\n this.stream.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n const mediaStream = await navigator.mediaDevices.getUserMedia({\r\n video: { facingMode: this.facingMode() },\r\n })\r\n this.stream = mediaStream\r\n if (this.videoEl) {\r\n this.videoEl.srcObject = mediaStream\r\n // play() returns undefined in jsdom — optional-chain so .catch() is skipped\r\n void this.videoEl.play()?.catch(() => {})\r\n }\r\n } catch {\r\n // upup-catch: camera unavailable (permission denied / no device) —\r\n // leave stream null (svelte parity)\r\n }\r\n }\r\n\r\n stopCamera(): void {\r\n if (this.stream) {\r\n this.stream.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n this.stream = null\r\n }\r\n if (this.videoEl) {\r\n this.videoEl.srcObject = null\r\n }\r\n }\r\n\r\n // ── Capture ────────────────────────────────────────────────────────────────\r\n\r\n capture(): void {\r\n if (!this.videoEl) return\r\n\r\n const canvas = document.createElement('canvas')\r\n canvas.width = this.videoEl.videoWidth\r\n canvas.height = this.videoEl.videoHeight\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return\r\n\r\n ctx.drawImage(this.videoEl, 0, 0)\r\n const dataUrl = canvas.toDataURL('image/jpeg')\r\n this.capturedUrl.set(dataUrl)\r\n this.store.core.emit('camera-capture', { dataUrl })\r\n }\r\n\r\n clearUrl(): void {\r\n this.capturedUrl.set('')\r\n }\r\n\r\n async handleFetchImage(): Promise<void> {\r\n const currentUrl = this.capturedUrl()\r\n if (!currentUrl) return\r\n\r\n const response = await fetch(currentUrl)\r\n const blob = await response.blob()\r\n const file = new File([blob], `capture-${Date.now()}.jpg`, {\r\n type: 'image/jpeg',\r\n })\r\n await this.store.handleSetSelectedFiles([file])\r\n this.capturedUrl.set('')\r\n this.store.setActiveSource(undefined)\r\n this.store.core.emit('camera-confirm', { file })\r\n }\r\n\r\n handleCameraSwitch(): void {\r\n this.facingMode.update(fm =>\r\n fm === FacingMode.Environment\r\n ? FacingMode.User\r\n : FacingMode.Environment,\r\n )\r\n }\r\n}\r\n","import {\r\n Component,\r\n inject,\r\n OnDestroy,\r\n AfterViewInit,\r\n ViewChild,\r\n ElementRef,\r\n Type,\r\n effect,\r\n} from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { formatUiMessage as t } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { CameraUploaderService } from '../services/camera-uploader.service'\r\nimport { SourceViewContainerComponent } from './source-view-container.component'\r\n\r\n/**\r\n * Camera uploader leaf — port of CameraUploader.svelte.\r\n *\r\n * Slot name : \"camera-uploader\"\r\n * (SourceViewContainer inner div carries data-upup-slot=\"camera-uploader\";\r\n * the outer div inside the AVC carries data-testid=\"upup-camera-uploader\".)\r\n *\r\n * Svelte parity:\r\n * - CameraUploaderService ↔ useCameraUploader composable\r\n * - ngOnInit calls startCamera() (svelte: onMount → startCamera())\r\n * - facingMode changes watched via effect → restartCamera when no capture is shown\r\n * - videoEl bound via @ViewChild (svelte: bind:this={videoEl})\r\n * - ngOnDestroy calls stopCamera() (svelte: onDestroy → stopCamera())\r\n *\r\n * Auto-start guard for tests:\r\n * CameraUploaderService.startCamera() is called in ngAfterViewInit, which runs in\r\n * jsdom. navigator.mediaDevices.getUserMedia in jsdom throws/returns a rejected\r\n * promise which the service silently catches (camera unavailable — leave stream null).\r\n * Tests that want to verify startCamera() must mock navigator.mediaDevices.getUserMedia\r\n * before rendering the component.\r\n */\r\n@Component({\r\n selector: 'upup-camera-uploader',\r\n standalone: true,\r\n imports: [NgComponentOutlet, SourceViewContainerComponent],\r\n providers: [CameraUploaderService],\r\n template: `\r\n <upup-source-view-container slotName=\"camera-uploader\">\r\n <div\r\n data-testid=\"upup-camera-uploader\"\r\n class=\"upup-flex upup-h-full upup-w-full upup-flex-col upup-justify-center upup-overflow-hidden upup-px-3 upup-py-2\"\r\n >\r\n <div\r\n class=\"upup-flex upup-min-h-0 upup-flex-1 upup-items-center upup-justify-center upup-pt-2\"\r\n >\r\n @if (cameraSvc.capturedUrl()) {\r\n <div\r\n [class]=\"previewContainerClass\"\r\n [style.background-image]=\"\r\n 'url(' + cameraSvc.capturedUrl() + ')'\r\n \"\r\n >\r\n <button\r\n (click)=\"cameraSvc.clearUrl()\"\r\n [class]=\"deleteButtonClass\"\r\n type=\"button\"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"cameraDeleteIcon\"\r\n />\r\n </button>\r\n </div>\r\n } @else {\r\n <!-- Video feed -->\r\n <video\r\n #videoEl\r\n autoplay\r\n muted\r\n playsinline\r\n class=\"upup-aspect-video upup-max-h-full upup-max-w-full upup-rounded-xl upup-object-contain\"\r\n ></video>\r\n }\r\n </div>\r\n\r\n <div class=\"upup-flex upup-shrink-0 upup-gap-4\">\r\n @if (!cameraSvc.capturedUrl()) {\r\n <button\r\n [class]=\"captureButtonClass\"\r\n (click)=\"cameraSvc.capture()\"\r\n type=\"button\"\r\n >\r\n <span\r\n ><ng-container\r\n [ngComponentOutlet]=\"cameraCaptureIcon\"\r\n /></span>\r\n <span>{{ store.translations().capture }}</span>\r\n </button>\r\n <button\r\n [class]=\"rotateButtonClass\"\r\n (click)=\"cameraSvc.handleCameraSwitch()\"\r\n type=\"button\"\r\n >\r\n <span\r\n ><ng-container\r\n [ngComponentOutlet]=\"cameraRotateIcon\"\r\n /></span>\r\n <span>{{ switchLabel }}</span>\r\n </button>\r\n } @else {\r\n <button\r\n [class]=\"addButtonClass\"\r\n (click)=\"cameraSvc.handleFetchImage()\"\r\n type=\"button\"\r\n >\r\n {{ store.translations().addImage }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </upup-source-view-container>\r\n `,\r\n})\r\nexport class CameraUploaderComponent implements AfterViewInit, OnDestroy {\r\n readonly store = inject(UpupStore)\r\n readonly cameraSvc = inject(CameraUploaderService)\r\n\r\n @ViewChild('videoEl') videoElRef?: ElementRef<HTMLVideoElement>\r\n\r\n constructor() {\r\n // Restart camera when facingMode changes and no capture is shown\r\n // (mirrors svelte's facingMode.subscribe inside onMount)\r\n effect(() => {\r\n const _fm = this.cameraSvc.facingMode() // track signal\r\n const capturedUrl = this.cameraSvc.capturedUrl()\r\n if (!capturedUrl && this.videoElRef) {\r\n // Re-sync video element ref before restarting\r\n this.cameraSvc.setVideoEl(this.videoElRef.nativeElement)\r\n void this.cameraSvc.startCamera()\r\n }\r\n })\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.videoElRef) {\r\n this.cameraSvc.setVideoEl(this.videoElRef.nativeElement)\r\n }\r\n void this.cameraSvc.startCamera()\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cameraSvc.stopCamera()\r\n }\r\n\r\n // ── Icon accessors ────────────────────────────────────────────────────────\r\n\r\n get cameraCaptureIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.CameraCaptureIcon as Type<unknown>\r\n }\r\n\r\n get cameraRotateIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.CameraRotateIcon as Type<unknown>\r\n }\r\n\r\n get cameraDeleteIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.CameraDeleteIcon as Type<unknown>\r\n }\r\n\r\n // ── Computed labels ───────────────────────────────────────────────────────\r\n\r\n get switchLabel(): string {\r\n const tr = this.store.translations()\r\n const side =\r\n this.cameraSvc.newCameraSide() === 'front' ? tr.front : tr.back\r\n return t(tr.switchToCamera, { side })\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────────────────\r\n\r\n get previewContainerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-relative upup-aspect-video upup-max-h-full upup-max-w-full upup-bg-black/[0.025] upup-bg-contain upup-bg-center upup-bg-no-repeat upup-shadow-xl',\r\n {\r\n 'upup-bg-white/5 dark:upup-bg-white/5': dark,\r\n },\r\n slotClasses.cameraPreviewContainer,\r\n )\r\n }\r\n\r\n get deleteButtonClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-absolute upup--right-2 upup--top-2 upup-z-10 upup-rounded-full upup-bg-[#272727] upup-p-1 upup-text-xl upup-text-[#f5f5f5]',\r\n slotClasses.cameraDeleteButton,\r\n )\r\n }\r\n\r\n get captureButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-mt-2 upup-flex upup-w-1/3 upup-flex-col upup-items-center upup-justify-center upup-rounded-md upup-bg-[#0ea5e9] upup-p-2 upup-text-white upup-transition-all upup-duration-300',\r\n {\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark,\r\n },\r\n slotClasses.cameraCaptureButton,\r\n )\r\n }\r\n\r\n get rotateButtonClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-mt-2 upup-flex upup-w-1/3 upup-flex-col upup-items-center upup-rounded-md upup-bg-gray-500 upup-p-2 upup-text-white upup-transition-all upup-duration-300 hover:upup-bg-gray-600',\r\n slotClasses.cameraRotateButton,\r\n )\r\n }\r\n\r\n get addButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-mt-2 upup-w-full upup-rounded-md upup-bg-[#0ea5e9] upup-p-2 upup-text-white upup-transition-all upup-duration-300',\r\n {\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark,\r\n },\r\n slotClasses.cameraAddButton,\r\n )\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n QueryList,\r\n ViewChildren,\r\n} from '@angular/core'\r\n\r\nconst BAR_COUNT = 28\r\n\r\n/**\r\n * Live recording waveform (port of AudioWaveform): sky bars whose heights track\r\n * the microphone's live frequency data via a Web Audio AnalyserNode.\r\n *\r\n * This is the ONE place JS-driven visuals are sanctioned — the bars render REAL\r\n * audio data, not fx decoration, so (a) they are NOT classed `upup-fx-*` (the\r\n * motion gate must not freeze live data) and (b) the rAF read loop is\r\n * legitimate. Heights are written straight to the DOM (no per-frame render).\r\n * The AnalyserNode + AudioContext are torn down on destroy.\r\n */\r\n@Component({\r\n selector: 'upup-audio-waveform',\r\n standalone: true,\r\n template: `\r\n <div\r\n data-upup-slot=\"audio-waveform\"\r\n aria-hidden=\"true\"\r\n class=\"upup-flex upup-h-11 upup-items-center upup-justify-center upup-gap-[3px]\"\r\n >\r\n @for (bar of bars; track $index) {\r\n <span\r\n #bar\r\n class=\"upup-w-[3px] upup-flex-none upup-rounded-full upup-bg-[#38bdf8]\"\r\n style=\"height: 6px\"\r\n ></span>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class AudioWaveformComponent implements AfterViewInit, OnDestroy {\r\n @Input({ required: true }) stream!: MediaStream\r\n\r\n readonly bars = Array.from({ length: BAR_COUNT })\r\n @ViewChildren('bar') barEls!: QueryList<ElementRef<HTMLSpanElement>>\r\n\r\n private raf = 0\r\n private audioCtx: AudioContext | null = null\r\n private sourceNode: MediaStreamAudioSourceNode | null = null\r\n\r\n ngAfterViewInit(): void {\r\n const AudioCtor =\r\n window.AudioContext ??\r\n (window as unknown as { webkitAudioContext?: typeof AudioContext })\r\n .webkitAudioContext\r\n if (!AudioCtor) return\r\n this.audioCtx = new AudioCtor()\r\n // Autoplay policy may create the context suspended; without resuming,\r\n // getByteFrequencyData returns all-zeros and the bars silently flatline.\r\n void this.audioCtx.resume()\r\n this.sourceNode = this.audioCtx.createMediaStreamSource(this.stream)\r\n const analyser = this.audioCtx.createAnalyser()\r\n analyser.fftSize = 64\r\n this.sourceNode.connect(analyser)\r\n const data = new Uint8Array(analyser.frequencyBinCount)\r\n const els = this.barEls.toArray()\r\n const tick = (): void => {\r\n analyser.getByteFrequencyData(data)\r\n for (let i = 0; i < els.length; i++) {\r\n const v = data[i % data.length] ?? 0\r\n const el = els[i]?.nativeElement\r\n if (el) el.style.height = `${6 + (v / 255) * 34}px`\r\n }\r\n this.raf = requestAnimationFrame(tick)\r\n }\r\n this.raf = requestAnimationFrame(tick)\r\n }\r\n\r\n ngOnDestroy(): void {\r\n cancelAnimationFrame(this.raf)\r\n this.sourceNode?.disconnect()\r\n void this.audioCtx?.close()\r\n }\r\n}\r\n","import { Component, inject, OnDestroy } from '@angular/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { SourceViewContainerComponent } from './source-view-container.component'\r\nimport { AudioWaveformComponent } from './audio-waveform.component'\r\n\r\ntype RecordingState = 'idle' | 'recording' | 'recorded'\r\n\r\n/**\r\n * Audio recorder leaf — port of AudioUploader.svelte.\r\n *\r\n * Slot name : \"audio-uploader\"\r\n * (Both the error-state and normal-state SourceViewContainers use slotName=\"audio-uploader\".)\r\n *\r\n * Svelte parity:\r\n * - All state (recordingState, duration, audioUrl, error) is plain class properties\r\n * with change-detection via Angular's default CD.\r\n * - MediaRecorder lifecycle (startRecording / stopRecording / discardRecording / addRecording)\r\n * mirrors svelte exactly.\r\n * - Cleanup on ngOnDestroy (svelte: onDestroy).\r\n * - No shared composable — AudioUploader.svelte contains all logic inline.\r\n *\r\n * Auto-start guard for tests:\r\n * startRecording() only runs on user click, not on mount → no auto-start → no jsdom hang.\r\n */\r\n@Component({\r\n selector: 'upup-audio-uploader',\r\n standalone: true,\r\n imports: [SourceViewContainerComponent, AudioWaveformComponent],\r\n template: `\r\n @if (error) {\r\n <!-- Error state -->\r\n <upup-source-view-container slotName=\"audio-uploader\">\r\n <div\r\n class=\"upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center\"\r\n >\r\n <p [class]=\"errorTextClass\">{{ error }}</p>\r\n </div>\r\n </upup-source-view-container>\r\n } @else {\r\n <!-- Normal state -->\r\n <upup-source-view-container slotName=\"audio-uploader\">\r\n <div\r\n class=\"upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-6 upup-p-6\"\r\n >\r\n <!-- Pulsing mic icon -->\r\n <div [class]=\"outerRingClass\">\r\n <div [class]=\"innerRingClass\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"white\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"\r\n />\r\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n @if (recordingState === 'recording' && streamRef) {\r\n <upup-audio-waveform [stream]=\"streamRef\" />\r\n }\r\n\r\n <span [class]=\"timerClass\">{{ formatTime(duration) }}</span>\r\n\r\n @if (recordingState === 'recorded' && audioUrl) {\r\n <!-- svelte-ignore a11y_media_has_caption -->\r\n <audio\r\n controls\r\n [src]=\"audioUrl\"\r\n class=\"upup-w-full upup-max-w-xs\"\r\n ></audio>\r\n }\r\n\r\n <div class=\"upup-flex upup-gap-3\">\r\n @if (recordingState === 'idle') {\r\n <button\r\n type=\"button\"\r\n [class]=\"startButtonClass\"\r\n (click)=\"startRecording()\"\r\n >\r\n Start Recording\r\n </button>\r\n }\r\n\r\n @if (recordingState === 'recording') {\r\n <button\r\n type=\"button\"\r\n class=\"upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600\"\r\n (click)=\"stopRecording()\"\r\n >\r\n Stop Recording\r\n </button>\r\n }\r\n\r\n @if (recordingState === 'recorded') {\r\n <button\r\n type=\"button\"\r\n class=\"upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600\"\r\n (click)=\"discardRecording()\"\r\n >\r\n Discard\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"addButtonClass\"\r\n (click)=\"addRecording()\"\r\n >\r\n Add Recording\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </upup-source-view-container>\r\n }\r\n `,\r\n})\r\nexport class AudioUploaderComponent implements OnDestroy {\r\n readonly store = inject(UpupStore)\r\n\r\n recordingState: RecordingState = 'idle'\r\n duration = 0\r\n audioUrl: string | null = null\r\n error: string | null = null\r\n\r\n private mediaRecorder: MediaRecorder | null = null\r\n private chunks: Blob[] = []\r\n private timerHandle: ReturnType<typeof setInterval> | null = null\r\n /** Exposed to the template so the live waveform can read the mic stream. */\r\n protected streamRef: MediaStream | null = null\r\n\r\n ngOnDestroy(): void {\r\n if (this.timerHandle) clearInterval(this.timerHandle)\r\n if (this.audioUrl) URL.revokeObjectURL(this.audioUrl)\r\n this.streamRef?.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n\r\n async startRecording(): Promise<void> {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n })\r\n this.streamRef = stream\r\n this.chunks = []\r\n const recorder = new MediaRecorder(stream)\r\n this.mediaRecorder = recorder\r\n\r\n recorder.ondataavailable = e => {\r\n if (e.data.size > 0) this.chunks.push(e.data)\r\n }\r\n\r\n recorder.onstop = () => {\r\n const blob = new Blob(this.chunks, {\r\n type: recorder.mimeType || 'audio/webm',\r\n })\r\n this.audioUrl = URL.createObjectURL(blob)\r\n stream.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n\r\n recorder.start()\r\n this.recordingState = 'recording'\r\n this.duration = 0\r\n this.timerHandle = setInterval(() => {\r\n this.duration++\r\n }, 1000)\r\n } catch {\r\n // upup-catch: mic permission denial is surfaced to the user via the error snapshot the audio template renders\r\n this.error =\r\n 'Microphone access denied. Please allow microphone access and try again.'\r\n }\r\n }\r\n\r\n stopRecording(): void {\r\n this.mediaRecorder?.stop()\r\n if (this.timerHandle) clearInterval(this.timerHandle)\r\n this.recordingState = 'recorded'\r\n }\r\n\r\n discardRecording(): void {\r\n if (this.audioUrl) URL.revokeObjectURL(this.audioUrl)\r\n this.audioUrl = null\r\n this.duration = 0\r\n this.recordingState = 'idle'\r\n }\r\n\r\n addRecording(): void {\r\n if (!this.audioUrl) return\r\n const ext = this.mediaRecorder?.mimeType.includes('webm')\r\n ? 'webm'\r\n : 'ogg'\r\n fetch(this.audioUrl)\r\n .then(r => r.blob())\r\n .then(blob => {\r\n const file = new File(\r\n [blob],\r\n `recording-${Date.now()}.${ext}`,\r\n {\r\n type: blob.type,\r\n },\r\n )\r\n void this.store.handleSetSelectedFiles([file])\r\n this.store.setActiveSource(undefined)\r\n })\r\n .catch((err: unknown) => {\r\n this.error =\r\n err instanceof Error\r\n ? err.message\r\n : 'Failed to add the recording. Please try again.'\r\n })\r\n }\r\n\r\n formatTime(s: number): string {\r\n const m = Math.floor(s / 60)\r\n const sec = s % 60\r\n return `${m}:${sec.toString().padStart(2, '0')}`\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────────────────\r\n\r\n get errorTextClass(): string {\r\n return cn('upup-text-sm upup-text-red-500', {\r\n 'upup-text-red-400': this.store.isDark(),\r\n })\r\n }\r\n\r\n get outerRingClass(): string {\r\n return cn(\r\n 'upup-flex upup-h-24 upup-w-24 upup-items-center upup-justify-center upup-rounded-full',\r\n {\r\n 'upup-bg-red-500/20': this.recordingState === 'recording',\r\n 'upup-bg-[#0ea5e9]/20':\r\n this.recordingState === 'idle' ||\r\n this.recordingState === 'recorded',\r\n },\r\n )\r\n }\r\n\r\n get innerRingClass(): string {\r\n return cn(\r\n 'upup-flex upup-h-16 upup-w-16 upup-items-center upup-justify-center upup-rounded-full upup-transition-all',\r\n {\r\n 'upup-animate-pulse upup-bg-red-500':\r\n this.recordingState === 'recording',\r\n 'upup-bg-[#0ea5e9]':\r\n this.recordingState === 'idle' ||\r\n this.recordingState === 'recorded',\r\n },\r\n )\r\n }\r\n\r\n get timerClass(): string {\r\n return cn('upup-text-2xl upup-font-mono upup-tabular-nums', {\r\n 'upup-text-[#1b1b1b]': !this.store.isDark(),\r\n 'upup-text-white': this.store.isDark(),\r\n })\r\n }\r\n\r\n get startButtonClass(): string {\r\n return cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n this.store.isDark(),\r\n },\r\n )\r\n }\r\n\r\n get addButtonClass(): string {\r\n return cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n this.store.isDark(),\r\n },\r\n )\r\n }\r\n}\r\n","import {\r\n Component,\r\n inject,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n} from '@angular/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { SourceViewContainerComponent } from './source-view-container.component'\r\n\r\ntype RecordingState = 'idle' | 'recording' | 'recorded'\r\n\r\n/**\r\n * Screen capture recorder leaf — port of ScreenCaptureUploader.svelte.\r\n *\r\n * Slot name : \"screen-capture-uploader\"\r\n * (Both error-state and normal-state AVC use slotName=\"screen-capture-uploader\".)\r\n *\r\n * Svelte parity:\r\n * - getDisplayMedia for screen + audio (svelte: navigator.mediaDevices.getDisplayMedia)\r\n * - Inline MediaRecorder lifecycle (no shared composable in svelte either)\r\n * - stream.getVideoTracks()[0].onended → auto-stop when user stops sharing\r\n * - Cleanup on ngOnDestroy (svelte: onDestroy)\r\n * - previewEl bound via @ViewChild (svelte: bind:this={previewEl})\r\n * - retryRecording() resets error and calls startRecording()\r\n *\r\n * Auto-start guard for tests:\r\n * startRecording() only runs on user click (\"Share Screen\"), not on mount → no jsdom hang.\r\n */\r\n@Component({\r\n selector: 'upup-screen-capture-uploader',\r\n standalone: true,\r\n imports: [SourceViewContainerComponent],\r\n template: `\r\n @if (error) {\r\n <!-- Error state -->\r\n <upup-source-view-container slotName=\"screen-capture-uploader\">\r\n <div\r\n class=\"upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center\"\r\n >\r\n <p [class]=\"errorTextClass\">{{ error }}</p>\r\n <button\r\n type=\"button\"\r\n [class]=\"retryButtonClass\"\r\n (click)=\"retryRecording()\"\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n </upup-source-view-container>\r\n } @else {\r\n <!-- Normal state -->\r\n <upup-source-view-container slotName=\"screen-capture-uploader\">\r\n <div\r\n class=\"upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-4\"\r\n >\r\n <!-- Idle -->\r\n @if (recordingState === 'idle') {\r\n <div\r\n class=\"upup-flex upup-flex-col upup-items-center upup-gap-4\"\r\n >\r\n <div\r\n class=\"upup-flex upup-h-20 upup-w-20 upup-items-center upup-justify-center upup-rounded-full upup-bg-[#0ea5e9]/20\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"32\"\r\n height=\"32\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n [attr.stroke]=\"\r\n store.isDark() ? '#38bdf8' : '#0284c7'\r\n \"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect\r\n width=\"20\"\r\n height=\"15\"\r\n x=\"2\"\r\n y=\"3\"\r\n rx=\"2\"\r\n />\r\n <polyline points=\"8 21 16 21\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"18\" y2=\"21\" />\r\n </svg>\r\n </div>\r\n <button\r\n type=\"button\"\r\n [class]=\"shareButtonClass\"\r\n (click)=\"startRecording()\"\r\n >\r\n Share Screen\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Recording -->\r\n @if (recordingState === 'recording') {\r\n <div\r\n class=\"upup-relative upup-flex upup-min-h-0 upup-w-full upup-max-w-md upup-flex-1\"\r\n >\r\n <!-- svelte-ignore a11y_media_has_caption -->\r\n <video\r\n #previewEl\r\n muted\r\n class=\"upup-min-h-0 upup-w-full upup-flex-1 upup-rounded-lg upup-object-contain\"\r\n ></video>\r\n <!-- REC chip (states-tour-3 state E): red dot + label +\r\n timer. The dot's pulse is fx-gated — under motion-off\r\n the dot stays static so the recording status remains\r\n visible. -->\r\n <div\r\n data-upup-slot=\"screen-rec-chip\"\r\n class=\"upup-absolute upup-left-2.5 upup-top-2.5 upup-flex upup-items-center upup-gap-1.5 upup-rounded-md upup-bg-[#04080f]/60 upup-px-2 upup-py-1 upup-font-mono upup-text-[11px] upup-tabular-nums upup-text-[#fecdd3]\"\r\n >\r\n <span\r\n class=\"upup-animate-fx-rec-pulse upup-h-2 upup-w-2 upup-rounded-full upup-bg-red-500\"\r\n ></span>\r\n REC {{ formatTime(duration) }}\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"upup-fx-press upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600\"\r\n (click)=\"stopRecording()\"\r\n >\r\n Stop Recording\r\n </button>\r\n }\r\n\r\n <!-- Recorded -->\r\n @if (recordingState === 'recorded' && videoUrl) {\r\n <!-- svelte-ignore a11y_media_has_caption -->\r\n <video\r\n controls\r\n [src]=\"videoUrl\"\r\n class=\"upup-w-full upup-max-w-md upup-min-h-0 upup-flex-1 upup-rounded-lg upup-object-contain\"\r\n ></video>\r\n <div class=\"upup-flex upup-gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600\"\r\n (click)=\"discardRecording()\"\r\n >\r\n Discard\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"addButtonClass\"\r\n (click)=\"addRecording()\"\r\n >\r\n Add Recording\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </upup-source-view-container>\r\n }\r\n `,\r\n})\r\nexport class ScreenCaptureUploaderComponent implements OnDestroy {\r\n readonly store = inject(UpupStore)\r\n\r\n recordingState: RecordingState = 'idle'\r\n duration = 0\r\n videoUrl: string | null = null\r\n error: string | null = null\r\n\r\n @ViewChild('previewEl')\r\n set previewEl(ref: ElementRef<HTMLVideoElement> | undefined) {\r\n const el = ref?.nativeElement\r\n if (el && this.streamRef) {\r\n el.srcObject = this.streamRef\r\n // upup-catch: play() may reject if autoplay is blocked — swallow since preview is best-effort\r\n void el.play()?.catch(() => {})\r\n }\r\n }\r\n\r\n private mediaRecorder: MediaRecorder | null = null\r\n private chunks: Blob[] = []\r\n private timerHandle: ReturnType<typeof setInterval> | null = null\r\n private streamRef: MediaStream | null = null\r\n\r\n ngOnDestroy(): void {\r\n if (this.timerHandle) clearInterval(this.timerHandle)\r\n if (this.videoUrl) URL.revokeObjectURL(this.videoUrl)\r\n this.streamRef?.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n\r\n async startRecording(): Promise<void> {\r\n try {\r\n const stream = await navigator.mediaDevices.getDisplayMedia({\r\n video: true,\r\n audio: true,\r\n })\r\n this.streamRef = stream\r\n this.chunks = []\r\n\r\n const [videoTrack] = stream.getVideoTracks()\r\n if (videoTrack) {\r\n videoTrack.onended = () => {\r\n if (\r\n this.mediaRecorder &&\r\n this.mediaRecorder.state !== 'inactive'\r\n ) {\r\n this.mediaRecorder.stop()\r\n if (this.timerHandle) clearInterval(this.timerHandle)\r\n this.recordingState = 'recorded'\r\n }\r\n }\r\n }\r\n\r\n const recorder = new MediaRecorder(stream)\r\n this.mediaRecorder = recorder\r\n\r\n recorder.ondataavailable = e => {\r\n if (e.data.size > 0) this.chunks.push(e.data)\r\n }\r\n\r\n recorder.onstop = () => {\r\n const blob = new Blob(this.chunks, {\r\n type: recorder.mimeType || 'video/webm',\r\n })\r\n this.videoUrl = URL.createObjectURL(blob)\r\n stream.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n\r\n recorder.start()\r\n this.recordingState = 'recording'\r\n this.duration = 0\r\n this.timerHandle = setInterval(() => {\r\n this.duration++\r\n }, 1000)\r\n } catch {\r\n // upup-catch: screen-share cancel/denial is surfaced to the user via the error snapshot the screen-capture template renders\r\n this.error =\r\n 'Screen sharing is not supported or was denied. Please try again.'\r\n }\r\n }\r\n\r\n stopRecording(): void {\r\n this.mediaRecorder?.stop()\r\n if (this.timerHandle) clearInterval(this.timerHandle)\r\n this.recordingState = 'recorded'\r\n }\r\n\r\n discardRecording(): void {\r\n if (this.videoUrl) URL.revokeObjectURL(this.videoUrl)\r\n this.videoUrl = null\r\n this.duration = 0\r\n this.recordingState = 'idle'\r\n }\r\n\r\n addRecording(): void {\r\n if (!this.videoUrl) return\r\n fetch(this.videoUrl)\r\n .then(r => r.blob())\r\n .then(blob => {\r\n const file = new File(\r\n [blob],\r\n `screen-recording-${Date.now()}.webm`,\r\n {\r\n type: blob.type,\r\n },\r\n )\r\n void this.store.handleSetSelectedFiles([file])\r\n this.store.setActiveSource(undefined)\r\n })\r\n .catch((err: unknown) => {\r\n this.error =\r\n err instanceof Error\r\n ? err.message\r\n : 'Failed to add the recording. Please try again.'\r\n })\r\n }\r\n\r\n retryRecording(): void {\r\n this.error = null\r\n void this.startRecording()\r\n }\r\n\r\n formatTime(s: number): string {\r\n const m = Math.floor(s / 60)\r\n const sec = s % 60\r\n return `${m}:${sec.toString().padStart(2, '0')}`\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────────────────\r\n\r\n get errorTextClass(): string {\r\n return cn('upup-text-sm upup-text-red-500', {\r\n 'upup-text-red-400': this.store.isDark(),\r\n })\r\n }\r\n\r\n get retryButtonClass(): string {\r\n return cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white',\r\n {\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': this.store.isDark(),\r\n },\r\n )\r\n }\r\n\r\n get shareButtonClass(): string {\r\n return cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n this.store.isDark(),\r\n },\r\n )\r\n }\r\n\r\n get addButtonClass(): string {\r\n return cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n this.store.isDark(),\r\n },\r\n )\r\n }\r\n}\r\n","import { Injectable, inject, computed, type Signal } from '@angular/core'\r\nimport {\r\n GOOGLE_DRIVE_DESCRIPTOR,\r\n type DriveFile,\r\n type DriveFolder,\r\n} from '@useupup/core'\r\nimport {\r\n DriveBrowserController,\r\n type DriveBrowserState,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore } from '../lib/to-signal-store'\r\n\r\n/**\r\n * Angular port of useGoogleDrive.ts (svelte composable).\r\n *\r\n * Creates and manages one DriveBrowserController for Google Drive (GIS auth).\r\n * ALL business logic lives in the controller — this service only:\r\n * 1. Constructs the controller with the store's core + callbacks\r\n * 2. Bridges the controller's subscribe/getSnapshot to Angular signals via toSignalStore\r\n * 3. Exposes typed selectors + forwarding methods (pure delegation, no logic)\r\n *\r\n * Call init() from ngOnInit and destroy() from ngOnDestroy (or via DestroyRef).\r\n */\r\n@Injectable()\r\nexport class GoogleDriveService {\r\n private store = inject(UpupStore)\r\n\r\n private controller = new DriveBrowserController(\r\n this.store.core,\r\n GOOGLE_DRIVE_DESCRIPTOR,\r\n {\r\n onFilesSelected: files => {\r\n void this.store.handleSetSelectedFiles(files)\r\n },\r\n onClose: () => {\r\n this.store.setActiveSource(undefined)\r\n },\r\n },\r\n )\r\n\r\n private signalStore = toSignalStore<DriveBrowserState>(this.controller)\r\n private state: Signal<DriveBrowserState> = this.signalStore.state\r\n\r\n // ── Selector signals (pure computed from snapshot) ──────────\r\n readonly user = computed(() => this.state().user)\r\n readonly googleFiles = computed(() => this.state().folder)\r\n readonly token = computed(() => this.state().token)\r\n readonly authCancelled = computed(() => this.state().authCancelled)\r\n readonly isAuthReady = computed(() => this.state().isAuthReady)\r\n readonly path = computed(() => this.state().path)\r\n readonly selectedFiles = computed(() => this.state().selectedFiles)\r\n readonly showLoader = computed(() => this.state().showLoader)\r\n readonly isClickLoading = computed(() => this.state().isClickLoading)\r\n readonly error = computed(() => this.state().error)\r\n readonly hasMore = computed(() => this.state().hasMore)\r\n readonly isLoadingMore = computed(() => this.state().isLoadingMore)\r\n\r\n // ── Lifecycle (caller's responsibility) ──────────────────────\r\n init(): void {\r\n this.controller.init()\r\n }\r\n destroy(): void {\r\n this.signalStore.destroy()\r\n this.controller.destroy()\r\n }\r\n\r\n // ── Forwarding methods (pure delegation) ─────────────────────\r\n retryAuth(): void {\r\n this.controller.retryAuth()\r\n }\r\n handleSignOut(): void {\r\n this.controller.signOut()\r\n }\r\n setPath(newPath: DriveFolder[]): void {\r\n this.controller.setPath(newPath)\r\n }\r\n handleClick(file: DriveFile): void {\r\n this.controller.handleClick(file)\r\n }\r\n handleSubmit(): Promise<void> {\r\n return this.controller.handleSubmit()\r\n }\r\n handleCancelDownload(): void {\r\n this.controller.handleCancelDownload()\r\n }\r\n onSelectCurrentFolder(): void {\r\n void this.controller.onSelectCurrentFolder()\r\n }\r\n loadMore(): Promise<void> {\r\n return this.controller.loadMore()\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { type DriveBrowserError, formatUiMessage as t } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../../upup-store.service'\r\nimport { SourceViewContainerComponent } from '../source-view-container.component'\r\n\r\n/**\r\n * Angular port of DriveAuthFallback.svelte.\r\n *\r\n * Renders the \"sign in\" prompt when a cloud drive is not yet authenticated.\r\n * Uses core's `formatUiMessage` (t) with {{provider}} double-brace placeholders —\r\n * exactly as svelte does: t(tr.authenticatePrompt, { provider: providerName }).\r\n * Single-brace is WRONG; this mirrors the proven svelte pattern.\r\n */\r\n@Component({\r\n selector: 'upup-drive-auth-fallback',\r\n standalone: true,\r\n imports: [SourceViewContainerComponent],\r\n template: `\r\n <upup-source-view-container [slotName]=\"slotName\">\r\n <div\r\n class=\"upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-6 upup-text-center\"\r\n >\r\n @if (!!error?.()) {\r\n <p\r\n data-testid=\"upup-drive-error\"\r\n data-upup-slot=\"drive-error\"\r\n role=\"alert\"\r\n class=\"upup-p-4 upup-text-sm upup-text-red-600 dark:upup-text-red-400\"\r\n >\r\n {{ errorText }}\r\n </p>\r\n }\r\n <p [class]=\"promptClass\">{{ authenticatePrompt }}</p>\r\n <button\r\n type=\"button\"\r\n [class]=\"signInButtonClass\"\r\n (click)=\"onRetry()\"\r\n >\r\n {{ signInLabel }}\r\n </button>\r\n </div>\r\n </upup-source-view-container>\r\n `,\r\n})\r\nexport class DriveAuthFallbackComponent {\r\n private store = inject(UpupStore)\r\n\r\n @Input({ required: true }) providerName!: string\r\n @Input({ required: true }) onRetry!: () => void\r\n @Input() error: (() => DriveBrowserError | undefined) | undefined =\r\n undefined\r\n /** Maps to svelte's dataUpupSlot prop — forwarded to SourceViewContainer slotName. */\r\n @Input() slotName: string = 'drive-auth-fallback'\r\n\r\n get errorText(): string {\r\n const err = this.error?.()\r\n const tr = this.store.translations()\r\n return err ? t(tr.driveLoadError, { message: err.message }) : ''\r\n }\r\n\r\n /** Resolved i18n string: \"Sign in to access {{provider}}\" → \"Sign in to access Google Drive\" */\r\n get authenticatePrompt(): string {\r\n const tr = this.store.translations()\r\n return t(tr.authenticatePrompt, { provider: this.providerName })\r\n }\r\n\r\n /** Resolved i18n string: \"Sign in with {{provider}}\" → \"Sign in with Google Drive\" */\r\n get signInLabel(): string {\r\n const tr = this.store.translations()\r\n return t(tr.signInWith, { provider: this.providerName })\r\n }\r\n\r\n get promptClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-text-sm upup-text-[#333]',\r\n dark ? 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]' : '',\r\n slotClasses.sourceView,\r\n )\r\n }\r\n\r\n get signInButtonClass(): string {\r\n const dark = this.store.isDark()\r\n return 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 dark\r\n ? 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8] dark:hover:upup-bg-[#0ea5e9]'\r\n : '',\r\n )\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-search-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"search\" [class]=\"className\" />`,\r\n})\r\nexport class SearchIconComponent {\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-chevron-left-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"chevron-left\" [class]=\"className\" />`,\r\n})\r\nexport class ChevronLeftIconComponent {\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-user-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"user\" [class]=\"className\" />`,\r\n})\r\nexport class UserIconComponent {\r\n @Input('class') className: string = ''\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core'\r\nimport {\r\n type DriveFolder,\r\n type DriveUser,\r\n type UiTranslations,\r\n} from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../../upup-store.service'\r\nimport { SourceViewHeaderExtraService } from '../../context/source-view-header-extra.service'\r\nimport { SearchIconComponent } from '../icons/search-icon.component'\r\nimport { ChevronLeftIconComponent } from '../icons/chevron-left-icon.component'\r\nimport { UserIconComponent } from '../icons/user-icon.component'\r\n\r\n/**\r\n * Angular port of DriveBrowserHeader.\r\n *\r\n * Boxless, merged header: once navigated past the root, a ghost chevron-left\r\n * Back button (up one folder) + the current folder name, with the search\r\n * collapsed into an icon toggle that expands into the styled input. At the root\r\n * the full-width search shows directly. The account controls (avatar + log out +\r\n * hairline separator) are portaled into the SourceView header row, next to Back\r\n * — not their own strip. Only shown when `user` is set. Preserves\r\n * data-upup-slot=\"drive-browser-header\".\r\n *\r\n * Portal idiom: the account controls live in a `display:contents` wrapper which\r\n * is appended into the header-extra host element (from\r\n * SourceViewHeaderExtraService) once it mounts — Angular's equivalent of React's\r\n * createPortal / Svelte's `portal` action.\r\n */\r\n@Component({\r\n selector: 'upup-drive-browser-header',\r\n standalone: true,\r\n imports: [SearchIconComponent, ChevronLeftIconComponent, UserIconComponent],\r\n template: `\r\n @if (user) {\r\n <div data-upup-slot=\"drive-browser-header\">\r\n <!-- Account controls portal into the SourceView header row (next\r\n to Back), separated by a hairline. -->\r\n @if (headerExtra?.host()) {\r\n <div #extra style=\"display: contents\">\r\n <div\r\n class=\"upup-relative upup-flex upup-h-6 upup-w-6 upup-items-center upup-justify-center upup-overflow-hidden upup-rounded-full\"\r\n >\r\n @if (!!user?.picture) {\r\n <img\r\n [alt]=\"user?.name\"\r\n [src]=\"user?.picture\"\r\n class=\"upup-bg-center upup-object-cover\"\r\n />\r\n }\r\n @if (!user?.picture) {\r\n <upup-user-icon class=\"upup-text-xl\" />\r\n }\r\n </div>\r\n <button\r\n type=\"button\"\r\n [class]=\"logoutClass\"\r\n (click)=\"onLogout()\"\r\n >\r\n {{ tr.logOut }}\r\n </button>\r\n <span\r\n aria-hidden=\"true\"\r\n [class]=\"separatorClass\"\r\n ></span>\r\n </div>\r\n }\r\n\r\n @if (showSearch || navigated) {\r\n <div [class]=\"headerClass\">\r\n @if (navigated) {\r\n <button\r\n type=\"button\"\r\n data-testid=\"upup-drive-back\"\r\n data-upup-slot=\"drive-back\"\r\n [attr.aria-label]=\"tr.overlayBack\"\r\n [class]=\"backClass\"\r\n (click)=\"setPath(path!.slice(0, -1))\"\r\n >\r\n <upup-chevron-left-icon />\r\n </button>\r\n }\r\n @if (navigated && !searchOpen) {\r\n <span\r\n data-upup-slot=\"drive-current-folder\"\r\n [attr.title]=\"currentFolder?.name\"\r\n class=\"upup-min-w-0 upup-flex-1 upup-truncate upup-font-medium\"\r\n >{{ currentFolder?.name }}</span\r\n >\r\n }\r\n @if (navigated && 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 [attr.aria-label]=\"tr.search\"\r\n aria-expanded=\"false\"\r\n [class]=\"searchToggleClass\"\r\n (click)=\"searchOpen = true\"\r\n >\r\n <upup-search-icon />\r\n </button>\r\n }\r\n @if (showSearch && (!navigated || searchOpen)) {\r\n <div [class]=\"searchContainerClass\">\r\n <input\r\n #searchInput\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 [attr.aria-label]=\"tr.search\"\r\n [class]=\"searchInputClass\"\r\n [placeholder]=\"tr.search\"\r\n [value]=\"searchTerm\"\r\n (input)=\"onSearch(getInputValue($event))\"\r\n (keydown.escape)=\"searchOpen = false\"\r\n (blur)=\"onSearchBlur()\"\r\n />\r\n <upup-search-icon\r\n class=\"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 </div>\r\n }\r\n </div>\r\n }\r\n `,\r\n})\r\nexport class DriveBrowserHeaderComponent implements OnDestroy {\r\n private store = inject(UpupStore)\r\n // Optional: provided at the <upup-uploader> level in the real app; isolated\r\n // drive-uploader tests mount this component without it. Mirrors svelte's\r\n // `useSourceViewHeaderExtra() ?? writable(null)` graceful fallback — no host\r\n // means the account controls simply don't portal (no crash).\r\n readonly headerExtra = inject(SourceViewHeaderExtraService, {\r\n optional: true,\r\n })\r\n\r\n @Input({ required: true }) path!: DriveFolder[]\r\n @Input({ required: true }) setPath!: (newPath: DriveFolder[]) => void\r\n @Input({ required: true }) handleSignOut!: () => void\r\n @Input() showSearch: boolean = false\r\n @Input() searchTerm: string = ''\r\n @Input() onSearch: (value: string) => void = () => {\r\n /* noop */\r\n }\r\n @Input() user: DriveUser | undefined = undefined\r\n\r\n /**\r\n * The account-controls wrapper, relocated into the header-extra host once it\r\n * mounts. Tracked so the moved node can be removed on destroy (mirrors\r\n * Svelte's portal action `destroy()`), since it no longer lives inside this\r\n * component's own view.\r\n */\r\n private movedNode: HTMLElement | null = null\r\n\r\n @ViewChild('extra')\r\n set extra(ref: ElementRef<HTMLElement> | undefined) {\r\n const node = ref?.nativeElement ?? null\r\n const host = this.headerExtra?.host() ?? null\r\n if (node && host) {\r\n host.appendChild(node)\r\n this.movedNode = node\r\n }\r\n }\r\n\r\n // Collapsed/expanded search lives here; the term itself stays in\r\n // DriveBrowser.\r\n searchOpen = false\r\n\r\n /**\r\n * Focus the field the moment it expands. The input renders only while\r\n * `searchOpen`, so the query result appears exactly on the open transition —\r\n * mirroring React's `useEffect(focus, [searchOpen])`, using the same\r\n * ViewChild-setter idiom as `extra` above.\r\n */\r\n @ViewChild('searchInput')\r\n set searchInput(ref: ElementRef<HTMLInputElement> | undefined) {\r\n if (ref && this.searchOpen) ref.nativeElement.focus()\r\n }\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 blew\r\n // the row up, and multi-level jumps weren't worth the fragility).\r\n get navigated(): boolean {\r\n return (this.path?.length ?? 0) > 1\r\n }\r\n\r\n get currentFolder(): DriveFolder | undefined {\r\n return this.path?.[this.path.length - 1]\r\n }\r\n\r\n get hasFilter(): boolean {\r\n return this.searchTerm.trim().length > 0\r\n }\r\n\r\n onSearchBlur(): void {\r\n // Collapse only when empty — a live filter must stay visible.\r\n if (!this.searchTerm) this.searchOpen = false\r\n }\r\n\r\n get tr(): UiTranslations {\r\n return this.store.translations()\r\n }\r\n\r\n onLogout(): void {\r\n this.handleSignOut()\r\n this.store.setActiveSource(undefined)\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.movedNode?.remove()\r\n this.movedNode = null\r\n }\r\n\r\n get headerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return 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 dark ? 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]' : '',\r\n slotClasses.driveHeader,\r\n )\r\n }\r\n\r\n get backClass(): string {\r\n const dark = this.store.isDark()\r\n return 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\r\n get searchToggleClass(): string {\r\n const dark = this.store.isDark()\r\n return 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 this.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\r\n get logoutClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-hover:upup-underline upup-text-xs upup-font-medium upup-text-[#0284c7]',\r\n dark ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]' : '',\r\n slotClasses.driveLogoutButton,\r\n )\r\n }\r\n\r\n get separatorClass(): string {\r\n const dark = this.store.isDark()\r\n return 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 get searchContainerClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-relative upup-min-w-0 upup-flex-1',\r\n // Enter animation only on the navigated-expanded form, never at root.\r\n this.navigated ? 'upup-fx-search-expand' : '',\r\n slotClasses.driveSearchContainer,\r\n )\r\n }\r\n\r\n get searchInputClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return 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 }\r\n\r\n getInputValue(event: Event): string {\r\n return (event.target as HTMLInputElement).value\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-folder-filled-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"folder-filled\" [class]=\"className\" />`,\r\n})\r\nexport class FolderFilledIconComponent {\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\nimport type { IconName } from '@useupup/core'\r\n\r\n@Component({\r\n selector: 'upup-file-icon-svg',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon [name]=\"name\" [class]=\"className\" />`,\r\n})\r\nexport class FileIconSvgComponent {\r\n @Input() name: IconName = 'file'\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { type DriveFile } from '@useupup/core'\r\nimport { b64EncodeUnicode } from '@useupup/core/internal'\r\nimport { UpupStore } from '../../upup-store.service'\r\nimport { FolderFilledIconComponent } from '../icons/folder-filled-icon.component'\r\nimport { FileIconSvgComponent } from '../icons/file-icon-svg.component'\r\n\r\n/**\r\n * Angular port of DriveBrowserIcon.svelte.\r\n *\r\n * Renders a folder icon, a file icon, or the drive thumbnail image for a DriveFile.\r\n * Falls back to an inline SVG data-URI when the thumbnail image fails to load.\r\n */\r\n@Component({\r\n selector: 'upup-drive-browser-icon',\r\n standalone: true,\r\n imports: [FolderFilledIconComponent, FileIconSvgComponent],\r\n template: `\r\n @if (file.isFolder) {\r\n <i class=\"upup-flex-grow upup-text-lg\">\r\n <!-- Amber filled folder in both themes — folders read\r\n unmistakably as folders. -->\r\n <upup-folder-filled-icon class=\"upup-text-[#fbbf24]\" />\r\n </i>\r\n } @else if (!file.thumbnail) {\r\n <i class=\"upup-flex-grow upup-text-lg\">\r\n <upup-file-icon-svg [class]=\"fileIconClass\" />\r\n </i>\r\n } @else {\r\n <img\r\n [src]=\"file.thumbnail\"\r\n [alt]=\"file.name\"\r\n class=\"upup-h-5 upup-w-5 upup-flex-grow upup-rounded-md upup-shadow\"\r\n (error)=\"handleImgError($event)\"\r\n />\r\n }\r\n `,\r\n})\r\nexport class DriveBrowserIconComponent {\r\n private store = inject(UpupStore)\r\n\r\n @Input({ required: true }) file!: DriveFile\r\n\r\n get fileIconClass(): string {\r\n return this.store.isDark()\r\n ? 'upup-text-[#6D6D6D] dark:upup-text-[#6D6D6D]'\r\n : ''\r\n }\r\n\r\n handleImgError(e: Event): void {\r\n const img = e.target as HTMLImageElement\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 img.src = `data:image/svg+xml;base64,${b64EncodeUnicode(svg)}`\r\n img.onerror = null\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { type DriveFile } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../../upup-store.service'\r\nimport { DriveBrowserIconComponent } from './drive-browser-icon.component'\r\n\r\n/**\r\n * Angular port of DriveBrowserItem.svelte.\r\n *\r\n * Renders a single drive file/folder row. Clicking calls handleClick.\r\n * Highlights selected files. Preserves data-upup-slot=\"drive-browser-item\".\r\n */\r\n@Component({\r\n selector: 'upup-drive-browser-item',\r\n standalone: true,\r\n imports: [DriveBrowserIconComponent],\r\n template: `\r\n <div\r\n data-upup-slot=\"drive-browser-item\"\r\n [class]=\"containerClass\"\r\n (click)=\"handleClick(file)\"\r\n >\r\n <div [class]=\"innerClass\">\r\n <upup-drive-browser-icon [file]=\"file\" />\r\n <h1 [class]=\"textClass\">{{ file.name }}</h1>\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class DriveBrowserItemComponent {\r\n private store = inject(UpupStore)\r\n\r\n @Input({ required: true }) file!: DriveFile\r\n @Input({ required: true }) handleClick!: (file: DriveFile) => void\r\n @Input({ required: true }) selectedFiles!: DriveFile[]\r\n\r\n get isFolder(): boolean {\r\n return this.file.isFolder\r\n }\r\n\r\n get isFileSelected(): boolean {\r\n return this.selectedFiles.some(f => f.id === this.file.id)\r\n }\r\n\r\n get containerClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n const parts: string[] = [\r\n 'upup-hover:bg-[#bab4b499] upup-group upup-mb-1 upup-flex upup-cursor-pointer upup-items-center upup-justify-between upup-gap-2 upup-rounded-md upup-p-1 upup-py-2 upup-transition-colors upup-duration-150',\r\n ]\r\n if (this.isFolder) parts.push('upup-font-medium')\r\n if (this.isFileSelected) {\r\n parts.push('upup-bg-[#bab4b499]')\r\n if (slotClasses.driveItemContainerSelected)\r\n parts.push(slotClasses.driveItemContainerSelected)\r\n } else {\r\n parts.push('upup-bg-[#e9ecef00]')\r\n if (slotClasses.driveItemContainerDefault)\r\n parts.push(slotClasses.driveItemContainerDefault)\r\n }\r\n return parts.join(' ')\r\n }\r\n\r\n get innerClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-flex upup-items-center upup-gap-2',\r\n slotClasses.driveItemContainerInner,\r\n )\r\n }\r\n\r\n get textClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-text-wrap upup-break-all upup-text-xs',\r\n dark ? 'upup-text-[#e0e0e0] dark:upup-text-[#e0e0e0]' : '',\r\n slotClasses.driveItemInnerText,\r\n )\r\n }\r\n}\r\n","import { Component, Input, inject, signal, computed, Type } from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport {\r\n type DriveBrowserError,\r\n type DriveFile,\r\n type DriveFolder,\r\n type DriveUser,\r\n type UiTranslations,\r\n formatUiMessage as t,\r\n pluralUiMessage as plural,\r\n} from '@useupup/core'\r\nimport { searchDriveFiles, cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../../upup-store.service'\r\nimport { SourceViewContainerComponent } from '../source-view-container.component'\r\nimport { DriveBrowserHeaderComponent } from './drive-browser-header.component'\r\nimport { DriveBrowserItemComponent } from './drive-browser-item.component'\r\n\r\n/**\r\n * Angular port of DriveBrowser.svelte.\r\n *\r\n * The main drive file/folder browser. Driven entirely by signals passed as inputs\r\n * from a drive service. No business logic: navigate/select/submit all delegate\r\n * back to the service via the provided handler functions.\r\n *\r\n * Preserves data-testid=\"upup-drive-browser\" and data-upup-slot={slotName}.\r\n */\r\n@Component({\r\n selector: 'upup-drive-browser',\r\n standalone: true,\r\n imports: [\r\n SourceViewContainerComponent,\r\n NgComponentOutlet,\r\n DriveBrowserHeaderComponent,\r\n DriveBrowserItemComponent,\r\n ],\r\n template: `\r\n <upup-source-view-container\r\n [isLoading]=\"isLoading()\"\r\n [slotName]=\"slotName\"\r\n >\r\n @if (isLoading()) {\r\n <ng-container [ngComponentOutlet]=\"loader\" />\r\n } @else {\r\n <div\r\n data-testid=\"upup-drive-browser\"\r\n class=\"upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto\"\r\n >\r\n <!-- Header: breadcrumb + user + search -->\r\n <upup-drive-browser-header\r\n [path]=\"path()\"\r\n [setPath]=\"setPath\"\r\n [handleSignOut]=\"handleSignOut\"\r\n [showSearch]=\"!!items()?.length\"\r\n [searchTerm]=\"searchTerm()\"\r\n [onSearch]=\"onSearchChange\"\r\n [user]=\"user()\"\r\n />\r\n\r\n <!-- Body: file/folder list or empty message -->\r\n @if (!!path()?.length) {\r\n <div [class]=\"bodyClass\">\r\n <!-- Error state: a calm centered message, not a\r\n banner strip over an empty list. -->\r\n @if (!!error?.()) {\r\n <div\r\n class=\"upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center upup-px-6 upup-text-center\"\r\n >\r\n <p\r\n data-testid=\"upup-drive-error\"\r\n data-upup-slot=\"drive-error\"\r\n role=\"alert\"\r\n class=\"upup-text-sm upup-text-red-600 dark:upup-text-red-400\"\r\n >\r\n {{ errorText }}\r\n </p>\r\n </div>\r\n }\r\n @if (!!displayedItems().length) {\r\n <ul class=\"upup-p-2\">\r\n @for (\r\n file of displayedItems();\r\n track file.id\r\n ) {\r\n <upup-drive-browser-item\r\n [file]=\"file\"\r\n [handleClick]=\"clickHandler\"\r\n [selectedFiles]=\"selectedFiles()\"\r\n />\r\n }\r\n </ul>\r\n }\r\n @if (!displayedItems().length && !error?.()) {\r\n <div\r\n class=\"upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center\"\r\n >\r\n <p class=\"upup-text-xs upup-opacity-70\">\r\n {{ tr.noAcceptedFilesFound }}\r\n </p>\r\n </div>\r\n }\r\n @if (!!hasMore?.()) {\r\n <button\r\n data-testid=\"upup-drive-load-more\"\r\n data-upup-slot=\"drive-load-more\"\r\n class=\"upup-mx-auto upup-my-2 upup-block upup-rounded-md upup-px-3 upup-py-1.5 upup-text-sm upup-text-[#0284c7] disabled:upup-opacity-50\"\r\n [disabled]=\"isLoadingMore?.()\"\r\n (click)=\"loadMore?.()\"\r\n >\r\n {{\r\n isLoadingMore?.()\r\n ? tr.loading\r\n : tr.loadMore\r\n }}\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 @if (\r\n (!!selectedFiles().length || !!onSelectCurrentFolder) &&\r\n !error?.()\r\n ) {\r\n <div [class]=\"footerClass\">\r\n @if (onSelectCurrentFolder) {\r\n <button\r\n type=\"button\"\r\n [class]=\"selectFolderBtnClass\"\r\n [disabled]=\"showLoader()\"\r\n (click)=\"onSelectCurrentFolder!()\"\r\n >\r\n {{ tr.selectThisFolder }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n [class]=\"addFilesBtnClass\"\r\n [disabled]=\"showLoader()\"\r\n (click)=\"handleSubmit()\"\r\n >\r\n {{ addFilesLabel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"cancelBtnClass\"\r\n [disabled]=\"showLoader()\"\r\n (click)=\"handleCancelDownload()\"\r\n >\r\n {{ tr.cancel }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </upup-source-view-container>\r\n `,\r\n})\r\nexport class DriveBrowserComponent {\r\n private store = inject(UpupStore)\r\n\r\n // ── Inputs from drive service ─────────────────────────────────\r\n @Input({ required: true }) driveFiles!: () => DriveFolder | undefined\r\n @Input({ required: true }) path!: () => DriveFolder[]\r\n @Input({ required: true }) setPath!: (newPath: DriveFolder[]) => void\r\n @Input({ required: true }) user!: () => DriveUser | undefined\r\n @Input({ required: true }) handleSignOut!: () => void\r\n @Input({ required: true }) handleClick!: (file: DriveFile) => void\r\n @Input({ required: true }) selectedFiles!: () => DriveFile[]\r\n @Input({ required: true }) showLoader!: () => boolean\r\n @Input({ required: true }) handleSubmit!: () => Promise<void>\r\n @Input({ required: true }) handleCancelDownload!: () => void\r\n @Input({ required: true }) isClickLoading!: () => boolean\r\n @Input() onSelectCurrentFolder: (() => void) | undefined = undefined\r\n @Input() error: (() => DriveBrowserError | undefined) | undefined =\r\n undefined\r\n @Input() hasMore: (() => boolean) | undefined = undefined\r\n @Input() isLoadingMore: (() => boolean) | undefined = undefined\r\n @Input() loadMore: (() => void | Promise<void>) | undefined = undefined\r\n /** Maps to svelte's dataUpupSlot prop. */\r\n @Input() slotName: string = 'drive-browser'\r\n\r\n // ── Local state ───────────────────────────────────────────────\r\n readonly searchTerm = signal('')\r\n readonly onSearchChange = (v: string): void => {\r\n this.searchTerm.set(v)\r\n }\r\n\r\n // ── Derived ───────────────────────────────────────────────────\r\n // error short-circuits the perpetual loader — the exact F-123/F-124 symptom.\r\n readonly isLoading = computed(\r\n () =>\r\n !this.error?.() &&\r\n ((this.isClickLoading?.() ?? false) || !this.driveFiles?.()),\r\n )\r\n\r\n get errorText(): string {\r\n const err = this.error?.()\r\n return err ? t(this.tr.driveLoadError, { message: err.message }) : ''\r\n }\r\n\r\n get loader(): Type<unknown> {\r\n return this.store.uiProps.icons.LoaderIcon as Type<unknown>\r\n }\r\n\r\n readonly items = computed(() => {\r\n const currentFolder = this.path().at(-1)\r\n if (!currentFolder?.children) return []\r\n const accept = this.store.uiProps.allowedFileTypes\r\n return currentFolder.children.filter(item =>\r\n this.filterItems(item, accept),\r\n )\r\n })\r\n\r\n readonly displayedItems = computed(\r\n () => searchDriveFiles(this.items(), this.searchTerm()) ?? [],\r\n )\r\n\r\n get tr(): UiTranslations {\r\n return this.store.translations()\r\n }\r\n\r\n /** Click handler that is a noop when loading (passed to DriveBrowserItem). */\r\n get clickHandler(): (file: DriveFile) => void {\r\n return this.isClickLoading() || this.showLoader()\r\n ? () => {\r\n /* disabled */\r\n }\r\n : this.handleClick\r\n }\r\n\r\n get addFilesLabel(): string {\r\n return t(plural(this.tr, 'addFiles', this.selectedFiles().length), {\r\n count: this.selectedFiles().length,\r\n })\r\n }\r\n\r\n // ── Class helpers ─────────────────────────────────────────────\r\n get bodyClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n // Transparent on the panel gradient — no inner box.\r\n return cn(\r\n 'upup-h-full upup-overflow-y-auto upup-pt-2',\r\n dark ? 'upup-text-[#fafafa] dark:upup-text-[#fafafa]' : '',\r\n slotClasses.driveBody,\r\n )\r\n }\r\n\r\n get footerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return 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\r\n get selectFolderBtnClass(): string {\r\n const dark = this.store.isDark()\r\n return 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 dark ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]' : '',\r\n )\r\n }\r\n\r\n get addFilesBtnClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return 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': this.showLoader(),\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark,\r\n },\r\n slotClasses.driveAddFilesButton,\r\n )\r\n }\r\n\r\n get cancelBtnClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return 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 dark ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]' : '',\r\n slotClasses.driveCancelFilesButton,\r\n )\r\n }\r\n\r\n private filterItems(item: DriveFile, accept: string): boolean {\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\n","import { Component, inject, OnInit, OnDestroy } from '@angular/core'\r\nimport { GoogleDriveService } from '../services/google-drive.service'\r\nimport { DriveAuthFallbackComponent } from './shared/drive-auth-fallback.component'\r\nimport { DriveBrowserComponent } from './shared/drive-browser.component'\r\n\r\n/**\r\n * Angular port of ClientGoogleDriveUploader.svelte.\r\n *\r\n * Wires up GoogleDriveService → DriveAuthFallback (when not authed) or\r\n * DriveBrowser (when authed). All state lives in the service; this component\r\n * only routes between the two views.\r\n *\r\n * GIS auth (Google): shows fallback when !token && (authCancelled || isAuthReady).\r\n * The fallback button calls retryAuth() — no popup is triggered directly here.\r\n */\r\n@Component({\r\n selector: 'upup-client-google-drive-uploader',\r\n standalone: true,\r\n providers: [GoogleDriveService],\r\n imports: [DriveAuthFallbackComponent, DriveBrowserComponent],\r\n template: `\r\n @if (!svc.token() && (svc.authCancelled() || svc.isAuthReady())) {\r\n <upup-drive-auth-fallback\r\n providerName=\"Google Drive\"\r\n [onRetry]=\"retryAuth\"\r\n [error]=\"svc.error\"\r\n slotName=\"google-drive-uploader\"\r\n />\r\n } @else {\r\n <upup-drive-browser\r\n [driveFiles]=\"svc.googleFiles\"\r\n [user]=\"svc.user\"\r\n [handleSignOut]=\"handleSignOut\"\r\n slotName=\"google-drive-uploader\"\r\n [path]=\"svc.path\"\r\n [setPath]=\"setPath\"\r\n [isClickLoading]=\"svc.isClickLoading\"\r\n [handleClick]=\"handleClick\"\r\n [selectedFiles]=\"svc.selectedFiles\"\r\n [showLoader]=\"svc.showLoader\"\r\n [handleSubmit]=\"handleSubmit\"\r\n [handleCancelDownload]=\"handleCancelDownload\"\r\n [onSelectCurrentFolder]=\"onSelectCurrentFolder\"\r\n [error]=\"svc.error\"\r\n [hasMore]=\"svc.hasMore\"\r\n [isLoadingMore]=\"svc.isLoadingMore\"\r\n [loadMore]=\"loadMore\"\r\n />\r\n }\r\n `,\r\n})\r\nexport class ClientGoogleDriveUploaderComponent implements OnInit, OnDestroy {\r\n readonly svc = inject(GoogleDriveService)\r\n\r\n ngOnInit(): void {\r\n this.svc.init()\r\n }\r\n ngOnDestroy(): void {\r\n this.svc.destroy()\r\n }\r\n\r\n // Bound handlers passed as inputs to DriveBrowser / DriveAuthFallback\r\n readonly retryAuth = (): void => {\r\n this.svc.retryAuth()\r\n }\r\n readonly handleSignOut = (): void => {\r\n this.svc.handleSignOut()\r\n }\r\n readonly setPath = (\r\n path: Parameters<GoogleDriveService['setPath']>[0],\r\n ): void => {\r\n this.svc.setPath(path)\r\n }\r\n readonly handleClick = (\r\n file: Parameters<GoogleDriveService['handleClick']>[0],\r\n ): void => {\r\n this.svc.handleClick(file)\r\n }\r\n readonly handleSubmit = (): Promise<void> => this.svc.handleSubmit()\r\n readonly handleCancelDownload = (): void => {\r\n this.svc.handleCancelDownload()\r\n }\r\n readonly onSelectCurrentFolder = (): void => {\r\n this.svc.onSelectCurrentFolder()\r\n }\r\n readonly loadMore = (): Promise<void> => this.svc.loadMore()\r\n}\r\n","import { Injectable, inject, signal, computed } from '@angular/core'\r\nimport {\r\n type ServerModeProvider,\r\n type ServerDriveFile,\r\n type ServerDriveListState,\r\n} from '@useupup/core'\r\nimport { ServerModeDriveController } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore, type SignalStore } from '../lib/to-signal-store'\r\n\r\n// Preserve the module's existing public type surface for consumers that import from here.\r\nexport type { ServerModeProvider, ServerDriveFile }\r\nexport type ListState = ServerDriveListState\r\n\r\nexport const 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\n@Injectable()\r\nexport class ServerModeDriveService {\r\n private store = inject(UpupStore)\r\n private controller!: ServerModeDriveController\r\n private bridge!: SignalStore<\r\n import('@useupup/core/internal').ServerDriveSnapshot\r\n >\r\n private provider!: ServerModeProvider\r\n\r\n // ── Drive list state — mirrored from the controller snapshot ──\r\n readonly listState = computed<ServerDriveListState>(\r\n () => this.bridge?.state().state ?? { status: 'idle' },\r\n )\r\n readonly folderId = computed(() => this.bridge?.state().folderId)\r\n readonly search = computed(() => this.bridge?.state().search ?? '')\r\n\r\n // ── Selection + transfer UI state — Angular-only (consumer concern) ──\r\n readonly selected = signal<Set<string>>(new Set())\r\n readonly isTransferring = signal<boolean>(false)\r\n\r\n init(provider: ServerModeProvider): void {\r\n this.provider = provider\r\n this.controller = new ServerModeDriveController({\r\n provider,\r\n serverUrl: () => this.store.serverUrl,\r\n })\r\n this.bridge = toSignalStore(this.controller)\r\n this.controller.init()\r\n }\r\n\r\n list(opts?: { folderId?: string; search?: string }): Promise<void> {\r\n return this.controller.list(opts)\r\n }\r\n startAuth(): void {\r\n this.controller.startAuth()\r\n }\r\n setFolderId(id: string | undefined): void {\r\n this.controller.setFolderId(id)\r\n }\r\n setSearch(s: string): void {\r\n this.controller.setSearch(s)\r\n }\r\n\r\n toggleSelected(id: string): void {\r\n const next = new Set(this.selected())\r\n if (next.has(id)) {\r\n next.delete(id)\r\n } else {\r\n next.add(id)\r\n }\r\n this.selected.set(next)\r\n }\r\n\r\n async transfer(): Promise<void> {\r\n const state = this.listState()\r\n if (state.status !== 'ready') return\r\n const toTransfer = state.files.filter(f => this.selected().has(f.id))\r\n if (!toTransfer.length) return\r\n\r\n this.isTransferring.set(true)\r\n try {\r\n for (const file of toTransfer) {\r\n const r = await this.controller.transfer(file)\r\n if (r.status === 'reauth') {\r\n this.controller.requestReauth()\r\n return\r\n }\r\n if (r.status === 'error') {\r\n this.controller.setError(r.message)\r\n return\r\n }\r\n const result = r.result as { file?: File }\r\n if (result.file) {\r\n void this.store.handleSetSelectedFiles([result.file])\r\n }\r\n }\r\n this.selected.set(new Set())\r\n } finally {\r\n this.isTransferring.set(false)\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.controller?.destroy()\r\n this.bridge?.destroy()\r\n }\r\n\r\n get providerLabel(): string {\r\n return PROVIDER_LABEL[this.provider]\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n inject,\r\n OnInit,\r\n OnDestroy,\r\n Type,\r\n} from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { errorCodeToMessageKey } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport {\r\n ServerModeDriveService,\r\n type ServerModeProvider,\r\n type ServerDriveFile,\r\n PROVIDER_LABEL,\r\n} from '../services/server-mode-drive.service'\r\nimport { DriveAuthFallbackComponent } from './shared/drive-auth-fallback.component'\r\nimport { SourceViewContainerComponent } from './source-view-container.component'\r\n\r\n/**\r\n * Angular port of ServerModeDriveUploader.svelte.\r\n *\r\n * Routes between two views based on server list state:\r\n * - 'reauth': renders DriveAuthFallback (sign-in prompt; testid upup-server-drive-browser absent)\r\n * - all other states: renders the server drive browser (data-testid=\"upup-server-drive-browser\")\r\n *\r\n * Testid `upup-server-drive-browser` MUST be preserved byte-for-byte (live-verification + guards).\r\n * Double-brace {{provider}} is resolved by DriveAuthFallbackComponent via core's formatUiMessage.\r\n *\r\n * Regression guards (from vanilla's server-drive.test.ts, ported to Angular):\r\n * 1. 401 → state.status === 'reauth' → auth fallback rendered, browser testid absent\r\n * 2. ngOnDestroy calls destroy() → abort controller aborted\r\n * 3. ngOnDestroy calls destroy() → window 'message' listener removed\r\n */\r\n@Component({\r\n selector: 'upup-server-mode-drive-uploader',\r\n standalone: true,\r\n providers: [ServerModeDriveService],\r\n imports: [\r\n DriveAuthFallbackComponent,\r\n SourceViewContainerComponent,\r\n NgComponentOutlet,\r\n ],\r\n template: `\r\n @if (svc.listState().status === 'reauth') {\r\n <upup-drive-auth-fallback\r\n [providerName]=\"providerLabel\"\r\n [onRetry]=\"startAuth\"\r\n [slotName]=\"slotName\"\r\n />\r\n } @else {\r\n <upup-source-view-container\r\n [isLoading]=\"isLoading\"\r\n [slotName]=\"slotName\"\r\n >\r\n @if (isLoading) {\r\n <ng-container [ngComponentOutlet]=\"loader\" />\r\n } @else {\r\n <div\r\n data-testid=\"upup-server-drive-browser\"\r\n class=\"upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr,auto] upup-overflow-auto\"\r\n >\r\n <!-- Header: provider label + search -->\r\n <div\r\n [class]=\"headerClass\"\r\n data-upup-slot=\"drive-browser-header\"\r\n >\r\n <span class=\"upup-text-sm upup-font-medium\">{{\r\n providerLabel\r\n }}</span>\r\n <input\r\n type=\"search\"\r\n name=\"upup-drive-search\"\r\n aria-label=\"Search\"\r\n [value]=\"svc.search()\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown.enter)=\"onSearchEnter($event)\"\r\n placeholder=\"Search&hellip;\"\r\n [class]=\"searchInputClass\"\r\n />\r\n </div>\r\n\r\n <!-- Body: file list -->\r\n <div class=\"upup-overflow-auto upup-p-2\">\r\n @if (svc.listState().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 [class]=\"errorClass\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n @for (file of displayFiles; track file.id) {\r\n <button\r\n type=\"button\"\r\n data-upup-slot=\"drive-browser-item\"\r\n [attr.data-selected]=\"\r\n svc.selected().has(file.id)\r\n \"\r\n [class]=\"fileItemClass(file)\"\r\n (click)=\"onFileClick(file)\"\r\n >\r\n <span\r\n class=\"upup-flex upup-h-[30px] upup-w-[30px] upup-flex-none upup-items-center upup-justify-center upup-rounded-[8px] upup-bg-white/[0.05]\"\r\n aria-hidden=\"true\"\r\n >\r\n @if (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 stroke-width=\"1.7\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n 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 />\r\n </svg>\r\n } @else {\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"17\"\r\n height=\"17\"\r\n fill=\"none\"\r\n [attr.stroke]=\"fileIconStroke\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n d=\"M6 3h8l4 4v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\"\r\n />\r\n <path d=\"M14 3v4h4\" />\r\n </svg>\r\n }\r\n </span>\r\n <span class=\"upup-flex-1 upup-truncate\">{{\r\n file.name\r\n }}</span>\r\n @if (file.size != null && !file.isFolder) {\r\n <span\r\n class=\"upup-text-xs upup-opacity-60\"\r\n >{{ formatBytes(file.size!) }}</span\r\n >\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Footer: cancel + add files -->\r\n <div [class]=\"footerClass\">\r\n <button\r\n type=\"button\"\r\n class=\"upup-text-sm upup-opacity-70 hover:upup-opacity-100\"\r\n (click)=\"onBack()\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n [disabled]=\"\r\n svc.selected().size === 0 ||\r\n svc.isTransferring()\r\n \"\r\n class=\"upup-fx-press upup-rounded-lg upup-bg-[#0ea5e9] upup-px-3 upup-py-1.5 upup-text-sm upup-font-medium upup-text-white hover:upup-bg-[#0284c7] disabled:upup-opacity-50\"\r\n (click)=\"handleTransfer()\"\r\n >\r\n {{ addFilesLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </upup-source-view-container>\r\n }\r\n `,\r\n})\r\nexport class ServerModeDriveUploaderComponent implements OnInit, OnDestroy {\r\n private store = inject(UpupStore)\r\n readonly svc = inject(ServerModeDriveService)\r\n\r\n @Input({ required: true }) provider!: ServerModeProvider\r\n @Input() onBack: () => void = () => {}\r\n /** data-upup-slot forwarded to SourceViewContainer and DriveAuthFallback. */\r\n @Input() slotName: string = ''\r\n\r\n ngOnInit(): void {\r\n this.svc.init(this.provider)\r\n if (!this.slotName) {\r\n this.slotName = `drive-browser-${this.provider}`\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.svc.destroy()\r\n }\r\n\r\n // ── Bound handlers ────────────────────────────────────────────\r\n\r\n readonly startAuth = (): void => {\r\n this.svc.startAuth()\r\n }\r\n\r\n // ── Computed getters ──────────────────────────────────────────\r\n\r\n get providerLabel(): string {\r\n return PROVIDER_LABEL[this.provider]\r\n }\r\n\r\n get isLoading(): boolean {\r\n const s = this.svc.listState().status\r\n return s === 'loading' || s === 'idle'\r\n }\r\n\r\n get loader(): Type<unknown> {\r\n return this.store.uiProps.icons.LoaderIcon as Type<unknown>\r\n }\r\n\r\n get displayFiles(): ServerDriveFile[] {\r\n const s = this.svc.listState()\r\n return s.status === 'ready' ? s.files : []\r\n }\r\n\r\n get errorMessage(): string {\r\n const s = this.svc.listState()\r\n if (s.status !== 'error') return ''\r\n return s.code\r\n ? this.store.translator(`errors.${errorCodeToMessageKey(s.code)}`, {\r\n code: s.code,\r\n })\r\n : s.message\r\n }\r\n\r\n get addFilesLabel(): string {\r\n if (this.svc.isTransferring()) return 'Uploading…'\r\n const n = this.svc.selected().size\r\n return `Add files${n ? ` (${n})` : ''}`\r\n }\r\n\r\n /** Non-folder file-icon stroke; folder uses a static sky stroke. */\r\n get fileIconStroke(): string {\r\n return this.store.isDark() ? '#94a3b8' : '#64748b'\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────\r\n\r\n get headerClass(): string {\r\n const dark = this.store.isDark()\r\n return 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 }\r\n\r\n get footerClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-items-center upup-justify-between upup-gap-2 upup-border-t upup-p-3',\r\n dark ? 'upup-border-white/[0.06]' : 'upup-border-black/[0.06]',\r\n )\r\n }\r\n\r\n get searchInputClass(): string {\r\n const dark = this.store.isDark()\r\n return 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\r\n get errorClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-p-4 upup-text-sm',\r\n dark ? 'upup-text-red-400' : 'upup-text-red-600',\r\n )\r\n }\r\n\r\n fileItemClass(file: ServerDriveFile): string {\r\n const dark = this.store.isDark()\r\n const isSelected = this.svc.selected().has(file.id)\r\n return cn(\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\r\n // ── Event handlers ────────────────────────────────────────────\r\n\r\n onFileClick(file: ServerDriveFile): void {\r\n if (file.isFolder) {\r\n this.svc.setFolderId(file.id)\r\n void this.svc.list({ folderId: file.id })\r\n } else {\r\n this.svc.toggleSelected(file.id)\r\n }\r\n }\r\n\r\n onSearchInput(ev: Event): void {\r\n this.svc.setSearch((ev.target as HTMLInputElement).value)\r\n }\r\n\r\n onSearchEnter(ev: Event): void {\r\n void this.svc.list({ search: (ev.target as HTMLInputElement).value })\r\n }\r\n\r\n handleTransfer(): void {\r\n void this.svc.transfer()\r\n }\r\n\r\n // ── Helpers ───────────────────────────────────────────────────\r\n\r\n 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}\r\n","import { Component, inject } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { ClientGoogleDriveUploaderComponent } from './client-google-drive-uploader.component'\r\nimport { ServerModeDriveUploaderComponent } from './server-mode-drive-uploader.component'\r\n\r\n/**\r\n * GoogleDriveUploaderComponent — Angular port of GoogleDriveUploader.svelte.\r\n *\r\n * Routes by store.mode:\r\n * 'server' → ServerModeDriveUploaderComponent(provider=\"google-drive\")\r\n * 'client' → ClientGoogleDriveUploaderComponent\r\n *\r\n * Mirrors svelte:\r\n * {#if mode === 'server'}\r\n * <ServerModeDriveUploader provider=\"google-drive\" onBack={...} />\r\n * {:else}\r\n * <ClientGoogleDriveUploader />\r\n * {/if}\r\n */\r\n@Component({\r\n selector: 'upup-google-drive-uploader',\r\n standalone: true,\r\n imports: [\r\n ClientGoogleDriveUploaderComponent,\r\n ServerModeDriveUploaderComponent,\r\n ],\r\n template: `\r\n @if (store.mode === 'server') {\r\n <upup-server-mode-drive-uploader\r\n provider=\"google-drive\"\r\n [onBack]=\"handleBack\"\r\n />\r\n } @else {\r\n <upup-client-google-drive-uploader />\r\n }\r\n `,\r\n})\r\nexport class GoogleDriveUploaderComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n readonly handleBack = (): void => {\r\n this.store.setActiveSource(undefined)\r\n }\r\n}\r\n","import { Injectable, inject, computed, type Signal } from '@angular/core'\r\nimport {\r\n ONE_DRIVE_DESCRIPTOR,\r\n type DriveFile,\r\n type DriveFolder,\r\n} from '@useupup/core'\r\nimport {\r\n DriveBrowserController,\r\n type DriveBrowserState,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore } from '../lib/to-signal-store'\r\n\r\n/**\r\n * Angular port of useOneDrive.ts (svelte composable).\r\n *\r\n * Pure delegation to DriveBrowserController with ONE_DRIVE_DESCRIPTOR (popup auth).\r\n * No business logic lives here — everything flows through the controller.\r\n */\r\n@Injectable()\r\nexport class OneDriveService {\r\n private store = inject(UpupStore)\r\n\r\n private controller = new DriveBrowserController(\r\n this.store.core,\r\n ONE_DRIVE_DESCRIPTOR,\r\n {\r\n onFilesSelected: files => {\r\n void this.store.handleSetSelectedFiles(files)\r\n },\r\n onClose: () => {\r\n this.store.setActiveSource(undefined)\r\n },\r\n },\r\n )\r\n\r\n private signalStore = toSignalStore<DriveBrowserState>(this.controller)\r\n private state: Signal<DriveBrowserState> = this.signalStore.state\r\n\r\n // ── Selector signals ──────────────────────────────────────────\r\n readonly user = computed(() => this.state().user)\r\n readonly oneDriveFiles = computed(() => this.state().folder)\r\n readonly token = computed(() =>\r\n this.state().isAuthenticated ? 'active' : undefined,\r\n )\r\n readonly isAuthenticated = computed(() => this.state().isAuthenticated)\r\n readonly isLoading = computed(() => this.state().isLoading)\r\n readonly path = computed(() => this.state().path)\r\n readonly selectedFiles = computed(() => this.state().selectedFiles)\r\n readonly showLoader = computed(() => this.state().showLoader)\r\n readonly isClickLoading = computed(() => this.state().isClickLoading)\r\n readonly error = computed(() => this.state().error)\r\n readonly hasMore = computed(() => this.state().hasMore)\r\n readonly isLoadingMore = computed(() => this.state().isLoadingMore)\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────\r\n init(): void {\r\n this.controller.init()\r\n }\r\n destroy(): void {\r\n this.signalStore.destroy()\r\n this.controller.destroy()\r\n }\r\n\r\n // ── Forwarding methods ────────────────────────────────────────\r\n signIn(): void {\r\n this.controller.signIn()\r\n }\r\n signOut(): void {\r\n this.controller.signOut()\r\n }\r\n setPath(newPath: DriveFolder[]): void {\r\n this.controller.setPath(newPath)\r\n }\r\n handleClick(file: DriveFile): void {\r\n this.controller.handleClick(file)\r\n }\r\n handleSubmit(): Promise<void> {\r\n return this.controller.handleSubmit()\r\n }\r\n handleCancelDownload(): void {\r\n this.controller.handleCancelDownload()\r\n }\r\n onSelectCurrentFolder(): void {\r\n void this.controller.onSelectCurrentFolder()\r\n }\r\n loadMore(): Promise<void> {\r\n return this.controller.loadMore()\r\n }\r\n}\r\n","import { Component, inject, OnInit, OnDestroy } from '@angular/core'\r\nimport { OneDriveService } from '../services/one-drive.service'\r\nimport { DriveAuthFallbackComponent } from './shared/drive-auth-fallback.component'\r\nimport { DriveBrowserComponent } from './shared/drive-browser.component'\r\n\r\n/**\r\n * Angular port of ClientOneDriveUploader.svelte.\r\n *\r\n * Popup auth: shows fallback when !isAuthenticated && !token && !isLoading.\r\n */\r\n@Component({\r\n selector: 'upup-client-one-drive-uploader',\r\n standalone: true,\r\n providers: [OneDriveService],\r\n imports: [DriveAuthFallbackComponent, DriveBrowserComponent],\r\n template: `\r\n @if (!svc.isAuthenticated() && !svc.token() && !svc.isLoading()) {\r\n <upup-drive-auth-fallback\r\n providerName=\"OneDrive\"\r\n [onRetry]=\"authenticate\"\r\n slotName=\"one-drive-uploader\"\r\n />\r\n } @else {\r\n <upup-drive-browser\r\n [driveFiles]=\"svc.oneDriveFiles\"\r\n [user]=\"svc.user\"\r\n [handleSignOut]=\"handleSignOut\"\r\n slotName=\"one-drive-uploader\"\r\n [path]=\"svc.path\"\r\n [setPath]=\"setPath\"\r\n [isClickLoading]=\"svc.isClickLoading\"\r\n [handleClick]=\"handleClick\"\r\n [selectedFiles]=\"svc.selectedFiles\"\r\n [showLoader]=\"svc.showLoader\"\r\n [handleSubmit]=\"handleSubmit\"\r\n [handleCancelDownload]=\"handleCancelDownload\"\r\n [onSelectCurrentFolder]=\"onSelectCurrentFolder\"\r\n [error]=\"svc.error\"\r\n [hasMore]=\"svc.hasMore\"\r\n [isLoadingMore]=\"svc.isLoadingMore\"\r\n [loadMore]=\"loadMore\"\r\n />\r\n }\r\n `,\r\n})\r\nexport class ClientOneDriveUploaderComponent implements OnInit, OnDestroy {\r\n readonly svc = inject(OneDriveService)\r\n\r\n ngOnInit(): void {\r\n this.svc.init()\r\n }\r\n ngOnDestroy(): void {\r\n this.svc.destroy()\r\n }\r\n\r\n readonly authenticate = (): void => {\r\n this.svc.signIn()\r\n }\r\n readonly handleSignOut = (): void => {\r\n this.svc.signOut()\r\n }\r\n readonly setPath = (\r\n path: Parameters<OneDriveService['setPath']>[0],\r\n ): void => {\r\n this.svc.setPath(path)\r\n }\r\n readonly handleClick = (\r\n file: Parameters<OneDriveService['handleClick']>[0],\r\n ): void => {\r\n this.svc.handleClick(file)\r\n }\r\n readonly handleSubmit = (): Promise<void> => this.svc.handleSubmit()\r\n readonly handleCancelDownload = (): void => {\r\n this.svc.handleCancelDownload()\r\n }\r\n readonly onSelectCurrentFolder = (): void => {\r\n this.svc.onSelectCurrentFolder()\r\n }\r\n readonly loadMore = (): Promise<void> => this.svc.loadMore()\r\n}\r\n","import { Component, inject } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { ClientOneDriveUploaderComponent } from './client-one-drive-uploader.component'\r\nimport { ServerModeDriveUploaderComponent } from './server-mode-drive-uploader.component'\r\n\r\n/**\r\n * OneDriveUploaderComponent — Angular port of OneDriveUploader.svelte.\r\n *\r\n * Routes by store.mode:\r\n * 'server' → ServerModeDriveUploaderComponent(provider=\"one-drive\")\r\n * 'client' → ClientOneDriveUploaderComponent\r\n *\r\n * Mirrors svelte:\r\n * {#if mode === 'server'}\r\n * <ServerModeDriveUploader provider=\"one-drive\" onBack={...} />\r\n * {:else}\r\n * <ClientOneDriveUploader />\r\n * {/if}\r\n */\r\n@Component({\r\n selector: 'upup-one-drive-uploader',\r\n standalone: true,\r\n imports: [\r\n ClientOneDriveUploaderComponent,\r\n ServerModeDriveUploaderComponent,\r\n ],\r\n template: `\r\n @if (store.mode === 'server') {\r\n <upup-server-mode-drive-uploader\r\n provider=\"one-drive\"\r\n [onBack]=\"handleBack\"\r\n />\r\n } @else {\r\n <upup-client-one-drive-uploader />\r\n }\r\n `,\r\n})\r\nexport class OneDriveUploaderComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n readonly handleBack = (): void => {\r\n this.store.setActiveSource(undefined)\r\n }\r\n}\r\n","import { Injectable, inject, computed, type Signal } from '@angular/core'\r\nimport {\r\n DROPBOX_DESCRIPTOR,\r\n type DriveFile,\r\n type DriveFolder,\r\n} from '@useupup/core'\r\nimport {\r\n DriveBrowserController,\r\n type DriveBrowserState,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore } from '../lib/to-signal-store'\r\n\r\n/**\r\n * Angular port of useDropbox.ts (svelte composable).\r\n *\r\n * Pure delegation to DriveBrowserController with DROPBOX_DESCRIPTOR (popup auth).\r\n * No business logic lives here — everything flows through the controller.\r\n */\r\n@Injectable()\r\nexport class DropboxService {\r\n private store = inject(UpupStore)\r\n\r\n private controller = new DriveBrowserController(\r\n this.store.core,\r\n DROPBOX_DESCRIPTOR,\r\n {\r\n onFilesSelected: files => {\r\n void this.store.handleSetSelectedFiles(files)\r\n },\r\n onClose: () => {\r\n this.store.setActiveSource(undefined)\r\n },\r\n },\r\n )\r\n\r\n private signalStore = toSignalStore<DriveBrowserState>(this.controller)\r\n private state: Signal<DriveBrowserState> = this.signalStore.state\r\n\r\n // ── Selector signals ──────────────────────────────────────────\r\n readonly user = computed(() => this.state().user)\r\n readonly dropboxFiles = computed(() => this.state().folder)\r\n readonly token = computed(() =>\r\n this.state().isAuthenticated ? 'active' : undefined,\r\n )\r\n readonly isAuthenticated = computed(() => this.state().isAuthenticated)\r\n readonly isLoading = computed(() => this.state().isLoading)\r\n readonly path = computed(() => this.state().path)\r\n readonly selectedFiles = computed(() => this.state().selectedFiles)\r\n readonly showLoader = computed(() => this.state().showLoader)\r\n readonly isClickLoading = computed(() => this.state().isClickLoading)\r\n readonly error = computed(() => this.state().error)\r\n readonly hasMore = computed(() => this.state().hasMore)\r\n readonly isLoadingMore = computed(() => this.state().isLoadingMore)\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────\r\n init(): void {\r\n this.controller.init()\r\n }\r\n destroy(): void {\r\n this.signalStore.destroy()\r\n this.controller.destroy()\r\n }\r\n\r\n // ── Forwarding methods ────────────────────────────────────────\r\n authenticate(): void {\r\n this.controller.signIn()\r\n }\r\n logout(): void {\r\n this.controller.signOut()\r\n }\r\n setPath(newPath: DriveFolder[]): void {\r\n this.controller.setPath(newPath)\r\n }\r\n handleClick(file: DriveFile): void {\r\n this.controller.handleClick(file)\r\n }\r\n handleSignOut(): void {\r\n this.controller.signOut()\r\n }\r\n handleSubmit(): Promise<void> {\r\n return this.controller.handleSubmit()\r\n }\r\n handleCancelDownload(): void {\r\n this.controller.handleCancelDownload()\r\n }\r\n onSelectCurrentFolder(): void {\r\n void this.controller.onSelectCurrentFolder()\r\n }\r\n loadMore(): Promise<void> {\r\n return this.controller.loadMore()\r\n }\r\n}\r\n","import { Component, inject, OnInit, OnDestroy } from '@angular/core'\r\nimport { DropboxService } from '../services/dropbox.service'\r\nimport { DriveAuthFallbackComponent } from './shared/drive-auth-fallback.component'\r\nimport { DriveBrowserComponent } from './shared/drive-browser.component'\r\n\r\n/**\r\n * Angular port of ClientDropboxUploader.svelte.\r\n *\r\n * Popup auth: shows fallback when !isAuthenticated && !token && !isLoading.\r\n */\r\n@Component({\r\n selector: 'upup-client-dropbox-uploader',\r\n standalone: true,\r\n providers: [DropboxService],\r\n imports: [DriveAuthFallbackComponent, DriveBrowserComponent],\r\n template: `\r\n @if (!svc.isAuthenticated() && !svc.token() && !svc.isLoading()) {\r\n <upup-drive-auth-fallback\r\n providerName=\"Dropbox\"\r\n [onRetry]=\"authenticate\"\r\n slotName=\"dropbox-uploader\"\r\n />\r\n } @else {\r\n <upup-drive-browser\r\n [driveFiles]=\"svc.dropboxFiles\"\r\n [user]=\"svc.user\"\r\n [handleSignOut]=\"handleSignOut\"\r\n slotName=\"dropbox-uploader\"\r\n [path]=\"svc.path\"\r\n [setPath]=\"setPath\"\r\n [isClickLoading]=\"svc.isClickLoading\"\r\n [handleClick]=\"handleClick\"\r\n [selectedFiles]=\"svc.selectedFiles\"\r\n [showLoader]=\"svc.showLoader\"\r\n [handleSubmit]=\"handleSubmit\"\r\n [handleCancelDownload]=\"handleCancelDownload\"\r\n [onSelectCurrentFolder]=\"onSelectCurrentFolder\"\r\n [error]=\"svc.error\"\r\n [hasMore]=\"svc.hasMore\"\r\n [isLoadingMore]=\"svc.isLoadingMore\"\r\n [loadMore]=\"loadMore\"\r\n />\r\n }\r\n `,\r\n})\r\nexport class ClientDropboxUploaderComponent implements OnInit, OnDestroy {\r\n readonly svc = inject(DropboxService)\r\n\r\n ngOnInit(): void {\r\n this.svc.init()\r\n }\r\n ngOnDestroy(): void {\r\n this.svc.destroy()\r\n }\r\n\r\n readonly authenticate = (): void => {\r\n this.svc.authenticate()\r\n }\r\n readonly handleSignOut = (): void => {\r\n this.svc.logout()\r\n }\r\n readonly setPath = (\r\n path: Parameters<DropboxService['setPath']>[0],\r\n ): void => {\r\n this.svc.setPath(path)\r\n }\r\n readonly handleClick = (\r\n file: Parameters<DropboxService['handleClick']>[0],\r\n ): void => {\r\n this.svc.handleClick(file)\r\n }\r\n readonly handleSubmit = (): Promise<void> => this.svc.handleSubmit()\r\n readonly handleCancelDownload = (): void => {\r\n this.svc.handleCancelDownload()\r\n }\r\n readonly onSelectCurrentFolder = (): void => {\r\n this.svc.onSelectCurrentFolder()\r\n }\r\n readonly loadMore = (): Promise<void> => this.svc.loadMore()\r\n}\r\n","import { Component, inject } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { ClientDropboxUploaderComponent } from './client-dropbox-uploader.component'\r\nimport { ServerModeDriveUploaderComponent } from './server-mode-drive-uploader.component'\r\n\r\n/**\r\n * DropboxUploaderComponent — Angular port of DropboxUploader.svelte.\r\n *\r\n * Routes by store.mode:\r\n * 'server' → ServerModeDriveUploaderComponent(provider=\"dropbox\")\r\n * 'client' → ClientDropboxUploaderComponent\r\n *\r\n * Mirrors svelte:\r\n * {#if mode === 'server'}\r\n * <ServerModeDriveUploader provider=\"dropbox\" onBack={...} />\r\n * {:else}\r\n * <ClientDropboxUploader />\r\n * {/if}\r\n */\r\n@Component({\r\n selector: 'upup-dropbox-uploader',\r\n standalone: true,\r\n imports: [ClientDropboxUploaderComponent, ServerModeDriveUploaderComponent],\r\n template: `\r\n @if (store.mode === 'server') {\r\n <upup-server-mode-drive-uploader\r\n provider=\"dropbox\"\r\n [onBack]=\"handleBack\"\r\n />\r\n } @else {\r\n <upup-client-dropbox-uploader />\r\n }\r\n `,\r\n})\r\nexport class DropboxUploaderComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n readonly handleBack = (): void => {\r\n this.store.setActiveSource(undefined)\r\n }\r\n}\r\n","import { Injectable, inject, computed, type Signal } from '@angular/core'\r\nimport { BOX_DESCRIPTOR, type DriveFile, type DriveFolder } from '@useupup/core'\r\nimport {\r\n DriveBrowserController,\r\n type DriveBrowserState,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore } from '../lib/to-signal-store'\r\n\r\n/**\r\n * Angular port of useBox.ts (svelte composable).\r\n *\r\n * Pure delegation to DriveBrowserController with BOX_DESCRIPTOR (popup auth).\r\n * No business logic lives here — everything flows through the controller.\r\n */\r\n@Injectable()\r\nexport class BoxService {\r\n private store = inject(UpupStore)\r\n\r\n private controller = new DriveBrowserController(\r\n this.store.core,\r\n BOX_DESCRIPTOR,\r\n {\r\n onFilesSelected: files => {\r\n void this.store.handleSetSelectedFiles(files)\r\n },\r\n onClose: () => {\r\n this.store.setActiveSource(undefined)\r\n },\r\n },\r\n )\r\n\r\n private signalStore = toSignalStore<DriveBrowserState>(this.controller)\r\n private state: Signal<DriveBrowserState> = this.signalStore.state\r\n\r\n // ── Selector signals ──────────────────────────────────────────\r\n readonly user = computed(() => this.state().user)\r\n readonly boxFiles = computed(() => this.state().folder)\r\n readonly token = computed(() =>\r\n this.state().isAuthenticated ? 'active' : undefined,\r\n )\r\n readonly isAuthenticated = computed(() => this.state().isAuthenticated)\r\n readonly isLoading = computed(() => this.state().isLoading)\r\n readonly path = computed(() => this.state().path)\r\n readonly selectedFiles = computed(() => this.state().selectedFiles)\r\n readonly showLoader = computed(() => this.state().showLoader)\r\n readonly isClickLoading = computed(() => this.state().isClickLoading)\r\n readonly error = computed(() => this.state().error)\r\n readonly hasMore = computed(() => this.state().hasMore)\r\n readonly isLoadingMore = computed(() => this.state().isLoadingMore)\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────\r\n init(): void {\r\n this.controller.init()\r\n }\r\n destroy(): void {\r\n this.signalStore.destroy()\r\n this.controller.destroy()\r\n }\r\n\r\n // ── Forwarding methods ────────────────────────────────────────\r\n authenticate(): void {\r\n this.controller.signIn()\r\n }\r\n logout(): void {\r\n this.controller.signOut()\r\n }\r\n setPath(newPath: DriveFolder[]): void {\r\n this.controller.setPath(newPath)\r\n }\r\n handleClick(file: DriveFile): void {\r\n this.controller.handleClick(file)\r\n }\r\n handleSignOut(): void {\r\n this.controller.signOut()\r\n }\r\n handleSubmit(): Promise<void> {\r\n return this.controller.handleSubmit()\r\n }\r\n handleCancelDownload(): void {\r\n this.controller.handleCancelDownload()\r\n }\r\n onSelectCurrentFolder(): void {\r\n void this.controller.onSelectCurrentFolder()\r\n }\r\n loadMore(): Promise<void> {\r\n return this.controller.loadMore()\r\n }\r\n}\r\n","import { Component, inject, OnInit, OnDestroy } from '@angular/core'\r\nimport { BoxService } from '../services/box.service'\r\nimport { DriveAuthFallbackComponent } from './shared/drive-auth-fallback.component'\r\nimport { DriveBrowserComponent } from './shared/drive-browser.component'\r\n\r\n/**\r\n * Angular port of ClientBoxUploader.svelte.\r\n *\r\n * Popup auth: shows fallback when !isAuthenticated && !token && !isLoading.\r\n */\r\n@Component({\r\n selector: 'upup-client-box-uploader',\r\n standalone: true,\r\n providers: [BoxService],\r\n imports: [DriveAuthFallbackComponent, DriveBrowserComponent],\r\n template: `\r\n @if (!svc.isAuthenticated() && !svc.token() && !svc.isLoading()) {\r\n <upup-drive-auth-fallback\r\n providerName=\"Box\"\r\n [onRetry]=\"authenticate\"\r\n slotName=\"box-uploader\"\r\n />\r\n } @else {\r\n <upup-drive-browser\r\n [driveFiles]=\"svc.boxFiles\"\r\n [user]=\"svc.user\"\r\n [handleSignOut]=\"handleSignOut\"\r\n slotName=\"box-uploader\"\r\n [path]=\"svc.path\"\r\n [setPath]=\"setPath\"\r\n [isClickLoading]=\"svc.isClickLoading\"\r\n [handleClick]=\"handleClick\"\r\n [selectedFiles]=\"svc.selectedFiles\"\r\n [showLoader]=\"svc.showLoader\"\r\n [handleSubmit]=\"handleSubmit\"\r\n [handleCancelDownload]=\"handleCancelDownload\"\r\n [onSelectCurrentFolder]=\"onSelectCurrentFolder\"\r\n [error]=\"svc.error\"\r\n [hasMore]=\"svc.hasMore\"\r\n [isLoadingMore]=\"svc.isLoadingMore\"\r\n [loadMore]=\"loadMore\"\r\n />\r\n }\r\n `,\r\n})\r\nexport class ClientBoxUploaderComponent implements OnInit, OnDestroy {\r\n readonly svc = inject(BoxService)\r\n\r\n ngOnInit(): void {\r\n this.svc.init()\r\n }\r\n ngOnDestroy(): void {\r\n this.svc.destroy()\r\n }\r\n\r\n readonly authenticate = (): void => {\r\n this.svc.authenticate()\r\n }\r\n readonly handleSignOut = (): void => {\r\n this.svc.logout()\r\n }\r\n readonly setPath = (path: Parameters<BoxService['setPath']>[0]): void => {\r\n this.svc.setPath(path)\r\n }\r\n readonly handleClick = (\r\n file: Parameters<BoxService['handleClick']>[0],\r\n ): void => {\r\n this.svc.handleClick(file)\r\n }\r\n readonly handleSubmit = (): Promise<void> => this.svc.handleSubmit()\r\n readonly handleCancelDownload = (): void => {\r\n this.svc.handleCancelDownload()\r\n }\r\n readonly onSelectCurrentFolder = (): void => {\r\n this.svc.onSelectCurrentFolder()\r\n }\r\n readonly loadMore = (): Promise<void> => this.svc.loadMore()\r\n}\r\n","import { Component, inject } from '@angular/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { ClientBoxUploaderComponent } from './client-box-uploader.component'\r\nimport { ServerModeDriveUploaderComponent } from './server-mode-drive-uploader.component'\r\n\r\n/**\r\n * BoxUploaderComponent — Angular port of BoxUploader.svelte.\r\n *\r\n * Routes by store.mode:\r\n * 'server' → ServerModeDriveUploaderComponent(provider=\"box\")\r\n * 'client' → ClientBoxUploaderComponent\r\n *\r\n * Mirrors svelte:\r\n * {#if mode === 'server'}\r\n * <ServerModeDriveUploader provider=\"box\" onBack={...} />\r\n * {:else}\r\n * <ClientBoxUploader />\r\n * {/if}\r\n */\r\n@Component({\r\n selector: 'upup-box-uploader',\r\n standalone: true,\r\n imports: [ClientBoxUploaderComponent, ServerModeDriveUploaderComponent],\r\n template: `\r\n @if (store.mode === 'server') {\r\n <upup-server-mode-drive-uploader\r\n provider=\"box\"\r\n [onBack]=\"handleBack\"\r\n />\r\n } @else {\r\n <upup-client-box-uploader />\r\n }\r\n `,\r\n})\r\nexport class BoxUploaderComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n readonly handleBack = (): void => {\r\n this.store.setActiveSource(undefined)\r\n }\r\n}\r\n","import { Component } from '@angular/core'\r\n\r\n/**\r\n * ImageEditorStubComponent — Angular port of ImageEditorStub.svelte.\r\n *\r\n * The image editor is not supported in Angular (React-only feature).\r\n * This stub renders nothing, mirroring the svelte stub which is an empty\r\n * template with only a comment:\r\n * <!-- Image editor is not supported in Svelte. Use @useupup/react if image editing is required. -->\r\n */\r\n@Component({\r\n selector: 'upup-image-editor-stub',\r\n standalone: true,\r\n template: `<!-- Image editor is not supported in Angular. Use @useupup/react if image editing is required. -->`,\r\n})\r\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class -- Angular requires a class as the component host; this is an intentional no-op stub\r\nexport class ImageEditorStubComponent {}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-icon-loader',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"loader\" [class]=\"className\" />`,\r\n})\r\nexport class LoaderIconComponent {\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component } from '@angular/core'\r\nimport { LoaderIconComponent } from './loader-icon.component'\r\n\r\n@Component({\r\n selector: 'upup-default-loader-icon',\r\n standalone: true,\r\n imports: [LoaderIconComponent],\r\n template: `\r\n <upup-icon-loader\r\n class=\"upup-animate-spin upup-text-3xl upup-text-[#6D6D6D]\"\r\n />\r\n `,\r\n})\r\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class -- Angular requires a class as the component host; behavior lives in the template\r\nexport class DefaultLoaderIconComponent {}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-icon-upload',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"upload\" [size]=\"size\" [class]=\"className\" />`,\r\n})\r\nexport class UploadIconComponent {\r\n @Input() size: number = 24\r\n @Input('class') className: string = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-player-play-filled-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"player-play\" [size]=\"size\" />`,\r\n})\r\nexport class PlayerPlayFilledIconComponent {\r\n @Input() size: number = 24\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-player-pause-filled-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"player-pause\" [size]=\"size\" />`,\r\n})\r\nexport class PlayerPauseFilledIconComponent {\r\n @Input() size: number = 24\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-x-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"x\" [size]=\"size\" />`,\r\n})\r\nexport class XIconComponent {\r\n @Input() size: number = 24\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-icon-layout-grid',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"layout-grid\" [size]=\"size\" />`,\r\n})\r\nexport class LayoutGridIconComponent {\r\n @Input() size: number = 24\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-icon-layout-list',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"layout-list\" [size]=\"size\" />`,\r\n})\r\nexport class LayoutListIconComponent {\r\n @Input() size: number = 24\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-icon-my-device',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"my-device\" [class]=\"className\" />`,\r\n})\r\nexport class MyDeviceIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-box-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"box\" [class]=\"className\" />`,\r\n})\r\nexport class BoxIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-dropbox-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"dropbox\" [class]=\"className\" />`,\r\n})\r\nexport class DropboxIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-google-drive-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"google-drive\" [class]=\"className\" />`,\r\n})\r\nexport class GoogleDriveIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-one-drive-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"one-drive\" [class]=\"className\" />`,\r\n})\r\nexport class OneDriveIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-link-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"link\" [class]=\"className\" />`,\r\n})\r\nexport class LinkIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-camera-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"camera\" [class]=\"className\" />`,\r\n})\r\nexport class CameraIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-audio-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"audio\" [class]=\"className\" />`,\r\n})\r\nexport class AudioIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { IconComponent } from '../icon.component'\r\n\r\n@Component({\r\n selector: 'upup-screen-capture-icon',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `<upup-icon name=\"screen-capture\" [class]=\"className\" />`,\r\n})\r\nexport class ScreenCaptureIconComponent {\r\n @Input('class') className = ''\r\n}\r\n","import { Component, ElementRef, ViewChild, inject } from '@angular/core'\r\nimport { cn, sourceNameKeys } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { SourceViewHeaderExtraService } from '../context/source-view-header-extra.service'\r\nimport { UrlUploaderComponent } from './url-uploader.component'\r\nimport { CameraUploaderComponent } from './camera-uploader.component'\r\nimport { AudioUploaderComponent } from './audio-uploader.component'\r\nimport { ScreenCaptureUploaderComponent } from './screen-capture-uploader.component'\r\nimport { GoogleDriveUploaderComponent } from './google-drive-uploader.component'\r\nimport { OneDriveUploaderComponent } from './one-drive-uploader.component'\r\nimport { DropboxUploaderComponent } from './dropbox-uploader.component'\r\nimport { BoxUploaderComponent } from './box-uploader.component'\r\nimport { ImageEditorStubComponent } from './image-editor-stub.component'\r\nimport {\r\n GoogleDriveIconComponent,\r\n OneDriveIconComponent,\r\n DropboxIconComponent,\r\n BoxIconComponent,\r\n LinkIconComponent,\r\n CameraIconComponent,\r\n AudioIconComponent,\r\n ScreenCaptureIconComponent,\r\n} from './icons'\r\nimport { DefaultLoaderIconComponent } from './icons'\r\nimport { NgComponentOutlet } from '@angular/common'\r\n\r\n/**\r\n * SourceView — Angular port of SourceView.svelte.\r\n *\r\n * Renders the active source's view when store.activeSource() is set and\r\n * store.uiProps.mini is false. Mirrors svelte's shouldRender check:\r\n * shouldRender = !!activeComponent && !mini && !!activeSource && !!SourceIcon\r\n *\r\n * Active-source switch map:\r\n * url → UrlUploaderComponent\r\n * camera → CameraUploaderComponent\r\n * microphone → AudioUploaderComponent\r\n * screen → ScreenCaptureUploaderComponent\r\n * googleDrive → GoogleDriveUploaderComponent (client/server wrapper)\r\n * oneDrive → OneDriveUploaderComponent (client/server wrapper)\r\n * dropbox → DropboxUploaderComponent (client/server wrapper)\r\n * box → BoxUploaderComponent (client/server wrapper)\r\n *\r\n * The image editor stub is shown when store.editingFile() is set.\r\n *\r\n * data-upup-slot=\"source-view\" is on the outer div (parity with svelte).\r\n */\r\n@Component({\r\n selector: 'upup-source-view',\r\n standalone: true,\r\n imports: [\r\n NgComponentOutlet,\r\n UrlUploaderComponent,\r\n CameraUploaderComponent,\r\n AudioUploaderComponent,\r\n ScreenCaptureUploaderComponent,\r\n GoogleDriveUploaderComponent,\r\n OneDriveUploaderComponent,\r\n DropboxUploaderComponent,\r\n BoxUploaderComponent,\r\n ImageEditorStubComponent,\r\n GoogleDriveIconComponent,\r\n OneDriveIconComponent,\r\n DropboxIconComponent,\r\n BoxIconComponent,\r\n LinkIconComponent,\r\n CameraIconComponent,\r\n AudioIconComponent,\r\n ScreenCaptureIconComponent,\r\n DefaultLoaderIconComponent,\r\n ],\r\n template: `\r\n @if (shouldRender) {\r\n <div\r\n class=\"upup-animate-fx-view upup-grid upup-h-full upup-w-full upup-grid-rows-[auto,1fr]\"\r\n data-upup-slot=\"source-view\"\r\n >\r\n <!-- Transparent header on the panel gradient (no inner box): the\r\n provider icon + name fill the row; \"Back\" returns to sources. -->\r\n <div [class]=\"headerClass\">\r\n <span class=\"upup-flex upup-items-center upup-gap-2\">\r\n @switch (store.activeSource()) {\r\n @case ('googleDrive') {\r\n <upup-google-drive-icon />\r\n }\r\n @case ('oneDrive') {\r\n <upup-one-drive-icon />\r\n }\r\n @case ('dropbox') {\r\n <upup-dropbox-icon />\r\n }\r\n @case ('box') {\r\n <upup-box-icon />\r\n }\r\n @case ('url') {\r\n <upup-link-icon />\r\n }\r\n @case ('camera') {\r\n <upup-camera-icon />\r\n }\r\n @case ('microphone') {\r\n <upup-audio-icon />\r\n }\r\n @case ('screen') {\r\n <upup-screen-capture-icon />\r\n }\r\n @default {}\r\n }\r\n <span>{{ sourceName }}</span>\r\n </span>\r\n <span class=\"upup-flex upup-items-center upup-gap-2.5\">\r\n <!-- Portal host for a source view's header extras (drive\r\n avatar + log out); lives left of Back. empty:hidden\r\n keeps the flex gap from showing when nothing portals\r\n in. -->\r\n <span\r\n #headerExtraHost\r\n data-upup-slot=\"source-view-header-extra\"\r\n class=\"upup-flex upup-items-center upup-gap-2.5 empty:upup-hidden\"\r\n ></span>\r\n <button\r\n [class]=\"cancelBtnClass\"\r\n (click)=\"handleCancel()\"\r\n type=\"button\"\r\n >\r\n {{ store.translations().overlayBack }}\r\n </button>\r\n </span>\r\n </div>\r\n\r\n <!-- Content row: the active source component -->\r\n <div class=\"upup-overflow-hidden\">\r\n @switch (store.activeSource()) {\r\n @case ('url') {\r\n <upup-url-uploader />\r\n }\r\n @case ('camera') {\r\n <upup-camera-uploader />\r\n }\r\n @case ('microphone') {\r\n <upup-audio-uploader />\r\n }\r\n @case ('screen') {\r\n <upup-screen-capture-uploader />\r\n }\r\n @case ('googleDrive') {\r\n <upup-google-drive-uploader />\r\n }\r\n @case ('oneDrive') {\r\n <upup-one-drive-uploader />\r\n }\r\n @case ('dropbox') {\r\n <upup-dropbox-uploader />\r\n }\r\n @case ('box') {\r\n <upup-box-uploader />\r\n }\r\n @default {\r\n <div\r\n class=\"upup-flex upup-h-full upup-items-center upup-justify-center\"\r\n >\r\n <upup-default-loader-icon />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (store.editingFile()) {\r\n <upup-image-editor-stub />\r\n }\r\n `,\r\n})\r\nexport class SourceViewComponent {\r\n readonly store = inject(UpupStore)\r\n // Optional: the host provider lives at the <upup-uploader> level in the real\r\n // app; isolated component tests may mount SourceView without it. Mirrors\r\n // svelte's `useSourceViewHeaderExtra() ?? …` graceful fallback.\r\n private readonly headerExtra = inject(SourceViewHeaderExtraService, {\r\n optional: true,\r\n })\r\n\r\n /**\r\n * Expose the header-extra host span to the service as it enters/leaves the\r\n * `@if (shouldRender)` block. The drive browser header portals its account\r\n * controls (avatar + log out + separator) into it. Angular has no\r\n * <Teleport>, so the shared host element + appendChild in the consumer is\r\n * the framework idiom mirroring React's SourceViewHeaderExtraContext /\r\n * Svelte's context store + portal action.\r\n */\r\n @ViewChild('headerExtraHost')\r\n set headerExtraHost(ref: ElementRef<HTMLElement> | undefined) {\r\n this.headerExtra?.setHost(ref?.nativeElement ?? null)\r\n }\r\n\r\n /** Mirror svelte: shouldRender = !!activeComponent && !mini && !!activeSource */\r\n get shouldRender(): boolean {\r\n const active = this.store.activeSource()\r\n const mini = this.store.uiProps.mini\r\n return !!active && !mini\r\n }\r\n\r\n /** Provider display name shown next to the icon in the transparent header. */\r\n get sourceName(): string {\r\n const active = this.store.activeSource()\r\n if (!active) return ''\r\n const translations = this.store.translations() as Record<string, string>\r\n const nameKey = sourceNameKeys[active]\r\n return translations[nameKey] ?? nameKey ?? ''\r\n }\r\n\r\n get headerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-flex upup-items-center upup-justify-between upup-gap-2 upup-px-3 upup-py-2 upup-text-sm upup-font-medium',\r\n dark ? 'upup-text-[#FAFAFA]' : 'upup-text-[#0f172a]',\r\n slotClasses.sourceViewHeader ?? '',\r\n )\r\n }\r\n\r\n get cancelBtnClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-rounded-md upup-p-1 upup-text-[#0284c7] upup-transition-all upup-duration-300',\r\n dark ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]' : '',\r\n slotClasses.sourceViewCancelButton ?? '',\r\n )\r\n }\r\n\r\n handleCancel(): void {\r\n const active = this.store.activeSource()\r\n this.store.core?.emit('source-view-cancel', { sourceId: active })\r\n this.store.setActiveSource(undefined)\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core'\r\nimport {\r\n FileSource,\r\n formatUiMessage as t,\r\n pluralUiMessage as plural,\r\n type IconName,\r\n} from '@useupup/core'\r\nimport { cn, sourceNameKeys } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { IconComponent } from './icon.component'\r\n\r\n/**\r\n * SourceSelector — port of SourceSelector. Centered idle surface: a prompt line\r\n * (drop-here / browse / optional select-a-folder / import-from), a capped-width\r\n * chip grid (one chip per configured source), and an iconified limits caption.\r\n * The add-more sheet supplies its own chrome, so this no longer swaps in a\r\n * header bar. No hint animations.\r\n *\r\n * Source chip testids: upup-source-<id>. Chip + caption icons are registry\r\n * glyphs rendered directly via <upup-icon>.\r\n */\r\n\r\nconst SOURCE_ICON_NAME: Record<FileSource, IconName> = {\r\n [FileSource.LOCAL]: 'my-device',\r\n [FileSource.GOOGLE_DRIVE]: 'google-drive',\r\n [FileSource.ONE_DRIVE]: 'one-drive',\r\n [FileSource.DROPBOX]: 'dropbox',\r\n [FileSource.BOX]: 'box',\r\n [FileSource.URL]: 'link',\r\n [FileSource.CAMERA]: 'camera',\r\n [FileSource.MICROPHONE]: 'audio',\r\n [FileSource.SCREEN]: 'screen-capture',\r\n}\r\n\r\n// Canonical chip order (mirrors React's uploadSourceObject value order), filtered\r\n// by the configured sources — NOT the sources-array order.\r\nconst SOURCE_ORDER: FileSource[] = [\r\n FileSource.LOCAL,\r\n FileSource.GOOGLE_DRIVE,\r\n FileSource.ONE_DRIVE,\r\n FileSource.DROPBOX,\r\n FileSource.BOX,\r\n FileSource.URL,\r\n FileSource.CAMERA,\r\n FileSource.MICROPHONE,\r\n FileSource.SCREEN,\r\n]\r\n\r\ninterface SourceEntry {\r\n id: FileSource\r\n name: string\r\n iconName: IconName\r\n}\r\n\r\n// Regular chips fit at most 4 per row inside the max-w-[420px] grid, so up to 8\r\n// sources wrap into balanced rows; 9 would wrap 4/4/1. Past this count the chips\r\n// switch to the compact size, which fits 5 per row (5/4).\r\nconst COMPACT_SOURCE_THRESHOLD = 8\r\n\r\n@Component({\r\n selector: 'upup-source-selector',\r\n standalone: true,\r\n imports: [IconComponent],\r\n template: `\r\n <div\r\n data-testid=\"upup-source-selector\"\r\n data-upup-slot=\"source-selector\"\r\n class=\"upup-animate-fx-view upup-relative upup-flex upup-h-full upup-flex-col upup-items-center upup-justify-center upup-gap-6 upup-rounded-lg upup-px-4 upup-py-6\"\r\n >\r\n @if (!store.uiProps.mini) {\r\n <div [class]=\"promptClass\">\r\n <span>{{ store.translations().dropFilesHere }}</span>\r\n <button\r\n type=\"button\"\r\n data-testid=\"upup-browse-files\"\r\n [class]=\"linkButtonClass\"\r\n (click)=\"handleBrowseFilesClick()\"\r\n >\r\n {{ store.translations().browseFiles }}\r\n </button>\r\n @if (store.uiProps.folderPickerButtonVisible) {\r\n <span>{{ store.translations().or }}</span>\r\n <button\r\n type=\"button\"\r\n [class]=\"linkButtonClass\"\r\n (click)=\"handleSelectFolderClick()\"\r\n >\r\n {{ store.translations().selectAFolder }}\r\n </button>\r\n }\r\n <span>{{ store.translations().orImportFrom }}</span>\r\n </div>\r\n <div [class]=\"chipsListClass\">\r\n @for (source of chosenSources; track source.id) {\r\n <button\r\n type=\"button\"\r\n [attr.data-testid]=\"'upup-source-' + source.id\"\r\n [class]=\"chipClass\"\r\n (click)=\"handleSourceClick(source.id)\"\r\n >\r\n <span [class]=\"chipIconBoxClass\">\r\n <upup-icon\r\n [name]=\"source.iconName\"\r\n [class]=\"chipIconClass\"\r\n />\r\n </span>\r\n <span [class]=\"chipLabelClass\">{{\r\n source.name\r\n }}</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @if (store.uiProps.mini) {\r\n <button\r\n type=\"button\"\r\n (click)=\"handleBrowseFilesClick()\"\r\n class=\"upup-flex upup-cursor-pointer upup-flex-col upup-items-center upup-justify-center upup-gap-2 upup-rounded-lg upup-p-2\"\r\n >\r\n <upup-icon\r\n name=\"upload\"\r\n [size]=\"32\"\r\n [class]=\"miniIconClass\"\r\n />\r\n <p [class]=\"miniTextClass\">Drag or browse to upload</p>\r\n </button>\r\n } @else if (hasLimitsCaption) {\r\n <div\r\n data-upup-slot=\"limits-caption\"\r\n [class]=\"limitsCaptionClass\"\r\n >\r\n @if (typeConstraint) {\r\n <span>{{ typeConstraint }}</span>\r\n }\r\n @if (typeConstraint && (showFilesLimit || showSizeLimit)) {\r\n <span aria-hidden=\"true\">&middot;</span>\r\n }\r\n @if (showFilesLimit) {\r\n <span\r\n class=\"upup-inline-flex upup-items-center upup-gap-1.5\"\r\n >\r\n <span aria-hidden=\"true\" class=\"upup-inline-flex\">\r\n <upup-icon\r\n name=\"stacked-files\"\r\n [class]=\"'upup-h-4 upup-w-4'\"\r\n />\r\n </span>\r\n {{ filesMaxText }}\r\n </span>\r\n }\r\n @if (showFilesLimit && showSizeLimit) {\r\n <span aria-hidden=\"true\">&middot;</span>\r\n }\r\n @if (showSizeLimit) {\r\n <span\r\n class=\"upup-inline-flex upup-items-center upup-gap-1.5\"\r\n >\r\n <span aria-hidden=\"true\" class=\"upup-inline-flex\">\r\n <upup-icon\r\n name=\"storage\"\r\n [class]=\"'upup-h-4 upup-w-4'\"\r\n />\r\n </span>\r\n {{ sizeEachText }}\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class SourceSelectorComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n get chosenSources(): SourceEntry[] {\r\n const translations = this.store.translations() as Record<string, string>\r\n const sources = this.store.uiProps.sources\r\n return SOURCE_ORDER.filter(id => sources.includes(id)).map(id => {\r\n const nameKey = sourceNameKeys[id]\r\n return {\r\n id,\r\n name: translations[nameKey] ?? nameKey,\r\n iconName: SOURCE_ICON_NAME[id],\r\n }\r\n })\r\n }\r\n\r\n private get compact(): boolean {\r\n return this.chosenSources.length > COMPACT_SOURCE_THRESHOLD\r\n }\r\n\r\n // ── Limits caption ──────────────────────────────────────────────────────────\r\n\r\n get typeConstraint(): string | null {\r\n const allowed = this.store.uiProps.allowedFileTypes\r\n if (!allowed || allowed === '*/*' || allowed === '*') return null\r\n const humanized = allowed\r\n .split(',')\r\n .map(s => s.trim())\r\n .map(m => {\r\n if (m.startsWith('.')) return m\r\n const [type, sub] = m.split('/')\r\n if (!type || !sub) return m\r\n if (sub === '*')\r\n return type.charAt(0).toUpperCase() + type.slice(1) + 's'\r\n return sub.toUpperCase()\r\n })\r\n .join(', ')\r\n return humanized + ' only'\r\n }\r\n\r\n get showFilesLimit(): boolean {\r\n return this.store.uiProps.limit > 1\r\n }\r\n\r\n get showSizeLimit(): boolean {\r\n const m = this.store.uiProps.maxFileSize\r\n return !!(m?.size && m?.unit)\r\n }\r\n\r\n get hasLimitsCaption(): boolean {\r\n return (\r\n !!this.typeConstraint || this.showFilesLimit || this.showSizeLimit\r\n )\r\n }\r\n\r\n get filesMaxText(): string {\r\n const tr = this.store.translations()\r\n const limit = this.store.uiProps.limit\r\n return t(plural(tr, 'filesMax', limit), { count: limit })\r\n }\r\n\r\n get sizeEachText(): string {\r\n const tr = this.store.translations()\r\n const m = this.store.uiProps.maxFileSize\r\n return t(tr.sizeEach, { size: m?.size ?? 0, unit: m?.unit ?? '' })\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────────────────\r\n\r\n get promptClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-flex-wrap upup-items-center upup-justify-center upup-gap-x-1.5 upup-gap-y-1 upup-px-2 upup-text-center upup-text-base upup-font-medium md:upup-text-lg',\r\n dark\r\n ? 'upup-text-[#e2e8f0] dark:upup-text-[#e2e8f0]'\r\n : 'upup-text-[#242634]',\r\n )\r\n }\r\n\r\n get linkButtonClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-cursor-pointer upup-rounded upup-font-semibold focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8]',\r\n dark\r\n ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]'\r\n : 'upup-text-[#0284c7]',\r\n )\r\n }\r\n\r\n get chipsListClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n this.compact\r\n ? 'upup-flex upup-max-w-[420px] upup-flex-wrap upup-items-start upup-justify-center upup-gap-x-3 upup-gap-y-4'\r\n : 'upup-flex upup-max-w-[420px] upup-flex-wrap upup-items-start upup-justify-center upup-gap-x-6 upup-gap-y-5',\r\n slotClasses.sourceButtonList ?? '',\r\n )\r\n }\r\n\r\n get chipClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n this.compact\r\n ? 'upup-fx-hover-lift upup-fx-press upup-fx-icon-nudge upup-group upup-flex upup-w-[62px] upup-cursor-pointer upup-flex-col upup-items-center upup-gap-[7px] upup-rounded-[12px] focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8] hover:upup-shadow-none'\r\n : 'upup-fx-hover-lift upup-fx-press upup-fx-icon-nudge upup-group upup-flex upup-w-[66px] upup-cursor-pointer upup-flex-col upup-items-center upup-gap-[9px] upup-rounded-[14px] focus-visible:upup-outline-none focus-visible:upup-ring-2 focus-visible:upup-ring-[#38bdf8] hover:upup-shadow-none',\r\n slotClasses.sourceButton ?? '',\r\n )\r\n }\r\n\r\n get chipIconBoxClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n this.compact\r\n ? 'upup-flex upup-h-[42px] upup-w-[42px] upup-items-center upup-justify-center upup-rounded-[12px] upup-ring-1 upup-transition-colors'\r\n : 'upup-flex upup-h-[52px] upup-w-[52px] upup-items-center upup-justify-center upup-rounded-[14px] upup-ring-1 upup-transition-colors',\r\n dark\r\n ? 'upup-bg-white/[0.055] upup-ring-white/[0.06] group-hover:upup-bg-white/[0.09] dark:upup-bg-white/[0.055] dark:upup-ring-white/[0.06]'\r\n : 'upup-bg-white upup-ring-black/[0.07] group-hover:upup-bg-slate-50',\r\n )\r\n }\r\n\r\n get chipIconClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n this.compact ? 'upup-h-8 upup-w-8' : 'upup-h-10 upup-w-10',\r\n slotClasses.sourceButtonIcon ?? '',\r\n )\r\n }\r\n\r\n get chipLabelClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-text-xs upup-leading-none',\r\n dark\r\n ? 'upup-text-[#94a3b8] dark:upup-text-[#94a3b8]'\r\n : 'upup-text-[#6D6D6D]',\r\n slotClasses.sourceButtonText ?? '',\r\n )\r\n }\r\n\r\n get miniIconClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-h-16 upup-w-16 md:upup-h-20 md:upup-w-20',\r\n dark\r\n ? 'upup-text-white dark:upup-text-white'\r\n : 'upup-text-[#0B0B0B]',\r\n )\r\n }\r\n\r\n get miniTextClass(): string {\r\n const dark = this.store.isDark()\r\n return cn('px-6 upup-text-center upup-text-xs', {\r\n 'upup-text-[#6D6D6D] dark:upup-text-gray-400': !dark,\r\n 'upup-text-gray-400 dark:upup-text-gray-500': dark,\r\n })\r\n }\r\n\r\n get limitsCaptionClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-flex-wrap upup-items-center upup-justify-center upup-gap-x-2.5 upup-gap-y-1 upup-px-3 upup-text-center upup-text-xs',\r\n dark\r\n ? 'upup-text-[#94a3b8] dark:upup-text-[#94a3b8]'\r\n : 'upup-text-[#6D6D6D]',\r\n )\r\n }\r\n\r\n // ── Handlers ──────────────────────────────────────────────────────────────\r\n\r\n handleSourceClick(sourceId: FileSource): void {\r\n this.store.uiProps.onIntegrationClick(sourceId)\r\n this.store.core.emit('source-click', { sourceId })\r\n if (sourceId === FileSource.LOCAL) {\r\n this.store.openFilePicker()\r\n } else {\r\n this.store.setActiveSource(sourceId)\r\n }\r\n }\r\n\r\n handleBrowseFilesClick(): void {\r\n const el = this.store.getFileInput()\r\n if (el) {\r\n el.removeAttribute('webkitdirectory')\r\n el.removeAttribute('directory')\r\n }\r\n this.store.openFilePicker()\r\n this.store.core.emit('browse-files', {})\r\n }\r\n\r\n async handleSelectFolderClick(): Promise<void> {\r\n const fsWindow = window as Window & {\r\n showDirectoryPicker?: () => Promise<FileSystemDirectoryHandle>\r\n }\r\n if (fsWindow.showDirectoryPicker) {\r\n try {\r\n const directoryHandle = await fsWindow.showDirectoryPicker()\r\n const collectedFiles: File[] = []\r\n\r\n type IterableDirHandle = {\r\n values(): AsyncIterableIterator<\r\n FileSystemHandle & {\r\n kind: string\r\n getFile: () => Promise<File>\r\n }\r\n >\r\n }\r\n async function getFiles(\r\n dirHandle: IterableDirHandle,\r\n path = '',\r\n ): Promise<void> {\r\n for await (const entry of dirHandle.values()) {\r\n const newPath = path\r\n ? `${path}/${entry.name}`\r\n : entry.name\r\n if (entry.kind === 'file') {\r\n const pickedFile = await entry.getFile()\r\n const file = new File(\r\n [await pickedFile.arrayBuffer()],\r\n pickedFile.name,\r\n {\r\n type: pickedFile.type,\r\n lastModified: pickedFile.lastModified,\r\n },\r\n )\r\n try {\r\n Object.defineProperty(\r\n file,\r\n 'webkitRelativePath',\r\n {\r\n value: newPath,\r\n configurable: true,\r\n writable: true,\r\n },\r\n )\r\n Object.defineProperty(file, 'relativePath', {\r\n value: newPath,\r\n configurable: true,\r\n writable: true,\r\n })\r\n } catch {\r\n // upup-catch: defineProperty can fail on exotic\r\n // File objects — fall back to plain assignment\r\n // for relativePath\r\n Object.assign(file, { relativePath: newPath })\r\n }\r\n collectedFiles.push(file)\r\n } else if (entry.kind === 'directory') {\r\n await getFiles(\r\n entry as unknown as IterableDirHandle,\r\n newPath,\r\n )\r\n }\r\n }\r\n }\r\n await getFiles(directoryHandle as unknown as IterableDirHandle)\r\n if (collectedFiles.length > 0) {\r\n void this.store.handleSetSelectedFiles(collectedFiles)\r\n this.store.core.emit('folder-select', {\r\n count: collectedFiles.length,\r\n })\r\n const el = this.store.getFileInput()\r\n if (el) el.value = ''\r\n }\r\n } catch (error) {\r\n const name = error instanceof DOMException ? error.name : ''\r\n if (name !== 'AbortError') throw error\r\n }\r\n } else {\r\n const el = this.store.getFileInput()\r\n if (el) {\r\n el.setAttribute('webkitdirectory', 'true')\r\n el.setAttribute('directory', 'true')\r\n }\r\n this.store.openFilePicker()\r\n this.store.core.emit('folder-select', { count: 0 })\r\n }\r\n }\r\n}\r\n","import { Component, Input, inject, type Type } from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { formatUiMessage as t, pluralUiMessage as plural } from '@useupup/core'\r\nimport { isUploadActive, cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { IconComponent } from './icon.component'\r\n\r\n/**\r\n * Header bar for the file-list screen — port of shared/UploaderHeader.\r\n *\r\n * Renders the remove-all button, the file-count label, a two-segment grid|list\r\n * view toggle (aria-pressed; active segment shows its i18n label at md+), and a\r\n * dashed add-more button that opens the source overlay. Hidden entirely in mini\r\n * mode. `forcedList` hides the toggle when the tiles no longer fit one row;\r\n * `hideAddMore` suppresses the add-more control in quiet-completion mode.\r\n */\r\n@Component({\r\n selector: 'upup-uploader-header',\r\n standalone: true,\r\n imports: [NgComponentOutlet, IconComponent],\r\n template: `\r\n @if (!store.uiProps.mini) {\r\n <div\r\n data-testid=\"upup-header\"\r\n data-upup-slot=\"header\"\r\n [class]=\"headerClass\"\r\n >\r\n <button\r\n [class]=\"cancelButtonClass\"\r\n (click)=\"handleCancel()\"\r\n [disabled]=\"isUploading || store.uiProps.isProcessing\"\r\n >\r\n {{ store.translations().removeAllFiles }}\r\n </button>\r\n <span [class]=\"labelClass\">{{ fileCountText }}</span>\r\n <div\r\n 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\"\r\n >\r\n @if (store.files().size > 1 && !forcedList) {\r\n <div\r\n role=\"group\"\r\n [attr.aria-label]=\"\r\n store.translations().switchToGridView\r\n \"\r\n data-upup-slot=\"view-toggle\"\r\n [class]=\"toggleGroupClass\"\r\n >\r\n <button\r\n data-testid=\"upup-view-toggle-grid\"\r\n [attr.aria-label]=\"\r\n store.translations().switchToGridView\r\n \"\r\n [attr.aria-pressed]=\"\r\n store.viewMode() === 'grid'\r\n \"\r\n [title]=\"store.translations().switchToGridView\"\r\n [class]=\"gridToggleClass\"\r\n (click)=\"store.setViewMode('grid')\"\r\n >\r\n <upup-icon name=\"layout-grid\" [size]=\"15\" />\r\n @if (store.viewMode() === 'grid') {\r\n <span\r\n class=\"upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline\"\r\n >{{\r\n store.translations().viewGrid\r\n }}</span\r\n >\r\n }\r\n </button>\r\n <button\r\n data-testid=\"upup-view-toggle-list\"\r\n [attr.aria-label]=\"\r\n store.translations().switchToListView\r\n \"\r\n [attr.aria-pressed]=\"\r\n store.viewMode() === 'list'\r\n \"\r\n [title]=\"store.translations().switchToListView\"\r\n [class]=\"listToggleClass\"\r\n (click)=\"store.setViewMode('list')\"\r\n >\r\n <upup-icon name=\"layout-list\" [size]=\"15\" />\r\n @if (store.viewMode() === 'list') {\r\n <span\r\n class=\"upup-hidden upup-text-xs upup-font-medium upup-leading-none md:upup-inline\"\r\n >{{\r\n store.translations().viewList\r\n }}</span\r\n >\r\n }\r\n </button>\r\n </div>\r\n }\r\n @if (\r\n store.uiProps.limit > 1 &&\r\n !isLimitReached &&\r\n !hideAddMore\r\n ) {\r\n <button\r\n data-testid=\"upup-add-more\"\r\n data-placement=\"header\"\r\n data-upup-slot=\"add-more\"\r\n [class]=\"addMoreButtonClass\"\r\n (click)=\"store.openSourceOverlay()\"\r\n [disabled]=\"\r\n isUploading || store.uiProps.isProcessing\r\n \"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"containerAddMoreIcon\"\r\n />\r\n {{ store.translations().addMore }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n `,\r\n})\r\nexport class UploaderHeaderComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n /** Passed by the parent (FileList) — called on the remove-all button click. */\r\n @Input() handleCancel: () => void = () => {}\r\n /** True when the panel forces the row list (tiles don't fit one row) — the\r\n * grid/list toggle is hidden in that state. */\r\n @Input() forcedList = false\r\n /** True in quiet-completion mode after success — hides the add-more control. */\r\n @Input() hideAddMore = false\r\n\r\n get isUploading(): boolean {\r\n return isUploadActive(this.store.uploadStatus())\r\n }\r\n\r\n get isLimitReached(): boolean {\r\n return this.store.uiProps.limit === this.store.files().size\r\n }\r\n\r\n get fileCountText(): string {\r\n const tr = this.store.translations()\r\n const count = this.store.files().size\r\n return t(plural(tr, 'filesSelected', count), { count })\r\n }\r\n\r\n get containerAddMoreIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.ContainerAddMoreIcon as Type<unknown>\r\n }\r\n\r\n get headerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n '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',\r\n { 'upup-bg-white/5 dark:upup-bg-white/5': dark },\r\n slotClasses.containerHeader ?? '',\r\n )\r\n }\r\n\r\n get cancelButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n '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',\r\n { 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': dark },\r\n slotClasses.containerCancelButton ?? '',\r\n )\r\n }\r\n\r\n get labelClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-col-span-4 upup-text-center upup-text-sm upup-text-[#6D6D6D] md:upup-col-span-2',\r\n { 'upup-text-gray-300 dark:upup-text-gray-300': dark },\r\n )\r\n }\r\n\r\n get toggleGroupClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-items-center upup-gap-0.5 upup-rounded-lg upup-p-0.5',\r\n dark ? 'upup-bg-white/[0.06]' : 'upup-bg-black/[0.05]',\r\n )\r\n }\r\n\r\n private segmentClass(active: boolean): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-h-6 upup-items-center upup-justify-center upup-gap-1 upup-rounded-md upup-px-1.5 upup-transition-colors',\r\n active\r\n ? 'upup-bg-[#0ea5e9] upup-text-white'\r\n : dark\r\n ? 'upup-text-gray-300 hover:upup-bg-white/10'\r\n : 'upup-text-gray-500 hover:upup-bg-black/10',\r\n )\r\n }\r\n\r\n get gridToggleClass(): string {\r\n return this.segmentClass(this.store.viewMode() === 'grid')\r\n }\r\n\r\n get listToggleClass(): string {\r\n return this.segmentClass(this.store.viewMode() === 'list')\r\n }\r\n\r\n get addMoreButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n '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]',\r\n { 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]': dark },\r\n slotClasses.containerAddMoreButton ?? '',\r\n )\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { isUploadActive, cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\n\r\n/**\r\n * Progress bar — port of shared/ProgressBar.\r\n *\r\n * The `className` positioning classes land on the INNER container div via the\r\n * @Input (never `class=` on the host), so the transparent `<upup-progress-bar>`\r\n * host is unwrapped by the parity normalizer and the DOM matches React's div\r\n * (F-712). At idle (no progress, not uploading) shouldShow is false, so the host\r\n * renders empty and contributes nothing — matching React's `null` return.\r\n *\r\n * Reads: store.uploadStatus(), store.isDark(), store.slotOverrides(), store.slots(),\r\n * store.translations() (aria-label).\r\n */\r\n@Component({\r\n selector: 'upup-progress-bar',\r\n standalone: true,\r\n template: `\r\n @if (shouldShow) {\r\n <div\r\n data-testid=\"upup-progress-bar\"\r\n data-upup-slot=\"progress-bar\"\r\n role=\"progressbar\"\r\n [attr.aria-valuenow]=\"progress\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"100\"\r\n [attr.aria-label]=\"store.translations().uploadProgress\"\r\n [class]=\"containerClass\"\r\n >\r\n <div [class]=\"trackClass\">\r\n <div [style.width.%]=\"progress\" [class]=\"fillClass\"></div>\r\n @if (isUploadActive(store.uploadStatus())) {\r\n <div\r\n aria-hidden=\"true\"\r\n class=\"upup-animate-fx-sheen upup-pointer-events-none upup-absolute upup-inset-y-0 upup-left-0 upup-w-2/5\"\r\n style=\"background: linear-gradient(90deg, transparent, rgba(255,255,255,0.45), transparent)\"\r\n ></div>\r\n }\r\n </div>\r\n @if (showValue) {\r\n <p [class]=\"textClass\">{{ progress }}%</p>\r\n }\r\n </div>\r\n }\r\n `,\r\n})\r\nexport class ProgressBarComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n @Input() progress: number = 0\r\n @Input() showValue: boolean = false\r\n @Input() progressBarClassName: string = ''\r\n @Input() className: string = ''\r\n\r\n readonly isUploadActive = isUploadActive\r\n\r\n get shouldShow(): boolean {\r\n return !!this.progress || isUploadActive(this.store.uploadStatus())\r\n }\r\n\r\n get containerClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-flex upup-items-center upup-gap-2',\r\n this.className,\r\n slotClasses.progressBarContainer ?? '',\r\n themeSlots.progressBar?.root ?? '',\r\n )\r\n }\r\n\r\n get trackClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-relative upup-h-[6px] upup-flex-1 upup-overflow-hidden upup-rounded-[4px]',\r\n dark ? 'upup-bg-white/[0.12]' : 'upup-bg-[#F5F5F5]',\r\n this.progressBarClassName,\r\n slotClasses.progressBar ?? '',\r\n themeSlots.progressBar?.track ?? '',\r\n )\r\n }\r\n\r\n get fillClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-fx-progress-fill upup-fx-essential upup-h-full',\r\n dark ? 'upup-bg-[#38bdf8]' : 'upup-bg-[#0ea5e9]',\r\n slotClasses.progressBarInner ?? '',\r\n themeSlots.progressBar?.fill ?? '',\r\n )\r\n }\r\n\r\n get textClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-text-xs upup-font-semibold',\r\n dark ? 'upup-text-white' : '',\r\n slotClasses.progressBarText ?? '',\r\n themeSlots.progressBar?.text ?? '',\r\n )\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { fileTypeIconName, type IconName } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { FileIconSvgComponent } from './icons/file-icon-svg.component'\r\n\r\n@Component({\r\n selector: 'upup-file-icon',\r\n standalone: true,\r\n imports: [FileIconSvgComponent],\r\n template: `\r\n <span\r\n class=\"upup-inline-flex\"\r\n data-testid=\"upup-file-icon\"\r\n data-upup-slot=\"file-icon\"\r\n >\r\n <upup-file-icon-svg [name]=\"iconName\" [class]=\"iconClass\" />\r\n </span>\r\n `,\r\n})\r\nexport class FileIconComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n @Input() extension: string = ''\r\n @Input('class') extraClass: string = ''\r\n\r\n get iconName(): IconName {\r\n return fileTypeIconName(this.extension)\r\n }\r\n\r\n get iconClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-text-5xl upup-text-[#0284c7]',\r\n this.extraClass,\r\n dark ? 'upup-text-[#38bdf8] dark:upup-text-[#38bdf8]' : '',\r\n )\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, inject } from '@angular/core'\r\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser'\r\nimport {\r\n fileGetExtension,\r\n fileGetIsPdf,\r\n fileGetIsText,\r\n fileIs3D,\r\n cn,\r\n} from '@useupup/core/internal'\r\nimport type { Translations } from '@useupup/core'\r\nimport type { InternalFlatClassNames } from '@useupup/core/internal'\r\nimport { FileIconComponent } from './file-icon.component'\r\n\r\n/**\r\n * FilePreviewThumbnail — port of FilePreviewThumbnail.svelte.\r\n *\r\n * Decides whether to show a static icon (PDF / 3D / oversized text) or an\r\n * <object> preview element. Emits (updateCanPreview) when the object loads.\r\n *\r\n * Svelte original:\r\n * {#if isPdf || is3D || isOversizedText()} → static icon\r\n * {:else}\r\n * {#if !canPreview} → hidden <object> + icon\r\n * {#if canPreview} → icon (hidden on md if allowPreview) + visible <object>\r\n */\r\n@Component({\r\n selector: 'upup-file-preview-thumbnail',\r\n standalone: true,\r\n imports: [FileIconComponent],\r\n template: `\r\n @if (isStaticIcon) {\r\n <!-- PDFs, 3D files, and text → static icon -->\r\n <div class=\"upup-flex upup-flex-col upup-items-center upup-gap-2\">\r\n <upup-file-icon\r\n [extension]=\"extension\"\r\n [class]=\"slotClasses.fileIcon\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Hidden object probe: fires (load) to signal canPreview=true -->\r\n @if (!canPreview) {\r\n <object\r\n [data]=\"safeFileUrl\"\r\n width=\"0%\"\r\n height=\"0%\"\r\n [name]=\"fileName\"\r\n [title]=\"fileName\"\r\n [type]=\"fileType\"\r\n (load)=\"onObjectLoad()\"\r\n >\r\n <p>{{ labels.loading }}</p>\r\n </object>\r\n <upup-file-icon [extension]=\"extension\" />\r\n }\r\n\r\n @if (canPreview) {\r\n <upup-file-icon\r\n [extension]=\"extension\"\r\n [class]=\"iconWhenCanPreviewClass\"\r\n />\r\n <div [class]=\"objectWrapperClass\">\r\n <object\r\n [data]=\"safeFileUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n [name]=\"fileName\"\r\n [title]=\"fileName\"\r\n [type]=\"fileType\"\r\n class=\"upup-absolute upup-h-full upup-w-full\"\r\n >\r\n <p>{{ labels.loading }}</p>\r\n </object>\r\n </div>\r\n }\r\n }\r\n `,\r\n})\r\nexport class FilePreviewThumbnailComponent {\r\n private sanitizer = inject(DomSanitizer)\r\n\r\n @Input() canPreview: boolean = false\r\n @Input() fileType: string = ''\r\n @Input() fileName: string = ''\r\n @Input() fileUrl: string = ''\r\n @Input() fileSize?: number\r\n @Input() slotClasses: InternalFlatClassNames = {}\r\n @Input() allowPreview: boolean = false\r\n @Input() labels: Translations = {} as Translations\r\n\r\n @Output() updateCanPreview = new EventEmitter<boolean>()\r\n\r\n get safeFileUrl(): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(this.fileUrl)\r\n }\r\n\r\n // ── Derived getters ────────────────────────────────────────────────────────\r\n\r\n get extension(): string {\r\n return fileGetExtension(this.fileType, this.fileName)\r\n }\r\n\r\n get is3D(): boolean {\r\n return fileIs3D(this.extension.toLowerCase())\r\n }\r\n\r\n get isPdf(): boolean {\r\n return fileGetIsPdf(this.fileType, this.fileName)\r\n }\r\n\r\n // Text files render as a static doc icon (cross-framework parity).\r\n get isText(): boolean {\r\n return fileGetIsText(this.fileType, this.fileName)\r\n }\r\n\r\n get isStaticIcon(): boolean {\r\n return this.isPdf || this.is3D || this.isText\r\n }\r\n\r\n get iconWhenCanPreviewClass(): string {\r\n return cn(\r\n this.allowPreview ? 'md:upup-hidden' : '',\r\n this.slotClasses.fileIcon,\r\n )\r\n }\r\n\r\n get objectWrapperClass(): string {\r\n return cn(\r\n `upup-relative upup-hidden upup-h-full upup-w-full ${this.allowPreview ? 'md:upup-block' : ''}`,\r\n )\r\n }\r\n\r\n onObjectLoad(): void {\r\n this.updateCanPreview.emit(true)\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core'\r\nimport { cn } from '@useupup/core/internal'\r\n\r\n/**\r\n * Completion checkmark (port of shared/FileSuccessCheck): a sky ring with a tick\r\n * that DRAWS in and a wrapper that POPS, shown when a file reaches\r\n * UploadStatus.SUCCESSFUL. Hosts (FilePreview tile, FileRow, FileHero) gate it\r\n * on status; the fx classes render UNCONDITIONALLY — the shared CSS\r\n * `data-motion=\"off\"` kill rule is the one gate, so under motion-off the mark\r\n * simply appears drawn. aria-hidden: completion is conveyed textually by the\r\n * file list's live region + the upload announcement.\r\n */\r\n@Component({\r\n selector: 'upup-file-success-check',\r\n standalone: true,\r\n template: `\r\n <span\r\n data-upup-slot=\"file-success\"\r\n aria-hidden=\"true\"\r\n [class]=\"spanClass\"\r\n [style.animation-delay]=\"delay\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n [attr.width]=\"size\"\r\n [attr.height]=\"size\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"11\"\r\n stroke=\"#38bdf8\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M7 12.5l3.2 3.2L17 8.8\"\r\n stroke=\"#38bdf8\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n pathLength=\"24\"\r\n stroke-dasharray=\"24\"\r\n class=\"upup-animate-fx-draw\"\r\n [style.animation-delay]=\"delay\"\r\n />\r\n </svg>\r\n </span>\r\n `,\r\n})\r\nexport class FileSuccessCheckComponent {\r\n /** Position in the sorted list — drives the draw/pop stagger (capped at 8). */\r\n @Input() index = 0\r\n /** Host-supplied positioning classes (absolute placement on tiles/hero). */\r\n @Input() className = ''\r\n @Input() size = 22\r\n\r\n get delay(): string {\r\n return `${Math.min(this.index, 8) * 40}ms`\r\n }\r\n\r\n get spanClass(): string {\r\n return cn('upup-animate-fx-pop upup-inline-flex', this.className)\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n inject,\r\n OnChanges,\r\n SimpleChanges,\r\n type Type,\r\n} from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { DomSanitizer, type SafeStyle } from '@angular/platform-browser'\r\nimport { UploadStatus, type Translations } from '@useupup/core'\r\nimport {\r\n fileCanPreviewText,\r\n fileGetIsImage,\r\n fileGetIsPdf,\r\n fileGetIsText,\r\n cn,\r\n isFileRemovalLocked,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { ProgressBarComponent } from './progress-bar.component'\r\nimport { FilePreviewThumbnailComponent } from './file-preview-thumbnail.component'\r\nimport { FileSuccessCheckComponent } from './shared/file-success-check.component'\r\n\r\n/**\r\n * FilePreview — port of FilePreview. Grid-mode tile: thumbnail (image bg / video\r\n * first-frame / non-media doc icon), delete + completion overlays, progress bar,\r\n * name/size, and a click-to-preview button. No edit affordance (the image editor\r\n * is react/preact-only).\r\n *\r\n * data-testid=\"upup-file-preview\" / data-upup-slot=\"file-preview\" preserved.\r\n */\r\n@Component({\r\n selector: 'upup-file-preview',\r\n standalone: true,\r\n imports: [\r\n ProgressBarComponent,\r\n FilePreviewThumbnailComponent,\r\n FileSuccessCheckComponent,\r\n NgComponentOutlet,\r\n ],\r\n template: `\r\n <div\r\n [class]=\"rootClass\"\r\n data-testid=\"upup-file-preview\"\r\n data-upup-slot=\"file-preview\"\r\n >\r\n <div [class]=\"thumbnailWrapperClass\" [style]=\"thumbnailBgStyle\">\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"fileName\"\r\n class=\"upup-absolute upup-inset-0 upup-z-0 upup-cursor-pointer\"\r\n (click)=\"onclick.emit($event)\"\r\n ></button>\r\n\r\n @if (isVideo) {\r\n <video\r\n [src]=\"fileUrl\"\r\n muted\r\n playsinline\r\n preload=\"metadata\"\r\n class=\"upup-pointer-events-none upup-absolute upup-inset-0 upup-h-full upup-w-full upup-object-cover\"\r\n ></video>\r\n }\r\n @if (!isImage && !isVideo) {\r\n <div\r\n class=\"upup-flex upup-h-full upup-items-center upup-justify-center upup-p-6\"\r\n >\r\n <upup-file-preview-thumbnail\r\n [canPreview]=\"canPreview\"\r\n [fileType]=\"fileType\"\r\n [fileName]=\"fileName\"\r\n [fileUrl]=\"fileUrl\"\r\n [fileSize]=\"fileSize\"\r\n [slotClasses]=\"store.slotOverrides()\"\r\n [allowPreview]=\"store.uiProps.allowPreview\"\r\n [labels]=\"translations\"\r\n (updateCanPreview)=\"onUpdateCanPreview($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (!isSuccessful) {\r\n <button\r\n [class]=\"deleteButtonClass\"\r\n (click)=\"onHandleFileRemove($event)\"\r\n type=\"button\"\r\n [disabled]=\"isRemovalLocked\"\r\n [attr.aria-label]=\"translations.removeFile\"\r\n data-testid=\"upup-file-remove\"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"fileDeleteIcon\"\r\n [ngComponentOutletInputs]=\"deleteIconInputs\"\r\n />\r\n </button>\r\n }\r\n\r\n @if (isSuccessful) {\r\n <upup-file-success-check\r\n [index]=\"index\"\r\n [size]=\"20\"\r\n className=\"upup-absolute upup-left-1.5 upup-top-1.5 upup-z-10\"\r\n />\r\n }\r\n\r\n <upup-progress-bar\r\n [className]=\"'upup-absolute upup-bottom-0 upup-left-0 upup-right-0'\"\r\n progressBarClassName=\"upup-rounded-t-none upup-rounded-b-md\"\r\n [progress]=\"progress\"\r\n />\r\n </div>\r\n\r\n <div class=\"upup-mt-1 upup-px-0.5\">\r\n <div [class]=\"nameClass\">{{ fileName }}</div>\r\n <div [class]=\"sizeClass\">{{ formattedSize }}</div>\r\n\r\n @if (store.uiProps.allowPreview && canPreview) {\r\n <button\r\n type=\"button\"\r\n [class]=\"previewButtonClass\"\r\n (click)=\"onRequestPreview.emit()\"\r\n >\r\n {{ translations.clickToPreview }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class FilePreviewComponent implements OnChanges {\r\n readonly store = inject(UpupStore)\r\n private sanitizer = inject(DomSanitizer)\r\n\r\n @Input() fileName: string = ''\r\n @Input() fileType: string = ''\r\n @Input() fileId: string = ''\r\n @Input() fileUrl: string = ''\r\n @Input() fileSize?: number\r\n @Input() canPreview: boolean = false\r\n @Input() index = 0\r\n\r\n @Output() onRequestPreview = new EventEmitter<void>()\r\n @Output() updateCanPreview = new EventEmitter<boolean>()\r\n @Output() onclick = new EventEmitter<MouseEvent>()\r\n\r\n readonly deleteIconInputs = { class: 'upup-h-5 upup-w-5' }\r\n\r\n get translations(): Translations {\r\n return this.store.translations()\r\n }\r\n\r\n get isImage(): boolean {\r\n return fileGetIsImage(this.fileType)\r\n }\r\n\r\n get isVideo(): boolean {\r\n return this.fileType.startsWith('video/')\r\n }\r\n\r\n get isPdf(): boolean {\r\n return fileGetIsPdf(this.fileType, this.fileName)\r\n }\r\n\r\n get isText(): boolean {\r\n return fileGetIsText(this.fileType, this.fileName)\r\n }\r\n\r\n get canPreviewText(): boolean {\r\n return fileCanPreviewText(this.fileType, this.fileName, this.fileSize)\r\n }\r\n\r\n get fileStatus(): UploadStatus | undefined {\r\n return this.store.files().get(this.fileId)?.status\r\n }\r\n\r\n get isSuccessful(): boolean {\r\n return this.fileStatus === UploadStatus.SUCCESSFUL\r\n }\r\n\r\n get isRemovalLocked(): boolean {\r\n return isFileRemovalLocked(\r\n this.progress,\r\n this.fileStatus ?? UploadStatus.IDLE,\r\n )\r\n }\r\n\r\n get progress(): number {\r\n const p = this.store.filesProgressMap()[this.fileId]\r\n const loaded = p?.loaded ?? NaN\r\n const total = p?.total ?? NaN\r\n const pct = Math.floor((loaded / total) * 100)\r\n return Number.isFinite(pct) ? pct : 0\r\n }\r\n\r\n get fileDeleteIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.FileDeleteIcon as Type<unknown>\r\n }\r\n\r\n get rootClass(): string {\r\n const themeSlots = this.store.slots()\r\n return cn('upup-block upup-w-full', themeSlots.filePreview?.root ?? '')\r\n }\r\n\r\n get thumbnailWrapperClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n const filesSize = this.store.files().size\r\n return cn(\r\n 'upup-fx-hover-lift upup-relative upup-h-[160px] upup-w-full upup-overflow-hidden upup-rounded-xl upup-ring-1',\r\n 'upup-bg-contain upup-bg-center upup-bg-no-repeat',\r\n dark\r\n ? 'upup-bg-white/[0.055] upup-ring-white/[0.08]'\r\n : 'upup-bg-black/[0.04] upup-ring-black/[0.06]',\r\n {\r\n [slotClasses.fileThumbnailMultiple ?? '']:\r\n !!slotClasses.fileThumbnailMultiple && filesSize > 1,\r\n [slotClasses.fileThumbnailSingle ?? '']:\r\n !!slotClasses.fileThumbnailSingle && filesSize === 1,\r\n },\r\n themeSlots.filePreview?.thumbnail ?? '',\r\n )\r\n }\r\n\r\n get deleteButtonClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-fx-remove upup-fx-press upup-absolute upup-right-1.5 upup-top-1.5 upup-z-10',\r\n 'upup-flex upup-h-[30px] upup-w-[30px] upup-items-center upup-justify-center',\r\n 'upup-rounded-[8px] upup-bg-[#04080f]/40 upup-text-[#e2e8f0]',\r\n 'hover:upup-bg-[#04080f]/65',\r\n 'disabled:upup-cursor-not-allowed disabled:upup-opacity-50',\r\n slotClasses.fileDeleteButton ?? '',\r\n themeSlots.filePreview?.deleteButton ?? '',\r\n )\r\n }\r\n\r\n get nameClass(): string {\r\n const dark = this.store.isDark()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-truncate upup-text-[13px] upup-font-normal upup-leading-tight upup-text-gray-900',\r\n dark ? 'upup-text-white' : '',\r\n themeSlots.filePreview?.name ?? '',\r\n )\r\n }\r\n\r\n get sizeClass(): string {\r\n const dark = this.store.isDark()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-mt-0.5 upup-text-[11px] upup-leading-tight upup-text-gray-500',\r\n dark ? 'upup-text-gray-400' : '',\r\n themeSlots.filePreview?.size ?? '',\r\n )\r\n }\r\n\r\n get previewButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-mt-1 upup-text-[11px] upup-font-normal upup-leading-tight upup-text-[#0284c7] upup-transition-all hover:upup-text-[#0284c7] hover:upup-underline',\r\n dark ? 'upup-text-[#38bdf8] hover:upup-text-[#7dd3fc]' : '',\r\n themeSlots.filePreview?.previewButton ?? '',\r\n )\r\n }\r\n\r\n get formattedSize(): string {\r\n const tr = this.translations\r\n const bytes = this.fileSize\r\n if (!bytes || bytes === 0) return tr.zeroBytes\r\n const k = 1024\r\n const sizes = [tr.bytes, tr.kb, tr.mb, tr.gb]\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return `${Math.round((bytes / Math.pow(k, i)) * 10) / 10} ${sizes[i]}`\r\n }\r\n\r\n get thumbnailBgStyle(): SafeStyle | null {\r\n if (!this.isImage) return null\r\n return this.sanitizer.bypassSecurityTrustStyle(\r\n `background-image: url(${this.fileUrl})`,\r\n )\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['fileType'] || changes['fileName'] || changes['fileSize']) {\r\n this.checkAndSignalCanPreview()\r\n }\r\n }\r\n\r\n private checkAndSignalCanPreview(): void {\r\n const should =\r\n this.isImage || this.isPdf || (this.isText && this.canPreviewText)\r\n if (should && !this.canPreview) {\r\n queueMicrotask(() => {\r\n this.updateCanPreview.emit(true)\r\n })\r\n }\r\n }\r\n\r\n onUpdateCanPreview(val: boolean): void {\r\n this.updateCanPreview.emit(val)\r\n }\r\n\r\n onHandleFileRemove(e: MouseEvent): void {\r\n e.stopPropagation()\r\n this.store.handleFileRemove(this.fileId)\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n inject,\r\n OnInit,\r\n OnDestroy,\r\n} from '@angular/core'\r\nimport {\r\n DomSanitizer,\r\n type SafeResourceUrl,\r\n type SafeUrl,\r\n} from '@angular/platform-browser'\r\nimport { type Translations } from '@useupup/core'\r\nimport {\r\n fileGetIsImage,\r\n fileGetIsPdf,\r\n fileGetIsText,\r\n cn,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\n\r\nconst TEXT_PREVIEW_MAX_BYTES = 1024 * 1024 // 1 MB cap — mirrors svelte portal\r\n\r\n/**\r\n * FilePreviewPortal — port of FilePreviewPortal.svelte.\r\n *\r\n * Svelte renders this into document.body via a portal action.\r\n * Here we use a fixed full-viewport overlay div toggled with @if — no CDK needed.\r\n * The `upup-scope` wrapper + `data-upup-slot=\"file-preview-portal\"` testid are preserved.\r\n *\r\n * Backdrop click → onClose; Escape key → onClose; content click stops propagation.\r\n * Handles text loading/error/truncation (mirrors svelte portal).\r\n */\r\n@Component({\r\n selector: 'upup-file-preview-portal',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <!-- Fixed full-viewport overlay (portal equivalent) -->\r\n <div class=\"upup-scope\" data-upup-slot=\"file-preview-portal\">\r\n <div\r\n class=\"upup-fixed upup-inset-0 upup-z-[2147483647] upup-flex upup-items-center upup-justify-center upup-bg-black/40\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"fileName\"\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"onBackdropClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n >\r\n <div class=\"upup-relative upup-h-[90vh] upup-w-[90vw] upup-p-4\">\r\n <div\r\n [class]=\"innerClass\"\r\n role=\"presentation\"\r\n (click)=\"onContentClick($event)\"\r\n >\r\n <!-- Close button -->\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"translations.cancel\"\r\n class=\"upup-absolute upup-right-3 upup-top-3 upup-z-10 upup-flex upup-size-8 upup-items-center upup-justify-center upup-rounded-full upup-bg-black/70 upup-text-sm upup-font-semibold upup-text-white upup-shadow-sm hover:upup-bg-black focus:upup-outline-none focus:upup-ring-2 focus:upup-ring-white\"\r\n (click)=\"onClose.emit()\"\r\n >\r\n x\r\n </button>\r\n\r\n <!-- Image preview -->\r\n @if (isImage) {\r\n <img\r\n [src]=\"safeImgUrl\"\r\n [alt]=\"fileName\"\r\n class=\"upup-h-full upup-w-full upup-rounded upup-object-contain\"\r\n />\r\n }\r\n\r\n <!-- PDF preview -->\r\n @if (isPdf) {\r\n <embed\r\n [src]=\"safeResourceUrl\"\r\n type=\"application/pdf\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n class=\"upup-rounded\"\r\n [title]=\"fileName\"\r\n />\r\n }\r\n\r\n <!-- Text / other preview -->\r\n @if (!isImage && !isPdf) {\r\n @if (isText) {\r\n <div\r\n class=\"upup-h-full upup-w-full upup-overflow-auto upup-p-4 upup-font-mono upup-text-xs\"\r\n >\r\n @if (textLoading) {\r\n <p>{{ translations.loading }}</p>\r\n }\r\n @if (textError) {\r\n <p>\r\n {{ translations.previewError }}\r\n {{ textError }}\r\n </p>\r\n }\r\n @if (!textLoading && !textError) {\r\n <pre class=\"upup-whitespace-pre-wrap\">{{\r\n textContent\r\n }}</pre>\r\n @if (isTruncated) {\r\n <div\r\n class=\"upup-mt-4 upup-rounded upup-border upup-border-yellow-500/30 upup-bg-yellow-500/10 upup-px-3 upup-py-2 upup-text-xs upup-text-yellow-400\"\r\n >\r\n Content truncated - file is too\r\n large to preview in full.\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Native <object> fallback for svg/video/audio/etc. -->\r\n @if (!isText) {\r\n <object\r\n [data]=\"safeResourceUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n [name]=\"fileName\"\r\n [title]=\"fileName\"\r\n [type]=\"fileType\"\r\n >\r\n <p>{{ translations.loading }}</p>\r\n </object>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class FilePreviewPortalComponent implements OnInit, OnDestroy {\r\n readonly store = inject(UpupStore)\r\n private sanitizer = inject(DomSanitizer)\r\n\r\n @Input() fileType: string = ''\r\n @Input() fileUrl: string = ''\r\n @Input() fileName: string = ''\r\n @Input() fileSize?: number\r\n\r\n get safeImgUrl(): SafeUrl {\r\n return this.sanitizer.bypassSecurityTrustUrl(this.fileUrl)\r\n }\r\n\r\n get safeResourceUrl(): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(this.fileUrl)\r\n }\r\n\r\n @Output() onClose = new EventEmitter<void>()\r\n @Output() onStopPropagation = new EventEmitter<MouseEvent>()\r\n\r\n // ── text preview state ────────────────────────────────────────────────────\r\n textLoading = false\r\n textError = ''\r\n textContent = ''\r\n isTruncated = false\r\n\r\n // ── derived getters ───────────────────────────────────────────────────────\r\n\r\n get translations(): Translations {\r\n return this.store.translations()\r\n }\r\n\r\n get isImage(): boolean {\r\n return fileGetIsImage(this.fileType)\r\n }\r\n\r\n get isPdf(): boolean {\r\n return fileGetIsPdf(this.fileType, this.fileName)\r\n }\r\n\r\n get isText(): boolean {\r\n return fileGetIsText(this.fileType, this.fileName)\r\n }\r\n\r\n get isDark(): boolean {\r\n return this.store.isDark()\r\n }\r\n\r\n get innerClass(): string {\r\n const dark = this.isDark\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-absolute upup-inset-0 upup-m-4 upup-bg-white',\r\n dark ? 'upup-bg-[#232323] dark:upup-bg-[#232323]' : '',\r\n slotClasses.filePreviewPortal ?? '',\r\n )\r\n }\r\n\r\n // ── lifecycle ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Bound on `window`, not just the dialog div: the modal is opened by a click\r\n * outside the portal subtree and never calls .focus(), so a listener scoped\r\n * to the dialog element would never receive the key (F-605). Mirrors the\r\n * react/vue/svelte canon (FilePreviewPortal.tsx).\r\n */\r\n private readonly handleKeyDown = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') this.onClose.emit()\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.isText) {\r\n void this.loadTextContent()\r\n }\r\n window.addEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n // ── event handlers ────────────────────────────────────────────────────────\r\n\r\n onBackdropClick(_e: MouseEvent): void {\r\n this.onClose.emit()\r\n }\r\n\r\n onContentClick(e: MouseEvent): void {\r\n e.stopPropagation()\r\n }\r\n\r\n onKeyDown(e: KeyboardEvent): void {\r\n if (e.key === 'Escape') this.onClose.emit()\r\n }\r\n\r\n // ── text loading ──────────────────────────────────────────────────────────\r\n\r\n private async loadTextContent(): Promise<void> {\r\n if (!this.fileUrl) return\r\n this.textLoading = true\r\n this.textError = ''\r\n try {\r\n const response = await fetch(this.fileUrl)\r\n if (!response.ok) throw new Error(`HTTP ${response.status}`)\r\n const blob = await response.blob()\r\n let text: string\r\n if (blob.size > TEXT_PREVIEW_MAX_BYTES) {\r\n const slice = blob.slice(0, TEXT_PREVIEW_MAX_BYTES)\r\n text = await slice.text()\r\n this.isTruncated = true\r\n } else {\r\n text = await blob.text()\r\n this.isTruncated = false\r\n }\r\n this.textContent = text\r\n } catch (err) {\r\n // upup-catch: text-preview fetch/read failure is surfaced to the user via textError, which the portal template renders\r\n this.textError = err instanceof Error ? err.message : String(err)\r\n } finally {\r\n this.textLoading = false\r\n }\r\n }\r\n}\r\n","import { Component, Input, inject, type Type } from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { DomSanitizer, type SafeStyle } from '@angular/platform-browser'\r\nimport {\r\n UploadStatus,\r\n fileTypeIconName,\r\n type IconName,\r\n type UploadFile,\r\n type Translations,\r\n} from '@useupup/core'\r\nimport {\r\n cn,\r\n fileGetIsImage,\r\n fileGetExtension,\r\n isFileRemovalLocked,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { IconComponent } from './icon.component'\r\nimport { ProgressBarComponent } from './progress-bar.component'\r\nimport { FileSuccessCheckComponent } from './shared/file-success-check.component'\r\n\r\nconst ARCHIVE_EXTENSIONS = new Set([\r\n 'zip',\r\n 'rar',\r\n '7z',\r\n 'tar',\r\n 'gz',\r\n 'bz2',\r\n 'xz',\r\n])\r\n\r\ninterface NonMediaThumb {\r\n gradient: string\r\n icon: IconName | 'audio'\r\n}\r\n\r\n/**\r\n * Compact list-mode row (port of FileRow): a horizontal card — thumbnail ·\r\n * name/size · remove. Real image/video first-frame thumbs; colored non-media\r\n * type tiles via the core fileTypeIconName registry. No edit affordance (the\r\n * image editor is react/preact-only).\r\n */\r\n@Component({\r\n selector: 'upup-file-row',\r\n standalone: true,\r\n imports: [\r\n NgComponentOutlet,\r\n IconComponent,\r\n ProgressBarComponent,\r\n FileSuccessCheckComponent,\r\n ],\r\n template: `\r\n <div [class]=\"rowClass\">\r\n <div\r\n class=\"upup-relative upup-flex upup-h-10 upup-w-10 upup-flex-none upup-items-center upup-justify-center upup-overflow-hidden upup-rounded-[9px] upup-bg-center upup-bg-cover upup-bg-no-repeat\"\r\n [style]=\"thumbStyle\"\r\n >\r\n @if (isVideo) {\r\n <video\r\n [src]=\"file.url ?? ''\"\r\n muted\r\n playsinline\r\n preload=\"metadata\"\r\n class=\"upup-pointer-events-none upup-absolute upup-inset-0 upup-h-full upup-w-full upup-object-cover\"\r\n ></video>\r\n }\r\n @if (!isImage && !isVideo) {\r\n <upup-icon\r\n [name]=\"thumb.icon\"\r\n [size]=\"20\"\r\n [class]=\"'upup-text-white'\"\r\n />\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"upup-flex upup-min-w-0 upup-flex-1 upup-flex-col upup-gap-0.5\"\r\n >\r\n <div [class]=\"nameClass\">{{ file.name }}</div>\r\n <div [class]=\"sizeClass\">{{ formattedSize }}</div>\r\n @if (!!progress) {\r\n <upup-progress-bar\r\n className=\"upup-mt-1\"\r\n progressBarClassName=\"upup-rounded\"\r\n [progress]=\"progress\"\r\n [showValue]=\"true\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (isSuccessful) {\r\n <upup-file-success-check\r\n [index]=\"index\"\r\n [size]=\"22\"\r\n className=\"upup-flex-none\"\r\n />\r\n }\r\n\r\n @if (!isSuccessful) {\r\n <button\r\n [class]=\"removeButtonClass\"\r\n (click)=\"onRemove($event)\"\r\n type=\"button\"\r\n [disabled]=\"isRemovalLocked\"\r\n [attr.aria-label]=\"translations.removeFile\"\r\n data-testid=\"upup-file-remove\"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"fileDeleteIcon\"\r\n [ngComponentOutletInputs]=\"deleteIconInputs\"\r\n />\r\n </button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class FileRowComponent {\r\n readonly store = inject(UpupStore)\r\n private sanitizer = inject(DomSanitizer)\r\n\r\n @Input() file!: UploadFile\r\n @Input() index = 0\r\n\r\n readonly deleteIconInputs = { class: 'upup-h-5 upup-w-5' }\r\n\r\n get translations(): Translations {\r\n return this.store.translations()\r\n }\r\n\r\n get type(): string {\r\n return this.file.type ?? ''\r\n }\r\n\r\n get isImage(): boolean {\r\n return fileGetIsImage(this.type)\r\n }\r\n\r\n get isVideo(): boolean {\r\n return this.type.startsWith('video/')\r\n }\r\n\r\n get isSuccessful(): boolean {\r\n return this.file.status === UploadStatus.SUCCESSFUL\r\n }\r\n\r\n get isRemovalLocked(): boolean {\r\n return isFileRemovalLocked(this.progress, this.file.status)\r\n }\r\n\r\n get thumb(): NonMediaThumb {\r\n const type = this.type\r\n const ext = fileGetExtension(type, this.file.name)\r\n if (type.startsWith('audio/'))\r\n return {\r\n gradient: 'linear-gradient(135deg,#a855f7,#6366f1)',\r\n icon: 'audio',\r\n }\r\n if (ext === 'pdf' || type === 'application/pdf')\r\n return {\r\n gradient: 'linear-gradient(135deg,#f43f5e,#ec4899)',\r\n icon: 'file-pdf',\r\n }\r\n if (ARCHIVE_EXTENSIONS.has(ext) || type.includes('zip'))\r\n return {\r\n gradient: 'linear-gradient(135deg,#f59e0b,#f97316)',\r\n icon: fileTypeIconName(ext === 'zip' ? 'zip' : ext),\r\n }\r\n return {\r\n gradient: 'linear-gradient(135deg,#0ea5e9,#6366f1)',\r\n icon: fileTypeIconName(ext),\r\n }\r\n }\r\n\r\n get thumbStyle(): SafeStyle | null {\r\n if (this.isImage)\r\n return this.sanitizer.bypassSecurityTrustStyle(\r\n `background-image: url(${this.file.url ?? ''})`,\r\n )\r\n if (this.isVideo) return null\r\n return this.sanitizer.bypassSecurityTrustStyle(\r\n `background: ${this.thumb.gradient}`,\r\n )\r\n }\r\n\r\n get progress(): number {\r\n const p = this.store.filesProgressMap()[this.file.id]\r\n const loaded = p?.loaded ?? NaN\r\n const total = p?.total ?? NaN\r\n const pct = Math.floor((loaded / total) * 100)\r\n return Number.isFinite(pct) ? pct : 0\r\n }\r\n\r\n get fileDeleteIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.FileDeleteIcon as Type<unknown>\r\n }\r\n\r\n get rowClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-fx-hover-lift upup-flex upup-w-full upup-items-center upup-gap-3 upup-rounded-xl upup-px-3 upup-py-2.5 upup-ring-1',\r\n dark\r\n ? 'upup-bg-white/[0.04] upup-ring-white/[0.07]'\r\n : 'upup-bg-black/[0.04] upup-ring-black/[0.06]',\r\n )\r\n }\r\n\r\n get nameClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-truncate upup-text-[13px]',\r\n dark ? 'upup-text-[#e2e8f0]' : 'upup-text-gray-900',\r\n )\r\n }\r\n\r\n get sizeClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-text-[12px]',\r\n dark ? 'upup-text-[#94a3b8]' : 'upup-text-gray-500',\r\n )\r\n }\r\n\r\n get removeButtonClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-fx-remove upup-fx-press upup-flex upup-h-8 upup-w-8 upup-flex-none upup-items-center upup-justify-center upup-rounded-lg',\r\n dark\r\n ? 'upup-text-[#64748b] hover:upup-bg-white/[0.06]'\r\n : 'upup-text-gray-500 hover:upup-bg-black/[0.06]',\r\n 'disabled:upup-cursor-not-allowed disabled:upup-opacity-50',\r\n )\r\n }\r\n\r\n get formattedSize(): string {\r\n const tr = this.translations\r\n const bytes = this.file.size\r\n if (!bytes || bytes === 0) return tr.zeroBytes\r\n const k = 1024\r\n const sizes = [tr.bytes, tr.kb, tr.mb, tr.gb]\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return `${Math.round((bytes / Math.pow(k, i)) * 10) / 10} ${sizes[i]}`\r\n }\r\n\r\n onRemove(e: MouseEvent): void {\r\n e.stopPropagation()\r\n this.store.handleFileRemove(this.file.id)\r\n }\r\n}\r\n","import { Component, Input, inject } from '@angular/core'\r\nimport { cn } from '@useupup/core/internal'\r\nimport type { UploadFile } from '@useupup/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { FilePreviewComponent } from './file-preview.component'\r\nimport { FilePreviewPortalComponent } from './file-preview-portal.component'\r\nimport { FileRowComponent } from './file-row.component'\r\n\r\n/**\r\n * FileItem — port of FileItem. Wraps the grid tile (FilePreview + preview portal)\r\n * or, in list / forced-list mode, the compact FileRow. Entrance/exit fx render\r\n * unconditionally (the CSS motion gate is the one kill switch); a leaving id\r\n * swaps in the collapse.\r\n *\r\n * data-testid=\"upup-file-item\" / data-upup-slot=\"file-item\" / role=\"listitem\".\r\n */\r\n@Component({\r\n selector: 'upup-file-item',\r\n standalone: true,\r\n imports: [\r\n FilePreviewComponent,\r\n FilePreviewPortalComponent,\r\n FileRowComponent,\r\n ],\r\n template: `\r\n <div\r\n data-testid=\"upup-file-item\"\r\n data-upup-slot=\"file-item\"\r\n role=\"listitem\"\r\n [class]=\"containerClass\"\r\n [style.animation-delay]=\"animationDelay\"\r\n >\r\n @if (store.viewMode() === 'list' || forcedList) {\r\n <upup-file-row [file]=\"file\" [index]=\"index\" />\r\n } @else {\r\n <upup-file-preview\r\n [fileName]=\"file.name\"\r\n [fileType]=\"file.type ?? ''\"\r\n [fileId]=\"file.id\"\r\n [fileUrl]=\"file.url ?? ''\"\r\n [fileSize]=\"file.size\"\r\n [index]=\"index\"\r\n [canPreview]=\"canPreview\"\r\n (updateCanPreview)=\"canPreview = $event\"\r\n (onRequestPreview)=\"openPreviewPortal()\"\r\n (onclick)=\"store.uiProps.onFileClick(file)\"\r\n />\r\n\r\n @if (canPreview && showPreviewPortal) {\r\n <upup-file-preview-portal\r\n [fileType]=\"file.type ?? ''\"\r\n [fileUrl]=\"file.url ?? ''\"\r\n [fileName]=\"file.name\"\r\n [fileSize]=\"file.size\"\r\n (onClose)=\"closePreviewPortal()\"\r\n />\r\n }\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class FileItemComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n @Input() file!: UploadFile\r\n /** Position in the sorted list — drives the entrance stagger / check stagger. */\r\n @Input() index = 0\r\n /** True when the panel forces the row list (tiles don't fit one row). */\r\n @Input() forcedList = false\r\n\r\n canPreview = false\r\n showPreviewPortal = false\r\n\r\n get leaving(): boolean {\r\n return this.store.leavingFileIds().has(this.file.id)\r\n }\r\n\r\n get animationDelay(): string | null {\r\n // Cap the stagger: in the virtualized branch `index` is unbounded.\r\n return this.leaving ? null : `${Math.min(this.index, 8) * 40}ms`\r\n }\r\n\r\n get containerClass(): string {\r\n const slotClasses = this.store.slotOverrides()\r\n const filesSize = this.store.files().size\r\n return cn(\r\n 'upup-animate-fx-enter',\r\n 'upup-relative upup-flex upup-flex-1 upup-flex-col upup-items-start upup-gap-1 upup-bg-transparent',\r\n this.leaving && 'upup-animate-fx-exit upup-overflow-hidden',\r\n {\r\n [slotClasses.fileItemMultiple ?? '']:\r\n !!slotClasses.fileItemMultiple && filesSize > 1,\r\n [slotClasses.fileItemSingle ?? '']:\r\n !!slotClasses.fileItemSingle && filesSize === 1,\r\n },\r\n )\r\n }\r\n\r\n openPreviewPortal(): void {\r\n this.showPreviewPortal = true\r\n this.store.core?.emit('file-preview-open', {\r\n fileId: this.file.id,\r\n fileName: this.file.name,\r\n })\r\n }\r\n\r\n closePreviewPortal(): void {\r\n this.showPreviewPortal = false\r\n this.store.core?.emit('file-preview-close', {\r\n fileId: this.file.id,\r\n fileName: this.file.name,\r\n })\r\n }\r\n}\r\n","import { Component, Input, inject, type Type } from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport { UploadStatus, type UploadFile, type Translations } from '@useupup/core'\r\nimport {\r\n cn,\r\n fileGetIsImage,\r\n fileGetExtension,\r\n isFileRemovalLocked,\r\n} from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { FileIconComponent } from './file-icon.component'\r\nimport { ProgressBarComponent } from './progress-bar.component'\r\nimport { FileSuccessCheckComponent } from './shared/file-success-check.component'\r\n\r\n/**\r\n * Single-file HERO preview (port of FileHero). One visual fills the fixed-height\r\n * content area with a bottom scrim caption. The panel is fixed-height by ruling,\r\n * so the media MUST stay bounded with `min-h-0 flex-1 object-contain`.\r\n *\r\n * The image editor is react/preact-only, so NO edit affordance is rendered here.\r\n */\r\n@Component({\r\n selector: 'upup-file-hero',\r\n standalone: true,\r\n imports: [\r\n NgComponentOutlet,\r\n FileIconComponent,\r\n ProgressBarComponent,\r\n FileSuccessCheckComponent,\r\n ],\r\n template: `\r\n <div\r\n data-testid=\"upup-file-hero\"\r\n data-upup-slot=\"file-hero\"\r\n role=\"listitem\"\r\n [class]=\"rootClass\"\r\n >\r\n @if (isImage) {\r\n <img\r\n [src]=\"file.url ?? ''\"\r\n [alt]=\"file.name\"\r\n class=\"upup-min-h-0 upup-flex-1 upup-object-contain\"\r\n />\r\n } @else if (isVideo) {\r\n <video\r\n [src]=\"file.url ?? ''\"\r\n muted\r\n playsinline\r\n preload=\"metadata\"\r\n class=\"upup-pointer-events-none upup-min-h-0 upup-flex-1 upup-object-contain\"\r\n ></video>\r\n } @else {\r\n <div\r\n class=\"upup-flex upup-min-h-0 upup-flex-1 upup-items-center upup-justify-center upup-bg-gradient-to-br upup-from-[#0ea5e9]/10 upup-to-[#7c3aed]/10\"\r\n >\r\n <upup-file-icon [extension]=\"extension\" />\r\n </div>\r\n }\r\n\r\n @if (isSuccessful) {\r\n <upup-file-success-check\r\n className=\"upup-absolute upup-left-3 upup-top-3 upup-z-10\"\r\n />\r\n }\r\n\r\n @if (!isSuccessful) {\r\n <button\r\n [class]=\"removeButtonClass\"\r\n (click)=\"onRemove($event)\"\r\n type=\"button\"\r\n [disabled]=\"isRemovalLocked\"\r\n [attr.aria-label]=\"translations.removeFile\"\r\n data-testid=\"upup-file-remove\"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"fileDeleteIcon\"\r\n [ngComponentOutletInputs]=\"deleteIconInputs\"\r\n />\r\n </button>\r\n }\r\n\r\n <div [class]=\"captionClass\">\r\n <div [class]=\"nameClass\">{{ file.name }}</div>\r\n <div [class]=\"sizeClass\">{{ formattedSize }}</div>\r\n <upup-progress-bar\r\n [className]=\"heroProgressClass\"\r\n progressBarClassName=\"upup-rounded\"\r\n [progress]=\"progress\"\r\n [showValue]=\"true\"\r\n />\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class FileHeroComponent {\r\n readonly store = inject(UpupStore)\r\n\r\n @Input() file!: UploadFile\r\n\r\n readonly deleteIconInputs = { class: 'upup-h-5 upup-w-5' }\r\n\r\n get translations(): Translations {\r\n return this.store.translations()\r\n }\r\n\r\n get isImage(): boolean {\r\n return fileGetIsImage(this.file.type ?? '')\r\n }\r\n\r\n get isVideo(): boolean {\r\n return (this.file.type ?? '').startsWith('video/')\r\n }\r\n\r\n get isSuccessful(): boolean {\r\n return this.file.status === UploadStatus.SUCCESSFUL\r\n }\r\n\r\n get extension(): string {\r\n return fileGetExtension(this.file.type ?? '', this.file.name)\r\n }\r\n\r\n get progress(): number {\r\n const p = this.store.filesProgressMap()[this.file.id]\r\n const loaded = p?.loaded ?? NaN\r\n const total = p?.total ?? NaN\r\n const pct = Math.floor((loaded / total) * 100)\r\n return Number.isFinite(pct) ? pct : 0\r\n }\r\n\r\n get isRemovalLocked(): boolean {\r\n return isFileRemovalLocked(this.progress, this.file.status)\r\n }\r\n\r\n get fileDeleteIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.FileDeleteIcon as Type<unknown>\r\n }\r\n\r\n get rootClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-relative upup-flex upup-min-h-0 upup-flex-1 upup-flex-col upup-overflow-hidden upup-rounded-2xl upup-ring-1',\r\n dark\r\n ? 'upup-bg-white/[0.03] upup-ring-white/[0.08]'\r\n : 'upup-bg-black/[0.04] upup-ring-black/[0.06]',\r\n )\r\n }\r\n\r\n get removeButtonClass(): string {\r\n return cn(\r\n 'upup-fx-remove upup-fx-press upup-absolute upup-right-3 upup-top-3 upup-z-10',\r\n 'upup-flex upup-h-[34px] upup-w-[34px] upup-items-center upup-justify-center',\r\n 'upup-rounded-[9px] upup-bg-[#04080f]/40 upup-text-[#e2e8f0]',\r\n 'hover:upup-bg-[#04080f]/65',\r\n 'disabled:upup-cursor-not-allowed disabled:upup-opacity-50',\r\n )\r\n }\r\n\r\n get captionClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-pointer-events-none upup-absolute upup-inset-x-0 upup-bottom-0 upup-bg-gradient-to-t upup-to-transparent upup-px-[18px] upup-pb-3.5 upup-pt-4',\r\n dark\r\n ? 'upup-from-[#04080f]/[0.86] upup-via-[#04080f]/50'\r\n : 'upup-from-white/[0.92] upup-via-white/60',\r\n )\r\n }\r\n\r\n get nameClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-truncate upup-text-[13px] upup-font-semibold',\r\n dark ? 'upup-text-[#e2e8f0]' : 'upup-text-[#1e293b]',\r\n )\r\n }\r\n\r\n get sizeClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-mt-0.5 upup-text-[12px]',\r\n dark ? 'upup-text-[#94a3b8]' : 'upup-text-[#64748b]',\r\n )\r\n }\r\n\r\n get heroProgressClass(): string {\r\n const dark = this.store.isDark()\r\n return cn('upup-mt-2', dark ? 'upup-text-white' : 'upup-text-[#0f172a]')\r\n }\r\n\r\n get formattedSize(): string {\r\n const tr = this.translations\r\n const bytes = this.file.size\r\n if (!bytes || bytes === 0) return tr.zeroBytes\r\n const k = 1024\r\n const sizes = [tr.bytes, tr.kb, tr.mb, tr.gb]\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return `${Math.round((bytes / Math.pow(k, i)) * 10) / 10} ${sizes[i]}`\r\n }\r\n\r\n onRemove(e: MouseEvent): void {\r\n e.stopPropagation()\r\n this.store.handleFileRemove(this.file.id)\r\n }\r\n}\r\n","/**\r\n * Grid-tile geometry. The grid lays tiles with\r\n * `repeat(auto-fit, minmax(FILE_TILE_MIN, 1fr))` and a FILE_TILE_GAP gap, so a\r\n * row fits floor((width + gap) / (min + gap)) tiles before it would wrap, and\r\n * the tiles STRETCH to fill the row (no dead columns). The force-list rule below\r\n * uses the SAME numbers so the grid never wraps: the moment one more tile would\r\n * spill to a second row, list mode is forced instead.\r\n */\r\nexport const FILE_TILE_MIN = 160\r\nexport const FILE_TILE_GAP = 16\r\n\r\n/**\r\n * How many auto-fit tiles fit across `containerWidth` in a single row. A\r\n * non-positive / non-finite (unmeasured) width yields 0, which\r\n * isListViewForced reads as \"not measured yet — don't force a switch\".\r\n */\r\nexport function computeTilesPerRow(containerWidth: number): number {\r\n if (!Number.isFinite(containerWidth) || containerWidth <= 0) return 0\r\n return Math.max(\r\n 1,\r\n Math.floor(\r\n (containerWidth + FILE_TILE_GAP) / (FILE_TILE_MIN + FILE_TILE_GAP),\r\n ),\r\n )\r\n}\r\n\r\n/**\r\n * The square-tile grid is only honored when every tile fits in ONE row of the\r\n * fixed-height panel; past that the row list is FORCED and UploaderHeader hides\r\n * the grid/list toggle. `tilesPerRow <= 0` means the container has not been\r\n * measured yet — treated as \"fits\" so the first paint never flashes to list.\r\n */\r\nexport function isListViewForced(\r\n fileCount: number,\r\n tilesPerRow: number,\r\n): boolean {\r\n if (tilesPerRow <= 0) return false\r\n return fileCount > tilesPerRow\r\n}\r\n","import { signal, type Signal } from '@angular/core'\r\nimport { computeTilesPerRow } from './view-mode'\r\n\r\n/**\r\n * Measure an element's content-box width with a ResizeObserver and derive how\r\n * many 160px grid tiles fit one row (see view-mode.ts). Returns 0 until measured\r\n * (SSR / jsdom / pre-paint), which isListViewForced reads as \"unknown — don't\r\n * force list yet\". Isolated so tests can mock the measurement seam without a\r\n * real layout engine. Mirrors React's lib/use-tiles-per-row.\r\n */\r\nexport class TilesPerRowObserver {\r\n private ro: ResizeObserver | null = null\r\n private readonly _tilesPerRow = signal(0)\r\n\r\n /** Reactive tile-per-row count (0 until measured — see view-mode.ts). */\r\n get tilesPerRow(): Signal<number> {\r\n return this._tilesPerRow.asReadonly()\r\n }\r\n\r\n /** (Re)observe an element with the ResizeObserver. Call it whenever the\r\n * scroll container the file list binds changes; passing null disconnects. */\r\n observe(el: HTMLElement | null): void {\r\n this.ro?.disconnect()\r\n this.ro = null\r\n if (!el || typeof ResizeObserver === 'undefined') return\r\n this.ro = new ResizeObserver(entries => {\r\n const next = entries[0]?.contentRect.width ?? 0\r\n this._tilesPerRow.set(computeTilesPerRow(next))\r\n })\r\n this.ro.observe(el)\r\n }\r\n\r\n destroy(): void {\r\n this.ro?.disconnect()\r\n this.ro = null\r\n }\r\n}\r\n","import {\r\n Component,\r\n inject,\r\n OnDestroy,\r\n AfterViewInit,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectorRef,\r\n ChangeDetectionStrategy,\r\n type Type,\r\n} from '@angular/core'\r\nimport { NgComponentOutlet } from '@angular/common'\r\nimport {\r\n Virtualizer,\r\n observeElementRect,\r\n observeElementOffset,\r\n elementScroll,\r\n type VirtualItem,\r\n} from '@tanstack/virtual-core'\r\nimport {\r\n formatUiMessage as t,\r\n pluralUiMessage as plural,\r\n UploadStatus,\r\n type UploadFile,\r\n} from '@useupup/core'\r\nimport { isUploadActive, cn } from '@useupup/core/internal'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { UploaderHeaderComponent } from './uploader-header.component'\r\nimport { ProgressBarComponent } from './progress-bar.component'\r\nimport { FileItemComponent } from './file-item.component'\r\nimport { FileHeroComponent } from './file-hero.component'\r\nimport { FileSuccessCheckComponent } from './shared/file-success-check.component'\r\nimport { IconComponent } from './icon.component'\r\nimport { isListViewForced } from '../lib/view-mode'\r\nimport { TilesPerRowObserver } from '../lib/use-tiles-per-row'\r\n\r\nconst VIRTUAL_SCROLL_THRESHOLD = 20\r\nconst ESTIMATED_ITEM_HEIGHT = 76\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B'\r\n const k = 1024\r\n const sizes = ['B', 'KB', 'MB', 'GB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i] ?? ''}`\r\n}\r\n\r\nfunction formatEta(seconds: number): string {\r\n if (seconds <= 0 || !isFinite(seconds)) return ''\r\n const m = Math.floor(seconds / 60)\r\n const s = seconds % 60\r\n if (m > 0) return `${m}m ${s}s left`\r\n return `${s}s left`\r\n}\r\n\r\n/**\r\n * FileList — port of FileList. Renders in core insertion order (no sort). Single\r\n * file → FileHero; multiple → fluid auto-fit grid (inline gridTemplateColumns) or\r\n * forced list. Adaptive: the tiles-per-row ResizeObserver forces the row list when\r\n * a grid row would overflow the fixed-height panel (header then hides the toggle).\r\n */\r\n@Component({\r\n selector: 'upup-file-list',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n UploaderHeaderComponent,\r\n ProgressBarComponent,\r\n FileItemComponent,\r\n FileHeroComponent,\r\n FileSuccessCheckComponent,\r\n IconComponent,\r\n NgComponentOutlet,\r\n ],\r\n template: `\r\n <div\r\n data-testid=\"upup-file-list\"\r\n data-upup-slot=\"file-list\"\r\n [attr.inert]=\"dimmed ? '' : null\"\r\n [class]=\"fileListClass\"\r\n >\r\n <div role=\"status\" aria-live=\"polite\" class=\"upup-sr-only\">\r\n {{ selectionCountText }}\r\n </div>\r\n\r\n <upup-uploader-header\r\n [handleCancel]=\"handleCancelFn\"\r\n [forcedList]=\"forcedList\"\r\n [hideAddMore]=\"quietDone\"\r\n />\r\n\r\n @if (quietDone) {\r\n <div\r\n data-testid=\"upup-complete-check\"\r\n data-upup-slot=\"complete-check\"\r\n role=\"status\"\r\n [class]=\"completeCheckClass\"\r\n >\r\n <upup-file-success-check [size]=\"56\" />\r\n <span [class]=\"completeTextClass\">{{\r\n store.translations().announceUploadComplete\r\n }}</span>\r\n </div>\r\n }\r\n\r\n <div #scrollContainer [class]=\"scrollContainerClass\">\r\n @if (isSingle) {\r\n <div role=\"list\" [class]=\"heroBranchClass\">\r\n <upup-file-hero [file]=\"orderedFiles[0]\" />\r\n </div>\r\n } @else if (shouldVirtualize && virtualizer) {\r\n <div\r\n role=\"list\"\r\n data-upup-slot=\"file-list-virtual\"\r\n [style]=\"virtualContainerStyle\"\r\n [class]=\"innerListClass\"\r\n >\r\n @for (vi of virtualItems; track vi.key) {\r\n <div\r\n [attr.data-index]=\"vi.index\"\r\n [style]=\"virtualRowStyle(vi)\"\r\n >\r\n <upup-file-item\r\n [file]=\"orderedFiles[vi.index]\"\r\n [index]=\"vi.index\"\r\n [forcedList]=\"forcedList\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n role=\"list\"\r\n [style.grid-template-columns]=\"gridTemplateColumns\"\r\n [class]=\"standardInnerClass\"\r\n >\r\n @for (\r\n file of orderedFiles;\r\n track file.id;\r\n let i = $index\r\n ) {\r\n <upup-file-item\r\n [file]=\"file\"\r\n [index]=\"i\"\r\n [forcedList]=\"forcedList\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @if (canAddMore) {\r\n <button\r\n data-testid=\"upup-add-more\"\r\n data-placement=\"footer\"\r\n data-upup-slot=\"add-more\"\r\n [class]=\"footerAddMoreClass\"\r\n (click)=\"store.openSourceOverlay()\"\r\n [disabled]=\"isUploading || store.uiProps.isProcessing\"\r\n >\r\n <ng-container\r\n [ngComponentOutlet]=\"containerAddMoreIcon\"\r\n />\r\n {{ store.translations().addMore }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <div [class]=\"footerClass\">\r\n @if (showUploadButton) {\r\n <button\r\n data-testid=\"upup-upload-btn\"\r\n [class]=\"uploadButtonClass\"\r\n (click)=\"onUploadClick()\"\r\n [disabled]=\"\r\n isUploadActive(store.uploadStatus()) ||\r\n store.uiProps.isProcessing\r\n \"\r\n >\r\n {{ uploadButtonText }}\r\n </button>\r\n }\r\n\r\n @if (\r\n store.uploadStatus() === UploadStatus.FAILED &&\r\n store.uploadError()\r\n ) {\r\n <p\r\n data-testid=\"upup-upload-error\"\r\n data-upup-slot=\"upload-error\"\r\n [attr.title]=\"store.uploadErrorCode()\"\r\n class=\"upup-mr-auto upup-text-sm upup-text-red-600 dark:upup-text-red-400\"\r\n >\r\n {{ uploadErrorText }}\r\n </p>\r\n }\r\n\r\n @if (store.uploadStatus() === UploadStatus.FAILED) {\r\n <button\r\n data-testid=\"upup-retry-btn\"\r\n [class]=\"retryButtonClass\"\r\n (click)=\"onRetryClick()\"\r\n >\r\n {{ retryButtonText }}\r\n </button>\r\n }\r\n\r\n @if (\r\n store.uploadStatus() === UploadStatus.SUCCESSFUL &&\r\n !store.uiProps.quietCompletion\r\n ) {\r\n <button\r\n [class]=\"doneButtonClass\"\r\n (click)=\"store.handleDone()\"\r\n >\r\n {{ store.translations().done }}\r\n </button>\r\n }\r\n\r\n <div class=\"upup-flex upup-flex-1 upup-flex-col upup-gap-1\">\r\n <div class=\"upup-flex upup-items-center upup-gap-2\">\r\n @if (store.uploadStatus() === UploadStatus.UPLOADING) {\r\n <button\r\n data-testid=\"upup-upload-cancel\"\r\n [class]=\"cancelButtonClass\"\r\n (click)=\"store.handlePause()\"\r\n [attr.aria-label]=\"store.translations().cancel\"\r\n [title]=\"store.translations().cancel\"\r\n >\r\n <upup-icon name=\"x\" [size]=\"14\" />\r\n {{ store.translations().cancel }}\r\n </button>\r\n }\r\n @if (store.uploadStatus() === UploadStatus.PAUSED) {\r\n <button\r\n data-testid=\"upup-upload-resume\"\r\n [class]=\"resumeButtonClass\"\r\n (click)=\"store.handleResume()\"\r\n [attr.aria-label]=\"\r\n store.translations().resumeUpload\r\n \"\r\n [title]=\"store.translations().resumeUpload\"\r\n >\r\n <upup-icon name=\"player-play\" [size]=\"14\" />\r\n {{ store.translations().resumeUpload }}\r\n </button>\r\n }\r\n <upup-progress-bar\r\n [className]=\"'upup-flex-1'\"\r\n progressBarClassName=\"upup-rounded\"\r\n [progress]=\"store.totalProgress()\"\r\n [showValue]=\"true\"\r\n />\r\n </div>\r\n @if (showBytesRow) {\r\n <div [class]=\"bytesRowClass\">\r\n <span>{{ bytesText }}</span>\r\n @if (\r\n isUploadActive(store.uploadStatus()) &&\r\n store.uploadEta() > 0\r\n ) {\r\n <span>{{ etaText }}</span>\r\n }\r\n @if (store.uploadStatus() === UploadStatus.PAUSED) {\r\n <span>{{ store.translations().paused }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class FileListComponent implements AfterViewInit, OnDestroy {\r\n readonly store = inject(UpupStore)\r\n private cdr = inject(ChangeDetectorRef)\r\n\r\n readonly UploadStatus = UploadStatus\r\n readonly isUploadActive = isUploadActive\r\n\r\n @ViewChild('scrollContainer')\r\n scrollContainerRef?: ElementRef<HTMLDivElement>\r\n\r\n private readonly tiles = new TilesPerRowObserver()\r\n\r\n virtualizer: Virtualizer<HTMLDivElement, HTMLDivElement> | null = null\r\n private virtualizerCleanup: (() => void) | null = null\r\n virtualItems: VirtualItem[] = []\r\n private prevVirtCount = -1\r\n private prevShouldVirt = false\r\n\r\n // ── Derived from store (insertion order — NO sort) ──────────────────────────\r\n\r\n get orderedFiles(): UploadFile[] {\r\n return Array.from(this.store.files().values())\r\n }\r\n\r\n get isSingle(): boolean {\r\n return this.orderedFiles.length === 1\r\n }\r\n\r\n get forcedList(): boolean {\r\n return isListViewForced(\r\n this.orderedFiles.length,\r\n this.tiles.tilesPerRow(),\r\n )\r\n }\r\n\r\n get effectiveViewMode(): 'grid' | 'list' {\r\n return this.forcedList ? 'list' : this.store.viewMode()\r\n }\r\n\r\n get shouldVirtualize(): boolean {\r\n return (\r\n this.orderedFiles.length >= VIRTUAL_SCROLL_THRESHOLD &&\r\n this.effectiveViewMode !== 'grid'\r\n )\r\n }\r\n\r\n get isUploading(): boolean {\r\n return isUploadActive(this.store.uploadStatus())\r\n }\r\n\r\n get dimmed(): boolean {\r\n return this.store.sourceOverlayOpen() || !!this.store.activeSource()\r\n }\r\n\r\n get quietDone(): boolean {\r\n return (\r\n this.store.uiProps.quietCompletion &&\r\n this.store.uploadStatus() === UploadStatus.SUCCESSFUL\r\n )\r\n }\r\n\r\n get canAddMore(): boolean {\r\n return (\r\n this.store.uiProps.limit > 1 &&\r\n this.store.files().size < this.store.uiProps.limit &&\r\n !this.isUploading &&\r\n !this.store.uiProps.isProcessing &&\r\n !this.quietDone\r\n )\r\n }\r\n\r\n get containerAddMoreIcon(): Type<unknown> {\r\n return this.store.uiProps.icons.ContainerAddMoreIcon as Type<unknown>\r\n }\r\n\r\n get selectionCountText(): string {\r\n const tr = this.store.translations()\r\n const count = this.store.files().size\r\n return t(plural(tr, 'filesSelected', count), { count })\r\n }\r\n\r\n get showUploadButton(): boolean {\r\n const s = this.store.uploadStatus()\r\n return (\r\n s !== UploadStatus.SUCCESSFUL &&\r\n s !== UploadStatus.FAILED &&\r\n s !== UploadStatus.PAUSED &&\r\n !this.isUploading\r\n )\r\n }\r\n\r\n get showBytesRow(): boolean {\r\n const s = this.store.uploadStatus()\r\n return (\r\n (isUploadActive(s) || s === UploadStatus.PAUSED) &&\r\n this.store.totalBytes() > 0\r\n )\r\n }\r\n\r\n // ── Virtualizer computed styles ───────────────────────────────────────────\r\n\r\n get virtualContainerStyle(): string {\r\n const totalSize = this.virtualizer?.getTotalSize() ?? 0\r\n return `height: ${totalSize}px; position: relative;`\r\n }\r\n\r\n virtualRowStyle(vi: VirtualItem): string {\r\n return `position: absolute; top: 0; left: 0; width: 100%; transform: translateY(${vi.start}px); padding-bottom: 12px;`\r\n }\r\n\r\n get gridTemplateColumns(): string | null {\r\n return this.store.files().size > 1 && this.effectiveViewMode === 'grid'\r\n ? 'repeat(auto-fit, minmax(160px, 1fr))'\r\n : null\r\n }\r\n\r\n // ── Class builders ────────────────────────────────────────────────────────\r\n\r\n get fileListClass(): string {\r\n const themeSlots = this.store.slots()\r\n return cn(\r\n 'upup-relative upup-flex upup-h-full upup-flex-col upup-rounded-lg upup-shadow',\r\n {\r\n 'upup-hidden': !this.store.files().size,\r\n 'upup-opacity-50 upup-blur-[2px] upup-pointer-events-none':\r\n this.dimmed,\r\n },\r\n themeSlots.fileList?.root ?? '',\r\n )\r\n }\r\n\r\n get scrollContainerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-preview-scroll upup-flex upup-flex-1 upup-flex-col upup-overflow-y-auto upup-p-3',\r\n dark ? 'upup-bg-transparent' : 'upup-bg-black/[0.075]',\r\n slotClasses.fileListContainer ?? '',\r\n )\r\n }\r\n\r\n get heroBranchClass(): string {\r\n const first = this.orderedFiles[0]\r\n const heroLeaving =\r\n this.isSingle &&\r\n first !== undefined &&\r\n this.store.leavingFileIds().has(first.id)\r\n return cn(\r\n 'upup-animate-fx-enter upup-flex upup-min-h-0 upup-flex-1 upup-flex-col',\r\n heroLeaving && 'upup-animate-fx-exit upup-overflow-hidden',\r\n )\r\n }\r\n\r\n get innerListClass(): string {\r\n return cn(\r\n this.store.uiProps.isProcessing\r\n ? 'upup-pointer-events-none upup-opacity-75'\r\n : '',\r\n 'upup-font-[Arial,Helvetica,sans-serif]',\r\n )\r\n }\r\n\r\n get standardInnerClass(): string {\r\n const isProcessing = this.store.uiProps.isProcessing\r\n const slotClasses = this.store.slotOverrides()\r\n const grid =\r\n this.store.files().size > 1 && this.effectiveViewMode === 'grid'\r\n return cn(\r\n isProcessing ? 'upup-pointer-events-none upup-opacity-75' : '',\r\n 'upup-font-[Arial,Helvetica,sans-serif]',\r\n grid\r\n ? 'upup-grid upup-gap-4'\r\n : 'upup-flex upup-flex-col upup-gap-3',\r\n {\r\n [slotClasses.fileListContainerInnerMultiple ?? '']:\r\n !!slotClasses.fileListContainerInnerMultiple &&\r\n this.store.files().size > 1,\r\n [slotClasses.fileListContainerInnerSingle ?? '']:\r\n !!slotClasses.fileListContainerInnerSingle &&\r\n this.store.files().size === 1,\r\n },\r\n )\r\n }\r\n\r\n get footerAddMoreClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-fx-hover-lift upup-fx-press upup-mt-2.5 upup-flex upup-flex-none upup-items-center upup-justify-center upup-gap-2 upup-whitespace-nowrap upup-rounded-xl upup-border-[1.5px] upup-border-dashed upup-px-3 upup-py-2 upup-text-[13px] upup-font-medium',\r\n dark\r\n ? 'upup-border-white/[0.16] upup-text-[#94a3b8]'\r\n : 'upup-border-black/[0.16] upup-text-gray-500',\r\n slotClasses.containerAddMoreButton ?? '',\r\n )\r\n }\r\n\r\n get completeCheckClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-absolute upup-inset-0 upup-z-20 upup-flex upup-flex-col upup-items-center upup-justify-center upup-gap-2 upup-rounded-lg upup-backdrop-blur-[1px]',\r\n dark ? 'upup-bg-[#04080f]/40' : 'upup-bg-white/50',\r\n )\r\n }\r\n\r\n get completeTextClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-text-sm upup-font-medium',\r\n dark ? 'upup-text-[#e2e8f0]' : 'upup-text-[#1e293b]',\r\n )\r\n }\r\n\r\n get footerClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-shadow-top upup-flex upup-items-center upup-gap-3 upup-rounded-b-lg upup-bg-black/[0.025] upup-px-3 upup-py-2',\r\n { 'upup-bg-white/5 dark:upup-bg-white/5': dark },\r\n slotClasses.fileListFooter ?? '',\r\n )\r\n }\r\n\r\n get uploadButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-fx-sheen-sweep upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-full upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white',\r\n { 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark },\r\n slotClasses.uploadButton ?? '',\r\n )\r\n }\r\n\r\n get retryButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-full upup-bg-red-600 upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white',\r\n { 'upup-bg-red-500 dark:upup-bg-red-500': dark },\r\n slotClasses.uploadButton ?? '',\r\n )\r\n }\r\n\r\n get doneButtonClass(): string {\r\n const dark = this.store.isDark()\r\n const slotClasses = this.store.slotOverrides()\r\n return cn(\r\n 'upup-fx-sheen-sweep upup-fx-press upup-disabled:animate-pulse upup-ml-auto upup-rounded-lg upup-bg-[#0ea5e9] upup-px-3 upup-py-2 upup-text-sm upup-font-medium upup-text-white',\r\n { 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark },\r\n slotClasses.uploadDoneButton ?? '',\r\n )\r\n }\r\n\r\n get cancelButtonClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-fx-press upup-flex upup-h-7 upup-items-center upup-gap-1 upup-whitespace-nowrap upup-rounded-full upup-bg-red-100 upup-px-3 upup-text-xs upup-font-medium upup-text-red-700 upup-transition-colors hover:upup-bg-red-200',\r\n {\r\n 'upup-bg-red-500/20 upup-text-red-100 hover:upup-bg-red-500/30':\r\n dark,\r\n },\r\n )\r\n }\r\n\r\n get resumeButtonClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-fx-press upup-flex upup-h-7 upup-items-center upup-gap-1 upup-whitespace-nowrap upup-rounded-full upup-bg-[#0ea5e9] upup-px-3 upup-text-xs upup-font-medium upup-text-white upup-transition-colors',\r\n { 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]': dark },\r\n )\r\n }\r\n\r\n get bytesRowClass(): string {\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-flex upup-items-center upup-justify-between upup-text-[11px] upup-text-gray-500',\r\n { 'upup-text-gray-400': dark },\r\n )\r\n }\r\n\r\n get bytesText(): string {\r\n const uploaded = formatBytes(this.store.uploadedBytes())\r\n const total = formatBytes(this.store.totalBytes())\r\n const speed = this.store.uploadSpeed()\r\n const speedPart = speed > 0 ? ` · ${formatBytes(speed)}/s` : ''\r\n return `${uploaded} of ${total}${speedPart}`\r\n }\r\n\r\n get etaText(): string {\r\n return formatEta(this.store.uploadEta())\r\n }\r\n\r\n get uploadButtonText(): string {\r\n const tr = this.store.translations()\r\n const count = this.store.files().size\r\n return t(plural(tr, 'uploadFiles', count), { count })\r\n }\r\n\r\n get retryButtonText(): string {\r\n const tr = this.store.translations()\r\n return this.store.uiProps.resumable?.protocol === 'multipart'\r\n ? tr.resumeUpload\r\n : tr.retryUpload\r\n }\r\n\r\n get uploadErrorText(): string {\r\n const tr = this.store.translations()\r\n const code = this.store.uploadErrorCode()\r\n const message = this.store.uploadError() ?? ''\r\n return code\r\n ? t(tr.uploadFailedWithCode, { code })\r\n : t(tr.uploadFailed, { message })\r\n }\r\n\r\n readonly handleCancelFn = (): void => {\r\n this.store.handleCancel()\r\n }\r\n\r\n onUploadClick(): void {\r\n void this.store.startUpload().catch(() => undefined)\r\n }\r\n\r\n onRetryClick(): void {\r\n void this.store.retryUpload().catch(() => undefined)\r\n }\r\n\r\n // ── Virtualizer + tiles-per-row lifecycle ──────────────────────────────────\r\n\r\n ngAfterViewInit(): void {\r\n this.tiles.observe(this.scrollContainerRef?.nativeElement ?? null)\r\n this.initVirtualizer()\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.tiles.destroy()\r\n this.destroyVirtualizer()\r\n }\r\n\r\n private initVirtualizer(): void {\r\n const scrollEl = this.scrollContainerRef?.nativeElement\r\n if (!scrollEl) return\r\n const count = this.orderedFiles.length\r\n const v = new Virtualizer<HTMLDivElement, HTMLDivElement>({\r\n count,\r\n getScrollElement: () => scrollEl,\r\n estimateSize: () => ESTIMATED_ITEM_HEIGHT,\r\n overscan: 5,\r\n enabled: this.shouldVirtualize,\r\n observeElementRect,\r\n observeElementOffset,\r\n scrollToFn: elementScroll,\r\n onChange: () => {\r\n this.virtualItems = v.getVirtualItems()\r\n this.cdr.markForCheck()\r\n },\r\n })\r\n v._willUpdate()\r\n this.virtualizerCleanup = v._didMount()\r\n this.virtualizer = v\r\n this.virtualItems = v.getVirtualItems()\r\n this.cdr.markForCheck()\r\n }\r\n\r\n private destroyVirtualizer(): void {\r\n if (this.virtualizerCleanup) {\r\n this.virtualizerCleanup()\r\n this.virtualizerCleanup = null\r\n }\r\n this.virtualizer = null\r\n }\r\n\r\n ngDoCheck(): void {\r\n const v = this.virtualizer\r\n if (!v) return\r\n const count = this.store.files().size\r\n const sv =\r\n count >= VIRTUAL_SCROLL_THRESHOLD &&\r\n this.effectiveViewMode !== 'grid'\r\n if (count === this.prevVirtCount && sv === this.prevShouldVirt) return\r\n this.prevVirtCount = count\r\n this.prevShouldVirt = sv\r\n const scrollEl = this.scrollContainerRef?.nativeElement\r\n if (!scrollEl) return\r\n v.setOptions({\r\n ...v.options,\r\n count,\r\n getScrollElement: () => scrollEl,\r\n estimateSize: () => ESTIMATED_ITEM_HEIGHT,\r\n overscan: 5,\r\n enabled: sv,\r\n })\r\n v._willUpdate()\r\n this.virtualItems = v.getVirtualItems()\r\n }\r\n}\r\n","export const devinoDark =\r\n 'data:image/png;base64,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'\r\nexport const devinoLight =\r\n 'data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgP+w/w+fcfClL07rlQAAAA5lWElmTU0AKgAAAAgAAAAAAAAA0lOTAAAAAElFTkSuQmCC'\r\nexport const logoDark =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPQAAAA0CAYAAAC9xxVKAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABBoSURBVHgB7Z0LeFXVlYDX2ufcZxLCQxxAUGgBZxqbh0RDHmDQIupXx2kBrcx8WhxmsK06nTo6Op2h+OjD6TedT2uptUrpZ60FWhWrtmCBCMmNCDe5iWBRoCiNrfJKSEjuI+fs1bVvMCWQ3Jybe+/hQs7/5eaec+4+Z5/HXnuvvdba+yBkAdWbydvhiU02pZwBQKWA4lICmiIAz+NvLwDGgOgIJ90PGjYDQUiiuSOH/L+vr8AwODg4xEE4g5QHjo3uIvcNAuiLAOLyHuG1jMmfbUTymRFS/mrr7LxD4OAwzDkjAl3cSCOhM7IAge4kxEJIEQL4A0r5Pc0wVwfnjDgMDg7DFNsFuvj1yDTQ6HHOeW7686ftYBr/HpqVFwBEAgeHYYZtAk1EWFgXvUZDeopXJ0Dm2ANC++bIiOvZmjlogIPDMEKADbDRSy+pj35ZQ3gBMivMimkg5Y/b3eGvLSey5focHLKFjBd41TK3uqL/zEvL+OMBWyCXRPHwi3Vdt8FyR6gdhg8ZV7lL6rrmA+HjhDAObAYROyXiLU3lnufBwWEYkFGBLmnoGAth1w52R10IZwhC+tBFvrk7KnEnZCEzdpArrwO0wdK1hIH2Xgsxq8a+pI57HR8XTjkua1ZT94J7YkviMlJdDbHliLLf3zbv97b6xpXysS4TEqfxptFcFno0Jr4OzrEdUOxDiTUNla5tlq6Nz6u6BqxqeoZlO0oSxx17CLrX3ojmqdtV15K/9ET7Hjof5K4CjA10DpdsOTrRpfvKWLMtASEu4K0+tV39LABjkugQN1QNJhjrmyvzDp56iIwJdDWR3hYI/4Sz+Cc4w3DR+fVllZ75TyJ2Q5ZRHAivZr/bjYOnxJ2axzMnWIqW3HLFtZ2rWFhuHfSoXDgoGr4qNGdU28nbC9/omqhJsZsLVk6C3VWhXhKq9K1SKwt3kXvfwfYLpdv1eT7uPJJYxjc/ByyB7wHKR2VH+4+b543rHCjVZa93TerW8QBYgejeUJX/u1aSXr41Mj0m6B0raQXi7Q0V3h+dur24LvxN/vqvQXZ/x5Te8rdmYata4YrX3x2LlCPJRQK0K1RAFVjrCquKahO4tP8MXe4O9Z4bZIijgeOz+SFZKKiZh5uCa4OB6NXgkG40rhGK1ELJlo5P7Tkafki63Bv5uT9CBFdaF2YFTeYH9f8iN/+7xZtbR8K5yxS3Lzq6ej95i2sj18lo5CVBsAFB3MbC/EmwLpNKE7gau81Xi7Ycn/fxxowIdAHX1IL0/+FFN2QHOuuE95zjBeWMgJLKigORe0hzvcJN172s86XavfoXdHm/U9iUTGWQOugCu+IW3GYEb2r7U3gtCPo1Z3oVpCCHvP94FNrPiuvD1QAZEmi91bicH+wsyCK49qskj7sKHNIK9+5msmr7SLyFTQ86If4jHot8DmyEum0MskL5EP/7LBfK9Mgfwnkg6RHVh8+IQKNmXAMwuEHGZnRWaxaAQ7pBSH/EXy5qOH8GkQvOTTIgd3jZUXdkdvoPrCxyEhdCFkKS5tEJi6FDtiOvMGqjU8DBKlwHilvSLtAzgjCJ6+upkIWw5fVvCus7LgaHswAchWROAwfrEJWlR6BPisaSsVglZG/IJergquxdc1rr7EbXJoODZdhAdpGezA7K1N7eEq2WGrskJJWzoWkq++TOI4joMDccZXn5gEhKyGL4or/O/sJ72a1yIQYiHqgL8yZi3y7u4+vZwWr5a+O6/Js2zMNOGCZoeSNTt/AiqPu1nWvIN7iiDErU9xm6689G7HCn3k1kuBD9lP8JQuMHrCpVWjuo9IFNxK3cJtgK36sDfOO3srJcL8HcLbrxgNkROSxzYvF4CfJ43G5TXwBCPAGW7BTkG1SgVcRRzOgq1ExxB5va/55dE6PjBn5Uf3iyrd/DB/wEpAk+djs/0AcJ5EYQWhG7R/6PAMdAqhDE+2WIJ2UFeD5/n895lqPAOw/mRrqKa8MvmkiPy5H7g7sKCmJwDmN2tKWoqdAKze27J1iKXYMkbGL3yn+DhA28nFUGr7iV2y69kis/DeXsYHlOg4XUT5YEIsr283kLaRNfQtHGwxeYscgDuim28uoX+UxGgw0oYUaCe8XOtx8LVeaGQuW+n7JyfBdXH0fAHvx8Eos0xBr3scmPldS1XuSo5wODhB9ZEOYepNnGewwb7ac/uHyb3ZHIQavpudG0FhkHAwi0GnZYFIh8Fr3+l/lo95GKJ7WJeMss5e24y7MyuLS0N1RzWotvNX/dwSneB7sgcPOtWMq6z7pL68I3LlxD2eaKO0vJ6l7ZWc1pAq0K7Yt14S+wiqvisIvB3llNOvhzX+Ms/3PBpX3jrlUw/NQPfGsR5f3c1z0KNkKIRSbCij0TIotVFwQcHLKUvgLN1up3J0aXsAh/Px59YiPcp/2Qv+4WHs9TA6WJC3WLb40gWsyrdqnfcVB1NxC/Z0TDdzottUO20kegPz03UoVED9rVV+4FsYN7qMs0j3cV98USjohSQt1YlfMSW6lV8IqtLTW31Xks2N95d1J4Pjg4ZCG9Al1S2zlBQ/hfXjwf7ISFmd0F92uuwYX5ZJqqfJu5b/9VsF2owYVSLCupC18EDg5ZRlygVVC3BLGMjUBlYC8dZMpbQ7O8P0hGmD+mqdL3jNR1bqnJ7pa6QKJ4SI3/BQeHLCIu0Ee1rkJeuAXsRcWgfLVplv8FSIHmMtcmxPi4a1tn+ESQN+05Fi4FB4csIi7QQsP7uA9rm2uKOS6BFjbNylkJaaCxwrcRUVcjvOxrqdmlxVXS1x2rt0M2IdS8T2zomQf2cRzR/Epzpf9XkEYaK1wbUcBNLGRtYBcoqg3TGRHkkD2INtf4K9m4NALs4TgI8w7hznkOMkBjue93rH7fxY7zP4IdEPjZX18ODg5ZggCUds21dRykuC1UnvvToRjArDK1wvtzAnknS1sL2IEp7ZkFhdUoKeCsDz/VhFtwpWtL1DSiZjkfG6cgSh6yPpWXurmZN+wgHAQp7wvN8qyFDLOW9fmRsTdf4btwB5f+Vsgwtty/ODSRIuGE44PVXG5FtdGC4tquRXxin4IsxCT6W0mQayVt6iP35OzB3p7CNpD8otpwVcwku43ClihYE/ekWBydBqbO1VJmJyNgYSaCu/Uq/2qwiZo5c5TFe13RtsjNwqDn+BpHQYYgxE9CCqC0OOyDIJ8b6eeKApFvCcJ4lBwSaFIaeajrE7jwT8O26KcJ5Xj+JR/A8tzVKQ+flEiFJXXRhNM7STI1zmk6kLwNLU7Bo4F2WoUclWB5sD3XBtesq4uuuLS2azOhZpI0kVyah0xztAb6RVz+C8xo+BJWGPJJzVBqUxtNpM4ibx7fs2MJE6oRpxS9nvew9IZWRGjT+arPy5gih9jJJ3+3XuFdHTwDc2I3lXnXFwYiizSSLNSYmRk/ubWZGCBfy9BfPN9hNSGXtwu5NKwglor4uhq/qgmNelbVRIgwlND7lIdPIn6Oz+GGxElUFtL6+HsCgxuC02whPp+vPWpGLB1CVRwsqEsJxBJVpbA+qrpIgnsu4q+DnzGemc0Kt4/IfGLQVBSfl8/ys+H7tV9kcBRoWBDd3lTp+1nwDE5w31zh/a1E8QW+L5YFJ0lwlAnJvKi+DyTQ0uTuvZn1tG4fv6EhK2LKkfqcU6JPEgeFFjJg76mbt83Edi64H0JSxGPv4+dgVTuwASv3K6mKliv015VAWxvHmiR8JusaWJghC2iq8K7nGvoZyBC5GlhrMvoBdXqTn0QUHPqAhA2ham+/44ARaSs4nA7CGsGF6QPIAMRaTdkbZJc7LMGJELKxKJcyN8/Z4fqhq9vgNQ5v5wexHRx6Ye08TDo8AQO8M0sj/CE4g6r7QvC7pgr/mzqX93e4xpsO6YbkgqgRHl8SiOwm6H+2JiRZ01jp/yWkyKXbwrPY3nFTv3kEolxp0RSuYOZAJkBISmU+lfqKSeGS+si3pKSX06kOcgXWyv3WjBkDMwn3L58MleVsHOj3YKW3pjgQCfBi+lyGavJpgmOZNKBmkA/YffANtcB9CsnqC14P6cfFNWw1F6zqgRKwUUf1rVMWaOqW09nO8ZV+f1P/Mum9lRSAFMmP1L/W5il/DEkZcFINwVWRcviCcOmPkmE8z8tpm+ct06CKx0f4diz//YcBCwZugbkF0rfH7jJi8mm+3hJIEb7nu1kXeJgfppfL0VNwdvEHockbGypzgmpFcCu5oe9cfw5JIVJXl5WbzSM83+Dn8Cg/iSH5zllNVcai1aTh9ZrHu7SxzN3E2te7cHYg1ds12VL+pfyo90ErkzLuKHWFJMkv83WrCjXp8ksqT8S9QuDXdI/3ylCV71l2/21Hmwf5DBki5ZpYTTpe2zCzR5gVemNVzlvFdZE9XJjSr3af4yhrq+7x1UIaUNbbGTtomRmN8vHoZn4e1VzqLhgoPRdkg11x73LXpklNnStA25Df7d5bU/XX9yELkOvU+xQS5yz3sB861VlNuduG71lOTcrBxjZswFb2Ib0v0bVdmuH65qo8yxPnqVa6ma97Rm345m6kf2D/1CIUWMQa4cAeB4KDnOYtiTKkGfR6RDPq3i7P7x3QIz3uA9AV+wUfemyirKURS9LKfuqp87OT9AYKkcxkieqmdXJFdESQ3C2N7tqOC0Y0752GfQyqujI8yLrwz7nzthwckoIVm18EZ0BKD/dkToTEvlK9mdaHfTAmGgtP5aZrEuroF6LHQ2V2m4au6Qe7o+H3cj100PPaiPaa5f2/1Fx4/U/njYFVifI81JXgBeQW4QK6On+859tJ7fQeaybVbN23+AL7gQhW+ZQl/LHqn+x/sv3i0RMJ9IsRxRgQWo+brLubO8fYidJoMbx5BzzHWttv+Myojv5eUh8qwbZrX6Ul4b9L3EnrOOJJaQZvrs/CQojFI8Z7kgpP7pgMZjDeLRn4nsUvWhpdKzXd/6+cagI4WIIL8REyulcA+tPeXamZExfQj058hsyJCiLzMQASzJopOGTXXTqoWTxF5b/3xCchwQS//eY6zLgLkbUZMqKdkZop3rTfs7hVdecVY/7ID+V+AKcvbRmiB0KzRwxaeBwc7KTXTZJveNfw1ypwGAy2NeHz5nHfylTVRQeHdNMr0KzmRTyaqVrp34PDwBA1aQIfaB5G775yOHvoE8iwbWbuR2gaC1jx3g8Op0PwNpsQ/6NhpqcZHByykNMikxpn572tYXQu//IqgN3v48tiCHZpQsxvnJ27ERwcspR+Qw2DlSP3aS74Ev+4EgHtm6MrC8GeSu1ZI+K9Kljh2Q0ODlnMgLHDwVLfAQ96/w3IvJVNP5tUrCsMJ9jJjERbpRQLtQrv4p2fwZRcSA4OdpBwjOqJUUQvFa7/cKOem1/GEr2EC/lctvLa+t4rO+EW+Qhf31YQ2gozRw80Fw1P45emYplAHuMqf9CgEy4XzvBPiMcmRAho0NBdSXTclefNSHfW0qDz5nnjVKHeVL2ZtnRoXWOljtOJZAFKcQlocDX1vEQ9WwaOJwO3wtACGr5MhhnSUOyRIN8ZWeE/WIN4dsT0ZojGqpw/zdjSWSrBP+jQFpOODXn46LlEjul9vBPh6cHSafIwBUvH/hkywF8AiRJ/55k/DIIAAAAASUVORK5CYII='\r\nexport const logoLight =\r\n 'data:image/png;base64,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'\r\n","import {\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n computed,\r\n effect,\r\n inject,\r\n} from '@angular/core'\r\nimport {\r\n cn,\r\n DragDropController,\r\n type DragDropSnapshot,\r\n} from '@useupup/core/internal'\r\nimport { UploadStatus, formatUiMessage } from '@useupup/core'\r\nimport { UpupStore } from '../upup-store.service'\r\nimport { toSignalStore, type SignalStore } from '../lib/to-signal-store'\r\nimport { SourceViewComponent } from './source-view.component'\r\nimport { SourceSelectorComponent } from './source-selector.component'\r\nimport { FileListComponent } from './file-list.component'\r\nimport { devinoDark, devinoLight, logoDark, logoLight } from '../assets/logos'\r\n\r\n/**\r\n * UploaderPanelComponent — port of UploaderPanel + useUploaderPanel.\r\n *\r\n * The dropzone frame, drag-over prompt, drop-rejection toast, add-more sheet\r\n * overlay, and the in-panel branding row all live here now (branding moved\r\n * inside the dashed frame). data-motion is written from the core motion gate;\r\n * the two-phase reverse-slide close is core-owned (sourceOverlayClosing) — never\r\n * gated on transitionend/animationend.\r\n */\r\n@Component({\r\n selector: 'upup-uploader-panel',\r\n standalone: true,\r\n imports: [SourceViewComponent, SourceSelectorComponent, FileListComponent],\r\n template: `\r\n <div\r\n #panel\r\n data-testid=\"upup-dropzone\"\r\n data-upup-slot=\"uploader-panel\"\r\n [attr.data-motion]=\"store.motionMode()\"\r\n role=\"region\"\r\n [attr.aria-label]=\"store.translations().dropzoneLabel\"\r\n [attr.aria-dropeffect]=\"isDragging() ? 'copy' : 'none'\"\r\n (dragover)=\"handleDragOver($event)\"\r\n (dragleave)=\"handleDragLeave($event)\"\r\n (drop)=\"handleDrop($event)\"\r\n (paste)=\"handlePaste($event)\"\r\n [class]=\"boxClass()\"\r\n >\r\n <div role=\"status\" aria-live=\"polite\" class=\"upup-sr-only\">\r\n {{ uploadAnnouncement() }}\r\n </div>\r\n\r\n @if (store.dropRejected()) {\r\n <div\r\n data-testid=\"upup-drop-rejected-toast\"\r\n data-upup-slot=\"drop-rejected-toast\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n [class]=\"toastClass()\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"16\"\r\n height=\"16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.9\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n class=\"upup-flex-none\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\r\n <path d=\"M12 8v4\" />\r\n <path d=\"M12 16h.01\" />\r\n </svg>\r\n <span>{{ dropRejectedText() }}</span>\r\n </div>\r\n }\r\n\r\n @if (!store.isOnline()) {\r\n <div [class]=\"offlineBannerClass()\">\r\n No internet connection — uploads will resume when you\r\n reconnect.\r\n </div>\r\n }\r\n\r\n @if (showDropzoneFrame()) {\r\n <svg\r\n data-upup-slot=\"dropzone-frame\"\r\n aria-hidden=\"true\"\r\n class=\"upup-pointer-events-none upup-absolute upup-inset-1 upup-h-[calc(100%-0.5rem)] upup-w-[calc(100%-0.5rem)]\"\r\n >\r\n <rect\r\n x=\"1\"\r\n y=\"1\"\r\n rx=\"14\"\r\n ry=\"14\"\r\n fill=\"none\"\r\n stroke-width=\"1.5\"\r\n stroke-dasharray=\"5 7\"\r\n [attr.stroke]=\"frameStroke()\"\r\n [class]=\"\r\n absoluteIsDragging()\r\n ? 'upup-animate-fx-dash-march'\r\n : ''\r\n \"\r\n style=\"width: calc(100% - 2px); height: calc(100% - 2px)\"\r\n />\r\n </svg>\r\n }\r\n\r\n @if (absoluteIsDragging()) {\r\n <div\r\n data-testid=\"upup-drag-overlay\"\r\n data-upup-slot=\"drag-overlay\"\r\n aria-hidden=\"true\"\r\n [class]=\"dragOverlayClass()\"\r\n >\r\n <span [class]=\"dragBadgeClass()\">\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"30\"\r\n height=\"30\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M12 4v11\" />\r\n <path d=\"m7 10 5 5 5-5\" />\r\n <path\r\n d=\"M4 17v1a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1\"\r\n />\r\n </svg>\r\n </span>\r\n <span [class]=\"dragTextClass()\">{{\r\n store.translations().dropToUpload\r\n }}</span>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"upup-relative upup-flex upup-min-h-0 upup-flex-1 upup-flex-col\"\r\n >\r\n @if (!hasFiles()) {\r\n @if (!!store.activeSource()) {\r\n <upup-source-view />\r\n } @else {\r\n <upup-source-selector />\r\n }\r\n }\r\n <upup-file-list />\r\n </div>\r\n\r\n @if (showSourceOverlay()) {\r\n <div\r\n #overlay\r\n data-upup-slot=\"source-overlay\"\r\n [attr.role]=\"store.sourceOverlayClosing() ? null : 'dialog'\"\r\n [attr.aria-modal]=\"\r\n store.sourceOverlayClosing() ? null : 'true'\r\n \"\r\n [attr.aria-label]=\"store.translations().addingMoreFiles\"\r\n (keydown)=\"onOverlayKeydown($event)\"\r\n [class]=\"overlayClass()\"\r\n >\r\n <button\r\n type=\"button\"\r\n data-testid=\"upup-sheet-grip\"\r\n data-upup-slot=\"sheet-grip\"\r\n [attr.aria-label]=\"store.translations().overlayBack\"\r\n (click)=\"onGripClick()\"\r\n (pointerdown)=\"onGripPointerDown($event)\"\r\n (pointermove)=\"onGripPointerMove($event)\"\r\n (pointerup)=\"onGripPointerUp($event)\"\r\n class=\"upup-absolute upup-left-1/2 upup-top-1.5 upup-z-10 upup-flex upup-h-6 upup-w-20 upup--translate-x-1/2 upup-cursor-grab upup-touch-none upup-items-center upup-justify-center upup-rounded-full\"\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n [class]=\"gripBarClass()\"\r\n ></span>\r\n </button>\r\n @if (!!store.activeSource()) {\r\n <upup-source-view />\r\n } @else {\r\n <upup-source-selector />\r\n }\r\n </div>\r\n }\r\n\r\n @if (showBranding()) {\r\n <div\r\n data-testid=\"upup-branding\"\r\n class=\"upup-flex upup-w-full upup-flex-none upup-flex-col upup-items-center upup-justify-between upup-gap-1 upup-px-6 upup-pb-5 upup-pt-1.5 md:upup-flex-row\"\r\n >\r\n <a\r\n href=\"https://useupup.com/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n class=\"upup-flex upup-items-center upup-gap-[5px]\"\r\n >\r\n @if (store.isDark()) {\r\n <img\r\n [src]=\"logoDark\"\r\n width=\"61\"\r\n height=\"13\"\r\n alt=\"logo-dark\"\r\n />\r\n } @else {\r\n <img\r\n [src]=\"logoLight\"\r\n width=\"61\"\r\n height=\"13\"\r\n alt=\"logo-light\"\r\n />\r\n }\r\n </a>\r\n <a\r\n href=\"https://devino.ca/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n class=\"upup-flex upup-flex-row upup-items-center upup-justify-end upup-gap-1\"\r\n >\r\n <span [class]=\"builtByClass()\">\r\n {{ store.translations().builtBy }}\r\n </span>\r\n @if (store.isDark()) {\r\n <img\r\n [src]=\"devinoDark\"\r\n width=\"61\"\r\n height=\"13\"\r\n alt=\"logo-dark\"\r\n />\r\n } @else {\r\n <img\r\n [src]=\"devinoLight\"\r\n width=\"61\"\r\n height=\"13\"\r\n alt=\"logo-light\"\r\n />\r\n }\r\n </a>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class UploaderPanelComponent implements OnInit, OnDestroy {\r\n readonly store = inject(UpupStore)\r\n\r\n readonly logoDark = logoDark\r\n readonly logoLight = logoLight\r\n readonly devinoDark = devinoDark\r\n readonly devinoLight = devinoLight\r\n\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLDivElement>\r\n @ViewChild('overlay') overlayRef?: ElementRef<HTMLDivElement>\r\n\r\n private dragController!: DragDropController\r\n private dragStore?: SignalStore<DragDropSnapshot>\r\n\r\n // Sheet swipe-to-dismiss (imperative — dragging must not re-render).\r\n private swipeStartY: number | null = null\r\n private swiped = false\r\n private triggerEl: HTMLElement | null = null\r\n\r\n constructor() {\r\n // Focus management: on open (or inner view swap) pull focus into the\r\n // overlay so keyboard/SR users don't land on the inert list underneath;\r\n // restore to the trigger once fully settled closed.\r\n effect(() => {\r\n const open = this.store.sourceOverlayOpen()\r\n const closing = this.store.sourceOverlayClosing()\r\n const active = !!this.store.activeSource()\r\n if (open || active) {\r\n queueMicrotask(() => {\r\n const overlayEl = this.overlayRef?.nativeElement\r\n if (!overlayEl) return\r\n if (\r\n !this.triggerEl &&\r\n document.activeElement instanceof HTMLElement\r\n )\r\n this.triggerEl = document.activeElement\r\n overlayEl\r\n .querySelector<HTMLElement>('button:not([disabled])')\r\n ?.focus()\r\n })\r\n return\r\n }\r\n if (!open && !closing && !active) {\r\n const trigger = this.triggerEl\r\n if (!trigger) return\r\n this.triggerEl = null\r\n if (trigger.isConnected) trigger.focus()\r\n }\r\n })\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dragController = new DragDropController({\r\n core: this.store.core,\r\n orchestrator: this.store.orchestrator,\r\n setFiles: files => this.store.handleSetSelectedFiles(files),\r\n filesSize: () => this.store.orchestrator.getSnapshot().files.size,\r\n options: () => this.store.uiProps,\r\n props: () => ({\r\n disableDragDrop: this.store.uiProps.disableDragDrop,\r\n isProcessing: this.store.uiProps.isProcessing,\r\n folderUploadAllowDrop: this.store.uiProps.folderUploadAllowDrop,\r\n }),\r\n onReadonlyDropRejected: source => {\r\n this.store.flagDriveDropRejected(source)\r\n },\r\n })\r\n this.dragStore = toSignalStore(this.dragController)\r\n this.dragController.init()\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.dragController?.destroy()\r\n this.dragStore?.destroy()\r\n }\r\n\r\n // ── Drag-state signals ─────────────────────────────────────────────────────\r\n readonly isDragging = computed(\r\n () => this.dragStore?.state().isDragging ?? false,\r\n )\r\n readonly absoluteIsDragging = computed(\r\n () => this.dragStore?.state().absoluteIsDragging ?? false,\r\n )\r\n readonly absoluteHasBorder = computed(\r\n () => this.dragStore?.state().absoluteHasBorder ?? true,\r\n )\r\n\r\n readonly hasFiles = computed(() => this.store.files().size > 0)\r\n\r\n readonly showDropzoneFrame = computed(\r\n () =>\r\n this.absoluteHasBorder() &&\r\n !this.store.activeSource() &&\r\n !this.store.sourceOverlayOpen() &&\r\n !this.store.files().size,\r\n )\r\n\r\n readonly showSourceOverlay = computed(\r\n () =>\r\n this.hasFiles() &&\r\n (this.store.sourceOverlayOpen() ||\r\n this.store.sourceOverlayClosing() ||\r\n !!this.store.activeSource()),\r\n )\r\n\r\n readonly showBranding = computed(\r\n () =>\r\n !this.store.uiProps.mini &&\r\n this.store.uiProps.showBranding &&\r\n !this.store.activeSource() &&\r\n !this.hasFiles(),\r\n )\r\n\r\n readonly boxClass = computed(() => {\r\n const hasBorder = this.absoluteHasBorder()\r\n const dragging = this.isDragging()\r\n const absDragging = this.absoluteIsDragging()\r\n const showFrame = this.showDropzoneFrame()\r\n const dark = this.store.isDark()\r\n return cn(\r\n 'upup-relative upup-flex upup-flex-1 upup-flex-col upup-overflow-hidden upup-rounded-lg',\r\n {\r\n 'upup-border upup-border-[#0ea5e9]': hasBorder && !showFrame,\r\n 'upup-border-[#38bdf8] dark:upup-border-[#38bdf8]':\r\n hasBorder && !showFrame && dark,\r\n 'upup-border-dashed': !dragging && !showFrame,\r\n 'upup-bg-[#e0f2fe] upup-backdrop-blur-sm': absDragging && !dark,\r\n 'upup-bg-[#0b2a3a] upup-backdrop-blur-sm dark:upup-bg-[#0b2a3a]':\r\n absDragging && dark,\r\n },\r\n )\r\n })\r\n\r\n readonly offlineBannerClass = computed(() =>\r\n cn(\r\n 'upup-absolute upup-inset-x-0 upup-top-0 upup-z-30 upup-px-3 upup-py-1.5 upup-text-center upup-text-xs upup-font-medium upup-text-white upup-bg-yellow-500',\r\n { 'upup-bg-yellow-600': this.store.isDark() },\r\n ),\r\n )\r\n\r\n readonly toastClass = computed(() =>\r\n cn(\r\n 'upup-animate-informer-in upup-absolute upup-inset-x-4 upup-top-4 upup-z-30 upup-flex upup-items-center upup-gap-2.5 upup-rounded-xl upup-px-3.5 upup-py-2.5 upup-text-[13px] upup-leading-snug upup-ring-1',\r\n this.store.isDark()\r\n ? 'upup-bg-rose-500/[0.14] upup-text-rose-200 upup-ring-rose-400/30'\r\n : 'upup-bg-rose-50 upup-text-rose-700 upup-ring-rose-300/60',\r\n ),\r\n )\r\n\r\n readonly dropRejectedText = computed(() =>\r\n formatUiMessage(this.store.translations().dropRejected, {\r\n provider: this.store.dropRejected() ?? '',\r\n }),\r\n )\r\n\r\n readonly dragOverlayClass = computed(() =>\r\n cn(\r\n 'upup-animate-fx-view upup-pointer-events-none upup-absolute upup-inset-0 upup-z-10 upup-flex upup-flex-col upup-items-center upup-justify-center upup-gap-3',\r\n this.store.isDark() ? 'upup-bg-[#0b1220]/70' : 'upup-bg-white/70',\r\n ),\r\n )\r\n\r\n readonly dragBadgeClass = computed(() =>\r\n cn(\r\n 'upup-flex upup-h-16 upup-w-16 upup-items-center upup-justify-center upup-rounded-2xl',\r\n this.store.isDark()\r\n ? 'upup-bg-[#38bdf8]/15 upup-text-[#38bdf8]'\r\n : 'upup-bg-[#0284c7]/10 upup-text-[#0284c7]',\r\n ),\r\n )\r\n\r\n readonly dragTextClass = computed(() =>\r\n cn(\r\n 'upup-text-[15px] upup-font-semibold',\r\n this.store.isDark() ? 'upup-text-[#e2e8f0]' : 'upup-text-[#0f172a]',\r\n ),\r\n )\r\n\r\n readonly overlayClass = computed(() =>\r\n cn(\r\n 'upup-absolute upup-inset-x-3 upup-bottom-3 upup-top-11 upup-z-20 upup-flex upup-flex-col upup-overflow-hidden upup-rounded-2xl upup-ring-1 upup-ring-inset upup-backdrop-blur-md',\r\n this.store.sourceOverlayClosing()\r\n ? 'upup-fx-overlay-close-slide upup-pointer-events-none'\r\n : 'upup-fx-overlay-slide',\r\n this.store.isDark()\r\n ? 'upup-bg-[#0b1220]/[0.85] upup-ring-white/[0.08] upup-shadow-[0_-18px_40px_-18px_rgba(0,0,0,0.65)]'\r\n : 'upup-bg-white/[0.85] upup-ring-black/[0.08] upup-shadow-[0_-18px_40px_-18px_rgba(15,23,42,0.25)]',\r\n ),\r\n )\r\n\r\n readonly gripBarClass = computed(() =>\r\n cn(\r\n 'upup-h-1 upup-w-10 upup-rounded-full',\r\n this.store.isDark() ? 'upup-bg-white/20' : 'upup-bg-black/20',\r\n ),\r\n )\r\n\r\n frameStroke(): string {\r\n const dark = this.store.isDark()\r\n const dragging = this.absoluteIsDragging()\r\n if (dark)\r\n return dragging ? 'rgba(56,189,248,0.65)' : 'rgba(56,189,248,0.35)'\r\n return dragging ? 'rgba(2,132,199,0.7)' : 'rgba(2,132,199,0.4)'\r\n }\r\n\r\n builtByClass(): string {\r\n return cn(\r\n 'upup-mr-0.5 upup-text-xs upup-leading-5 upup-text-[#6D6D6D] md:upup-text-sm',\r\n {\r\n 'upup-text-gray-300 dark:upup-text-gray-300':\r\n this.store.isDark(),\r\n },\r\n )\r\n }\r\n\r\n readonly uploadAnnouncement = computed(() => {\r\n const tr = this.store.translations()\r\n const status = this.store.uploadStatus()\r\n return status === UploadStatus.UPLOADING\r\n ? tr.announceUploadStarted\r\n : status === UploadStatus.SUCCESSFUL\r\n ? tr.announceUploadComplete\r\n : status === UploadStatus.FAILED\r\n ? tr.announceUploadFailed\r\n : ''\r\n })\r\n\r\n // ── Drag handlers ──────────────────────────────────────────────────────────\r\n handleDragOver(e: DragEvent): void {\r\n this.dragController.handleDragOver(e)\r\n }\r\n handleDragLeave(e: DragEvent): void {\r\n this.dragController.handleDragLeave(e)\r\n }\r\n handleDrop(e: DragEvent): Promise<void> {\r\n return this.dragController.handleDrop(e)\r\n }\r\n handlePaste(e: ClipboardEvent): void {\r\n this.dragController.handlePaste(e)\r\n }\r\n\r\n // ── Sheet overlay handlers ─────────────────────────────────────────────────\r\n onOverlayKeydown(e: KeyboardEvent): void {\r\n if (e.key === 'Escape' && !this.store.sourceOverlayClosing())\r\n this.store.closeSourceOverlay()\r\n }\r\n\r\n onGripClick(): void {\r\n if (!this.swiped) this.store.closeSourceOverlay()\r\n this.swiped = false\r\n }\r\n\r\n onGripPointerDown(e: PointerEvent): void {\r\n this.swipeStartY = e.clientY\r\n ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\r\n }\r\n\r\n onGripPointerMove(e: PointerEvent): void {\r\n const startY = this.swipeStartY\r\n const sheet = this.overlayRef?.nativeElement\r\n if (startY === null || !sheet) return\r\n const dy = Math.max(0, e.clientY - startY)\r\n sheet.style.transition = 'none'\r\n sheet.style.transform = `translateY(${dy}px)`\r\n }\r\n\r\n onGripPointerUp(e: PointerEvent): void {\r\n const startY = this.swipeStartY\r\n const sheet = this.overlayRef?.nativeElement\r\n this.swipeStartY = null\r\n if (startY === null || !sheet) return\r\n const dy = Math.max(0, e.clientY - startY)\r\n sheet.style.transition = ''\r\n sheet.style.transform = ''\r\n if (dy > 72) {\r\n this.swiped = true\r\n this.store.closeSourceOverlay()\r\n }\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n PLATFORM_ID,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core'\r\nimport { isPlatformBrowser } from '@angular/common'\r\nimport { cn } from '@useupup/core/internal'\r\nimport type { CoreEvents } from '@useupup/core/internal'\r\nimport { UpupStore } from './upup-store.service'\r\nimport { SourceViewHeaderExtraService } from './context/source-view-header-extra.service'\r\nimport type { UploaderProps } from './shared/types'\r\nimport type { UploadFile } from '@useupup/core'\r\nimport { UploaderPanelComponent } from './components/uploader-panel.component'\r\nimport { ImageEditorStubComponent } from './components/image-editor-stub.component'\r\n\r\n// The event column is typed against the CoreEvents catalog (F-723): a retired\r\n// or misspelled event name in this table is now a compile error, not a\r\n// silently-dead forwarding row.\r\nconst FORWARDED: ReadonlyArray<\r\n readonly [\r\n keyof CoreEvents,\r\n (\r\n | 'filesAdded'\r\n | 'fileRemoved'\r\n | 'uploadProgress'\r\n | 'uploadAllComplete'\r\n | 'error'\r\n ),\r\n ]\r\n> = [\r\n ['files-added', 'filesAdded'],\r\n ['file-removed', 'fileRemoved'],\r\n ['upload-progress', 'uploadProgress'],\r\n ['upload-all-complete', 'uploadAllComplete'],\r\n // The `error` output now sources the single upload-failure channel (upload-error),\r\n // so it fires for every upload failure — not the practically-dead resume-only path.\r\n ['upload-error', 'error'],\r\n]\r\n\r\n@Component({\r\n selector: 'upup-uploader',\r\n standalone: true,\r\n providers: [UpupStore, SourceViewHeaderExtraService],\r\n imports: [UploaderPanelComponent, ImageEditorStubComponent],\r\n template: `\r\n <div\r\n class=\"upup-scope upup-h-full upup-w-full\"\r\n [class]=\"store.uiProps?.className ?? ''\"\r\n [style]=\"store.uiProps?.style ?? {}\"\r\n data-testid=\"upup-root\"\r\n data-upup-slot=\"root\"\r\n [attr.data-state]=\"(store.uploadStatus?.() ?? 'idle').toLowerCase()\"\r\n [attr.lang]=\"store.lang ?? null\"\r\n [attr.dir]=\"store.dir\"\r\n >\r\n @if (storeReady) {\r\n <div\r\n [class]=\"sizingClass()\"\r\n [style]=\"store.uiProps?.mini ? 'aspect-ratio: 1 / 1' : null\"\r\n >\r\n <section\r\n data-testid=\"upup-container\"\r\n aria-labelledby=\"drop-instructions\"\r\n [class]=\"containerClass()\"\r\n >\r\n <upup-uploader-panel />\r\n\r\n @if (store.uiProps?.imageEditor?.enabled) {\r\n <upup-image-editor-stub />\r\n }\r\n </section>\r\n </div>\r\n }\r\n <!-- /storeReady -->\r\n\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [attr.accept]=\"store.uiProps?.allowedFileTypes ?? null\"\r\n [attr.multiple]=\"store.uiProps?.multiple ? '' : null\"\r\n style=\"display: none\"\r\n data-testid=\"upup-file-input\"\r\n (change)=\"onInputChange($event)\"\r\n />\r\n </div>\r\n `,\r\n})\r\nexport class UpupUploaderComponent implements OnInit, AfterViewInit {\r\n readonly store = inject(UpupStore)\r\n private readonly destroyRef = inject(DestroyRef)\r\n private readonly platformId = inject(PLATFORM_ID)\r\n private started = false\r\n private forwardUnsubs: Array<() => void> = []\r\n /** True only after the store has been initialized (browser only). Gate for template rendering. */\r\n storeReady = false\r\n\r\n @ViewChild('fileInput') fileInputRef?: ElementRef<HTMLInputElement>\r\n\r\n @Input() set config(value: UploaderProps) {\r\n this.store.setConfig(value)\r\n if (this.started) {\r\n // re-init on config change (mirrors vanilla's config setter); re-wire to the NEW core\r\n this.store.destroy()\r\n this.store.init()\r\n this.storeReady = true\r\n this.wireOutputs()\r\n // Re-register file input after re-init (destroy clears the cached inputEl)\r\n if (this.fileInputRef?.nativeElement) {\r\n this.store.registerFileInput(this.fileInputRef.nativeElement)\r\n }\r\n }\r\n }\r\n\r\n @Output() filesAdded = new EventEmitter<UploadFile[]>()\r\n @Output() fileRemoved = new EventEmitter<UploadFile>()\r\n @Output() uploadProgress = new EventEmitter<{\r\n fileId: string\r\n loaded: number\r\n total: number\r\n }>()\r\n @Output() uploadAllComplete = new EventEmitter<UploadFile[]>()\r\n @Output() error = new EventEmitter<{ error: Error; file?: UploadFile }>()\r\n\r\n ngOnInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return // SSR-safe: no init on the server\r\n this.store.init()\r\n this.started = true\r\n this.storeReady = true\r\n this.wireOutputs()\r\n this.destroyRef.onDestroy(() => {\r\n this.forwardUnsubs.forEach(u => {\r\n u()\r\n })\r\n this.forwardUnsubs = []\r\n this.store.destroy()\r\n })\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return\r\n if (this.fileInputRef?.nativeElement) {\r\n this.store.registerFileInput(this.fileInputRef.nativeElement)\r\n }\r\n }\r\n\r\n onInputChange(e: Event): void {\r\n const t = e.target as HTMLInputElement\r\n if (t.files?.length) {\r\n void this.store.handleSetSelectedFiles(Array.from(t.files))\r\n t.value = ''\r\n }\r\n }\r\n\r\n // ── Computed class helpers ────────────────────────────────────────────────\r\n sizingClass(): string {\r\n const mini = this.store.uiProps?.mini\r\n return cn('upup-w-full', {\r\n 'upup-h-[480px] upup-max-w-[600px]': !mini,\r\n 'upup-h-auto upup-max-w-[280px]': mini,\r\n })\r\n }\r\n\r\n containerClass(): string {\r\n const dark = this.store.isDark?.() ?? false\r\n const mini = this.store.uiProps?.mini\r\n const slotOverrides = this.store.slotOverrides?.() ?? {}\r\n\r\n return cn(\r\n `upup-panel-sheen upup-relative ${\r\n dark\r\n ? 'upup-panel-sheen-dark upup-bg-gradient-to-b upup-from-[#141b2e] upup-to-[#0a0e1a] upup-ring-1 upup-ring-white/10 upup-shadow-[0_24px_70px_-24px_rgba(2,6,23,0.85)]'\r\n : 'upup-bg-gradient-to-b upup-from-white upup-to-slate-50 upup-ring-1 upup-ring-slate-200 upup-shadow-[0_20px_60px_-24px_rgba(15,23,42,0.18)]'\r\n } upup-flex upup-h-full upup-w-full upup-select-none upup-flex-col upup-gap-3 upup-overflow-hidden upup-rounded-2xl upup-px-5 upup-py-4`,\r\n {\r\n [slotOverrides['containerFull'] ?? '']: !!(\r\n slotOverrides['containerFull'] && !mini\r\n ),\r\n\r\n [slotOverrides['containerMini'] ?? '']: !!(\r\n slotOverrides['containerMini'] && mini\r\n ),\r\n },\r\n )\r\n }\r\n\r\n private wireOutputs(): void {\r\n this.forwardUnsubs.forEach(u => {\r\n u()\r\n })\r\n this.forwardUnsubs = []\r\n for (const [evt, out] of FORWARDED) {\r\n this.forwardUnsubs.push(\r\n this.store.core.on(evt, (payload: unknown) => {\r\n ;(this[out] as EventEmitter<unknown>).emit(payload)\r\n }),\r\n )\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["t","plural"],"mappings":"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"}