@masters-union/union-stack 0.1.6 → 0.1.8
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.
- package/dist/cdn/loader.v1.global.js +179 -3
- package/dist/cdn/loader.v1.global.js.map +1 -1
- package/dist/{chunk-JVO23MPP.js → chunk-4ZN7SILU.js} +7 -4
- package/dist/chunk-4ZN7SILU.js.map +1 -0
- package/dist/{chunk-35YVTMRN.cjs → chunk-PCVJ4TVQ.cjs} +7 -4
- package/dist/chunk-PCVJ4TVQ.cjs.map +1 -0
- package/dist/{client-AMBRkgCm.d.cts → client-CrIecUWp.d.cts} +27 -8
- package/dist/{client-AMBRkgCm.d.ts → client-CrIecUWp.d.ts} +27 -8
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/picker.cjs +879 -52
- package/dist/picker.cjs.map +1 -1
- package/dist/picker.d.cts +17 -2
- package/dist/picker.d.ts +17 -2
- package/dist/picker.js +879 -52
- package/dist/picker.js.map +1 -1
- package/dist/react.cjs +2 -2
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-35YVTMRN.cjs.map +0 -1
- package/dist/chunk-JVO23MPP.js.map +0 -1
package/dist/picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/picker/styles.ts","../src/picker/picker.ts"],"names":["el","item"],"mappings":"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","file":"picker.js","sourcesContent":["import type { PickerTheme } from './types.js';\n\nconst STYLE_ID = 'unionstack-picker-styles';\n\n/** Inject the picker stylesheet once. Idempotent — safe to call on every open. */\nexport function ensureStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n el.textContent = BASE_CSS;\n document.head.appendChild(el);\n}\n\n/** Resolve a (possibly partial) theme into the CSS variables the picker reads. */\nexport function themeToCssVars(theme: PickerTheme | undefined): Record<string, string> {\n const mode = theme?.mode || 'light';\n const defaults = mode === 'dark' ? DARK_DEFAULTS : LIGHT_DEFAULTS;\n return {\n '--us-primary': theme?.primary ?? defaults.primary,\n '--us-bg': theme?.background ?? defaults.background,\n '--us-fg': theme?.foreground ?? defaults.foreground,\n '--us-muted': defaults.muted,\n '--us-subtle': defaults.subtle,\n '--us-border': theme?.border ?? defaults.border,\n '--us-border-strong': defaults.borderStrong,\n '--us-elevated': defaults.elevated,\n '--us-success': defaults.success,\n '--us-danger': defaults.danger,\n '--us-radius': theme?.radius ?? '12px',\n };\n}\n\n// WCAG-verified pairs. Each token has a deliberate role; nothing here is by\n// vibes alone.\nconst LIGHT_DEFAULTS = {\n primary: '#4f46e5', // indigo-600 — confident, restrained\n background: '#ffffff',\n foreground: '#0f172a', // slate-900 — 15.4:1 on white\n muted: '#64748b', // slate-500 — 4.7:1 on white\n subtle: '#f8fafc', // slate-50 — chips, icon wells\n border: '#e2e8f0', // slate-200\n borderStrong: '#cbd5e1', // slate-300 — drag-over emphasis\n elevated: '#ffffff',\n success: '#16a34a',\n danger: '#dc2626',\n};\n\nconst DARK_DEFAULTS = {\n primary: '#818cf8', // indigo-400 — desaturated for dark mode\n background: '#0b0f1a', // near-black, not pure\n foreground: '#f1f5f9', // slate-100 — 15:1 on bg\n muted: '#94a3b8', // slate-400 — 6.4:1 on bg\n subtle: '#111827', // slightly elevated surface\n border: '#1f2937',\n borderStrong: '#334155',\n elevated: '#0f1625',\n success: '#4ade80',\n danger: '#f87171',\n};\n\n// Everything is namespaced under `.us-picker` and uses CSS variables so the\n// host page's styles never leak in, and theme overrides flow cleanly.\nconst BASE_CSS = `\n.us-picker-backdrop {\n position: fixed; inset: 0; z-index: 2147483000;\n background: color-mix(in srgb, #02060f 55%, transparent);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n display: flex; align-items: center; justify-content: center;\n padding: 16px;\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n animation: us-fade 140ms ease-out;\n}\n@keyframes us-fade { from { opacity: 0; } to { opacity: 1; } }\n\n.us-picker {\n background: var(--us-bg); color: var(--us-fg);\n border: 1px solid var(--us-border);\n border-radius: var(--us-radius);\n width: 100%; max-width: 480px;\n max-height: min(calc(100dvh - 32px), 680px);\n display: flex; flex-direction: column;\n box-shadow:\n 0 1px 1px rgba(0,0,0,0.04),\n 0 18px 40px -8px rgba(0,0,0,0.18),\n 0 32px 80px -16px rgba(0,0,0,0.22);\n overflow: hidden;\n animation: us-rise 240ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes us-rise {\n from { opacity: 0; transform: translateY(8px) scale(0.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n.us-picker * { box-sizing: border-box; }\n\n/* ──────────────────── header ──────────────────── */\n.us-picker-header {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--us-border);\n}\n.us-picker-header-logo {\n display: inline-flex; align-items: center; justify-content: center;\n width: 28px; height: 28px; flex-shrink: 0;\n border-radius: 8px;\n background: var(--us-subtle);\n color: var(--us-primary);\n}\n.us-picker-header-logo svg { width: 16px; height: 16px; }\n.us-picker-header-logo img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }\n.us-picker-title { font-weight: 600; font-size: 14px; letter-spacing: -0.01em; flex: 1; }\n.us-picker-close {\n background: none; border: 0; cursor: pointer;\n width: 32px; height: 32px;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted); border-radius: 8px;\n transition: color 140ms, background 140ms;\n}\n.us-picker-close:hover { background: var(--us-subtle); color: var(--us-fg); }\n.us-picker-close:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 1px; }\n.us-picker-close svg { width: 16px; height: 16px; }\n\n/* ──────────────────── body / dropzone ──────────────────── */\n.us-picker-body { padding: 16px; overflow-y: auto; }\n\n.us-dropzone {\n position: relative;\n border: 1.5px dashed var(--us-border-strong);\n border-radius: calc(var(--us-radius) - 2px);\n padding: 28px 20px;\n text-align: center;\n cursor: pointer;\n transition: border-color 160ms, background 160ms, transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n background: color-mix(in srgb, var(--us-subtle) 60%, transparent);\n}\n.us-dropzone:hover {\n border-color: var(--us-primary);\n background: color-mix(in srgb, var(--us-primary) 4%, var(--us-bg));\n}\n.us-dropzone:focus-visible {\n outline: 2px solid var(--us-primary); outline-offset: 2px;\n}\n.us-dropzone[data-drag=\"over\"] {\n border-style: solid;\n border-color: var(--us-primary);\n background: color-mix(in srgb, var(--us-primary) 8%, var(--us-bg));\n transform: scale(1.005);\n}\n.us-dropzone-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--us-primary) 12%, var(--us-bg));\n color: var(--us-primary);\n display: inline-flex; align-items: center; justify-content: center;\n margin-bottom: 12px;\n transition: transform 240ms cubic-bezier(0.16, 1.4, 0.3, 1);\n}\n.us-dropzone:hover .us-dropzone-icon { transform: translateY(-2px); }\n.us-dropzone[data-drag=\"over\"] .us-dropzone-icon {\n transform: translateY(-3px) scale(1.06);\n background: color-mix(in srgb, var(--us-primary) 18%, var(--us-bg));\n}\n.us-dropzone-icon svg { width: 22px; height: 22px; }\n.us-dropzone-title {\n font-size: 14px; font-weight: 600; letter-spacing: -0.01em;\n margin-bottom: 2px;\n}\n.us-dropzone-hint { color: var(--us-muted); font-size: 12.5px; }\n.us-dropzone-constraints {\n margin-top: 10px;\n font-size: 11px; color: var(--us-muted);\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n letter-spacing: 0.02em;\n}\n\n.us-dropzone--compact {\n padding: 12px 16px;\n display: flex; align-items: center; gap: 12px;\n text-align: left;\n}\n.us-dropzone--compact .us-dropzone-icon {\n width: 32px; height: 32px; border-radius: 8px; margin-bottom: 0;\n}\n.us-dropzone--compact .us-dropzone-icon svg { width: 16px; height: 16px; }\n.us-dropzone--compact .us-dropzone-title { font-size: 13px; margin: 0; }\n.us-dropzone--compact .us-dropzone-hint { display: none; }\n.us-dropzone--compact .us-dropzone-constraints { display: none; }\n\n/* ──────────────────── file list ──────────────────── */\n.us-file-list { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }\n\n.us-file {\n display: flex; align-items: center; gap: 12px;\n padding: 10px 12px;\n background: var(--us-elevated);\n border: 1px solid var(--us-border);\n border-radius: 10px;\n transition: border-color 140ms, background 140ms;\n animation: us-row-in 280ms cubic-bezier(0.16, 1, 0.3, 1) backwards;\n position: relative;\n}\n@keyframes us-row-in {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.us-file[data-state=\"done\"] { border-color: color-mix(in srgb, var(--us-success) 30%, var(--us-border)); }\n.us-file[data-state=\"failed\"] { border-color: color-mix(in srgb, var(--us-danger) 30%, var(--us-border)); }\n\n.us-file-thumb {\n width: 40px; height: 40px; flex-shrink: 0;\n border-radius: 8px;\n background: var(--us-subtle);\n background-size: cover; background-position: center;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted);\n overflow: hidden;\n}\n.us-file-thumb[data-image=\"true\"] { color: transparent; }\n.us-file-thumb svg { width: 18px; height: 18px; }\n\n.us-file-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }\n.us-file-row1 { display: flex; align-items: center; gap: 8px; }\n.us-file-name {\n font-size: 13px; font-weight: 500;\n flex: 1; min-width: 0;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n letter-spacing: -0.005em;\n}\n.us-file-meta { color: var(--us-muted); font-size: 11.5px; flex-shrink: 0; font-variant-numeric: tabular-nums; }\n\n.us-file-progress {\n height: 3px; background: var(--us-border); border-radius: 999px; overflow: hidden;\n position: relative;\n}\n.us-file-progress-bar {\n height: 100%; width: 0%;\n background: var(--us-primary);\n border-radius: inherit;\n transition: width 260ms cubic-bezier(0.4, 0.0, 0.2, 1);\n position: relative;\n}\n/* Shimmer overlay while uploading. Stops on terminal states. */\n.us-file[data-state=\"uploading\"] .us-file-progress-bar::after {\n content: \"\"; position: absolute; inset: 0;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n color-mix(in srgb, #fff 35%, transparent) 50%,\n transparent 100%\n );\n animation: us-shimmer 1.4s linear infinite;\n}\n@keyframes us-shimmer {\n from { transform: translateX(-100%); }\n to { transform: translateX(100%); }\n}\n.us-file[data-state=\"done\"] .us-file-progress-bar { width: 100% !important; background: var(--us-success); }\n.us-file[data-state=\"failed\"] .us-file-progress-bar { background: var(--us-danger); }\n\n.us-file-status {\n flex-shrink: 0;\n display: inline-flex; align-items: center; justify-content: center;\n width: 24px; height: 24px;\n color: var(--us-muted);\n}\n.us-file-status svg { width: 18px; height: 18px; }\n.us-file[data-state=\"done\"] .us-file-status { color: var(--us-success); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }\n.us-file[data-state=\"failed\"] .us-file-status { color: var(--us-danger); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }\n.us-file[data-state=\"uploading\"] .us-file-status { animation: us-spin 0.9s linear infinite; }\n@keyframes us-pop {\n from { transform: scale(0.5); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n}\n@keyframes us-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* ──────────────────── actions / footer ──────────────────── */\n.us-actions {\n display: flex; gap: 8px; justify-content: space-between; align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--us-border);\n}\n.us-actions-summary { font-size: 12px; color: var(--us-muted); font-variant-numeric: tabular-nums; }\n.us-actions-buttons { display: flex; gap: 8px; }\n\n.us-btn {\n appearance: none;\n display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n padding: 8px 14px; min-height: 36px;\n border-radius: 8px; border: 1px solid var(--us-border);\n background: transparent; color: var(--us-fg);\n cursor: pointer; font-size: 13px; font-weight: 500;\n font-family: inherit; letter-spacing: -0.005em;\n transition: background 140ms, border-color 140ms, transform 80ms ease-out;\n}\n.us-btn:hover { background: var(--us-subtle); border-color: var(--us-border-strong); }\n.us-btn:active { transform: scale(0.98); }\n.us-btn:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 2px; }\n.us-btn-primary {\n background: var(--us-primary); color: white;\n border-color: var(--us-primary);\n}\n.us-btn-primary:hover { filter: brightness(0.95); background: var(--us-primary); }\n.us-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.us-btn[disabled]:hover { transform: none; }\n.us-btn svg { width: 14px; height: 14px; }\n\n.us-footer {\n padding: 8px 16px 12px;\n font-size: 11px; color: var(--us-muted); text-align: center;\n display: flex; align-items: center; justify-content: center; gap: 6px;\n}\n.us-footer svg { width: 11px; height: 11px; opacity: 0.7; }\n.us-footer a { color: var(--us-muted); text-decoration: none; font-weight: 500; }\n.us-footer a:hover { color: var(--us-fg); }\n\n/* ──────────────────── reduced motion ──────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .us-picker-backdrop,\n .us-picker,\n .us-file,\n .us-dropzone,\n .us-dropzone-icon,\n .us-btn,\n .us-file-status,\n .us-file-progress-bar { animation: none !important; transition: none !important; }\n .us-file[data-state=\"uploading\"] .us-file-progress-bar::after { animation: none; opacity: 0; }\n}\n\n/* ──────────────────── empty state niceties ──────────────────── */\n.us-file-list:empty { display: none; }\n`;\n","import type { UnionStackClient } from '../client.js';\nimport type { PickerConfig, UploadError } from '../types.js';\nimport type {\n PickResponse,\n PickedFile,\n PickerHandle,\n PickerOptions,\n UploadedFile,\n} from './types.js';\nimport { ensureStyles, themeToCssVars } from './styles.js';\n\n// Merge server-managed picker config with runtime options. Runtime options\n// always win — they're the explicit dev escape hatch.\nfunction mergeConfig(server: PickerConfig, runtime: PickerOptions): PickerOptions {\n const merged: PickerOptions = { ...runtime };\n\n // Branding: shallow merge, runtime wins per-field.\n const runtimeBranding = runtime.branding || {};\n merged.branding = {\n logoUrl: runtimeBranding.logoUrl ?? server.branding.logoUrl ?? undefined,\n title: runtimeBranding.title ?? server.branding.title ?? undefined,\n hideFooter: runtimeBranding.hideFooter ?? server.branding.hideFooter,\n // PickerBranding has no footerText today — keep server's value internal.\n };\n\n // Theme: shallow merge.\n const runtimeTheme = runtime.theme || {};\n merged.theme = {\n primary: runtimeTheme.primary ?? server.theme.primary ?? undefined,\n background: runtimeTheme.background ?? server.theme.background ?? undefined,\n foreground: runtimeTheme.foreground ?? server.theme.foreground ?? undefined,\n border: runtimeTheme.border ?? server.theme.border ?? undefined,\n radius: runtimeTheme.radius ?? server.theme.radius ?? undefined,\n mode: runtimeTheme.mode ?? server.theme.mode ?? undefined,\n };\n\n // Constraints inform the dropzone (accept attr, size cap).\n merged.maxFileSize = runtime.maxFileSize ?? server.constraints.maxFileSizeBytes;\n merged.maxFiles = runtime.maxFiles ?? server.constraints.maxFilesPerUpload;\n if (!runtime.accept && server.constraints.allowedMimeTypes?.length) {\n const types = server.constraints.allowedMimeTypes.filter(t => t !== '*/*');\n if (types.length > 0) merged.accept = types.join(',');\n }\n return merged;\n}\n\ntype FileItemState = 'queued' | 'uploading' | 'done' | 'failed' | 'cancelled';\n\ninterface FileItem {\n uploadId: string; // matches PickedFile.uploadId once described\n file: File;\n state: FileItemState;\n progress: number; // 0-100\n error?: string;\n uploaded?: UploadedFile;\n objectUrl?: string; // for image thumbnails (revoked on unmount)\n // DOM refs we mutate on progress.\n $row?: HTMLElement;\n $bar?: HTMLElement;\n $status?: HTMLElement;\n $meta?: HTMLElement;\n}\n\nconst DEFAULT_TITLE = 'Upload files';\nconst FOOTER_LINK = 'https://unionstack.link';\n\n// ──────────────────────────────────────────────────────────────────\n// Inline SVG icons. Single source — Lucide-style, 1.5px stroke, 24px\n// viewBox. Keeping them as string templates so the picker bundle has\n// no asset/image dependencies.\n// ──────────────────────────────────────────────────────────────────\nconst ICON = {\n upload: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n close: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`,\n check: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n alert: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`,\n spinner: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" opacity=\"0.2\"/><path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\"/></svg>`,\n image: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>`,\n video: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\"/></svg>`,\n audio: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/></svg>`,\n pdf: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/><line x1=\"9\" y1=\"17\" x2=\"13\" y2=\"17\"/></svg>`,\n archive: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"5\" rx=\"2\"/><path d=\"M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9\"/><line x1=\"10\" y1=\"13\" x2=\"14\" y2=\"13\"/></svg>`,\n file: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`,\n zap: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg>`,\n};\n\nfunction iconForMime(mime: string): string {\n if (!mime) return ICON.file;\n if (mime.startsWith('image/')) return ICON.image;\n if (mime.startsWith('video/')) return ICON.video;\n if (mime.startsWith('audio/')) return ICON.audio;\n if (mime === 'application/pdf') return ICON.pdf;\n if (\n mime.startsWith('application/zip') ||\n mime.includes('compressed') ||\n mime === 'application/x-tar' ||\n mime === 'application/gzip'\n ) return ICON.archive;\n return ICON.file;\n}\n\n/**\n * Single-shot file picker modal. Built imperatively (no framework) so it can\n * be lazy-loaded by either the vanilla SDK or the React wrapper.\n */\nexport class Picker {\n private $backdrop: HTMLElement | null = null;\n private $list: HTMLElement | null = null;\n private $confirm: HTMLButtonElement | null = null;\n private $cancel: HTMLButtonElement | null = null;\n private $closeBtn: HTMLButtonElement | null = null;\n private $input: HTMLInputElement | null = null;\n\n private items: FileItem[] = [];\n private abortCtrl = new AbortController();\n private uploadStarted = false;\n private resolved = false;\n private resolvePromise!: (r: PickResponse) => void;\n private donePromise: Promise<PickResponse>;\n\n constructor(\n private client: UnionStackClient,\n private opts: PickerOptions,\n ) {\n this.donePromise = new Promise<PickResponse>(res => { this.resolvePromise = res; });\n }\n\n // ---- public api ---------------------------------------------------------\n\n async open(): Promise<PickResponse> {\n if (typeof document === 'undefined') {\n throw new Error('[union-stack] Picker requires a browser environment.');\n }\n // Pull server-side branding/theme defaults before painting the modal.\n // Runtime opts win over server config — see mergeConfig below.\n try {\n const serverConfig = await this.client.pickerConfigPromise;\n if (serverConfig) this.opts = mergeConfig(serverConfig, this.opts);\n } catch { /* fall through with whatever opts the caller passed */ }\n\n ensureStyles();\n this.mount();\n this.opts.onOpen?.();\n return this.donePromise;\n }\n\n close(): void {\n this.unmount();\n // Resolve with whatever was collected so callers awaiting open() never hang.\n if (!this.resolved) this.resolveResult();\n }\n\n cancel(): void {\n this.abortCtrl.abort();\n this.opts.onCancel?.();\n this.close();\n }\n\n // ---- mount / dom --------------------------------------------------------\n\n private $summary: HTMLElement | null = null;\n\n private mount() {\n const root = document.createElement('div');\n root.className = 'us-picker-backdrop';\n Object.entries(themeToCssVars(this.opts.theme)).forEach(([k, v]) => {\n root.style.setProperty(k, v);\n });\n root.addEventListener('click', e => {\n if (e.target === root && !this.uploadStarted) this.cancel();\n });\n\n const panel = el('div', 'us-picker');\n\n // ─── Header ────────────────────────────────────────────────────\n const header = el('div', 'us-picker-header');\n const logoWrap = el('div', 'us-picker-header-logo');\n if (this.opts.branding?.logoUrl) {\n const logo = document.createElement('img');\n logo.src = this.opts.branding.logoUrl;\n logo.alt = '';\n logoWrap.appendChild(logo);\n } else {\n logoWrap.innerHTML = ICON.zap;\n }\n header.appendChild(logoWrap);\n\n const title = el('div', 'us-picker-title', this.opts.branding?.title ?? DEFAULT_TITLE);\n header.appendChild(title);\n\n this.$closeBtn = document.createElement('button');\n this.$closeBtn.type = 'button';\n this.$closeBtn.className = 'us-picker-close';\n this.$closeBtn.setAttribute('aria-label', 'Close');\n this.$closeBtn.innerHTML = ICON.close;\n this.$closeBtn.onclick = () => this.cancel();\n header.appendChild(this.$closeBtn);\n panel.appendChild(header);\n\n // ─── Body ──────────────────────────────────────────────────────\n const body = el('div', 'us-picker-body');\n body.appendChild(this.renderDropzone());\n this.$list = el('div', 'us-file-list');\n body.appendChild(this.$list);\n panel.appendChild(body);\n\n // ─── Actions ───────────────────────────────────────────────────\n const autoUpload = this.opts.autoUpload !== false;\n const actions = el('div', 'us-actions');\n\n this.$summary = el('div', 'us-actions-summary', '');\n actions.appendChild(this.$summary);\n\n const buttons = el('div', 'us-actions-buttons');\n this.$cancel = document.createElement('button');\n this.$cancel.type = 'button';\n this.$cancel.className = 'us-btn';\n this.$cancel.textContent = 'Cancel';\n this.$cancel.onclick = () => this.cancel();\n buttons.appendChild(this.$cancel);\n\n if (!autoUpload) {\n this.$confirm = document.createElement('button');\n this.$confirm.type = 'button';\n this.$confirm.className = 'us-btn us-btn-primary';\n this.$confirm.innerHTML = `${ICON.upload} <span>Upload</span>`;\n this.$confirm.disabled = true;\n this.$confirm.onclick = () => this.startUpload();\n buttons.appendChild(this.$confirm);\n }\n actions.appendChild(buttons);\n panel.appendChild(actions);\n\n // ─── Footer ────────────────────────────────────────────────────\n if (!this.opts.branding?.hideFooter) {\n const footer = el('div', 'us-footer');\n footer.innerHTML =\n `${ICON.zap} <span>Powered by <a href=\"${FOOTER_LINK}\" target=\"_blank\" rel=\"noopener\">UnionStack</a></span>`;\n panel.appendChild(footer);\n }\n\n root.appendChild(panel);\n (this.opts.container ?? document.body).appendChild(root);\n this.$backdrop = root;\n }\n\n private renderDropzone(): HTMLElement {\n const dz = el('div', 'us-dropzone');\n dz.setAttribute('role', 'button');\n dz.setAttribute('tabindex', '0');\n dz.setAttribute('aria-label', 'Drop files here or click to browse');\n\n const icon = el('div', 'us-dropzone-icon');\n icon.innerHTML = ICON.upload;\n dz.appendChild(icon);\n\n dz.appendChild(el('div', 'us-dropzone-title', 'Drop files to upload'));\n dz.appendChild(el('div', 'us-dropzone-hint', 'or click to browse from your device'));\n\n // Constraints line — surfaces max file size + accepted types so users\n // know the rules before they pick something that gets rejected.\n const constraintBits: string[] = [];\n if (this.opts.maxFileSize) constraintBits.push(`max ${formatBytes(this.opts.maxFileSize)}`);\n if (this.opts.accept) {\n const types = this.opts.accept\n .split(',')\n .map(s => s.trim())\n .filter(s => s && s !== '*/*')\n .map(s => s.replace('/*', ''));\n if (types.length > 0 && types.length <= 4) {\n constraintBits.push(types.join(' · '));\n }\n }\n if (constraintBits.length > 0) {\n dz.appendChild(el('div', 'us-dropzone-constraints', constraintBits.join(' · ')));\n }\n\n const input = document.createElement('input');\n input.type = 'file';\n input.multiple = (this.opts.maxFiles ?? 10) > 1;\n if (this.opts.accept) input.accept = this.opts.accept;\n input.style.display = 'none';\n input.onchange = () => {\n if (input.files) this.addFiles(Array.from(input.files));\n input.value = '';\n };\n this.$input = input;\n dz.appendChild(input);\n\n dz.onclick = () => input.click();\n dz.onkeydown = e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); input.click(); }\n };\n\n dz.addEventListener('dragover', e => {\n e.preventDefault();\n dz.setAttribute('data-drag', 'over');\n });\n dz.addEventListener('dragleave', () => dz.removeAttribute('data-drag'));\n dz.addEventListener('drop', e => {\n e.preventDefault();\n dz.removeAttribute('data-drag');\n const dropped = e.dataTransfer?.files;\n if (dropped) this.addFiles(Array.from(dropped));\n });\n\n return dz;\n }\n\n private unmount() {\n if (this.$backdrop?.parentNode) this.$backdrop.parentNode.removeChild(this.$backdrop);\n this.$backdrop = null;\n // Release any image-thumbnail object URLs we created.\n for (const item of this.items) {\n if (item.objectUrl) URL.revokeObjectURL(item.objectUrl);\n }\n this.opts.onClose?.();\n }\n\n // ---- file selection -----------------------------------------------------\n\n private addFiles(files: File[]) {\n const cap = this.opts.maxFiles ?? Infinity;\n const remaining = cap - this.items.length;\n if (remaining <= 0) return;\n const chosen = files.slice(0, remaining);\n\n for (const file of chosen) {\n if (this.opts.maxFileSize && file.size > this.opts.maxFileSize) {\n // Skip the file but surface a row in the list so the user sees why.\n const item: FileItem = {\n uploadId: cryptoId(),\n file, state: 'failed', progress: 0,\n error: `File exceeds ${formatBytes(this.opts.maxFileSize)} limit`,\n };\n this.items.push(item);\n this.renderItem(item);\n continue;\n }\n\n const item: FileItem = {\n uploadId: cryptoId(),\n file, state: 'queued', progress: 0,\n };\n this.items.push(item);\n this.renderItem(item);\n }\n\n this.refreshConfirm();\n\n // Auto-upload: kick off as soon as the selection is complete. Deferred a\n // frame so the just-added rows render before \"uploading…\" status flips on.\n const autoUpload = this.opts.autoUpload !== false;\n const hasQueued = this.items.some(i => i.state === 'queued');\n if (autoUpload && hasQueued && !this.uploadStarted) {\n requestAnimationFrame(() => {\n if (!this.uploadStarted) this.startUpload();\n });\n }\n }\n\n private renderItem(item: FileItem) {\n if (!this.$list) return;\n\n const row = el('div', 'us-file');\n row.dataset.state = item.state;\n row.dataset.uploadId = item.uploadId;\n // Stagger entrance so multiple files don't all pop in at once. Cap delay\n // so a 50-file drop doesn't take forever to fully render.\n const idx = Math.min(this.items.length - 1, 8);\n row.style.animationDelay = `${idx * 35}ms`;\n\n // Thumbnail: image preview for image MIMEs, type-specific icon otherwise.\n const thumb = el('div', 'us-file-thumb');\n if (item.file.type.startsWith('image/') && typeof URL !== 'undefined' && URL.createObjectURL) {\n try {\n const objectUrl = URL.createObjectURL(item.file);\n item.objectUrl = objectUrl;\n thumb.style.backgroundImage = `url(\"${objectUrl}\")`;\n thumb.dataset.image = 'true';\n } catch {\n thumb.innerHTML = iconForMime(item.file.type);\n }\n } else {\n thumb.innerHTML = iconForMime(item.file.type);\n }\n row.appendChild(thumb);\n\n // Main column: name + meta (with progress bar tucked under)\n const main = el('div', 'us-file-main');\n\n const row1 = el('div', 'us-file-row1');\n row1.appendChild(el('div', 'us-file-name', item.file.name));\n const meta = el('div', 'us-file-meta', formatBytes(item.file.size));\n row1.appendChild(meta);\n main.appendChild(row1);\n\n const progress = el('div', 'us-file-progress');\n const bar = el('div', 'us-file-progress-bar');\n progress.appendChild(bar);\n main.appendChild(progress);\n\n row.appendChild(main);\n\n // Status icon (spinner / check / alert)\n const status = el('div', 'us-file-status');\n status.setAttribute('aria-label', this.statusLabel(item));\n status.innerHTML = this.statusIcon(item.state);\n row.appendChild(status);\n\n item.$row = row;\n item.$bar = bar;\n item.$status = status;\n item.$meta = meta;\n\n this.$list.appendChild(row);\n this.updateSummary();\n }\n\n private statusIcon(state: FileItemState): string {\n switch (state) {\n case 'uploading': return ICON.spinner;\n case 'done': return ICON.check;\n case 'failed': return ICON.alert;\n case 'cancelled': return ICON.alert;\n default: return ICON.spinner; // queued — also spinner (waiting)\n }\n }\n\n private statusLabel(item: FileItem): string {\n switch (item.state) {\n case 'queued': return 'Waiting to upload';\n case 'uploading': return `Uploading ${Math.round(item.progress)} percent`;\n case 'done': return 'Upload complete';\n case 'failed': return item.error ? `Failed: ${item.error}` : 'Upload failed';\n case 'cancelled': return 'Cancelled';\n }\n }\n\n private setItemState(item: FileItem, state: FileItemState, progress?: number) {\n item.state = state;\n if (progress !== undefined) item.progress = progress;\n if (item.$row) item.$row.dataset.state = state;\n if (item.$bar) item.$bar.style.width = `${item.progress}%`;\n if (item.$status) {\n item.$status.innerHTML = this.statusIcon(state);\n item.$status.setAttribute('aria-label', this.statusLabel(item));\n }\n if (item.$meta) {\n // Augment the meta line with live state — keeps the eye on a single spot\n // for \"what's happening\" without adding another text row.\n const size = formatBytes(item.file.size);\n switch (state) {\n case 'uploading':\n item.$meta.textContent = `${size} · ${Math.round(item.progress)}%`;\n break;\n case 'done':\n item.$meta.textContent = size;\n break;\n case 'failed':\n item.$meta.textContent = item.error || 'Failed';\n break;\n default:\n item.$meta.textContent = size;\n }\n }\n this.updateSummary();\n }\n\n private updateSummary() {\n if (!this.$summary) return;\n const total = this.items.length;\n if (total === 0) { this.$summary.textContent = ''; return; }\n const done = this.items.filter(i => i.state === 'done').length;\n const failed = this.items.filter(i => i.state === 'failed').length;\n const active = this.items.filter(i => i.state === 'uploading' || i.state === 'queued').length;\n if (active > 0) {\n this.$summary.textContent = `Uploading ${done + 1} of ${total}`;\n } else if (failed > 0) {\n this.$summary.textContent = `${done} of ${total} uploaded · ${failed} failed`;\n } else if (done === total) {\n this.$summary.textContent = `${total} file${total === 1 ? '' : 's'} uploaded`;\n } else {\n this.$summary.textContent = `${total} file${total === 1 ? '' : 's'} ready`;\n }\n }\n\n private refreshConfirm() {\n if (!this.$confirm) return;\n const queued = this.items.filter(i => i.state === 'queued').length;\n this.$confirm.disabled = queued === 0 || this.uploadStarted;\n }\n\n // ---- upload -------------------------------------------------------------\n\n private async startUpload() {\n if (this.uploadStarted) return;\n const queued = this.items.filter(i => i.state === 'queued');\n if (queued.length === 0) return;\n\n this.uploadStarted = true;\n if (this.$confirm) {\n this.$confirm.disabled = true;\n this.$confirm.textContent = 'Uploading…';\n }\n if (this.$cancel) this.$cancel.textContent = 'Stop';\n if (this.$closeBtn) this.$closeBtn.disabled = true;\n if (this.$input) this.$input.disabled = true;\n\n // Map PickedFile.uploadId → FileItem so callbacks update the right row.\n const itemByUploadId = new Map<string, FileItem>();\n const filesToUpload = queued.map(i => i.file);\n\n try {\n await this.client.uploadMany(filesToUpload, {\n ...this.opts,\n signal: this.abortCtrl.signal,\n onUploadStarted: (pickedFiles: PickedFile[]) => {\n // Pair each PickedFile to the queued FileItem in order.\n pickedFiles.forEach((p, idx) => {\n const item = queued[idx];\n if (item) {\n item.uploadId = p.uploadId;\n if (item.$row) item.$row.dataset.uploadId = p.uploadId;\n itemByUploadId.set(p.uploadId, item);\n }\n });\n this.opts.onUploadStarted?.(pickedFiles);\n },\n onFileUploadStarted: p => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) this.setItemState(item, 'uploading', 0);\n this.opts.onFileUploadStarted?.(p);\n },\n onFileUploadProgress: (p, ev) => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) this.setItemState(item, 'uploading', ev.totalPercent);\n this.opts.onFileUploadProgress?.(p, ev);\n },\n onFileUploadFinished: f => {\n const item = itemByUploadId.get(f.uploadId);\n if (item) {\n item.uploaded = f;\n this.setItemState(item, 'done', 100);\n }\n this.opts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (p, err) => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) {\n item.error = err.message;\n this.setItemState(item, 'failed');\n }\n this.opts.onFileUploadFailed?.(p, err);\n },\n onUploadDone: r => {\n this.opts.onUploadDone?.(r);\n this.resolveResult(r);\n this.unmount();\n },\n onError: (err: UploadError) => {\n this.opts.onError?.(err);\n this.resolveResult();\n this.unmount();\n },\n });\n } catch {\n // Errors already surfaced via onError / onFileUploadFailed.\n if (!this.resolved) {\n this.resolveResult();\n this.unmount();\n }\n }\n }\n\n private resolveResult(result?: PickResponse) {\n if (this.resolved) return;\n this.resolved = true;\n const fallback: PickResponse = result ?? {\n filesUploaded: this.items.filter(i => i.uploaded).map(i => i.uploaded!),\n filesFailed: this.items\n .filter(i => i.state === 'failed')\n .map(i => ({\n file: {\n uploadId: i.uploadId,\n filename: i.file.name,\n mimetype: i.file.type || 'application/octet-stream',\n size: i.file.size,\n source: 'local',\n },\n error: {\n code: 'VALIDATION',\n message: i.error || 'failed',\n retryable: false,\n },\n })),\n };\n this.resolvePromise(fallback);\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction el(tag: string, className: string, text?: string): HTMLElement {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;\n}\n\nfunction cryptoId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return (crypto as { randomUUID: () => string }).randomUUID().replace(/-/g, '');\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport function openPicker(client: UnionStackClient, opts: PickerOptions): PickerHandle {\n const picker = new Picker(client, opts);\n return {\n open: () => picker.open(),\n close: () => picker.close(),\n cancel: () => picker.cancel(),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/picker/styles.ts","../src/picker/imageEditor.ts","../src/picker/picker.ts"],"names":["el","ICON","item"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"picker.js","sourcesContent":["import type { PickerTheme } from './types.js';\n\nconst STYLE_ID = 'unionstack-picker-styles';\n\n/** Inject the picker stylesheet once. Idempotent — safe to call on every open. */\nexport function ensureStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n el.textContent = BASE_CSS;\n document.head.appendChild(el);\n}\n\n/** Resolve a (possibly partial) theme into the CSS variables the picker reads. */\nexport function themeToCssVars(theme: PickerTheme | undefined): Record<string, string> {\n const mode = theme?.mode || 'light';\n const defaults = mode === 'dark' ? DARK_DEFAULTS : LIGHT_DEFAULTS;\n return {\n '--us-primary': theme?.primary ?? defaults.primary,\n '--us-bg': theme?.background ?? defaults.background,\n '--us-fg': theme?.foreground ?? defaults.foreground,\n '--us-muted': defaults.muted,\n '--us-subtle': defaults.subtle,\n '--us-border': theme?.border ?? defaults.border,\n '--us-border-strong': defaults.borderStrong,\n '--us-elevated': defaults.elevated,\n '--us-success': defaults.success,\n '--us-danger': defaults.danger,\n '--us-radius': theme?.radius ?? '12px',\n };\n}\n\n// WCAG-verified pairs. Each token has a deliberate role; nothing here is by\n// vibes alone.\nconst LIGHT_DEFAULTS = {\n primary: '#4f46e5', // indigo-600 — confident, restrained\n background: '#ffffff',\n foreground: '#0f172a', // slate-900 — 15.4:1 on white\n muted: '#64748b', // slate-500 — 4.7:1 on white\n subtle: '#f8fafc', // slate-50 — chips, icon wells\n border: '#e2e8f0', // slate-200\n borderStrong: '#cbd5e1', // slate-300 — drag-over emphasis\n elevated: '#ffffff',\n success: '#16a34a',\n danger: '#dc2626',\n};\n\nconst DARK_DEFAULTS = {\n primary: '#818cf8', // indigo-400 — desaturated for dark mode\n background: '#0b0f1a', // near-black, not pure\n foreground: '#f1f5f9', // slate-100 — 15:1 on bg\n muted: '#94a3b8', // slate-400 — 6.4:1 on bg\n subtle: '#111827', // slightly elevated surface\n border: '#1f2937',\n borderStrong: '#334155',\n elevated: '#0f1625',\n success: '#4ade80',\n danger: '#f87171',\n};\n\n// Everything is namespaced under `.us-picker` and uses CSS variables so the\n// host page's styles never leak in, and theme overrides flow cleanly.\nconst BASE_CSS = `\n.us-picker-backdrop {\n position: fixed; inset: 0; z-index: 2147483000;\n background: color-mix(in srgb, #02060f 55%, transparent);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n display: flex; align-items: center; justify-content: center;\n padding: 16px;\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n animation: us-fade 140ms ease-out;\n}\n@keyframes us-fade { from { opacity: 0; } to { opacity: 1; } }\n\n.us-picker {\n background: var(--us-bg); color: var(--us-fg);\n border: 1px solid var(--us-border);\n border-radius: var(--us-radius);\n width: 100%; max-width: 480px;\n max-height: min(calc(100dvh - 32px), 680px);\n display: flex; flex-direction: column;\n position: relative;\n box-shadow:\n 0 1px 1px rgba(0,0,0,0.04),\n 0 18px 40px -8px rgba(0,0,0,0.18),\n 0 32px 80px -16px rgba(0,0,0,0.22);\n overflow: hidden;\n animation: us-rise 240ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes us-rise {\n from { opacity: 0; transform: translateY(8px) scale(0.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n.us-picker * { box-sizing: border-box; }\n\n/* ──────────────────── header ──────────────────── */\n.us-picker-header {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--us-border);\n}\n.us-picker-header-logo {\n display: inline-flex; align-items: center; justify-content: center;\n width: 28px; height: 28px; flex-shrink: 0;\n border-radius: 8px;\n background: var(--us-subtle);\n color: var(--us-primary);\n}\n.us-picker-header-logo svg { width: 16px; height: 16px; }\n.us-picker-header-logo img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }\n.us-picker-title { font-weight: 600; font-size: 14px; letter-spacing: -0.01em; flex: 1; }\n.us-picker-close {\n background: none; border: 0; cursor: pointer;\n width: 32px; height: 32px;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted); border-radius: 8px;\n transition: color 140ms, background 140ms;\n}\n.us-picker-close:hover { background: var(--us-subtle); color: var(--us-fg); }\n.us-picker-close:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 1px; }\n.us-picker-close svg { width: 16px; height: 16px; }\n\n/* ──────────────────── body / dropzone ──────────────────── */\n.us-picker-body { padding: 16px; overflow-y: auto; }\n\n.us-dropzone {\n position: relative;\n border: 1.5px dashed var(--us-border-strong);\n border-radius: calc(var(--us-radius) - 2px);\n padding: 28px 20px;\n text-align: center;\n cursor: pointer;\n transition: border-color 160ms, background 160ms, transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n background: color-mix(in srgb, var(--us-subtle) 60%, transparent);\n}\n.us-dropzone:hover {\n border-color: var(--us-primary);\n background: color-mix(in srgb, var(--us-primary) 4%, var(--us-bg));\n}\n.us-dropzone:focus-visible {\n outline: 2px solid var(--us-primary); outline-offset: 2px;\n}\n.us-dropzone[data-drag=\"over\"] {\n border-style: solid;\n border-color: var(--us-primary);\n background: color-mix(in srgb, var(--us-primary) 8%, var(--us-bg));\n transform: scale(1.005);\n}\n.us-dropzone-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--us-primary) 12%, var(--us-bg));\n color: var(--us-primary);\n display: inline-flex; align-items: center; justify-content: center;\n margin-bottom: 12px;\n transition: transform 240ms cubic-bezier(0.16, 1.4, 0.3, 1);\n}\n.us-dropzone:hover .us-dropzone-icon { transform: translateY(-2px); }\n.us-dropzone[data-drag=\"over\"] .us-dropzone-icon {\n transform: translateY(-3px) scale(1.06);\n background: color-mix(in srgb, var(--us-primary) 18%, var(--us-bg));\n}\n.us-dropzone-icon svg { width: 22px; height: 22px; }\n.us-dropzone-title {\n font-size: 14px; font-weight: 600; letter-spacing: -0.01em;\n margin-bottom: 2px;\n}\n.us-dropzone-hint { color: var(--us-muted); font-size: 12.5px; }\n.us-dropzone-constraints {\n margin-top: 10px;\n font-size: 11px; color: var(--us-muted);\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n letter-spacing: 0.02em;\n}\n\n.us-dropzone--compact {\n padding: 12px 16px;\n display: flex; align-items: center; gap: 12px;\n text-align: left;\n}\n.us-dropzone--compact .us-dropzone-icon {\n width: 32px; height: 32px; border-radius: 8px; margin-bottom: 0;\n}\n.us-dropzone--compact .us-dropzone-icon svg { width: 16px; height: 16px; }\n.us-dropzone--compact .us-dropzone-title { font-size: 13px; margin: 0; }\n.us-dropzone--compact .us-dropzone-hint { display: none; }\n.us-dropzone--compact .us-dropzone-constraints { display: none; }\n\n/* ──────────────────── file list ──────────────────── */\n.us-file-list { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }\n\n.us-file {\n display: flex; align-items: center; gap: 12px;\n padding: 10px 12px;\n background: var(--us-elevated);\n border: 1px solid var(--us-border);\n border-radius: 10px;\n transition: border-color 140ms, background 140ms;\n animation: us-row-in 280ms cubic-bezier(0.16, 1, 0.3, 1) backwards;\n position: relative;\n}\n@keyframes us-row-in {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.us-file[data-state=\"done\"] { border-color: color-mix(in srgb, var(--us-success) 30%, var(--us-border)); }\n.us-file[data-state=\"failed\"] { border-color: color-mix(in srgb, var(--us-danger) 30%, var(--us-border)); }\n\n.us-file-thumb {\n width: 40px; height: 40px; flex-shrink: 0;\n border-radius: 8px;\n background: var(--us-subtle);\n background-size: cover; background-position: center;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted);\n overflow: hidden;\n}\n.us-file-thumb[data-image=\"true\"] { color: transparent; }\n.us-file-thumb svg { width: 18px; height: 18px; }\n\n.us-file-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }\n.us-file-row1 { display: flex; align-items: center; gap: 8px; }\n.us-file-name {\n font-size: 13px; font-weight: 500;\n flex: 1; min-width: 0;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n letter-spacing: -0.005em;\n}\n.us-file-meta { color: var(--us-muted); font-size: 11.5px; flex-shrink: 0; font-variant-numeric: tabular-nums; }\n\n.us-file-progress {\n height: 3px; background: var(--us-border); border-radius: 999px; overflow: hidden;\n position: relative;\n}\n.us-file-progress-bar {\n height: 100%; width: 0%;\n background: var(--us-primary);\n border-radius: inherit;\n transition: width 260ms cubic-bezier(0.4, 0.0, 0.2, 1);\n position: relative;\n}\n/* Shimmer overlay while uploading. Stops on terminal states. */\n.us-file[data-state=\"uploading\"] .us-file-progress-bar::after {\n content: \"\"; position: absolute; inset: 0;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n color-mix(in srgb, #fff 35%, transparent) 50%,\n transparent 100%\n );\n animation: us-shimmer 1.4s linear infinite;\n}\n@keyframes us-shimmer {\n from { transform: translateX(-100%); }\n to { transform: translateX(100%); }\n}\n.us-file[data-state=\"done\"] .us-file-progress-bar { width: 100% !important; background: var(--us-success); }\n.us-file[data-state=\"failed\"] .us-file-progress-bar { background: var(--us-danger); }\n\n.us-file-status {\n flex-shrink: 0;\n display: inline-flex; align-items: center; justify-content: center;\n width: 24px; height: 24px;\n color: var(--us-muted);\n}\n.us-file-status svg { width: 18px; height: 18px; }\n.us-file[data-state=\"done\"] .us-file-status { color: var(--us-success); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }\n.us-file[data-state=\"failed\"] .us-file-status { color: var(--us-danger); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }\n.us-file[data-state=\"uploading\"] .us-file-status { animation: us-spin 0.9s linear infinite; }\n@keyframes us-pop {\n from { transform: scale(0.5); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n}\n@keyframes us-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* ──────────────────── actions / footer ──────────────────── */\n.us-actions {\n display: flex; gap: 8px; justify-content: space-between; align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--us-border);\n}\n.us-actions-summary { font-size: 12px; color: var(--us-muted); font-variant-numeric: tabular-nums; }\n.us-actions-buttons { display: flex; gap: 8px; }\n\n.us-btn {\n appearance: none;\n display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n padding: 8px 14px; min-height: 36px;\n border-radius: 8px; border: 1px solid var(--us-border);\n background: transparent; color: var(--us-fg);\n cursor: pointer; font-size: 13px; font-weight: 500;\n font-family: inherit; letter-spacing: -0.005em;\n transition: background 140ms, border-color 140ms, transform 80ms ease-out;\n}\n.us-btn:hover { background: var(--us-subtle); border-color: var(--us-border-strong); }\n.us-btn:active { transform: scale(0.98); }\n.us-btn:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 2px; }\n.us-btn-primary {\n background: var(--us-primary); color: white;\n border-color: var(--us-primary);\n}\n.us-btn-primary:hover { filter: brightness(0.95); background: var(--us-primary); }\n.us-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.us-btn[disabled]:hover { transform: none; }\n.us-btn svg { width: 14px; height: 14px; }\n\n.us-footer {\n padding: 8px 16px 12px;\n font-size: 11px; color: var(--us-muted); text-align: center;\n display: flex; align-items: center; justify-content: center; gap: 6px;\n}\n.us-footer svg { width: 11px; height: 11px; opacity: 0.7; }\n.us-footer a { color: var(--us-muted); text-decoration: none; font-weight: 500; }\n.us-footer a:hover { color: var(--us-fg); }\n\n/* ──────────────────── source tabs (Device / URL) ──────────────────── */\n.us-source-tabs {\n display: inline-flex; gap: 2px; padding: 3px;\n background: var(--us-subtle);\n border: 1px solid var(--us-border);\n border-radius: 10px;\n margin-bottom: 14px;\n}\n.us-source-tab {\n appearance: none; background: transparent; border: 0;\n font: inherit; cursor: pointer;\n padding: 6px 14px; min-height: 30px;\n border-radius: 7px;\n font-size: 12.5px; font-weight: 500; letter-spacing: -0.005em;\n color: var(--us-muted);\n transition: background 140ms, color 140ms;\n display: inline-flex; align-items: center; gap: 6px;\n}\n.us-source-tab svg { width: 13px; height: 13px; }\n.us-source-tab:hover { color: var(--us-fg); }\n.us-source-tab[data-active=\"true\"] {\n background: var(--us-bg);\n color: var(--us-fg);\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n.us-source-tab:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 2px; }\n\n/* ──────────────────── URL source ──────────────────── */\n.us-url-source { display: none; }\n.us-url-source[data-active=\"true\"] { display: block; }\n.us-url-form {\n display: flex; gap: 8px;\n padding: 16px;\n border: 1.5px dashed var(--us-border-strong);\n border-radius: calc(var(--us-radius) - 2px);\n background: color-mix(in srgb, var(--us-subtle) 60%, transparent);\n}\n.us-url-input {\n appearance: none;\n flex: 1; min-width: 0;\n padding: 9px 12px; min-height: 36px;\n border-radius: 8px; border: 1px solid var(--us-border);\n background: var(--us-bg); color: var(--us-fg);\n font: inherit; font-size: 13px;\n transition: border-color 140ms, box-shadow 140ms;\n}\n.us-url-input::placeholder { color: var(--us-muted); }\n.us-url-input:focus {\n outline: none;\n border-color: var(--us-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--us-primary) 18%, transparent);\n}\n.us-url-hint {\n margin-top: 8px;\n font-size: 11.5px; color: var(--us-muted);\n}\n.us-url-hint[data-error=\"true\"] { color: var(--us-danger); }\n\n/* ──────────────────── per-row edit button ──────────────────── */\n.us-file-actions { display: inline-flex; gap: 4px; }\n.us-file-action {\n appearance: none; background: transparent; border: 0; cursor: pointer;\n width: 28px; height: 28px;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted); border-radius: 6px;\n transition: background 140ms, color 140ms;\n}\n.us-file-action:hover { background: var(--us-subtle); color: var(--us-fg); }\n.us-file-action:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 1px; }\n.us-file-action svg { width: 15px; height: 15px; }\n.us-file-action[data-edited=\"true\"] { color: var(--us-primary); }\n.us-file:not([data-state=\"queued\"]) .us-file-action { display: none; }\n\n/* ──────────────────── image editor overlay ──────────────────── */\n.us-editor {\n position: absolute; inset: 0; z-index: 2;\n display: flex; flex-direction: column;\n background: var(--us-bg);\n animation: us-fade 140ms ease-out;\n}\n.us-editor-header {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--us-border);\n}\n.us-editor-title { font-weight: 600; font-size: 14px; flex: 1; letter-spacing: -0.01em; }\n.us-editor-back {\n appearance: none; background: transparent; border: 0; cursor: pointer;\n width: 32px; height: 32px; border-radius: 8px;\n display: inline-flex; align-items: center; justify-content: center;\n color: var(--us-muted);\n transition: background 140ms, color 140ms;\n}\n.us-editor-back:hover { background: var(--us-subtle); color: var(--us-fg); }\n.us-editor-back svg { width: 16px; height: 16px; }\n\n.us-editor-canvas-wrap {\n flex: 1; min-height: 0;\n background: var(--us-subtle);\n display: flex; align-items: center; justify-content: center;\n padding: 16px;\n position: relative;\n overflow: hidden;\n}\n.us-editor-canvas {\n max-width: 100%; max-height: 100%;\n border-radius: 6px;\n display: block;\n /* Checkerboard for transparency awareness (visible only in circle mode). */\n background-image:\n linear-gradient(45deg, var(--us-border) 25%, transparent 25%, transparent 75%, var(--us-border) 75%),\n linear-gradient(45deg, var(--us-border) 25%, transparent 25%, transparent 75%, var(--us-border) 75%);\n background-size: 12px 12px;\n background-position: 0 0, 6px 6px;\n}\n.us-editor-overlay {\n position: absolute; inset: 0;\n pointer-events: none;\n}\n\n.us-editor-toolbar {\n display: flex; gap: 6px; flex-wrap: wrap;\n padding: 10px 16px;\n border-top: 1px solid var(--us-border);\n}\n.us-tool {\n appearance: none; background: transparent; border: 1px solid var(--us-border);\n font: inherit; cursor: pointer;\n padding: 6px 11px; min-height: 32px;\n border-radius: 8px;\n font-size: 12.5px; font-weight: 500;\n color: var(--us-fg);\n display: inline-flex; align-items: center; gap: 6px;\n transition: background 140ms, border-color 140ms, color 140ms;\n}\n.us-tool:hover { background: var(--us-subtle); border-color: var(--us-border-strong); }\n.us-tool[data-active=\"true\"] {\n background: color-mix(in srgb, var(--us-primary) 10%, var(--us-bg));\n border-color: var(--us-primary);\n color: var(--us-primary);\n}\n.us-tool[disabled] { opacity: 0.45; cursor: not-allowed; }\n.us-tool svg { width: 13px; height: 13px; }\n.us-tool-spacer { flex: 1; }\n\n.us-editor-footer {\n display: flex; gap: 8px; justify-content: flex-end;\n padding: 12px 16px;\n border-top: 1px solid var(--us-border);\n}\n\n/* Crop drag handles. Drawn inside .us-editor-canvas-wrap, positioned over canvas. */\n.us-crop-box {\n position: absolute;\n border: 1.5px solid var(--us-primary);\n box-shadow: 0 0 0 9999px rgba(0,0,0,0.45);\n pointer-events: auto;\n cursor: move;\n}\n.us-crop-handle {\n position: absolute;\n width: 12px; height: 12px;\n background: var(--us-bg);\n border: 1.5px solid var(--us-primary);\n border-radius: 2px;\n pointer-events: auto;\n}\n.us-crop-handle[data-pos=\"nw\"] { top: -6px; left: -6px; cursor: nwse-resize; }\n.us-crop-handle[data-pos=\"ne\"] { top: -6px; right: -6px; cursor: nesw-resize; }\n.us-crop-handle[data-pos=\"sw\"] { bottom: -6px; left: -6px; cursor: nesw-resize; }\n.us-crop-handle[data-pos=\"se\"] { bottom: -6px; right: -6px; cursor: nwse-resize; }\n\n/* ──────────────────── reduced motion ──────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .us-picker-backdrop,\n .us-picker,\n .us-file,\n .us-dropzone,\n .us-dropzone-icon,\n .us-btn,\n .us-file-status,\n .us-file-progress-bar,\n .us-editor,\n .us-source-tab,\n .us-tool { animation: none !important; transition: none !important; }\n .us-file[data-state=\"uploading\"] .us-file-progress-bar::after { animation: none; opacity: 0; }\n}\n\n/* ──────────────────── empty state niceties ──────────────────── */\n.us-file-list:empty { display: none; }\n`;\n","// Lightweight client-side image editor for the picker. Supports rotate (90°),\n// crop with draggable handles, circle (centered square + circular alpha mask),\n// and revert to original. All operations stay in the browser — we hand the\n// edited blob back to the picker, which uploads it like any other file.\n//\n// Design notes:\n// - There are two canvases. The \"working\" canvas is the source of truth in\n// image pixels and gets mutated by each operation (rotate, crop, circle).\n// The \"display\" canvas is what the user sees, sized to fit the editor\n// box; we render the working canvas into it on every draw().\n// - Crop drag math is done entirely in display-canvas pixel coordinates,\n// then scaled to image coords only when committing the crop. This keeps\n// the handle math straightforward (no scale juggling per mouse-move).\n// - Apply exports the working canvas via toBlob() and wraps it in a File so\n// the picker can swap it for the original without any other change. The\n// output mime is PNG when the image has transparency (after a circle\n// op), JPEG otherwise — keeps file size sane for photos.\n\ntype EditorMode = 'none' | 'crop';\n\ninterface Rect { x: number; y: number; w: number; h: number; }\n\nconst MAX_DISPLAY = 720; // px — keeps the working canvas reasonable on huge inputs\n\n// Inline SVG icons. Same Lucide flavor as picker.ts.\nconst ICON = {\n back: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`,\n crop: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 2v14a2 2 0 0 0 2 2h14\"/><path d=\"M18 22V8a2 2 0 0 0-2-2H2\"/></svg>`,\n circle: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/></svg>`,\n rotate: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.82.93 6.58 2.46L21 8\"/><path d=\"M21 3v5h-5\"/></svg>`,\n undo: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-15-6.7L3 13\"/></svg>`,\n check: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n};\n\nexport interface ImageEditorOptions {\n /** Element to mount the editor inside (usually the picker panel). */\n host: HTMLElement;\n /** The source image to load into the editor on open. */\n file: File;\n /**\n * The unedited original. Revert restores to this. Defaults to `file` —\n * pass it explicitly when the user has already applied edits and you want\n * Revert to undo *all* the way back, not just the current session.\n */\n originalFile?: File;\n /** Title shown in the editor header (typically the filename). */\n title: string;\n /** Called with the edited File when the user clicks Apply. */\n onApply: (file: File) => void;\n /** Called when the user backs out without applying. */\n onCancel: () => void;\n}\n\nexport class ImageEditor {\n private root!: HTMLElement;\n private canvasWrap!: HTMLElement;\n private displayCanvas!: HTMLCanvasElement;\n private cropBox: HTMLElement | null = null;\n private cropTool!: HTMLButtonElement;\n private circleTool!: HTMLButtonElement;\n private rotateTool!: HTMLButtonElement;\n private revertTool!: HTMLButtonElement;\n private applyBtn!: HTMLButtonElement;\n\n // Source of truth, mutated by each op. Always in image pixels.\n private working!: HTMLCanvasElement;\n // What's currently rendered to the user, sized to fit MAX_DISPLAY.\n private displayScale = 1;\n // Tracks whether the working canvas has transparency (post-circle), so\n // export() can pick PNG vs JPEG correctly.\n private hasAlpha = false;\n\n private mode: EditorMode = 'none';\n private cropRect: Rect | null = null; // display-canvas coords\n\n // Drag state for crop interaction.\n private dragKind: 'move' | 'nw' | 'ne' | 'sw' | 'se' | null = null;\n private dragStart: { px: number; py: number; rect: Rect } | null = null;\n\n constructor(private opts: ImageEditorOptions) {}\n\n async open(): Promise<void> {\n this.mount();\n try {\n await this.loadOriginalIntoWorking();\n // If the caller passed a distinct originalFile, the loaded image is\n // already edited compared to the true original — enable Revert.\n if (this.opts.originalFile && this.opts.originalFile !== this.opts.file) {\n this.markEdited(true);\n }\n this.draw();\n } catch (err) {\n // Image failed to decode — surface it in the canvas wrap and let the\n // user back out. Don't throw, the picker is still alive.\n this.canvasWrap.textContent = `Couldn't load image: ${(err as Error).message}`;\n }\n }\n\n close(): void {\n document.removeEventListener('pointermove', this.onPointerMove);\n document.removeEventListener('pointerup', this.onPointerUp);\n this.root.remove();\n }\n\n // ---- mount / dom --------------------------------------------------------\n\n private mount(): void {\n this.root = el('div', 'us-editor');\n\n const header = el('div', 'us-editor-header');\n const back = document.createElement('button');\n back.type = 'button';\n back.className = 'us-editor-back';\n back.setAttribute('aria-label', 'Back');\n back.innerHTML = ICON.back;\n back.onclick = () => { this.opts.onCancel(); this.close(); };\n header.appendChild(back);\n header.appendChild(el('div', 'us-editor-title', this.opts.title));\n this.root.appendChild(header);\n\n this.canvasWrap = el('div', 'us-editor-canvas-wrap');\n this.displayCanvas = document.createElement('canvas');\n this.displayCanvas.className = 'us-editor-canvas';\n this.canvasWrap.appendChild(this.displayCanvas);\n this.root.appendChild(this.canvasWrap);\n\n // Toolbar\n const toolbar = el('div', 'us-editor-toolbar');\n this.cropTool = makeTool('Crop', ICON.crop);\n this.cropTool.onclick = () => this.toggleCropMode();\n this.circleTool = makeTool('Circle', ICON.circle);\n this.circleTool.onclick = () => this.applyCircle();\n this.rotateTool = makeTool('Rotate 90°', ICON.rotate);\n this.rotateTool.onclick = () => this.applyRotate();\n this.revertTool = makeTool('Revert', ICON.undo);\n this.revertTool.onclick = () => this.revert();\n this.revertTool.disabled = true; // enabled after first edit\n\n toolbar.appendChild(this.cropTool);\n toolbar.appendChild(this.circleTool);\n toolbar.appendChild(this.rotateTool);\n toolbar.appendChild(el('div', 'us-tool-spacer'));\n toolbar.appendChild(this.revertTool);\n this.root.appendChild(toolbar);\n\n // Footer (Cancel / Apply)\n const footer = el('div', 'us-editor-footer');\n const cancel = document.createElement('button');\n cancel.type = 'button';\n cancel.className = 'us-btn';\n cancel.textContent = 'Cancel';\n cancel.onclick = () => { this.opts.onCancel(); this.close(); };\n\n this.applyBtn = document.createElement('button');\n this.applyBtn.type = 'button';\n this.applyBtn.className = 'us-btn us-btn-primary';\n this.applyBtn.innerHTML = `${ICON.check} <span>Apply</span>`;\n this.applyBtn.onclick = () => this.applyAndClose();\n\n footer.appendChild(cancel);\n footer.appendChild(this.applyBtn);\n this.root.appendChild(footer);\n\n this.opts.host.appendChild(this.root);\n }\n\n // ---- image loading ------------------------------------------------------\n\n private async loadOriginalIntoWorking(): Promise<void> {\n const img = await loadImage(this.opts.file);\n const c = document.createElement('canvas');\n c.width = img.naturalWidth;\n c.height = img.naturalHeight;\n const ctx = c.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context unavailable');\n ctx.drawImage(img, 0, 0);\n this.working = c;\n this.hasAlpha = looksLikePngMime(this.opts.file.type);\n this.markEdited(false);\n }\n\n // For Revert. Loads the true original (passed-in `originalFile`, or `file`\n // if the caller didn't distinguish).\n private async loadTrueOriginalIntoWorking(): Promise<void> {\n const source = this.opts.originalFile ?? this.opts.file;\n const img = await loadImage(source);\n const c = document.createElement('canvas');\n c.width = img.naturalWidth;\n c.height = img.naturalHeight;\n const ctx = c.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context unavailable');\n ctx.drawImage(img, 0, 0);\n this.working = c;\n this.hasAlpha = looksLikePngMime(source.type);\n this.markEdited(false);\n }\n\n // ---- rendering ----------------------------------------------------------\n\n private draw(): void {\n // Fit the working canvas inside MAX_DISPLAY while preserving aspect.\n const { width: ww, height: wh } = this.working;\n const scale = Math.min(1, MAX_DISPLAY / Math.max(ww, wh));\n const dw = Math.max(1, Math.round(ww * scale));\n const dh = Math.max(1, Math.round(wh * scale));\n this.displayCanvas.width = dw;\n this.displayCanvas.height = dh;\n this.displayScale = scale;\n\n const ctx = this.displayCanvas.getContext('2d');\n if (!ctx) return;\n ctx.clearRect(0, 0, dw, dh);\n ctx.drawImage(this.working, 0, 0, dw, dh);\n\n this.updateCropBox();\n }\n\n // ---- mode: crop ---------------------------------------------------------\n\n private toggleCropMode(): void {\n if (this.mode === 'crop') {\n // Second click = commit crop (Filestack-y \"click crop again to apply\").\n this.applyCrop();\n } else {\n this.enterCropMode();\n }\n }\n\n private enterCropMode(): void {\n this.mode = 'crop';\n this.cropTool.dataset.active = 'true';\n this.cropTool.innerHTML = `${ICON.check} <span>Apply crop</span>`;\n // Default inset: 10% on each side.\n const dw = this.displayCanvas.width;\n const dh = this.displayCanvas.height;\n const inset = Math.round(Math.min(dw, dh) * 0.1);\n this.cropRect = { x: inset, y: inset, w: dw - inset * 2, h: dh - inset * 2 };\n this.renderCropBox();\n }\n\n private exitCropMode(): void {\n this.mode = 'none';\n this.cropTool.removeAttribute('data-active');\n this.cropTool.innerHTML = `${ICON.crop} <span>Crop</span>`;\n this.cropRect = null;\n if (this.cropBox) { this.cropBox.remove(); this.cropBox = null; }\n }\n\n private renderCropBox(): void {\n if (!this.cropRect) return;\n if (this.cropBox) this.cropBox.remove();\n\n const box = el('div', 'us-crop-box');\n for (const pos of ['nw', 'ne', 'sw', 'se'] as const) {\n const h = el('div', 'us-crop-handle');\n h.dataset.pos = pos;\n h.addEventListener('pointerdown', (e) => this.beginDrag(e as PointerEvent, pos));\n box.appendChild(h);\n }\n box.addEventListener('pointerdown', (e) => {\n const target = e.target as HTMLElement;\n if (target.classList.contains('us-crop-handle')) return; // handled above\n this.beginDrag(e as PointerEvent, 'move');\n });\n\n // Position the box relative to the displayed canvas. The canvas may have\n // empty padding around it inside .us-editor-canvas-wrap (due to flex\n // centering), so we calculate the offset of the canvas inside the wrap.\n this.canvasWrap.appendChild(box);\n this.cropBox = box;\n this.updateCropBox();\n }\n\n private updateCropBox(): void {\n if (!this.cropBox || !this.cropRect) return;\n const canvasRect = this.displayCanvas.getBoundingClientRect();\n const wrapRect = this.canvasWrap.getBoundingClientRect();\n const left = canvasRect.left - wrapRect.left + this.cropRect.x;\n const top = canvasRect.top - wrapRect.top + this.cropRect.y;\n this.cropBox.style.left = `${left}px`;\n this.cropBox.style.top = `${top}px`;\n this.cropBox.style.width = `${this.cropRect.w}px`;\n this.cropBox.style.height = `${this.cropRect.h}px`;\n }\n\n // ---- drag handlers (crop) ----------------------------------------------\n\n private beginDrag(e: PointerEvent, kind: 'move' | 'nw' | 'ne' | 'sw' | 'se'): void {\n if (!this.cropRect) return;\n e.preventDefault();\n this.dragKind = kind;\n this.dragStart = { px: e.clientX, py: e.clientY, rect: { ...this.cropRect } };\n document.addEventListener('pointermove', this.onPointerMove);\n document.addEventListener('pointerup', this.onPointerUp);\n }\n\n private onPointerMove = (e: PointerEvent): void => {\n if (!this.dragKind || !this.dragStart || !this.cropRect) return;\n const dx = e.clientX - this.dragStart.px;\n const dy = e.clientY - this.dragStart.py;\n const start = this.dragStart.rect;\n const maxW = this.displayCanvas.width;\n const maxH = this.displayCanvas.height;\n const min = 24; // px — minimum crop size so handles stay reachable\n\n let { x, y, w, h } = start;\n switch (this.dragKind) {\n case 'move':\n x = clamp(start.x + dx, 0, maxW - start.w);\n y = clamp(start.y + dy, 0, maxH - start.h);\n break;\n case 'nw': {\n const nx = clamp(start.x + dx, 0, start.x + start.w - min);\n const ny = clamp(start.y + dy, 0, start.y + start.h - min);\n w = start.w + (start.x - nx);\n h = start.h + (start.y - ny);\n x = nx; y = ny;\n break;\n }\n case 'ne': {\n const nw = clamp(start.w + dx, min, maxW - start.x);\n const ny = clamp(start.y + dy, 0, start.y + start.h - min);\n h = start.h + (start.y - ny);\n w = nw; y = ny;\n break;\n }\n case 'sw': {\n const nx = clamp(start.x + dx, 0, start.x + start.w - min);\n const nh = clamp(start.h + dy, min, maxH - start.y);\n w = start.w + (start.x - nx);\n h = nh; x = nx;\n break;\n }\n case 'se':\n w = clamp(start.w + dx, min, maxW - start.x);\n h = clamp(start.h + dy, min, maxH - start.y);\n break;\n }\n this.cropRect = { x, y, w, h };\n this.updateCropBox();\n };\n\n private onPointerUp = (): void => {\n this.dragKind = null;\n this.dragStart = null;\n document.removeEventListener('pointermove', this.onPointerMove);\n document.removeEventListener('pointerup', this.onPointerUp);\n };\n\n // ---- operations (mutate working canvas) --------------------------------\n\n private applyCrop(): void {\n if (!this.cropRect) { this.exitCropMode(); return; }\n // Display-coords → image-coords.\n const s = this.displayScale;\n const sx = Math.round(this.cropRect.x / s);\n const sy = Math.round(this.cropRect.y / s);\n const sw = Math.round(this.cropRect.w / s);\n const sh = Math.round(this.cropRect.h / s);\n\n const next = document.createElement('canvas');\n next.width = sw;\n next.height = sh;\n const ctx = next.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(this.working, sx, sy, sw, sh, 0, 0, sw, sh);\n this.working = next;\n this.exitCropMode();\n this.markEdited(true);\n this.draw();\n }\n\n private applyRotate(): void {\n const { width: w, height: h } = this.working;\n const next = document.createElement('canvas');\n next.width = h;\n next.height = w;\n const ctx = next.getContext('2d');\n if (!ctx) return;\n ctx.translate(h, 0);\n ctx.rotate(Math.PI / 2);\n ctx.drawImage(this.working, 0, 0);\n this.working = next;\n this.exitCropMode();\n this.markEdited(true);\n this.draw();\n }\n\n private applyCircle(): void {\n // Center-crop to a square, then mask with a circle. Output is PNG so the\n // transparent corners survive.\n const { width: w, height: h } = this.working;\n const size = Math.min(w, h);\n const sx = Math.round((w - size) / 2);\n const sy = Math.round((h - size) / 2);\n\n const next = document.createElement('canvas');\n next.width = size;\n next.height = size;\n const ctx = next.getContext('2d');\n if (!ctx) return;\n ctx.save();\n ctx.beginPath();\n ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2);\n ctx.closePath();\n ctx.clip();\n ctx.drawImage(this.working, sx, sy, size, size, 0, 0, size, size);\n ctx.restore();\n\n this.working = next;\n this.hasAlpha = true;\n this.exitCropMode();\n this.markEdited(true);\n this.draw();\n }\n\n private async revert(): Promise<void> {\n await this.loadTrueOriginalIntoWorking();\n this.exitCropMode();\n this.draw();\n }\n\n private markEdited(edited: boolean): void {\n this.revertTool.disabled = !edited;\n }\n\n // ---- apply --------------------------------------------------------------\n\n private async applyAndClose(): Promise<void> {\n this.applyBtn.disabled = true;\n try {\n const file = await this.exportFile();\n this.opts.onApply(file);\n this.close();\n } catch (err) {\n // Re-enable so the user can retry or cancel. Keep error message terse.\n this.applyBtn.disabled = false;\n console.error('[union-stack] image export failed', err);\n }\n }\n\n private exportFile(): Promise<File> {\n return new Promise((resolve, reject) => {\n const mime = this.hasAlpha ? 'image/png' : 'image/jpeg';\n const quality = mime === 'image/jpeg' ? 0.92 : undefined;\n this.working.toBlob(\n (blob) => {\n if (!blob) return reject(new Error('toBlob returned null'));\n const baseName = this.opts.file.name.replace(/\\.[^.]+$/, '');\n const ext = mime === 'image/png' ? 'png' : 'jpg';\n resolve(new File([blob], `${baseName}-edited.${ext}`, { type: mime }));\n },\n mime,\n quality,\n );\n });\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction el(tag: string, className: string, text?: string): HTMLElement {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nfunction makeTool(label: string, iconHtml: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'us-tool';\n btn.innerHTML = `${iconHtml} <span>${escapeText(label)}</span>`;\n return btn;\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''',\n })[c] as string);\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => { URL.revokeObjectURL(url); resolve(img); };\n img.onerror = () => { URL.revokeObjectURL(url); reject(new Error('decode failed')); };\n img.src = url;\n });\n}\n\nfunction looksLikePngMime(mime: string): boolean {\n return /^image\\/(png|webp|gif)$/.test(mime);\n}\n","import type { UnionStackClient } from '../client.js';\nimport type { PickerConfig, UploadError } from '../types.js';\nimport type {\n PickResponse,\n PickedFile,\n PickerHandle,\n PickerOptions,\n PickerSource,\n UploadedFile,\n} from './types.js';\nimport { ensureStyles, themeToCssVars } from './styles.js';\nimport { ImageEditor } from './imageEditor.js';\n\n// Merge server-managed picker config with runtime options. Runtime options\n// always win — they're the explicit dev escape hatch.\nfunction mergeConfig(server: PickerConfig, runtime: PickerOptions): PickerOptions {\n const merged: PickerOptions = { ...runtime };\n\n // Branding: shallow merge, runtime wins per-field.\n const runtimeBranding = runtime.branding || {};\n merged.branding = {\n logoUrl: runtimeBranding.logoUrl ?? server.branding.logoUrl ?? undefined,\n title: runtimeBranding.title ?? server.branding.title ?? undefined,\n hideFooter: runtimeBranding.hideFooter ?? server.branding.hideFooter,\n // PickerBranding has no footerText today — keep server's value internal.\n };\n\n // Theme: shallow merge.\n const runtimeTheme = runtime.theme || {};\n merged.theme = {\n primary: runtimeTheme.primary ?? server.theme.primary ?? undefined,\n background: runtimeTheme.background ?? server.theme.background ?? undefined,\n foreground: runtimeTheme.foreground ?? server.theme.foreground ?? undefined,\n border: runtimeTheme.border ?? server.theme.border ?? undefined,\n radius: runtimeTheme.radius ?? server.theme.radius ?? undefined,\n mode: runtimeTheme.mode ?? server.theme.mode ?? undefined,\n };\n\n // Constraints inform the dropzone (accept attr, size cap).\n merged.maxFileSize = runtime.maxFileSize ?? server.constraints.maxFileSizeBytes;\n merged.maxFiles = runtime.maxFiles ?? server.constraints.maxFilesPerUpload;\n if (!runtime.accept && server.constraints.allowedMimeTypes?.length) {\n const types = server.constraints.allowedMimeTypes.filter(t => t !== '*/*');\n if (types.length > 0) merged.accept = types.join(',');\n }\n return merged;\n}\n\ntype FileItemState = 'queued' | 'uploading' | 'done' | 'failed' | 'cancelled';\n\ninterface FileItem {\n uploadId: string; // matches PickedFile.uploadId once described\n file: File; // current file (may be edited)\n originalFile: File; // immutable — used by editor Revert\n edited: boolean; // true after image edit; toggles the Edit btn color\n state: FileItemState;\n progress: number; // 0-100\n error?: string;\n uploaded?: UploadedFile;\n objectUrl?: string; // for image thumbnails (revoked on unmount/reswap)\n // DOM refs we mutate on progress.\n $row?: HTMLElement;\n $bar?: HTMLElement;\n $status?: HTMLElement;\n $meta?: HTMLElement;\n $thumb?: HTMLElement;\n $edit?: HTMLButtonElement;\n}\n\nconst DEFAULT_TITLE = 'Upload files';\nconst FOOTER_LINK = 'https://unionstack.link';\n\n// ──────────────────────────────────────────────────────────────────\n// Inline SVG icons. Single source — Lucide-style, 1.5px stroke, 24px\n// viewBox. Keeping them as string templates so the picker bundle has\n// no asset/image dependencies.\n// ──────────────────────────────────────────────────────────────────\nconst ICON = {\n upload: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n close: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`,\n check: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n alert: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`,\n spinner: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" opacity=\"0.2\"/><path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\"/></svg>`,\n image: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>`,\n video: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\"/></svg>`,\n audio: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/></svg>`,\n pdf: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/><line x1=\"9\" y1=\"17\" x2=\"13\" y2=\"17\"/></svg>`,\n archive: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"5\" rx=\"2\"/><path d=\"M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9\"/><line x1=\"10\" y1=\"13\" x2=\"14\" y2=\"13\"/></svg>`,\n file: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`,\n zap: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg>`,\n device: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"/><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"/></svg>`,\n link: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72\"/></svg>`,\n pencil: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n};\n\nfunction iconForMime(mime: string): string {\n if (!mime) return ICON.file;\n if (mime.startsWith('image/')) return ICON.image;\n if (mime.startsWith('video/')) return ICON.video;\n if (mime.startsWith('audio/')) return ICON.audio;\n if (mime === 'application/pdf') return ICON.pdf;\n if (\n mime.startsWith('application/zip') ||\n mime.includes('compressed') ||\n mime === 'application/x-tar' ||\n mime === 'application/gzip'\n ) return ICON.archive;\n return ICON.file;\n}\n\n/**\n * Single-shot file picker modal. Built imperatively (no framework) so it can\n * be lazy-loaded by either the vanilla SDK or the React wrapper.\n */\nexport class Picker {\n private $backdrop: HTMLElement | null = null;\n private $panel: HTMLElement | null = null;\n private $list: HTMLElement | null = null;\n private $confirm: HTMLButtonElement | null = null;\n private $cancel: HTMLButtonElement | null = null;\n private $closeBtn: HTMLButtonElement | null = null;\n private $input: HTMLInputElement | null = null;\n\n // Source-tab DOM (Device vs URL). Only created when both sources are enabled.\n private $deviceSource: HTMLElement | null = null;\n private $urlSource: HTMLElement | null = null;\n private $urlInput: HTMLInputElement | null = null;\n private $urlHint: HTMLElement | null = null;\n private $urlAddBtn: HTMLButtonElement | null = null;\n\n private items: FileItem[] = [];\n private editor: ImageEditor | null = null;\n private abortCtrl = new AbortController();\n private uploadStarted = false;\n private resolved = false;\n private resolvePromise!: (r: PickResponse) => void;\n private donePromise: Promise<PickResponse>;\n\n constructor(\n private client: UnionStackClient,\n private opts: PickerOptions,\n ) {\n this.donePromise = new Promise<PickResponse>(res => { this.resolvePromise = res; });\n }\n\n // ---- public api ---------------------------------------------------------\n\n async open(): Promise<PickResponse> {\n if (typeof document === 'undefined') {\n throw new Error('[union-stack] Picker requires a browser environment.');\n }\n // Pull server-side branding/theme defaults before painting the modal.\n // Runtime opts win over server config — see mergeConfig below.\n try {\n const serverConfig = await this.client.pickerConfigPromise;\n if (serverConfig) this.opts = mergeConfig(serverConfig, this.opts);\n } catch { /* fall through with whatever opts the caller passed */ }\n\n ensureStyles();\n this.mount();\n this.opts.onOpen?.();\n return this.donePromise;\n }\n\n close(): void {\n this.unmount();\n // Resolve with whatever was collected so callers awaiting open() never hang.\n if (!this.resolved) this.resolveResult();\n }\n\n cancel(): void {\n this.abortCtrl.abort();\n this.opts.onCancel?.();\n this.close();\n }\n\n // ---- mount / dom --------------------------------------------------------\n\n private $summary: HTMLElement | null = null;\n\n private mount() {\n const root = document.createElement('div');\n root.className = 'us-picker-backdrop';\n Object.entries(themeToCssVars(this.opts.theme)).forEach(([k, v]) => {\n root.style.setProperty(k, v);\n });\n root.addEventListener('click', e => {\n if (e.target === root && !this.uploadStarted) this.cancel();\n });\n\n const panel = el('div', 'us-picker');\n\n // ─── Header ────────────────────────────────────────────────────\n const header = el('div', 'us-picker-header');\n const logoWrap = el('div', 'us-picker-header-logo');\n if (this.opts.branding?.logoUrl) {\n const logo = document.createElement('img');\n logo.src = this.opts.branding.logoUrl;\n logo.alt = '';\n logoWrap.appendChild(logo);\n } else {\n logoWrap.innerHTML = ICON.zap;\n }\n header.appendChild(logoWrap);\n\n const title = el('div', 'us-picker-title', this.opts.branding?.title ?? DEFAULT_TITLE);\n header.appendChild(title);\n\n this.$closeBtn = document.createElement('button');\n this.$closeBtn.type = 'button';\n this.$closeBtn.className = 'us-picker-close';\n this.$closeBtn.setAttribute('aria-label', 'Close');\n this.$closeBtn.innerHTML = ICON.close;\n this.$closeBtn.onclick = () => this.cancel();\n header.appendChild(this.$closeBtn);\n panel.appendChild(header);\n\n // ─── Body ──────────────────────────────────────────────────────\n const body = el('div', 'us-picker-body');\n const sources = this.resolvedSources();\n\n // Tabs only render when there's more than one source. Single-source flows\n // keep the original lean look.\n if (sources.length > 1) {\n body.appendChild(this.renderSourceTabs(sources));\n }\n\n if (sources.includes('device')) {\n this.$deviceSource = this.renderDropzone();\n body.appendChild(this.$deviceSource);\n }\n if (sources.includes('url')) {\n this.$urlSource = this.renderUrlSource();\n body.appendChild(this.$urlSource);\n }\n this.activateSource(sources[0] ?? 'device');\n\n this.$list = el('div', 'us-file-list');\n body.appendChild(this.$list);\n panel.appendChild(body);\n\n // ─── Actions ───────────────────────────────────────────────────\n const autoUpload = this.opts.autoUpload === true;\n const actions = el('div', 'us-actions');\n\n this.$summary = el('div', 'us-actions-summary', '');\n actions.appendChild(this.$summary);\n\n const buttons = el('div', 'us-actions-buttons');\n this.$cancel = document.createElement('button');\n this.$cancel.type = 'button';\n this.$cancel.className = 'us-btn';\n this.$cancel.textContent = 'Cancel';\n this.$cancel.onclick = () => this.cancel();\n buttons.appendChild(this.$cancel);\n\n if (!autoUpload) {\n this.$confirm = document.createElement('button');\n this.$confirm.type = 'button';\n this.$confirm.className = 'us-btn us-btn-primary';\n this.$confirm.innerHTML = `${ICON.upload} <span>Upload</span>`;\n this.$confirm.disabled = true;\n this.$confirm.onclick = () => this.startUpload();\n buttons.appendChild(this.$confirm);\n }\n actions.appendChild(buttons);\n panel.appendChild(actions);\n\n // ─── Footer ────────────────────────────────────────────────────\n if (!this.opts.branding?.hideFooter) {\n const footer = el('div', 'us-footer');\n footer.innerHTML =\n `${ICON.zap} <span>Powered by <a href=\"${FOOTER_LINK}\" target=\"_blank\" rel=\"noopener\">UnionStack</a></span>`;\n panel.appendChild(footer);\n }\n\n root.appendChild(panel);\n (this.opts.container ?? document.body).appendChild(root);\n this.$backdrop = root;\n this.$panel = panel;\n }\n\n // Resolves which sources to show, honoring opts.fromSources, defaulting to\n // both. Empty arrays fall back to ['device'] — we never want to leave a\n // picker with no way to add files.\n private resolvedSources(): PickerSource[] {\n const raw = this.opts.fromSources;\n if (!raw || raw.length === 0) return ['device', 'url'];\n return raw;\n }\n\n private renderSourceTabs(sources: PickerSource[]): HTMLElement {\n const tabs = el('div', 'us-source-tabs');\n tabs.setAttribute('role', 'tablist');\n for (const src of sources) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'us-source-tab';\n btn.setAttribute('role', 'tab');\n btn.dataset.source = src;\n btn.innerHTML = src === 'device'\n ? `${ICON.device} <span>My Device</span>`\n : `${ICON.link} <span>Link</span>`;\n btn.onclick = () => this.activateSource(src);\n tabs.appendChild(btn);\n }\n return tabs;\n }\n\n private activateSource(source: PickerSource): void {\n if (this.$deviceSource) {\n const active = source === 'device';\n this.$deviceSource.style.display = active ? '' : 'none';\n }\n if (this.$urlSource) {\n this.$urlSource.dataset.active = source === 'url' ? 'true' : 'false';\n }\n // Tab visuals.\n const tabs = this.$panel?.querySelectorAll<HTMLElement>('.us-source-tab');\n tabs?.forEach((t) => {\n t.dataset.active = t.dataset.source === source ? 'true' : 'false';\n });\n }\n\n private renderUrlSource(): HTMLElement {\n const wrap = el('div', 'us-url-source');\n const form = el('div', 'us-url-form');\n\n const input = document.createElement('input');\n input.type = 'url';\n input.className = 'us-url-input';\n input.placeholder = 'https://example.com/photo.jpg';\n input.setAttribute('aria-label', 'File URL');\n input.onkeydown = (e) => {\n if (e.key === 'Enter') { e.preventDefault(); this.handleUrlAdd(); }\n };\n this.$urlInput = input;\n\n const add = document.createElement('button');\n add.type = 'button';\n add.className = 'us-btn us-btn-primary';\n add.textContent = 'Add file';\n add.onclick = () => this.handleUrlAdd();\n this.$urlAddBtn = add;\n\n form.appendChild(input);\n form.appendChild(add);\n wrap.appendChild(form);\n\n const hint = el('div', 'us-url-hint', 'Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.');\n this.$urlHint = hint;\n wrap.appendChild(hint);\n\n return wrap;\n }\n\n private async handleUrlAdd(): Promise<void> {\n if (!this.$urlInput || !this.$urlAddBtn || !this.$urlHint) return;\n const url = this.$urlInput.value.trim();\n if (!url) { this.setUrlHint('Enter a URL first.', true); return; }\n if (!/^https?:\\/\\//i.test(url)) {\n this.setUrlHint('URL must start with http:// or https://', true);\n return;\n }\n this.$urlAddBtn.disabled = true;\n const prevLabel = this.$urlAddBtn.textContent;\n this.$urlAddBtn.textContent = 'Fetching…';\n this.setUrlHint('Downloading…', false);\n try {\n const file = await fetchUrlAsFile(url);\n this.addFiles([file]);\n this.$urlInput.value = '';\n this.setUrlHint('Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.', false);\n } catch (err) {\n const msg = (err as Error).message || 'Failed to fetch URL';\n this.setUrlHint(msg, true);\n } finally {\n this.$urlAddBtn.disabled = false;\n this.$urlAddBtn.textContent = prevLabel || 'Add file';\n }\n }\n\n private setUrlHint(text: string, isError: boolean): void {\n if (!this.$urlHint) return;\n this.$urlHint.textContent = text;\n this.$urlHint.dataset.error = isError ? 'true' : 'false';\n }\n\n private renderDropzone(): HTMLElement {\n const dz = el('div', 'us-dropzone');\n dz.setAttribute('role', 'button');\n dz.setAttribute('tabindex', '0');\n dz.setAttribute('aria-label', 'Drop files here or click to browse');\n\n const icon = el('div', 'us-dropzone-icon');\n icon.innerHTML = ICON.upload;\n dz.appendChild(icon);\n\n dz.appendChild(el('div', 'us-dropzone-title', 'Drop files to upload'));\n dz.appendChild(el('div', 'us-dropzone-hint', 'or click to browse from your device'));\n\n // Constraints line — surfaces max file size + accepted types so users\n // know the rules before they pick something that gets rejected.\n const constraintBits: string[] = [];\n if (this.opts.maxFileSize) constraintBits.push(`max ${formatBytes(this.opts.maxFileSize)}`);\n if (this.opts.accept) {\n const types = this.opts.accept\n .split(',')\n .map(s => s.trim())\n .filter(s => s && s !== '*/*')\n .map(s => s.replace('/*', ''));\n if (types.length > 0 && types.length <= 4) {\n constraintBits.push(types.join(' · '));\n }\n }\n if (constraintBits.length > 0) {\n dz.appendChild(el('div', 'us-dropzone-constraints', constraintBits.join(' · ')));\n }\n\n const input = document.createElement('input');\n input.type = 'file';\n input.multiple = (this.opts.maxFiles ?? 10) > 1;\n if (this.opts.accept) input.accept = this.opts.accept;\n input.style.display = 'none';\n input.onchange = () => {\n if (input.files) this.addFiles(Array.from(input.files));\n input.value = '';\n };\n this.$input = input;\n dz.appendChild(input);\n\n dz.onclick = () => input.click();\n dz.onkeydown = e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); input.click(); }\n };\n\n dz.addEventListener('dragover', e => {\n e.preventDefault();\n dz.setAttribute('data-drag', 'over');\n });\n dz.addEventListener('dragleave', () => dz.removeAttribute('data-drag'));\n dz.addEventListener('drop', e => {\n e.preventDefault();\n dz.removeAttribute('data-drag');\n const dropped = e.dataTransfer?.files;\n if (dropped) this.addFiles(Array.from(dropped));\n });\n\n return dz;\n }\n\n private unmount() {\n // Close the editor first so its document-level pointer listeners get\n // removed before we drop the DOM tree they were drawing on.\n if (this.editor) { this.editor.close(); this.editor = null; }\n if (this.$backdrop?.parentNode) this.$backdrop.parentNode.removeChild(this.$backdrop);\n this.$backdrop = null;\n this.$panel = null;\n // Release any image-thumbnail object URLs we created.\n for (const item of this.items) {\n if (item.objectUrl) URL.revokeObjectURL(item.objectUrl);\n }\n this.opts.onClose?.();\n }\n\n // ---- file selection -----------------------------------------------------\n\n private addFiles(files: File[]) {\n const cap = this.opts.maxFiles ?? Infinity;\n const remaining = cap - this.items.length;\n if (remaining <= 0) return;\n const chosen = files.slice(0, remaining);\n\n for (const file of chosen) {\n if (this.opts.maxFileSize && file.size > this.opts.maxFileSize) {\n // Skip the file but surface a row in the list so the user sees why.\n const item: FileItem = {\n uploadId: cryptoId(),\n file, originalFile: file, edited: false,\n state: 'failed', progress: 0,\n error: `File exceeds ${formatBytes(this.opts.maxFileSize)} limit`,\n };\n this.items.push(item);\n this.renderItem(item);\n continue;\n }\n\n const item: FileItem = {\n uploadId: cryptoId(),\n file, originalFile: file, edited: false,\n state: 'queued', progress: 0,\n };\n this.items.push(item);\n this.renderItem(item);\n }\n\n this.refreshConfirm();\n\n // Auto-upload: kick off as soon as the selection is complete. Deferred a\n // frame so the just-added rows render before \"uploading…\" status flips on.\n const autoUpload = this.opts.autoUpload === true;\n const hasQueued = this.items.some(i => i.state === 'queued');\n if (autoUpload && hasQueued && !this.uploadStarted) {\n requestAnimationFrame(() => {\n if (!this.uploadStarted) this.startUpload();\n });\n }\n }\n\n private renderItem(item: FileItem) {\n if (!this.$list) return;\n\n const row = el('div', 'us-file');\n row.dataset.state = item.state;\n row.dataset.uploadId = item.uploadId;\n // Stagger entrance so multiple files don't all pop in at once. Cap delay\n // so a 50-file drop doesn't take forever to fully render.\n const idx = Math.min(this.items.length - 1, 8);\n row.style.animationDelay = `${idx * 35}ms`;\n\n // Thumbnail: image preview for image MIMEs, type-specific icon otherwise.\n const thumb = el('div', 'us-file-thumb');\n if (item.file.type.startsWith('image/') && typeof URL !== 'undefined' && URL.createObjectURL) {\n try {\n const objectUrl = URL.createObjectURL(item.file);\n item.objectUrl = objectUrl;\n thumb.style.backgroundImage = `url(\"${objectUrl}\")`;\n thumb.dataset.image = 'true';\n } catch {\n thumb.innerHTML = iconForMime(item.file.type);\n }\n } else {\n thumb.innerHTML = iconForMime(item.file.type);\n }\n row.appendChild(thumb);\n\n // Main column: name + meta (with progress bar tucked under)\n const main = el('div', 'us-file-main');\n\n const row1 = el('div', 'us-file-row1');\n row1.appendChild(el('div', 'us-file-name', item.file.name));\n const meta = el('div', 'us-file-meta', formatBytes(item.file.size));\n row1.appendChild(meta);\n main.appendChild(row1);\n\n const progress = el('div', 'us-file-progress');\n const bar = el('div', 'us-file-progress-bar');\n progress.appendChild(bar);\n main.appendChild(progress);\n\n row.appendChild(main);\n\n // Edit button — only for image files, only while editable is enabled, only\n // when the file is queued (pre-upload). We append BEFORE the status icon so\n // the visual order is name → edit → status.\n const isImage = item.file.type.startsWith('image/');\n const editingEnabled = this.opts.imageEditing !== false;\n if (isImage && editingEnabled && item.state === 'queued') {\n const edit = document.createElement('button');\n edit.type = 'button';\n edit.className = 'us-file-action';\n edit.setAttribute('aria-label', 'Edit image');\n edit.title = 'Edit image';\n edit.innerHTML = ICON.pencil;\n edit.dataset.edited = item.edited ? 'true' : 'false';\n edit.onclick = () => this.openEditor(item);\n row.appendChild(edit);\n item.$edit = edit;\n }\n\n // Status icon (spinner / check / alert)\n const status = el('div', 'us-file-status');\n status.setAttribute('aria-label', this.statusLabel(item));\n status.innerHTML = this.statusIcon(item.state);\n row.appendChild(status);\n\n item.$row = row;\n item.$bar = bar;\n item.$status = status;\n item.$meta = meta;\n item.$thumb = thumb;\n\n this.$list.appendChild(row);\n this.updateSummary();\n }\n\n // Swap a queued item's file with an edited version. Refreshes thumbnail and\n // meta in place so the row identity is preserved (uploadId, position).\n private replaceItemFile(item: FileItem, nextFile: File, edited: boolean): void {\n item.file = nextFile;\n item.edited = edited;\n\n if (item.objectUrl) URL.revokeObjectURL(item.objectUrl);\n item.objectUrl = undefined;\n\n if (item.$thumb) {\n item.$thumb.style.backgroundImage = '';\n item.$thumb.removeAttribute('data-image');\n if (nextFile.type.startsWith('image/') && typeof URL !== 'undefined' && URL.createObjectURL) {\n try {\n const objectUrl = URL.createObjectURL(nextFile);\n item.objectUrl = objectUrl;\n item.$thumb.style.backgroundImage = `url(\"${objectUrl}\")`;\n item.$thumb.dataset.image = 'true';\n item.$thumb.innerHTML = '';\n } catch {\n item.$thumb.innerHTML = iconForMime(nextFile.type);\n }\n } else {\n item.$thumb.innerHTML = iconForMime(nextFile.type);\n }\n }\n if (item.$meta) item.$meta.textContent = formatBytes(nextFile.size);\n if (item.$row) {\n // Filename may have shifted (revert vs edit). Re-query the name node.\n const nameEl = item.$row.querySelector('.us-file-name');\n if (nameEl) nameEl.textContent = nextFile.name;\n }\n if (item.$edit) item.$edit.dataset.edited = edited ? 'true' : 'false';\n }\n\n // Mount the image editor overlay on top of the picker panel for the given\n // queued item. The editor calls back with either an edited File (Apply) or\n // nothing (Cancel/Back).\n private openEditor(item: FileItem): void {\n if (!this.$panel || this.editor || item.state !== 'queued') return;\n this.editor = new ImageEditor({\n host: this.$panel,\n file: item.file,\n originalFile: item.originalFile,\n title: item.originalFile.name,\n onApply: (edited) => {\n // If the applied file is byte-identical to the original (rare — would\n // require a no-op Apply), don't mark as edited.\n const wasEdited = edited !== item.originalFile;\n this.replaceItemFile(item, edited, wasEdited);\n this.editor = null;\n },\n onCancel: () => { this.editor = null; },\n });\n this.editor.open();\n }\n\n private statusIcon(state: FileItemState): string {\n switch (state) {\n case 'uploading': return ICON.spinner;\n case 'done': return ICON.check;\n case 'failed': return ICON.alert;\n case 'cancelled': return ICON.alert;\n default: return ICON.spinner; // queued — also spinner (waiting)\n }\n }\n\n private statusLabel(item: FileItem): string {\n switch (item.state) {\n case 'queued': return 'Waiting to upload';\n case 'uploading': return `Uploading ${Math.round(item.progress)} percent`;\n case 'done': return 'Upload complete';\n case 'failed': return item.error ? `Failed: ${item.error}` : 'Upload failed';\n case 'cancelled': return 'Cancelled';\n }\n }\n\n private setItemState(item: FileItem, state: FileItemState, progress?: number) {\n item.state = state;\n if (progress !== undefined) item.progress = progress;\n if (item.$row) item.$row.dataset.state = state;\n if (item.$bar) item.$bar.style.width = `${item.progress}%`;\n if (item.$status) {\n item.$status.innerHTML = this.statusIcon(state);\n item.$status.setAttribute('aria-label', this.statusLabel(item));\n }\n if (item.$meta) {\n // Augment the meta line with live state — keeps the eye on a single spot\n // for \"what's happening\" without adding another text row.\n const size = formatBytes(item.file.size);\n switch (state) {\n case 'uploading':\n item.$meta.textContent = `${size} · ${Math.round(item.progress)}%`;\n break;\n case 'done':\n item.$meta.textContent = size;\n break;\n case 'failed':\n item.$meta.textContent = item.error || 'Failed';\n break;\n default:\n item.$meta.textContent = size;\n }\n }\n this.updateSummary();\n }\n\n private updateSummary() {\n if (!this.$summary) return;\n const total = this.items.length;\n if (total === 0) { this.$summary.textContent = ''; return; }\n const done = this.items.filter(i => i.state === 'done').length;\n const failed = this.items.filter(i => i.state === 'failed').length;\n const active = this.items.filter(i => i.state === 'uploading' || i.state === 'queued').length;\n if (active > 0) {\n this.$summary.textContent = `Uploading ${done + 1} of ${total}`;\n } else if (failed > 0) {\n this.$summary.textContent = `${done} of ${total} uploaded · ${failed} failed`;\n } else if (done === total) {\n this.$summary.textContent = `${total} file${total === 1 ? '' : 's'} uploaded`;\n } else {\n this.$summary.textContent = `${total} file${total === 1 ? '' : 's'} ready`;\n }\n }\n\n private refreshConfirm() {\n if (!this.$confirm) return;\n const queued = this.items.filter(i => i.state === 'queued').length;\n this.$confirm.disabled = queued === 0 || this.uploadStarted;\n }\n\n // ---- upload -------------------------------------------------------------\n\n private async startUpload() {\n if (this.uploadStarted) return;\n const queued = this.items.filter(i => i.state === 'queued');\n if (queued.length === 0) return;\n\n this.uploadStarted = true;\n if (this.$confirm) {\n this.$confirm.disabled = true;\n this.$confirm.textContent = 'Uploading…';\n }\n if (this.$cancel) this.$cancel.textContent = 'Stop';\n if (this.$closeBtn) this.$closeBtn.disabled = true;\n if (this.$input) this.$input.disabled = true;\n\n // Map PickedFile.uploadId → FileItem so callbacks update the right row.\n const itemByUploadId = new Map<string, FileItem>();\n const filesToUpload = queued.map(i => i.file);\n\n try {\n await this.client.uploadMany(filesToUpload, {\n ...this.opts,\n signal: this.abortCtrl.signal,\n onUploadStarted: (pickedFiles: PickedFile[]) => {\n // Pair each PickedFile to the queued FileItem in order.\n pickedFiles.forEach((p, idx) => {\n const item = queued[idx];\n if (item) {\n item.uploadId = p.uploadId;\n if (item.$row) item.$row.dataset.uploadId = p.uploadId;\n itemByUploadId.set(p.uploadId, item);\n }\n });\n this.opts.onUploadStarted?.(pickedFiles);\n },\n onFileUploadStarted: p => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) this.setItemState(item, 'uploading', 0);\n this.opts.onFileUploadStarted?.(p);\n },\n onFileUploadProgress: (p, ev) => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) this.setItemState(item, 'uploading', ev.totalPercent);\n this.opts.onFileUploadProgress?.(p, ev);\n },\n onFileUploadFinished: f => {\n const item = itemByUploadId.get(f.uploadId);\n if (item) {\n item.uploaded = f;\n this.setItemState(item, 'done', 100);\n }\n this.opts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (p, err) => {\n const item = itemByUploadId.get(p.uploadId);\n if (item) {\n item.error = err.message;\n this.setItemState(item, 'failed');\n }\n this.opts.onFileUploadFailed?.(p, err);\n },\n onUploadDone: r => {\n this.opts.onUploadDone?.(r);\n this.resolveResult(r);\n this.unmount();\n },\n onError: (err: UploadError) => {\n this.opts.onError?.(err);\n this.resolveResult();\n this.unmount();\n },\n });\n } catch {\n // Errors already surfaced via onError / onFileUploadFailed.\n if (!this.resolved) {\n this.resolveResult();\n this.unmount();\n }\n }\n }\n\n private resolveResult(result?: PickResponse) {\n if (this.resolved) return;\n this.resolved = true;\n const fallback: PickResponse = result ?? {\n filesUploaded: this.items.filter(i => i.uploaded).map(i => i.uploaded!),\n filesFailed: this.items\n .filter(i => i.state === 'failed')\n .map(i => ({\n file: {\n uploadId: i.uploadId,\n filename: i.file.name,\n mimetype: i.file.type || 'application/octet-stream',\n size: i.file.size,\n source: 'local',\n },\n error: {\n code: 'VALIDATION',\n message: i.error || 'failed',\n retryable: false,\n },\n })),\n };\n this.resolvePromise(fallback);\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction el(tag: string, className: string, text?: string): HTMLElement {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;\n}\n\nfunction cryptoId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return (crypto as { randomUUID: () => string }).randomUUID().replace(/-/g, '');\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\n// Fetch a remote URL as a File. The host MUST send CORS headers — there's no\n// way around that from a browser-only SDK. We surface a clear message in the\n// dropzone hint when the fetch fails so the user understands why.\nasync function fetchUrlAsFile(url: string): Promise<File> {\n let res: Response;\n try {\n res = await fetch(url, { mode: 'cors', credentials: 'omit' });\n } catch {\n throw new Error(`Could not reach ${shortHost(url)} — check the URL or CORS.`);\n }\n if (!res.ok) throw new Error(`Server returned ${res.status} — file unavailable.`);\n const blob = await res.blob();\n const filename = filenameFromUrl(url) || 'download';\n const type = blob.type || guessMimeFromExt(filename);\n return new File([blob], filename, { type });\n}\n\nfunction shortHost(url: string): string {\n try { return new URL(url).host; } catch { return 'that host'; }\n}\n\nfunction filenameFromUrl(url: string): string {\n try {\n const u = new URL(url);\n const last = u.pathname.split('/').filter(Boolean).pop();\n return last ? decodeURIComponent(last) : '';\n } catch {\n return '';\n }\n}\n\nfunction guessMimeFromExt(filename: string): string {\n const ext = filename.toLowerCase().split('.').pop() || '';\n const map: Record<string, string> = {\n jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png',\n gif: 'image/gif', webp: 'image/webp', svg: 'image/svg+xml',\n pdf: 'application/pdf', mp4: 'video/mp4', mov: 'video/quicktime',\n mp3: 'audio/mpeg', wav: 'audio/wav', zip: 'application/zip',\n json: 'application/json', txt: 'text/plain', csv: 'text/csv',\n };\n return map[ext] || 'application/octet-stream';\n}\n\nexport function openPicker(client: UnionStackClient, opts: PickerOptions): PickerHandle {\n const picker = new Picker(client, opts);\n return {\n open: () => picker.open(),\n close: () => picker.close(),\n cancel: () => picker.cancel(),\n };\n}\n"]}
|
package/dist/react.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkPCVJ4TVQ_cjs = require('./chunk-PCVJ4TVQ.cjs');
|
|
4
4
|
var React3 = require('react');
|
|
5
5
|
|
|
6
6
|
function _interopNamespace(e) {
|
|
@@ -26,7 +26,7 @@ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
|
|
|
26
26
|
var UnionStackContext = React3__namespace.createContext(null);
|
|
27
27
|
function UnionStackProvider({ children, ...cfg }) {
|
|
28
28
|
const client = React3__namespace.useMemo(
|
|
29
|
-
() => new
|
|
29
|
+
() => new chunkPCVJ4TVQ_cjs.UnionStackClient(cfg),
|
|
30
30
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
31
|
[cfg.apiKey, cfg.chunkSize]
|
|
32
32
|
);
|
package/dist/react.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-
|
|
3
|
-
export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-
|
|
2
|
+
import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-CrIecUWp.cjs';
|
|
3
|
+
export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-CrIecUWp.cjs';
|
|
4
4
|
|
|
5
5
|
interface UnionStackProviderProps extends ClientConfig {
|
|
6
6
|
children: React.ReactNode;
|
package/dist/react.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-
|
|
3
|
-
export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-
|
|
2
|
+
import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-CrIecUWp.js';
|
|
3
|
+
export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-CrIecUWp.js';
|
|
4
4
|
|
|
5
5
|
interface UnionStackProviderProps extends ClientConfig {
|
|
6
6
|
children: React.ReactNode;
|
package/dist/react.js
CHANGED
package/package.json
CHANGED