@proveanything/smartlinks-utils-ui 1.13.4 → 1.13.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AssetPicker/types.ts","../src/components/AssetPicker/useAssets.ts","../src/components/AssetPicker/useAppRegistry.ts","../src/components/AssetPicker/AssetGrid.tsx","../src/components/AssetPicker/imageProcessing.ts","../src/components/AssetPicker/UploadZone.tsx","../src/components/AssetPicker/UrlImport.tsx","../src/components/AssetPicker/AIImageGenerate.tsx","../src/components/AssetPicker/StockPhotoSearch.tsx","../src/components/AssetPicker/TagEditor.tsx","../src/components/AssetPicker/AssetPickerContent.tsx","../src/components/AssetPicker/AssetPicker.tsx","../src/components/AssetPicker/index.ts"],"names":["SL2","useState","useEffect","useCallback","Image","asset","useRef","UploadIcon","useMemo","jsxs","jsx","Pencil","Check","Loader2","SL3","SL4","AlertCircle","ImageIcon","TagIcon","X","React","createPortal","Fragment","Tag","Search"],"mappings":"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","file":"chunk-N2FPPTHH.js","sourcesContent":["// =============================================================================\r\n// ASSET PICKER — Types\r\n// =============================================================================\r\n\r\n/** Where to scope asset operations */\r\nexport type AssetScope =\r\n | { type: 'collection'; collectionId: string }\r\n | { type: 'product'; collectionId: string; productId: string }\r\n | { type: 'proof'; collectionId: string; productId: string; proofId: string };\r\n\r\n/** How the picker presents itself */\r\nexport type AssetPickerMode = 'inline' | 'dialog';\r\n\r\n/** An asset returned from SmartLinks */\r\nexport interface AssetItem {\r\n id: string;\r\n url: string;\r\n name: string;\r\n mimeType?: string;\r\n size?: number;\r\n createdAt?: string;\r\n metadata?: Record<string, any>;\r\n assetType?: string;\r\n type?: string;\r\n collectionId?: string;\r\n hash?: string;\r\n /**\r\n * Canonical WebP thumbnail (max 512px longest edge, no crop).\r\n * Always `.webp`. `null` until thumbnail generation has run; SVGs are skipped.\r\n * Prefer this over the deprecated `thumbnails` map.\r\n */\r\n thumbnail?: string | null;\r\n /** Owning app id (top-level since SDK 1.13). Falls back to metadata.appId/metadata.app on older payloads. */\r\n app?: string | null;\r\n /** Arbitrary string labels for filtering / categorisation (SDK 1.13). */\r\n labels?: string[];\r\n /** Lifecycle status — SDK 1.13. */\r\n status?: 'active' | 'pending_review' | 'deleted';\r\n deletedAt?: string | null;\r\n /**\r\n * @deprecated Legacy multi-size thumbnail map. Use `thumbnail` instead.\r\n * Kept for backward-compatibility with older SDK payloads.\r\n */\r\n thumbnails?: {\r\n x100?: string;\r\n x200?: string;\r\n x512?: string;\r\n [key: string]: string | undefined;\r\n };\r\n site?: string;\r\n cleanName?: string;\r\n}\r\n\r\n/** What the picker returns on selection */\r\nexport interface AssetPickerSelection {\r\n id: string;\r\n url: string;\r\n name: string;\r\n mimeType?: string;\r\n size?: number;\r\n metadata?: Record<string, any>;\r\n /** Canonical thumbnail URL (preferred). */\r\n thumbnail?: string | null;\r\n /** Owning app id, when known. */\r\n app?: string | null;\r\n /** Labels attached to the asset. */\r\n labels?: string[];\r\n /**\r\n * @deprecated Use `thumbnail`. Kept so existing host integrations don't break.\r\n */\r\n thumbnails?: AssetItem['thumbnails'];\r\n}\r\n\r\n/** View mode for the asset grid */\r\nexport type AssetViewMode = 'grid' | 'list';\r\n\r\n/** MIME type filter presets */\r\nexport type AssetMimeFilter = 'all' | 'image' | 'video' | 'audio' | 'document' | 'pdf';\r\n\r\nexport const ASSET_MIME_FILTERS: { value: AssetMimeFilter; label: string; prefix?: string }[] = [\r\n { value: 'all', label: 'All files' },\r\n { value: 'image', label: 'Images', prefix: 'image/' },\r\n { value: 'video', label: 'Videos', prefix: 'video/' },\r\n { value: 'audio', label: 'Audio', prefix: 'audio/' },\r\n { value: 'document', label: 'Documents', prefix: 'application/' },\r\n { value: 'pdf', label: 'PDFs', prefix: 'application/pdf' },\r\n];\r\n\r\n/**\r\n * Scope of the app filter when an `appId` prop is supplied:\r\n * - 'app' — only assets uploaded by this app (default)\r\n * - 'all' — every asset in the collection scope, regardless of owning app\r\n */\r\nexport type AssetAppFilter = 'app' | 'all';\r\n\r\nexport interface AssetPickerProps {\r\n /** Scope determines which assets are listed and where uploads go */\r\n scope: AssetScope;\r\n\r\n /**\r\n * Optional product scope — when provided alongside a collection scope,\r\n * shows tabs for \"Collection\" and \"Product\" assets.\r\n */\r\n productScope?: { collectionId: string; productId: string };\r\n\r\n /**\r\n * Optional app identifier. When provided:\r\n * - Every upload (file, URL import, AI, stock photo) is stamped with this `appId`\r\n * so it can be filtered later via the SDK.\r\n * - The picker shows two pill tabs: \"This app\" (default) and \"All in collection\".\r\n * - When viewing \"All in collection\", assets owned by *other* apps are visually\r\n * badged with their owning appId so users know where they came from.\r\n *\r\n * Without this prop the picker behaves exactly as before — no app scoping,\r\n * no app filter UI, no provenance badges.\r\n */\r\n appId?: string;\r\n\r\n /**\r\n * Human-readable label for the current `appId`, used in the \"This app\" pill\r\n * and the provenance badges. Defaults to the raw `appId` when omitted.\r\n */\r\n appName?: string;\r\n\r\n /** Default app filter when `appId` is set. Defaults to 'app'. */\r\n defaultAppFilter?: AssetAppFilter;\r\n\r\n /** Display mode — inline grid or dialog/modal popup */\r\n mode?: AssetPickerMode;\r\n\r\n /** Whether to allow uploading new assets */\r\n allowUpload?: boolean;\r\n\r\n /** Whether to allow importing from URL */\r\n allowUrlImport?: boolean;\r\n\r\n /**\r\n * Whether to allow generating images via AI (admin only).\r\n * Defaults to true when the picker is accepting images and the scope has a collectionId.\r\n */\r\n allowAIGenerate?: boolean;\r\n\r\n /**\r\n * Whether to allow searching free stock photos (admin only).\r\n * Defaults to true when the picker is accepting images and the scope has a collectionId.\r\n */\r\n allowStockPhotos?: boolean;\r\n\r\n /** Whether to allow selecting multiple assets */\r\n multiple?: boolean;\r\n\r\n /** Filter by MIME type prefix, e.g. 'image/' */\r\n accept?: string;\r\n\r\n /** Show the MIME type filter dropdown (default: true when accept is not set) */\r\n showTypeFilter?: boolean;\r\n\r\n /** Currently selected asset ID(s) */\r\n value?: string | string[];\r\n\r\n /** Called when selection changes */\r\n onSelect?: (selection: AssetPickerSelection | AssetPickerSelection[]) => void;\r\n\r\n /** Called when picker is dismissed (dialog mode) */\r\n onClose?: () => void;\r\n\r\n /** Whether the dialog is open (dialog mode, controlled) */\r\n open?: boolean;\r\n\r\n /** Trigger element for dialog mode (renders as the button that opens it) */\r\n trigger?: React.ReactNode;\r\n\r\n /** Additional CSS class */\r\n className?: string;\r\n\r\n /** Max number of assets to load per page */\r\n pageSize?: number;\r\n\r\n /** Whether to allow deleting assets (admin only) */\r\n allowDelete?: boolean;\r\n\r\n /** Default view mode */\r\n defaultView?: AssetViewMode;\r\n\r\n /** Placeholder text for empty state */\r\n emptyText?: string;\r\n\r\n /** Max width for dialog mode (CSS value, e.g. '900px', '80vw'). Default: '56rem' (max-w-4xl) */\r\n dialogMaxWidth?: string;\r\n\r\n /**\r\n * Client-side image optimization on upload (re-encode to WebP and downscale).\r\n * - Omitted (default): user-controlled, defaults ON, persisted in localStorage.\r\n * - `false`: disable entirely and hide the toggle (e.g. apps that need full-quality originals).\r\n * - `true`: force-enable and hide the toggle.\r\n * - Object: enable with custom defaults; `userToggleable` (default true) controls whether the toggle is shown.\r\n */\r\n imageOptimization?: boolean | {\r\n /** Initial state of the toggle. Defaults true. */\r\n defaultEnabled?: boolean;\r\n /** Show the toggle to the user. Defaults true. */\r\n userToggleable?: boolean;\r\n /** Cap longest edge in px. Defaults 2048. Set 0 to skip resizing. */\r\n maxDimension?: number;\r\n /** WebP quality 0..1. Defaults 0.85. */\r\n quality?: number;\r\n };\r\n}\r\n","// =============================================================================\r\n// ASSET PICKER — useAssets hook\r\n// =============================================================================\r\n// Manages asset fetching, uploading, and deletion via the SmartLinks SDK.\r\n\r\nimport { useState, useCallback, useEffect, useRef } from 'react';\r\nimport * as SL from '@proveanything/smartlinks';\r\nimport type { AssetScope, AssetItem } from './types';\r\n\r\ninterface UseAssetsOptions {\r\n scope: AssetScope;\r\n accept?: string;\r\n pageSize?: number;\r\n /**\r\n * When provided to `list()`, only assets stamped with this `appId` are returned.\r\n * When provided to upload paths, every uploaded asset is stamped with this `appId`.\r\n */\r\n appId?: string;\r\n /**\r\n * Optional override: filter by appId on list() (typically equals `appId`),\r\n * but pass `undefined` here to list ALL assets in the scope while still\r\n * stamping new uploads with `appId`. Lets the picker switch between\r\n * \"this app only\" and \"all in collection\" without losing upload provenance.\r\n */\r\n listAppId?: string;\r\n}\r\n\r\ninterface UseAssetsReturn {\r\n assets: AssetItem[];\r\n loading: boolean;\r\n error: string | null;\r\n refresh: () => Promise<void>;\r\n /** Optional `scopeOverride` lets callers upload to a wider/narrower scope\r\n * than the hook's default (e.g. \"make global\" toggles upload to collection\r\n * even when the picker is showing the product tab). */\r\n upload: (file: File, onProgress?: (pct: number) => void, scopeOverride?: AssetScope) => Promise<AssetItem | null>;\r\n uploadFromUrl: (url: string, name?: string, scopeOverride?: AssetScope) => Promise<AssetItem | null>;\r\n /**\r\n * Server-side ingest — the SmartLinks backend fetches the URL directly and\r\n * stores it in the CDN. Use for AI-generated images, stock photos, or any\r\n * URL where client-side fetch would hit CORS.\r\n */\r\n uploadFromRemoteUrl: (url: string, opts?: { name?: string; metadata?: Record<string, any>; scopeOverride?: AssetScope }) => Promise<AssetItem | null>;\r\n /**\r\n * Soft-delete via `asset.deleteAdmin` (recoverable for `graceDays`, default 30).\r\n * Falls back to legacy `asset.remove` for callers without a collection scope.\r\n */\r\n remove: (assetId: string, opts?: { graceDays?: number }) => Promise<boolean>;\r\n /** Restore a soft-deleted asset (clears `deletedAt`). Admin only. */\r\n restore: (assetId: string) => Promise<AssetItem | null>;\r\n /** Replace an asset's file. Previous URL is snapshotted into `versions[]`. Admin only. */\r\n replaceFile: (assetId: string, file: File, onProgress?: (pct: number) => void) => Promise<AssetItem | null>;\r\n /** Update asset metadata (name, labels, appId, metadata, thumbnail override). Admin only. */\r\n updateAsset: (assetId: string, patch: { name?: string; appId?: string; labels?: string[]; metadata?: Record<string, any>; thumbnail?: string }) => Promise<AssetItem | null>;\r\n uploading: boolean;\r\n uploadProgress: number;\r\n}\r\n\r\nexport function useAssets({ scope, accept, pageSize, appId, listAppId }: UseAssetsOptions): UseAssetsReturn {\r\n const [assets, setAssets] = useState<AssetItem[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [uploading, setUploading] = useState(false);\r\n const [uploadProgress, setUploadProgress] = useState(0);\r\n const mountedRef = useRef(true);\r\n\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n return () => { mountedRef.current = false; };\r\n }, []);\r\n\r\n const fetchAssets = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await SL.asset.list({\r\n scope,\r\n mimeTypePrefix: accept,\r\n limit: pageSize,\r\n // Only filter by appId when explicitly requested. When listAppId is undefined,\r\n // we list every asset in the scope — even if uploads are still being stamped\r\n // with `appId`. This is what powers the \"All in collection\" pill.\r\n ...(listAppId ? { appId: listAppId } : {}),\r\n } as any);\r\n if (mountedRef.current) {\r\n setAssets(result as AssetItem[]);\r\n }\r\n } catch (err: any) {\r\n if (mountedRef.current) {\r\n setError(err?.message || 'Failed to load assets');\r\n setAssets([]);\r\n }\r\n } finally {\r\n if (mountedRef.current) setLoading(false);\r\n }\r\n }, [scope.type, (scope as any).collectionId, (scope as any).productId, (scope as any).proofId, accept, pageSize, listAppId]);\r\n\r\n useEffect(() => {\r\n fetchAssets();\r\n }, [fetchAssets]);\r\n\r\n const upload = useCallback(async (file: File, onProgress?: (pct: number) => void, scopeOverride?: AssetScope): Promise<AssetItem | null> => {\r\n setUploading(true);\r\n setUploadProgress(0);\r\n try {\r\n const result = await SL.asset.upload({\r\n file,\r\n scope: scopeOverride || scope,\r\n name: file.name,\r\n admin: true,\r\n ...(appId ? { appId } : {}),\r\n onProgress: (pct: number) => {\r\n setUploadProgress(pct);\r\n onProgress?.(pct);\r\n },\r\n });\r\n // Only prepend to current list if the upload landed in the same scope we\r\n // are listing — otherwise the host should switch scope and refetch.\r\n if (mountedRef.current && !scopeOverride) {\r\n setAssets(prev => [result as AssetItem, ...prev]);\r\n }\r\n return result as AssetItem;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Upload failed');\r\n return null;\r\n } finally {\r\n if (mountedRef.current) {\r\n setUploading(false);\r\n setUploadProgress(0);\r\n }\r\n }\r\n }, [scope, appId]);\r\n\r\n const uploadFromUrl = useCallback(async (url: string, name?: string, scopeOverride?: AssetScope): Promise<AssetItem | null> => {\r\n setUploading(true);\r\n setUploadProgress(0);\r\n try {\r\n // Fetch the file from URL first, then upload\r\n const response = await fetch(url);\r\n if (!response.ok) throw new Error(`Failed to fetch: ${response.statusText}`);\r\n const blob = await response.blob();\r\n const fileName = name || url.split('/').pop()?.split('?')[0] || 'imported-file';\r\n const file = new File([blob], fileName, { type: blob.type });\r\n return await upload(file, undefined, scopeOverride);\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'URL import failed');\r\n return null;\r\n } finally {\r\n if (mountedRef.current) {\r\n setUploading(false);\r\n setUploadProgress(0);\r\n }\r\n }\r\n }, [upload]);\r\n\r\n const uploadFromRemoteUrl = useCallback(async (\r\n url: string,\r\n opts?: { name?: string; metadata?: Record<string, any>; scopeOverride?: AssetScope }\r\n ): Promise<AssetItem | null> => {\r\n setUploading(true);\r\n setUploadProgress(0);\r\n try {\r\n const result = await SL.asset.uploadFromUrl({\r\n url,\r\n scope: opts?.scopeOverride || scope,\r\n metadata: { name: opts?.name, ...(opts?.metadata || {}) },\r\n ...(appId ? { appId } : {}),\r\n admin: true,\r\n } as any);\r\n if (mountedRef.current && !opts?.scopeOverride) {\r\n setAssets(prev => [result as AssetItem, ...prev]);\r\n }\r\n return result as AssetItem;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Remote URL ingest failed');\r\n return null;\r\n } finally {\r\n if (mountedRef.current) {\r\n setUploading(false);\r\n setUploadProgress(0);\r\n }\r\n }\r\n }, [scope, appId]);\r\n\r\n const remove = useCallback(async (assetId: string): Promise<boolean> => {\r\n const collectionId = (scope as any).collectionId as string | undefined;\r\n try {\r\n if (collectionId && (SL.asset as any).deleteAdmin) {\r\n // SDK 1.13: soft delete with grace period; recoverable via restore().\r\n await (SL.asset as any).deleteAdmin({ collectionId, assetId });\r\n } else {\r\n await SL.asset.remove({ assetId, scope });\r\n }\r\n if (mountedRef.current) {\r\n setAssets(prev => prev.filter(a => a.id !== assetId));\r\n }\r\n return true;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Delete failed');\r\n return false;\r\n }\r\n }, [scope]);\r\n\r\n const restore = useCallback(async (assetId: string): Promise<AssetItem | null> => {\r\n const collectionId = (scope as any).collectionId as string | undefined;\r\n if (!collectionId) {\r\n if (mountedRef.current) setError('Restore requires a collection scope');\r\n return null;\r\n }\r\n try {\r\n const result = await (SL.asset as any).restoreAdmin(collectionId, assetId);\r\n if (mountedRef.current) {\r\n setAssets(prev => {\r\n const exists = prev.some(a => a.id === assetId);\r\n return exists\r\n ? prev.map(a => (a.id === assetId ? (result as AssetItem) : a))\r\n : [result as AssetItem, ...prev];\r\n });\r\n }\r\n return result as AssetItem;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Restore failed');\r\n return null;\r\n }\r\n }, [scope]);\r\n\r\n const replaceFile = useCallback(async (\r\n assetId: string,\r\n file: File,\r\n onProgress?: (pct: number) => void,\r\n ): Promise<AssetItem | null> => {\r\n const collectionId = (scope as any).collectionId as string | undefined;\r\n if (!collectionId) {\r\n if (mountedRef.current) setError('Replace requires a collection scope');\r\n return null;\r\n }\r\n setUploading(true);\r\n setUploadProgress(0);\r\n try {\r\n const result = await (SL.asset as any).replaceFile({\r\n collectionId,\r\n assetId,\r\n file,\r\n onProgress: (pct: number) => {\r\n setUploadProgress(pct);\r\n onProgress?.(pct);\r\n },\r\n });\r\n if (mountedRef.current) {\r\n setAssets(prev => prev.map(a => (a.id === assetId ? (result as AssetItem) : a)));\r\n }\r\n return result as AssetItem;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Replace failed');\r\n return null;\r\n } finally {\r\n if (mountedRef.current) {\r\n setUploading(false);\r\n setUploadProgress(0);\r\n }\r\n }\r\n }, [scope]);\r\n\r\n const updateAsset = useCallback(async (\r\n assetId: string,\r\n patch: { name?: string; appId?: string; labels?: string[]; metadata?: Record<string, any>; thumbnail?: string },\r\n ): Promise<AssetItem | null> => {\r\n const collectionId = (scope as any).collectionId as string | undefined;\r\n if (!collectionId) {\r\n if (mountedRef.current) setError('Update requires a collection scope');\r\n return null;\r\n }\r\n try {\r\n const result = await (SL.asset as any).updateAdmin({ collectionId, assetId, ...patch });\r\n if (mountedRef.current) {\r\n setAssets(prev => prev.map(a => (a.id === assetId ? (result as AssetItem) : a)));\r\n }\r\n return result as AssetItem;\r\n } catch (err: any) {\r\n if (mountedRef.current) setError(err?.message || 'Update failed');\r\n return null;\r\n }\r\n }, [scope]);\r\n\r\n return {\r\n assets,\r\n loading,\r\n error,\r\n refresh: fetchAssets,\r\n upload,\r\n uploadFromUrl,\r\n uploadFromRemoteUrl,\r\n remove,\r\n restore,\r\n replaceFile,\r\n updateAsset,\r\n uploading,\r\n uploadProgress,\r\n };\r\n}\r\n","// =============================================================================\r\n// ASSET PICKER — useAppRegistry hook\r\n// =============================================================================\r\n// Fetches the collection's installed app modules via SL.collection.getAppsConfig\r\n// and exposes friendly-name lookups + the raw list, so the AssetPicker can:\r\n// - resolve a friendly label for the current `appId` when none is supplied\r\n// - render foreign-app provenance badges with human-readable names\r\n// - offer a per-app filter inside \"All in collection\"\r\n//\r\n// Results are cached at module scope per collectionId; concurrent callers share\r\n// the same in-flight promise.\r\n\r\nimport { useEffect, useState, useCallback, useMemo } from 'react';\r\nimport * as SL from '@proveanything/smartlinks';\r\n\r\nexport interface AppRegistryEntry {\r\n /** Installed app instance id (matches the asset's `appId`). */\r\n id: string;\r\n /** Friendly display name (falls back to id if missing). */\r\n name: string;\r\n faIcon?: string;\r\n hidden?: boolean;\r\n category?: string;\r\n}\r\n\r\ninterface CacheEntry {\r\n promise?: Promise<AppRegistryEntry[]>;\r\n data?: AppRegistryEntry[];\r\n error?: string;\r\n}\r\n\r\nconst cache = new Map<string, CacheEntry>();\r\n\r\nasync function loadApps(collectionId: string): Promise<AppRegistryEntry[]> {\r\n const existing = cache.get(collectionId);\r\n if (existing?.data) return existing.data;\r\n if (existing?.promise) return existing.promise;\r\n\r\n const promise = (async () => {\r\n try {\r\n const result: any = await (SL as any).collection.getAppsConfig(collectionId);\r\n const apps: any[] = Array.isArray(result?.apps) ? result.apps : Array.isArray(result) ? result : [];\r\n const mapped: AppRegistryEntry[] = apps.map((a) => ({\r\n id: a.id,\r\n name: a.name || a.id,\r\n faIcon: a.faIcon,\r\n hidden: a.hidden,\r\n category: a.category,\r\n }));\r\n cache.set(collectionId, { data: mapped });\r\n return mapped;\r\n } catch (err: any) {\r\n cache.set(collectionId, { error: err?.message || 'Failed to load apps', data: [] });\r\n return [];\r\n }\r\n })();\r\n\r\n cache.set(collectionId, { promise });\r\n return promise;\r\n}\r\n\r\nexport interface UseAppRegistryReturn {\r\n apps: AppRegistryEntry[];\r\n loading: boolean;\r\n /** Returns the friendly name for an appId, or the id itself when unknown. */\r\n getAppName: (appId: string | undefined | null) => string;\r\n /** Returns the full registry entry, or undefined if the id is unknown. */\r\n getApp: (appId: string | undefined | null) => AppRegistryEntry | undefined;\r\n}\r\n\r\n/**\r\n * Loads the app registry for a collection. When `collectionId` is falsy, returns\r\n * an empty registry — callers can safely use `getAppName(id)` which falls back to\r\n * the raw id in that case.\r\n */\r\nexport function useAppRegistry(collectionId: string | undefined): UseAppRegistryReturn {\r\n const [apps, setApps] = useState<AppRegistryEntry[]>(() =>\r\n collectionId ? cache.get(collectionId)?.data ?? [] : []\r\n );\r\n const [loading, setLoading] = useState<boolean>(() => {\r\n if (!collectionId) return false;\r\n return !cache.get(collectionId)?.data;\r\n });\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n if (!collectionId) {\r\n setApps([]);\r\n setLoading(false);\r\n return () => { cancelled = true; };\r\n }\r\n const cached = cache.get(collectionId)?.data;\r\n if (cached) {\r\n setApps(cached);\r\n setLoading(false);\r\n return () => { cancelled = true; };\r\n }\r\n setLoading(true);\r\n loadApps(collectionId).then((data) => {\r\n if (cancelled) return;\r\n setApps(data);\r\n setLoading(false);\r\n });\r\n return () => { cancelled = true; };\r\n }, [collectionId]);\r\n\r\n const lookup = useMemo(() => {\r\n const m = new Map<string, AppRegistryEntry>();\r\n for (const a of apps) m.set(a.id, a);\r\n return m;\r\n }, [apps]);\r\n\r\n const getApp = useCallback(\r\n (appId: string | undefined | null) => (appId ? lookup.get(appId) : undefined),\r\n [lookup]\r\n );\r\n const getAppName = useCallback(\r\n (appId: string | undefined | null) => (appId ? lookup.get(appId)?.name ?? appId : ''),\r\n [lookup]\r\n );\r\n\r\n return { apps, loading, getAppName, getApp };\r\n}\r\n","// =============================================================================\r\n// ASSET PICKER — Asset Grid / List View\r\n// =============================================================================\r\n\r\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { AssetItem, AssetViewMode } from './types';\r\nimport { cn } from '../../utils/cn';\r\nimport { Trash2, Check, FileIcon, Image, Film, Music, FileText, AppWindow, Tag, MoreVertical, Pencil, Upload as UploadIcon } from 'lucide-react';\r\n\r\ninterface AssetGridProps {\r\n assets: AssetItem[];\r\n viewMode: AssetViewMode;\r\n selectedIds: Set<string>;\r\n onToggleSelect: (asset: AssetItem) => void;\r\n onDoubleClickSelect?: (asset: AssetItem) => void;\r\n onDelete?: (assetId: string) => void;\r\n allowDelete?: boolean;\r\n /** Optional rename handler — when present, an Edit option appears in the card menu. */\r\n onRename?: (asset: AssetItem) => void;\r\n /** Optional replace-file handler — when present, a Replace option appears in the card menu. */\r\n onReplace?: (asset: AssetItem) => void;\r\n /** Optional edit-tags handler — when present, an Edit tags option appears in the card menu. */\r\n onEditTags?: (asset: AssetItem) => void;\r\n /**\r\n * The appId that \"owns\" the picker context. Assets stamped with a different\r\n * appId in their metadata are visually badged so users know they came from\r\n * elsewhere in the collection. When omitted, no badges are shown.\r\n */\r\n currentAppId?: string;\r\n /** Friendly label for `currentAppId` (defaults to the raw id). */\r\n currentAppName?: string;\r\n /**\r\n * Optional resolver for friendly app names — used to label foreign-app\r\n * provenance badges. Falls back to the raw appId when the resolver returns\r\n * the same id (or is omitted).\r\n */\r\n getAppName?: (appId: string) => string;\r\n /** Currently active label filters — used to highlight chips on cards. */\r\n activeLabels?: Set<string>;\r\n /** Click handler on a label chip — typically toggles it in the filter. */\r\n onToggleLabel?: (label: string) => void;\r\n}\r\n\r\nfunction getIcon(mimeType?: string) {\r\n if (!mimeType) return FileIcon;\r\n if (mimeType.startsWith('image/')) return Image;\r\n if (mimeType.startsWith('video/')) return Film;\r\n if (mimeType.startsWith('audio/')) return Music;\r\n return FileText;\r\n}\r\n\r\nfunction formatSize(bytes?: number): string {\r\n if (!bytes) return '';\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nfunction getThumbnail(asset: AssetItem): string | null {\r\n // SDK 1.13+ canonical single thumbnail (WebP, ≤512px). Prefer this.\r\n if (asset.thumbnail) return asset.thumbnail;\r\n // Backward-compat with older payloads that still emit the deprecated map.\r\n if (asset.thumbnails?.x200) return asset.thumbnails.x200;\r\n if (asset.thumbnails?.x100) return asset.thumbnails.x100;\r\n if (asset.thumbnails?.x512) return asset.thumbnails.x512;\r\n if (asset.mimeType?.startsWith('image/')) return asset.url;\r\n return null;\r\n}\r\n\r\n/**\r\n * Pulls the owning appId off of an asset. The SDK stores it on the top-level\r\n * `appId` (when supplied to upload) and historically also stamps the\r\n * `metadata.app` field — we tolerate both shapes.\r\n */\r\nfunction getAssetAppId(asset: AssetItem): string | undefined {\r\n return (\r\n asset.app ||\r\n (asset as any).appId ||\r\n (asset.metadata as any)?.appId ||\r\n (asset.metadata as any)?.app ||\r\n undefined\r\n );\r\n}\r\n\r\n/** Small reusable provenance pill — only rendered when needed. */\r\nconst AppBadge: React.FC<{ appId: string; appName?: string; size?: 'sm' | 'xs' }> = ({ appId, appName, size = 'sm' }) => {\r\n const label = appName && appName !== appId ? appName : appId;\r\n const tooltip = appName && appName !== appId\r\n ? `Uploaded by app: ${appName} (${appId})`\r\n : `Uploaded by app: ${appId}`;\r\n return (\r\n <span\r\n className={cn(\r\n 'inline-flex items-center gap-0.5 rounded-full bg-muted text-muted-foreground border border-border max-w-full truncate',\r\n size === 'xs' ? 'px-1 py-0 text-[9px]' : 'px-1.5 py-0.5 text-[10px]',\r\n )}\r\n title={tooltip}\r\n >\r\n <AppWindow className={cn(size === 'xs' ? 'w-2 h-2' : 'w-2.5 h-2.5', 'flex-shrink-0')} />\r\n <span className=\"truncate\">{label}</span>\r\n </span>\r\n );\r\n};\r\n\r\n/**\r\n * Kebab-style action menu for an asset card. Renders a \"⋮\" button plus a\r\n * popover with Rename / Replace file / Delete actions (each shown only when\r\n * the parent supplied a corresponding handler).\r\n */\r\nconst CardMenu: React.FC<{\r\n onRename?: () => void;\r\n onReplace?: () => void;\r\n onEditTags?: () => void;\r\n onDelete?: () => void;\r\n position?: 'absolute' | 'inline';\r\n}> = ({ onRename, onReplace, onEditTags, onDelete, position = 'absolute' }) => {\r\n const [open, setOpen] = useState(false);\r\n const ref = useRef<HTMLDivElement>(null);\r\n const btnRef = useRef<HTMLButtonElement>(null);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n const t = e.target as Node;\r\n if (ref.current?.contains(t)) return;\r\n if (menuRef.current?.contains(t)) return;\r\n setOpen(false);\r\n };\r\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('mousedown', handler);\r\n document.addEventListener('keydown', onKey);\r\n return () => {\r\n document.removeEventListener('mousedown', handler);\r\n document.removeEventListener('keydown', onKey);\r\n };\r\n }, [open]);\r\n\r\n useLayoutEffect(() => {\r\n if (!open) { setPos(null); return; }\r\n const update = () => {\r\n const el = btnRef.current;\r\n if (!el) return;\r\n const r = el.getBoundingClientRect();\r\n const menuW = menuRef.current?.offsetWidth ?? 160;\r\n const menuH = menuRef.current?.offsetHeight ?? 160;\r\n const margin = 8;\r\n let left = Math.min(window.innerWidth - menuW - margin, r.right - menuW);\r\n left = Math.max(margin, left);\r\n // Prefer below; flip above if not enough room.\r\n let top = r.bottom + 4;\r\n if (top + menuH > window.innerHeight - margin) {\r\n top = Math.max(margin, r.top - menuH - 4);\r\n }\r\n setPos({ top, left });\r\n };\r\n update();\r\n window.addEventListener('resize', update);\r\n window.addEventListener('scroll', update, true);\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n window.removeEventListener('scroll', update, true);\r\n };\r\n }, [open]);\r\n\r\n if (!onRename && !onReplace && !onEditTags && !onDelete) return null;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n position === 'absolute'\r\n ? 'absolute top-1.5 left-1.5 z-10'\r\n : 'relative flex-shrink-0',\r\n )}\r\n onClick={(e) => e.stopPropagation()}\r\n onDoubleClick={(e) => e.stopPropagation()}\r\n >\r\n <button\r\n ref={btnRef}\r\n type=\"button\"\r\n onClick={(e) => { e.stopPropagation(); setOpen(o => !o); }}\r\n className={cn(\r\n 'w-6 h-6 rounded-full flex items-center justify-center transition-all',\r\n // Frosted pill so the button stays legible over both light and dark\r\n // thumbnails. Backdrop blur + slight white tint + ring gives a clear\r\n // outline regardless of the underlying image.\r\n 'bg-background/80 backdrop-blur-sm border border-border text-foreground',\r\n 'hover:bg-background shadow-sm ring-1 ring-black/10 dark:ring-white/20',\r\n )}\r\n title=\"Asset actions\"\r\n aria-label=\"Asset actions\"\r\n >\r\n <MoreVertical className=\"w-3 h-3\" />\r\n </button>\r\n {open && typeof document !== 'undefined' && createPortal(\r\n <div\r\n ref={menuRef}\r\n className=\"fixed z-[2147483647] min-w-[160px] rounded-md border border-border bg-popover text-popover-foreground shadow-lg py-1\"\r\n style={pos ? { top: pos.top, left: pos.left } : { visibility: 'hidden', top: 0, left: 0 }}\r\n role=\"menu\"\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\r\n {onRename && (\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n onClick={(e) => { e.stopPropagation(); setOpen(false); onRename(); }}\r\n className=\"w-full flex items-center gap-2 px-2.5 py-1.5 text-xs hover:bg-accent\"\r\n >\r\n <Pencil className=\"w-3 h-3\" /> Rename\r\n </button>\r\n )}\r\n {onReplace && (\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n onClick={(e) => { e.stopPropagation(); setOpen(false); onReplace(); }}\r\n className=\"w-full flex items-center gap-2 px-2.5 py-1.5 text-xs hover:bg-accent\"\r\n >\r\n <UploadIcon className=\"w-3 h-3\" /> Replace file\r\n </button>\r\n )}\r\n {onEditTags && (\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n onClick={(e) => { e.stopPropagation(); setOpen(false); onEditTags(); }}\r\n className=\"w-full flex items-center gap-2 px-2.5 py-1.5 text-xs hover:bg-accent\"\r\n >\r\n <Tag className=\"w-3 h-3\" /> Edit tags\r\n </button>\r\n )}\r\n {onDelete && (\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n onClick={(e) => { e.stopPropagation(); setOpen(false); onDelete(); }}\r\n className=\"w-full flex items-center gap-2 px-2.5 py-1.5 text-xs text-destructive hover:bg-destructive/10\"\r\n >\r\n <Trash2 className=\"w-3 h-3\" /> Delete\r\n </button>\r\n )}\r\n </div>,\r\n document.body,\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst AssetGridItem: React.FC<{\r\n asset: AssetItem;\r\n selected: boolean;\r\n onToggle: () => void;\r\n onDoubleClick?: () => void;\r\n onDelete?: () => void;\r\n onRename?: () => void;\r\n onReplace?: () => void;\r\n onEditTags?: () => void;\r\n allowDelete?: boolean;\r\n currentAppId?: string;\r\n getAppName?: (appId: string) => string;\r\n activeLabels?: Set<string>;\r\n onToggleLabel?: (label: string) => void;\r\n}> = ({ asset, selected, onToggle, onDoubleClick, onDelete, onRename, onReplace, onEditTags, allowDelete, currentAppId, getAppName, activeLabels, onToggleLabel }) => {\r\n const thumb = getThumbnail(asset);\r\n const Icon = getIcon(asset.mimeType);\r\n const ownerAppId = getAssetAppId(asset);\r\n const showAppBadge = !!currentAppId && !!ownerAppId && ownerAppId !== currentAppId;\r\n const labels = asset.labels || [];\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'group relative rounded-lg border-2 cursor-pointer transition-all overflow-hidden',\r\n 'hover:shadow-md',\r\n selected\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-ring'\r\n )}\r\n onClick={onToggle}\r\n onDoubleClick={(e) => { e.preventDefault(); onDoubleClick?.(); }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggle(); } }}\r\n >\r\n {/* Thumbnail / Icon */}\r\n <div className=\"aspect-square bg-muted flex items-center justify-center overflow-hidden\">\r\n {thumb ? (\r\n <img\r\n src={thumb}\r\n alt={asset.name || asset.id}\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n />\r\n ) : (\r\n <Icon className=\"w-8 h-8 text-muted-foreground\" />\r\n )}\r\n </div>\r\n\r\n {/* Name */}\r\n <div className=\"p-2\">\r\n <p className=\"text-xs font-medium truncate text-foreground\" title={asset.name}>\r\n {asset.cleanName || asset.name || asset.id}\r\n </p>\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\r\n {formatSize(asset.size)}\r\n {asset.mimeType && ` • ${asset.mimeType.split('/')[1]?.toUpperCase() || asset.mimeType}`}\r\n </p>\r\n {showAppBadge && (\r\n <div className=\"mt-1\">\r\n <AppBadge appId={ownerAppId!} appName={getAppName?.(ownerAppId!)} size=\"xs\" />\r\n </div>\r\n )}\r\n {labels.length > 0 && (\r\n <div className=\"mt-1 flex flex-wrap gap-0.5\">\r\n {labels.slice(0, 3).map((lbl) => {\r\n const active = !!activeLabels?.has(lbl);\r\n return (\r\n <button\r\n key={lbl}\r\n type=\"button\"\r\n onClick={(e) => { e.stopPropagation(); onToggleLabel?.(lbl); }}\r\n className={cn(\r\n 'inline-flex items-center gap-0.5 rounded-full border px-1 py-0 text-[9px] max-w-full truncate transition-colors',\r\n active\r\n ? 'bg-primary text-primary-foreground border-primary'\r\n : 'bg-muted text-muted-foreground border-border hover:bg-muted/70',\r\n )}\r\n title={`Filter by label: ${lbl}`}\r\n >\r\n <Tag className=\"w-2 h-2 flex-shrink-0\" />\r\n <span className=\"truncate\">{lbl}</span>\r\n </button>\r\n );\r\n })}\r\n {labels.length > 3 && (\r\n <span className=\"text-[9px] text-muted-foreground\">+{labels.length - 3}</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selection check */}\r\n {selected && (\r\n <div className=\"absolute top-2 right-2 w-5 h-5 rounded-full bg-primary flex items-center justify-center z-10 shadow-sm ring-1 ring-black/10 dark:ring-white/20\">\r\n <Check className=\"w-3 h-3 text-primary-foreground\" />\r\n </div>\r\n )}\r\n\r\n {/* Action menu (bottom-right) */}\r\n <CardMenu\r\n onRename={onRename}\r\n onReplace={onReplace}\r\n onEditTags={onEditTags}\r\n onDelete={allowDelete ? onDelete : undefined}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nconst AssetListItem: React.FC<{\r\n asset: AssetItem;\r\n selected: boolean;\r\n onToggle: () => void;\r\n onDoubleClick?: () => void;\r\n onDelete?: () => void;\r\n onRename?: () => void;\r\n onReplace?: () => void;\r\n onEditTags?: () => void;\r\n allowDelete?: boolean;\r\n currentAppId?: string;\r\n getAppName?: (appId: string) => string;\r\n activeLabels?: Set<string>;\r\n onToggleLabel?: (label: string) => void;\r\n}> = ({ asset, selected, onToggle, onDoubleClick, onDelete, onRename, onReplace, onEditTags, allowDelete, currentAppId, getAppName, activeLabels, onToggleLabel }) => {\r\n const thumb = getThumbnail(asset);\r\n const Icon = getIcon(asset.mimeType);\r\n const ownerAppId = getAssetAppId(asset);\r\n const showAppBadge = !!currentAppId && !!ownerAppId && ownerAppId !== currentAppId;\r\n const labels = asset.labels || [];\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'group flex items-center gap-3 p-2 rounded-lg border cursor-pointer transition-all',\r\n 'hover:shadow-sm',\r\n selected\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-ring'\r\n )}\r\n onClick={onToggle}\r\n onDoubleClick={(e) => { e.preventDefault(); onDoubleClick?.(); }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggle(); } }}\r\n >\r\n {/* Thumbnail */}\r\n <div className=\"w-10 h-10 rounded bg-muted flex items-center justify-center overflow-hidden flex-shrink-0\">\r\n {thumb ? (\r\n <img src={thumb} alt={asset.name} className=\"w-full h-full object-cover\" loading=\"lazy\" />\r\n ) : (\r\n <Icon className=\"w-4 h-4 text-muted-foreground\" />\r\n )}\r\n </div>\r\n\r\n {/* Info */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-1.5 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-foreground\">\r\n {asset.cleanName || asset.name || asset.id}\r\n </p>\r\n {showAppBadge && <AppBadge appId={ownerAppId!} appName={getAppName?.(ownerAppId!)} />}\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {formatSize(asset.size)}\r\n {asset.mimeType && ` • ${asset.mimeType}`}\r\n </p>\r\n {labels.length > 0 && (\r\n <div className=\"mt-1 flex flex-wrap gap-1\">\r\n {labels.map((lbl) => {\r\n const active = !!activeLabels?.has(lbl);\r\n return (\r\n <button\r\n key={lbl}\r\n type=\"button\"\r\n onClick={(e) => { e.stopPropagation(); onToggleLabel?.(lbl); }}\r\n className={cn(\r\n 'inline-flex items-center gap-0.5 rounded-full border px-1.5 py-0 text-[10px] transition-colors',\r\n active\r\n ? 'bg-primary text-primary-foreground border-primary'\r\n : 'bg-muted text-muted-foreground border-border hover:bg-muted/70',\r\n )}\r\n title={`Filter by label: ${lbl}`}\r\n >\r\n <Tag className=\"w-2.5 h-2.5 flex-shrink-0\" />\r\n <span className=\"truncate\">{lbl}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selection */}\r\n {selected && (\r\n <div className=\"w-5 h-5 rounded-full bg-primary flex items-center justify-center flex-shrink-0\">\r\n <Check className=\"w-3 h-3 text-primary-foreground\" />\r\n </div>\r\n )}\r\n\r\n {/* Action menu */}\r\n <CardMenu\r\n onRename={onRename}\r\n onReplace={onReplace}\r\n onEditTags={onEditTags}\r\n onDelete={allowDelete ? onDelete : undefined}\r\n position=\"inline\"\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport const AssetGrid: React.FC<AssetGridProps> = ({\r\n assets,\r\n viewMode,\r\n selectedIds,\r\n onToggleSelect,\r\n onDoubleClickSelect,\r\n onDelete,\r\n onRename,\r\n onReplace,\r\n onEditTags,\r\n allowDelete,\r\n currentAppId,\r\n getAppName,\r\n activeLabels,\r\n onToggleLabel,\r\n}) => {\r\n if (assets.length === 0) return null;\r\n\r\n if (viewMode === 'list') {\r\n return (\r\n <div className=\"space-y-1\">\r\n {assets.map(asset => (\r\n <AssetListItem\r\n key={asset.id}\r\n asset={asset}\r\n selected={selectedIds.has(asset.id)}\r\n onToggle={() => onToggleSelect(asset)}\r\n onDoubleClick={onDoubleClickSelect ? () => onDoubleClickSelect(asset) : undefined}\r\n onDelete={allowDelete && onDelete ? () => onDelete(asset.id) : undefined}\r\n onRename={onRename ? () => onRename(asset) : undefined}\r\n onReplace={onReplace ? () => onReplace(asset) : undefined}\r\n onEditTags={onEditTags ? () => onEditTags(asset) : undefined}\r\n allowDelete={allowDelete}\r\n currentAppId={currentAppId}\r\n getAppName={getAppName}\r\n activeLabels={activeLabels}\r\n onToggleLabel={onToggleLabel}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 gap-2\">\r\n {assets.map(asset => (\r\n <AssetGridItem\r\n key={asset.id}\r\n asset={asset}\r\n selected={selectedIds.has(asset.id)}\r\n onToggle={() => onToggleSelect(asset)}\r\n onDoubleClick={onDoubleClickSelect ? () => onDoubleClickSelect(asset) : undefined}\r\n onDelete={allowDelete && onDelete ? () => onDelete(asset.id) : undefined}\r\n onRename={onRename ? () => onRename(asset) : undefined}\r\n onReplace={onReplace ? () => onReplace(asset) : undefined}\r\n onEditTags={onEditTags ? () => onEditTags(asset) : undefined}\r\n allowDelete={allowDelete}\r\n currentAppId={currentAppId}\r\n getAppName={getAppName}\r\n activeLabels={activeLabels}\r\n onToggleLabel={onToggleLabel}\r\n />\r\n ))}\r\n </div>\r\n );\r\n};\r\n","// =============================================================================\r\n// ASSET PICKER — Client-side image processing (WebP conversion + downscale)\r\n// =============================================================================\r\n\r\nexport interface ProcessOptions {\r\n /** Convert to WebP (lossy). Defaults true for non-WebP raster images. */\r\n toWebp?: boolean;\r\n /** Cap longest edge in pixels. Defaults 2048. */\r\n maxDimension?: number;\r\n /** WebP encoder quality 0..1. Defaults 0.85. */\r\n quality?: number;\r\n}\r\n\r\nexport interface ProcessResult {\r\n file: File;\r\n changed: boolean;\r\n /** Original size in bytes for comparison. */\r\n originalSize: number;\r\n /** New size in bytes. */\r\n newSize: number;\r\n /** Final dimensions (px). */\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/** MIME types that are safe to re-encode as WebP. */\r\nconst WEBP_CANDIDATES = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/bmp']);\r\n\r\nexport function isWebpCandidate(file: File): boolean {\r\n return WEBP_CANDIDATES.has(file.type.toLowerCase());\r\n}\r\n\r\nexport function isProcessableImage(file: File): boolean {\r\n if (!file.type.startsWith('image/')) return false;\r\n // Skip SVG (vector — re-encoding to raster would degrade) and GIF (animation lost).\r\n if (file.type === 'image/svg+xml' || file.type === 'image/gif') return false;\r\n return true;\r\n}\r\n\r\nasync function loadImage(file: File): Promise<{ img: HTMLImageElement; url: string }> {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n img.decoding = 'async';\r\n await new Promise<void>((resolve, reject) => {\r\n img.onload = () => resolve();\r\n img.onerror = () => reject(new Error('Failed to decode image'));\r\n img.src = url;\r\n });\r\n return { img, url };\r\n}\r\n\r\nexport async function getImageDimensions(file: File): Promise<{ width: number; height: number } | null> {\r\n if (!isProcessableImage(file)) return null;\r\n try {\r\n const { img, url } = await loadImage(file);\r\n const out = { width: img.naturalWidth, height: img.naturalHeight };\r\n URL.revokeObjectURL(url);\r\n return out;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function processImage(file: File, opts: ProcessOptions = {}): Promise<ProcessResult> {\r\n const toWebp = opts.toWebp ?? isWebpCandidate(file);\r\n const maxDim = opts.maxDimension ?? 2048;\r\n const quality = opts.quality ?? 0.85;\r\n\r\n const fallback: ProcessResult = {\r\n file,\r\n changed: false,\r\n originalSize: file.size,\r\n newSize: file.size,\r\n width: 0,\r\n height: 0,\r\n };\r\n\r\n if (!isProcessableImage(file)) return fallback;\r\n\r\n let img: HTMLImageElement;\r\n let url: string;\r\n try {\r\n ({ img, url } = await loadImage(file));\r\n } catch {\r\n return fallback;\r\n }\r\n\r\n try {\r\n const w = img.naturalWidth;\r\n const h = img.naturalHeight;\r\n const longest = Math.max(w, h);\r\n const needsResize = maxDim > 0 && longest > maxDim;\r\n const needsReencode = toWebp && file.type !== 'image/webp';\r\n\r\n if (!needsResize && !needsReencode) {\r\n return { ...fallback, width: w, height: h };\r\n }\r\n\r\n const scale = needsResize ? maxDim / longest : 1;\r\n const targetW = Math.round(w * scale);\r\n const targetH = Math.round(h * scale);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = targetW;\r\n canvas.height = targetH;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return { ...fallback, width: w, height: h };\r\n ctx.drawImage(img, 0, 0, targetW, targetH);\r\n\r\n const outType = needsReencode ? 'image/webp' : file.type;\r\n const blob: Blob | null = await new Promise(resolve =>\r\n canvas.toBlob(b => resolve(b), outType, quality),\r\n );\r\n if (!blob) return { ...fallback, width: w, height: h };\r\n\r\n // Strip extension and replace with new one when re-encoding.\r\n const base = file.name.replace(/\\.[^.]+$/, '') || 'image';\r\n const ext = needsReencode ? 'webp' : (file.name.match(/\\.([^.]+)$/)?.[1] || 'png');\r\n const newName = `${base}.${ext}`;\r\n\r\n const newFile = new File([blob], newName, { type: outType });\r\n return {\r\n file: newFile,\r\n changed: true,\r\n originalSize: file.size,\r\n newSize: newFile.size,\r\n width: targetW,\r\n height: targetH,\r\n };\r\n } finally {\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n","// =============================================================================\r\n// ASSET PICKER — Upload Zone (drag-and-drop + file picker + clipboard paste)\r\n// =============================================================================\r\n\r\nimport React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { Upload, Loader2, Clipboard, X, Check, Pencil, Maximize2, Wand2 } from 'lucide-react';\r\nimport { processImage, isProcessableImage, getImageDimensions } from './imageProcessing';\r\n\r\ninterface UploadZoneProps {\r\n onFiles: (files: File[]) => void;\r\n accept?: string;\r\n multiple?: boolean;\r\n uploading?: boolean;\r\n uploadProgress?: number;\r\n className?: string;\r\n /**\r\n * Image optimization config — see AssetPickerProps.imageOptimization.\r\n * - undefined: user-controlled (default ON, persisted)\r\n * - false: disabled, hide toggle\r\n * - true: forced ON, hide toggle\r\n * - object: defaults + userToggleable\r\n */\r\n imageOptimization?: boolean | {\r\n defaultEnabled?: boolean;\r\n userToggleable?: boolean;\r\n maxDimension?: number;\r\n quality?: number;\r\n };\r\n}\r\n\r\ninterface PastedFile {\r\n file: File;\r\n previewUrl: string;\r\n name: string;\r\n origSize: number;\r\n origDims?: { width: number; height: number };\r\n}\r\n\r\nexport const UploadZone: React.FC<UploadZoneProps> = ({\r\n onFiles,\r\n accept,\r\n multiple,\r\n uploading,\r\n uploadProgress = 0,\r\n className,\r\n imageOptimization,\r\n}) => {\r\n // Resolve host-controlled optimization policy.\r\n const optConfig = useMemo(() => {\r\n if (imageOptimization === false) return { forced: 'off' as const };\r\n if (imageOptimization === true) return { forced: 'on' as const, maxDimension: 2048, quality: 0.85 };\r\n if (typeof imageOptimization === 'object' && imageOptimization) {\r\n return {\r\n forced: imageOptimization.userToggleable === false\r\n ? (imageOptimization.defaultEnabled === false ? 'off' as const : 'on' as const)\r\n : null,\r\n defaultEnabled: imageOptimization.defaultEnabled ?? true,\r\n maxDimension: imageOptimization.maxDimension ?? 2048,\r\n quality: imageOptimization.quality ?? 0.85,\r\n };\r\n }\r\n return { forced: null, defaultEnabled: true, maxDimension: 2048, quality: 0.85 };\r\n }, [imageOptimization]);\r\n\r\n const [dragOver, setDragOver] = useState(false);\r\n const [pastedFile, setPastedFile] = useState<PastedFile | null>(null);\r\n const [editingName, setEditingName] = useState(false);\r\n const [fileName, setFileName] = useState('');\r\n const [lightboxOpen, setLightboxOpen] = useState(false);\r\n // Default ON — most uploads benefit from a WebP/downscale pass. Persisted\r\n // across mounts via localStorage so power users only flip it once. Host can\r\n // force on/off via `imageOptimization` prop, in which case the persisted\r\n // value is ignored and the toggle is hidden.\r\n const [autoOptimizeUser, setAutoOptimizeUser] = useState<boolean>(() => {\r\n if (optConfig.forced) return optConfig.forced === 'on';\r\n try {\r\n const v = localStorage.getItem('smartlinks.assetPicker.autoOptimize');\r\n if (v !== null) return v === '1';\r\n } catch {}\r\n return optConfig.defaultEnabled ?? true;\r\n });\r\n const autoOptimize = optConfig.forced ? optConfig.forced === 'on' : autoOptimizeUser;\r\n const showOptimizeToggle = optConfig.forced === null;\r\n const setAutoOptimizePersist = useCallback((v: boolean) => {\r\n setAutoOptimizeUser(v);\r\n try { localStorage.setItem('smartlinks.assetPicker.autoOptimize', v ? '1' : '0'); } catch {}\r\n }, []);\r\n const [optimizing, setOptimizing] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const nameInputRef = useRef<HTMLInputElement>(null);\r\n const zoneRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (pastedFile?.previewUrl) URL.revokeObjectURL(pastedFile.previewUrl);\r\n };\r\n }, [pastedFile]);\r\n\r\n useEffect(() => {\r\n if (editingName) nameInputRef.current?.select();\r\n }, [editingName]);\r\n\r\n useEffect(() => {\r\n const handlePaste = (e: ClipboardEvent) => {\r\n if (uploading) return;\r\n const items = e.clipboardData?.items;\r\n if (!items) return;\r\n\r\n for (const item of Array.from(items)) {\r\n if (item.kind === 'file') {\r\n const file = item.getAsFile();\r\n if (!file) continue;\r\n if (accept && !file.type.startsWith(accept.replace('*', ''))) continue;\r\n\r\n e.preventDefault();\r\n const previewUrl = file.type.startsWith('image/') ? URL.createObjectURL(file) : '';\r\n const defaultName = file.name === 'image.png'\r\n ? `pasted-${new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-')}`\r\n : file.name.replace(/\\.[^.]+$/, '');\r\n setPastedFile({ file, previewUrl, name: defaultName, origSize: file.size });\r\n setFileName(defaultName);\r\n setEditingName(false);\r\n getImageDimensions(file).then(dims => {\r\n if (dims) setPastedFile(prev => prev && prev.file === file ? { ...prev, origDims: dims } : prev);\r\n });\r\n return;\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener('paste', handlePaste);\r\n return () => document.removeEventListener('paste', handlePaste);\r\n }, [uploading, accept]);\r\n\r\n const handleConfirmPaste = useCallback(async () => {\r\n if (!pastedFile) return;\r\n let working = pastedFile.file;\r\n if (autoOptimize && isProcessableImage(working)) {\r\n setOptimizing(true);\r\n try {\r\n const result = await processImage(working, {\r\n maxDimension: optConfig.maxDimension,\r\n quality: optConfig.quality,\r\n });\r\n if (result.changed) working = result.file;\r\n } finally {\r\n setOptimizing(false);\r\n }\r\n }\r\n const ext = working.name.includes('.') ? working.name.split('.').pop() : 'png';\r\n const finalName = `${fileName.trim() || 'pasted-image'}.${ext}`;\r\n const renamedFile = new File([working], finalName, { type: working.type });\r\n onFiles([renamedFile]);\r\n if (pastedFile.previewUrl) URL.revokeObjectURL(pastedFile.previewUrl);\r\n setPastedFile(null);\r\n }, [pastedFile, fileName, onFiles, autoOptimize, optConfig]);\r\n\r\n const handleCancelPaste = useCallback(() => {\r\n if (pastedFile?.previewUrl) URL.revokeObjectURL(pastedFile.previewUrl);\r\n setPastedFile(null);\r\n setEditingName(false);\r\n }, [pastedFile]);\r\n\r\n const handleDrag = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }, []);\r\n\r\n const handleDragIn = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(true);\r\n }, []);\r\n\r\n const handleDragOut = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(false);\r\n }, []);\r\n\r\n const presentForRename = useCallback((file: File) => {\r\n const previewUrl = file.type.startsWith('image/') ? URL.createObjectURL(file) : '';\r\n const defaultName = file.name.replace(/\\.[^.]+$/, '') || 'file';\r\n setPastedFile({ file, previewUrl, name: defaultName, origSize: file.size });\r\n setFileName(defaultName);\r\n setEditingName(false);\r\n getImageDimensions(file).then(dims => {\r\n if (dims) setPastedFile(prev => prev && prev.file === file ? { ...prev, origDims: dims } : prev);\r\n });\r\n }, []);\r\n\r\n const handleDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(false);\r\n const files = Array.from(e.dataTransfer.files);\r\n if (files.length === 1 && !multiple) {\r\n presentForRename(files[0]);\r\n } else if (files.length > 0) {\r\n void handleBatchFiles(multiple ? files : [files[0]]);\r\n }\r\n }, [onFiles, multiple, presentForRename]);\r\n\r\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(e.target.files || []);\r\n if (files.length === 1 && !multiple) {\r\n presentForRename(files[0]);\r\n } else if (files.length > 0) {\r\n void handleBatchFiles(multiple ? files : [files[0]]);\r\n }\r\n e.target.value = '';\r\n }, [onFiles, multiple, presentForRename]);\r\n\r\n // Multi-file path: silently apply optimization (default on) before forwarding.\r\n const handleBatchFiles = useCallback(async (files: File[]) => {\r\n if (!autoOptimize) { onFiles(files); return; }\r\n setOptimizing(true);\r\n try {\r\n const out: File[] = [];\r\n for (const f of files) {\r\n if (isProcessableImage(f)) {\r\n const r = await processImage(f, {\r\n maxDimension: optConfig.maxDimension,\r\n quality: optConfig.quality,\r\n });\r\n out.push(r.changed ? r.file : f);\r\n } else {\r\n out.push(f);\r\n }\r\n }\r\n onFiles(out);\r\n } finally {\r\n setOptimizing(false);\r\n }\r\n }, [autoOptimize, onFiles, optConfig]);\r\n\r\n const fmtKB = (n: number) => n >= 1024 * 1024\r\n ? `${(n / 1024 / 1024).toFixed(1)} MB`\r\n : `${(n / 1024).toFixed(1)} KB`;\r\n\r\n // Optimize toggle — small inline control reused across states. Hidden when\r\n // the host has forced the setting on or off.\r\n const optimizeToggle = showOptimizeToggle ? (\r\n <label className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground cursor-pointer select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={autoOptimize}\r\n onChange={(e) => setAutoOptimizePersist(e.target.checked)}\r\n className=\"cursor-pointer\"\r\n />\r\n <Wand2 className=\"w-3 h-3\" />\r\n <span>Optimize for web (WebP, max {optConfig.maxDimension ?? 2048}px)</span>\r\n </label>\r\n ) : null;\r\n\r\n // Pasted file preview state\r\n if (pastedFile) {\r\n const willOptimize = autoOptimize && isProcessableImage(pastedFile.file);\r\n return (\r\n <div className={cn(\r\n 'border-2 border-solid border-primary rounded-lg p-4 transition-colors',\r\n className\r\n )}>\r\n <div className=\"flex flex-col items-center gap-3\">\r\n {pastedFile.previewUrl ? (\r\n <button\r\n type=\"button\"\r\n onClick={() => setLightboxOpen(true)}\r\n className=\"group relative w-24 h-24 rounded-md border border-border bg-muted overflow-hidden flex items-center justify-center\"\r\n title=\"Click to preview full size\"\r\n >\r\n <img\r\n src={pastedFile.previewUrl}\r\n alt=\"Pasted content\"\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n />\r\n <span className=\"absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors flex items-center justify-center opacity-0 group-hover:opacity-100\">\r\n <Maximize2 className=\"w-4 h-4 text-white\" />\r\n </span>\r\n </button>\r\n ) : (\r\n <div className=\"w-16 h-16 rounded-md bg-muted flex items-center justify-center\">\r\n <Clipboard className=\"w-6 h-6 text-muted-foreground\" />\r\n </div>\r\n )}\r\n\r\n {/* File name */}\r\n <div className=\"flex items-center gap-1.5 w-full max-w-xs\">\r\n {editingName ? (\r\n <input\r\n ref={nameInputRef}\r\n type=\"text\"\r\n value={fileName}\r\n onChange={(e) => setFileName(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') { setEditingName(false); handleConfirmPaste(); }\r\n if (e.key === 'Escape') setEditingName(false);\r\n }}\r\n onBlur={() => setEditingName(false)}\r\n className=\"flex-1 px-2 py-1 text-sm rounded border border-border bg-transparent focus:outline-none focus:ring-1 focus:ring-ring text-center\"\r\n placeholder=\"File name\"\r\n />\r\n ) : (\r\n <button\r\n type=\"button\"\r\n onClick={() => setEditingName(true)}\r\n className=\"flex items-center gap-1 mx-auto px-2 py-1 text-sm text-muted-foreground hover:text-foreground rounded hover:bg-accent transition-colors\"\r\n title=\"Rename\"\r\n >\r\n <span className=\"truncate max-w-[200px]\">{fileName}</span>\r\n <Pencil className=\"w-3 h-3 flex-shrink-0 opacity-50\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-[10px] text-muted-foreground text-center\">\r\n {pastedFile.file.type} · {fmtKB(pastedFile.origSize)}\r\n {pastedFile.origDims && ` · ${pastedFile.origDims.width}×${pastedFile.origDims.height}`}\r\n {willOptimize && pastedFile.origDims && (pastedFile.origDims.width > 2048 || pastedFile.origDims.height > 2048 || pastedFile.file.type !== 'image/webp') && (\r\n <span className=\"block text-primary mt-0.5\">\r\n <Wand2 className=\"w-3 h-3 inline -mt-0.5 mr-1\" />\r\n Will be optimized to WebP{(pastedFile.origDims.width > 2048 || pastedFile.origDims.height > 2048) ? ', max 2048px' : ''}\r\n </span>\r\n )}\r\n </p>\r\n\r\n {isProcessableImage(pastedFile.file) && optimizeToggle}\r\n\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleCancelPaste}\r\n className=\"px-3 py-1.5 text-xs font-medium rounded-md border border-border text-muted-foreground hover:bg-accent transition-colors flex items-center gap-1\"\r\n disabled={optimizing}\r\n >\r\n <X className=\"w-3 h-3\" /> Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleConfirmPaste}\r\n className=\"px-3 py-1.5 text-xs font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center gap-1\"\r\n disabled={optimizing}\r\n >\r\n {optimizing ? <Loader2 className=\"w-3 h-3 animate-spin\" /> : <Check className=\"w-3 h-3\" />}\r\n {optimizing ? 'Optimizing…' : 'Upload'}\r\n </button>\r\n </div>\r\n </div>\r\n {lightboxOpen && pastedFile.previewUrl && (\r\n <div\r\n className=\"fixed inset-0 z-[100] bg-black/80 flex items-center justify-center p-6\"\r\n onClick={() => setLightboxOpen(false)}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n role=\"dialog\"\r\n aria-label=\"Image preview\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={(e) => { e.stopPropagation(); setLightboxOpen(false); }}\r\n className=\"absolute top-4 right-4 p-2 rounded-md bg-white/10 hover:bg-white/20 text-white\"\r\n aria-label=\"Close preview\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n <img\r\n src={pastedFile.previewUrl}\r\n alt=\"Full preview\"\r\n className=\"max-w-full max-h-full object-contain\"\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={zoneRef}\r\n className={cn(\r\n 'relative border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors',\r\n dragOver\r\n ? 'border-primary bg-primary/5'\r\n : 'border-border hover:border-ring',\r\n uploading && 'pointer-events-none opacity-70',\r\n className\r\n )}\r\n onDrag={handleDrag}\r\n onDragOver={handleDragIn}\r\n onDragEnter={handleDragIn}\r\n onDragLeave={handleDragOut}\r\n onDrop={handleDrop}\r\n onClick={() => inputRef.current?.click()}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') inputRef.current?.click(); }}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleInputChange}\r\n className=\"hidden\"\r\n />\r\n\r\n {uploading || optimizing ? (\r\n <div className=\"flex flex-col items-center gap-2 py-2\">\r\n <Loader2 className=\"w-6 h-6 text-primary animate-spin\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {optimizing ? 'Optimizing…' : `Uploading… ${uploadProgress > 0 ? `${Math.round(uploadProgress)}%` : ''}`}\r\n </p>\r\n {!optimizing && uploadProgress > 0 && (\r\n <div className=\"w-full max-w-xs h-1.5 bg-muted rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary rounded-full transition-all duration-300\"\r\n style={{ width: `${uploadProgress}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col items-center gap-1 py-2\">\r\n <Upload className=\"w-6 h-6 text-muted-foreground\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n Drop files here, <span className=\"text-primary underline\">browse</span>, or paste from clipboard\r\n </p>\r\n <p className=\"text-[10px] text-muted-foreground flex items-center gap-1\">\r\n <Clipboard className=\"w-3 h-3\" /> Ctrl+V / ⌘V to paste\r\n </p>\r\n {accept && (\r\n <p className=\"text-[10px] text-muted-foreground\">\r\n Accepts: {accept}\r\n </p>\r\n )}\r\n <div\r\n className=\"mt-2 pt-2 border-t border-border/50 w-full flex justify-center\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {optimizeToggle}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// =============================================================================\r\n// ASSET PICKER — URL Import Panel\r\n// =============================================================================\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { Link, Loader2 } from 'lucide-react';\r\n\r\ninterface UrlImportProps {\r\n onImport: (url: string, name?: string) => Promise<any>;\r\n importing?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const UrlImport: React.FC<UrlImportProps> = ({\r\n onImport,\r\n importing,\r\n className,\r\n}) => {\r\n const [url, setUrl] = useState('');\r\n const [name, setName] = useState('');\r\n const [error, setError] = useState('');\r\n\r\n const handleSubmit = useCallback(async (e?: React.SyntheticEvent) => {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n if (!url.trim()) return;\r\n\r\n try {\r\n new URL(url.trim());\r\n } catch {\r\n setError('Please enter a valid URL');\r\n return;\r\n }\r\n\r\n setError('');\r\n const result = await onImport(url.trim(), name.trim() || undefined);\r\n if (result) { setUrl(''); setName(''); }\r\n }, [url, name, onImport]);\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-2', className)}>\r\n <div className=\"flex gap-2\">\r\n <div className=\"relative flex-1\">\r\n <Link className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <input\r\n type=\"text\"\r\n value={url}\r\n onChange={(e) => { setUrl(e.target.value); setError(''); }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleSubmit();\r\n }\r\n }}\r\n placeholder=\"https://example.com/image.png\"\r\n disabled={importing}\r\n className={cn(\r\n 'w-full pl-8 pr-3 py-2 text-sm rounded-md border bg-transparent',\r\n 'placeholder:text-muted-foreground',\r\n 'focus:outline-none focus:ring-2 focus:ring-ring',\r\n error\r\n ? 'border-destructive'\r\n : 'border-border'\r\n )}\r\n />\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={!url.trim() || importing}\r\n className={cn(\r\n 'px-3 py-2 text-sm font-medium rounded-md transition-colors',\r\n 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n 'flex items-center gap-1.5'\r\n )}\r\n >\r\n {importing ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : null}\r\n Import\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder=\"Optional name (defaults to filename from URL)\"\r\n disabled={importing}\r\n className=\"w-full px-3 py-1.5 text-xs rounded-md border border-border bg-transparent placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\r\n />\r\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\r\n </div>\r\n );\r\n};\r\n","// =============================================================================\r\n// ASSET PICKER — AI Image Generation Panel\r\n// =============================================================================\r\n// Generates an image via SL.ai.generateImage and lets the admin save it\r\n// directly to the asset library via server-side ingest.\r\n\r\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\r\nimport * as SL from '@proveanything/smartlinks';\r\nimport { cn } from '../../utils/cn';\r\nimport { Sparkles, Loader2, AlertCircle, Check, Mic, MicOff, ChevronDown, ChevronRight } from 'lucide-react';\r\n\r\ninterface AIImageGenerateProps {\r\n collectionId: string;\r\n /** Save the generated image URL into the library (server-side ingest). */\r\n onSave: (url: string, name?: string) => Promise<any>;\r\n saving?: boolean;\r\n className?: string;\r\n}\r\n\r\n/** Aspect-ratio presets. Values are OpenAI/most-providers-compatible sizes. */\r\nconst ASPECT_PRESETS = [\r\n { key: 'square', label: 'Square', hint: '1:1', size: '1024x1024' },\r\n { key: 'landscape', label: 'Landscape', hint: '7:4', size: '1792x1024' },\r\n { key: 'portrait', label: 'Portrait', hint: '4:7', size: '1024x1792' },\r\n { key: 'wide', label: 'Wide', hint: '16:9', size: '1536x864' },\r\n { key: 'tall', label: 'Tall', hint: '9:16', size: '864x1536' },\r\n] as const;\r\ntype AspectKey = typeof ASPECT_PRESETS[number]['key'];\r\n\r\nconst QUALITY_OPTIONS = [\r\n { value: 'standard', label: 'Standard' },\r\n { value: 'hd', label: 'HD' },\r\n] as const;\r\n\r\nconst STYLE_OPTIONS = [\r\n { value: 'vivid', label: 'Vivid' },\r\n { value: 'natural', label: 'Natural' },\r\n] as const;\r\n\r\n/** Best-effort URL extraction from the SDK response shape. */\r\nfunction extractImageUrl(response: any): string | null {\r\n if (!response) return null;\r\n if (typeof response === 'string') return response;\r\n if (response.url) return response.url;\r\n if (response.imageUrl) return response.imageUrl;\r\n if (response.image_url) return response.image_url;\r\n if (Array.isArray(response.data) && response.data[0]?.url) return response.data[0].url;\r\n if (Array.isArray(response.images) && response.images[0]?.url) return response.images[0].url;\r\n if (response.b64_json) return `data:image/png;base64,${response.b64_json}`;\r\n if (Array.isArray(response.data) && response.data[0]?.b64_json) {\r\n return `data:image/png;base64,${response.data[0].b64_json}`;\r\n }\r\n return null;\r\n}\r\n\r\nexport const AIImageGenerate: React.FC<AIImageGenerateProps> = ({\r\n collectionId,\r\n onSave,\r\n saving,\r\n className,\r\n}) => {\r\n const [prompt, setPrompt] = useState('');\r\n const [aspect, setAspect] = useState<AspectKey>('square');\r\n const [quality, setQuality] = useState<string>('standard');\r\n const [style, setStyle] = useState<string>('vivid');\r\n const [advancedOpen, setAdvancedOpen] = useState(false);\r\n const [provider, setProvider] = useState<string>('');\r\n const [model, setModel] = useState<string>('');\r\n const [generating, setGenerating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\r\n const [saved, setSaved] = useState(false);\r\n const [customName, setCustomName] = useState('');\r\n\r\n // ---- Voice dictation (browser SpeechRecognition) ----\r\n const SpeechRecognitionCtor: any =\r\n typeof window !== 'undefined'\r\n ? (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition\r\n : null;\r\n const voiceSupported = !!SpeechRecognitionCtor;\r\n const recognitionRef = useRef<any>(null);\r\n const baseTextRef = useRef<string>('');\r\n const [listening, setListening] = useState(false);\r\n const [voiceError, setVoiceError] = useState<string | null>(null);\r\n\r\n // Cleanup any active recognition on unmount\r\n useEffect(() => {\r\n return () => {\r\n try { recognitionRef.current?.stop(); } catch { /* ignore */ }\r\n recognitionRef.current = null;\r\n };\r\n }, []);\r\n\r\n const startListening = useCallback(() => {\r\n if (!voiceSupported) return;\r\n setVoiceError(null);\r\n try {\r\n const rec = new SpeechRecognitionCtor();\r\n rec.continuous = true;\r\n rec.interimResults = true;\r\n rec.lang = (typeof navigator !== 'undefined' && navigator.language) || 'en-US';\r\n // Snapshot current prompt so dictation appends rather than overwrites\r\n baseTextRef.current = prompt ? prompt.replace(/\\s+$/, '') + ' ' : '';\r\n\r\n rec.onresult = (event: any) => {\r\n let finalText = '';\r\n let interimText = '';\r\n for (let i = event.resultIndex; i < event.results.length; i++) {\r\n const r = event.results[i];\r\n if (r.isFinal) finalText += r[0].transcript;\r\n else interimText += r[0].transcript;\r\n }\r\n if (finalText) {\r\n baseTextRef.current = (baseTextRef.current + finalText).replace(/\\s+$/, '') + ' ';\r\n setPrompt(baseTextRef.current);\r\n } else {\r\n setPrompt(baseTextRef.current + interimText);\r\n }\r\n };\r\n rec.onerror = (e: any) => {\r\n const code = e?.error || 'unknown';\r\n if (code === 'not-allowed' || code === 'service-not-allowed') {\r\n setVoiceError('Microphone permission denied.');\r\n } else if (code === 'no-speech') {\r\n setVoiceError('No speech detected.');\r\n } else if (code !== 'aborted') {\r\n setVoiceError(`Voice input error: ${code}`);\r\n }\r\n };\r\n rec.onend = () => {\r\n setListening(false);\r\n };\r\n recognitionRef.current = rec;\r\n rec.start();\r\n setListening(true);\r\n } catch (err: any) {\r\n setVoiceError(err?.message || 'Could not start voice input');\r\n setListening(false);\r\n }\r\n }, [voiceSupported, prompt, SpeechRecognitionCtor]);\r\n\r\n const stopListening = useCallback(() => {\r\n try { recognitionRef.current?.stop(); } catch { /* ignore */ }\r\n setListening(false);\r\n }, []);\r\n\r\n const toggleListening = useCallback(() => {\r\n if (listening) stopListening(); else startListening();\r\n }, [listening, startListening, stopListening]);\r\n\r\n const handleGenerate = useCallback(async () => {\r\n if (!prompt.trim() || !collectionId) return;\r\n setGenerating(true);\r\n setError(null);\r\n setPreviewUrl(null);\r\n setSaved(false);\r\n try {\r\n const sizeValue = ASPECT_PRESETS.find(a => a.key === aspect)?.size || '1024x1024';\r\n const params: Record<string, any> = {\r\n prompt: prompt.trim(),\r\n size: sizeValue,\r\n quality,\r\n style,\r\n };\r\n if (provider.trim()) params.provider = provider.trim();\r\n if (model.trim()) params.model = model.trim();\r\n const res = await (SL as any).ai.generateImage(collectionId, params);\r\n const url = extractImageUrl(res);\r\n if (!url) {\r\n setError('AI did not return an image URL.');\r\n } else {\r\n setPreviewUrl(url);\r\n }\r\n } catch (err: any) {\r\n setError(err?.message || 'Image generation failed');\r\n } finally {\r\n setGenerating(false);\r\n }\r\n }, [prompt, aspect, quality, style, provider, model, collectionId]);\r\n\r\n const handleSave = useCallback(async () => {\r\n if (!previewUrl) return;\r\n const custom = customName.trim();\r\n const fileName = custom\r\n ? (/\\.[a-z0-9]{2,5}$/i.test(custom) ? custom : `${custom}.png`)\r\n : `ai-${(prompt.trim().slice(0, 60).replace(/\\s+/g, '-') || 'ai-image')}.png`;\r\n const result = await onSave(previewUrl, fileName);\r\n if (result) {\r\n setSaved(true);\r\n // Allow another generation\r\n setTimeout(() => {\r\n setPreviewUrl(null);\r\n setSaved(false);\r\n setCustomName('');\r\n }, 1500);\r\n }\r\n }, [previewUrl, prompt, customName, onSave]);\r\n\r\n if (!collectionId) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-3 rounded-md bg-muted text-muted-foreground text-sm\">\r\n <AlertCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n AI image generation requires a collection scope.\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <label className=\"text-xs font-medium text-foreground\">Prompt</label>\r\n {voiceSupported && (\r\n <button\r\n type=\"button\"\r\n onClick={toggleListening}\r\n disabled={generating}\r\n title={listening ? 'Stop dictation' : 'Dictate prompt'}\r\n className={cn(\r\n 'flex items-center gap-1 px-2 py-0.5 text-[11px] rounded-md border transition-colors',\r\n listening\r\n ? 'border-destructive text-destructive bg-destructive/10 animate-pulse'\r\n : 'border-border text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n >\r\n {listening ? <MicOff className=\"w-3 h-3\" /> : <Mic className=\"w-3 h-3\" />}\r\n {listening ? 'Listening…' : 'Voice'}\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"relative\">\r\n <textarea\r\n value={prompt}\r\n onChange={(e) => setPrompt(e.target.value)}\r\n onKeyDown={(e) => {\r\n if ((e.key === 'Enter') && (e.metaKey || e.ctrlKey)) {\r\n e.preventDefault();\r\n handleGenerate();\r\n }\r\n }}\r\n placeholder=\"A serene mountain lake at golden hour, photorealistic, 35mm film…\"\r\n rows={3}\r\n disabled={generating}\r\n className=\"w-full px-3 py-2 text-sm rounded-md border border-border bg-transparent placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring resize-none\"\r\n />\r\n {listening && (\r\n <span className=\"absolute top-2 right-2 flex items-center gap-1 text-[10px] text-destructive\">\r\n <span className=\"w-1.5 h-1.5 rounded-full bg-destructive animate-pulse\" />\r\n REC\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-[11px] text-muted-foreground\">\r\n Tip: ⌘/Ctrl + Enter to generate{voiceSupported ? ' · click Voice to dictate' : ''}\r\n </p>\r\n {voiceError && (\r\n <p className=\"text-[11px] text-destructive\">{voiceError}</p>\r\n )}\r\n </div>\r\n\r\n {/* Aspect ratio chips */}\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-xs font-medium text-foreground\">Aspect ratio</label>\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {ASPECT_PRESETS.map(a => {\r\n const active = aspect === a.key;\r\n return (\r\n <button\r\n key={a.key}\r\n type=\"button\"\r\n onClick={() => setAspect(a.key)}\r\n disabled={generating}\r\n className={cn(\r\n 'px-2.5 py-1 text-xs rounded-md border transition-colors flex items-center gap-1',\r\n active\r\n ? 'border-primary bg-primary text-primary-foreground'\r\n : 'border-border text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n >\r\n <span>{a.label}</span>\r\n <span className={cn('text-[10px]', active ? 'opacity-80' : 'opacity-60')}>{a.hint}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* Quality + Style */}\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-xs font-medium text-foreground\">Quality</label>\r\n <select\r\n value={quality}\r\n onChange={(e) => setQuality(e.target.value)}\r\n disabled={generating}\r\n className=\"text-sm py-2 px-2 rounded-md border border-border bg-transparent text-foreground focus:outline-none focus:ring-1 focus:ring-ring cursor-pointer\"\r\n >\r\n {QUALITY_OPTIONS.map(o => (\r\n <option key={o.value} value={o.value}>{o.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-xs font-medium text-foreground\">Style</label>\r\n <select\r\n value={style}\r\n onChange={(e) => setStyle(e.target.value)}\r\n disabled={generating}\r\n className=\"text-sm py-2 px-2 rounded-md border border-border bg-transparent text-foreground focus:outline-none focus:ring-1 focus:ring-ring cursor-pointer\"\r\n >\r\n {STYLE_OPTIONS.map(o => (\r\n <option key={o.value} value={o.value}>{o.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Advanced disclosure */}\r\n <div className=\"flex flex-col gap-1.5\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setAdvancedOpen(v => !v)}\r\n className=\"self-start flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n {advancedOpen ? <ChevronDown className=\"w-3 h-3\" /> : <ChevronRight className=\"w-3 h-3\" />}\r\n Advanced\r\n </button>\r\n {advancedOpen && (\r\n <div className=\"grid grid-cols-2 gap-2 p-2 rounded-md border border-border bg-muted/20\">\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-[11px] font-medium text-foreground\">Provider</label>\r\n <input\r\n type=\"text\"\r\n value={provider}\r\n onChange={(e) => setProvider(e.target.value)}\r\n placeholder=\"e.g. openai, google, stability\"\r\n disabled={generating}\r\n className=\"text-xs py-1.5 px-2 rounded-md border border-border bg-transparent text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-[11px] font-medium text-foreground\">Model</label>\r\n <input\r\n type=\"text\"\r\n value={model}\r\n onChange={(e) => setModel(e.target.value)}\r\n placeholder=\"e.g. gpt-image-1, imagen-3\"\r\n disabled={generating}\r\n className=\"text-xs py-1.5 px-2 rounded-md border border-border bg-transparent text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring\"\r\n />\r\n </div>\r\n <p className=\"col-span-2 text-[10px] text-muted-foreground\">\r\n Leave blank to use the platform default. Quality and Style options may be ignored by some providers.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Generate button */}\r\n <div className=\"flex justify-end\">\r\n <button\r\n type=\"button\"\r\n onClick={handleGenerate}\r\n disabled={!prompt.trim() || generating}\r\n className={cn(\r\n 'px-4 py-2 text-sm font-medium rounded-md transition-colors',\r\n 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n 'flex items-center gap-1.5'\r\n )}\r\n >\r\n {generating ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Sparkles className=\"w-3.5 h-3.5\" />}\r\n {generating ? 'Generating…' : 'Generate'}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"flex items-center gap-2 p-2.5 rounded-md bg-destructive/10 text-destructive text-xs\">\r\n <AlertCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n\r\n {previewUrl && (\r\n <div className=\"flex flex-col gap-2 border border-border rounded-md p-3 bg-muted/30\">\r\n <div className=\"relative rounded overflow-hidden bg-background flex items-center justify-center\" style={{ minHeight: '12rem' }}>\r\n <img\r\n src={previewUrl}\r\n alt={prompt}\r\n className=\"max-w-full max-h-80 object-contain\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-[11px] font-medium text-foreground\">Name (optional)</label>\r\n <input\r\n type=\"text\"\r\n value={customName}\r\n onChange={(e) => setCustomName(e.target.value)}\r\n placeholder=\"Defaults to a name based on your prompt\"\r\n disabled={saving || saved}\r\n className=\"w-full px-2 py-1.5 text-xs rounded-md border border-border bg-transparent placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring\"\r\n />\r\n </div>\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => { setPreviewUrl(null); setSaved(false); }}\r\n disabled={saving}\r\n className=\"px-3 py-1.5 text-xs rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\r\n >\r\n Discard\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={saving || saved}\r\n className={cn(\r\n 'px-3 py-1.5 text-xs font-medium rounded-md transition-colors flex items-center gap-1.5',\r\n saved\r\n ? 'bg-primary text-primary-foreground'\r\n : 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n 'disabled:opacity-70 disabled:cursor-not-allowed'\r\n )}\r\n >\r\n {saving ? <Loader2 className=\"w-3 h-3 animate-spin\" /> : saved ? <Check className=\"w-3 h-3\" /> : null}\r\n {saved ? 'Saved' : saving ? 'Saving…' : 'Save to library'}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};","// =============================================================================\r\n// ASSET PICKER — Stock Photo Search Panel\r\n// =============================================================================\r\n// Searches free stock photography via SL.ai.searchPhotos and lets the admin\r\n// save any result to the asset library via server-side ingest.\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport * as SL from '@proveanything/smartlinks';\r\nimport { cn } from '../../utils/cn';\r\nimport { Search, Loader2, AlertCircle, Image as ImageIcon, Check } from 'lucide-react';\r\n\r\ninterface StockPhoto {\r\n url: string;\r\n alt?: string;\r\n photographer?: string;\r\n photographerUrl?: string;\r\n thumbUrl?: string;\r\n [key: string]: any;\r\n}\r\n\r\ninterface StockPhotoSearchProps {\r\n collectionId: string;\r\n /** Save a chosen stock photo URL into the library (server-side ingest). */\r\n onSave: (url: string, name?: string) => Promise<any>;\r\n saving?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ORIENTATIONS: { value: 'landscape' | 'portrait' | 'squarish' | ''; label: string }[] = [\r\n { value: '', label: 'Any shape' },\r\n { value: 'landscape', label: 'Landscape' },\r\n { value: 'portrait', label: 'Portrait' },\r\n { value: 'squarish', label: 'Square' },\r\n];\r\n\r\n/** Best-effort thumbnail extraction. Stock providers expose various keys. */\r\nfunction getThumb(p: StockPhoto): string {\r\n return (\r\n p.thumbUrl ||\r\n p.thumbnailUrl ||\r\n p.thumbnail ||\r\n p.previewUrl ||\r\n (p as any).urls?.small ||\r\n (p as any).urls?.thumb ||\r\n (p as any).src?.medium ||\r\n (p as any).src?.small ||\r\n p.url\r\n );\r\n}\r\n\r\nfunction getFullUrl(p: StockPhoto): string {\r\n return (\r\n (p as any).urls?.full ||\r\n (p as any).urls?.regular ||\r\n (p as any).src?.original ||\r\n (p as any).src?.large ||\r\n p.url\r\n );\r\n}\r\n\r\nexport const StockPhotoSearch: React.FC<StockPhotoSearchProps> = ({\r\n collectionId,\r\n onSave,\r\n saving,\r\n className,\r\n}) => {\r\n const [query, setQuery] = useState('');\r\n const [orientation, setOrientation] = useState<'landscape' | 'portrait' | 'squarish' | ''>('');\r\n const [searching, setSearching] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [results, setResults] = useState<StockPhoto[]>([]);\r\n const [savedUrl, setSavedUrl] = useState<string | null>(null);\r\n const [pendingUrl, setPendingUrl] = useState<string | null>(null);\r\n const [nameOverrides, setNameOverrides] = useState<Record<string, string>>({});\r\n\r\n const handleSearch = useCallback(async () => {\r\n if (!query.trim() || !collectionId) return;\r\n setSearching(true);\r\n setError(null);\r\n setResults([]);\r\n setSavedUrl(null);\r\n try {\r\n const params: any = {\r\n query: query.trim(),\r\n per_page: 24,\r\n };\r\n if (orientation) params.orientation = orientation;\r\n const res = await (SL as any).ai.searchPhotos(collectionId, params);\r\n const list: StockPhoto[] = Array.isArray(res) ? res : (res?.photos || res?.results || []);\r\n setResults(list);\r\n if (list.length === 0) {\r\n setError('No photos matched your search.');\r\n }\r\n } catch (err: any) {\r\n setError(err?.message || 'Stock photo search failed');\r\n } finally {\r\n setSearching(false);\r\n }\r\n }, [query, orientation, collectionId]);\r\n\r\n const handleSave = useCallback(async (photo: StockPhoto) => {\r\n const fullUrl = getFullUrl(photo);\r\n setPendingUrl(fullUrl);\r\n const override = (nameOverrides[fullUrl] || '').trim();\r\n const fileName = override\r\n ? (/\\.[a-z0-9]{2,5}$/i.test(override) ? override : `${override}.jpg`)\r\n : `stock-${(photo.alt || query.trim() || 'stock-photo').slice(0, 60).replace(/\\s+/g, '-')}.jpg`;\r\n const result = await onSave(fullUrl, fileName);\r\n setPendingUrl(null);\r\n if (result) {\r\n setSavedUrl(fullUrl);\r\n setTimeout(() => setSavedUrl(null), 1500);\r\n }\r\n }, [onSave, query, nameOverrides]);\r\n\r\n if (!collectionId) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-3 rounded-md bg-muted text-muted-foreground text-sm\">\r\n <AlertCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n Stock photo search requires a collection scope.\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex items-end gap-2 flex-wrap\">\r\n <div className=\"relative flex-1 min-w-[12rem]\">\r\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <input\r\n type=\"text\"\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleSearch();\r\n }\r\n }}\r\n placeholder=\"Search free stock photos…\"\r\n disabled={searching}\r\n className=\"w-full pl-8 pr-3 py-2 text-sm rounded-md border border-border bg-transparent placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\r\n />\r\n </div>\r\n <select\r\n value={orientation}\r\n onChange={(e) => setOrientation(e.target.value as any)}\r\n disabled={searching}\r\n className=\"text-sm py-2 px-2 rounded-md border border-border bg-transparent text-foreground focus:outline-none focus:ring-1 focus:ring-ring cursor-pointer\"\r\n >\r\n {ORIENTATIONS.map(o => (\r\n <option key={o.value} value={o.value}>{o.label}</option>\r\n ))}\r\n </select>\r\n <button\r\n type=\"button\"\r\n onClick={handleSearch}\r\n disabled={!query.trim() || searching}\r\n className={cn(\r\n 'px-4 py-2 text-sm font-medium rounded-md transition-colors',\r\n 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n 'flex items-center gap-1.5'\r\n )}\r\n >\r\n {searching ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Search className=\"w-3.5 h-3.5\" />}\r\n {searching ? 'Searching…' : 'Search'}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"flex items-center gap-2 p-2.5 rounded-md bg-destructive/10 text-destructive text-xs\">\r\n <AlertCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n\r\n {results.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2\">\r\n {results.map((photo, i) => {\r\n const thumb = getThumb(photo);\r\n const full = getFullUrl(photo);\r\n const isPending = pendingUrl === full;\r\n const isSaved = savedUrl === full;\r\n return (\r\n <div\r\n key={`${full}-${i}`}\r\n className=\"flex flex-col gap-1\"\r\n >\r\n <div className=\"group relative aspect-square rounded-md overflow-hidden border border-border bg-muted/30\">\r\n <img\r\n src={thumb}\r\n alt={photo.alt || ''}\r\n loading=\"lazy\"\r\n className=\"w-full h-full object-cover\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => handleSave(photo)}\r\n disabled={!!pendingUrl || saving}\r\n className={cn(\r\n 'absolute inset-0 flex items-center justify-center text-xs font-medium',\r\n 'bg-background/80 opacity-0 group-hover:opacity-100 transition-opacity',\r\n 'text-foreground gap-1.5',\r\n (isPending || isSaved) && 'opacity-100'\r\n )}\r\n >\r\n {isPending ? (\r\n <><Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> Saving…</>\r\n ) : isSaved ? (\r\n <><Check className=\"w-3.5 h-3.5\" /> Saved</>\r\n ) : (\r\n <><ImageIcon className=\"w-3.5 h-3.5\" /> Save</>\r\n )}\r\n </button>\r\n {photo.photographer && (\r\n <div className=\"absolute bottom-0 inset-x-0 px-1.5 py-0.5 text-[10px] text-background bg-foreground/60 truncate\">\r\n {photo.photographerUrl ? (\r\n <a\r\n href={photo.photographerUrl}\r\n target=\"_blank\"\r\n rel=\"noreferrer noopener\"\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"hover:underline\"\r\n >\r\n {photo.photographer}\r\n </a>\r\n ) : photo.photographer}\r\n </div>\r\n )}\r\n </div>\r\n <input\r\n type=\"text\"\r\n value={nameOverrides[full] || ''}\r\n onChange={(e) => setNameOverrides(prev => ({ ...prev, [full]: e.target.value }))}\r\n placeholder=\"Optional name\"\r\n disabled={isPending || saving}\r\n className=\"w-full px-1.5 py-1 text-[11px] rounded-md border border-border bg-transparent placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring\"\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};","// =============================================================================\r\n// ASSET PICKER — Tag Editor (chip editor with autocomplete)\r\n// =============================================================================\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { X, Tag as TagIcon, Plus } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\ninterface TagEditorProps {\r\n /** Initial labels on the asset. */\r\n initial: string[];\r\n /** Suggestions for autocomplete (typically labels seen in current scope). */\r\n suggestions: string[];\r\n /** Asset name shown in the dialog header. */\r\n assetName?: string;\r\n onCancel: () => void;\r\n onSave: (labels: string[]) => Promise<void> | void;\r\n}\r\n\r\nexport const TagEditor: React.FC<TagEditorProps> = ({ initial, suggestions, assetName, onCancel, onSave }) => {\r\n const [labels, setLabels] = useState<string[]>(() => Array.from(new Set(initial.map(l => l.trim()).filter(Boolean))));\r\n const [input, setInput] = useState('');\r\n const [saving, setSaving] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => { inputRef.current?.focus(); }, []);\r\n\r\n const filteredSuggestions = useMemo(() => {\r\n const q = input.trim().toLowerCase();\r\n const have = new Set(labels.map(l => l.toLowerCase()));\r\n return suggestions\r\n .filter(s => !have.has(s.toLowerCase()))\r\n .filter(s => !q || s.toLowerCase().includes(q))\r\n .slice(0, 8);\r\n }, [suggestions, input, labels]);\r\n\r\n const addLabel = (raw: string) => {\r\n const v = raw.trim();\r\n if (!v) return;\r\n setLabels(prev => (prev.some(p => p.toLowerCase() === v.toLowerCase()) ? prev : [...prev, v]));\r\n setInput('');\r\n };\r\n\r\n const removeLabel = (label: string) => {\r\n setLabels(prev => prev.filter(l => l !== label));\r\n };\r\n\r\n const handleKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter' || e.key === ',') {\r\n e.preventDefault();\r\n addLabel(input);\r\n } else if (e.key === 'Backspace' && !input && labels.length > 0) {\r\n setLabels(prev => prev.slice(0, -1));\r\n }\r\n };\r\n\r\n const handleSave = async () => {\r\n setSaving(true);\r\n try {\r\n await onSave(labels);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/60\"\r\n onClick={onCancel}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n className=\"w-[min(28rem,92vw)] rounded-lg bg-background border border-border shadow-xl p-4 flex flex-col gap-3\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <TagIcon className=\"w-4 h-4 text-muted-foreground\" />\r\n <h3 className=\"text-sm font-semibold text-foreground truncate\">\r\n Edit tags{assetName ? ` — ${assetName}` : ''}\r\n </h3>\r\n <button type=\"button\" onClick={onCancel} className=\"ml-auto p-1 rounded hover:bg-muted\" aria-label=\"Close\">\r\n <X className=\"w-4 h-4 text-muted-foreground\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap items-center gap-1 p-2 rounded-md border border-border min-h-[2.5rem]\">\r\n {labels.map(label => (\r\n <span\r\n key={label}\r\n className=\"inline-flex items-center gap-1 rounded-full bg-primary/10 text-primary border border-primary/30 px-2 py-0.5 text-xs\"\r\n >\r\n {label}\r\n <button\r\n type=\"button\"\r\n onClick={() => removeLabel(label)}\r\n className=\"opacity-70 hover:opacity-100\"\r\n aria-label={`Remove ${label}`}\r\n >\r\n <X className=\"w-3 h-3\" />\r\n </button>\r\n </span>\r\n ))}\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n onKeyDown={handleKey}\r\n placeholder={labels.length === 0 ? 'Add a tag and press Enter…' : 'Add another…'}\r\n className=\"flex-1 min-w-[8rem] bg-transparent text-sm focus:outline-none text-foreground\"\r\n />\r\n </div>\r\n\r\n {filteredSuggestions.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n <span className=\"text-[11px] text-muted-foreground self-center mr-1\">Suggestions:</span>\r\n {filteredSuggestions.map(s => (\r\n <button\r\n key={s}\r\n type=\"button\"\r\n onClick={() => addLabel(s)}\r\n className={cn(\r\n 'inline-flex items-center gap-0.5 rounded-full border border-border bg-muted text-muted-foreground hover:bg-muted/70 px-2 py-0.5 text-[11px]',\r\n )}\r\n >\r\n <Plus className=\"w-2.5 h-2.5\" />\r\n {s}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-end gap-2 pt-1\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n className=\"px-3 py-1.5 text-xs rounded-md border border-border text-foreground hover:bg-muted\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"px-3 py-1.5 text-xs rounded-md bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\r\n >\r\n {saving ? 'Saving…' : 'Save tags'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};","// =============================================================================\r\n// ASSET PICKER — Main Content (shared between inline and dialog modes)\r\n// =============================================================================\r\n\r\nimport React, { useState, useCallback, useMemo } from 'react';\r\nimport type { AssetPickerProps, AssetItem, AssetPickerSelection, AssetViewMode, AssetMimeFilter, AssetScope, AssetAppFilter } from './types';\r\nimport { ASSET_MIME_FILTERS } from './types';\r\nimport { useAssets } from './useAssets';\r\nimport { useAppRegistry } from './useAppRegistry';\r\nimport { AssetGrid } from './AssetGrid';\r\nimport { UploadZone } from './UploadZone';\r\nimport { UrlImport } from './UrlImport';\r\nimport { AIImageGenerate } from './AIImageGenerate';\r\nimport { StockPhotoSearch } from './StockPhotoSearch';\r\nimport { TagEditor } from './TagEditor';\r\nimport { createPortal } from 'react-dom';\r\nimport { cn } from '../../utils/cn';\r\nimport {\r\n RefreshCw,\r\n LayoutGrid,\r\n List,\r\n Search,\r\n Link,\r\n Loader2,\r\n AlertCircle,\r\n ImageOff,\r\n Filter,\r\n Sparkles,\r\n Image as ImageIcon,\r\n Tag,\r\n X,\r\n AlertTriangle,\r\n} from 'lucide-react';\r\n\r\ntype Tab = 'browse' | 'upload' | 'url' | 'ai' | 'stock';\r\ntype ScopeTab = 'collection' | 'product';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Inline confirm dialog — used instead of window.confirm() because sandboxed\r\n// preview iframes (and many host pages) silently block native confirm prompts,\r\n// which is why the delete popup never appeared.\r\n// ---------------------------------------------------------------------------\r\nconst InlineConfirm: React.FC<{\r\n open: boolean;\r\n title: string;\r\n body: string;\r\n confirmLabel?: string;\r\n cancelLabel?: string;\r\n destructive?: boolean;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}> = ({ open, title, body, confirmLabel = 'Confirm', cancelLabel = 'Cancel', destructive, onConfirm, onCancel }) => {\r\n React.useEffect(() => {\r\n if (!open) return;\r\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { e.stopPropagation(); onCancel(); } };\r\n window.addEventListener('keydown', onKey, true);\r\n return () => window.removeEventListener('keydown', onKey, true);\r\n }, [open, onCancel]);\r\n if (!open || typeof document === 'undefined') return null;\r\n return createPortal(\r\n <div\r\n className=\"fixed inset-0 z-[2147483646] flex items-center justify-center p-4\"\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"absolute inset-0 bg-black/50\" onClick={onCancel} />\r\n <div\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n className=\"relative w-full max-w-sm rounded-lg border border-border bg-popover text-popover-foreground shadow-xl p-4\"\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <span className={cn(\r\n 'flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center',\r\n destructive ? 'bg-destructive/10 text-destructive' : 'bg-muted text-muted-foreground',\r\n )}>\r\n <AlertTriangle className=\"w-4 h-4\" />\r\n </span>\r\n <div className=\"min-w-0 flex-1\">\r\n <h3 className=\"text-sm font-semibold\">{title}</h3>\r\n <p className=\"mt-1 text-xs text-muted-foreground\">{body}</p>\r\n </div>\r\n </div>\r\n <div className=\"mt-4 flex justify-end gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n className=\"px-3 py-1.5 text-xs rounded-md border border-border bg-background hover:bg-accent\"\r\n >\r\n {cancelLabel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n autoFocus\r\n onClick={onConfirm}\r\n className={cn(\r\n 'px-3 py-1.5 text-xs rounded-md',\r\n destructive\r\n ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90'\r\n : 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n )}\r\n >\r\n {confirmLabel}\r\n </button>\r\n </div>\r\n </div>\r\n </div>,\r\n document.body,\r\n );\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Global-upload toggle — lets admins opt out of stamping uploads with the\r\n// current appId so the asset lands in the shared collection pool.\r\n// ---------------------------------------------------------------------------\r\nconst GlobalUploadToggle: React.FC<{\r\n checked: boolean;\r\n onChange: (next: boolean) => void;\r\n appName: string;\r\n}> = ({ checked, onChange, appName }) => (\r\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground cursor-pointer select-none p-2 rounded-md border border-border bg-muted/30\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"mt-0.5 cursor-pointer\"\r\n />\r\n <span>\r\n <span className=\"font-medium text-foreground\">Add to shared collection</span>\r\n <span className=\"block\">\r\n {checked\r\n ? `Asset will be available to every app in this collection.`\r\n : `Asset will be tagged to ${appName}. Tick to share with every app in the collection instead.`}\r\n </span>\r\n </span>\r\n </label>\r\n);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Attach-to-context toggle — when an upload context narrower than the\r\n// collection is active (product or proof), default uploads to that narrow\r\n// scope. Untick to make the asset global to the collection instead.\r\n// ---------------------------------------------------------------------------\r\nconst AttachToContextToggle: React.FC<{\r\n checked: boolean;\r\n onChange: (next: boolean) => void;\r\n contextLabel: string; // \"this product\" / \"this proof\"\r\n}> = ({ checked, onChange, contextLabel }) => (\r\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground cursor-pointer select-none p-2 rounded-md border border-border bg-muted/30\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"mt-0.5 cursor-pointer\"\r\n />\r\n <span>\r\n <span className=\"font-medium text-foreground\">Attach to {contextLabel}</span>\r\n <span className=\"block\">\r\n {checked\r\n ? `Asset will be tagged to ${contextLabel}.`\r\n : `Asset will be added to the collection (available everywhere). Tick to attach it to ${contextLabel} instead.`}\r\n </span>\r\n </span>\r\n </label>\r\n);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Scope-specific asset panel (fetches & renders assets for one scope)\r\n// ---------------------------------------------------------------------------\r\nconst ScopedAssetBrowser: React.FC<{\r\n scope: AssetScope;\r\n accept?: string;\r\n pageSize: number;\r\n viewMode: AssetViewMode;\r\n search: string;\r\n selectedIds: Set<string>;\r\n onToggleSelect: (asset: AssetItem) => void;\r\n onDoubleClickSelect?: (asset: AssetItem) => void;\r\n onDelete?: (assetId: string) => void;\r\n allowDelete: boolean;\r\n emptyText?: string;\r\n /** When set, list() filters to this appId. Undefined = list everything in scope. */\r\n listAppId?: string;\r\n /** Always passed so the badge knows which appId is \"current\" (not foreign). */\r\n currentAppId?: string;\r\n /** Friendly label for `currentAppId`. Falls back to the raw appId. */\r\n currentAppName?: string;\r\n /** Resolves a friendly app name for foreign-app provenance badges. */\r\n getAppName?: (appId: string) => string;\r\n /**\r\n * Asset state injected by the parent. We deliberately don't call useAssets()\r\n * here — the parent owns a single useAssets instance so that uploads/AI/URL/\r\n * stock ingest all mutate the same list the grid renders. (Otherwise the\r\n * grid would stay stale until a manual refresh.)\r\n */\r\n assets: AssetItem[];\r\n loading: boolean;\r\n error: string | null;\r\n refresh: () => Promise<void>;\r\n remove: (assetId: string) => Promise<boolean>;\r\n updateAsset: (assetId: string, patch: { name?: string; appId?: string; labels?: string[]; metadata?: Record<string, any>; thumbnail?: string }) => Promise<AssetItem | null>;\r\n replaceFile: (assetId: string, file: File) => Promise<AssetItem | null>;\r\n}> = ({ scope: _scope, accept: _accept, pageSize: _pageSize, viewMode, search, selectedIds, onToggleSelect, onDoubleClickSelect, onDelete, allowDelete, emptyText, listAppId: _listAppId, currentAppId, currentAppName, getAppName, assets, loading, error, refresh, remove, updateAsset, replaceFile }) => {\r\n const replaceInputRef = React.useRef<HTMLInputElement>(null);\r\n const replaceTargetRef = React.useRef<string | null>(null);\r\n\r\n const handleRename = useCallback(async (asset: AssetItem) => {\r\n const current = asset.cleanName || asset.name || '';\r\n const next = window.prompt('Rename asset', current);\r\n if (next === null) return;\r\n const trimmed = next.trim();\r\n if (!trimmed || trimmed === current) return;\r\n await updateAsset(asset.id, { name: trimmed });\r\n }, [updateAsset]);\r\n\r\n const handleReplace = useCallback((asset: AssetItem) => {\r\n replaceTargetRef.current = asset.id;\r\n replaceInputRef.current?.click();\r\n }, []);\r\n\r\n const handleReplaceFiles = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n const assetId = replaceTargetRef.current;\r\n e.target.value = '';\r\n replaceTargetRef.current = null;\r\n if (!file || !assetId) return;\r\n await replaceFile(assetId, file);\r\n }, [replaceFile]);\r\n\r\n // Pending delete state — drives the inline confirm dialog. We cannot use\r\n // window.confirm() here because sandboxed iframes block it silently.\r\n const [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\r\n const handleDeleteWithConfirm = useCallback((assetId: string) => {\r\n setPendingDeleteId(assetId);\r\n }, []);\r\n const confirmDelete = useCallback(async () => {\r\n const id = pendingDeleteId;\r\n setPendingDeleteId(null);\r\n if (!id) return;\r\n const ok = await remove(id);\r\n if (ok) onDelete?.(id);\r\n }, [pendingDeleteId, remove, onDelete]);\r\n\r\n // Tag editor state — opens for one asset at a time.\r\n const [tagEditorAsset, setTagEditorAsset] = useState<AssetItem | null>(null);\r\n const handleEditTags = useCallback((asset: AssetItem) => {\r\n setTagEditorAsset(asset);\r\n }, []);\r\n const handleSaveTags = useCallback(async (next: string[]) => {\r\n if (!tagEditorAsset) return;\r\n await updateAsset(tagEditorAsset.id, { labels: next });\r\n setTagEditorAsset(null);\r\n }, [tagEditorAsset, updateAsset]);\r\n\r\n // Active label filter (AND semantics — asset must include every selected label).\r\n const [activeLabels, setActiveLabels] = useState<Set<string>>(new Set());\r\n const toggleLabel = useCallback((label: string) => {\r\n setActiveLabels(prev => {\r\n const next = new Set(prev);\r\n if (next.has(label)) next.delete(label); else next.add(label);\r\n return next;\r\n });\r\n }, []);\r\n const clearLabels = useCallback(() => setActiveLabels(new Set()), []);\r\n\r\n // Catalogue of all labels seen in this scope, sorted by frequency.\r\n const allLabels = useMemo(() => {\r\n const counts = new Map<string, number>();\r\n for (const a of assets) {\r\n for (const lbl of a.labels || []) {\r\n counts.set(lbl, (counts.get(lbl) || 0) + 1);\r\n }\r\n }\r\n return Array.from(counts.entries())\r\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\r\n .map(([label, count]) => ({ label, count }));\r\n }, [assets]);\r\n\r\n const filteredAssets = useMemo(() => {\r\n const q = search.trim().toLowerCase();\r\n return assets.filter(a => {\r\n if (q) {\r\n const hit =\r\n (a.name || '').toLowerCase().includes(q) ||\r\n (a.cleanName || '').toLowerCase().includes(q) ||\r\n (a.mimeType || '').toLowerCase().includes(q) ||\r\n (a.labels || []).some(l => l.toLowerCase().includes(q));\r\n if (!hit) return false;\r\n }\r\n if (activeLabels.size > 0) {\r\n const labels = new Set(a.labels || []);\r\n for (const need of activeLabels) {\r\n if (!labels.has(need)) return false;\r\n }\r\n }\r\n return true;\r\n });\r\n }, [assets, search, activeLabels]);\r\n\r\n if (loading && assets.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 text-muted-foreground animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\r\n <AlertCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n {error}\r\n <button type=\"button\" onClick={refresh} className=\"ml-auto underline text-xs\">Retry</button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {allLabels.length > 0 && (\r\n <div className=\"flex items-center gap-1.5 flex-wrap\">\r\n <Tag className=\"w-3.5 h-3.5 text-muted-foreground flex-shrink-0\" />\r\n {allLabels.slice(0, 12).map(({ label, count }) => {\r\n const active = activeLabels.has(label);\r\n return (\r\n <button\r\n key={label}\r\n type=\"button\"\r\n onClick={() => toggleLabel(label)}\r\n className={cn(\r\n 'inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors',\r\n active\r\n ? 'bg-primary text-primary-foreground border-primary'\r\n : 'bg-muted text-muted-foreground border-border hover:bg-muted/70',\r\n )}\r\n title={active ? `Remove \"${label}\" from filter` : `Filter by \"${label}\"`}\r\n >\r\n <span className=\"truncate\">{label}</span>\r\n <span className=\"opacity-70\">{count}</span>\r\n </button>\r\n );\r\n })}\r\n {activeLabels.size > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={clearLabels}\r\n className=\"inline-flex items-center gap-0.5 text-[11px] text-muted-foreground hover:text-foreground\"\r\n title=\"Clear label filter\"\r\n >\r\n <X className=\"w-3 h-3\" /> clear\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {filteredAssets.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground\">\r\n <ImageOff className=\"w-8 h-8 mb-2\" />\r\n <p className=\"text-sm\">{emptyText || 'No assets found'}</p>\r\n {(search || activeLabels.size > 0) && <p className=\"text-xs mt-1\">Try adjusting your filters</p>}\r\n </div>\r\n ) : (\r\n <AssetGrid\r\n assets={filteredAssets}\r\n viewMode={viewMode}\r\n selectedIds={selectedIds}\r\n onToggleSelect={onToggleSelect}\r\n onDoubleClickSelect={onDoubleClickSelect}\r\n onDelete={allowDelete ? handleDeleteWithConfirm : undefined}\r\n onRename={handleRename}\r\n onReplace={handleReplace}\r\n onEditTags={handleEditTags}\r\n allowDelete={allowDelete}\r\n currentAppId={currentAppId}\r\n currentAppName={currentAppName}\r\n getAppName={getAppName}\r\n activeLabels={activeLabels}\r\n onToggleLabel={toggleLabel}\r\n />\r\n )}\r\n <input\r\n ref={replaceInputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n onChange={handleReplaceFiles}\r\n />\r\n {tagEditorAsset && (\r\n <TagEditor\r\n initial={tagEditorAsset.labels || []}\r\n suggestions={allLabels.map(l => l.label)}\r\n assetName={tagEditorAsset.cleanName || tagEditorAsset.name}\r\n onCancel={() => setTagEditorAsset(null)}\r\n onSave={handleSaveTags}\r\n />\r\n )}\r\n <InlineConfirm\r\n open={pendingDeleteId !== null}\r\n title=\"Delete asset?\"\r\n body=\"This asset can be restored from the asset manager within 30 days.\"\r\n confirmLabel=\"Delete\"\r\n cancelLabel=\"Cancel\"\r\n destructive\r\n onConfirm={confirmDelete}\r\n onCancel={() => setPendingDeleteId(null)}\r\n />\r\n </>\r\n );\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Main content component\r\n// ---------------------------------------------------------------------------\r\nexport const AssetPickerContent: React.FC<AssetPickerProps & {\r\n onConfirm?: (selection: AssetPickerSelection[]) => void;\r\n}> = ({\r\n scope,\r\n productScope,\r\n appId,\r\n appName,\r\n defaultAppFilter = 'app',\r\n allowUpload = true,\r\n allowUrlImport = true,\r\n allowAIGenerate,\r\n allowStockPhotos,\r\n multiple = false,\r\n accept: acceptProp,\r\n showTypeFilter,\r\n value,\r\n onSelect,\r\n allowDelete = true,\r\n defaultView = 'grid',\r\n emptyText,\r\n pageSize = 50,\r\n onConfirm,\r\n imageOptimization,\r\n}) => {\r\n // Local filter state — only meaningful when `appId` is provided.\r\n const [appFilter, setAppFilter] = useState<AssetAppFilter>(defaultAppFilter);\r\n const hasAppFilter = !!appId;\r\n // Optional secondary filter: when viewing \"All in collection\", users can\r\n // narrow to a specific *other* app via a dropdown. Empty string = no narrowing.\r\n const [otherAppFilter, setOtherAppFilter] = useState<string>('');\r\n\r\n // When true, new uploads (file / URL / AI / stock) are NOT stamped with this\r\n // picker's appId — they go into the shared collection pool so any other app\r\n // can find them. Default false: per-app provenance remains the recommended\r\n // path. Only meaningful when an `appId` prop was supplied.\r\n const [uploadGlobal, setUploadGlobal] = useState(false);\r\n\r\n // Resolve a friendly current-app name from the registry when none is supplied.\r\n const collectionIdForRegistry = (scope as any).collectionId as string | undefined;\r\n const { apps: registryApps, getAppName } = useAppRegistry(collectionIdForRegistry);\r\n const resolvedAppName = appName || (appId ? getAppName(appId) : undefined);\r\n\r\n // When viewing \"This app\", filter list() by the picker's appId. When viewing\r\n // \"All in collection\" but with a specific other app chosen from the dropdown,\r\n // filter by that one. Otherwise list everything in scope. New uploads are\r\n // always stamped with the picker's appId for provenance.\r\n const listAppId = hasAppFilter\r\n ? appFilter === 'app'\r\n ? appId\r\n : (otherAppFilter || undefined)\r\n : undefined;\r\n\r\n const [tab, setTab] = useState<Tab>('browse');\r\n const [viewMode, setViewMode] = useState<AssetViewMode>(defaultView);\r\n const [search, setSearch] = useState('');\r\n const [mimeFilter, setMimeFilter] = useState<AssetMimeFilter>('all');\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(() => {\r\n if (!value) return new Set();\r\n return new Set(Array.isArray(value) ? value : [value]);\r\n });\r\n\r\n const hasProductScope = !!productScope;\r\n // Default to the product tab when a productScope is supplied — uploads land\r\n // on the product by default and the picker filters to it.\r\n const [scopeTab, setScopeTab] = useState<ScopeTab>(hasProductScope ? 'product' : 'collection');\r\n\r\n const effectiveAccept = useMemo(() => {\r\n if (acceptProp) return acceptProp;\r\n const entry = ASSET_MIME_FILTERS.find(f => f.value === mimeFilter);\r\n return entry?.prefix;\r\n }, [acceptProp, mimeFilter]);\r\n\r\n const shouldShowFilter = showTypeFilter ?? !acceptProp;\r\n\r\n // AI / stock tabs only make sense for image content with a known collection.\r\n const collectionId = (scope as any).collectionId as string | undefined;\r\n const acceptsImages = !acceptProp || acceptProp.startsWith('image');\r\n const aiEnabled = (allowAIGenerate ?? acceptsImages) && !!collectionId;\r\n const stockEnabled = (allowStockPhotos ?? acceptsImages) && !!collectionId;\r\n\r\n const activeScope: AssetScope = useMemo(() => {\r\n if (hasProductScope && scopeTab === 'product') {\r\n return { type: 'product', collectionId: productScope!.collectionId, productId: productScope!.productId };\r\n }\r\n return scope;\r\n }, [scope, productScope, scopeTab, hasProductScope]);\r\n\r\n // ---- Upload destination ---------------------------------------------------\r\n // Determine the narrowest meaningful \"context\" scope (proof > product) and\r\n // a fallback collection scope. When a context exists we default to attaching\r\n // uploads to it, with a checkbox to opt-out → collection.\r\n const collectionScope: AssetScope | null = useMemo(() => {\r\n const cId = (scope as any).collectionId as string | undefined;\r\n return cId ? { type: 'collection', collectionId: cId } : null;\r\n }, [scope]);\r\n\r\n const contextScope: AssetScope | null = useMemo(() => {\r\n if (scope.type === 'proof') return scope;\r\n if (scope.type === 'product') return scope;\r\n if (productScope) {\r\n return { type: 'product', collectionId: productScope.collectionId, productId: productScope.productId };\r\n }\r\n return null;\r\n }, [scope, productScope]);\r\n\r\n const contextLabel = contextScope?.type === 'proof' ? 'this proof' : 'this product';\r\n const hasContext = !!contextScope && !!collectionScope;\r\n const [attachToContext, setAttachToContext] = useState(true);\r\n\r\n // Effective upload scope: narrow context (default) or collection (untick).\r\n const uploadScope: AssetScope = useMemo(() => {\r\n if (hasContext) return attachToContext ? contextScope! : collectionScope!;\r\n return activeScope;\r\n }, [hasContext, attachToContext, contextScope, collectionScope, activeScope]);\r\n\r\n // Uploads follow the active scope tab so users see the asset land where\r\n // they expect (product vs collection).\r\n const {\r\n assets,\r\n loading: assetsLoading,\r\n error: assetsError,\r\n refresh: refreshAssets,\r\n upload,\r\n uploadFromUrl,\r\n uploadFromRemoteUrl,\r\n remove,\r\n updateAsset,\r\n replaceFile,\r\n uploading,\r\n uploadProgress,\r\n } = useAssets({\r\n scope: activeScope,\r\n accept: acceptProp,\r\n pageSize,\r\n appId: uploadGlobal ? undefined : appId,\r\n listAppId,\r\n });\r\n\r\n // After an upload, make sure the user actually sees the new asset:\r\n // 1) If it landed in a scope different from the active tab, switch tabs.\r\n // 2) Otherwise refetch so the SDK's authoritative copy replaces our optimistic prepend.\r\n const reconcileAfterUpload = useCallback(async (uploadedScope: AssetScope) => {\r\n if (hasProductScope) {\r\n const desiredTab: ScopeTab = uploadedScope.type === 'product' ? 'product' : 'collection';\r\n if (desiredTab !== scopeTab) {\r\n setScopeTab(desiredTab);\r\n return; // tab switch will remount useAssets and refetch\r\n }\r\n }\r\n await refreshAssets();\r\n }, [hasProductScope, scopeTab, refreshAssets]);\r\n\r\n const toSelection = useCallback((asset: AssetItem): AssetPickerSelection => ({\r\n id: asset.id,\r\n url: asset.url,\r\n name: asset.name,\r\n mimeType: asset.mimeType,\r\n size: asset.size,\r\n metadata: asset.metadata,\r\n thumbnail: asset.thumbnail ?? null,\r\n app: asset.app ?? null,\r\n labels: asset.labels,\r\n // Deprecated — kept for backward-compat with hosts still reading `thumbnails`.\r\n thumbnails: asset.thumbnails,\r\n }), []);\r\n\r\n const handleToggleSelect = useCallback((asset: AssetItem) => {\r\n setSelectedIds(prev => {\r\n const next = new Set(prev);\r\n if (next.has(asset.id)) {\r\n next.delete(asset.id);\r\n } else {\r\n if (!multiple) next.clear();\r\n next.add(asset.id);\r\n }\r\n\r\n if (!onConfirm) {\r\n const sel = toSelection(asset);\r\n if (multiple) {\r\n if (next.has(asset.id)) {\r\n onSelect?.([sel]);\r\n }\r\n } else {\r\n onSelect?.(next.has(asset.id) ? sel : { id: '', url: '', name: '' });\r\n }\r\n }\r\n\r\n return next;\r\n });\r\n }, [multiple, onSelect, onConfirm, toSelection]);\r\n\r\n const handleUploadFiles = useCallback(async (files: File[]) => {\r\n const targetScope = uploadScope;\r\n const sameAsActive = targetScope === activeScope;\r\n for (const file of files) {\r\n const result = await upload(file, undefined, sameAsActive ? undefined : targetScope);\r\n if (result && !multiple) {\r\n setSelectedIds(new Set([result.id]));\r\n onSelect?.(toSelection(result));\r\n }\r\n }\r\n setTab('browse');\r\n await reconcileAfterUpload(targetScope);\r\n }, [upload, multiple, onSelect, toSelection, uploadScope, activeScope, reconcileAfterUpload]);\r\n\r\n const handleUrlImport = useCallback(async (url: string, name?: string) => {\r\n const targetScope = uploadScope;\r\n const sameAsActive = targetScope === activeScope;\r\n const result = await uploadFromUrl(url, name, sameAsActive ? undefined : targetScope);\r\n if (result) {\r\n setTab('browse');\r\n if (!multiple) {\r\n setSelectedIds(new Set([result.id]));\r\n onSelect?.(toSelection(result));\r\n }\r\n await reconcileAfterUpload(targetScope);\r\n }\r\n return result;\r\n }, [uploadFromUrl, multiple, onSelect, toSelection, uploadScope, activeScope, reconcileAfterUpload]);\r\n\r\n const handleRemoteIngest = useCallback(async (url: string, name?: string) => {\r\n const targetScope = uploadScope;\r\n const sameAsActive = targetScope === activeScope;\r\n const result = await uploadFromRemoteUrl(url, {\r\n name,\r\n ...(sameAsActive ? {} : { scopeOverride: targetScope }),\r\n });\r\n if (result && !multiple) {\r\n setSelectedIds(new Set([result.id]));\r\n onSelect?.(toSelection(result));\r\n }\r\n if (result) await reconcileAfterUpload(targetScope);\r\n return result;\r\n }, [uploadFromRemoteUrl, multiple, onSelect, toSelection, uploadScope, activeScope, reconcileAfterUpload]);\r\n\r\n const handleDelete = useCallback(async (assetId: string) => {\r\n setSelectedIds(prev => {\r\n const next = new Set(prev);\r\n next.delete(assetId);\r\n return next;\r\n });\r\n }, []);\r\n\r\n const handleDoubleClickSelect = useCallback((asset: AssetItem) => {\r\n const sel = toSelection(asset);\r\n if (onConfirm) {\r\n // Dialog mode: select + confirm in one action\r\n onConfirm([sel]);\r\n } else {\r\n // Inline mode: just fire onSelect\r\n setSelectedIds(new Set([asset.id]));\r\n onSelect?.(multiple ? [sel] : sel);\r\n }\r\n }, [onConfirm, onSelect, multiple, toSelection]);\r\n\r\n const handleConfirm = useCallback(() => {\r\n const selectedAssets = assets.filter(a => selectedIds.has(a.id)).map(toSelection);\r\n onConfirm?.(selectedAssets);\r\n }, [assets, selectedIds, onConfirm, toSelection]);\r\n\r\n const tabs: { key: Tab; label: string; show: boolean }[] = [\r\n { key: 'browse', label: 'Browse', show: true },\r\n { key: 'upload', label: 'Upload', show: allowUpload },\r\n { key: 'url', label: 'URL', show: allowUrlImport },\r\n { key: 'ai', label: 'AI Generate', show: aiEnabled },\r\n { key: 'stock', label: 'Stock', show: stockEnabled },\r\n ];\r\n\r\n return (\r\n <div className=\"smartlinks-ui-asset-picker-content flex flex-col gap-3\">\r\n {/* Toolbar */}\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n {/* Tab buttons */}\r\n <div className=\"flex gap-1 bg-muted rounded-md p-0.5\">\r\n {tabs.filter(t => t.show).map(t => (\r\n <button\r\n key={t.key}\r\n type=\"button\"\r\n onClick={() => setTab(t.key)}\r\n className={cn(\r\n 'px-2.5 py-1 text-xs font-medium rounded transition-colors flex items-center gap-1',\r\n tab === t.key\r\n ? 'bg-background text-foreground shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n {t.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className=\"flex-1\" />\r\n\r\n {/* MIME type filter dropdown */}\r\n {tab === 'browse' && shouldShowFilter && (\r\n <div className=\"relative flex items-center gap-1\">\r\n <Filter className=\"w-3.5 h-3.5 text-muted-foreground\" />\r\n <select\r\n value={mimeFilter}\r\n onChange={(e) => setMimeFilter(e.target.value as AssetMimeFilter)}\r\n className=\"text-xs py-1 pl-1 pr-5 rounded-md border border-border bg-transparent text-foreground focus:outline-none focus:ring-1 focus:ring-ring appearance-none cursor-pointer\"\r\n >\r\n {ASSET_MIME_FILTERS.map(f => (\r\n <option key={f.value} value={f.value}>{f.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {/* Search (browse mode) */}\r\n {tab === 'browse' && (\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder=\"Search…\"\r\n className=\"pl-7 pr-2 py-1 text-xs rounded-md border border-border bg-transparent focus:outline-none focus:ring-1 focus:ring-ring w-36\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* View toggle */}\r\n {tab === 'browse' && (\r\n <div className=\"flex gap-0.5 bg-muted rounded p-0.5\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewMode('grid')}\r\n className={cn('p-1 rounded', viewMode === 'grid' ? 'bg-background shadow-sm' : '')}\r\n title=\"Grid view\"\r\n >\r\n <LayoutGrid className=\"w-3.5 h-3.5 text-muted-foreground\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewMode('list')}\r\n className={cn('p-1 rounded', viewMode === 'list' ? 'bg-background shadow-sm' : '')}\r\n title=\"List view\"\r\n >\r\n <List className=\"w-3.5 h-3.5 text-muted-foreground\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Scope tabs (collection vs product) */}\r\n {tab === 'browse' && hasProductScope && (\r\n <div className=\"flex gap-1 border-b border-border\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setScopeTab('collection')}\r\n className={cn(\r\n 'px-3 py-1.5 text-xs font-medium border-b-2 transition-colors -mb-px',\r\n scopeTab === 'collection'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n Collection Assets\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setScopeTab('product')}\r\n className={cn(\r\n 'px-3 py-1.5 text-xs font-medium border-b-2 transition-colors -mb-px',\r\n scopeTab === 'product'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n Product Assets\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* App filter pills — visible only when an appId prop is supplied */}\r\n {tab === 'browse' && hasAppFilter && (\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <div className=\"flex items-center gap-1 bg-muted rounded-md p-0.5\">\r\n <button\r\n type=\"button\"\r\n onClick={() => { setAppFilter('app'); setOtherAppFilter(''); }}\r\n className={cn(\r\n 'px-2.5 py-1 text-xs font-medium rounded transition-colors',\r\n appFilter === 'app'\r\n ? 'bg-background text-foreground shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n title={`Show only assets uploaded by ${resolvedAppName || appId}`}\r\n >\r\n {resolvedAppName || appId}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setAppFilter('all')}\r\n className={cn(\r\n 'px-2.5 py-1 text-xs font-medium rounded transition-colors',\r\n appFilter === 'all'\r\n ? 'bg-background text-foreground shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n title=\"Show every asset in the collection, regardless of which app uploaded it\"\r\n >\r\n All in collection\r\n </button>\r\n </div>\r\n\r\n {/* Per-app dropdown — only shown when in \"All\" mode and the registry\r\n actually has more than one installed app to choose between. */}\r\n {appFilter === 'all' && registryApps.length > 1 && (\r\n <div className=\"flex items-center gap-1\">\r\n <Filter className=\"w-3.5 h-3.5 text-muted-foreground\" />\r\n <select\r\n value={otherAppFilter}\r\n onChange={(e) => setOtherAppFilter(e.target.value)}\r\n className=\"text-xs py-1 pl-1 pr-5 rounded-md border border-border bg-transparent text-foreground focus:outline-none focus:ring-1 focus:ring-ring appearance-none cursor-pointer\"\r\n title=\"Narrow to assets uploaded by a specific app\"\r\n >\r\n <option value=\"\">Any app</option>\r\n {registryApps\r\n .filter((a) => !a.hidden)\r\n .map((a) => (\r\n <option key={a.id} value={a.id}>\r\n {a.name}{a.id !== appId ? '' : ' (this app)'}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n {tab === 'browse' && (\r\n <ScopedAssetBrowser\r\n key={`${activeScope.type}-${(activeScope as any).productId || ''}-${effectiveAccept || 'all'}-${listAppId || 'no-app-filter'}`}\r\n scope={activeScope}\r\n accept={effectiveAccept}\r\n pageSize={pageSize}\r\n viewMode={viewMode}\r\n search={search}\r\n selectedIds={selectedIds}\r\n onToggleSelect={handleToggleSelect}\r\n onDoubleClickSelect={handleDoubleClickSelect}\r\n onDelete={handleDelete}\r\n allowDelete={allowDelete}\r\n emptyText={emptyText}\r\n listAppId={listAppId}\r\n currentAppId={appId}\r\n currentAppName={resolvedAppName}\r\n getAppName={getAppName}\r\n assets={assets}\r\n loading={assetsLoading}\r\n error={assetsError}\r\n refresh={refreshAssets}\r\n remove={remove}\r\n updateAsset={updateAsset}\r\n replaceFile={replaceFile}\r\n />\r\n )}\r\n\r\n {tab === 'upload' && (\r\n <>\r\n {hasContext && (\r\n <AttachToContextToggle\r\n checked={attachToContext}\r\n onChange={setAttachToContext}\r\n contextLabel={contextLabel}\r\n />\r\n )}\r\n {hasAppFilter && (\r\n <GlobalUploadToggle\r\n checked={uploadGlobal}\r\n onChange={setUploadGlobal}\r\n appName={resolvedAppName || appId!}\r\n />\r\n )}\r\n <UploadZone\r\n onFiles={handleUploadFiles}\r\n accept={acceptProp}\r\n multiple={multiple}\r\n uploading={uploading}\r\n uploadProgress={uploadProgress}\r\n imageOptimization={imageOptimization}\r\n />\r\n </>\r\n )}\r\n\r\n {tab === 'url' && (\r\n <>\r\n {hasContext && (\r\n <AttachToContextToggle\r\n checked={attachToContext}\r\n onChange={setAttachToContext}\r\n contextLabel={contextLabel}\r\n />\r\n )}\r\n {hasAppFilter && (\r\n <GlobalUploadToggle\r\n checked={uploadGlobal}\r\n onChange={setUploadGlobal}\r\n appName={resolvedAppName || appId!}\r\n />\r\n )}\r\n <UrlImport\r\n onImport={handleUrlImport}\r\n importing={uploading}\r\n />\r\n </>\r\n )}\r\n\r\n {tab === 'ai' && aiEnabled && (\r\n <>\r\n {hasContext && (\r\n <AttachToContextToggle\r\n checked={attachToContext}\r\n onChange={setAttachToContext}\r\n contextLabel={contextLabel}\r\n />\r\n )}\r\n {hasAppFilter && (\r\n <GlobalUploadToggle\r\n checked={uploadGlobal}\r\n onChange={setUploadGlobal}\r\n appName={resolvedAppName || appId!}\r\n />\r\n )}\r\n <AIImageGenerate\r\n collectionId={collectionId!}\r\n onSave={handleRemoteIngest}\r\n saving={uploading}\r\n />\r\n </>\r\n )}\r\n\r\n {tab === 'stock' && stockEnabled && (\r\n <>\r\n {hasContext && (\r\n <AttachToContextToggle\r\n checked={attachToContext}\r\n onChange={setAttachToContext}\r\n contextLabel={contextLabel}\r\n />\r\n )}\r\n {hasAppFilter && (\r\n <GlobalUploadToggle\r\n checked={uploadGlobal}\r\n onChange={setUploadGlobal}\r\n appName={resolvedAppName || appId!}\r\n />\r\n )}\r\n <StockPhotoSearch\r\n collectionId={collectionId!}\r\n onSave={handleRemoteIngest}\r\n saving={uploading}\r\n />\r\n </>\r\n )}\r\n\r\n {/* Confirm bar (dialog mode) */}\r\n {onConfirm && (\r\n <div className=\"flex items-center justify-between pt-2 border-t border-border\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n {selectedIds.size} selected · <span className=\"italic\">double-click to select instantly</span>\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={handleConfirm}\r\n disabled={selectedIds.size === 0}\r\n className={cn(\r\n 'px-4 py-1.5 text-sm font-medium rounded-md transition-colors',\r\n 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed'\r\n )}\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// =============================================================================\r\n// ASSET PICKER — Main Component\r\n// =============================================================================\r\n// Supports inline and dialog modes. Dialog mode renders a trigger element and\r\n// opens a modal with the picker content.\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { AssetPickerProps, AssetPickerSelection } from './types';\r\nimport { AssetPickerContent } from './AssetPickerContent';\r\nimport { cn } from '../../utils/cn';\r\nimport { X } from 'lucide-react';\r\n\r\n// Lightweight built-in dialog — no dependency on shadcn or radix\r\nconst PickerDialog: React.FC<{\r\n open: boolean;\r\n onClose: () => void;\r\n maxWidth?: string;\r\n children: React.ReactNode;\r\n}> = ({ open, onClose, maxWidth, children }) => {\r\n if (!open) return null;\r\n\r\n const node = (\r\n <div className=\"fixed inset-0 z-[2147483600] flex items-center justify-center\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\r\n onClick={onClose}\r\n />\r\n {/* Panel */}\r\n <div\r\n className=\"relative z-10 w-full max-h-[85vh] bg-background rounded-xl shadow-2xl border border-border flex flex-col overflow-hidden mx-4\"\r\n style={{ maxWidth: maxWidth || '56rem' }}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground\">\r\n Select Asset\r\n </h3>\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-accent transition-colors\"\r\n >\r\n <X className=\"w-4 h-4 text-muted-foreground\" />\r\n </button>\r\n </div>\r\n <div className=\"flex-1 min-h-0 overflow-y-auto p-4\">\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n if (typeof document === 'undefined') return node;\r\n return createPortal(node, document.body);\r\n};\r\n\r\n/**\r\n * SmartLinks Asset Picker\r\n *\r\n * Browse, upload, and select media assets scoped to a collection, product, or proof.\r\n *\r\n * @example\r\n * ```tsx\r\n * // Inline mode\r\n * <AssetPicker\r\n * scope={{ type: 'collection', collectionId: 'abc123' }}\r\n * onSelect={(asset) => console.log('Selected:', asset)}\r\n * />\r\n *\r\n * // Dialog mode\r\n * <AssetPicker\r\n * scope={{ type: 'collection', collectionId: 'abc123' }}\r\n * mode=\"dialog\"\r\n * trigger={<button>Choose Image</button>}\r\n * onSelect={(asset) => console.log('Selected:', asset)}\r\n * />\r\n * ```\r\n */\r\nexport const AssetPicker: React.FC<AssetPickerProps> = (props) => {\r\n const { mode = 'inline', open: controlledOpen, onClose, trigger, onSelect, multiple, className, dialogMaxWidth } = props;\r\n\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const isOpen = controlledOpen ?? internalOpen;\r\n\r\n const handleOpen = useCallback(() => {\r\n setInternalOpen(true);\r\n }, []);\r\n\r\n const handleClose = useCallback(() => {\r\n setInternalOpen(false);\r\n onClose?.();\r\n }, [onClose]);\r\n\r\n const handleConfirm = useCallback((selections: AssetPickerSelection[]) => {\r\n if (multiple) {\r\n onSelect?.(selections);\r\n } else {\r\n onSelect?.(selections[0] || { id: '', url: '', name: '' });\r\n }\r\n handleClose();\r\n }, [onSelect, multiple, handleClose]);\r\n\r\n // Inline mode — render content directly\r\n if (mode === 'inline') {\r\n return (\r\n <div className={cn('smartlinks-ui-asset-picker', className)}>\r\n <AssetPickerContent {...props} />\r\n </div>\r\n );\r\n }\r\n\r\n // Dialog mode\r\n return (\r\n <>\r\n {trigger && (\r\n <span onClick={handleOpen} className=\"cursor-pointer\">\r\n {trigger}\r\n </span>\r\n )}\r\n <PickerDialog open={isOpen} onClose={handleClose} maxWidth={dialogMaxWidth}>\r\n <AssetPickerContent {...props} onConfirm={handleConfirm} />\r\n </PickerDialog>\r\n </>\r\n );\r\n};\r\n","import '../../styles.css';\r\nimport { assertStylesLoaded } from '../../utils/assertStylesLoaded';\r\nassertStylesLoaded();\r\n\r\nexport { AssetPicker } from './AssetPicker';\r\nexport { useAssets } from './useAssets';\r\nexport { useAppRegistry } from './useAppRegistry';\r\nexport type { AppRegistryEntry, UseAppRegistryReturn } from './useAppRegistry';\r\nexport type {\r\n AssetPickerProps,\r\n AssetPickerMode,\r\n AssetScope,\r\n AssetPickerSelection,\r\n AssetItem,\r\n AssetViewMode,\r\n} from './types';\r\n"]}