@masters-union/union-stack 0.1.3 → 0.1.5

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.
@@ -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 a single <style> tag once. Idempotent — safe to call repeatedly. */\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 partial theme into CSS variables on the modal root. */\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': theme?.muted ?? defaults.muted,\n '--us-border': theme?.border ?? defaults.border,\n '--us-radius': theme?.radius ?? '12px',\n };\n}\n\nconst LIGHT_DEFAULTS = {\n primary: '#4f46e5',\n background: '#ffffff',\n foreground: '#0f172a',\n muted: '#64748b',\n border: '#e2e8f0',\n};\nconst DARK_DEFAULTS = {\n primary: '#6366f1',\n background: '#0f172a',\n foreground: '#f1f5f9',\n muted: '#94a3b8',\n border: '#1e293b',\n};\n\n// All selectors namespaced under .us-picker to avoid bleed into host page.\nconst BASE_CSS = `\n.us-picker-backdrop {\n position: fixed; inset: 0; z-index: 2147483000;\n background: rgba(2, 6, 23, 0.55);\n display: flex; align-items: center; justify-content: center;\n padding: 16px; font-family: ui-sans-serif, system-ui, sans-serif;\n animation: us-fade 120ms ease-out;\n}\n@keyframes us-fade { from { opacity: 0; } to { opacity: 1; } }\n.us-picker {\n background: var(--us-bg); color: var(--us-fg);\n border-radius: var(--us-radius);\n width: 100%; max-width: 480px; max-height: calc(100vh - 32px);\n display: flex; flex-direction: column;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.4);\n overflow: hidden;\n}\n.us-picker * { box-sizing: border-box; }\n.us-picker-header {\n display: flex; align-items: center; gap: 12px;\n padding: 16px 20px; border-bottom: 1px solid var(--us-border);\n}\n.us-picker-header img { height: 24px; }\n.us-picker-title { font-weight: 600; font-size: 16px; flex: 1; }\n.us-picker-close {\n background: none; border: 0; cursor: pointer;\n color: var(--us-muted); font-size: 22px; line-height: 1;\n padding: 4px 8px; border-radius: 6px;\n}\n.us-picker-close:hover { background: var(--us-border); color: var(--us-fg); }\n.us-picker-body { padding: 20px; overflow-y: auto; }\n.us-dropzone {\n border: 2px dashed var(--us-border); border-radius: var(--us-radius);\n padding: 32px 20px; text-align: center; cursor: pointer;\n transition: border-color 120ms, background 120ms;\n}\n.us-dropzone:hover, .us-dropzone[data-drag=\"over\"] {\n border-color: var(--us-primary);\n background: color-mix(in srgb, var(--us-primary) 5%, transparent);\n}\n.us-dropzone-title { font-weight: 500; margin-bottom: 4px; }\n.us-dropzone-hint { color: var(--us-muted); font-size: 13px; }\n.us-file-list { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }\n.us-file {\n display: flex; align-items: center; gap: 12px;\n padding: 10px 12px; border: 1px solid var(--us-border);\n border-radius: 10px; font-size: 14px;\n}\n.us-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.us-file-meta { color: var(--us-muted); font-size: 12px; }\n.us-file-progress {\n height: 4px; background: var(--us-border); border-radius: 999px; overflow: hidden;\n margin-top: 6px;\n}\n.us-file-progress-bar {\n height: 100%; background: var(--us-primary);\n width: 0%; transition: width 200ms;\n}\n.us-file[data-state=\"done\"] .us-file-progress-bar { background: #16a34a; width: 100%; }\n.us-file[data-state=\"failed\"] .us-file-progress-bar { background: #dc2626; }\n.us-actions {\n display: flex; gap: 8px; justify-content: flex-end;\n padding: 14px 20px; border-top: 1px solid var(--us-border);\n}\n.us-btn {\n padding: 8px 14px; border-radius: 8px; border: 1px solid var(--us-border);\n background: transparent; color: var(--us-fg); cursor: pointer; font-size: 14px;\n font-weight: 500;\n}\n.us-btn:hover { background: var(--us-border); }\n.us-btn-primary {\n background: var(--us-primary); color: white; border-color: var(--us-primary);\n}\n.us-btn-primary:hover { filter: brightness(0.95); }\n.us-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.us-footer {\n padding: 8px 20px; font-size: 11px; color: var(--us-muted); text-align: center;\n}\n.us-footer a { color: var(--us-muted); }\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 // DOM refs we mutate on progress.\n $row?: HTMLElement;\n $bar?: HTMLElement;\n $status?: HTMLElement;\n}\n\nconst DEFAULT_TITLE = 'Upload files';\nconst FOOTER_LINK = 'https://unionstack.mastersunion.link';\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 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 if (this.opts.branding?.logoUrl) {\n const logo = document.createElement('img');\n logo.src = this.opts.branding.logoUrl;\n logo.alt = 'logo';\n header.appendChild(logo);\n }\n const title = el('div', 'us-picker-title', this.opts.branding?.title ?? DEFAULT_TITLE);\n header.appendChild(title);\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.textContent = '×';\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 actions = el('div', 'us-actions');\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 this.$confirm = document.createElement('button');\n this.$confirm.type = 'button';\n this.$confirm.className = 'us-btn us-btn-primary';\n this.$confirm.textContent = 'Upload';\n this.$confirm.disabled = true;\n this.$confirm.onclick = () => this.startUpload();\n actions.appendChild(this.$cancel);\n actions.appendChild(this.$confirm);\n panel.appendChild(actions);\n\n if (!this.opts.branding?.hideFooter) {\n const footer = el('div', 'us-footer');\n footer.innerHTML = `Powered by <a href=\"${FOOTER_LINK}\" target=\"_blank\" rel=\"noopener\">UnionStack</a>`;\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.appendChild(el('div', 'us-dropzone-title', 'Drag files here'));\n dz.appendChild(el('div', 'us-dropzone-hint', 'or click to browse'));\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 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\n private renderItem(item: FileItem) {\n if (!this.$list) return;\n const row = el('div', 'us-file');\n row.dataset.state = item.state;\n row.dataset.uploadId = item.uploadId;\n\n const main = el('div', '', '');\n main.style.flex = '1';\n main.style.minWidth = '0';\n main.appendChild(el('div', 'us-file-name', item.file.name));\n\n const meta = el('div', 'us-file-meta', formatBytes(item.file.size));\n main.appendChild(meta);\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 row.appendChild(main);\n\n const status = el('div', 'us-file-meta');\n status.style.minWidth = '60px';\n status.style.textAlign = 'right';\n status.textContent = item.state === 'failed'\n ? (item.error || 'failed')\n : item.state === 'done' ? 'done' : '0%';\n row.appendChild(status);\n\n item.$row = row;\n item.$bar = bar;\n item.$status = status;\n\n this.$list.appendChild(row);\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 if (state === 'failed') item.$status.textContent = item.error || 'failed';\n else if (state === 'done') item.$status.textContent = 'done';\n else item.$status.textContent = `${Math.round(item.progress)}%`;\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/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.mastersunion.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"]}
package/dist/react.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk445C5G3Q_cjs = require('./chunk-445C5G3Q.cjs');
3
+ var chunkGJ2ORKJM_cjs = require('./chunk-GJ2ORKJM.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 chunk445C5G3Q_cjs.UnionStackClient(cfg),
29
+ () => new chunkGJ2ORKJM_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-DrOHTZ94.cjs';
3
- export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-DrOHTZ94.cjs';
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-AMBRkgCm.cjs';
3
+ export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-AMBRkgCm.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-DrOHTZ94.js';
3
- export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-DrOHTZ94.js';
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-AMBRkgCm.js';
3
+ export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-AMBRkgCm.js';
4
4
 
5
5
  interface UnionStackProviderProps extends ClientConfig {
6
6
  children: React.ReactNode;
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { UnionStackClient } from './chunk-I4NHLGGL.js';
1
+ import { UnionStackClient } from './chunk-YLAPR7HG.js';
2
2
  import * as React3 from 'react';
3
3
 
4
4
  var UnionStackContext = React3.createContext(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masters-union/union-stack",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "UnionStack — file upload SDK. Direct-to-R2 multipart uploads with a small client surface.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -50,9 +50,9 @@
50
50
  "prepublishOnly": "npm run clean && npm run typecheck && npm run build",
51
51
  "publish-cdn": "node scripts/publish-cdn.mjs",
52
52
  "deploy": "npm run deploy:patch",
53
- "deploy:patch": "npm version patch -m 'release: v%s' && git push --follow-tags",
54
- "deploy:minor": "npm version minor -m 'release: v%s' && git push --follow-tags",
55
- "deploy:major": "npm version major -m 'release: v%s' && git push --follow-tags"
53
+ "deploy:patch": "npm version patch -m 'release: v%s' && npm run build && npm run publish-cdn && git push --follow-tags",
54
+ "deploy:minor": "npm version minor -m 'release: v%s' && npm run build && npm run publish-cdn && git push --follow-tags",
55
+ "deploy:major": "npm version major -m 'release: v%s' && npm run build && npm run publish-cdn && git push --follow-tags"
56
56
  },
57
57
  "keywords": [
58
58
  "upload",