@gallop.software/studio 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{StudioUI-KCUI5YUD.mjs → StudioUI-ADLDMRJQ.mjs} +23 -25
- package/dist/{StudioUI-KCUI5YUD.mjs.map → StudioUI-ADLDMRJQ.mjs.map} +1 -1
- package/dist/{StudioUI-GWMM47P7.js → StudioUI-FCQJK23M.js} +23 -25
- package/dist/StudioUI-FCQJK23M.js.map +1 -0
- package/dist/handlers/index.js +8 -2
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/index.mjs +8 -2
- package/dist/handlers/index.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/StudioUI-GWMM47P7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/StudioUI.tsx","../src/components/StudioContext.tsx","../src/components/StudioToolbar.tsx","../src/components/StudioModal.tsx","../src/components/StudioFolderPicker.tsx","../src/components/R2SetupModal.tsx","../src/components/AddNewModal.tsx","../src/components/StudioFileGrid.tsx","../src/hooks/useFileList.ts","../src/lib/api.ts","../src/components/StudioFileList.tsx","../src/components/StudioDetailView.tsx","../src/components/StudioSettings.tsx","../src/components/ErrorModal.tsx"],"sourcesContent":["/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useEffect, useCallback, useState } from 'react'\nimport { css } from '@emotion/react'\nimport { StudioContext } from './StudioContext'\nimport { StudioToolbar } from './StudioToolbar'\nimport { StudioFileGrid } from './StudioFileGrid'\nimport { StudioFileList } from './StudioFileList'\nimport { StudioDetailView } from './StudioDetailView'\nimport { StudioSettings } from './StudioSettings'\nimport { ErrorModal } from './ErrorModal'\nimport { colors, fontSize, baseReset } from './tokens'\nimport type { FileItem, LeanMeta } from '../types'\n\ninterface StudioUIProps {\n onClose: () => void\n isVisible?: boolean\n}\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst styles = {\n container: css`\n ${baseReset}\n display: flex;\n flex-direction: column;\n height: 100%;\n background: ${colors.background};\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: ${colors.surface};\n border-bottom: 1px solid ${colors.border};\n position: relative;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n flex-shrink: 0;\n `,\n headerLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n `,\n headerCenter: css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n max-width: 50%;\n `,\n breadcrumbs: css`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n overflow: hidden;\n `,\n breadcrumbSeparator: css`\n color: ${colors.border};\n flex-shrink: 0;\n `,\n breadcrumbItem: css`\n color: ${colors.textSecondary};\n text-decoration: none;\n cursor: pointer;\n transition: color 0.15s ease;\n white-space: nowrap;\n \n &:hover {\n color: ${colors.primary};\n }\n `,\n breadcrumbCurrent: css`\n color: ${colors.text};\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n headerActions: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n headerBtn: css`\n height: ${btnHeight};\n padding: 0 12px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n headerIcon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textSecondary};\n `,\n content: css`\n flex: 1;\n display: flex;\n overflow: hidden;\n `,\n fileBrowser: css`\n flex: 1;\n min-width: 0;\n overflow: auto;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n `,\n dropOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(99, 91, 255, 0.1);\n border: 3px dashed ${colors.primary};\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 50;\n pointer-events: none;\n `,\n dropMessage: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n color: ${colors.primary};\n font-size: ${fontSize.lg};\n font-weight: 600;\n `,\n dropIcon: css`\n width: 48px;\n height: 48px;\n `,\n}\n\n/**\n * Main Studio UI - contains all panels and manages internal state\n * Rendered inside the modal via lazy loading\n */\nexport function StudioUI({ onClose, isVisible = true }: StudioUIProps) {\n const [currentPath, setCurrentPathInternal] = useState('public')\n const [selectedItems, setSelectedItems] = useState<Set<string>>(new Set())\n const [lastSelectedPath, setLastSelectedPath] = useState<string | null>(null)\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid')\n const [focusedItem, setFocusedItem] = useState<FileItem | null>(null)\n const [meta, setMeta] = useState<LeanMeta | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [refreshKey, setRefreshKey] = useState(0)\n const [scanRequested, setScanRequested] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [error, setError] = useState<{ title: string; message: string } | null>(null)\n const [fileItems, setFileItems] = useState<FileItem[]>([])\n const [isDragging, setIsDragging] = useState(false)\n\n const triggerRefresh = useCallback(() => {\n setRefreshKey((k) => k + 1)\n }, [])\n\n const triggerScan = useCallback(() => {\n setScanRequested(true)\n }, [])\n\n const clearScanRequest = useCallback(() => {\n setScanRequested(false)\n }, [])\n\n const showError = useCallback((title: string, message: string) => {\n setError({ title, message })\n }, [])\n\n const clearError = useCallback(() => {\n setError(null)\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n }, [])\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n\n const files = Array.from(e.dataTransfer.files)\n if (files.length === 0) return\n\n // Don't allow drops in the images folder\n if (currentPath === 'public/images' || currentPath.startsWith('public/images/')) {\n return\n }\n\n for (const file of files) {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n\n try {\n await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n } catch (error) {\n console.error('Upload error:', error)\n }\n }\n triggerRefresh()\n }, [currentPath, triggerRefresh])\n\n const navigateUp = useCallback(() => {\n if (currentPath === 'public') return\n const parts = currentPath.split('/')\n parts.pop()\n setCurrentPathInternal(parts.join('/') || 'public')\n setSelectedItems(new Set())\n }, [currentPath])\n\n const setCurrentPath = useCallback((path: string) => {\n setCurrentPathInternal(path)\n setSelectedItems(new Set())\n setFocusedItem(null)\n }, [])\n\n const toggleSelection = useCallback((path: string) => {\n setSelectedItems((prev) => {\n const next = new Set(prev)\n if (next.has(path)) {\n next.delete(path)\n } else {\n next.add(path)\n }\n return next\n })\n setLastSelectedPath(path)\n }, [])\n\n const selectRange = useCallback((fromPath: string, toPath: string, allItems: FileItem[]) => {\n const fromIndex = allItems.findIndex(item => item.path === fromPath)\n const toIndex = allItems.findIndex(item => item.path === toPath)\n \n if (fromIndex === -1 || toIndex === -1) return\n \n const start = Math.min(fromIndex, toIndex)\n const end = Math.max(fromIndex, toIndex)\n \n setSelectedItems((prev) => {\n const next = new Set(prev)\n for (let i = start; i <= end; i++) {\n next.add(allItems[i].path)\n }\n return next\n })\n setLastSelectedPath(toPath)\n }, [])\n\n const selectAll = useCallback((items: FileItem[]) => {\n setSelectedItems(new Set(items.map((item) => item.path)))\n }, [])\n\n const clearSelection = useCallback(() => {\n setSelectedItems(new Set())\n }, [])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n // Don't close if user is in an input field (e.g., search)\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n return\n }\n \n if (focusedItem) {\n setFocusedItem(null)\n } else {\n onClose()\n }\n }\n },\n [onClose, focusedItem]\n )\n\n useEffect(() => {\n if (isVisible) {\n document.addEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'hidden'\n }\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = ''\n }\n }, [handleKeyDown, isVisible])\n\n const contextValue = {\n isOpen: true,\n openStudio: () => {},\n closeStudio: onClose,\n toggleStudio: onClose,\n currentPath,\n setCurrentPath,\n navigateUp,\n selectedItems,\n toggleSelection,\n selectRange,\n selectAll,\n clearSelection,\n lastSelectedPath,\n viewMode,\n setViewMode,\n focusedItem,\n setFocusedItem,\n meta,\n setMeta,\n isLoading,\n setIsLoading,\n refreshKey,\n triggerRefresh,\n scanRequested,\n triggerScan,\n clearScanRequest,\n searchQuery,\n setSearchQuery,\n error,\n showError,\n clearError,\n fileItems,\n setFileItems,\n }\n\n return (\n <StudioContext.Provider value={contextValue}>\n <div css={styles.container}>\n <div css={styles.header}>\n <div css={styles.headerLeft}>\n <h1 css={styles.title}>Studio</h1>\n </div>\n <div css={styles.headerCenter}>\n <Breadcrumbs currentPath={currentPath} onNavigate={setCurrentPath} />\n </div>\n <div css={styles.headerActions}>\n <StudioSettings />\n <button\n css={styles.headerBtn}\n onClick={onClose}\n aria-label=\"Close Studio\"\n >\n <CloseIcon />\n </button>\n </div>\n </div>\n\n <StudioToolbar />\n\n <div \n css={styles.content}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {isDragging && (\n <div css={styles.dropOverlay}>\n <div css={styles.dropMessage}>\n <svg css={styles.dropIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span>Drop files to upload</span>\n </div>\n </div>\n )}\n <div css={styles.fileBrowser}>\n {viewMode === 'grid' ? <StudioFileGrid /> : <StudioFileList />}\n </div>\n </div>\n \n {/* Detail view as modal overlay */}\n {focusedItem && <StudioDetailView />}\n\n {/* Error modal */}\n <ErrorModal />\n </div>\n </StudioContext.Provider>\n )\n}\n\nfunction Breadcrumbs({ currentPath, onNavigate }: { currentPath: string; onNavigate: (path: string) => void }) {\n const parts = currentPath.split('/').filter(Boolean)\n \n // Build paths for each breadcrumb\n const breadcrumbs = parts.map((part, index) => ({\n name: part,\n path: parts.slice(0, index + 1).join('/')\n }))\n\n return (\n <div css={styles.breadcrumbs}>\n {breadcrumbs.map((crumb, index) => (\n <span key={crumb.path} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {index > 0 && <span css={styles.breadcrumbSeparator}>/</span>}\n {index === breadcrumbs.length - 1 ? (\n <span css={styles.breadcrumbCurrent}>{crumb.name}</span>\n ) : (\n <span\n css={styles.breadcrumbItem}\n onClick={() => onNavigate(crumb.path)}\n >\n {crumb.name}\n </span>\n )}\n </span>\n ))}\n </div>\n )\n}\n\nfunction CloseIcon() {\n return (\n <svg\n css={styles.headerIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n )\n}\n\nexport default StudioUI\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { FileItem, LeanMeta } from '../types'\n\n/**\n * Error message type for centralized error handling\n */\nexport interface ErrorMessage {\n title: string\n message: string\n}\n\n/**\n * Studio state interface\n * State is managed by StudioUI and provided to all child components\n */\nexport interface StudioState {\n isOpen: boolean\n openStudio: () => void\n closeStudio: () => void\n toggleStudio: () => void\n\n // Navigation\n currentPath: string\n setCurrentPath: (path: string) => void\n navigateUp: () => void\n\n // Selection\n selectedItems: Set<string>\n toggleSelection: (path: string) => void\n selectRange: (fromPath: string, toPath: string, allItems: FileItem[]) => void\n selectAll: (items: FileItem[]) => void\n clearSelection: () => void\n lastSelectedPath: string | null\n\n // View\n viewMode: 'grid' | 'list'\n setViewMode: (mode: 'grid' | 'list') => void\n\n // Focused item (for detail view)\n focusedItem: FileItem | null\n setFocusedItem: (item: FileItem | null) => void\n\n // Meta\n meta: LeanMeta | null\n setMeta: (meta: LeanMeta) => void\n\n // Loading\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n\n // Refresh trigger\n refreshKey: number\n triggerRefresh: () => void\n\n // Scan trigger\n scanRequested: boolean\n triggerScan: () => void\n clearScanRequest: () => void\n\n // Search\n searchQuery: string\n setSearchQuery: (query: string) => void\n\n // Error handling\n error: ErrorMessage | null\n showError: (title: string, message: string) => void\n clearError: () => void\n\n // File items (for toolbar to check cloud status)\n fileItems: FileItem[]\n setFileItems: (items: FileItem[]) => void\n}\n\nconst defaultState: StudioState = {\n isOpen: false,\n openStudio: () => {},\n closeStudio: () => {},\n toggleStudio: () => {},\n currentPath: 'public',\n setCurrentPath: () => {},\n navigateUp: () => {},\n selectedItems: new Set(),\n toggleSelection: () => {},\n selectRange: () => {},\n selectAll: () => {},\n clearSelection: () => {},\n lastSelectedPath: null,\n viewMode: 'grid',\n setViewMode: () => {},\n focusedItem: null,\n setFocusedItem: () => {},\n meta: null,\n setMeta: () => {},\n isLoading: false,\n setIsLoading: () => {},\n refreshKey: 0,\n triggerRefresh: () => {},\n scanRequested: false,\n triggerScan: () => {},\n clearScanRequest: () => {},\n searchQuery: '',\n setSearchQuery: () => {},\n error: null,\n showError: () => {},\n clearError: () => {},\n fileItems: [],\n setFileItems: () => {},\n}\n\nexport const StudioContext = createContext<StudioState>(defaultState)\n\n/**\n * Hook to access Studio state from child components\n */\nexport function useStudio() {\n return useContext(StudioContext)\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { ConfirmModal, AlertModal, ProgressModal, InputModal, type ProgressState } from './StudioModal'\nimport { StudioFolderPicker } from './StudioFolderPicker'\nimport { R2SetupModal } from './R2SetupModal'\nimport { AddNewModal } from './AddNewModal'\nimport { colors, fontSize } from './tokens'\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n toolbar: css`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 16px;\n background-color: ${colors.surface};\n border-bottom: 1px solid ${colors.border};\n overflow-x: auto;\n min-width: 0;\n \n @media (min-width: 768px) {\n padding: 12px 24px;\n }\n `,\n left: css`\n display: flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n `,\n right: css`\n display: flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n `,\n btn: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: ${btnHeight};\n padding: 0 14px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n cursor: pointer;\n transition: all 0.15s ease;\n color: ${colors.text};\n letter-spacing: -0.01em;\n \n &:hover:not(:disabled) {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n \n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n `,\n btnIconOnly: css`\n padding: 0 10px;\n `,\n btnPrimary: css`\n background: ${colors.primary};\n border-color: ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n `,\n btnDanger: css`\n color: ${colors.danger};\n \n &:hover:not(:disabled) {\n background-color: ${colors.dangerLight};\n border-color: ${colors.danger};\n }\n `,\n icon: css`\n width: 16px;\n height: 16px;\n `,\n iconSpin: css`\n animation: ${spin} 1s linear infinite;\n `,\n selectionCount: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n display: flex;\n align-items: center;\n gap: 8px;\n margin-right: 8px;\n `,\n clearBtn: css`\n color: ${colors.primary};\n background: none;\n border: none;\n cursor: pointer;\n font-size: ${fontSize.base};\n font-weight: 500;\n padding: 0;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n divider: css`\n width: 1px;\n height: 24px;\n background: ${colors.border};\n margin: 0 4px;\n `,\n viewToggle: css`\n display: flex;\n align-items: center;\n height: ${btnHeight};\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n overflow: hidden;\n `,\n searchWrapper: css`\n position: relative;\n display: flex;\n align-items: center;\n `,\n searchInput: css`\n height: ${btnHeight};\n padding: 0 32px 0 12px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.base};\n background: ${colors.surface};\n color: ${colors.text};\n width: 180px;\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 2px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n searchClearBtn: css`\n position: absolute;\n right: 5px;\n top: 5px;\n bottom: 5px;\n background: ${colors.primary};\n border: none;\n padding: 0 6px;\n cursor: pointer;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n viewBtn: css`\n height: 100%;\n padding: 0 10px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: ${colors.textSecondary};\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n color: ${colors.text};\n background-color: ${colors.surfaceHover};\n }\n `,\n viewBtnActive: css`\n background-color: ${colors.primaryLight};\n color: ${colors.primary};\n \n &:hover {\n background-color: ${colors.primaryLight};\n color: ${colors.primary};\n }\n `,\n}\n\nexport function StudioToolbar() {\n const { selectedItems, viewMode, setViewMode, clearSelection, currentPath, triggerRefresh, focusedItem, scanRequested, clearScanRequest, fileItems } = useStudio()\n const fileInputRef = useRef<HTMLInputElement>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n const [showAddNewModal, setShowAddNewModal] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [scanning, setScanning] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)\n const [showProcessConfirm, setShowProcessConfirm] = useState(false)\n const [showSyncConfirm, setShowSyncConfirm] = useState(false)\n const [syncImageCount, setSyncImageCount] = useState(0)\n const [syncHasRemote, setSyncHasRemote] = useState(false)\n const [syncHasLocal, setSyncHasLocal] = useState(false)\n const [showProgress, setShowProgress] = useState(false)\n const [progressTitle, setProgressTitle] = useState('Processing Images')\n const [progressState, setProgressState] = useState<ProgressState>({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n })\n const [processCount, setProcessCount] = useState(0)\n const [processMode, setProcessMode] = useState<'all' | 'selected'>('all')\n const [imagesToProcess, setImagesToProcess] = useState<string[]>([])\n const [alertMessage, setAlertMessage] = useState<{ title: string; message: string } | null>(null)\n const [showNewFolderModal, setShowNewFolderModal] = useState(false)\n const [showRenameFolderModal, setShowRenameFolderModal] = useState(false)\n const [showMoveModal, setShowMoveModal] = useState(false)\n const [showR2SetupModal, setShowR2SetupModal] = useState(false)\n const [pushing, setPushing] = useState(false)\n\n // Check if we're in the images folder (uploads not allowed there)\n const isInImagesFolder = currentPath === 'public/images' || currentPath.startsWith('public/images/')\n\n const handleUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleScan = useCallback(async () => {\n setScanning(true)\n setProgressTitle('Scanning Files')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n message: 'Scanning for files...',\n })\n\n try {\n const response = await fetch('/api/studio/scan', { method: 'POST' })\n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader')\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'start') {\n setProgressState({\n current: 0,\n total: data.total,\n percent: 0,\n status: 'processing',\n message: `Scanning ${data.total} files...`,\n })\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n status: 'processing',\n currentFile: data.currentFile,\n })\n } else if (data.type === 'cleanup') {\n setProgressState(prev => ({\n ...prev,\n message: data.message,\n }))\n } else if (data.type === 'complete') {\n let message = data.renamed > 0 ? `${data.renamed} file(s) renamed due to conflicts. ` : ''\n if (data.orphanedFiles && data.orphanedFiles.length > 0) {\n message += `Found ${data.orphanedFiles.length} orphaned thumbnail(s) in images folder.`\n }\n setProgressState({\n current: data.total || 0,\n total: data.total || 0,\n percent: 100,\n status: 'complete',\n processed: data.added,\n alreadyProcessed: data.existingCount,\n errors: data.errors,\n orphanedFiles: data.orphanedFiles,\n message: message || undefined,\n isScan: true,\n })\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: data.message || 'Scan failed',\n })\n }\n }\n }\n } catch (error) {\n console.error('Scan error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Scan failed',\n })\n } finally {\n setScanning(false)\n }\n }, [triggerRefresh])\n\n // Handle scan request from file pane\n useEffect(() => {\n if (scanRequested && !scanning) {\n clearScanRequest()\n handleScan()\n }\n }, [scanRequested, scanning, clearScanRequest, handleScan])\n\n const handleFileChange = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) return\n\n const fileList = Array.from(files)\n \n // Show progress modal for multiple files\n if (fileList.length > 1) {\n setProgressState({\n current: 0,\n total: fileList.length,\n percent: 0,\n status: 'processing',\n message: 'Uploading files...',\n })\n setShowProgress(true)\n } else {\n setUploading(true)\n }\n\n let uploaded = 0\n let errors = 0\n\n try {\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i]\n \n if (fileList.length > 1) {\n setProgressState({\n current: i + 1,\n total: fileList.length,\n percent: Math.round(((i + 1) / fileList.length) * 100),\n status: 'processing',\n currentFile: file.name,\n })\n }\n\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n\n try {\n const response = await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const error = await response.json()\n errors++\n if (fileList.length === 1) {\n if (response.status >= 500) {\n console.error('Upload error:', error)\n setAlertMessage({\n title: 'Upload Failed',\n message: `Failed to upload ${file.name}: ${error.error || 'Unknown error'}`,\n })\n } else {\n setAlertMessage({\n title: 'Cannot Upload Here',\n message: error.error || 'Upload not allowed in this location.',\n })\n }\n }\n } else {\n uploaded++\n }\n } catch {\n errors++\n }\n }\n\n if (fileList.length > 1) {\n setProgressState({\n current: fileList.length,\n total: fileList.length,\n percent: 100,\n status: 'complete',\n processed: uploaded,\n errors: errors,\n })\n }\n \n triggerRefresh()\n } catch (error) {\n console.error('Upload error:', error)\n if (fileList.length > 1) {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Upload failed.',\n })\n } else {\n setAlertMessage({\n title: 'Upload Failed',\n message: 'Upload failed. Check console for details.',\n })\n }\n } finally {\n setUploading(false)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }\n }, [currentPath, triggerRefresh])\n\n const handleProcessImages = useCallback(async () => {\n const hasSelection = selectedItems.size > 0\n \n if (hasSelection) {\n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n \n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n // Add folder images to selectedImagePaths (as public/ paths)\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n \n if (selectedImagePaths.length === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the selected items.',\n })\n return\n }\n \n setProcessCount(selectedImagePaths.length)\n setImagesToProcess(selectedImagePaths)\n setProcessMode('selected')\n setShowProcessConfirm(true)\n } else {\n // Count ALL images for \"process all\"\n try {\n const response = await fetch('/api/studio/count-images')\n const data = await response.json()\n \n if (data.count === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the public folder to process.',\n })\n return\n }\n \n setProcessCount(data.count)\n setProcessMode('all')\n setShowProcessConfirm(true)\n } catch (error) {\n console.error('Failed to count images:', error)\n setAlertMessage({\n title: 'Error',\n message: 'Failed to count images.',\n })\n }\n }\n }, [selectedItems])\n\n const handleProcessConfirm = useCallback(async () => {\n setShowProcessConfirm(false)\n setProcessing(true)\n\n // Create new AbortController for this request\n abortControllerRef.current = new AbortController()\n const signal = abortControllerRef.current.signal\n\n try {\n if (processMode === 'all') {\n // Process all images with streaming progress\n setProgressTitle('Processing Images')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: processCount,\n percent: 0,\n status: 'processing',\n })\n\n const response = await fetch('/api/studio/process-all', {\n method: 'POST',\n signal,\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n // Check if aborted\n if (signal.aborted) {\n reader.cancel()\n break\n }\n\n const text = decoder.decode(value)\n const lines = text.split('\\n\\n').filter(line => line.startsWith('data: '))\n\n for (const line of lines) {\n try {\n const data = JSON.parse(line.replace('data: ', ''))\n \n if (data.type === 'start') {\n setProgressState(prev => ({\n ...prev,\n total: data.total,\n }))\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n currentFile: data.currentFile,\n status: 'processing',\n })\n } else if (data.type === 'cleanup') {\n setProgressState(prev => ({\n ...prev,\n status: 'cleanup',\n currentFile: undefined,\n }))\n } else if (data.type === 'complete') {\n setProgressState({\n current: data.processed,\n total: data.processed,\n percent: 100,\n status: 'complete',\n processed: data.processed,\n alreadyProcessed: data.alreadyProcessed,\n orphansRemoved: data.orphansRemoved,\n errors: data.errors,\n })\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n message: data.message,\n }))\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (err) {\n if (signal.aborted) {\n // User stopped - update state to show stopped status\n setProgressState(prev => ({\n ...prev,\n status: 'stopped',\n processed: prev.current,\n }))\n triggerRefresh()\n } else {\n throw err\n }\n }\n } else {\n // Process selected images (no streaming for now)\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: processCount,\n percent: 0,\n status: 'processing',\n })\n\n // Use stored imagesToProcess instead of selectedItems\n const selectedImageKeys = imagesToProcess.map(p => p.replace(/^public\\//, ''))\n \n const response = await fetch('/api/studio/reprocess', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: selectedImageKeys }),\n signal,\n })\n \n const data = await response.json()\n \n if (response.ok) {\n setProgressState({\n current: data.processed?.length || 0,\n total: data.processed?.length || 0,\n percent: 100,\n status: 'complete',\n processed: data.processed?.length || 0,\n errors: data.errors?.length || 0,\n })\n clearSelection()\n triggerRefresh()\n } else {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: data.error || 'Unknown error',\n })\n }\n }\n } catch (error) {\n if (signal.aborted) {\n // User stopped\n setProgressState(prev => ({\n ...prev,\n status: 'stopped',\n processed: prev.current,\n }))\n triggerRefresh()\n } else {\n console.error('Processing error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Processing failed. Check console for details.',\n })\n }\n } finally {\n setProcessing(false)\n abortControllerRef.current = null\n }\n }, [processMode, processCount, imagesToProcess, clearSelection, triggerRefresh])\n\n const handleStopProcessing = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n }, [])\n\n const handleDeleteOrphans = useCallback(async () => {\n const orphanedFiles = progressState.orphanedFiles\n if (!orphanedFiles || orphanedFiles.length === 0) return\n\n try {\n const response = await fetch('/api/studio/delete-orphans', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: orphanedFiles }),\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setProgressState(prev => ({\n ...prev,\n orphanedFiles: undefined,\n orphansRemoved: data.deleted,\n message: `Deleted ${data.deleted} orphaned thumbnail${data.deleted !== 1 ? 's' : ''}.`,\n }))\n triggerRefresh()\n } else {\n setAlertMessage({\n title: 'Delete Failed',\n message: data.error || 'Failed to delete orphaned files.',\n })\n }\n } catch (error) {\n console.error('Delete orphans error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Failed to delete orphaned files. Check console for details.',\n })\n }\n }, [progressState.orphanedFiles, triggerRefresh])\n\n const handleDeleteClick = useCallback(() => {\n if (selectedItems.size === 0) return\n setShowDeleteConfirm(true)\n }, [selectedItems])\n\n const handleDeleteConfirm = useCallback(async () => {\n setShowDeleteConfirm(false)\n \n try {\n const response = await fetch('/api/studio/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: Array.from(selectedItems) }),\n })\n\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Delete Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Delete error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Delete failed. Check console for details.',\n })\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const handleSyncClick = useCallback(async () => {\n if (selectedItems.size === 0) return\n\n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n\n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n\n if (selectedImagePaths.length === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the selected items.',\n })\n return\n }\n\n // Determine what types of images are selected\n let hasRemote = false\n let hasLocal = false\n \n for (const imgPath of selectedImagePaths) {\n const item = fileItems.find(f => f.path === imgPath)\n if (item) {\n if (item.isRemote) {\n hasRemote = true\n } else if (!item.cdnPushed) {\n hasLocal = true\n }\n }\n }\n\n // Store info and show confirm modal\n setSyncImageCount(selectedImagePaths.length)\n setSyncHasRemote(hasRemote)\n setSyncHasLocal(hasLocal)\n setShowSyncConfirm(true)\n }, [selectedItems, fileItems])\n\n const handleSyncConfirm = useCallback(async () => {\n setShowSyncConfirm(false)\n \n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n\n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n\n // Convert to image keys\n const imageKeys = selectedImagePaths.map(p => '/' + p.replace(/^public\\//, ''))\n\n // Show progress modal\n setProgressTitle('Pushing to CDN')\n setProgressState({\n current: 0,\n total: imageKeys.length,\n percent: 0,\n status: 'processing',\n message: 'Pushing to CDN...',\n })\n setShowProgress(true)\n\n let pushed = 0\n let errors = 0\n const errorMessages: string[] = []\n\n try {\n // Push images one by one for progress tracking\n for (let i = 0; i < imageKeys.length; i++) {\n const imageKey = imageKeys[i]\n \n setProgressState({\n current: i + 1,\n total: imageKeys.length,\n percent: Math.round(((i + 1) / imageKeys.length) * 100),\n status: 'processing',\n currentFile: imageKey.replace(/^\\//, ''),\n })\n\n try {\n const response = await fetch('/api/studio/sync', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: [imageKey] }),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n // Check if it's an R2 configuration error\n if (data.error?.includes('R2 not configured') || data.error?.includes('CLOUDFLARE_R2')) {\n setShowProgress(false)\n setShowR2SetupModal(true)\n return\n }\n errors++\n errorMessages.push(data.error || `Failed: ${imageKey}`)\n } else if (data.pushed?.length > 0) {\n pushed++\n } else if (data.errors?.length > 0) {\n errors++\n // data.errors contains the actual error messages from the handler\n for (const errMsg of data.errors) {\n errorMessages.push(errMsg)\n }\n }\n } catch (err) {\n errors++\n errorMessages.push(`Network error: ${imageKey}`)\n }\n }\n\n setProgressState({\n current: imageKeys.length,\n total: imageKeys.length,\n percent: 100,\n status: 'complete',\n processed: pushed,\n errors: errors,\n errorMessages: errorMessages.length > 0 ? errorMessages : undefined,\n })\n \n clearSelection()\n triggerRefresh()\n } catch (error) {\n console.error('Push error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Failed to push to CDN.',\n })\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const handleCreateFolder = useCallback(async (folderName: string) => {\n setShowNewFolderModal(false)\n \n try {\n const response = await fetch('/api/studio/create-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ parentPath: currentPath, name: folderName }),\n })\n\n if (response.ok) {\n triggerRefresh()\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Create Folder Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Create folder error:', error)\n setAlertMessage({\n title: 'Create Folder Failed',\n message: 'Failed to create folder. Check console for details.',\n })\n }\n }, [currentPath, triggerRefresh])\n\n const handleMoveClick = useCallback(() => {\n if (selectedItems.size === 0) return\n setShowMoveModal(true)\n }, [selectedItems])\n\n const handleMoveConfirm = useCallback(async (destination: string) => {\n const paths = Array.from(selectedItems)\n \n // Show progress modal\n setProgressTitle('Moving Files')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: paths.length,\n percent: 0,\n status: 'processing',\n })\n\n try {\n const response = await fetch('/api/studio/move', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths, destination }),\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n try {\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'start') {\n setProgressState(prev => ({ ...prev, total: data.total }))\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n currentFile: data.currentFile,\n status: 'processing',\n })\n } else if (data.type === 'complete') {\n setProgressState(prev => ({\n ...prev,\n status: 'complete',\n processed: data.moved,\n errors: data.errors,\n errorMessages: data.errorMessages,\n isMove: true,\n }))\n clearSelection()\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n errorMessage: data.message,\n }))\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (error) {\n console.error('Move error:', error)\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n errorMessage: 'Failed to move items. Check console for details.',\n }))\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const { searchQuery, setSearchQuery } = useStudio()\n \n const handleSearch = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value)\n }, [setSearchQuery])\n\n const handleSearchKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.stopPropagation() // Prevent closing the studio\n setSearchQuery('')\n ;(e.target as HTMLInputElement).blur()\n }\n }, [setSearchQuery])\n\n const hasSelection = selectedItems.size > 0\n \n // Check if any selected items are already in our R2 (for Push CDN disabling)\n // Remote images (from other CDNs) can still be pushed to our R2\n const hasR2Selection = hasSelection && Array.from(selectedItems).some(path => {\n const item = fileItems.find(f => f.path === path)\n return item && item.cdnPushed && !item.isRemote\n })\n \n // Check if exactly one folder is selected (for rename)\n const selectedPaths = Array.from(selectedItems)\n const singleFolderSelected = selectedPaths.length === 1 && !selectedPaths[0].includes('.')\n const selectedFolderPath = singleFolderSelected ? selectedPaths[0] : null\n const selectedFolderName = selectedFolderPath ? selectedFolderPath.split('/').pop() || '' : ''\n\n const handleRenameFolder = useCallback(async (newName: string) => {\n if (!selectedFolderPath) return\n setShowRenameFolderModal(false)\n try {\n const response = await fetch('/api/studio/rename', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ oldPath: selectedFolderPath, newName }),\n })\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n }\n } catch (error) {\n console.error('Failed to rename folder:', error)\n }\n }, [selectedFolderPath, clearSelection, triggerRefresh])\n\n // Hide toolbar actions when viewing detail\n if (focusedItem) {\n return null\n }\n\n return (\n <>\n {showDeleteConfirm && (\n <ConfirmModal\n title=\"Delete Items\"\n message={`Are you sure you want to delete ${selectedItems.size} item(s)? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n variant=\"danger\"\n onConfirm={handleDeleteConfirm}\n onCancel={() => setShowDeleteConfirm(false)}\n />\n )}\n\n {showSyncConfirm && (\n <ConfirmModal\n title=\"Push to CDN\"\n message={`Push ${syncImageCount} image${syncImageCount !== 1 ? 's' : ''} to Cloudflare R2?${syncHasRemote ? ' Remote images will be downloaded first.' : ''}${syncHasLocal ? ' After pushing, local files will be deleted.' : ''}`}\n confirmLabel=\"Push\"\n onConfirm={handleSyncConfirm}\n onCancel={() => setShowSyncConfirm(false)}\n />\n )}\n\n {showProcessConfirm && (\n <ConfirmModal\n title=\"Process Images\"\n message={processMode === 'all' \n ? `Found ${processCount} image${processCount !== 1 ? 's' : ''} in the public folder. This will regenerate all thumbnails and remove any orphaned files from the images folder.`\n : `Process ${processCount} selected image${processCount !== 1 ? 's' : ''}? This will regenerate thumbnails for these files.`\n }\n confirmLabel={processing ? 'Processing...' : 'Process'}\n onConfirm={handleProcessConfirm}\n onCancel={() => setShowProcessConfirm(false)}\n />\n )}\n\n {showProgress && (\n <ProgressModal\n title={progressTitle}\n progress={progressState}\n onStop={handleStopProcessing}\n onDeleteOrphans={handleDeleteOrphans}\n onClose={() => {\n setShowProgress(false)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n })\n }}\n />\n )}\n\n {showNewFolderModal && (\n <InputModal\n title=\"New Folder\"\n message=\"Enter a name for the new folder:\"\n placeholder=\"Folder name\"\n confirmLabel=\"Create\"\n onConfirm={handleCreateFolder}\n onCancel={() => setShowNewFolderModal(false)}\n />\n )}\n\n {showMoveModal && (\n <StudioFolderPicker\n selectedItems={selectedItems}\n currentPath={currentPath}\n onMove={(destination) => {\n setShowMoveModal(false)\n handleMoveConfirm(destination)\n }}\n onCancel={() => setShowMoveModal(false)}\n />\n )}\n\n {showRenameFolderModal && selectedFolderPath && (\n <InputModal\n title=\"Rename Folder\"\n message=\"Enter a new name for the folder:\"\n placeholder={selectedFolderName}\n defaultValue={selectedFolderName}\n confirmLabel=\"Rename\"\n onConfirm={handleRenameFolder}\n onCancel={() => setShowRenameFolderModal(false)}\n />\n )}\n\n {alertMessage && (\n <AlertModal\n title={alertMessage.title}\n message={alertMessage.message}\n onClose={() => setAlertMessage(null)}\n />\n )}\n\n <R2SetupModal\n isOpen={showR2SetupModal}\n onClose={() => setShowR2SetupModal(false)}\n />\n\n {showAddNewModal && (\n <AddNewModal\n currentPath={currentPath}\n onClose={() => setShowAddNewModal(false)}\n onUploadComplete={() => {\n setShowAddNewModal(false)\n triggerRefresh()\n }}\n />\n )}\n\n <div css={styles.toolbar}>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\"image/*,video/*,audio/*,.pdf\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n \n <div css={styles.left}>\n <button\n css={[styles.btn, styles.btnPrimary]}\n onClick={() => setShowAddNewModal(true)}\n disabled={uploading || isInImagesFolder}\n >\n <UploadIcon />\n Add New\n </button>\n <button\n css={styles.btn}\n onClick={() => singleFolderSelected ? setShowRenameFolderModal(true) : setShowNewFolderModal(true)}\n disabled={isInImagesFolder && !singleFolderSelected}\n title={isInImagesFolder && !singleFolderSelected ? 'Cannot create folders in protected images folder' : undefined}\n >\n {singleFolderSelected ? <RenameIcon /> : <FolderPlusIcon />}\n {singleFolderSelected ? 'Rename Folder' : 'New Folder'}\n </button>\n \n <div css={styles.divider} />\n \n <button\n css={styles.btn}\n onClick={handleProcessImages}\n disabled={processing || isInImagesFolder}\n title={isInImagesFolder ? 'Cannot process images folder' : undefined}\n >\n <ImageStackIcon />\n {processing ? 'Processing...' : 'Process Images'}\n </button>\n <button\n css={[styles.btn, styles.btnDanger]}\n onClick={handleDeleteClick}\n disabled={!hasSelection}\n >\n <TrashIcon />\n Delete\n </button>\n <button\n css={styles.btn}\n onClick={handleMoveClick}\n disabled={!hasSelection}\n >\n <MoveIcon />\n Move\n </button>\n <button\n css={styles.btn}\n onClick={handleSyncClick}\n disabled={!hasSelection || hasR2Selection}\n title={hasR2Selection ? 'Selected files are already in R2' : undefined}\n >\n <CloudIcon />\n Push CDN\n </button>\n <div css={styles.searchWrapper}>\n <input\n css={styles.searchInput}\n type=\"text\"\n placeholder=\"Search images...\"\n value={searchQuery}\n onChange={handleSearch}\n onKeyDown={handleSearchKeyDown}\n />\n {searchQuery && (\n <button\n css={styles.searchClearBtn}\n onClick={() => setSearchQuery('')}\n title=\"Clear search\"\n >\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n\n <div css={styles.right}>\n {hasSelection && (\n <span css={styles.selectionCount}>\n {selectedItems.size} selected\n <button css={styles.clearBtn} onClick={clearSelection}>\n Clear\n </button>\n </span>\n )}\n\n <button\n css={styles.btn}\n onClick={handleScan}\n disabled={scanning}\n >\n <ScanIcon spinning={scanning} />\n Scan\n </button>\n\n <div css={styles.viewToggle}>\n <button\n css={[styles.viewBtn, viewMode === 'grid' && styles.viewBtnActive]}\n onClick={() => setViewMode('grid')}\n aria-label=\"Grid view\"\n >\n <GridIcon />\n </button>\n <button\n css={[styles.viewBtn, viewMode === 'list' && styles.viewBtnActive]}\n onClick={() => setViewMode('list')}\n aria-label=\"List view\"\n >\n <ListIcon />\n </button>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction UploadIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n )\n}\n\nfunction ScanIcon({ spinning }: { spinning?: boolean }) {\n return (\n <svg css={[styles.icon, spinning && styles.iconSpin]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n )\n}\n\nfunction TrashIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )\n}\n\nfunction FolderPlusIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n </svg>\n )\n}\n\nfunction RenameIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n )\n}\n\nfunction MoveIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n )\n}\n\nfunction CloudIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n )\n}\n\nfunction GridIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n )\n}\n\nfunction ListIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n )\n}\n\nfunction ImageStackIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport React from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 420px;\n width: 90%;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n body: css`\n padding: 12px 24px 24px;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0;\n line-height: 1.6;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n `,\n btnDanger: css`\n background-color: ${colors.danger};\n border: 1px solid ${colors.danger};\n color: white;\n \n &:hover {\n background-color: ${colors.dangerHover};\n border-color: ${colors.dangerHover};\n }\n `,\n}\n\ninterface ConfirmModalProps {\n title: string\n message: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: 'default' | 'danger'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmModal({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>{message}</p>\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n {cancelLabel}\n </button>\n <button\n css={[styles.btn, variant === 'danger' ? styles.btnDanger : styles.btnConfirm]}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\ninterface InputModalProps {\n title: string\n message?: string\n inputLabel?: string\n defaultValue?: string\n placeholder?: string\n confirmLabel?: string\n cancelLabel?: string\n onConfirm: (value: string) => void\n onCancel: () => void\n}\n\nconst inputStyles = {\n input: css`\n width: 100%;\n padding: 10px 12px;\n font-size: ${fontSize.base};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n background: ${colors.surface};\n color: ${colors.text};\n margin-top: 12px;\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 2px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n}\n\nexport function InputModal({\n title,\n message,\n inputLabel,\n defaultValue = '',\n placeholder,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n onCancel,\n}: InputModalProps) {\n const [value, setValue] = React.useState(defaultValue)\n \n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (value.trim()) {\n onConfirm(value.trim())\n }\n }\n \n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <form onSubmit={handleSubmit}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n {message && <p css={styles.message}>{message}</p>}\n {inputLabel && <label css={styles.message}>{inputLabel}</label>}\n <input\n css={inputStyles.input}\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n autoFocus\n />\n </div>\n <div css={styles.footer}>\n <button type=\"button\" css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n {cancelLabel}\n </button>\n <button type=\"submit\" css={[styles.btn, styles.btnConfirm]} disabled={!value.trim()}>\n {confirmLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n\ninterface AlertModalProps {\n title: string\n message: string\n buttonLabel?: string\n onClose: () => void\n}\n\nexport function AlertModal({\n title,\n message,\n buttonLabel = 'OK',\n onClose,\n}: AlertModalProps) {\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>{message}</p>\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnConfirm]} onClick={onClose}>\n {buttonLabel}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nconst progressStyles = {\n progressContainer: css`\n margin-top: 16px;\n `,\n progressBar: css`\n width: 100%;\n height: 8px;\n background-color: ${colors.background};\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 12px;\n `,\n progressFill: css`\n height: 100%;\n background: linear-gradient(90deg, ${colors.primary}, ${colors.primaryHover});\n border-radius: 4px;\n transition: width 0.3s ease;\n `,\n progressText: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n `,\n currentFile: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n margin: 8px 0 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n errorList: css`\n margin-top: 12px;\n padding: 12px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 6px;\n max-height: 200px;\n overflow-y: auto;\n `,\n errorItem: css`\n font-size: ${fontSize.xs};\n color: #991b1b;\n margin: 0 0 4px;\n &:last-child {\n margin-bottom: 0;\n }\n `,\n}\n\nexport interface ProgressState {\n current: number\n total: number\n percent: number\n currentFile?: string\n status: 'processing' | 'cleanup' | 'complete' | 'error' | 'stopped'\n message?: string\n processed?: number\n alreadyProcessed?: number\n orphansRemoved?: number\n orphanedFiles?: string[] // List of orphaned files found during scan\n errors?: number\n errorMessages?: string[]\n isScan?: boolean\n isMove?: boolean\n}\n\ninterface ProgressModalProps {\n title: string\n progress: ProgressState\n onClose?: () => void\n onStop?: () => void\n onDeleteOrphans?: () => void\n}\n\nexport function ProgressModal({\n title,\n progress,\n onClose,\n onDeleteOrphans,\n onStop,\n}: ProgressModalProps) {\n const isComplete = progress.status === 'complete'\n const isError = progress.status === 'error'\n const isStopped = progress.status === 'stopped'\n const canClose = isComplete || isError || isStopped\n const isRunning = !canClose\n\n return (\n <div css={styles.overlay}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n {isError ? (\n <p css={styles.message}>{progress.message || 'An error occurred'}</p>\n ) : isStopped ? (\n <p css={styles.message}>\n Processing stopped. Processed {progress.processed ?? progress.current} image{(progress.processed ?? progress.current) !== 1 ? 's' : ''} before stopping.\n </p>\n ) : isComplete ? (\n <>\n <p css={styles.message}>\n {progress.isMove ? (\n <>\n Moved {progress.processed} file{progress.processed !== 1 ? 's' : ''}.\n {progress.errors !== undefined && progress.errors > 0 ? (\n <> {progress.errors} error{progress.errors !== 1 ? 's' : ''} occurred.</>\n ) : null}\n </>\n ) : progress.isScan ? (\n <>\n {progress.alreadyProcessed !== undefined && progress.alreadyProcessed > 0 ? (\n <>{progress.alreadyProcessed} image{progress.alreadyProcessed !== 1 ? 's' : ''} already exist. </>\n ) : null}\n Scanned {progress.processed} new image{progress.processed !== 1 ? 's' : ''}.\n </>\n ) : (\n <>\n Processed {progress.processed} new image{progress.processed !== 1 ? 's' : ''}.\n {progress.alreadyProcessed !== undefined && progress.alreadyProcessed > 0 ? (\n <> {progress.alreadyProcessed} already processed.</>\n ) : null}\n </>\n )}\n {progress.orphansRemoved !== undefined && progress.orphansRemoved > 0 ? (\n <> Removed {progress.orphansRemoved} orphaned thumbnail{progress.orphansRemoved !== 1 ? 's' : ''}.</>\n ) : null}\n </p>\n {progress.errorMessages && progress.errorMessages.length > 0 && (\n <div css={progressStyles.errorList}>\n {progress.errorMessages.slice(0, 10).map((msg, i) => (\n <p key={i} css={progressStyles.errorItem}>{msg}</p>\n ))}\n {progress.errorMessages.length > 10 && (\n <p css={progressStyles.errorItem}>...and {progress.errorMessages.length - 10} more</p>\n )}\n </div>\n )}\n </>\n ) : (\n <>\n <p css={styles.message}>\n {progress.status === 'cleanup' \n ? 'Cleaning up orphaned files...' \n : `Processing images...`}\n </p>\n <div css={progressStyles.progressContainer}>\n <div css={progressStyles.progressBar}>\n <div \n css={progressStyles.progressFill} \n style={{ width: `${progress.percent}%` }} \n />\n </div>\n <div css={progressStyles.progressText}>\n <span>{progress.current} of {progress.total}</span>\n <span>{progress.percent}%</span>\n </div>\n {progress.currentFile && (\n <p css={progressStyles.currentFile} title={progress.currentFile}>\n {progress.currentFile}\n </p>\n )}\n </div>\n </>\n )}\n </div>\n <div css={styles.footer}>\n {isRunning && onStop && (\n <button css={[styles.btn, styles.btnDanger]} onClick={onStop}>\n Stop\n </button>\n )}\n {canClose && progress.orphanedFiles && progress.orphanedFiles.length > 0 && onDeleteOrphans && (\n <button css={[styles.btn, styles.btnDanger]} onClick={onDeleteOrphans}>\n Delete {progress.orphanedFiles.length} Orphan{progress.orphanedFiles.length !== 1 ? 's' : ''}\n </button>\n )}\n {canClose && (\n <button css={[styles.btn, styles.btnConfirm]} onClick={onClose}>\n Done\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\ninterface Folder {\n path: string\n name: string\n depth: number\n}\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 480px;\n width: 90%;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n body: css`\n padding: 12px 24px 24px;\n flex: 1;\n overflow-y: auto;\n min-height: 200px;\n max-height: 400px;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 16px;\n line-height: 1.6;\n `,\n folderList: css`\n display: flex;\n flex-direction: column;\n gap: 0;\n `,\n folderItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n position: relative;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n `,\n treeIndent: css`\n display: flex;\n align-items: center;\n height: 100%;\n `,\n treeLine: css`\n width: 16px;\n height: 100%;\n position: relative;\n flex-shrink: 0;\n \n &::before {\n content: '';\n position: absolute;\n left: 8px;\n top: 0;\n bottom: 50%;\n width: 0;\n border-left: 1px dashed ${colors.textSecondary};\n }\n \n &::after {\n content: '';\n position: absolute;\n left: 8px;\n top: 50%;\n width: 8px;\n height: 0;\n border-top: 1px dashed ${colors.textSecondary};\n }\n `,\n folderItemSelected: css`\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n \n &:hover {\n background-color: ${colors.primaryLight};\n }\n `,\n folderItemDisabled: css`\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: transparent;\n }\n `,\n folderIcon: css`\n width: 20px;\n height: 20px;\n color: #f9935e;\n flex-shrink: 0;\n `,\n folderName: css`\n font-size: ${fontSize.base};\n color: ${colors.text};\n flex: 1;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: ${colors.textSecondary};\n `,\n spinner: css`\n width: 24px;\n height: 24px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: spin 0.8s linear infinite;\n \n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n `,\n}\n\ninterface StudioFolderPickerProps {\n selectedItems: Set<string>\n currentPath: string\n onMove: (destination: string) => void\n onCancel: () => void\n}\n\nexport function StudioFolderPicker({ selectedItems, currentPath, onMove, onCancel }: StudioFolderPickerProps) {\n const [folders, setFolders] = useState<Folder[]>([])\n const [loading, setLoading] = useState(true)\n const [selectedFolder, setSelectedFolder] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadFolders() {\n try {\n const response = await fetch('/api/studio/list-folders')\n if (response.ok) {\n const data = await response.json()\n console.log('Loaded folders:', data)\n setFolders(data.folders || [])\n } else {\n console.error('Failed to load folders:', response.status, await response.text())\n }\n } catch (error) {\n console.error('Failed to load folders:', error)\n } finally {\n setLoading(false)\n }\n }\n loadFolders()\n }, [])\n\n // Filter out folders that are being moved (can't move to themselves or their children)\n // Mark current folder as disabled but still show it\n const selectedPaths = Array.from(selectedItems)\n const availableFolders = folders.filter(folder => {\n // Can't move a folder into itself or its children\n return !selectedPaths.some(selected => \n folder.path === selected || \n folder.path.startsWith(selected + '/')\n )\n })\n \n // Check if a folder is the current location (disabled)\n const isCurrentFolder = (folderPath: string) => folderPath === currentPath\n\n const handleConfirm = () => {\n if (selectedFolder) {\n onMove(selectedFolder)\n }\n }\n\n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>Move Items</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>\n Select a destination folder for {selectedItems.size} item{selectedItems.size !== 1 ? 's' : ''}:\n </p>\n \n {loading ? (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n ) : availableFolders.length === 0 ? (\n <div css={styles.loading}>\n No available folders to move to.\n </div>\n ) : (\n <div css={styles.folderList}>\n {availableFolders.map((folder) => {\n const disabled = isCurrentFolder(folder.path)\n return (\n <div\n key={folder.path}\n css={[\n styles.folderItem,\n selectedFolder === folder.path && styles.folderItemSelected,\n disabled && styles.folderItemDisabled\n ]}\n style={{ paddingLeft: 12 }}\n onClick={() => !disabled && setSelectedFolder(folder.path)}\n >\n {/* Render tree indent lines */}\n {folder.depth > 0 && (\n <div css={styles.treeIndent}>\n {Array.from({ length: folder.depth }).map((_, i) => (\n <div key={i} css={styles.treeLine} />\n ))}\n </div>\n )}\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <span css={styles.folderName}>\n {folder.name}\n {disabled && ' (current)'}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n Cancel\n </button>\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleConfirm}\n disabled={!selectedFolder}\n >\n Move Here\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css } from '@emotion/react'\nimport { colors, fontSize } from './tokens'\n\nconst ENV_TEMPLATE = `CLOUDFLARE_R2_ACCOUNT_ID=your_account_id\nCLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key\nCLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key\nCLOUDFLARE_R2_BUCKET_NAME=your_bucket_name\nCLOUDFLARE_R2_PUBLIC_URL=https://pub-xxx.r2.dev\nNEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_URL=https://pub-xxx.r2.dev`\n\ninterface R2SetupModalProps {\n isOpen: boolean\n onClose: () => void\n}\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1100;\n padding: 20px;\n `,\n modal: css`\n background: ${colors.surface};\n border-radius: 12px;\n max-width: 560px;\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);\n `,\n header: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px;\n border-bottom: 1px solid ${colors.border};\n `,\n icon: css`\n width: 32px;\n height: 32px;\n color: ${colors.primary};\n flex-shrink: 0;\n `,\n title: css`\n font-size: ${fontSize.xl};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n closeBtn: css`\n margin-left: auto;\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: ${colors.textMuted};\n border-radius: 4px;\n \n &:hover {\n color: ${colors.text};\n background: ${colors.surfaceHover};\n }\n `,\n closeIcon: css`\n width: 20px;\n height: 20px;\n `,\n content: css`\n padding: 24px;\n `,\n intro: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 20px 0;\n line-height: 1.6;\n `,\n steps: css`\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 16px;\n `,\n step: css`\n display: flex;\n gap: 12px;\n `,\n stepNumber: css`\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: ${colors.primaryLight};\n color: ${colors.primary};\n font-size: ${fontSize.sm};\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n stepContent: css`\n flex: 1;\n padding-top: 3px;\n `,\n stepTitle: css`\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n margin: 0 0 4px 0;\n `,\n stepDesc: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n line-height: 1.5;\n `,\n link: css`\n color: ${colors.primary};\n text-decoration: none;\n font-weight: 500;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n envVarsWrapper: css`\n position: relative;\n margin-top: 20px;\n `,\n envVars: css`\n background: ${colors.background};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n padding: 16px;\n padding-right: 48px;\n font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n font-size: 13px;\n line-height: 1.8;\n color: ${colors.text};\n overflow-x: auto;\n `,\n envVar: css`\n display: block;\n `,\n envKey: css`\n color: ${colors.primary};\n `,\n envValue: css`\n color: ${colors.textSecondary};\n `,\n copyBtn: css`\n position: absolute;\n top: 8px;\n right: 8px;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n color: ${colors.textMuted};\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.surfaceHover};\n color: ${colors.text};\n border-color: #d0d5dd;\n }\n `,\n copyIcon: css`\n width: 16px;\n height: 16px;\n `,\n copiedTooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n \n &::before {\n content: '';\n position: absolute;\n right: -4px;\n top: 50%;\n transform: translateY(-50%);\n border-left: 4px solid #1a1f36;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n }\n `,\n footer: css`\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n `,\n docsBtn: css`\n padding: 10px 16px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: 1px solid ${colors.border};\n background: ${colors.surface};\n color: ${colors.text};\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.surfaceHover};\n border-color: #d0d5dd;\n }\n `,\n doneBtn: css`\n padding: 10px 20px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: none;\n background: ${colors.primary};\n color: white;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n externalIcon: css`\n width: 14px;\n height: 14px;\n `,\n}\n\nexport function R2SetupModal({ isOpen, onClose }: R2SetupModalProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(ENV_TEMPLATE)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (error) {\n console.error('Failed to copy:', error)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n <h2 css={styles.title}>Set Up CDN Storage</h2>\n <button css={styles.closeBtn} onClick={onClose}>\n <svg css={styles.closeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div css={styles.content}>\n <p css={styles.intro}>\n Sync your images to Cloudflare R2 for faster global delivery. R2 offers generous free tier with no egress fees.\n </p>\n\n <ol css={styles.steps}>\n <li css={styles.step}>\n <span css={styles.stepNumber}>1</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create a Cloudflare account</h4>\n <p css={styles.stepDesc}>\n Sign up at{' '}\n <a css={styles.link} href=\"https://dash.cloudflare.com/sign-up\" target=\"_blank\" rel=\"noopener noreferrer\">\n dash.cloudflare.com\n </a>\n {' '}if you don't have one already.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>2</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create an R2 bucket</h4>\n <p css={styles.stepDesc}>\n Go to R2 in your Cloudflare dashboard and create a new bucket. Choose a name like <code>my-images</code>.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>3</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Enable public access</h4>\n <p css={styles.stepDesc}>\n In bucket settings, enable \"Public Access\" and copy the public URL (e.g., <code>https://pub-xxx.r2.dev</code>).\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>4</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create API token</h4>\n <p css={styles.stepDesc}>\n Go to R2 → Manage R2 API Tokens → Create API Token. Select \"Object Read & Write\" permissions for your bucket.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>5</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Add environment variables</h4>\n <p css={styles.stepDesc}>\n Add these to your <code>.env.local</code> file:\n </p>\n </div>\n </li>\n </ol>\n\n <div css={styles.envVarsWrapper}>\n <div css={styles.envVars}>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_ACCOUNT_ID</span>=<span css={styles.envValue}>your_account_id</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_ACCESS_KEY_ID</span>=<span css={styles.envValue}>your_access_key</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_SECRET_ACCESS_KEY</span>=<span css={styles.envValue}>your_secret_key</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_BUCKET_NAME</span>=<span css={styles.envValue}>your_bucket_name</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_PUBLIC_URL</span>=<span css={styles.envValue}>https://pub-xxx.r2.dev</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_URL</span>=<span css={styles.envValue}>https://pub-xxx.r2.dev</span>\n </span>\n </div>\n <button css={styles.copyBtn} onClick={handleCopy} title=\"Copy to clipboard\">\n {copied && <span css={styles.copiedTooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div css={styles.footer}>\n <a\n css={styles.docsBtn}\n href=\"https://developers.cloudflare.com/r2/get-started/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n R2 Documentation\n <svg css={styles.externalIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n <button css={styles.doneBtn} onClick={onClose}>\n Got it\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport React, { useState, useRef, useCallback } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 520px;\n width: 90%;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n tabs: css`\n display: flex;\n gap: 0;\n margin-top: 16px;\n border-bottom: 1px solid ${colors.border};\n `,\n tab: css`\n padding: 12px 20px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.textSecondary};\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: color 0.15s;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n tabActive: css`\n color: ${colors.primary};\n \n &::after {\n content: '';\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n height: 2px;\n background-color: ${colors.primary};\n }\n `,\n body: css`\n padding: 24px;\n min-height: 200px;\n `,\n dropzone: css`\n border: 2px dashed ${colors.border};\n border-radius: 8px;\n padding: 40px 24px;\n text-align: center;\n cursor: pointer;\n transition: all 0.15s;\n \n &:hover {\n border-color: ${colors.primary};\n background-color: ${colors.primaryLight};\n }\n `,\n dropzoneActive: css`\n border-color: ${colors.primary};\n background-color: ${colors.primaryLight};\n `,\n dropzoneIcon: css`\n width: 48px;\n height: 48px;\n margin: 0 auto 16px;\n color: ${colors.textMuted};\n `,\n dropzoneText: css`\n font-size: ${fontSize.base};\n color: ${colors.text};\n margin: 0 0 4px;\n `,\n dropzoneHint: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n `,\n textarea: css`\n width: 100%;\n min-height: 150px;\n padding: 12px;\n font-size: ${fontSize.sm};\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\n border: 1px solid ${colors.border};\n border-radius: 8px;\n resize: vertical;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n textareaLabel: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0 0 8px;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n fileInput: css`\n display: none;\n `,\n selectedFiles: css`\n margin-top: 16px;\n padding: 12px;\n background-color: ${colors.background};\n border-radius: 6px;\n font-size: ${fontSize.sm};\n color: ${colors.text};\n `,\n}\n\ninterface AddNewModalProps {\n currentPath: string\n onClose: () => void\n onUploadComplete: () => void\n}\n\nexport function AddNewModal({ currentPath, onClose, onUploadComplete }: AddNewModalProps) {\n const [activeTab, setActiveTab] = useState<'upload' | 'import'>('upload')\n const [selectedFiles, setSelectedFiles] = useState<File[]>([])\n const [urlInput, setUrlInput] = useState('')\n const [isDragging, setIsDragging] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [importing, setImporting] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleFileSelect = useCallback((files: FileList | null) => {\n if (files) {\n setSelectedFiles(Array.from(files))\n }\n }, [])\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n handleFileSelect(e.dataTransfer.files)\n }, [handleFileSelect])\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return\n \n setUploading(true)\n \n try {\n for (const file of selectedFiles) {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n \n await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n }\n \n onUploadComplete()\n onClose()\n } catch (error) {\n console.error('Upload failed:', error)\n } finally {\n setUploading(false)\n }\n }, [selectedFiles, currentPath, onUploadComplete, onClose])\n\n const handleImport = useCallback(async () => {\n const urls = urlInput\n .split('\\n')\n .map(url => url.trim())\n .filter(url => url.length > 0)\n \n if (urls.length === 0) return\n \n setImporting(true)\n \n try {\n const response = await fetch('/api/studio/import', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ urls }),\n })\n \n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader')\n \n const decoder = new TextDecoder()\n \n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n \n const text = decoder.decode(value)\n const lines = text.split('\\n\\n').filter(line => line.startsWith('data: '))\n \n for (const line of lines) {\n const data = JSON.parse(line.replace('data: ', ''))\n if (data.type === 'complete') {\n onUploadComplete()\n onClose()\n }\n }\n }\n } catch (error) {\n console.error('Import failed:', error)\n } finally {\n setImporting(false)\n }\n }, [urlInput, onUploadComplete, onClose])\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={e => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>Add New</h3>\n <div css={styles.tabs}>\n <button\n css={[styles.tab, activeTab === 'upload' && styles.tabActive]}\n onClick={() => setActiveTab('upload')}\n >\n Upload Files\n </button>\n <button\n css={[styles.tab, activeTab === 'import' && styles.tabActive]}\n onClick={() => setActiveTab('import')}\n >\n Import URLs\n </button>\n </div>\n </div>\n \n <div css={styles.body}>\n {activeTab === 'upload' ? (\n <>\n <div\n css={[styles.dropzone, isDragging && styles.dropzoneActive]}\n onClick={() => fileInputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setIsDragging(true) }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <svg css={styles.dropzoneIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n <p css={styles.dropzoneText}>\n Drop files here or click to browse\n </p>\n <p css={styles.dropzoneHint}>\n Supports images and other media files\n </p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n css={styles.fileInput}\n onChange={(e) => handleFileSelect(e.target.files)}\n />\n {selectedFiles.length > 0 && (\n <div css={styles.selectedFiles}>\n {selectedFiles.length} file{selectedFiles.length !== 1 ? 's' : ''} selected\n </div>\n )}\n </>\n ) : (\n <>\n <p css={styles.textareaLabel}>\n Paste image URLs (one per line)\n </p>\n <textarea\n css={styles.textarea}\n value={urlInput}\n onChange={(e) => setUrlInput(e.target.value)}\n placeholder={`https://cdn.example.com/photos/image1.jpg\\nhttps://cdn.example.com/photos/image2.jpg`}\n />\n </>\n )}\n </div>\n \n <div css={styles.footer}>\n <button\n css={[styles.btn, styles.btnCancel]}\n onClick={onClose}\n >\n Cancel\n </button>\n {activeTab === 'upload' ? (\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? 'Uploading...' : 'Upload'}\n </button>\n ) : (\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleImport}\n disabled={!urlInput.trim() || importing}\n >\n {importing ? 'Importing...' : 'Import'}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useFileList } from '../hooks/useFileList'\nimport { colors, fontSize } from './tokens'\nimport type { FileItem } from '../types'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n `,\n spinner: css`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: ${spin} 0.8s linear infinite;\n `,\n empty: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n color: ${colors.textSecondary};\n `,\n emptyIcon: css`\n width: 48px;\n height: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n `,\n emptyText: css`\n font-size: ${fontSize.base};\n margin: 0 0 4px 0;\n \n &:last-child {\n color: ${colors.textMuted};\n font-size: ${fontSize.sm};\n }\n `,\n scanButton: css`\n margin-top: 16px;\n padding: 10px 24px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.primary};\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n grid: css`\n display: grid;\n grid-template-columns: 1fr;\n gap: 12px;\n \n @media (min-width: 480px) { grid-template-columns: repeat(2, 1fr); }\n @media (min-width: 768px) { grid-template-columns: repeat(3, 1fr); }\n @media (min-width: 1024px) { grid-template-columns: repeat(4, 1fr); }\n @media (min-width: 1280px) { grid-template-columns: repeat(5, 1fr); }\n `,\n item: css`\n position: relative;\n border-radius: 8px;\n border: 1px solid ${colors.border};\n overflow: hidden;\n cursor: pointer;\n transition: all 0.15s ease;\n background-color: ${colors.surface};\n user-select: none;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n \n &:hover {\n border-color: #d0d5dd;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);\n }\n `,\n itemSelected: css`\n border-color: ${colors.primary};\n box-shadow: 0 0 0 1px ${colors.primary};\n \n &:hover {\n border-color: ${colors.primary};\n box-shadow: 0 0 0 1px ${colors.primary};\n }\n `,\n parentItem: css`\n cursor: pointer;\n \n &:hover {\n border-color: ${colors.primary};\n }\n `,\n checkboxWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n z-index: 10;\n padding: 8px;\n cursor: pointer;\n `,\n checkbox: css`\n width: 18px;\n height: 18px;\n accent-color: ${colors.primary};\n cursor: pointer;\n `,\n content: css`\n position: relative;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: ${colors.background};\n `,\n folderIcon: css`\n width: 56px;\n height: 56px;\n color: #f9935e;\n `,\n imagesFolderIcon: css`\n width: 56px;\n height: 56px;\n color: ${colors.imagesFolder};\n `,\n imagesFolderWrapper: css`\n position: relative;\n `,\n lockIcon: css`\n position: absolute;\n bottom: 4px;\n right: 4px;\n width: 16px;\n height: 16px;\n color: ${colors.imagesFolder};\n background: white;\n border-radius: 50%;\n padding: 2px;\n `,\n parentIcon: css`\n width: 56px;\n height: 56px;\n color: ${colors.textMuted};\n `,\n fileIcon: css`\n width: 40px;\n height: 40px;\n color: ${colors.textMuted};\n `,\n image: css`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: 4px;\n `,\n noThumbnail: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 16px;\n background: ${colors.background};\n border: 2px dashed ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 80%;\n height: 60%;\n \n &:hover {\n border-color: ${colors.primary};\n background: ${colors.surfaceHover};\n }\n `,\n noThumbnailIcon: css`\n width: 32px;\n height: 32px;\n color: ${colors.textMuted};\n `,\n noThumbnailText: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n text-align: center;\n `,\n label: css`\n padding: 10px 12px;\n background-color: ${colors.surface};\n border-top: 1px solid ${colors.borderLight};\n `,\n labelRow: css`\n display: flex;\n flex-direction: column;\n gap: 2px;\n `,\n labelText: css`\n flex: 1;\n min-width: 0;\n `,\n copyBtn: css`\n position: absolute;\n top: 4px;\n right: 4px;\n z-index: 10;\n height: 28px;\n width: 28px;\n color: ${colors.textMuted};\n background: transparent;\n border: none;\n padding: 0;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n copyIcon: css`\n width: 18px;\n height: 18px;\n `,\n statusBtn: css`\n position: absolute;\n top: 4px;\n right: 28px;\n z-index: 10;\n height: 28px;\n width: 28px;\n background: transparent;\n border: none;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n cloudIcon: css`\n width: 18px;\n height: 18px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 18px;\n height: 18px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::before {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n openBtn: css`\n position: absolute;\n bottom: 8px;\n right: 8px;\n z-index: 10;\n height: 28px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n }\n `,\n name: css`\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.text};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n letter-spacing: -0.01em;\n direction: rtl;\n text-align: left;\n `,\n size: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n margin: 2px 0 0 0;\n `,\n selectAllRow: css`\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: ${colors.surface};\n border-radius: 8px;\n border: 1px solid ${colors.border};\n `,\n selectAllLabel: css`\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.textSecondary};\n cursor: pointer;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n selectAllCheckbox: css`\n width: 16px;\n height: 16px;\n accent-color: ${colors.primary};\n `,\n}\n\nexport function StudioFileGrid() {\n const {\n loading,\n sortedItems,\n metaEmpty,\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n selectedItems,\n navigateUp,\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n } = useFileList()\n\n if (loading) {\n return (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n )\n }\n\n // Show scan prompt when meta is empty\n if (metaEmpty && isAtRoot) {\n return (\n <div css={styles.empty}>\n <svg css={styles.emptyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <p css={styles.emptyText}>No files tracked yet</p>\n <p css={styles.emptyText}>Click Scan to discover files in your public folder</p>\n <button \n css={styles.scanButton}\n onClick={triggerScan}\n >\n Scan for Files\n </button>\n </div>\n )\n }\n\n if (sortedItems.length === 0 && isAtRoot) {\n return (\n <div css={styles.empty}>\n <svg css={styles.emptyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <p css={styles.emptyText}>No files in this folder</p>\n <p css={styles.emptyText}>Upload images or click Scan in the toolbar</p>\n </div>\n )\n }\n\n return (\n <div>\n {sortedItems.length > 0 && (\n <div css={styles.selectAllRow}>\n <label css={styles.selectAllLabel}>\n <input\n type=\"checkbox\"\n css={styles.selectAllCheckbox}\n checked={allItemsSelected}\n ref={(el) => {\n if (el) el.indeterminate = someItemsSelected && !allItemsSelected\n }}\n onChange={handleSelectAll}\n />\n Select all ({sortedItems.length})\n </label>\n </div>\n )}\n <div css={styles.grid}>\n {/* Parent folder navigation - hide when searching */}\n {!isAtRoot && !isSearching && (\n <div \n css={[styles.item, styles.parentItem]}\n onClick={navigateUp}\n >\n <div css={styles.content}>\n <svg css={styles.parentIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6\" />\n </svg>\n </div>\n <div css={styles.label}>\n <p css={styles.name}>..</p>\n <p css={styles.size}>Parent folder</p>\n </div>\n </div>\n )}\n \n {sortedItems.map((item) => (\n <GridItem\n key={item.path}\n item={item}\n isSelected={selectedItems.has(item.path)}\n onClick={(e) => handleItemClick(item, e)}\n onOpen={() => handleOpen(item)}\n onGenerateThumbnail={() => handleGenerateThumbnail(item)}\n />\n ))}\n </div>\n </div>\n )\n}\n\ninterface GridItemProps {\n item: FileItem\n isSelected: boolean\n onClick: (e: React.MouseEvent) => void\n onOpen: () => void\n onGenerateThumbnail: () => void\n}\n\nfunction GridItem({ item, isSelected, onClick, onOpen, onGenerateThumbnail }: GridItemProps) {\n const [showCopied, setShowCopied] = useState(false)\n const isFolder = item.type === 'folder'\n const isImage = !isFolder && item.thumbnail !== undefined\n const isProtected = item.isProtected || (isFolder && item.name === 'images' && item.path === 'public/images')\n\n const handleCopyPath = (e: React.MouseEvent) => {\n e.stopPropagation()\n const pathToCopy = '/' + item.path.replace(/^public\\//, '')\n navigator.clipboard.writeText(pathToCopy)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleClick = (e: React.MouseEvent) => {\n // Protected items cannot be selected, only opened\n if (isProtected) {\n e.stopPropagation()\n onOpen()\n return\n }\n onClick(e)\n }\n\n return (\n <div \n css={[styles.item, isSelected && !isProtected && styles.itemSelected]} \n onClick={handleClick}\n >\n {!isProtected && (\n <div\n css={styles.checkboxWrapper}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={isSelected}\n onChange={() => onClick({} as React.MouseEvent)}\n />\n </div>\n )}\n\n\n <div css={styles.content}>\n {/* Cloud status icon - to the left of copy button */}\n {item.cdnPushed && !item.isRemote && (\n <span css={styles.statusBtn} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {item.isRemote && (\n <span css={styles.statusBtn} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n\n {/* Copy button - top right of image box */}\n <button\n css={styles.copyBtn}\n onClick={handleCopyPath}\n title=\"Copy file path\"\n >\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n\n {/* Open button - bottom right of image box */}\n <button\n css={styles.openBtn}\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n >\n Open\n </button>\n\n {isFolder ? (\n isProtected ? (\n <div css={styles.imagesFolderWrapper}>\n <svg css={styles.imagesFolderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <svg css={styles.lockIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n ) : (\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n )\n ) : isImage && item.thumbnail ? (\n <img\n css={styles.image}\n src={item.thumbnail}\n alt={item.name}\n loading=\"lazy\"\n />\n ) : (\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )}\n </div>\n\n <div css={styles.label}>\n <div css={styles.labelRow}>\n <div css={styles.labelText}>\n <p css={styles.name} title={item.name}>{item.name}</p>\n {isFolder ? (\n <p css={styles.size}>\n {item.fileCount !== undefined ? `${item.fileCount} files` : ''}\n {item.fileCount !== undefined && item.totalSize !== undefined ? ' · ' : ''}\n {item.totalSize !== undefined ? formatFileSize(item.totalSize) : ''}\n </p>\n ) : (\n item.size !== undefined && <p css={styles.size}>{formatFileSize(item.size)}</p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction getParentPath(path: string): string {\n const parts = path.split('/')\n parts.pop() // Remove current folder\n return parts.join('/') + '/'\n}\n\n","import { useEffect, useState, useRef, useCallback } from 'react'\nimport { useStudio } from '../components/StudioContext'\nimport { studioApi } from '../lib/api'\nimport type { FileItem } from '../types'\n\n/**\n * Shared hook for file list logic used by both Grid and List views\n * Handles loading, sorting, selection, and navigation\n */\nexport function useFileList() {\n const {\n currentPath,\n setCurrentPath,\n navigateUp,\n selectedItems,\n toggleSelection,\n selectRange,\n lastSelectedPath,\n selectAll,\n clearSelection,\n refreshKey,\n setFocusedItem,\n triggerRefresh,\n triggerScan,\n searchQuery,\n showError,\n setFileItems,\n } = useStudio()\n\n const [items, setItems] = useState<FileItem[]>([])\n const [loading, setLoading] = useState(true)\n const [metaEmpty, setMetaEmpty] = useState(false)\n const isInitialLoad = useRef(true)\n const lastPath = useRef(currentPath)\n\n // Load items when path, refresh, or search changes\n useEffect(() => {\n async function loadItems() {\n const isPathChange = lastPath.current !== currentPath\n if (isInitialLoad.current || isPathChange) {\n setLoading(true)\n }\n lastPath.current = currentPath\n\n try {\n const data = searchQuery && searchQuery.length >= 2\n ? await studioApi.search(searchQuery)\n : await studioApi.list(currentPath)\n const loadedItems = data.items || []\n setItems(loadedItems)\n setFileItems(loadedItems)\n setMetaEmpty(data.isEmpty === true)\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load items'\n showError('Load Error', message)\n setItems([])\n setFileItems([])\n setMetaEmpty(false)\n }\n\n setLoading(false)\n isInitialLoad.current = false\n }\n\n loadItems()\n }, [currentPath, refreshKey, searchQuery, showError, setFileItems])\n\n // Computed values\n const isAtRoot = currentPath === 'public'\n const isSearching = searchQuery && searchQuery.length >= 2\n\n // Sort items: folders first, then alphabetically\n const sortedItems = [...items].sort((a, b) => {\n if (a.type === 'folder' && b.type !== 'folder') return -1\n if (a.type !== 'folder' && b.type === 'folder') return 1\n return a.name.localeCompare(b.name)\n })\n\n const allItemsSelected = sortedItems.length > 0 && sortedItems.every(item => selectedItems.has(item.path))\n const someItemsSelected = sortedItems.some(item => selectedItems.has(item.path))\n\n // Handlers\n const handleItemClick = useCallback((item: FileItem, e: React.MouseEvent) => {\n if (e.shiftKey && lastSelectedPath) {\n selectRange(lastSelectedPath, item.path, sortedItems)\n } else {\n toggleSelection(item.path)\n }\n }, [lastSelectedPath, selectRange, sortedItems, toggleSelection])\n\n const handleOpen = useCallback((item: FileItem) => {\n if (item.type === 'folder') {\n setCurrentPath(item.path)\n } else {\n setFocusedItem(item)\n }\n }, [setCurrentPath, setFocusedItem])\n\n const handleGenerateThumbnail = useCallback(async (item: FileItem) => {\n try {\n const imageKey = '/' + item.path.replace(/^public\\//, '')\n await studioApi.reprocess([imageKey])\n triggerRefresh()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to generate thumbnail'\n showError('Processing Error', message)\n }\n }, [triggerRefresh, showError])\n\n const handleSelectAll = useCallback(() => {\n if (allItemsSelected) {\n clearSelection()\n } else {\n selectAll(sortedItems)\n }\n }, [allItemsSelected, clearSelection, selectAll, sortedItems])\n\n return {\n // State\n items,\n loading,\n sortedItems,\n metaEmpty,\n\n // Computed\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n\n // Context values\n currentPath,\n selectedItems,\n navigateUp,\n\n // Handlers\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n }\n}\n","/**\n * Typed API client for Studio\n * Provides type-safe methods for all Studio API endpoints\n */\n\nimport type { FileItem, LeanMeta, LeanImageEntry } from '../types'\n\n// Response types\ninterface ListResponse {\n items: FileItem[]\n isEmpty?: boolean\n}\n\ninterface FoldersResponse {\n folders: { path: string; name: string; depth: number }[]\n}\n\ninterface CountImagesResponse {\n count: number\n images: string[]\n}\n\ninterface UploadResponse {\n success: boolean\n imageKey?: string\n entry?: LeanImageEntry\n path?: string\n message?: string\n error?: string\n}\n\ninterface DeleteResponse {\n success: boolean\n deleted: string[]\n errors?: string[]\n}\n\ninterface PushResponse {\n success: boolean\n pushed: string[]\n errors?: string[]\n}\n\ninterface ReprocessResponse {\n success: boolean\n processed: string[]\n errors?: string[]\n}\n\ninterface CreateFolderResponse {\n success: boolean\n path: string\n error?: string\n}\n\ninterface RenameResponse {\n success: boolean\n newPath: string\n error?: string\n}\n\ninterface MoveResponse {\n success: boolean\n moved: string[]\n errors?: string[]\n}\n\nclass StudioApiClient {\n private async get<T>(url: string): Promise<T> {\n const response = await fetch(url)\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Request failed: ${response.status}`)\n }\n return response.json()\n }\n\n private async post<T>(url: string, body?: object): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Request failed: ${response.status}`)\n }\n return response.json()\n }\n\n // List handlers\n async list(path: string = 'public'): Promise<ListResponse> {\n return this.get(`/api/studio/list?path=${encodeURIComponent(path)}`)\n }\n\n async search(query: string): Promise<ListResponse> {\n return this.get(`/api/studio/search?q=${encodeURIComponent(query)}`)\n }\n\n async listFolders(): Promise<FoldersResponse> {\n return this.get('/api/studio/list-folders')\n }\n\n async countImages(): Promise<CountImagesResponse> {\n return this.get('/api/studio/count-images')\n }\n\n async folderImages(folders: string[]): Promise<CountImagesResponse> {\n return this.get(`/api/studio/folder-images?folders=${encodeURIComponent(folders.join(','))}`)\n }\n\n // File handlers\n async upload(file: File, targetPath: string = 'public'): Promise<UploadResponse> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', targetPath)\n\n const response = await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Upload failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async delete(paths: string[]): Promise<DeleteResponse> {\n return this.post('/api/studio/delete', { paths })\n }\n\n async createFolder(parentPath: string, name: string): Promise<CreateFolderResponse> {\n return this.post('/api/studio/create-folder', { parentPath, name })\n }\n\n async rename(oldPath: string, newName: string): Promise<RenameResponse> {\n return this.post('/api/studio/rename', { oldPath, newName })\n }\n\n async move(paths: string[], destination: string): Promise<MoveResponse> {\n return this.post('/api/studio/move', { paths, destination })\n }\n\n // Image handlers\n async push(imageKeys: string[]): Promise<PushResponse> {\n return this.post('/api/studio/sync', { imageKeys })\n }\n\n async reprocess(imageKeys: string[]): Promise<ReprocessResponse> {\n return this.post('/api/studio/reprocess', { imageKeys })\n }\n\n // Process all returns a stream, handle separately\n processAllStream(): EventSource {\n return new EventSource('/api/studio/process-all')\n }\n}\n\nexport const studioApi = new StudioApiClient()\n\n// Export types for consumers\nexport type {\n ListResponse,\n FoldersResponse,\n CountImagesResponse,\n UploadResponse,\n DeleteResponse,\n PushResponse,\n ReprocessResponse,\n CreateFolderResponse,\n RenameResponse,\n MoveResponse,\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useFileList } from '../hooks/useFileList'\nimport { colors, fontSize } from './tokens'\nimport type { FileItem } from '../types'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n `,\n spinner: css`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: ${spin} 0.8s linear infinite;\n `,\n empty: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n color: ${colors.textSecondary};\n `,\n emptyHint: css`\n font-size: ${fontSize.sm};\n color: ${colors.textMuted};\n margin-top: 4px;\n `,\n scanButton: css`\n margin-top: 16px;\n padding: 10px 24px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.primary};\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n tableWrapper: css`\n background: ${colors.surface};\n border-radius: 8px;\n border: 1px solid ${colors.border};\n overflow-x: auto;\n `,\n table: css`\n width: 100%;\n min-width: 600px;\n border-collapse: collapse;\n white-space: nowrap;\n `,\n th: css`\n text-align: left;\n font-size: 11px;\n color: ${colors.textMuted};\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 12px 16px;\n font-weight: 600;\n background: ${colors.background};\n border-bottom: 1px solid ${colors.border};\n `,\n thCheckbox: css`\n width: 48px;\n `,\n thSize: css`\n width: 96px;\n `,\n thDimensions: css`\n width: 128px;\n `,\n thCdn: css`\n width: 96px;\n `,\n tbody: css``,\n row: css`\n cursor: pointer;\n transition: background-color 0.15s ease;\n user-select: none;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n \n &:not(:last-child) td {\n border-bottom: 1px solid ${colors.borderLight};\n }\n `,\n rowSelected: css`\n background-color: ${colors.primaryLight};\n \n &:hover {\n background-color: ${colors.primaryLight};\n }\n `,\n parentRow: css`\n cursor: pointer;\n border-bottom: 1px solid ${colors.border};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n `,\n td: css`\n padding: 12px 16px;\n `,\n checkboxCell: css`\n padding: 12px 16px;\n cursor: pointer;\n vertical-align: middle;\n `,\n checkbox: css`\n width: 18px;\n height: 18px;\n accent-color: ${colors.primary};\n cursor: pointer;\n display: block;\n `,\n actionsCell: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-left: auto;\n flex-shrink: 0;\n `,\n copyBtn: css`\n position: relative;\n flex-shrink: 0;\n height: 32px;\n width: 32px;\n font-size: ${fontSize.xs};\n color: ${colors.textSecondary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n color: ${colors.text};\n }\n `,\n copyIcon: css`\n width: 16px;\n height: 16px;\n `,\n statusBtn: css`\n flex-shrink: 0;\n height: 32px;\n width: 32px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n `,\n cloudIcon: css`\n width: 16px;\n height: 16px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 16px;\n height: 16px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n nameCell: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n `,\n thumbnailWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n folderIconWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n folderIcon: css`\n width: 24px;\n height: 24px;\n color: #f9935e;\n `,\n imagesFolderWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n position: relative;\n align-items: center;\n `,\n imagesFolderIcon: css`\n width: 24px;\n height: 24px;\n color: ${colors.imagesFolder};\n `,\n lockIcon: css`\n width: 10px;\n height: 10px;\n color: ${colors.imagesFolder};\n margin-left: -6px;\n margin-top: 8px;\n `,\n parentIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textMuted};\n flex-shrink: 0;\n `,\n fileIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textMuted};\n flex-shrink: 0;\n `,\n thumbnail: css`\n max-width: 100%;\n max-height: 100%;\n width: auto;\n height: auto;\n object-fit: contain;\n border-radius: 4px;\n border: 1px solid ${colors.borderLight};\n `,\n noThumbnail: css`\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.background};\n border: 1px dashed ${colors.border};\n border-radius: 4px;\n flex-shrink: 0;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n border-color: ${colors.primary};\n background: ${colors.surfaceHover};\n }\n `,\n noThumbnailIcon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textMuted};\n `,\n name: css`\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n letter-spacing: -0.01em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 300px;\n `,\n meta: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n `,\n cdnBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: ${colors.success};\n `,\n cdnBadgeRemote: css`\n display: inline-flex;\n align-items: center;\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: #ef4444;\n `,\n cdnIcon: css`\n width: 12px;\n height: 12px;\n `,\n cdnEmpty: css`\n font-size: ${fontSize.sm};\n color: ${colors.textMuted};\n `,\n openBtn: css`\n height: 32px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0 14px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n \n &:hover {\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n }\n `,\n}\n\nexport function StudioFileList() {\n const {\n loading,\n sortedItems,\n metaEmpty,\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n selectedItems,\n navigateUp,\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n } = useFileList()\n\n if (loading) {\n return (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n )\n }\n\n if (metaEmpty && isAtRoot) {\n return (\n <div css={styles.empty}>\n <p>No files tracked yet</p>\n <p css={styles.emptyHint}>Click Scan to discover files in your public folder</p>\n <button \n css={styles.scanButton}\n onClick={triggerScan}\n >\n Scan for Files\n </button>\n </div>\n )\n }\n\n if (sortedItems.length === 0 && isAtRoot) {\n return (\n <div css={styles.empty}>\n <p>No files in this folder</p>\n <p css={styles.emptyHint}>Upload images or click Scan in the toolbar</p>\n </div>\n )\n }\n\n return (\n <div css={styles.tableWrapper}>\n <table css={styles.table}>\n <thead>\n <tr>\n <th css={[styles.th, styles.thCheckbox]}>\n {sortedItems.length > 0 && (\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={allItemsSelected}\n ref={(el) => {\n if (el) el.indeterminate = someItemsSelected && !allItemsSelected\n }}\n onChange={handleSelectAll}\n />\n )}\n </th>\n <th css={styles.th}>Name</th>\n <th css={[styles.th, styles.thSize]}>Size</th>\n <th css={[styles.th, styles.thDimensions]}>Dimensions</th>\n <th css={[styles.th, styles.thCdn]}>CDN</th>\n </tr>\n </thead>\n <tbody css={styles.tbody}>\n {/* Parent folder navigation - hide when searching */}\n {!isAtRoot && !isSearching && (\n <tr css={styles.parentRow} onClick={navigateUp}>\n <td css={styles.td}></td>\n <td css={styles.td}>\n <div css={styles.nameCell}>\n <svg css={styles.parentIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6\" />\n </svg>\n <span css={styles.name}>..</span>\n </div>\n </td>\n <td css={[styles.td, styles.meta]}>--</td>\n <td css={[styles.td, styles.meta]}>Parent folder</td>\n <td css={styles.td}>--</td>\n </tr>\n )}\n \n {sortedItems.map((item) => (\n <ListRow\n key={item.path}\n item={item}\n isSelected={selectedItems.has(item.path)}\n onClick={(e) => handleItemClick(item, e)}\n onOpen={() => handleOpen(item)}\n onGenerateThumbnail={() => handleGenerateThumbnail(item)}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\ninterface ListRowProps {\n item: FileItem\n isSelected: boolean\n onClick: (e: React.MouseEvent) => void\n onOpen: () => void\n onGenerateThumbnail: () => void\n}\n\nfunction ListRow({ item, isSelected, onClick, onOpen, onGenerateThumbnail }: ListRowProps) {\n const [showCopied, setShowCopied] = useState(false)\n const isFolder = item.type === 'folder'\n const isImage = !isFolder && item.thumbnail !== undefined\n const isProtected = item.isProtected || (isFolder && item.name === 'images' && item.path === 'public/images')\n\n const handleCopyPath = (e: React.MouseEvent) => {\n e.stopPropagation()\n const pathToCopy = '/' + item.path.replace(/^public\\//, '')\n navigator.clipboard.writeText(pathToCopy)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleClick = (e: React.MouseEvent) => {\n // Protected items cannot be selected, only opened\n if (isProtected) {\n e.stopPropagation()\n onOpen()\n return\n }\n onClick(e)\n }\n\n return (\n <tr \n css={[styles.row, isSelected && !isProtected && styles.rowSelected]} \n onClick={handleClick}\n >\n <td\n css={[styles.td, styles.checkboxCell]}\n onClick={(e) => e.stopPropagation()}\n >\n {!isProtected && (\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={isSelected}\n onChange={() => onClick({} as React.MouseEvent)}\n />\n )}\n </td>\n <td css={styles.td}>\n <div css={styles.nameCell}>\n {isFolder ? (\n isProtected ? (\n <div css={styles.imagesFolderWrapper}>\n <svg css={styles.imagesFolderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <svg css={styles.lockIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n ) : (\n <div css={styles.folderIconWrapper}>\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n </div>\n )\n ) : isImage && item.thumbnail ? (\n <div css={styles.thumbnailWrapper}>\n <img css={styles.thumbnail} src={item.thumbnail} alt={item.name} loading=\"lazy\" />\n </div>\n ) : (\n <div css={styles.thumbnailWrapper}>\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n </div>\n )}\n <span css={styles.name} title={item.name}>{truncateMiddle(item.name)}</span>\n <div css={styles.actionsCell}>\n {/* Cloud status icon */}\n {item.cdnPushed && !item.isRemote && (\n <span css={styles.statusBtn} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {item.isRemote && (\n <span css={styles.statusBtn} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n <button\n css={styles.copyBtn}\n onClick={handleCopyPath}\n title=\"Copy file path\"\n >\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <button\n css={styles.openBtn}\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n >\n Open\n </button>\n </div>\n </div>\n </td>\n <td css={[styles.td, styles.meta]}>\n {isFolder \n ? (item.fileCount !== undefined ? `${item.fileCount} files` : '--')\n : (item.size !== undefined ? formatFileSize(item.size) : '--')\n }\n </td>\n <td css={[styles.td, styles.meta]}>\n {isFolder \n ? (item.totalSize !== undefined ? formatFileSize(item.totalSize) : '--')\n : (item.dimensions ? `${item.dimensions.width}x${item.dimensions.height}` : '--')\n }\n </td>\n <td css={styles.td}>\n {item.cdnPushed ? (\n item.isRemote ? (\n <span css={styles.cdnBadgeRemote}>Remote</span>\n ) : (\n <span css={styles.cdnBadge}>\n <svg css={styles.cdnIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n Pushed\n </span>\n )\n ) : (\n <span css={styles.cdnEmpty}>--</span>\n )}\n </td>\n </tr>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction getParentPath(path: string): string {\n const parts = path.split('/')\n parts.pop() // Remove current folder\n return parts.join('/') + '/'\n}\n\nfunction truncateMiddle(str: string, maxLength: number = 32): string {\n if (str.length <= maxLength) return str\n \n // Find the extension\n const lastDot = str.lastIndexOf('.')\n const ext = lastDot > 0 ? str.substring(lastDot) : ''\n const name = lastDot > 0 ? str.substring(0, lastDot) : str\n \n // Calculate how much we can show of the name\n const availableLength = maxLength - ext.length - 3 // 3 for \"...\"\n if (availableLength < 6) {\n // Too short, just truncate from end\n return str.substring(0, maxLength - 3) + '...'\n }\n \n const startLength = Math.ceil(availableLength / 2)\n const endLength = Math.floor(availableLength / 2)\n \n return name.substring(0, startLength) + '...' + name.substring(name.length - endLength) + ext\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { ConfirmModal, AlertModal, InputModal, ProgressModal, type ProgressState } from './StudioModal'\nimport { R2SetupModal } from './R2SetupModal'\nimport { StudioFolderPicker } from './StudioFolderPicker'\nimport { colors, fontSize } from './tokens'\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.ico', '.bmp', '.tiff', '.tif']\nconst VIDEO_EXTENSIONS = ['.mp4', '.webm', '.mov', '.avi', '.mkv', '.m4v']\n\nfunction isImageFile(filename: string): boolean {\n const ext = filename.toLowerCase().substring(filename.lastIndexOf('.'))\n return IMAGE_EXTENSIONS.includes(ext)\n}\n\nfunction isVideoFile(filename: string): boolean {\n const ext = filename.toLowerCase().substring(filename.lastIndexOf('.'))\n return VIDEO_EXTENSIONS.includes(ext)\n}\n\nconst styles = {\n overlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 100;\n display: flex;\n background: transparent;\n `,\n container: css`\n display: flex;\n flex: 1;\n margin: 24px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);\n `,\n main: css`\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: ${colors.background};\n overflow: auto;\n `,\n headerButtons: css`\n position: absolute;\n top: 16px;\n right: 16px;\n display: flex;\n gap: 8px;\n z-index: 10;\n `,\n copyBtn: css`\n position: relative;\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n copyIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textSecondary};\n `,\n statusIcon: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n `,\n cloudIcon: css`\n width: 20px;\n height: 20px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 20px;\n height: 20px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n right: 100%;\n top: 50%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 8px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n mainCloseBtn: css`\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n mainCloseIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textSecondary};\n `,\n mediaWrapper: css`\n max-width: 100%;\n max-height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n image: css`\n max-width: 100%;\n max-height: calc(100vh - 200px);\n object-fit: contain;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n `,\n video: css`\n max-width: 100%;\n max-height: calc(100vh - 200px);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n `,\n filePlaceholder: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n background: ${colors.surface};\n border-radius: 12px;\n border: 1px solid ${colors.border};\n `,\n fileIcon: css`\n width: 80px;\n height: 80px;\n color: ${colors.textMuted};\n margin-bottom: 16px;\n `,\n fileName: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n sidebar: css`\n width: 280px;\n background: ${colors.surface};\n border-left: 1px solid ${colors.border};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n `,\n sidebarHeader: css`\n padding: 16px 20px;\n border-bottom: 1px solid ${colors.border};\n `,\n sidebarTitle: css`\n font-size: ${fontSize.base};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n sidebarContent: css`\n flex: 1;\n padding: 20px;\n overflow: auto;\n `,\n info: css`\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 24px;\n `,\n infoRow: css`\n display: flex;\n justify-content: space-between;\n font-size: ${fontSize.sm};\n `,\n infoLabel: css`\n color: ${colors.textSecondary};\n `,\n infoValue: css`\n color: ${colors.text};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n infoValueWrap: css`\n color: ${colors.text};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n word-break: break-all;\n white-space: normal;\n `,\n infoLink: css`\n color: ${colors.primary};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n word-break: break-all;\n white-space: normal;\n text-decoration: none;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n actions: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `,\n actionBtn: css`\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 12px 14px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: ${colors.text};\n text-align: left;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n actionBtnDanger: css`\n color: ${colors.danger};\n \n &:hover {\n background-color: ${colors.dangerLight};\n border-color: ${colors.danger};\n }\n `,\n actionIcon: css`\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n `,\n}\n\nexport function StudioDetailView() {\n const { focusedItem, setFocusedItem, triggerRefresh, clearSelection } = useStudio()\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)\n const [showRenameModal, setShowRenameModal] = useState(false)\n const [showMoveModal, setShowMoveModal] = useState(false)\n const [showProcessConfirm, setShowProcessConfirm] = useState(false)\n const [showR2SetupModal, setShowR2SetupModal] = useState(false)\n const [processProgress, setProcessProgress] = useState<ProgressState | null>(null)\n const [alertMessage, setAlertMessage] = useState<{ title: string; message: string } | null>(null)\n const [showCopied, setShowCopied] = useState(false)\n const [pushing, setPushing] = useState(false)\n const [moving, setMoving] = useState(false)\n\n if (!focusedItem) return null\n\n const isImage = isImageFile(focusedItem.name)\n const isVideo = isVideoFile(focusedItem.name)\n const relativePath = '/' + focusedItem.path.replace(/^public\\//, '')\n \n // For preview: use CDN URL if pushed, otherwise use local path\n const imageSrc = focusedItem.cdnPushed && focusedItem.cdnBaseUrl\n ? `${focusedItem.cdnBaseUrl}${relativePath}`\n : relativePath\n \n // For display URL: use CDN URL if pushed, otherwise use current origin\n const localOrigin = typeof window !== 'undefined' ? window.location.origin : ''\n const fullUrl = focusedItem.cdnPushed && focusedItem.cdnBaseUrl \n ? `${focusedItem.cdnBaseUrl}${relativePath}`\n : `${localOrigin}${relativePath}`\n\n const handleClose = () => {\n setFocusedItem(null)\n }\n\n const handleCopyPath = () => {\n navigator.clipboard.writeText(fullUrl)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleRename = async (newName: string) => {\n setShowRenameModal(false)\n if (newName && newName !== focusedItem.name) {\n try {\n const response = await fetch('/api/studio/rename', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n oldPath: focusedItem.path,\n newName: newName,\n }),\n })\n \n if (response.ok) {\n triggerRefresh()\n setFocusedItem(null)\n } else {\n const data = await response.json()\n setAlertMessage({\n title: 'Rename Failed',\n message: data.error || 'Failed to rename file',\n })\n }\n } catch (error) {\n console.error('Rename error:', error)\n setAlertMessage({\n title: 'Rename Failed',\n message: 'An error occurred while renaming the file',\n })\n }\n }\n }\n\n const handleDelete = async () => {\n setShowDeleteConfirm(false)\n try {\n const response = await fetch('/api/studio/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: [focusedItem.path] }),\n })\n\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n setFocusedItem(null)\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Delete Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Delete error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Delete failed. Check console for details.',\n })\n }\n }\n\n const handleMove = async (destination: string) => {\n setShowMoveModal(false)\n setMoving(true)\n \n try {\n const response = await fetch('/api/studio/move', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: [focusedItem.path], destination }),\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n try {\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'complete') {\n if (data.errors > 0 && data.errorMessages?.length > 0) {\n setAlertMessage({\n title: 'Move Failed',\n message: data.errorMessages.join('\\n'),\n })\n } else {\n clearSelection()\n triggerRefresh()\n setFocusedItem(null)\n }\n } else if (data.type === 'error') {\n setAlertMessage({\n title: 'Move Failed',\n message: data.message || 'Unknown error',\n })\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (error) {\n console.error('Move error:', error)\n setAlertMessage({\n title: 'Move Failed',\n message: 'Failed to move file. Check console for details.',\n })\n } finally {\n setMoving(false)\n }\n }\n\n const handleSync = async () => {\n const imageKey = '/' + focusedItem.path.replace(/^public\\//, '')\n \n setPushing(true)\n \n try {\n const response = await fetch('/api/studio/sync', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: [imageKey] }),\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setAlertMessage({\n title: 'Push Complete',\n message: 'Successfully pushed to CDN.',\n })\n triggerRefresh()\n } else {\n // Check if it's an R2 configuration error\n if (data.error?.includes('R2 not configured') || data.error?.includes('CLOUDFLARE_R2')) {\n setShowR2SetupModal(true)\n } else {\n setAlertMessage({\n title: 'Push Failed',\n message: data.error || 'Failed to push to CDN.',\n })\n }\n }\n } catch (error) {\n console.error('Push error:', error)\n setAlertMessage({\n title: 'Push Failed',\n message: 'Failed to push to CDN. Check console for details.',\n })\n } finally {\n setPushing(false)\n }\n }\n\n const handleProcessImage = async () => {\n setShowProcessConfirm(false)\n \n setProcessProgress({\n current: 0,\n total: 1,\n percent: 0,\n status: 'processing',\n currentFile: focusedItem.name,\n })\n\n try {\n const response = await fetch('/api/studio/reprocess', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n paths: [focusedItem.path],\n }),\n })\n\n if (!response.ok) {\n throw new Error('Processing failed')\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('No response body')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6))\n setProcessProgress(data)\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n triggerRefresh()\n } catch (error) {\n console.error('Process error:', error)\n setProcessProgress({\n current: 0,\n total: 1,\n percent: 0,\n status: 'error',\n message: 'Failed to process image',\n })\n }\n }\n\n const renderMedia = () => {\n if (isImage) {\n return <img css={styles.image} src={imageSrc} alt={focusedItem.name} />\n }\n if (isVideo) {\n return <video css={styles.video} src={imageSrc} controls />\n }\n return (\n <div css={styles.filePlaceholder}>\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n <p css={styles.fileName}>{focusedItem.name}</p>\n </div>\n )\n }\n\n return (\n <>\n {showDeleteConfirm && (\n <ConfirmModal\n title=\"Delete File\"\n message={`Are you sure you want to delete \"${focusedItem.name}\"? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n variant=\"danger\"\n onConfirm={handleDelete}\n onCancel={() => setShowDeleteConfirm(false)}\n />\n )}\n\n {alertMessage && (\n <AlertModal\n title={alertMessage.title}\n message={alertMessage.message}\n onClose={() => setAlertMessage(null)}\n />\n )}\n\n <R2SetupModal\n isOpen={showR2SetupModal}\n onClose={() => setShowR2SetupModal(false)}\n />\n\n {showRenameModal && (\n <InputModal\n title=\"Rename File\"\n message=\"Enter a new name for the file:\"\n defaultValue={focusedItem.name}\n placeholder=\"Enter new filename\"\n confirmLabel=\"Rename\"\n onConfirm={handleRename}\n onCancel={() => setShowRenameModal(false)}\n />\n )}\n\n {showMoveModal && (\n <StudioFolderPicker\n selectedItems={new Set([focusedItem.path])}\n currentPath={focusedItem.path.split('/').slice(0, -1).join('/')}\n onMove={handleMove}\n onCancel={() => setShowMoveModal(false)}\n />\n )}\n\n {showProcessConfirm && (\n <ConfirmModal\n title=\"Process Image\"\n message={`Generate thumbnails for \"${focusedItem.name}\"?`}\n confirmLabel=\"Process\"\n onConfirm={handleProcessImage}\n onCancel={() => setShowProcessConfirm(false)}\n />\n )}\n\n {processProgress && (\n <ProgressModal\n title=\"Processing Image\"\n progress={processProgress}\n onClose={() => setProcessProgress(null)}\n />\n )}\n\n <div css={styles.overlay} onClick={handleClose}>\n <div css={styles.container} onClick={(e) => e.stopPropagation()}>\n <div css={styles.main}>\n <div css={styles.headerButtons}>\n {/* Cloud status icons */}\n {focusedItem.cdnPushed && !focusedItem.isRemote && (\n <span css={styles.statusIcon} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {focusedItem.isRemote && (\n <span css={styles.statusIcon} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n <button css={styles.copyBtn} onClick={handleCopyPath} title=\"Copy file path\">\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <button css={styles.mainCloseBtn} onClick={handleClose} aria-label=\"Close\">\n <svg css={styles.mainCloseIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div css={styles.mediaWrapper}>\n {renderMedia()}\n </div>\n </div>\n\n <div css={styles.sidebar}>\n <div css={styles.sidebarHeader}>\n <h3 css={styles.sidebarTitle}>Details</h3>\n </div>\n\n <div css={styles.sidebarContent}>\n <div css={styles.info}>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Name</span>\n <span css={styles.infoValueWrap}>{focusedItem.name}</span>\n </div>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Path</span>\n <span css={styles.infoValueWrap}>{focusedItem.path.replace(/^public\\//, '')}</span>\n </div>\n {focusedItem.size !== undefined && (\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Size</span>\n <span css={styles.infoValue}>{formatFileSize(focusedItem.size)}</span>\n </div>\n )}\n {focusedItem.dimensions && (\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Dimensions</span>\n <span css={styles.infoValue}>{focusedItem.dimensions.width} × {focusedItem.dimensions.height}</span>\n </div>\n )}\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>CDN Status</span>\n <span css={styles.infoValue}>\n {focusedItem.cdnPushed \n ? (focusedItem.isRemote ? 'Remote' : 'Pushed')\n : 'Local'}\n </span>\n </div>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>URL</span>\n <a \n href={fullUrl} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n css={styles.infoLink}\n title={fullUrl}\n >\n {fullUrl}\n </a>\n </div>\n </div>\n\n <div css={styles.actions}>\n <button css={styles.actionBtn} onClick={() => setShowRenameModal(true)}>\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n Rename\n </button>\n <button \n css={styles.actionBtn} \n onClick={() => setShowMoveModal(true)}\n disabled={moving}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n {moving ? 'Moving...' : 'Move'}\n </button>\n <button \n css={styles.actionBtn} \n onClick={handleSync} \n disabled={pushing || (focusedItem.cdnPushed && !focusedItem.isRemote)}\n title={focusedItem.cdnPushed && !focusedItem.isRemote ? 'Already in R2' : undefined}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n {pushing ? 'Pushing...' : 'Push to CDN'}\n </button>\n <button \n css={styles.actionBtn} \n onClick={() => setShowProcessConfirm(true)}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n Process Image\n </button>\n <button css={[styles.actionBtn, styles.actionBtnDanger]} onClick={() => setShowDeleteConfirm(true)}>\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { css } from '@emotion/react'\nimport { colors, fontSize, baseReset } from './tokens'\nimport { useStudio } from './StudioContext'\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst styles = {\n btn: css`\n height: ${btnHeight};\n padding: 0 12px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n icon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textSecondary};\n `,\n overlay: css`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n `,\n panel: css`\n ${baseReset}\n position: relative;\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n width: 100%;\n max-width: 512px;\n padding: 24px;\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n `,\n title: css`\n font-size: ${fontSize.xl};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n closeBtn: css`\n padding: 6px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n sections: css`\n display: flex;\n flex-direction: column;\n gap: 24px;\n `,\n sectionTitle: css`\n font-size: ${fontSize.base};\n font-weight: 600;\n color: ${colors.text};\n margin: 0 0 12px 0;\n `,\n description: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0 0 12px 0;\n `,\n codeWrapper: css`\n position: relative;\n `,\n code: css`\n background-color: ${colors.background};\n border-radius: 8px;\n padding: 12px;\n padding-right: 40px;\n font-family: 'SF Mono', Monaco, Consolas, monospace;\n font-size: ${fontSize.xs};\n color: ${colors.textSecondary};\n border: 1px solid ${colors.border};\n overflow-x: auto;\n white-space: nowrap;\n `,\n copyBtn: css`\n position: absolute;\n top: 8px;\n right: 8px;\n padding: 4px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n tooltip: css`\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-bottom: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: #1a1f36;\n }\n `,\n copyIcon: css`\n width: 14px;\n height: 14px;\n color: ${colors.textSecondary};\n `,\n codeLine: css`\n margin: 0 0 4px 0;\n \n &:last-child {\n margin: 0;\n }\n `,\n input: css`\n width: 100%;\n padding: 10px 14px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.base};\n color: ${colors.text};\n background: ${colors.surface};\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n grid: css`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n `,\n label: css`\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: ${colors.textSecondary};\n display: block;\n margin-bottom: 6px;\n `,\n footer: css`\n margin-top: 24px;\n padding-top: 20px;\n border-top: 1px solid ${colors.border};\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n `,\n cancelBtn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n saveBtn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: white;\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n cdnList: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `,\n cdnRow: css`\n display: flex;\n gap: 8px;\n align-items: center;\n `,\n cdnInput: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.sm};\n color: ${colors.text};\n background: ${colors.surface};\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n `,\n cdnIndex: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n `,\n cdnDeleteBtn: css`\n padding: 6px;\n background: none;\n border: none;\n cursor: pointer;\n color: ${colors.textMuted};\n transition: color 0.15s;\n flex-shrink: 0;\n \n &:hover {\n color: ${colors.danger};\n }\n `,\n cdnAddBtn: css`\n padding: 8px 12px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.primaryLight};\n border: 1px dashed ${colors.primary};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n margin-top: 8px;\n \n &:hover {\n background: ${colors.surface};\n }\n `,\n warning: css`\n font-size: ${fontSize.xs};\n color: ${colors.danger};\n margin-top: 8px;\n padding: 8px 12px;\n background: ${colors.dangerLight};\n border-radius: 6px;\n `,\n}\n\nexport function StudioSettings() {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n <>\n <button css={styles.btn} onClick={() => setIsOpen(true)} aria-label=\"Settings\">\n <svg\n css={styles.icon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z\" />\n </svg>\n </button>\n\n {isOpen && <SettingsPanel onClose={() => setIsOpen(false)} />}\n </>\n )\n}\n\nconst envTemplate = `CLOUDFLARE_R2_ACCOUNT_ID=abc123def456ghi789\nCLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key_id_here\nCLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_access_key_here\nCLOUDFLARE_R2_BUCKET_NAME=my-images-bucket\nCLOUDFLARE_R2_PUBLIC_URL=https://cdn.yourdomain.com`\n\nfunction SettingsPanel({ onClose }: { onClose: () => void }) {\n const { triggerRefresh } = useStudio()\n const [copied, setCopied] = useState(false)\n const [cdnUrls, setCdnUrls] = useState<string[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [hasChanges, setHasChanges] = useState(false)\n\n // Load CDN URLs on mount\n useEffect(() => {\n async function loadCdns() {\n try {\n const response = await fetch('/api/studio/cdns')\n const data = await response.json()\n setCdnUrls(data.cdns || [])\n } catch (error) {\n console.error('Failed to load CDN URLs:', error)\n } finally {\n setLoading(false)\n }\n }\n loadCdns()\n }, [])\n\n const handleCopy = () => {\n navigator.clipboard.writeText(envTemplate)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n const handleCdnChange = useCallback((index: number, value: string) => {\n setCdnUrls(prev => {\n const updated = [...prev]\n updated[index] = value\n return updated\n })\n setHasChanges(true)\n }, [])\n\n const handleAddCdn = useCallback(() => {\n setCdnUrls(prev => [...prev, ''])\n setHasChanges(true)\n }, [])\n\n const handleDeleteCdn = useCallback((index: number) => {\n setCdnUrls(prev => prev.filter((_, i) => i !== index))\n setHasChanges(true)\n }, [])\n\n const handleSave = useCallback(async () => {\n setSaving(true)\n try {\n const response = await fetch('/api/studio/cdns', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n // Preserve empty strings as placeholders to maintain indices\n body: JSON.stringify({ cdns: cdnUrls }),\n })\n \n if (response.ok) {\n setHasChanges(false)\n triggerRefresh()\n onClose()\n }\n } catch (error) {\n console.error('Failed to save CDN URLs:', error)\n } finally {\n setSaving(false)\n }\n }, [cdnUrls, triggerRefresh, onClose])\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.panel} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h2 css={styles.title}>Settings</h2>\n <button css={styles.closeBtn} onClick={onClose}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div css={styles.sections}>\n <section>\n <h3 css={styles.sectionTitle}>CDN URLs</h3>\n <p css={styles.description}>Manage CDN base URLs used by your images:</p>\n {loading ? (\n <p css={styles.description}>Loading...</p>\n ) : (\n <>\n <div css={styles.cdnList}>\n {cdnUrls.map((url, index) => (\n <div key={index} css={styles.cdnRow}>\n <span css={styles.cdnIndex}>{index}</span>\n <input\n css={styles.cdnInput}\n type=\"text\"\n value={url}\n onChange={(e) => handleCdnChange(index, e.target.value)}\n placeholder=\"https://cdn.example.com\"\n />\n <button\n css={styles.cdnDeleteBtn}\n onClick={() => handleDeleteCdn(index)}\n title=\"Delete CDN URL\"\n >\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n <button css={styles.cdnAddBtn} onClick={handleAddCdn}>\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n Add CDN URL\n </button>\n {cdnUrls.length > 0 && (\n <p css={styles.warning}>\n Warning: Changing CDN URLs may break image references. The index numbers correspond to image `c` values.\n </p>\n )}\n </>\n )}\n </section>\n\n <section>\n <h3 css={styles.sectionTitle}>Cloudflare R2 Credentials</h3>\n <p css={styles.description}>Configure in .env.local file:</p>\n <div css={styles.codeWrapper}>\n <button css={styles.copyBtn} onClick={handleCopy} title=\"Copy to clipboard\">\n {copied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <div css={styles.code}>\n <p css={styles.codeLine}>CLOUDFLARE_R2_ACCOUNT_ID=abc123def456ghi789</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key_id_here</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_access_key_here</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_BUCKET_NAME=my-images-bucket</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_PUBLIC_URL=https://cdn.yourdomain.com</p>\n </div>\n </div>\n </section>\n\n <section>\n <h3 css={styles.sectionTitle}>Thumbnail Sizes</h3>\n <div css={styles.grid}>\n <div>\n <label css={styles.label}>Small</label>\n <input css={styles.input} type=\"number\" defaultValue={300} />\n </div>\n <div>\n <label css={styles.label}>Medium</label>\n <input css={styles.input} type=\"number\" defaultValue={700} />\n </div>\n <div>\n <label css={styles.label}>Large</label>\n <input css={styles.input} type=\"number\" defaultValue={1400} />\n </div>\n </div>\n </section>\n </div>\n\n <div css={styles.footer}>\n <button css={styles.cancelBtn} onClick={onClose}>Cancel</button>\n <button css={styles.saveBtn} onClick={handleSave} disabled={saving || !hasChanges}>\n {saving ? 'Saving...' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { css } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { colors, fontSize } from './tokens'\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1100;\n `,\n modal: css`\n background: ${colors.surface};\n border-radius: 12px;\n padding: 24px;\n max-width: 400px;\n width: 90%;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);\n `,\n header: css`\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n `,\n icon: css`\n width: 24px;\n height: 24px;\n color: ${colors.danger};\n flex-shrink: 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 20px 0;\n line-height: 1.5;\n `,\n button: css`\n width: 100%;\n padding: 10px 16px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: none;\n background: ${colors.primary};\n color: white;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n}\n\nexport function ErrorModal() {\n const { error, clearError } = useStudio()\n\n if (!error) return null\n\n return (\n <div css={styles.overlay} onClick={clearError}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n <h3 css={styles.title}>{error.title}</h3>\n </div>\n <p css={styles.message}>{error.message}</p>\n <button css={styles.button} onClick={clearError}>\n OK\n </button>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["useEffect","useCallback","useState","css","useCallback","useEffect","useRef","useState","css","keyframes","css","keyframes","jsx","jsxs","fadeIn","keyframes","slideIn","styles","css","useState","css","jsx","jsxs","styles","css","useState","useState","css","keyframes","Fragment","jsx","jsxs","fadeIn","keyframes","slideIn","styles","css","useState","Fragment","jsx","jsxs","keyframes","styles","css","useRef","useState","useCallback","useEffect","hasSelection","selectedPaths","useState","css","keyframes","useEffect","useState","useRef","useCallback","useState","useRef","useEffect","useCallback","jsx","jsxs","spin","keyframes","styles","css","useState","useState","css","keyframes","jsx","jsxs","spin","keyframes","styles","css","useState","formatFileSize","useState","css","Fragment","jsx","jsxs","styles","css","useState","formatFileSize","useState","useEffect","useCallback","css","Fragment","jsx","jsxs","btnHeight","styles","css","useState","useEffect","useCallback","css","jsx","jsxs","styles","css","jsx","jsxs","btnHeight","styles","css","useState","useCallback","error","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/StudioUI.tsx","../src/components/StudioContext.tsx","../src/components/StudioToolbar.tsx","../src/components/StudioModal.tsx","../src/components/StudioFolderPicker.tsx","../src/components/R2SetupModal.tsx","../src/components/AddNewModal.tsx","../src/components/StudioFileGrid.tsx","../src/hooks/useFileList.ts","../src/lib/api.ts","../src/components/StudioFileList.tsx","../src/components/StudioDetailView.tsx","../src/components/StudioSettings.tsx","../src/components/ErrorModal.tsx"],"sourcesContent":["/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useEffect, useCallback, useState } from 'react'\nimport { css } from '@emotion/react'\nimport { StudioContext } from './StudioContext'\nimport { StudioToolbar } from './StudioToolbar'\nimport { StudioFileGrid } from './StudioFileGrid'\nimport { StudioFileList } from './StudioFileList'\nimport { StudioDetailView } from './StudioDetailView'\nimport { StudioSettings } from './StudioSettings'\nimport { ErrorModal } from './ErrorModal'\nimport { colors, fontSize, baseReset } from './tokens'\nimport type { FileItem, LeanMeta } from '../types'\n\ninterface StudioUIProps {\n onClose: () => void\n isVisible?: boolean\n}\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst styles = {\n container: css`\n ${baseReset}\n display: flex;\n flex-direction: column;\n height: 100%;\n background: ${colors.background};\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: ${colors.surface};\n border-bottom: 1px solid ${colors.border};\n position: relative;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n flex-shrink: 0;\n `,\n headerLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n `,\n headerCenter: css`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n max-width: 50%;\n `,\n breadcrumbs: css`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n overflow: hidden;\n `,\n breadcrumbSeparator: css`\n color: ${colors.border};\n flex-shrink: 0;\n `,\n breadcrumbItem: css`\n color: ${colors.textSecondary};\n text-decoration: none;\n cursor: pointer;\n transition: color 0.15s ease;\n white-space: nowrap;\n \n &:hover {\n color: ${colors.primary};\n }\n `,\n breadcrumbCurrent: css`\n color: ${colors.text};\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n headerActions: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n headerBtn: css`\n height: ${btnHeight};\n padding: 0 12px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n headerIcon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textSecondary};\n `,\n content: css`\n flex: 1;\n display: flex;\n overflow: hidden;\n `,\n fileBrowser: css`\n flex: 1;\n min-width: 0;\n overflow: auto;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n `,\n dropOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(99, 91, 255, 0.1);\n border: 3px dashed ${colors.primary};\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 50;\n pointer-events: none;\n `,\n dropMessage: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n color: ${colors.primary};\n font-size: ${fontSize.lg};\n font-weight: 600;\n `,\n dropIcon: css`\n width: 48px;\n height: 48px;\n `,\n}\n\n/**\n * Main Studio UI - contains all panels and manages internal state\n * Rendered inside the modal via lazy loading\n */\nexport function StudioUI({ onClose, isVisible = true }: StudioUIProps) {\n const [currentPath, setCurrentPathInternal] = useState('public')\n const [selectedItems, setSelectedItems] = useState<Set<string>>(new Set())\n const [lastSelectedPath, setLastSelectedPath] = useState<string | null>(null)\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid')\n const [focusedItem, setFocusedItem] = useState<FileItem | null>(null)\n const [meta, setMeta] = useState<LeanMeta | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [refreshKey, setRefreshKey] = useState(0)\n const [scanRequested, setScanRequested] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [error, setError] = useState<{ title: string; message: string } | null>(null)\n const [fileItems, setFileItems] = useState<FileItem[]>([])\n const [isDragging, setIsDragging] = useState(false)\n\n const triggerRefresh = useCallback(() => {\n setRefreshKey((k) => k + 1)\n }, [])\n\n const triggerScan = useCallback(() => {\n setScanRequested(true)\n }, [])\n\n const clearScanRequest = useCallback(() => {\n setScanRequested(false)\n }, [])\n\n const showError = useCallback((title: string, message: string) => {\n setError({ title, message })\n }, [])\n\n const clearError = useCallback(() => {\n setError(null)\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n }, [])\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n\n const files = Array.from(e.dataTransfer.files)\n if (files.length === 0) return\n\n // Don't allow drops in the images folder\n if (currentPath === 'public/images' || currentPath.startsWith('public/images/')) {\n return\n }\n\n for (const file of files) {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n\n try {\n await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n } catch (error) {\n console.error('Upload error:', error)\n }\n }\n triggerRefresh()\n }, [currentPath, triggerRefresh])\n\n const navigateUp = useCallback(() => {\n if (currentPath === 'public') return\n const parts = currentPath.split('/')\n parts.pop()\n setCurrentPathInternal(parts.join('/') || 'public')\n setSelectedItems(new Set())\n }, [currentPath])\n\n const setCurrentPath = useCallback((path: string) => {\n setCurrentPathInternal(path)\n setSelectedItems(new Set())\n setFocusedItem(null)\n }, [])\n\n const toggleSelection = useCallback((path: string) => {\n setSelectedItems((prev) => {\n const next = new Set(prev)\n if (next.has(path)) {\n next.delete(path)\n } else {\n next.add(path)\n }\n return next\n })\n setLastSelectedPath(path)\n }, [])\n\n const selectRange = useCallback((fromPath: string, toPath: string, allItems: FileItem[]) => {\n const fromIndex = allItems.findIndex(item => item.path === fromPath)\n const toIndex = allItems.findIndex(item => item.path === toPath)\n \n if (fromIndex === -1 || toIndex === -1) return\n \n const start = Math.min(fromIndex, toIndex)\n const end = Math.max(fromIndex, toIndex)\n \n setSelectedItems((prev) => {\n const next = new Set(prev)\n for (let i = start; i <= end; i++) {\n next.add(allItems[i].path)\n }\n return next\n })\n setLastSelectedPath(toPath)\n }, [])\n\n const selectAll = useCallback((items: FileItem[]) => {\n setSelectedItems(new Set(items.map((item) => item.path)))\n }, [])\n\n const clearSelection = useCallback(() => {\n setSelectedItems(new Set())\n }, [])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n // Don't close if user is in an input field (e.g., search)\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n return\n }\n \n if (focusedItem) {\n setFocusedItem(null)\n } else {\n onClose()\n }\n }\n },\n [onClose, focusedItem]\n )\n\n useEffect(() => {\n if (isVisible) {\n document.addEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'hidden'\n }\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = ''\n }\n }, [handleKeyDown, isVisible])\n\n const contextValue = {\n isOpen: true,\n openStudio: () => {},\n closeStudio: onClose,\n toggleStudio: onClose,\n currentPath,\n setCurrentPath,\n navigateUp,\n selectedItems,\n toggleSelection,\n selectRange,\n selectAll,\n clearSelection,\n lastSelectedPath,\n viewMode,\n setViewMode,\n focusedItem,\n setFocusedItem,\n meta,\n setMeta,\n isLoading,\n setIsLoading,\n refreshKey,\n triggerRefresh,\n scanRequested,\n triggerScan,\n clearScanRequest,\n searchQuery,\n setSearchQuery,\n error,\n showError,\n clearError,\n fileItems,\n setFileItems,\n }\n\n return (\n <StudioContext.Provider value={contextValue}>\n <div css={styles.container}>\n <div css={styles.header}>\n <div css={styles.headerLeft}>\n <h1 css={styles.title}>Studio</h1>\n </div>\n <div css={styles.headerCenter}>\n <Breadcrumbs currentPath={currentPath} onNavigate={setCurrentPath} />\n </div>\n <div css={styles.headerActions}>\n <StudioSettings />\n <button\n css={styles.headerBtn}\n onClick={onClose}\n aria-label=\"Close Studio\"\n >\n <CloseIcon />\n </button>\n </div>\n </div>\n\n <StudioToolbar />\n\n <div \n css={styles.content}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {isDragging && (\n <div css={styles.dropOverlay}>\n <div css={styles.dropMessage}>\n <svg css={styles.dropIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span>Drop files to upload</span>\n </div>\n </div>\n )}\n <div css={styles.fileBrowser}>\n {viewMode === 'grid' ? <StudioFileGrid /> : <StudioFileList />}\n </div>\n </div>\n \n {/* Detail view as modal overlay */}\n {focusedItem && <StudioDetailView />}\n\n {/* Error modal */}\n <ErrorModal />\n </div>\n </StudioContext.Provider>\n )\n}\n\nfunction Breadcrumbs({ currentPath, onNavigate }: { currentPath: string; onNavigate: (path: string) => void }) {\n const parts = currentPath.split('/').filter(Boolean)\n \n // Build paths for each breadcrumb\n const breadcrumbs = parts.map((part, index) => ({\n name: part,\n path: parts.slice(0, index + 1).join('/')\n }))\n\n return (\n <div css={styles.breadcrumbs}>\n {breadcrumbs.map((crumb, index) => (\n <span key={crumb.path} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {index > 0 && <span css={styles.breadcrumbSeparator}>/</span>}\n {index === breadcrumbs.length - 1 ? (\n <span css={styles.breadcrumbCurrent}>{crumb.name}</span>\n ) : (\n <span\n css={styles.breadcrumbItem}\n onClick={() => onNavigate(crumb.path)}\n >\n {crumb.name}\n </span>\n )}\n </span>\n ))}\n </div>\n )\n}\n\nfunction CloseIcon() {\n return (\n <svg\n css={styles.headerIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n )\n}\n\nexport default StudioUI\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { FileItem, LeanMeta } from '../types'\n\n/**\n * Error message type for centralized error handling\n */\nexport interface ErrorMessage {\n title: string\n message: string\n}\n\n/**\n * Studio state interface\n * State is managed by StudioUI and provided to all child components\n */\nexport interface StudioState {\n isOpen: boolean\n openStudio: () => void\n closeStudio: () => void\n toggleStudio: () => void\n\n // Navigation\n currentPath: string\n setCurrentPath: (path: string) => void\n navigateUp: () => void\n\n // Selection\n selectedItems: Set<string>\n toggleSelection: (path: string) => void\n selectRange: (fromPath: string, toPath: string, allItems: FileItem[]) => void\n selectAll: (items: FileItem[]) => void\n clearSelection: () => void\n lastSelectedPath: string | null\n\n // View\n viewMode: 'grid' | 'list'\n setViewMode: (mode: 'grid' | 'list') => void\n\n // Focused item (for detail view)\n focusedItem: FileItem | null\n setFocusedItem: (item: FileItem | null) => void\n\n // Meta\n meta: LeanMeta | null\n setMeta: (meta: LeanMeta) => void\n\n // Loading\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n\n // Refresh trigger\n refreshKey: number\n triggerRefresh: () => void\n\n // Scan trigger\n scanRequested: boolean\n triggerScan: () => void\n clearScanRequest: () => void\n\n // Search\n searchQuery: string\n setSearchQuery: (query: string) => void\n\n // Error handling\n error: ErrorMessage | null\n showError: (title: string, message: string) => void\n clearError: () => void\n\n // File items (for toolbar to check cloud status)\n fileItems: FileItem[]\n setFileItems: (items: FileItem[]) => void\n}\n\nconst defaultState: StudioState = {\n isOpen: false,\n openStudio: () => {},\n closeStudio: () => {},\n toggleStudio: () => {},\n currentPath: 'public',\n setCurrentPath: () => {},\n navigateUp: () => {},\n selectedItems: new Set(),\n toggleSelection: () => {},\n selectRange: () => {},\n selectAll: () => {},\n clearSelection: () => {},\n lastSelectedPath: null,\n viewMode: 'grid',\n setViewMode: () => {},\n focusedItem: null,\n setFocusedItem: () => {},\n meta: null,\n setMeta: () => {},\n isLoading: false,\n setIsLoading: () => {},\n refreshKey: 0,\n triggerRefresh: () => {},\n scanRequested: false,\n triggerScan: () => {},\n clearScanRequest: () => {},\n searchQuery: '',\n setSearchQuery: () => {},\n error: null,\n showError: () => {},\n clearError: () => {},\n fileItems: [],\n setFileItems: () => {},\n}\n\nexport const StudioContext = createContext<StudioState>(defaultState)\n\n/**\n * Hook to access Studio state from child components\n */\nexport function useStudio() {\n return useContext(StudioContext)\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { ConfirmModal, AlertModal, ProgressModal, InputModal, type ProgressState } from './StudioModal'\nimport { StudioFolderPicker } from './StudioFolderPicker'\nimport { R2SetupModal } from './R2SetupModal'\nimport { AddNewModal } from './AddNewModal'\nimport { colors, fontSize } from './tokens'\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n toolbar: css`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 16px;\n background-color: ${colors.surface};\n border-bottom: 1px solid ${colors.border};\n overflow-x: auto;\n min-width: 0;\n \n @media (min-width: 768px) {\n padding: 12px 24px;\n }\n `,\n left: css`\n display: flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n `,\n right: css`\n display: flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n `,\n btn: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: ${btnHeight};\n padding: 0 14px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n cursor: pointer;\n transition: all 0.15s ease;\n color: ${colors.text};\n letter-spacing: -0.01em;\n \n &:hover:not(:disabled) {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n \n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n `,\n btnIconOnly: css`\n padding: 0 10px;\n `,\n btnPrimary: css`\n background: ${colors.primary};\n border-color: ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n `,\n btnDanger: css`\n color: ${colors.danger};\n \n &:hover:not(:disabled) {\n background-color: ${colors.dangerLight};\n border-color: ${colors.danger};\n }\n `,\n icon: css`\n width: 16px;\n height: 16px;\n `,\n iconSpin: css`\n animation: ${spin} 1s linear infinite;\n `,\n selectionCount: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n display: flex;\n align-items: center;\n gap: 8px;\n margin-right: 8px;\n `,\n clearBtn: css`\n color: ${colors.primary};\n background: none;\n border: none;\n cursor: pointer;\n font-size: ${fontSize.base};\n font-weight: 500;\n padding: 0;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n divider: css`\n width: 1px;\n height: 24px;\n background: ${colors.border};\n margin: 0 4px;\n `,\n viewToggle: css`\n display: flex;\n align-items: center;\n height: ${btnHeight};\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n overflow: hidden;\n `,\n searchWrapper: css`\n position: relative;\n display: flex;\n align-items: center;\n `,\n searchInput: css`\n height: ${btnHeight};\n padding: 0 32px 0 12px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.base};\n background: ${colors.surface};\n color: ${colors.text};\n width: 180px;\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 2px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n searchClearBtn: css`\n position: absolute;\n right: 5px;\n top: 5px;\n bottom: 5px;\n background: ${colors.primary};\n border: none;\n padding: 0 6px;\n cursor: pointer;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n viewBtn: css`\n height: 100%;\n padding: 0 10px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: ${colors.textSecondary};\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n color: ${colors.text};\n background-color: ${colors.surfaceHover};\n }\n `,\n viewBtnActive: css`\n background-color: ${colors.primaryLight};\n color: ${colors.primary};\n \n &:hover {\n background-color: ${colors.primaryLight};\n color: ${colors.primary};\n }\n `,\n}\n\nexport function StudioToolbar() {\n const { selectedItems, viewMode, setViewMode, clearSelection, currentPath, triggerRefresh, focusedItem, scanRequested, clearScanRequest, fileItems } = useStudio()\n const fileInputRef = useRef<HTMLInputElement>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n const [showAddNewModal, setShowAddNewModal] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [scanning, setScanning] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)\n const [showProcessConfirm, setShowProcessConfirm] = useState(false)\n const [showSyncConfirm, setShowSyncConfirm] = useState(false)\n const [syncImageCount, setSyncImageCount] = useState(0)\n const [syncHasRemote, setSyncHasRemote] = useState(false)\n const [syncHasLocal, setSyncHasLocal] = useState(false)\n const [showProgress, setShowProgress] = useState(false)\n const [progressTitle, setProgressTitle] = useState('Processing Images')\n const [progressState, setProgressState] = useState<ProgressState>({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n })\n const [processCount, setProcessCount] = useState(0)\n const [processMode, setProcessMode] = useState<'all' | 'selected'>('all')\n const [imagesToProcess, setImagesToProcess] = useState<string[]>([])\n const [alertMessage, setAlertMessage] = useState<{ title: string; message: string } | null>(null)\n const [showNewFolderModal, setShowNewFolderModal] = useState(false)\n const [showRenameFolderModal, setShowRenameFolderModal] = useState(false)\n const [showMoveModal, setShowMoveModal] = useState(false)\n const [showR2SetupModal, setShowR2SetupModal] = useState(false)\n const [pushing, setPushing] = useState(false)\n\n // Check if we're in the images folder (uploads not allowed there)\n const isInImagesFolder = currentPath === 'public/images' || currentPath.startsWith('public/images/')\n\n const handleUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleScan = useCallback(async () => {\n setScanning(true)\n setProgressTitle('Scanning Files')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n message: 'Scanning for files...',\n })\n\n try {\n const response = await fetch('/api/studio/scan', { method: 'POST' })\n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader')\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'start') {\n setProgressState({\n current: 0,\n total: data.total,\n percent: 0,\n status: 'processing',\n message: `Scanning ${data.total} files...`,\n })\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n status: 'processing',\n currentFile: data.currentFile,\n })\n } else if (data.type === 'cleanup') {\n setProgressState(prev => ({\n ...prev,\n message: data.message,\n }))\n } else if (data.type === 'complete') {\n let message = data.renamed > 0 ? `${data.renamed} file(s) renamed due to conflicts. ` : ''\n if (data.orphanedFiles && data.orphanedFiles.length > 0) {\n message += `Found ${data.orphanedFiles.length} orphaned thumbnail(s) in images folder.`\n }\n setProgressState({\n current: data.total || 0,\n total: data.total || 0,\n percent: 100,\n status: 'complete',\n processed: data.added,\n alreadyProcessed: data.existingCount,\n errors: data.errors,\n orphanedFiles: data.orphanedFiles,\n message: message || undefined,\n isScan: true,\n })\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: data.message || 'Scan failed',\n })\n }\n }\n }\n } catch (error) {\n console.error('Scan error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Scan failed',\n })\n } finally {\n setScanning(false)\n }\n }, [triggerRefresh])\n\n // Handle scan request from file pane\n useEffect(() => {\n if (scanRequested && !scanning) {\n clearScanRequest()\n handleScan()\n }\n }, [scanRequested, scanning, clearScanRequest, handleScan])\n\n const handleFileChange = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) return\n\n const fileList = Array.from(files)\n \n // Show progress modal for multiple files\n if (fileList.length > 1) {\n setProgressState({\n current: 0,\n total: fileList.length,\n percent: 0,\n status: 'processing',\n message: 'Uploading files...',\n })\n setShowProgress(true)\n } else {\n setUploading(true)\n }\n\n let uploaded = 0\n let errors = 0\n\n try {\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i]\n \n if (fileList.length > 1) {\n setProgressState({\n current: i + 1,\n total: fileList.length,\n percent: Math.round(((i + 1) / fileList.length) * 100),\n status: 'processing',\n currentFile: file.name,\n })\n }\n\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n\n try {\n const response = await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const error = await response.json()\n errors++\n if (fileList.length === 1) {\n if (response.status >= 500) {\n console.error('Upload error:', error)\n setAlertMessage({\n title: 'Upload Failed',\n message: `Failed to upload ${file.name}: ${error.error || 'Unknown error'}`,\n })\n } else {\n setAlertMessage({\n title: 'Cannot Upload Here',\n message: error.error || 'Upload not allowed in this location.',\n })\n }\n }\n } else {\n uploaded++\n }\n } catch {\n errors++\n }\n }\n\n if (fileList.length > 1) {\n setProgressState({\n current: fileList.length,\n total: fileList.length,\n percent: 100,\n status: 'complete',\n processed: uploaded,\n errors: errors,\n })\n }\n \n triggerRefresh()\n } catch (error) {\n console.error('Upload error:', error)\n if (fileList.length > 1) {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Upload failed.',\n })\n } else {\n setAlertMessage({\n title: 'Upload Failed',\n message: 'Upload failed. Check console for details.',\n })\n }\n } finally {\n setUploading(false)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }\n }, [currentPath, triggerRefresh])\n\n const handleProcessImages = useCallback(async () => {\n const hasSelection = selectedItems.size > 0\n \n if (hasSelection) {\n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n \n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n // Add folder images to selectedImagePaths (as public/ paths)\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n \n if (selectedImagePaths.length === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the selected items.',\n })\n return\n }\n \n setProcessCount(selectedImagePaths.length)\n setImagesToProcess(selectedImagePaths)\n setProcessMode('selected')\n setShowProcessConfirm(true)\n } else {\n // Count ALL images for \"process all\"\n try {\n const response = await fetch('/api/studio/count-images')\n const data = await response.json()\n \n if (data.count === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the public folder to process.',\n })\n return\n }\n \n setProcessCount(data.count)\n setProcessMode('all')\n setShowProcessConfirm(true)\n } catch (error) {\n console.error('Failed to count images:', error)\n setAlertMessage({\n title: 'Error',\n message: 'Failed to count images.',\n })\n }\n }\n }, [selectedItems])\n\n const handleProcessConfirm = useCallback(async () => {\n setShowProcessConfirm(false)\n setProcessing(true)\n\n // Create new AbortController for this request\n abortControllerRef.current = new AbortController()\n const signal = abortControllerRef.current.signal\n\n try {\n if (processMode === 'all') {\n // Process all images with streaming progress\n setProgressTitle('Processing Images')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: processCount,\n percent: 0,\n status: 'processing',\n })\n\n const response = await fetch('/api/studio/process-all', {\n method: 'POST',\n signal,\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n // Check if aborted\n if (signal.aborted) {\n reader.cancel()\n break\n }\n\n const text = decoder.decode(value)\n const lines = text.split('\\n\\n').filter(line => line.startsWith('data: '))\n\n for (const line of lines) {\n try {\n const data = JSON.parse(line.replace('data: ', ''))\n \n if (data.type === 'start') {\n setProgressState(prev => ({\n ...prev,\n total: data.total,\n }))\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n currentFile: data.currentFile,\n status: 'processing',\n })\n } else if (data.type === 'cleanup') {\n setProgressState(prev => ({\n ...prev,\n status: 'cleanup',\n currentFile: undefined,\n }))\n } else if (data.type === 'complete') {\n setProgressState({\n current: data.processed,\n total: data.processed,\n percent: 100,\n status: 'complete',\n processed: data.processed,\n alreadyProcessed: data.alreadyProcessed,\n orphansRemoved: data.orphansRemoved,\n errors: data.errors,\n })\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n message: data.message,\n }))\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (err) {\n if (signal.aborted) {\n // User stopped - update state to show stopped status\n setProgressState(prev => ({\n ...prev,\n status: 'stopped',\n processed: prev.current,\n }))\n triggerRefresh()\n } else {\n throw err\n }\n }\n } else {\n // Process selected images (no streaming for now)\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: processCount,\n percent: 0,\n status: 'processing',\n })\n\n // Use stored imagesToProcess instead of selectedItems\n const selectedImageKeys = imagesToProcess.map(p => p.replace(/^public\\//, ''))\n \n const response = await fetch('/api/studio/reprocess', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: selectedImageKeys }),\n signal,\n })\n \n const data = await response.json()\n \n if (response.ok) {\n setProgressState({\n current: data.processed?.length || 0,\n total: data.processed?.length || 0,\n percent: 100,\n status: 'complete',\n processed: data.processed?.length || 0,\n errors: data.errors?.length || 0,\n })\n clearSelection()\n triggerRefresh()\n } else {\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: data.error || 'Unknown error',\n })\n }\n }\n } catch (error) {\n if (signal.aborted) {\n // User stopped\n setProgressState(prev => ({\n ...prev,\n status: 'stopped',\n processed: prev.current,\n }))\n triggerRefresh()\n } else {\n console.error('Processing error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Processing failed. Check console for details.',\n })\n }\n } finally {\n setProcessing(false)\n abortControllerRef.current = null\n }\n }, [processMode, processCount, imagesToProcess, clearSelection, triggerRefresh])\n\n const handleStopProcessing = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n }, [])\n\n const handleDeleteOrphans = useCallback(async () => {\n const orphanedFiles = progressState.orphanedFiles\n if (!orphanedFiles || orphanedFiles.length === 0) return\n\n try {\n const response = await fetch('/api/studio/delete-orphans', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: orphanedFiles }),\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setProgressState(prev => ({\n ...prev,\n orphanedFiles: undefined,\n orphansRemoved: data.deleted,\n message: `Deleted ${data.deleted} orphaned thumbnail${data.deleted !== 1 ? 's' : ''}.`,\n }))\n triggerRefresh()\n } else {\n setAlertMessage({\n title: 'Delete Failed',\n message: data.error || 'Failed to delete orphaned files.',\n })\n }\n } catch (error) {\n console.error('Delete orphans error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Failed to delete orphaned files. Check console for details.',\n })\n }\n }, [progressState.orphanedFiles, triggerRefresh])\n\n const handleDeleteClick = useCallback(() => {\n if (selectedItems.size === 0) return\n setShowDeleteConfirm(true)\n }, [selectedItems])\n\n const handleDeleteConfirm = useCallback(async () => {\n setShowDeleteConfirm(false)\n \n try {\n const response = await fetch('/api/studio/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: Array.from(selectedItems) }),\n })\n\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Delete Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Delete error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Delete failed. Check console for details.',\n })\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const handleSyncClick = useCallback(async () => {\n if (selectedItems.size === 0) return\n\n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n\n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n\n if (selectedImagePaths.length === 0) {\n setAlertMessage({\n title: 'No Images Found',\n message: 'No images found in the selected items.',\n })\n return\n }\n\n // Determine what types of images are selected\n let hasRemote = false\n let hasLocal = false\n \n for (const imgPath of selectedImagePaths) {\n const item = fileItems.find(f => f.path === imgPath)\n if (item) {\n if (item.isRemote) {\n hasRemote = true\n } else if (!item.cdnPushed) {\n hasLocal = true\n }\n }\n }\n\n // Store info and show confirm modal\n setSyncImageCount(selectedImagePaths.length)\n setSyncHasRemote(hasRemote)\n setSyncHasLocal(hasLocal)\n setShowSyncConfirm(true)\n }, [selectedItems, fileItems])\n\n const handleSyncConfirm = useCallback(async () => {\n setShowSyncConfirm(false)\n \n const selectedPaths = Array.from(selectedItems)\n \n // Separate folders and image files\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff', 'tif']\n const selectedImagePaths = selectedPaths.filter(p => {\n const ext = p.split('.').pop()?.toLowerCase() || ''\n return imageExtensions.includes(ext)\n })\n const selectedFolders = selectedPaths.filter(p => !p.includes('.') || p.endsWith('/'))\n\n // If folders are selected, fetch all images from them\n if (selectedFolders.length > 0) {\n try {\n const response = await fetch(`/api/studio/folder-images?folders=${encodeURIComponent(selectedFolders.join(','))}`)\n const data = await response.json()\n \n if (data.images) {\n for (const img of data.images) {\n const fullPath = `public/${img}`\n if (!selectedImagePaths.includes(fullPath)) {\n selectedImagePaths.push(fullPath)\n }\n }\n }\n } catch (error) {\n console.error('Failed to get folder images:', error)\n }\n }\n\n // Convert to image keys\n const imageKeys = selectedImagePaths.map(p => '/' + p.replace(/^public\\//, ''))\n\n // Show progress modal\n setProgressTitle('Pushing to CDN')\n setProgressState({\n current: 0,\n total: imageKeys.length,\n percent: 0,\n status: 'processing',\n message: 'Pushing to CDN...',\n })\n setShowProgress(true)\n\n let pushed = 0\n let errors = 0\n const errorMessages: string[] = []\n\n try {\n // Push images one by one for progress tracking\n for (let i = 0; i < imageKeys.length; i++) {\n const imageKey = imageKeys[i]\n \n setProgressState({\n current: i + 1,\n total: imageKeys.length,\n percent: Math.round(((i + 1) / imageKeys.length) * 100),\n status: 'processing',\n currentFile: imageKey.replace(/^\\//, ''),\n })\n\n try {\n const response = await fetch('/api/studio/sync', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: [imageKey] }),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n // Check if it's an R2 configuration error\n if (data.error?.includes('R2 not configured') || data.error?.includes('CLOUDFLARE_R2')) {\n setShowProgress(false)\n setShowR2SetupModal(true)\n return\n }\n errors++\n errorMessages.push(data.error || `Failed: ${imageKey}`)\n } else if (data.pushed?.length > 0) {\n pushed++\n } else if (data.errors?.length > 0) {\n errors++\n // data.errors contains the actual error messages from the handler\n for (const errMsg of data.errors) {\n errorMessages.push(errMsg)\n }\n }\n } catch (err) {\n errors++\n errorMessages.push(`Network error: ${imageKey}`)\n }\n }\n\n setProgressState({\n current: imageKeys.length,\n total: imageKeys.length,\n percent: 100,\n status: 'complete',\n processed: pushed,\n errors: errors,\n errorMessages: errorMessages.length > 0 ? errorMessages : undefined,\n })\n \n clearSelection()\n triggerRefresh()\n } catch (error) {\n console.error('Push error:', error)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'error',\n message: 'Failed to push to CDN.',\n })\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const handleCreateFolder = useCallback(async (folderName: string) => {\n setShowNewFolderModal(false)\n \n try {\n const response = await fetch('/api/studio/create-folder', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ parentPath: currentPath, name: folderName }),\n })\n\n if (response.ok) {\n triggerRefresh()\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Create Folder Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Create folder error:', error)\n setAlertMessage({\n title: 'Create Folder Failed',\n message: 'Failed to create folder. Check console for details.',\n })\n }\n }, [currentPath, triggerRefresh])\n\n const handleMoveClick = useCallback(() => {\n if (selectedItems.size === 0) return\n setShowMoveModal(true)\n }, [selectedItems])\n\n const handleMoveConfirm = useCallback(async (destination: string) => {\n const paths = Array.from(selectedItems)\n \n // Show progress modal\n setProgressTitle('Moving Files')\n setShowProgress(true)\n setProgressState({\n current: 0,\n total: paths.length,\n percent: 0,\n status: 'processing',\n })\n\n try {\n const response = await fetch('/api/studio/move', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths, destination }),\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n try {\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'start') {\n setProgressState(prev => ({ ...prev, total: data.total }))\n } else if (data.type === 'progress') {\n setProgressState({\n current: data.current,\n total: data.total,\n percent: data.percent,\n currentFile: data.currentFile,\n status: 'processing',\n })\n } else if (data.type === 'complete') {\n setProgressState(prev => ({\n ...prev,\n status: 'complete',\n processed: data.moved,\n errors: data.errors,\n errorMessages: data.errorMessages,\n isMove: true,\n }))\n clearSelection()\n triggerRefresh()\n } else if (data.type === 'error') {\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n errorMessage: data.message,\n }))\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (error) {\n console.error('Move error:', error)\n setProgressState(prev => ({\n ...prev,\n status: 'error',\n errorMessage: 'Failed to move items. Check console for details.',\n }))\n }\n }, [selectedItems, clearSelection, triggerRefresh])\n\n const { searchQuery, setSearchQuery } = useStudio()\n \n const handleSearch = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value)\n }, [setSearchQuery])\n\n const handleSearchKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.stopPropagation() // Prevent closing the studio\n setSearchQuery('')\n ;(e.target as HTMLInputElement).blur()\n }\n }, [setSearchQuery])\n\n const hasSelection = selectedItems.size > 0\n \n // Check if any selected items are already in our R2 (for Push CDN disabling)\n // Remote images (from other CDNs) can still be pushed to our R2\n const hasR2Selection = hasSelection && Array.from(selectedItems).some(path => {\n const item = fileItems.find(f => f.path === path)\n return item && item.cdnPushed && !item.isRemote\n })\n \n // Check if exactly one folder is selected (for rename)\n const selectedPaths = Array.from(selectedItems)\n const singleFolderSelected = selectedPaths.length === 1 && !selectedPaths[0].includes('.')\n const selectedFolderPath = singleFolderSelected ? selectedPaths[0] : null\n const selectedFolderName = selectedFolderPath ? selectedFolderPath.split('/').pop() || '' : ''\n\n const handleRenameFolder = useCallback(async (newName: string) => {\n if (!selectedFolderPath) return\n setShowRenameFolderModal(false)\n try {\n const response = await fetch('/api/studio/rename', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ oldPath: selectedFolderPath, newName }),\n })\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n }\n } catch (error) {\n console.error('Failed to rename folder:', error)\n }\n }, [selectedFolderPath, clearSelection, triggerRefresh])\n\n // Hide toolbar actions when viewing detail\n if (focusedItem) {\n return null\n }\n\n return (\n <>\n {showDeleteConfirm && (\n <ConfirmModal\n title=\"Delete Items\"\n message={`Are you sure you want to delete ${selectedItems.size} item(s)? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n variant=\"danger\"\n onConfirm={handleDeleteConfirm}\n onCancel={() => setShowDeleteConfirm(false)}\n />\n )}\n\n {showSyncConfirm && (\n <ConfirmModal\n title=\"Push to CDN\"\n message={`Push ${syncImageCount} image${syncImageCount !== 1 ? 's' : ''} to Cloudflare R2?${syncHasRemote ? ' Remote images will be downloaded first.' : ''}${syncHasLocal ? ' After pushing, local files will be deleted.' : ''}`}\n confirmLabel=\"Push\"\n onConfirm={handleSyncConfirm}\n onCancel={() => setShowSyncConfirm(false)}\n />\n )}\n\n {showProcessConfirm && (\n <ConfirmModal\n title=\"Process Images\"\n message={processMode === 'all' \n ? `Found ${processCount} image${processCount !== 1 ? 's' : ''} in the public folder. This will regenerate all thumbnails and remove any orphaned files from the images folder.`\n : `Process ${processCount} selected image${processCount !== 1 ? 's' : ''}? This will regenerate thumbnails for these files.`\n }\n confirmLabel={processing ? 'Processing...' : 'Process'}\n onConfirm={handleProcessConfirm}\n onCancel={() => setShowProcessConfirm(false)}\n />\n )}\n\n {showProgress && (\n <ProgressModal\n title={progressTitle}\n progress={progressState}\n onStop={handleStopProcessing}\n onDeleteOrphans={handleDeleteOrphans}\n onClose={() => {\n setShowProgress(false)\n setProgressState({\n current: 0,\n total: 0,\n percent: 0,\n status: 'processing',\n })\n }}\n />\n )}\n\n {showNewFolderModal && (\n <InputModal\n title=\"New Folder\"\n message=\"Enter a name for the new folder:\"\n placeholder=\"Folder name\"\n confirmLabel=\"Create\"\n onConfirm={handleCreateFolder}\n onCancel={() => setShowNewFolderModal(false)}\n />\n )}\n\n {showMoveModal && (\n <StudioFolderPicker\n selectedItems={selectedItems}\n currentPath={currentPath}\n onMove={(destination) => {\n setShowMoveModal(false)\n handleMoveConfirm(destination)\n }}\n onCancel={() => setShowMoveModal(false)}\n />\n )}\n\n {showRenameFolderModal && selectedFolderPath && (\n <InputModal\n title=\"Rename Folder\"\n message=\"Enter a new name for the folder:\"\n placeholder={selectedFolderName}\n defaultValue={selectedFolderName}\n confirmLabel=\"Rename\"\n onConfirm={handleRenameFolder}\n onCancel={() => setShowRenameFolderModal(false)}\n />\n )}\n\n {alertMessage && (\n <AlertModal\n title={alertMessage.title}\n message={alertMessage.message}\n onClose={() => setAlertMessage(null)}\n />\n )}\n\n <R2SetupModal\n isOpen={showR2SetupModal}\n onClose={() => setShowR2SetupModal(false)}\n />\n\n {showAddNewModal && (\n <AddNewModal\n currentPath={currentPath}\n onClose={() => setShowAddNewModal(false)}\n onUploadComplete={() => {\n setShowAddNewModal(false)\n triggerRefresh()\n }}\n />\n )}\n\n <div css={styles.toolbar}>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\"image/*,video/*,audio/*,.pdf\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n \n <div css={styles.left}>\n <button\n css={[styles.btn, styles.btnPrimary]}\n onClick={() => setShowAddNewModal(true)}\n disabled={uploading || isInImagesFolder}\n >\n <UploadIcon />\n Add New\n </button>\n <button\n css={styles.btn}\n onClick={() => singleFolderSelected ? setShowRenameFolderModal(true) : setShowNewFolderModal(true)}\n disabled={isInImagesFolder && !singleFolderSelected}\n title={isInImagesFolder && !singleFolderSelected ? 'Cannot create folders in protected images folder' : undefined}\n >\n {singleFolderSelected ? <RenameIcon /> : <FolderPlusIcon />}\n {singleFolderSelected ? 'Rename Folder' : 'New Folder'}\n </button>\n \n <div css={styles.divider} />\n \n <button\n css={styles.btn}\n onClick={handleProcessImages}\n disabled={processing || isInImagesFolder}\n title={isInImagesFolder ? 'Cannot process images folder' : undefined}\n >\n <ImageStackIcon />\n {processing ? 'Processing...' : 'Process Images'}\n </button>\n <button\n css={[styles.btn, styles.btnDanger]}\n onClick={handleDeleteClick}\n disabled={!hasSelection}\n >\n <TrashIcon />\n Delete\n </button>\n <button\n css={styles.btn}\n onClick={handleMoveClick}\n disabled={!hasSelection}\n >\n <MoveIcon />\n Move\n </button>\n <button\n css={styles.btn}\n onClick={handleSyncClick}\n disabled={!hasSelection || hasR2Selection}\n title={hasR2Selection ? 'Selected files are already in R2' : undefined}\n >\n <CloudIcon />\n Push CDN\n </button>\n <div css={styles.searchWrapper}>\n <input\n css={styles.searchInput}\n type=\"text\"\n placeholder=\"Search images...\"\n value={searchQuery}\n onChange={handleSearch}\n onKeyDown={handleSearchKeyDown}\n />\n {searchQuery && (\n <button\n css={styles.searchClearBtn}\n onClick={() => setSearchQuery('')}\n title=\"Clear search\"\n >\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n\n <div css={styles.right}>\n {hasSelection && (\n <span css={styles.selectionCount}>\n {selectedItems.size} selected\n <button css={styles.clearBtn} onClick={clearSelection}>\n Clear\n </button>\n </span>\n )}\n\n <button\n css={styles.btn}\n onClick={handleScan}\n disabled={scanning}\n >\n <ScanIcon spinning={scanning} />\n Scan\n </button>\n\n <div css={styles.viewToggle}>\n <button\n css={[styles.viewBtn, viewMode === 'grid' && styles.viewBtnActive]}\n onClick={() => setViewMode('grid')}\n aria-label=\"Grid view\"\n >\n <GridIcon />\n </button>\n <button\n css={[styles.viewBtn, viewMode === 'list' && styles.viewBtnActive]}\n onClick={() => setViewMode('list')}\n aria-label=\"List view\"\n >\n <ListIcon />\n </button>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction UploadIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n )\n}\n\nfunction ScanIcon({ spinning }: { spinning?: boolean }) {\n return (\n <svg css={[styles.icon, spinning && styles.iconSpin]} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n )\n}\n\nfunction TrashIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )\n}\n\nfunction FolderPlusIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n </svg>\n )\n}\n\nfunction RenameIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n )\n}\n\nfunction MoveIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n )\n}\n\nfunction CloudIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n )\n}\n\nfunction GridIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n )\n}\n\nfunction ListIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n )\n}\n\nfunction ImageStackIcon() {\n return (\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport React from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 420px;\n width: 90%;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n body: css`\n padding: 12px 24px 24px;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0;\n line-height: 1.6;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n `,\n btnDanger: css`\n background-color: ${colors.danger};\n border: 1px solid ${colors.danger};\n color: white;\n \n &:hover {\n background-color: ${colors.dangerHover};\n border-color: ${colors.dangerHover};\n }\n `,\n}\n\ninterface ConfirmModalProps {\n title: string\n message: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: 'default' | 'danger'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmModal({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>{message}</p>\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n {cancelLabel}\n </button>\n <button\n css={[styles.btn, variant === 'danger' ? styles.btnDanger : styles.btnConfirm]}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\ninterface InputModalProps {\n title: string\n message?: string\n inputLabel?: string\n defaultValue?: string\n placeholder?: string\n confirmLabel?: string\n cancelLabel?: string\n onConfirm: (value: string) => void\n onCancel: () => void\n}\n\nconst inputStyles = {\n input: css`\n width: 100%;\n padding: 10px 12px;\n font-size: ${fontSize.base};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n background: ${colors.surface};\n color: ${colors.text};\n margin-top: 12px;\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 2px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n}\n\nexport function InputModal({\n title,\n message,\n inputLabel,\n defaultValue = '',\n placeholder,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n onCancel,\n}: InputModalProps) {\n const [value, setValue] = React.useState(defaultValue)\n \n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (value.trim()) {\n onConfirm(value.trim())\n }\n }\n \n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <form onSubmit={handleSubmit}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n {message && <p css={styles.message}>{message}</p>}\n {inputLabel && <label css={styles.message}>{inputLabel}</label>}\n <input\n css={inputStyles.input}\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n autoFocus\n />\n </div>\n <div css={styles.footer}>\n <button type=\"button\" css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n {cancelLabel}\n </button>\n <button type=\"submit\" css={[styles.btn, styles.btnConfirm]} disabled={!value.trim()}>\n {confirmLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n\ninterface AlertModalProps {\n title: string\n message: string\n buttonLabel?: string\n onClose: () => void\n}\n\nexport function AlertModal({\n title,\n message,\n buttonLabel = 'OK',\n onClose,\n}: AlertModalProps) {\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>{message}</p>\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnConfirm]} onClick={onClose}>\n {buttonLabel}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nconst progressStyles = {\n progressContainer: css`\n margin-top: 16px;\n `,\n progressBar: css`\n width: 100%;\n height: 8px;\n background-color: ${colors.background};\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 12px;\n `,\n progressFill: css`\n height: 100%;\n background: linear-gradient(90deg, ${colors.primary}, ${colors.primaryHover});\n border-radius: 4px;\n transition: width 0.3s ease;\n `,\n progressText: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n `,\n currentFile: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n margin: 8px 0 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n errorList: css`\n margin-top: 12px;\n padding: 12px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 6px;\n max-height: 200px;\n overflow-y: auto;\n `,\n errorItem: css`\n font-size: ${fontSize.xs};\n color: #991b1b;\n margin: 0 0 4px;\n &:last-child {\n margin-bottom: 0;\n }\n `,\n}\n\nexport interface ProgressState {\n current: number\n total: number\n percent: number\n currentFile?: string\n status: 'processing' | 'cleanup' | 'complete' | 'error' | 'stopped'\n message?: string\n processed?: number\n alreadyProcessed?: number\n orphansRemoved?: number\n orphanedFiles?: string[] // List of orphaned files found during scan\n errors?: number\n errorMessages?: string[]\n isScan?: boolean\n isMove?: boolean\n}\n\ninterface ProgressModalProps {\n title: string\n progress: ProgressState\n onClose?: () => void\n onStop?: () => void\n onDeleteOrphans?: () => void\n}\n\nexport function ProgressModal({\n title,\n progress,\n onClose,\n onDeleteOrphans,\n onStop,\n}: ProgressModalProps) {\n const isComplete = progress.status === 'complete'\n const isError = progress.status === 'error'\n const isStopped = progress.status === 'stopped'\n const canClose = isComplete || isError || isStopped\n const isRunning = !canClose\n\n return (\n <div css={styles.overlay}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>{title}</h3>\n </div>\n <div css={styles.body}>\n {isError ? (\n <p css={styles.message}>{progress.message || 'An error occurred'}</p>\n ) : isStopped ? (\n <p css={styles.message}>\n Processing stopped. Processed {progress.processed ?? progress.current} image{(progress.processed ?? progress.current) !== 1 ? 's' : ''} before stopping.\n </p>\n ) : isComplete ? (\n <>\n <p css={styles.message}>\n {progress.isMove ? (\n <>\n Moved {progress.processed} file{progress.processed !== 1 ? 's' : ''}.\n {progress.errors !== undefined && progress.errors > 0 ? (\n <> {progress.errors} error{progress.errors !== 1 ? 's' : ''} occurred.</>\n ) : null}\n </>\n ) : progress.isScan ? (\n <>\n {progress.alreadyProcessed !== undefined && progress.alreadyProcessed > 0 ? (\n <>{progress.alreadyProcessed} image{progress.alreadyProcessed !== 1 ? 's' : ''} already exist. </>\n ) : null}\n Scanned {progress.processed} new image{progress.processed !== 1 ? 's' : ''}.\n </>\n ) : (\n <>\n Processed {progress.processed} new image{progress.processed !== 1 ? 's' : ''}.\n {progress.alreadyProcessed !== undefined && progress.alreadyProcessed > 0 ? (\n <> {progress.alreadyProcessed} already processed.</>\n ) : null}\n </>\n )}\n {progress.orphansRemoved !== undefined && progress.orphansRemoved > 0 ? (\n <> Removed {progress.orphansRemoved} orphaned thumbnail{progress.orphansRemoved !== 1 ? 's' : ''}.</>\n ) : null}\n </p>\n {progress.errorMessages && progress.errorMessages.length > 0 && (\n <div css={progressStyles.errorList}>\n {progress.errorMessages.slice(0, 10).map((msg, i) => (\n <p key={i} css={progressStyles.errorItem}>{msg}</p>\n ))}\n {progress.errorMessages.length > 10 && (\n <p css={progressStyles.errorItem}>...and {progress.errorMessages.length - 10} more</p>\n )}\n </div>\n )}\n </>\n ) : (\n <>\n <p css={styles.message}>\n {progress.status === 'cleanup' \n ? 'Cleaning up orphaned files...' \n : `Processing images...`}\n </p>\n <div css={progressStyles.progressContainer}>\n <div css={progressStyles.progressBar}>\n <div \n css={progressStyles.progressFill} \n style={{ width: `${progress.percent}%` }} \n />\n </div>\n <div css={progressStyles.progressText}>\n <span>{progress.current} of {progress.total}</span>\n <span>{progress.percent}%</span>\n </div>\n {progress.currentFile && (\n <p css={progressStyles.currentFile} title={progress.currentFile}>\n {progress.currentFile}\n </p>\n )}\n </div>\n </>\n )}\n </div>\n <div css={styles.footer}>\n {isRunning && onStop && (\n <button css={[styles.btn, styles.btnDanger]} onClick={onStop}>\n Stop\n </button>\n )}\n {canClose && progress.orphanedFiles && progress.orphanedFiles.length > 0 && onDeleteOrphans && (\n <button css={[styles.btn, styles.btnDanger]} onClick={onDeleteOrphans}>\n Delete {progress.orphanedFiles.length} Orphan{progress.orphanedFiles.length !== 1 ? 's' : ''}\n </button>\n )}\n {canClose && (\n <button css={[styles.btn, styles.btnConfirm]} onClick={onClose}>\n Done\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\ninterface Folder {\n path: string\n name: string\n depth: number\n}\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 480px;\n width: 90%;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n body: css`\n padding: 12px 24px 24px;\n flex: 1;\n overflow-y: auto;\n min-height: 200px;\n max-height: 400px;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 16px;\n line-height: 1.6;\n `,\n folderList: css`\n display: flex;\n flex-direction: column;\n gap: 0;\n `,\n folderItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n position: relative;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n `,\n treeIndent: css`\n display: flex;\n align-items: center;\n height: 100%;\n `,\n treeLine: css`\n width: 16px;\n height: 100%;\n position: relative;\n flex-shrink: 0;\n \n &::before {\n content: '';\n position: absolute;\n left: 8px;\n top: 0;\n bottom: 50%;\n width: 0;\n border-left: 1px dashed ${colors.textSecondary};\n }\n \n &::after {\n content: '';\n position: absolute;\n left: 8px;\n top: 50%;\n width: 8px;\n height: 0;\n border-top: 1px dashed ${colors.textSecondary};\n }\n `,\n folderItemSelected: css`\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n \n &:hover {\n background-color: ${colors.primaryLight};\n }\n `,\n folderItemDisabled: css`\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: transparent;\n }\n `,\n folderIcon: css`\n width: 20px;\n height: 20px;\n color: #f9935e;\n flex-shrink: 0;\n `,\n folderName: css`\n font-size: ${fontSize.base};\n color: ${colors.text};\n flex: 1;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: ${colors.textSecondary};\n `,\n spinner: css`\n width: 24px;\n height: 24px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: spin 0.8s linear infinite;\n \n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n `,\n}\n\ninterface StudioFolderPickerProps {\n selectedItems: Set<string>\n currentPath: string\n onMove: (destination: string) => void\n onCancel: () => void\n}\n\nexport function StudioFolderPicker({ selectedItems, currentPath, onMove, onCancel }: StudioFolderPickerProps) {\n const [folders, setFolders] = useState<Folder[]>([])\n const [loading, setLoading] = useState(true)\n const [selectedFolder, setSelectedFolder] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadFolders() {\n try {\n const response = await fetch('/api/studio/list-folders')\n if (response.ok) {\n const data = await response.json()\n console.log('Loaded folders:', data)\n setFolders(data.folders || [])\n } else {\n console.error('Failed to load folders:', response.status, await response.text())\n }\n } catch (error) {\n console.error('Failed to load folders:', error)\n } finally {\n setLoading(false)\n }\n }\n loadFolders()\n }, [])\n\n // Filter out folders that are being moved (can't move to themselves or their children)\n // Mark current folder as disabled but still show it\n const selectedPaths = Array.from(selectedItems)\n const availableFolders = folders.filter(folder => {\n // Can't move a folder into itself or its children\n return !selectedPaths.some(selected => \n folder.path === selected || \n folder.path.startsWith(selected + '/')\n )\n })\n \n // Check if a folder is the current location (disabled)\n const isCurrentFolder = (folderPath: string) => folderPath === currentPath\n\n const handleConfirm = () => {\n if (selectedFolder) {\n onMove(selectedFolder)\n }\n }\n\n return (\n <div css={styles.overlay} onClick={onCancel}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>Move Items</h3>\n </div>\n <div css={styles.body}>\n <p css={styles.message}>\n Select a destination folder for {selectedItems.size} item{selectedItems.size !== 1 ? 's' : ''}:\n </p>\n \n {loading ? (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n ) : availableFolders.length === 0 ? (\n <div css={styles.loading}>\n No available folders to move to.\n </div>\n ) : (\n <div css={styles.folderList}>\n {availableFolders.map((folder) => {\n const disabled = isCurrentFolder(folder.path)\n return (\n <div\n key={folder.path}\n css={[\n styles.folderItem,\n selectedFolder === folder.path && styles.folderItemSelected,\n disabled && styles.folderItemDisabled\n ]}\n style={{ paddingLeft: 12 }}\n onClick={() => !disabled && setSelectedFolder(folder.path)}\n >\n {/* Render tree indent lines */}\n {folder.depth > 0 && (\n <div css={styles.treeIndent}>\n {Array.from({ length: folder.depth }).map((_, i) => (\n <div key={i} css={styles.treeLine} />\n ))}\n </div>\n )}\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <span css={styles.folderName}>\n {folder.name}\n {disabled && ' (current)'}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n <div css={styles.footer}>\n <button css={[styles.btn, styles.btnCancel]} onClick={onCancel}>\n Cancel\n </button>\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleConfirm}\n disabled={!selectedFolder}\n >\n Move Here\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css } from '@emotion/react'\nimport { colors, fontSize } from './tokens'\n\nconst ENV_TEMPLATE = `CLOUDFLARE_R2_ACCOUNT_ID=your_account_id\nCLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key\nCLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key\nCLOUDFLARE_R2_BUCKET_NAME=your_bucket_name\nCLOUDFLARE_R2_PUBLIC_URL=https://pub-xxx.r2.dev\nNEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_URL=https://pub-xxx.r2.dev`\n\ninterface R2SetupModalProps {\n isOpen: boolean\n onClose: () => void\n}\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1100;\n padding: 20px;\n `,\n modal: css`\n background: ${colors.surface};\n border-radius: 12px;\n max-width: 560px;\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);\n `,\n header: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px;\n border-bottom: 1px solid ${colors.border};\n `,\n icon: css`\n width: 32px;\n height: 32px;\n color: ${colors.primary};\n flex-shrink: 0;\n `,\n title: css`\n font-size: ${fontSize.xl};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n closeBtn: css`\n margin-left: auto;\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: ${colors.textMuted};\n border-radius: 4px;\n \n &:hover {\n color: ${colors.text};\n background: ${colors.surfaceHover};\n }\n `,\n closeIcon: css`\n width: 20px;\n height: 20px;\n `,\n content: css`\n padding: 24px;\n `,\n intro: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 20px 0;\n line-height: 1.6;\n `,\n steps: css`\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 16px;\n `,\n step: css`\n display: flex;\n gap: 12px;\n `,\n stepNumber: css`\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: ${colors.primaryLight};\n color: ${colors.primary};\n font-size: ${fontSize.sm};\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n stepContent: css`\n flex: 1;\n padding-top: 3px;\n `,\n stepTitle: css`\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n margin: 0 0 4px 0;\n `,\n stepDesc: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n line-height: 1.5;\n `,\n link: css`\n color: ${colors.primary};\n text-decoration: none;\n font-weight: 500;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n envVarsWrapper: css`\n position: relative;\n margin-top: 20px;\n `,\n envVars: css`\n background: ${colors.background};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n padding: 16px;\n padding-right: 48px;\n font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n font-size: 13px;\n line-height: 1.8;\n color: ${colors.text};\n overflow-x: auto;\n `,\n envVar: css`\n display: block;\n `,\n envKey: css`\n color: ${colors.primary};\n `,\n envValue: css`\n color: ${colors.textSecondary};\n `,\n copyBtn: css`\n position: absolute;\n top: 8px;\n right: 8px;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n color: ${colors.textMuted};\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.surfaceHover};\n color: ${colors.text};\n border-color: #d0d5dd;\n }\n `,\n copyIcon: css`\n width: 16px;\n height: 16px;\n `,\n copiedTooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n \n &::before {\n content: '';\n position: absolute;\n right: -4px;\n top: 50%;\n transform: translateY(-50%);\n border-left: 4px solid #1a1f36;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n }\n `,\n footer: css`\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n `,\n docsBtn: css`\n padding: 10px 16px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: 1px solid ${colors.border};\n background: ${colors.surface};\n color: ${colors.text};\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n \n &:hover {\n background: ${colors.surfaceHover};\n border-color: #d0d5dd;\n }\n `,\n doneBtn: css`\n padding: 10px 20px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: none;\n background: ${colors.primary};\n color: white;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n externalIcon: css`\n width: 14px;\n height: 14px;\n `,\n}\n\nexport function R2SetupModal({ isOpen, onClose }: R2SetupModalProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(ENV_TEMPLATE)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (error) {\n console.error('Failed to copy:', error)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n <h2 css={styles.title}>Set Up CDN Storage</h2>\n <button css={styles.closeBtn} onClick={onClose}>\n <svg css={styles.closeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div css={styles.content}>\n <p css={styles.intro}>\n Sync your images to Cloudflare R2 for faster global delivery. R2 offers generous free tier with no egress fees.\n </p>\n\n <ol css={styles.steps}>\n <li css={styles.step}>\n <span css={styles.stepNumber}>1</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create a Cloudflare account</h4>\n <p css={styles.stepDesc}>\n Sign up at{' '}\n <a css={styles.link} href=\"https://dash.cloudflare.com/sign-up\" target=\"_blank\" rel=\"noopener noreferrer\">\n dash.cloudflare.com\n </a>\n {' '}if you don't have one already.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>2</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create an R2 bucket</h4>\n <p css={styles.stepDesc}>\n Go to R2 in your Cloudflare dashboard and create a new bucket. Choose a name like <code>my-images</code>.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>3</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Enable public access</h4>\n <p css={styles.stepDesc}>\n In bucket settings, enable \"Public Access\" and copy the public URL (e.g., <code>https://pub-xxx.r2.dev</code>).\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>4</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Create API token</h4>\n <p css={styles.stepDesc}>\n Go to R2 → Manage R2 API Tokens → Create API Token. Select \"Object Read & Write\" permissions for your bucket.\n </p>\n </div>\n </li>\n\n <li css={styles.step}>\n <span css={styles.stepNumber}>5</span>\n <div css={styles.stepContent}>\n <h4 css={styles.stepTitle}>Add environment variables</h4>\n <p css={styles.stepDesc}>\n Add these to your <code>.env.local</code> file:\n </p>\n </div>\n </li>\n </ol>\n\n <div css={styles.envVarsWrapper}>\n <div css={styles.envVars}>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_ACCOUNT_ID</span>=<span css={styles.envValue}>your_account_id</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_ACCESS_KEY_ID</span>=<span css={styles.envValue}>your_access_key</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_SECRET_ACCESS_KEY</span>=<span css={styles.envValue}>your_secret_key</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_BUCKET_NAME</span>=<span css={styles.envValue}>your_bucket_name</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>CLOUDFLARE_R2_PUBLIC_URL</span>=<span css={styles.envValue}>https://pub-xxx.r2.dev</span>\n </span>\n <span css={styles.envVar}>\n <span css={styles.envKey}>NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_URL</span>=<span css={styles.envValue}>https://pub-xxx.r2.dev</span>\n </span>\n </div>\n <button css={styles.copyBtn} onClick={handleCopy} title=\"Copy to clipboard\">\n {copied && <span css={styles.copiedTooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div css={styles.footer}>\n <a\n css={styles.docsBtn}\n href=\"https://developers.cloudflare.com/r2/get-started/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n R2 Documentation\n <svg css={styles.externalIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n <button css={styles.doneBtn} onClick={onClose}>\n Got it\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport React, { useState, useRef, useCallback } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { colors, fontSize, fontStack, baseReset } from './tokens'\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`\n\nconst slideIn = keyframes`\n from { \n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n to { \n opacity: 1;\n transform: translateY(0) scale(1);\n }\n`\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: ${fadeIn} 0.15s ease-out;\n font-family: ${fontStack};\n `,\n modal: css`\n ${baseReset}\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n max-width: 520px;\n width: 90%;\n animation: ${slideIn} 0.2s ease-out;\n overflow: hidden;\n `,\n header: css`\n padding: 24px 24px 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n tabs: css`\n display: flex;\n gap: 0;\n margin-top: 16px;\n border-bottom: 1px solid ${colors.border};\n `,\n tab: css`\n padding: 12px 20px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.textSecondary};\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: color 0.15s;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n tabActive: css`\n color: ${colors.primary};\n \n &::after {\n content: '';\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n height: 2px;\n background-color: ${colors.primary};\n }\n `,\n body: css`\n padding: 24px;\n min-height: 200px;\n `,\n dropzone: css`\n border: 2px dashed ${colors.border};\n border-radius: 8px;\n padding: 40px 24px;\n text-align: center;\n cursor: pointer;\n transition: all 0.15s;\n \n &:hover {\n border-color: ${colors.primary};\n background-color: ${colors.primaryLight};\n }\n `,\n dropzoneActive: css`\n border-color: ${colors.primary};\n background-color: ${colors.primaryLight};\n `,\n dropzoneIcon: css`\n width: 48px;\n height: 48px;\n margin: 0 auto 16px;\n color: ${colors.textMuted};\n `,\n dropzoneText: css`\n font-size: ${fontSize.base};\n color: ${colors.text};\n margin: 0 0 4px;\n `,\n dropzoneHint: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0;\n `,\n textarea: css`\n width: 100%;\n min-height: 150px;\n padding: 12px;\n font-size: ${fontSize.sm};\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\n border: 1px solid ${colors.border};\n border-radius: 8px;\n resize: vertical;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n textareaLabel: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0 0 8px;\n `,\n footer: css`\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 24px;\n border-top: 1px solid ${colors.border};\n background-color: ${colors.background};\n `,\n btn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n letter-spacing: -0.01em;\n `,\n btnCancel: css`\n background-color: ${colors.surface};\n border: 1px solid ${colors.border};\n color: ${colors.text};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n btnConfirm: css`\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n color: white;\n \n &:hover:not(:disabled) {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n fileInput: css`\n display: none;\n `,\n selectedFiles: css`\n margin-top: 16px;\n padding: 12px;\n background-color: ${colors.background};\n border-radius: 6px;\n font-size: ${fontSize.sm};\n color: ${colors.text};\n `,\n}\n\ninterface AddNewModalProps {\n currentPath: string\n onClose: () => void\n onUploadComplete: () => void\n}\n\nexport function AddNewModal({ currentPath, onClose, onUploadComplete }: AddNewModalProps) {\n const [activeTab, setActiveTab] = useState<'upload' | 'import'>('upload')\n const [selectedFiles, setSelectedFiles] = useState<File[]>([])\n const [urlInput, setUrlInput] = useState('')\n const [isDragging, setIsDragging] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [importing, setImporting] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleFileSelect = useCallback((files: FileList | null) => {\n if (files) {\n setSelectedFiles(Array.from(files))\n }\n }, [])\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n handleFileSelect(e.dataTransfer.files)\n }, [handleFileSelect])\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return\n \n setUploading(true)\n \n try {\n for (const file of selectedFiles) {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', currentPath)\n \n await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n }\n \n onUploadComplete()\n onClose()\n } catch (error) {\n console.error('Upload failed:', error)\n } finally {\n setUploading(false)\n }\n }, [selectedFiles, currentPath, onUploadComplete, onClose])\n\n const handleImport = useCallback(async () => {\n const urls = urlInput\n .split('\\n')\n .map(url => url.trim())\n .filter(url => url.length > 0)\n \n if (urls.length === 0) return\n \n setImporting(true)\n \n try {\n const response = await fetch('/api/studio/import', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ urls }),\n })\n \n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader')\n \n const decoder = new TextDecoder()\n \n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n \n const text = decoder.decode(value)\n const lines = text.split('\\n\\n').filter(line => line.startsWith('data: '))\n \n for (const line of lines) {\n const data = JSON.parse(line.replace('data: ', ''))\n if (data.type === 'complete') {\n onUploadComplete()\n onClose()\n }\n }\n }\n } catch (error) {\n console.error('Import failed:', error)\n } finally {\n setImporting(false)\n }\n }, [urlInput, onUploadComplete, onClose])\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.modal} onClick={e => e.stopPropagation()}>\n <div css={styles.header}>\n <h3 css={styles.title}>Add New</h3>\n <div css={styles.tabs}>\n <button\n css={[styles.tab, activeTab === 'upload' && styles.tabActive]}\n onClick={() => setActiveTab('upload')}\n >\n Upload Files\n </button>\n <button\n css={[styles.tab, activeTab === 'import' && styles.tabActive]}\n onClick={() => setActiveTab('import')}\n >\n Import URLs\n </button>\n </div>\n </div>\n \n <div css={styles.body}>\n {activeTab === 'upload' ? (\n <>\n <div\n css={[styles.dropzone, isDragging && styles.dropzoneActive]}\n onClick={() => fileInputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setIsDragging(true) }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <svg css={styles.dropzoneIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n <p css={styles.dropzoneText}>\n Drop files here or click to browse\n </p>\n <p css={styles.dropzoneHint}>\n Supports images and other media files\n </p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n css={styles.fileInput}\n onChange={(e) => handleFileSelect(e.target.files)}\n />\n {selectedFiles.length > 0 && (\n <div css={styles.selectedFiles}>\n {selectedFiles.length} file{selectedFiles.length !== 1 ? 's' : ''} selected\n </div>\n )}\n </>\n ) : (\n <>\n <p css={styles.textareaLabel}>\n Paste image URLs (one per line)\n </p>\n <textarea\n css={styles.textarea}\n value={urlInput}\n onChange={(e) => setUrlInput(e.target.value)}\n placeholder={`https://cdn.example.com/photos/image1.jpg\\nhttps://cdn.example.com/photos/image2.jpg`}\n />\n </>\n )}\n </div>\n \n <div css={styles.footer}>\n <button\n css={[styles.btn, styles.btnCancel]}\n onClick={onClose}\n >\n Cancel\n </button>\n {activeTab === 'upload' ? (\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? 'Uploading...' : 'Upload'}\n </button>\n ) : (\n <button\n css={[styles.btn, styles.btnConfirm]}\n onClick={handleImport}\n disabled={!urlInput.trim() || importing}\n >\n {importing ? 'Importing...' : 'Import'}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useFileList } from '../hooks/useFileList'\nimport { colors, fontSize } from './tokens'\nimport type { FileItem } from '../types'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n `,\n spinner: css`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: ${spin} 0.8s linear infinite;\n `,\n empty: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n color: ${colors.textSecondary};\n `,\n emptyIcon: css`\n width: 48px;\n height: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n `,\n emptyText: css`\n font-size: ${fontSize.base};\n margin: 0 0 4px 0;\n \n &:last-child {\n color: ${colors.textMuted};\n font-size: ${fontSize.sm};\n }\n `,\n scanButton: css`\n margin-top: 16px;\n padding: 10px 24px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.primary};\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n grid: css`\n display: grid;\n grid-template-columns: 1fr;\n gap: 12px;\n \n @media (min-width: 480px) { grid-template-columns: repeat(2, 1fr); }\n @media (min-width: 768px) { grid-template-columns: repeat(3, 1fr); }\n @media (min-width: 1024px) { grid-template-columns: repeat(4, 1fr); }\n @media (min-width: 1280px) { grid-template-columns: repeat(5, 1fr); }\n `,\n item: css`\n position: relative;\n border-radius: 8px;\n border: 1px solid ${colors.border};\n overflow: hidden;\n cursor: pointer;\n transition: all 0.15s ease;\n background-color: ${colors.surface};\n user-select: none;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n \n &:hover {\n border-color: #d0d5dd;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);\n }\n `,\n itemSelected: css`\n border-color: ${colors.primary};\n box-shadow: 0 0 0 1px ${colors.primary};\n \n &:hover {\n border-color: ${colors.primary};\n box-shadow: 0 0 0 1px ${colors.primary};\n }\n `,\n parentItem: css`\n cursor: pointer;\n \n &:hover {\n border-color: ${colors.primary};\n }\n `,\n checkboxWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n z-index: 10;\n padding: 8px;\n cursor: pointer;\n `,\n checkbox: css`\n width: 18px;\n height: 18px;\n accent-color: ${colors.primary};\n cursor: pointer;\n `,\n content: css`\n position: relative;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: ${colors.background};\n `,\n folderIcon: css`\n width: 56px;\n height: 56px;\n color: #f9935e;\n `,\n imagesFolderIcon: css`\n width: 56px;\n height: 56px;\n color: ${colors.imagesFolder};\n `,\n imagesFolderWrapper: css`\n position: relative;\n `,\n lockIcon: css`\n position: absolute;\n bottom: 4px;\n right: 4px;\n width: 16px;\n height: 16px;\n color: ${colors.imagesFolder};\n background: white;\n border-radius: 50%;\n padding: 2px;\n `,\n parentIcon: css`\n width: 56px;\n height: 56px;\n color: ${colors.textMuted};\n `,\n fileIcon: css`\n width: 40px;\n height: 40px;\n color: ${colors.textMuted};\n `,\n image: css`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: 4px;\n `,\n noThumbnail: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 16px;\n background: ${colors.background};\n border: 2px dashed ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 80%;\n height: 60%;\n \n &:hover {\n border-color: ${colors.primary};\n background: ${colors.surfaceHover};\n }\n `,\n noThumbnailIcon: css`\n width: 32px;\n height: 32px;\n color: ${colors.textMuted};\n `,\n noThumbnailText: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n text-align: center;\n `,\n label: css`\n padding: 10px 12px;\n background-color: ${colors.surface};\n border-top: 1px solid ${colors.borderLight};\n `,\n labelRow: css`\n display: flex;\n flex-direction: column;\n gap: 2px;\n `,\n labelText: css`\n flex: 1;\n min-width: 0;\n `,\n copyBtn: css`\n position: absolute;\n top: 4px;\n right: 4px;\n z-index: 10;\n height: 28px;\n width: 28px;\n color: ${colors.textMuted};\n background: transparent;\n border: none;\n padding: 0;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n copyIcon: css`\n width: 18px;\n height: 18px;\n `,\n statusBtn: css`\n position: absolute;\n top: 4px;\n right: 28px;\n z-index: 10;\n height: 28px;\n width: 28px;\n background: transparent;\n border: none;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n cloudIcon: css`\n width: 18px;\n height: 18px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 18px;\n height: 18px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::before {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n openBtn: css`\n position: absolute;\n bottom: 8px;\n right: 8px;\n z-index: 10;\n height: 28px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n }\n `,\n name: css`\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.text};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n letter-spacing: -0.01em;\n direction: rtl;\n text-align: left;\n `,\n size: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n margin: 2px 0 0 0;\n `,\n selectAllRow: css`\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: ${colors.surface};\n border-radius: 8px;\n border: 1px solid ${colors.border};\n `,\n selectAllLabel: css`\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.textSecondary};\n cursor: pointer;\n \n &:hover {\n color: ${colors.text};\n }\n `,\n selectAllCheckbox: css`\n width: 16px;\n height: 16px;\n accent-color: ${colors.primary};\n `,\n}\n\nexport function StudioFileGrid() {\n const {\n loading,\n sortedItems,\n metaEmpty,\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n selectedItems,\n navigateUp,\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n } = useFileList()\n\n if (loading) {\n return (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n )\n }\n\n // Show scan prompt when meta is empty\n if (metaEmpty && isAtRoot) {\n return (\n <div css={styles.empty}>\n <svg css={styles.emptyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <p css={styles.emptyText}>No files tracked yet</p>\n <p css={styles.emptyText}>Click Scan to discover files in your public folder</p>\n <button \n css={styles.scanButton}\n onClick={triggerScan}\n >\n Scan for Files\n </button>\n </div>\n )\n }\n\n if (sortedItems.length === 0 && isAtRoot) {\n return (\n <div css={styles.empty}>\n <svg css={styles.emptyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <p css={styles.emptyText}>No files in this folder</p>\n <p css={styles.emptyText}>Upload images or click Scan in the toolbar</p>\n </div>\n )\n }\n\n return (\n <div>\n {sortedItems.length > 0 && (\n <div css={styles.selectAllRow}>\n <label css={styles.selectAllLabel}>\n <input\n type=\"checkbox\"\n css={styles.selectAllCheckbox}\n checked={allItemsSelected}\n ref={(el) => {\n if (el) el.indeterminate = someItemsSelected && !allItemsSelected\n }}\n onChange={handleSelectAll}\n />\n Select all ({sortedItems.length})\n </label>\n </div>\n )}\n <div css={styles.grid}>\n {/* Parent folder navigation - hide when searching */}\n {!isAtRoot && !isSearching && (\n <div \n css={[styles.item, styles.parentItem]}\n onClick={navigateUp}\n >\n <div css={styles.content}>\n <svg css={styles.parentIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6\" />\n </svg>\n </div>\n <div css={styles.label}>\n <p css={styles.name}>..</p>\n <p css={styles.size}>Parent folder</p>\n </div>\n </div>\n )}\n \n {sortedItems.map((item) => (\n <GridItem\n key={item.path}\n item={item}\n isSelected={selectedItems.has(item.path)}\n onClick={(e) => handleItemClick(item, e)}\n onOpen={() => handleOpen(item)}\n onGenerateThumbnail={() => handleGenerateThumbnail(item)}\n />\n ))}\n </div>\n </div>\n )\n}\n\ninterface GridItemProps {\n item: FileItem\n isSelected: boolean\n onClick: (e: React.MouseEvent) => void\n onOpen: () => void\n onGenerateThumbnail: () => void\n}\n\nfunction GridItem({ item, isSelected, onClick, onOpen, onGenerateThumbnail }: GridItemProps) {\n const [showCopied, setShowCopied] = useState(false)\n const isFolder = item.type === 'folder'\n const isImage = !isFolder && item.thumbnail !== undefined\n const isProtected = item.isProtected || (isFolder && item.name === 'images' && item.path === 'public/images')\n\n const handleCopyPath = (e: React.MouseEvent) => {\n e.stopPropagation()\n const pathToCopy = '/' + item.path.replace(/^public\\//, '')\n navigator.clipboard.writeText(pathToCopy)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleClick = (e: React.MouseEvent) => {\n // Protected items cannot be selected, only opened\n if (isProtected) {\n e.stopPropagation()\n onOpen()\n return\n }\n onClick(e)\n }\n\n return (\n <div \n css={[styles.item, isSelected && !isProtected && styles.itemSelected]} \n onClick={handleClick}\n >\n {!isProtected && (\n <div\n css={styles.checkboxWrapper}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={isSelected}\n onChange={() => onClick({} as React.MouseEvent)}\n />\n </div>\n )}\n\n\n <div css={styles.content}>\n {/* Cloud status icon - to the left of copy button */}\n {item.cdnPushed && !item.isRemote && (\n <span css={styles.statusBtn} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {item.isRemote && (\n <span css={styles.statusBtn} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n\n {/* Copy button - top right of image box */}\n <button\n css={styles.copyBtn}\n onClick={handleCopyPath}\n title=\"Copy file path\"\n >\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n\n {/* Open button - bottom right of image box */}\n <button\n css={styles.openBtn}\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n >\n Open\n </button>\n\n {isFolder ? (\n isProtected ? (\n <div css={styles.imagesFolderWrapper}>\n <svg css={styles.imagesFolderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <svg css={styles.lockIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n ) : (\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n )\n ) : isImage && item.thumbnail ? (\n <img\n css={styles.image}\n src={item.thumbnail}\n alt={item.name}\n loading=\"lazy\"\n />\n ) : (\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )}\n </div>\n\n <div css={styles.label}>\n <div css={styles.labelRow}>\n <div css={styles.labelText}>\n <p css={styles.name} title={item.name}>{item.name}</p>\n {isFolder ? (\n <p css={styles.size}>\n {item.fileCount !== undefined ? `${item.fileCount} files` : ''}\n {item.fileCount !== undefined && item.totalSize !== undefined ? ' · ' : ''}\n {item.totalSize !== undefined ? formatFileSize(item.totalSize) : ''}\n </p>\n ) : (\n item.size !== undefined && <p css={styles.size}>{formatFileSize(item.size)}</p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction getParentPath(path: string): string {\n const parts = path.split('/')\n parts.pop() // Remove current folder\n return parts.join('/') + '/'\n}\n\n","import { useEffect, useState, useRef, useCallback } from 'react'\nimport { useStudio } from '../components/StudioContext'\nimport { studioApi } from '../lib/api'\nimport type { FileItem } from '../types'\n\n/**\n * Shared hook for file list logic used by both Grid and List views\n * Handles loading, sorting, selection, and navigation\n */\nexport function useFileList() {\n const {\n currentPath,\n setCurrentPath,\n navigateUp,\n selectedItems,\n toggleSelection,\n selectRange,\n lastSelectedPath,\n selectAll,\n clearSelection,\n refreshKey,\n setFocusedItem,\n triggerRefresh,\n triggerScan,\n searchQuery,\n showError,\n setFileItems,\n } = useStudio()\n\n const [items, setItems] = useState<FileItem[]>([])\n const [loading, setLoading] = useState(true)\n const [metaEmpty, setMetaEmpty] = useState(false)\n const isInitialLoad = useRef(true)\n const lastPath = useRef(currentPath)\n\n // Load items when path, refresh, or search changes\n useEffect(() => {\n async function loadItems() {\n const isPathChange = lastPath.current !== currentPath\n if (isInitialLoad.current || isPathChange) {\n setLoading(true)\n }\n lastPath.current = currentPath\n\n try {\n const data = searchQuery && searchQuery.length >= 2\n ? await studioApi.search(searchQuery)\n : await studioApi.list(currentPath)\n const loadedItems = data.items || []\n setItems(loadedItems)\n setFileItems(loadedItems)\n setMetaEmpty(data.isEmpty === true)\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load items'\n showError('Load Error', message)\n setItems([])\n setFileItems([])\n setMetaEmpty(false)\n }\n\n setLoading(false)\n isInitialLoad.current = false\n }\n\n loadItems()\n }, [currentPath, refreshKey, searchQuery, showError, setFileItems])\n\n // Computed values\n const isAtRoot = currentPath === 'public'\n const isSearching = searchQuery && searchQuery.length >= 2\n\n // Sort items: folders first, then alphabetically\n const sortedItems = [...items].sort((a, b) => {\n if (a.type === 'folder' && b.type !== 'folder') return -1\n if (a.type !== 'folder' && b.type === 'folder') return 1\n return a.name.localeCompare(b.name)\n })\n\n const allItemsSelected = sortedItems.length > 0 && sortedItems.every(item => selectedItems.has(item.path))\n const someItemsSelected = sortedItems.some(item => selectedItems.has(item.path))\n\n // Handlers\n const handleItemClick = useCallback((item: FileItem, e: React.MouseEvent) => {\n if (e.shiftKey && lastSelectedPath) {\n selectRange(lastSelectedPath, item.path, sortedItems)\n } else {\n toggleSelection(item.path)\n }\n }, [lastSelectedPath, selectRange, sortedItems, toggleSelection])\n\n const handleOpen = useCallback((item: FileItem) => {\n if (item.type === 'folder') {\n setCurrentPath(item.path)\n } else {\n setFocusedItem(item)\n }\n }, [setCurrentPath, setFocusedItem])\n\n const handleGenerateThumbnail = useCallback(async (item: FileItem) => {\n try {\n const imageKey = '/' + item.path.replace(/^public\\//, '')\n await studioApi.reprocess([imageKey])\n triggerRefresh()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to generate thumbnail'\n showError('Processing Error', message)\n }\n }, [triggerRefresh, showError])\n\n const handleSelectAll = useCallback(() => {\n if (allItemsSelected) {\n clearSelection()\n } else {\n selectAll(sortedItems)\n }\n }, [allItemsSelected, clearSelection, selectAll, sortedItems])\n\n return {\n // State\n items,\n loading,\n sortedItems,\n metaEmpty,\n\n // Computed\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n\n // Context values\n currentPath,\n selectedItems,\n navigateUp,\n\n // Handlers\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n }\n}\n","/**\n * Typed API client for Studio\n * Provides type-safe methods for all Studio API endpoints\n */\n\nimport type { FileItem, LeanMeta, LeanImageEntry } from '../types'\n\n// Response types\ninterface ListResponse {\n items: FileItem[]\n isEmpty?: boolean\n}\n\ninterface FoldersResponse {\n folders: { path: string; name: string; depth: number }[]\n}\n\ninterface CountImagesResponse {\n count: number\n images: string[]\n}\n\ninterface UploadResponse {\n success: boolean\n imageKey?: string\n entry?: LeanImageEntry\n path?: string\n message?: string\n error?: string\n}\n\ninterface DeleteResponse {\n success: boolean\n deleted: string[]\n errors?: string[]\n}\n\ninterface PushResponse {\n success: boolean\n pushed: string[]\n errors?: string[]\n}\n\ninterface ReprocessResponse {\n success: boolean\n processed: string[]\n errors?: string[]\n}\n\ninterface CreateFolderResponse {\n success: boolean\n path: string\n error?: string\n}\n\ninterface RenameResponse {\n success: boolean\n newPath: string\n error?: string\n}\n\ninterface MoveResponse {\n success: boolean\n moved: string[]\n errors?: string[]\n}\n\nclass StudioApiClient {\n private async get<T>(url: string): Promise<T> {\n const response = await fetch(url)\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Request failed: ${response.status}`)\n }\n return response.json()\n }\n\n private async post<T>(url: string, body?: object): Promise<T> {\n const response = await fetch(url, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Request failed: ${response.status}`)\n }\n return response.json()\n }\n\n // List handlers\n async list(path: string = 'public'): Promise<ListResponse> {\n return this.get(`/api/studio/list?path=${encodeURIComponent(path)}`)\n }\n\n async search(query: string): Promise<ListResponse> {\n return this.get(`/api/studio/search?q=${encodeURIComponent(query)}`)\n }\n\n async listFolders(): Promise<FoldersResponse> {\n return this.get('/api/studio/list-folders')\n }\n\n async countImages(): Promise<CountImagesResponse> {\n return this.get('/api/studio/count-images')\n }\n\n async folderImages(folders: string[]): Promise<CountImagesResponse> {\n return this.get(`/api/studio/folder-images?folders=${encodeURIComponent(folders.join(','))}`)\n }\n\n // File handlers\n async upload(file: File, targetPath: string = 'public'): Promise<UploadResponse> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('path', targetPath)\n\n const response = await fetch('/api/studio/upload', {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}))\n throw new Error(data.error || `Upload failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async delete(paths: string[]): Promise<DeleteResponse> {\n return this.post('/api/studio/delete', { paths })\n }\n\n async createFolder(parentPath: string, name: string): Promise<CreateFolderResponse> {\n return this.post('/api/studio/create-folder', { parentPath, name })\n }\n\n async rename(oldPath: string, newName: string): Promise<RenameResponse> {\n return this.post('/api/studio/rename', { oldPath, newName })\n }\n\n async move(paths: string[], destination: string): Promise<MoveResponse> {\n return this.post('/api/studio/move', { paths, destination })\n }\n\n // Image handlers\n async push(imageKeys: string[]): Promise<PushResponse> {\n return this.post('/api/studio/sync', { imageKeys })\n }\n\n async reprocess(imageKeys: string[]): Promise<ReprocessResponse> {\n return this.post('/api/studio/reprocess', { imageKeys })\n }\n\n // Process all returns a stream, handle separately\n processAllStream(): EventSource {\n return new EventSource('/api/studio/process-all')\n }\n}\n\nexport const studioApi = new StudioApiClient()\n\n// Export types for consumers\nexport type {\n ListResponse,\n FoldersResponse,\n CountImagesResponse,\n UploadResponse,\n DeleteResponse,\n PushResponse,\n ReprocessResponse,\n CreateFolderResponse,\n RenameResponse,\n MoveResponse,\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css, keyframes } from '@emotion/react'\nimport { useFileList } from '../hooks/useFileList'\nimport { colors, fontSize } from './tokens'\nimport type { FileItem } from '../types'\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst styles = {\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n `,\n spinner: css`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid ${colors.border};\n border-top-color: ${colors.primary};\n animation: ${spin} 0.8s linear infinite;\n `,\n empty: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 300px;\n color: ${colors.textSecondary};\n `,\n emptyHint: css`\n font-size: ${fontSize.sm};\n color: ${colors.textMuted};\n margin-top: 4px;\n `,\n scanButton: css`\n margin-top: 16px;\n padding: 10px 24px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.primary};\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover:not(:disabled) {\n background: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n tableWrapper: css`\n background: ${colors.surface};\n border-radius: 8px;\n border: 1px solid ${colors.border};\n overflow-x: auto;\n `,\n table: css`\n width: 100%;\n min-width: 600px;\n border-collapse: collapse;\n white-space: nowrap;\n `,\n th: css`\n text-align: left;\n font-size: 11px;\n color: ${colors.textMuted};\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 12px 16px;\n font-weight: 600;\n background: ${colors.background};\n border-bottom: 1px solid ${colors.border};\n `,\n thCheckbox: css`\n width: 48px;\n `,\n thSize: css`\n width: 96px;\n `,\n thDimensions: css`\n width: 128px;\n `,\n thCdn: css`\n width: 96px;\n `,\n tbody: css``,\n row: css`\n cursor: pointer;\n transition: background-color 0.15s ease;\n user-select: none;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n \n &:not(:last-child) td {\n border-bottom: 1px solid ${colors.borderLight};\n }\n `,\n rowSelected: css`\n background-color: ${colors.primaryLight};\n \n &:hover {\n background-color: ${colors.primaryLight};\n }\n `,\n parentRow: css`\n cursor: pointer;\n border-bottom: 1px solid ${colors.border};\n \n &:hover {\n background-color: ${colors.surfaceHover};\n }\n `,\n td: css`\n padding: 12px 16px;\n `,\n checkboxCell: css`\n padding: 12px 16px;\n cursor: pointer;\n vertical-align: middle;\n `,\n checkbox: css`\n width: 18px;\n height: 18px;\n accent-color: ${colors.primary};\n cursor: pointer;\n display: block;\n `,\n actionsCell: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-left: auto;\n flex-shrink: 0;\n `,\n copyBtn: css`\n position: relative;\n flex-shrink: 0;\n height: 32px;\n width: 32px;\n font-size: ${fontSize.xs};\n color: ${colors.textSecondary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n color: ${colors.text};\n }\n `,\n copyIcon: css`\n width: 16px;\n height: 16px;\n `,\n statusBtn: css`\n flex-shrink: 0;\n height: 32px;\n width: 32px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n `,\n cloudIcon: css`\n width: 16px;\n height: 16px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 16px;\n height: 16px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n nameCell: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n `,\n thumbnailWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n folderIconWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n folderIcon: css`\n width: 24px;\n height: 24px;\n color: #f9935e;\n `,\n imagesFolderWrapper: css`\n width: 48px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n position: relative;\n align-items: center;\n `,\n imagesFolderIcon: css`\n width: 24px;\n height: 24px;\n color: ${colors.imagesFolder};\n `,\n lockIcon: css`\n width: 10px;\n height: 10px;\n color: ${colors.imagesFolder};\n margin-left: -6px;\n margin-top: 8px;\n `,\n parentIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textMuted};\n flex-shrink: 0;\n `,\n fileIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textMuted};\n flex-shrink: 0;\n `,\n thumbnail: css`\n max-width: 100%;\n max-height: 100%;\n width: auto;\n height: auto;\n object-fit: contain;\n border-radius: 4px;\n border: 1px solid ${colors.borderLight};\n `,\n noThumbnail: css`\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.background};\n border: 1px dashed ${colors.border};\n border-radius: 4px;\n flex-shrink: 0;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n border-color: ${colors.primary};\n background: ${colors.surfaceHover};\n }\n `,\n noThumbnailIcon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textMuted};\n `,\n name: css`\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n letter-spacing: -0.01em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 300px;\n `,\n meta: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n `,\n cdnBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: ${colors.success};\n `,\n cdnBadgeRemote: css`\n display: inline-flex;\n align-items: center;\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: #ef4444;\n `,\n cdnIcon: css`\n width: 12px;\n height: 12px;\n `,\n cdnEmpty: css`\n font-size: ${fontSize.sm};\n color: ${colors.textMuted};\n `,\n openBtn: css`\n height: 32px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n padding: 0 14px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n \n &:hover {\n background-color: ${colors.primaryLight};\n border-color: ${colors.primary};\n }\n `,\n}\n\nexport function StudioFileList() {\n const {\n loading,\n sortedItems,\n metaEmpty,\n isAtRoot,\n isSearching,\n allItemsSelected,\n someItemsSelected,\n selectedItems,\n navigateUp,\n handleItemClick,\n handleOpen,\n handleGenerateThumbnail,\n handleSelectAll,\n triggerScan,\n } = useFileList()\n\n if (loading) {\n return (\n <div css={styles.loading}>\n <div css={styles.spinner} />\n </div>\n )\n }\n\n if (metaEmpty && isAtRoot) {\n return (\n <div css={styles.empty}>\n <p>No files tracked yet</p>\n <p css={styles.emptyHint}>Click Scan to discover files in your public folder</p>\n <button \n css={styles.scanButton}\n onClick={triggerScan}\n >\n Scan for Files\n </button>\n </div>\n )\n }\n\n if (sortedItems.length === 0 && isAtRoot) {\n return (\n <div css={styles.empty}>\n <p>No files in this folder</p>\n <p css={styles.emptyHint}>Upload images or click Scan in the toolbar</p>\n </div>\n )\n }\n\n return (\n <div css={styles.tableWrapper}>\n <table css={styles.table}>\n <thead>\n <tr>\n <th css={[styles.th, styles.thCheckbox]}>\n {sortedItems.length > 0 && (\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={allItemsSelected}\n ref={(el) => {\n if (el) el.indeterminate = someItemsSelected && !allItemsSelected\n }}\n onChange={handleSelectAll}\n />\n )}\n </th>\n <th css={styles.th}>Name</th>\n <th css={[styles.th, styles.thSize]}>Size</th>\n <th css={[styles.th, styles.thDimensions]}>Dimensions</th>\n <th css={[styles.th, styles.thCdn]}>CDN</th>\n </tr>\n </thead>\n <tbody css={styles.tbody}>\n {/* Parent folder navigation - hide when searching */}\n {!isAtRoot && !isSearching && (\n <tr css={styles.parentRow} onClick={navigateUp}>\n <td css={styles.td}></td>\n <td css={styles.td}>\n <div css={styles.nameCell}>\n <svg css={styles.parentIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6\" />\n </svg>\n <span css={styles.name}>..</span>\n </div>\n </td>\n <td css={[styles.td, styles.meta]}>--</td>\n <td css={[styles.td, styles.meta]}>Parent folder</td>\n <td css={styles.td}>--</td>\n </tr>\n )}\n \n {sortedItems.map((item) => (\n <ListRow\n key={item.path}\n item={item}\n isSelected={selectedItems.has(item.path)}\n onClick={(e) => handleItemClick(item, e)}\n onOpen={() => handleOpen(item)}\n onGenerateThumbnail={() => handleGenerateThumbnail(item)}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\ninterface ListRowProps {\n item: FileItem\n isSelected: boolean\n onClick: (e: React.MouseEvent) => void\n onOpen: () => void\n onGenerateThumbnail: () => void\n}\n\nfunction ListRow({ item, isSelected, onClick, onOpen, onGenerateThumbnail }: ListRowProps) {\n const [showCopied, setShowCopied] = useState(false)\n const isFolder = item.type === 'folder'\n const isImage = !isFolder && item.thumbnail !== undefined\n const isProtected = item.isProtected || (isFolder && item.name === 'images' && item.path === 'public/images')\n\n const handleCopyPath = (e: React.MouseEvent) => {\n e.stopPropagation()\n const pathToCopy = '/' + item.path.replace(/^public\\//, '')\n navigator.clipboard.writeText(pathToCopy)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleClick = (e: React.MouseEvent) => {\n // Protected items cannot be selected, only opened\n if (isProtected) {\n e.stopPropagation()\n onOpen()\n return\n }\n onClick(e)\n }\n\n return (\n <tr \n css={[styles.row, isSelected && !isProtected && styles.rowSelected]} \n onClick={handleClick}\n >\n <td\n css={[styles.td, styles.checkboxCell]}\n onClick={(e) => e.stopPropagation()}\n >\n {!isProtected && (\n <input\n type=\"checkbox\"\n css={styles.checkbox}\n checked={isSelected}\n onChange={() => onClick({} as React.MouseEvent)}\n />\n )}\n </td>\n <td css={styles.td}>\n <div css={styles.nameCell}>\n {isFolder ? (\n isProtected ? (\n <div css={styles.imagesFolderWrapper}>\n <svg css={styles.imagesFolderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n <svg css={styles.lockIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n ) : (\n <div css={styles.folderIconWrapper}>\n <svg css={styles.folderIcon} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M10 4H4a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2h-8l-2-2z\" />\n </svg>\n </div>\n )\n ) : isImage && item.thumbnail ? (\n <div css={styles.thumbnailWrapper}>\n <img css={styles.thumbnail} src={item.thumbnail} alt={item.name} loading=\"lazy\" />\n </div>\n ) : (\n <div css={styles.thumbnailWrapper}>\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n </div>\n )}\n <span css={styles.name} title={item.name}>{truncateMiddle(item.name)}</span>\n <div css={styles.actionsCell}>\n {/* Cloud status icon */}\n {item.cdnPushed && !item.isRemote && (\n <span css={styles.statusBtn} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {item.isRemote && (\n <span css={styles.statusBtn} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n <button\n css={styles.copyBtn}\n onClick={handleCopyPath}\n title=\"Copy file path\"\n >\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <button\n css={styles.openBtn}\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n >\n Open\n </button>\n </div>\n </div>\n </td>\n <td css={[styles.td, styles.meta]}>\n {isFolder \n ? (item.fileCount !== undefined ? `${item.fileCount} files` : '--')\n : (item.size !== undefined ? formatFileSize(item.size) : '--')\n }\n </td>\n <td css={[styles.td, styles.meta]}>\n {isFolder \n ? (item.totalSize !== undefined ? formatFileSize(item.totalSize) : '--')\n : (item.dimensions ? `${item.dimensions.width}x${item.dimensions.height}` : '--')\n }\n </td>\n <td css={styles.td}>\n {item.cdnPushed ? (\n item.isRemote ? (\n <span css={styles.cdnBadgeRemote}>Remote</span>\n ) : (\n <span css={styles.cdnBadge}>\n <svg css={styles.cdnIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n Pushed\n </span>\n )\n ) : (\n <span css={styles.cdnEmpty}>--</span>\n )}\n </td>\n </tr>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction getParentPath(path: string): string {\n const parts = path.split('/')\n parts.pop() // Remove current folder\n return parts.join('/') + '/'\n}\n\nfunction truncateMiddle(str: string, maxLength: number = 32): string {\n if (str.length <= maxLength) return str\n \n // Find the extension\n const lastDot = str.lastIndexOf('.')\n const ext = lastDot > 0 ? str.substring(lastDot) : ''\n const name = lastDot > 0 ? str.substring(0, lastDot) : str\n \n // Calculate how much we can show of the name\n const availableLength = maxLength - ext.length - 3 // 3 for \"...\"\n if (availableLength < 6) {\n // Too short, just truncate from end\n return str.substring(0, maxLength - 3) + '...'\n }\n \n const startLength = Math.ceil(availableLength / 2)\n const endLength = Math.floor(availableLength / 2)\n \n return name.substring(0, startLength) + '...' + name.substring(name.length - endLength) + ext\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState } from 'react'\nimport { css } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { ConfirmModal, AlertModal, InputModal, ProgressModal, type ProgressState } from './StudioModal'\nimport { R2SetupModal } from './R2SetupModal'\nimport { StudioFolderPicker } from './StudioFolderPicker'\nimport { colors, fontSize } from './tokens'\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.ico', '.bmp', '.tiff', '.tif']\nconst VIDEO_EXTENSIONS = ['.mp4', '.webm', '.mov', '.avi', '.mkv', '.m4v']\n\nfunction isImageFile(filename: string): boolean {\n const ext = filename.toLowerCase().substring(filename.lastIndexOf('.'))\n return IMAGE_EXTENSIONS.includes(ext)\n}\n\nfunction isVideoFile(filename: string): boolean {\n const ext = filename.toLowerCase().substring(filename.lastIndexOf('.'))\n return VIDEO_EXTENSIONS.includes(ext)\n}\n\nconst styles = {\n overlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 100;\n display: flex;\n background: transparent;\n `,\n container: css`\n display: flex;\n flex: 1;\n margin: 24px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);\n `,\n main: css`\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: ${colors.background};\n overflow: auto;\n `,\n headerButtons: css`\n position: absolute;\n top: 16px;\n right: 16px;\n display: flex;\n gap: 8px;\n z-index: 10;\n `,\n copyBtn: css`\n position: relative;\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n copyIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textSecondary};\n `,\n statusIcon: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n `,\n cloudIcon: css`\n width: 20px;\n height: 20px;\n color: #f59e0b;\n `,\n globeIcon: css`\n width: 20px;\n height: 20px;\n color: #ef4444;\n `,\n tooltip: css`\n position: absolute;\n right: 100%;\n top: 50%;\n transform: translateY(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-right: 8px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border: 4px solid transparent;\n border-left-color: #1a1f36;\n }\n `,\n mainCloseBtn: css`\n padding: 8px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n mainCloseIcon: css`\n width: 20px;\n height: 20px;\n color: ${colors.textSecondary};\n `,\n mediaWrapper: css`\n max-width: 100%;\n max-height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n image: css`\n max-width: 100%;\n max-height: calc(100vh - 200px);\n object-fit: contain;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n `,\n video: css`\n max-width: 100%;\n max-height: calc(100vh - 200px);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n `,\n filePlaceholder: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n background: ${colors.surface};\n border-radius: 12px;\n border: 1px solid ${colors.border};\n `,\n fileIcon: css`\n width: 80px;\n height: 80px;\n color: ${colors.textMuted};\n margin-bottom: 16px;\n `,\n fileName: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n sidebar: css`\n width: 280px;\n background: ${colors.surface};\n border-left: 1px solid ${colors.border};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n `,\n sidebarHeader: css`\n padding: 16px 20px;\n border-bottom: 1px solid ${colors.border};\n `,\n sidebarTitle: css`\n font-size: ${fontSize.base};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n sidebarContent: css`\n flex: 1;\n padding: 20px;\n overflow: auto;\n `,\n info: css`\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 24px;\n `,\n infoRow: css`\n display: flex;\n justify-content: space-between;\n font-size: ${fontSize.sm};\n `,\n infoLabel: css`\n color: ${colors.textSecondary};\n `,\n infoValue: css`\n color: ${colors.text};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n infoValueWrap: css`\n color: ${colors.text};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n word-break: break-all;\n white-space: normal;\n `,\n infoLink: css`\n color: ${colors.primary};\n font-weight: 500;\n text-align: right;\n max-width: 160px;\n word-break: break-all;\n white-space: normal;\n text-decoration: none;\n \n &:hover {\n text-decoration: underline;\n }\n `,\n actions: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `,\n actionBtn: css`\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 12px 14px;\n font-size: ${fontSize.base};\n font-weight: 500;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: ${colors.text};\n text-align: left;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n actionBtnDanger: css`\n color: ${colors.danger};\n \n &:hover {\n background-color: ${colors.dangerLight};\n border-color: ${colors.danger};\n }\n `,\n actionIcon: css`\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n `,\n}\n\nexport function StudioDetailView() {\n const { focusedItem, setFocusedItem, triggerRefresh, clearSelection } = useStudio()\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)\n const [showRenameModal, setShowRenameModal] = useState(false)\n const [showMoveModal, setShowMoveModal] = useState(false)\n const [showProcessConfirm, setShowProcessConfirm] = useState(false)\n const [showR2SetupModal, setShowR2SetupModal] = useState(false)\n const [processProgress, setProcessProgress] = useState<ProgressState | null>(null)\n const [alertMessage, setAlertMessage] = useState<{ title: string; message: string } | null>(null)\n const [showCopied, setShowCopied] = useState(false)\n const [pushing, setPushing] = useState(false)\n const [moving, setMoving] = useState(false)\n\n if (!focusedItem) return null\n\n const isImage = isImageFile(focusedItem.name)\n const isVideo = isVideoFile(focusedItem.name)\n const relativePath = '/' + focusedItem.path.replace(/^public\\//, '')\n \n // For preview: use CDN URL if pushed, otherwise use local path\n const imageSrc = focusedItem.cdnPushed && focusedItem.cdnBaseUrl\n ? `${focusedItem.cdnBaseUrl}${relativePath}`\n : relativePath\n \n // For display URL: use CDN URL if pushed, otherwise use current origin\n const localOrigin = typeof window !== 'undefined' ? window.location.origin : ''\n const fullUrl = focusedItem.cdnPushed && focusedItem.cdnBaseUrl \n ? `${focusedItem.cdnBaseUrl}${relativePath}`\n : `${localOrigin}${relativePath}`\n\n const handleClose = () => {\n setFocusedItem(null)\n }\n\n const handleCopyPath = () => {\n navigator.clipboard.writeText(fullUrl)\n setShowCopied(true)\n setTimeout(() => setShowCopied(false), 1500)\n }\n\n const handleRename = async (newName: string) => {\n setShowRenameModal(false)\n if (newName && newName !== focusedItem.name) {\n try {\n const response = await fetch('/api/studio/rename', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n oldPath: focusedItem.path,\n newName: newName,\n }),\n })\n \n if (response.ok) {\n triggerRefresh()\n setFocusedItem(null)\n } else {\n const data = await response.json()\n setAlertMessage({\n title: 'Rename Failed',\n message: data.error || 'Failed to rename file',\n })\n }\n } catch (error) {\n console.error('Rename error:', error)\n setAlertMessage({\n title: 'Rename Failed',\n message: 'An error occurred while renaming the file',\n })\n }\n }\n }\n\n const handleDelete = async () => {\n setShowDeleteConfirm(false)\n try {\n const response = await fetch('/api/studio/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: [focusedItem.path] }),\n })\n\n if (response.ok) {\n clearSelection()\n triggerRefresh()\n setFocusedItem(null)\n } else {\n const error = await response.json()\n setAlertMessage({\n title: 'Delete Failed',\n message: error.error || 'Unknown error',\n })\n }\n } catch (error) {\n console.error('Delete error:', error)\n setAlertMessage({\n title: 'Delete Failed',\n message: 'Delete failed. Check console for details.',\n })\n }\n }\n\n const handleMove = async (destination: string) => {\n setShowMoveModal(false)\n setMoving(true)\n \n try {\n const response = await fetch('/api/studio/move', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ paths: [focusedItem.path], destination }),\n })\n\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n try {\n const data = JSON.parse(line.slice(6))\n\n if (data.type === 'complete') {\n if (data.errors > 0 && data.errorMessages?.length > 0) {\n setAlertMessage({\n title: 'Move Failed',\n message: data.errorMessages.join('\\n'),\n })\n } else {\n clearSelection()\n triggerRefresh()\n setFocusedItem(null)\n }\n } else if (data.type === 'error') {\n setAlertMessage({\n title: 'Move Failed',\n message: data.message || 'Unknown error',\n })\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n } catch (error) {\n console.error('Move error:', error)\n setAlertMessage({\n title: 'Move Failed',\n message: 'Failed to move file. Check console for details.',\n })\n } finally {\n setMoving(false)\n }\n }\n\n const handleSync = async () => {\n const imageKey = '/' + focusedItem.path.replace(/^public\\//, '')\n \n setPushing(true)\n \n try {\n const response = await fetch('/api/studio/sync', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageKeys: [imageKey] }),\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setAlertMessage({\n title: 'Push Complete',\n message: 'Successfully pushed to CDN.',\n })\n triggerRefresh()\n } else {\n // Check if it's an R2 configuration error\n if (data.error?.includes('R2 not configured') || data.error?.includes('CLOUDFLARE_R2')) {\n setShowR2SetupModal(true)\n } else {\n setAlertMessage({\n title: 'Push Failed',\n message: data.error || 'Failed to push to CDN.',\n })\n }\n }\n } catch (error) {\n console.error('Push error:', error)\n setAlertMessage({\n title: 'Push Failed',\n message: 'Failed to push to CDN. Check console for details.',\n })\n } finally {\n setPushing(false)\n }\n }\n\n const handleProcessImage = async () => {\n setShowProcessConfirm(false)\n \n setProcessProgress({\n current: 0,\n total: 1,\n percent: 0,\n status: 'processing',\n currentFile: focusedItem.name,\n })\n\n try {\n const imageKey = focusedItem.path.replace(/^public\\//, '')\n const formattedKey = imageKey.startsWith('/') ? imageKey : `/${imageKey}`\n const response = await fetch('/api/studio/reprocess', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n imageKeys: [formattedKey],\n }),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n throw new Error(data.error || 'Processing failed')\n }\n\n if (data.processed?.length > 0) {\n setProcessProgress({\n current: 1,\n total: 1,\n percent: 100,\n status: 'complete',\n message: `Processed ${focusedItem.name}`,\n })\n } else if (data.errors?.length > 0) {\n setProcessProgress({\n current: 0,\n total: 1,\n percent: 0,\n status: 'error',\n message: `Failed to process: ${data.errors.join(', ')}`,\n })\n }\n\n triggerRefresh()\n } catch (error) {\n console.error('Process error:', error)\n setProcessProgress({\n current: 0,\n total: 1,\n percent: 0,\n status: 'error',\n message: error instanceof Error ? error.message : 'Failed to process image',\n })\n }\n }\n\n const renderMedia = () => {\n if (isImage) {\n return <img css={styles.image} src={imageSrc} alt={focusedItem.name} />\n }\n if (isVideo) {\n return <video css={styles.video} src={imageSrc} controls />\n }\n return (\n <div css={styles.filePlaceholder}>\n <svg css={styles.fileIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n <p css={styles.fileName}>{focusedItem.name}</p>\n </div>\n )\n }\n\n return (\n <>\n {showDeleteConfirm && (\n <ConfirmModal\n title=\"Delete File\"\n message={`Are you sure you want to delete \"${focusedItem.name}\"? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n variant=\"danger\"\n onConfirm={handleDelete}\n onCancel={() => setShowDeleteConfirm(false)}\n />\n )}\n\n {alertMessage && (\n <AlertModal\n title={alertMessage.title}\n message={alertMessage.message}\n onClose={() => setAlertMessage(null)}\n />\n )}\n\n <R2SetupModal\n isOpen={showR2SetupModal}\n onClose={() => setShowR2SetupModal(false)}\n />\n\n {showRenameModal && (\n <InputModal\n title=\"Rename File\"\n message=\"Enter a new name for the file:\"\n defaultValue={focusedItem.name}\n placeholder=\"Enter new filename\"\n confirmLabel=\"Rename\"\n onConfirm={handleRename}\n onCancel={() => setShowRenameModal(false)}\n />\n )}\n\n {showMoveModal && (\n <StudioFolderPicker\n selectedItems={new Set([focusedItem.path])}\n currentPath={focusedItem.path.split('/').slice(0, -1).join('/')}\n onMove={handleMove}\n onCancel={() => setShowMoveModal(false)}\n />\n )}\n\n {showProcessConfirm && (\n <ConfirmModal\n title=\"Process Image\"\n message={`Generate thumbnails for \"${focusedItem.name}\"?`}\n confirmLabel=\"Process\"\n onConfirm={handleProcessImage}\n onCancel={() => setShowProcessConfirm(false)}\n />\n )}\n\n {processProgress && (\n <ProgressModal\n title=\"Processing Image\"\n progress={processProgress}\n onClose={() => setProcessProgress(null)}\n />\n )}\n\n <div css={styles.overlay} onClick={handleClose}>\n <div css={styles.container} onClick={(e) => e.stopPropagation()}>\n <div css={styles.main}>\n <div css={styles.headerButtons}>\n {/* Cloud status icons */}\n {focusedItem.cdnPushed && !focusedItem.isRemote && (\n <span css={styles.statusIcon} title=\"Pushed to CDN\">\n <svg css={styles.cloudIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n </span>\n )}\n {focusedItem.isRemote && (\n <span css={styles.statusIcon} title=\"Remote image\">\n <svg css={styles.globeIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n </span>\n )}\n <button css={styles.copyBtn} onClick={handleCopyPath} title=\"Copy file path\">\n {showCopied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <button css={styles.mainCloseBtn} onClick={handleClose} aria-label=\"Close\">\n <svg css={styles.mainCloseIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div css={styles.mediaWrapper}>\n {renderMedia()}\n </div>\n </div>\n\n <div css={styles.sidebar}>\n <div css={styles.sidebarHeader}>\n <h3 css={styles.sidebarTitle}>Details</h3>\n </div>\n\n <div css={styles.sidebarContent}>\n <div css={styles.info}>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Name</span>\n <span css={styles.infoValueWrap}>{focusedItem.name}</span>\n </div>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Path</span>\n <span css={styles.infoValueWrap}>{focusedItem.path.replace(/^public\\//, '')}</span>\n </div>\n {focusedItem.size !== undefined && (\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Size</span>\n <span css={styles.infoValue}>{formatFileSize(focusedItem.size)}</span>\n </div>\n )}\n {focusedItem.dimensions && (\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>Dimensions</span>\n <span css={styles.infoValue}>{focusedItem.dimensions.width} × {focusedItem.dimensions.height}</span>\n </div>\n )}\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>CDN Status</span>\n <span css={styles.infoValue}>\n {focusedItem.cdnPushed \n ? (focusedItem.isRemote ? 'Remote' : 'Pushed')\n : 'Local'}\n </span>\n </div>\n <div css={styles.infoRow}>\n <span css={styles.infoLabel}>URL</span>\n <a \n href={fullUrl} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n css={styles.infoLink}\n title={fullUrl}\n >\n {fullUrl}\n </a>\n </div>\n </div>\n\n <div css={styles.actions}>\n <button css={styles.actionBtn} onClick={() => setShowRenameModal(true)}>\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n Rename\n </button>\n <button \n css={styles.actionBtn} \n onClick={() => setShowMoveModal(true)}\n disabled={moving}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n {moving ? 'Moving...' : 'Move'}\n </button>\n <button \n css={styles.actionBtn} \n onClick={handleSync} \n disabled={pushing || (focusedItem.cdnPushed && !focusedItem.isRemote)}\n title={focusedItem.cdnPushed && !focusedItem.isRemote ? 'Already in R2' : undefined}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n {pushing ? 'Pushing...' : 'Push to CDN'}\n </button>\n <button \n css={styles.actionBtn} \n onClick={() => setShowProcessConfirm(true)}\n >\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n Process Image\n </button>\n <button css={[styles.actionBtn, styles.actionBtnDanger]} onClick={() => setShowDeleteConfirm(true)}>\n <svg css={styles.actionIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { css } from '@emotion/react'\nimport { colors, fontSize, baseReset } from './tokens'\nimport { useStudio } from './StudioContext'\n\n// Standard button height for consistency\nconst btnHeight = '36px'\n\nconst styles = {\n btn: css`\n height: ${btnHeight};\n padding: 0 12px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n icon: css`\n width: 16px;\n height: 16px;\n color: ${colors.textSecondary};\n `,\n overlay: css`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(26, 31, 54, 0.4);\n backdrop-filter: blur(4px);\n `,\n panel: css`\n ${baseReset}\n position: relative;\n background-color: ${colors.surface};\n border-radius: 12px;\n box-shadow: 0 30px 60px -12px rgba(50, 50, 93, 0.25), 0 18px 36px -18px rgba(0, 0, 0, 0.3);\n width: 100%;\n max-width: 512px;\n padding: 24px;\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n `,\n title: css`\n font-size: ${fontSize.xl};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n letter-spacing: -0.02em;\n `,\n closeBtn: css`\n padding: 6px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n sections: css`\n display: flex;\n flex-direction: column;\n gap: 24px;\n `,\n sectionTitle: css`\n font-size: ${fontSize.base};\n font-weight: 600;\n color: ${colors.text};\n margin: 0 0 12px 0;\n `,\n description: css`\n font-size: ${fontSize.sm};\n color: ${colors.textSecondary};\n margin: 0 0 12px 0;\n `,\n codeWrapper: css`\n position: relative;\n `,\n code: css`\n background-color: ${colors.background};\n border-radius: 8px;\n padding: 12px;\n padding-right: 40px;\n font-family: 'SF Mono', Monaco, Consolas, monospace;\n font-size: ${fontSize.xs};\n color: ${colors.textSecondary};\n border: 1px solid ${colors.border};\n overflow-x: auto;\n white-space: nowrap;\n `,\n copyBtn: css`\n position: absolute;\n top: 8px;\n right: 8px;\n padding: 4px;\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n tooltip: css`\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: #1a1f36;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n margin-bottom: 6px;\n pointer-events: none;\n z-index: 100;\n \n &::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: #1a1f36;\n }\n `,\n copyIcon: css`\n width: 14px;\n height: 14px;\n color: ${colors.textSecondary};\n `,\n codeLine: css`\n margin: 0 0 4px 0;\n \n &:last-child {\n margin: 0;\n }\n `,\n input: css`\n width: 100%;\n padding: 10px 14px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.base};\n color: ${colors.text};\n background: ${colors.surface};\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n \n &::placeholder {\n color: ${colors.textMuted};\n }\n `,\n grid: css`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n `,\n label: css`\n font-size: ${fontSize.xs};\n font-weight: 500;\n color: ${colors.textSecondary};\n display: block;\n margin-bottom: 6px;\n `,\n footer: css`\n margin-top: 24px;\n padding-top: 20px;\n border-top: 1px solid ${colors.border};\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n `,\n cancelBtn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: ${colors.text};\n background: ${colors.surface};\n border: 1px solid ${colors.border};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n background-color: ${colors.surfaceHover};\n border-color: ${colors.borderHover};\n }\n `,\n saveBtn: css`\n padding: 10px 18px;\n font-size: ${fontSize.base};\n font-weight: 500;\n color: white;\n background-color: ${colors.primary};\n border: 1px solid ${colors.primary};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n \n &:hover {\n background-color: ${colors.primaryHover};\n border-color: ${colors.primaryHover};\n }\n \n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `,\n cdnList: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `,\n cdnRow: css`\n display: flex;\n gap: 8px;\n align-items: center;\n `,\n cdnInput: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${colors.border};\n border-radius: 6px;\n font-size: ${fontSize.sm};\n color: ${colors.text};\n background: ${colors.surface};\n transition: all 0.15s ease;\n \n &:focus {\n outline: none;\n border-color: ${colors.primary};\n box-shadow: 0 0 0 3px ${colors.primaryLight};\n }\n `,\n cdnIndex: css`\n font-size: ${fontSize.xs};\n color: ${colors.textMuted};\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n `,\n cdnDeleteBtn: css`\n padding: 6px;\n background: none;\n border: none;\n cursor: pointer;\n color: ${colors.textMuted};\n transition: color 0.15s;\n flex-shrink: 0;\n \n &:hover {\n color: ${colors.danger};\n }\n `,\n cdnAddBtn: css`\n padding: 8px 12px;\n font-size: ${fontSize.sm};\n font-weight: 500;\n color: ${colors.primary};\n background: ${colors.primaryLight};\n border: 1px dashed ${colors.primary};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n margin-top: 8px;\n \n &:hover {\n background: ${colors.surface};\n }\n `,\n warning: css`\n font-size: ${fontSize.xs};\n color: ${colors.danger};\n margin-top: 8px;\n padding: 8px 12px;\n background: ${colors.dangerLight};\n border-radius: 6px;\n `,\n}\n\nexport function StudioSettings() {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n <>\n <button css={styles.btn} onClick={() => setIsOpen(true)} aria-label=\"Settings\">\n <svg\n css={styles.icon}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z\" />\n </svg>\n </button>\n\n {isOpen && <SettingsPanel onClose={() => setIsOpen(false)} />}\n </>\n )\n}\n\nconst envTemplate = `CLOUDFLARE_R2_ACCOUNT_ID=abc123def456ghi789\nCLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key_id_here\nCLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_access_key_here\nCLOUDFLARE_R2_BUCKET_NAME=my-images-bucket\nCLOUDFLARE_R2_PUBLIC_URL=https://cdn.yourdomain.com`\n\nfunction SettingsPanel({ onClose }: { onClose: () => void }) {\n const { triggerRefresh } = useStudio()\n const [copied, setCopied] = useState(false)\n const [cdnUrls, setCdnUrls] = useState<string[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [hasChanges, setHasChanges] = useState(false)\n\n // Load CDN URLs on mount\n useEffect(() => {\n async function loadCdns() {\n try {\n const response = await fetch('/api/studio/cdns')\n const data = await response.json()\n setCdnUrls(data.cdns || [])\n } catch (error) {\n console.error('Failed to load CDN URLs:', error)\n } finally {\n setLoading(false)\n }\n }\n loadCdns()\n }, [])\n\n const handleCopy = () => {\n navigator.clipboard.writeText(envTemplate)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n const handleCdnChange = useCallback((index: number, value: string) => {\n setCdnUrls(prev => {\n const updated = [...prev]\n updated[index] = value\n return updated\n })\n setHasChanges(true)\n }, [])\n\n const handleAddCdn = useCallback(() => {\n setCdnUrls(prev => [...prev, ''])\n setHasChanges(true)\n }, [])\n\n const handleDeleteCdn = useCallback((index: number) => {\n setCdnUrls(prev => prev.filter((_, i) => i !== index))\n setHasChanges(true)\n }, [])\n\n const handleSave = useCallback(async () => {\n setSaving(true)\n try {\n const response = await fetch('/api/studio/cdns', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n // Preserve empty strings as placeholders to maintain indices\n body: JSON.stringify({ cdns: cdnUrls }),\n })\n \n if (response.ok) {\n setHasChanges(false)\n triggerRefresh()\n onClose()\n }\n } catch (error) {\n console.error('Failed to save CDN URLs:', error)\n } finally {\n setSaving(false)\n }\n }, [cdnUrls, triggerRefresh, onClose])\n\n return (\n <div css={styles.overlay} onClick={onClose}>\n <div css={styles.panel} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <h2 css={styles.title}>Settings</h2>\n <button css={styles.closeBtn} onClick={onClose}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div css={styles.sections}>\n <section>\n <h3 css={styles.sectionTitle}>CDN URLs</h3>\n <p css={styles.description}>Manage CDN base URLs used by your images:</p>\n {loading ? (\n <p css={styles.description}>Loading...</p>\n ) : (\n <>\n <div css={styles.cdnList}>\n {cdnUrls.map((url, index) => (\n <div key={index} css={styles.cdnRow}>\n <span css={styles.cdnIndex}>{index}</span>\n <input\n css={styles.cdnInput}\n type=\"text\"\n value={url}\n onChange={(e) => handleCdnChange(index, e.target.value)}\n placeholder=\"https://cdn.example.com\"\n />\n <button\n css={styles.cdnDeleteBtn}\n onClick={() => handleDeleteCdn(index)}\n title=\"Delete CDN URL\"\n >\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n <button css={styles.cdnAddBtn} onClick={handleAddCdn}>\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n Add CDN URL\n </button>\n {cdnUrls.length > 0 && (\n <p css={styles.warning}>\n Warning: Changing CDN URLs may break image references. The index numbers correspond to image `c` values.\n </p>\n )}\n </>\n )}\n </section>\n\n <section>\n <h3 css={styles.sectionTitle}>Cloudflare R2 Credentials</h3>\n <p css={styles.description}>Configure in .env.local file:</p>\n <div css={styles.codeWrapper}>\n <button css={styles.copyBtn} onClick={handleCopy} title=\"Copy to clipboard\">\n {copied && <span css={styles.tooltip}>Copied!</span>}\n <svg css={styles.copyIcon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n </button>\n <div css={styles.code}>\n <p css={styles.codeLine}>CLOUDFLARE_R2_ACCOUNT_ID=abc123def456ghi789</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key_id_here</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_access_key_here</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_BUCKET_NAME=my-images-bucket</p>\n <p css={styles.codeLine}>CLOUDFLARE_R2_PUBLIC_URL=https://cdn.yourdomain.com</p>\n </div>\n </div>\n </section>\n\n <section>\n <h3 css={styles.sectionTitle}>Thumbnail Sizes</h3>\n <div css={styles.grid}>\n <div>\n <label css={styles.label}>Small</label>\n <input css={styles.input} type=\"number\" defaultValue={300} />\n </div>\n <div>\n <label css={styles.label}>Medium</label>\n <input css={styles.input} type=\"number\" defaultValue={700} />\n </div>\n <div>\n <label css={styles.label}>Large</label>\n <input css={styles.input} type=\"number\" defaultValue={1400} />\n </div>\n </div>\n </section>\n </div>\n\n <div css={styles.footer}>\n <button css={styles.cancelBtn} onClick={onClose}>Cancel</button>\n <button css={styles.saveBtn} onClick={handleSave} disabled={saving || !hasChanges}>\n {saving ? 'Saving...' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/** @jsxImportSource @emotion/react */\n'use client'\n\nimport { css } from '@emotion/react'\nimport { useStudio } from './StudioContext'\nimport { colors, fontSize } from './tokens'\n\nconst styles = {\n overlay: css`\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1100;\n `,\n modal: css`\n background: ${colors.surface};\n border-radius: 12px;\n padding: 24px;\n max-width: 400px;\n width: 90%;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);\n `,\n header: css`\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n `,\n icon: css`\n width: 24px;\n height: 24px;\n color: ${colors.danger};\n flex-shrink: 0;\n `,\n title: css`\n font-size: ${fontSize.lg};\n font-weight: 600;\n color: ${colors.text};\n margin: 0;\n `,\n message: css`\n font-size: ${fontSize.base};\n color: ${colors.textSecondary};\n margin: 0 0 20px 0;\n line-height: 1.5;\n `,\n button: css`\n width: 100%;\n padding: 10px 16px;\n border-radius: 6px;\n font-size: ${fontSize.base};\n font-weight: 500;\n border: none;\n background: ${colors.primary};\n color: white;\n cursor: pointer;\n transition: background 0.15s ease;\n \n &:hover {\n background: ${colors.primaryHover};\n }\n `,\n}\n\nexport function ErrorModal() {\n const { error, clearError } = useStudio()\n\n if (!error) return null\n\n return (\n <div css={styles.overlay} onClick={clearError}>\n <div css={styles.modal} onClick={(e) => e.stopPropagation()}>\n <div css={styles.header}>\n <svg css={styles.icon} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n <h3 css={styles.title}>{error.title}</h3>\n </div>\n <p css={styles.message}>{error.message}</p>\n <button css={styles.button} onClick={clearError}>\n OK\n </button>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["useEffect","useCallback","useState","css","useCallback","useEffect","useRef","useState","css","keyframes","css","keyframes","jsx","jsxs","fadeIn","keyframes","slideIn","styles","css","useState","css","jsx","jsxs","styles","css","useState","useState","css","keyframes","Fragment","jsx","jsxs","fadeIn","keyframes","slideIn","styles","css","useState","Fragment","jsx","jsxs","keyframes","styles","css","useRef","useState","useCallback","useEffect","hasSelection","selectedPaths","useState","css","keyframes","useEffect","useState","useRef","useCallback","useState","useRef","useEffect","useCallback","jsx","jsxs","spin","keyframes","styles","css","useState","useState","css","keyframes","jsx","jsxs","spin","keyframes","styles","css","useState","formatFileSize","useState","css","Fragment","jsx","jsxs","styles","css","useState","formatFileSize","useState","useEffect","useCallback","css","Fragment","jsx","jsxs","btnHeight","styles","css","useState","useEffect","useCallback","css","jsx","jsxs","styles","css","jsx","jsxs","btnHeight","styles","css","useState","useCallback","error","useEffect"]}
|