react-os-shell 0.2.68 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -15
- package/dist/{Browser-UGZQMWKW.js → Browser-H5KDP5OH.js} +3 -3
- package/dist/{Browser-UGZQMWKW.js.map → Browser-H5KDP5OH.js.map} +1 -1
- package/dist/{Calculator-3ZXNXWDH.js → Calculator-QQ7NF53Q.js} +4 -4
- package/dist/{Calculator-3ZXNXWDH.js.map → Calculator-QQ7NF53Q.js.map} +1 -1
- package/dist/{Calendar-ON4AQ54T.js → Calendar-J6L7FGHS.js} +175 -108
- package/dist/Calendar-J6L7FGHS.js.map +1 -0
- package/dist/{CurrencyConverter-ACTLK72N.js → CurrencyConverter-YHOGBUPH.js} +4 -4
- package/dist/{CurrencyConverter-ACTLK72N.js.map → CurrencyConverter-YHOGBUPH.js.map} +1 -1
- package/dist/{Documents-STDXQ7I4.js → Documents-6DYALASM.js} +3 -3
- package/dist/{Documents-STDXQ7I4.js.map → Documents-6DYALASM.js.map} +1 -1
- package/dist/Email-U2U5Z4DL.js +475 -0
- package/dist/Email-U2U5Z4DL.js.map +1 -0
- package/dist/Files-T62M4V5I.js +11 -0
- package/dist/{Files-ASKLEUNU.js.map → Files-T62M4V5I.js.map} +1 -1
- package/dist/{Minesweeper-CZNIO75H.js → Minesweeper-S2JHXYLX.js} +3 -3
- package/dist/{Minesweeper-CZNIO75H.js.map → Minesweeper-S2JHXYLX.js.map} +1 -1
- package/dist/{Notepad-ZYYH4ZXN.js → Notepad-2YF7X3XO.js} +3 -3
- package/dist/{Notepad-ZYYH4ZXN.js.map → Notepad-2YF7X3XO.js.map} +1 -1
- package/dist/{PomodoroTimer-2MNIEAUM.js → PomodoroTimer-3J7Z3NVQ.js} +4 -4
- package/dist/{PomodoroTimer-2MNIEAUM.js.map → PomodoroTimer-3J7Z3NVQ.js.map} +1 -1
- package/dist/Preview-WM6ZP5PZ.js +8 -0
- package/dist/{Preview-U72UL74H.js.map → Preview-WM6ZP5PZ.js.map} +1 -1
- package/dist/Spreadsheet-ZIE2SXAF.js +6 -0
- package/dist/{Spreadsheet-T7Y7PRD6.js.map → Spreadsheet-ZIE2SXAF.js.map} +1 -1
- package/dist/{TodoList-7JZ2SLDI.js → TodoList-QGXCDEIE.js} +18 -204
- package/dist/TodoList-QGXCDEIE.js.map +1 -0
- package/dist/{Weather-DYCTCB6T.js → Weather-2GFPSZ5V.js} +4 -4
- package/dist/{Weather-DYCTCB6T.js.map → Weather-2GFPSZ5V.js.map} +1 -1
- package/dist/{WorldClock-XL4OMFOY.js → WorldClock-P4JR5I6X.js} +4 -4
- package/dist/{WorldClock-XL4OMFOY.js.map → WorldClock-P4JR5I6X.js.map} +1 -1
- package/dist/apps/index.d.ts +2 -5
- package/dist/apps/index.js +23 -26
- package/dist/apps/index.js.map +1 -1
- package/dist/chunk-57B3WALN.js +114 -0
- package/dist/chunk-57B3WALN.js.map +1 -0
- package/dist/{chunk-4SHZ7BZO.js → chunk-62FC2FHC.js} +92 -21
- package/dist/chunk-62FC2FHC.js.map +1 -0
- package/dist/{chunk-FXAOT23O.js → chunk-ATQVRDDQ.js} +3 -3
- package/dist/{chunk-FXAOT23O.js.map → chunk-ATQVRDDQ.js.map} +1 -1
- package/dist/{chunk-GP4Y3VCB.js → chunk-KMGWSDEI.js} +480 -4
- package/dist/chunk-KMGWSDEI.js.map +1 -0
- package/dist/{chunk-SU6XVJND.js → chunk-O6FJZAFM.js} +3 -3
- package/dist/{chunk-SU6XVJND.js.map → chunk-O6FJZAFM.js.map} +1 -1
- package/dist/{chunk-YL47AVBA.js → chunk-SEV7UXGN.js} +4 -4
- package/dist/{chunk-YL47AVBA.js.map → chunk-SEV7UXGN.js.map} +1 -1
- package/dist/{chunk-L2AFKNSQ.js → chunk-ZBRFMK3E.js} +4 -4
- package/dist/{chunk-L2AFKNSQ.js.map → chunk-ZBRFMK3E.js.map} +1 -1
- package/dist/index.d.ts +55 -1
- package/dist/index.js +241 -135
- package/dist/index.js.map +1 -1
- package/package.json +10 -3
- package/dist/Calendar-ON4AQ54T.js.map +0 -1
- package/dist/Email-5WL3TWC6.js +0 -1883
- package/dist/Email-5WL3TWC6.js.map +0 -1
- package/dist/Files-ASKLEUNU.js +0 -12
- package/dist/GeminiChat-XTEBZIVK.js +0 -184
- package/dist/GeminiChat-XTEBZIVK.js.map +0 -1
- package/dist/Preview-U72UL74H.js +0 -8
- package/dist/Spreadsheet-T7Y7PRD6.js +0 -7
- package/dist/TodoList-7JZ2SLDI.js.map +0 -1
- package/dist/chunk-4SHZ7BZO.js.map +0 -1
- package/dist/chunk-5VXRBUEH.js +0 -104
- package/dist/chunk-5VXRBUEH.js.map +0 -1
- package/dist/chunk-GP4Y3VCB.js.map +0 -1
- package/dist/chunk-MUXDKEOC.js +0 -485
- package/dist/chunk-MUXDKEOC.js.map +0 -1
- package/dist/chunk-MVWEL34Y.js +0 -209
- package/dist/chunk-MVWEL34Y.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Email.tsx"],"names":[],"mappings":"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","file":"Email-5WL3TWC6.js","sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport useGoogleAuth from '../hooks/useGoogleAuth';\nimport { isDemoMode, getDemoEmails } from './google-demo-fixtures';\nimport toast from '../shell/toast';\nimport Modal, { ModalActions } from '../shell/Modal';\nimport EditableGrid from '../shell/EditableGrid';\nimport { formatDate, formatDateTime } from '../utils/date';\n\n// ── Gmail API helpers ──\nconst GMAIL_API = 'https://gmail.googleapis.com/gmail/v1/users/me';\n\ninterface GmailThread {\n id: string;\n snippet: string;\n historyId: string;\n}\n\ninterface GmailMessage {\n id: string;\n threadId: string;\n snippet: string;\n payload: {\n headers: { name: string; value: string }[];\n mimeType: string;\n body?: { data?: string };\n parts?: { mimeType: string; body?: { data?: string; attachmentId?: string }; filename?: string; headers?: { name: string; value: string }[]; parts?: any[] }[];\n };\n labelIds: string[];\n internalDate: string;\n historyId?: string;\n}\n\ninterface EmailItem {\n id: string;\n threadId: string;\n from: string;\n fromEmail: string;\n subject: string;\n snippet: string;\n date: Date;\n isUnread: boolean;\n isStarred: boolean;\n hasAttachment: boolean;\n attachmentCount: number;\n labelIds: string[];\n threadCount: number;\n}\n\ninterface AttachmentInfo {\n filename: string;\n mimeType: string;\n attachmentId: string;\n size?: number;\n}\n\nimport { setEmailUnreadCount } from '../hooks/useEmailUnread';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\n\nfunction getHeader(msg: GmailMessage, name: string): string {\n return msg.payload.headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';\n}\n\nfunction parseFrom(from: string): { name: string; email: string } {\n const match = from.match(/^(.+?)\\s*<(.+?)>$/);\n if (match) return { name: match[1].replace(/\"/g, ''), email: match[2] };\n return { name: from, email: from };\n}\n\nfunction decodeBase64(data: string): string {\n try {\n return decodeURIComponent(escape(atob(data.replace(/-/g, '+').replace(/_/g, '/'))));\n } catch {\n try { return atob(data.replace(/-/g, '+').replace(/_/g, '/')); } catch { return ''; }\n }\n}\n\nfunction buildCidMap(parts: any[] | undefined): Record<string, { attachmentId: string; mimeType: string }> {\n const map: Record<string, { attachmentId: string; mimeType: string }> = {};\n if (!parts) return map;\n for (const part of parts) {\n if (part.body?.attachmentId) {\n const cidHeader = (part.headers || []).find((h: any) => h.name.toLowerCase() === 'content-id');\n if (cidHeader) {\n const cid = cidHeader.value.replace(/^<|>$/g, '');\n map[cid] = { attachmentId: part.body.attachmentId, mimeType: part.mimeType };\n }\n }\n if (part.parts) Object.assign(map, buildCidMap(part.parts));\n }\n return map;\n}\n\nfunction getAttachments(msg: GmailMessage): AttachmentInfo[] {\n const attachments: AttachmentInfo[] = [];\n const walk = (parts: any[] | undefined) => {\n if (!parts) return;\n for (const part of parts) {\n if (part.filename && part.filename.length > 0 && part.body?.attachmentId) {\n attachments.push({ filename: part.filename, mimeType: part.mimeType, attachmentId: part.body.attachmentId, size: part.body.size });\n }\n if (part.parts) walk(part.parts);\n }\n };\n walk(msg.payload.parts);\n return attachments;\n}\n\nfunction getMessageBody(msg: GmailMessage): string {\n const findPart = (parts: any[] | undefined, mime: string): string | null => {\n if (!parts) return null;\n for (const part of parts) {\n if (part.mimeType === mime && part.body?.data) return decodeBase64(part.body.data);\n if (part.parts) { const found = findPart(part.parts, mime); if (found) return found; }\n }\n return null;\n };\n\n let html: string | null = null;\n\n if (msg.payload.parts) {\n html = findPart(msg.payload.parts, 'text/html');\n if (!html) {\n const text = findPart(msg.payload.parts, 'text/plain');\n if (text) return `<pre style=\"white-space:pre-wrap;font-family:inherit;\">${text.replace(/</g, '<')}</pre>`;\n }\n }\n\n if (!html && msg.payload.body?.data) {\n const decoded = decodeBase64(msg.payload.body.data);\n if (msg.payload.mimeType === 'text/html') html = decoded;\n else return `<pre style=\"white-space:pre-wrap;font-family:inherit;\">${decoded.replace(/</g, '<')}</pre>`;\n }\n\n if (!html) return '<p style=\"color:#999;\">No content</p>';\n\n const cidMap = buildCidMap(msg.payload.parts);\n html = html.replace(/src=[\"']cid:([^\"']+)[\"']/gi, (_match, cid) => {\n const info = cidMap[cid];\n if (info) {\n return `src=\"\" data-cid-attachment=\"${info.attachmentId}\" data-cid-mime=\"${info.mimeType}\" data-msg-id=\"${msg.id}\"`;\n }\n return _match;\n });\n\n return html;\n}\n\nfunction timeAgo(date: Date): string {\n const diff = Date.now() - date.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'now';\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d`;\n return formatDate(date.toISOString());\n}\n\nfunction avatarColor(name: string): string {\n const colors = ['bg-blue-500', 'bg-red-500', 'bg-green-500', 'bg-purple-500', 'bg-yellow-500', 'bg-pink-500', 'bg-indigo-500', 'bg-teal-500'];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = name.charCodeAt(i) + ((hash << 5) - hash);\n return colors[Math.abs(hash) % colors.length];\n}\n\nfunction isImageAttachment(att: AttachmentInfo): boolean {\n return /^image\\/(jpe?g|png|gif|webp|bmp|svg)$/i.test(att.mimeType);\n}\n\n/** Batch API: fetch up to 100 messages in a single HTTP request */\nasync function batchFetchMessages(token: string, msgIds: { id: string; threadId: string }[]): Promise<EmailItem[]> {\n if (msgIds.length === 0) return [];\n const boundary = `batch_${Date.now()}`;\n const parts = msgIds.map((m, i) =>\n `--${boundary}\\r\\nContent-Type: application/http\\r\\nContent-ID: <item${i}>\\r\\n\\r\\nGET /gmail/v1/users/me/messages/${m.id}?format=metadata&metadataHeaders=From&metadataHeaders=Subject&fields=id,threadId,snippet,internalDate,labelIds,historyId,payload(headers,parts(filename))\\r\\n`\n );\n const body = parts.join('') + `--${boundary}--`;\n\n const res = await fetch('https://www.googleapis.com/batch/gmail/v1', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': `multipart/mixed; boundary=${boundary}`,\n },\n body,\n });\n\n if (!res.ok) {\n const results = await Promise.all(\n msgIds.map(m =>\n fetch(`${GMAIL_API}/messages/${m.id}?format=metadata&metadataHeaders=From&metadataHeaders=Subject&fields=id,threadId,snippet,internalDate,labelIds,historyId,payload(headers,parts(filename))`, {\n headers: { Authorization: `Bearer ${token}` },\n }).then(r => r.json())\n )\n );\n return addThreadCounts(results.map(parseMessageToItem));\n }\n\n const text = await res.text();\n const responseBoundary = res.headers.get('content-type')?.match(/boundary=(.+)/)?.[1] || '';\n const responseParts = text.split(`--${responseBoundary}`).filter(p => p.includes('HTTP/'));\n const items: EmailItem[] = [];\n for (const part of responseParts) {\n const jsonMatch = part.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n const msg = JSON.parse(jsonMatch[0]);\n if (msg.id) items.push(parseMessageToItem(msg));\n } catch {}\n }\n }\n return addThreadCounts(items);\n}\n\nfunction parseMessageToItem(msg: any): EmailItem {\n const from = parseFrom(getHeader(msg, 'From'));\n const parts = msg.payload?.parts || [];\n const attachments = parts.filter((p: any) => p.filename && p.filename.length > 0);\n return {\n id: msg.id,\n threadId: msg.threadId,\n from: from.name,\n fromEmail: from.email,\n subject: getHeader(msg, 'Subject') || '(no subject)',\n snippet: msg.snippet || '',\n date: new Date(parseInt(msg.internalDate)),\n isUnread: (msg.labelIds || []).includes('UNREAD'),\n isStarred: (msg.labelIds || []).includes('STARRED'),\n hasAttachment: attachments.length > 0,\n attachmentCount: attachments.length,\n labelIds: msg.labelIds || [],\n threadCount: 1,\n };\n}\n\nfunction addThreadCounts(items: EmailItem[]): EmailItem[] {\n const threadCounts = new Map<string, number>();\n for (const item of items) {\n threadCounts.set(item.threadId, (threadCounts.get(item.threadId) || 0) + 1);\n }\n return items.map(item => ({ ...item, threadCount: threadCounts.get(item.threadId) || 1 }));\n}\n\nfunction getCategoryLabel(labelIds: string[]): { text: string; color: string } | null {\n if (labelIds.includes('CATEGORY_SOCIAL')) return { text: 'Social', color: 'bg-blue-100 text-blue-700' };\n if (labelIds.includes('CATEGORY_PROMOTIONS')) return { text: 'Promo', color: 'bg-green-100 text-green-700' };\n if (labelIds.includes('CATEGORY_UPDATES')) return { text: 'Updates', color: 'bg-yellow-100 text-yellow-700' };\n if (labelIds.includes('CATEGORY_FORUMS')) return { text: 'Forums', color: 'bg-purple-100 text-purple-700' };\n return null;\n}\n\n// ── Undo-send toast ──\nfunction showUndoToast(message: string, onUndo: () => void, durationMs = 5000): { dismiss: () => void } {\n const container = (() => {\n let el = document.getElementById('toast-container');\n if (!el) {\n el = document.createElement('div');\n el.id = 'toast-container';\n el.className = 'fixed top-4 right-4 z-[9999] flex flex-col gap-2 items-end pointer-events-none';\n document.body.appendChild(el);\n }\n return el;\n })();\n\n const toastEl = document.createElement('div');\n toastEl.className = 'bg-gray-800 text-white px-5 py-3 rounded-lg shadow-lg text-sm font-medium flex items-center gap-3 max-w-lg pointer-events-auto';\n toastEl.style.opacity = '0';\n toastEl.style.transform = 'translateX(20px)';\n toastEl.style.transition = 'opacity 300ms ease, transform 300ms ease';\n\n const span = document.createElement('span');\n span.textContent = message;\n toastEl.appendChild(span);\n\n const progressBar = document.createElement('div');\n progressBar.className = 'absolute bottom-0 left-0 h-0.5 bg-blue-400 rounded-b-lg';\n progressBar.style.width = '100%';\n progressBar.style.transition = `width ${durationMs}ms linear`;\n toastEl.style.position = 'relative';\n toastEl.style.overflow = 'hidden';\n toastEl.appendChild(progressBar);\n\n const undoBtn = document.createElement('button');\n undoBtn.textContent = 'Undo';\n undoBtn.className = 'text-blue-300 hover:text-blue-100 font-semibold text-sm shrink-0';\n undoBtn.onclick = () => {\n onUndo();\n dismiss();\n };\n toastEl.appendChild(undoBtn);\n\n container.appendChild(toastEl);\n\n requestAnimationFrame(() => {\n toastEl.style.opacity = '1';\n toastEl.style.transform = 'translateX(0)';\n requestAnimationFrame(() => { progressBar.style.width = '0%'; });\n });\n\n let dismissed = false;\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n toastEl.style.opacity = '0';\n toastEl.style.transform = 'translateX(20px)';\n setTimeout(() => toastEl.remove(), 300);\n };\n\n const timer = setTimeout(dismiss, durationMs);\n\n return {\n dismiss: () => { clearTimeout(timer); dismiss(); },\n };\n}\n\n// ── Contact cache for autocomplete ──\nconst RECENT_RECIPIENTS_KEY = 'email_recent_recipients';\n\nfunction getRecentRecipients(): { name: string; email: string }[] {\n try {\n return JSON.parse(localStorage.getItem(RECENT_RECIPIENTS_KEY) || '[]');\n } catch { return []; }\n}\n\nfunction addRecentRecipient(email: string, name?: string) {\n const list = getRecentRecipients();\n const existing = list.findIndex(r => r.email === email);\n if (existing >= 0) list.splice(existing, 1);\n list.unshift({ name: name || email, email });\n localStorage.setItem(RECENT_RECIPIENTS_KEY, JSON.stringify(list.slice(0, 50)));\n}\n\n// ── Main Component ──\nexport default function Email() {\n const { isConnected, user, accessToken, connect, disconnect, loading: authLoading, error: authError, hasClientId, setClientId } = useGoogleAuth();\n const [messages, setMessages] = useState<EmailItem[]>([]);\n const [loadingMsgs, setLoadingMsgs] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [selectedMsg, setSelectedMsg] = useState<GmailMessage | null>(null);\n const [threadMsgs, setThreadMsgs] = useState<GmailMessage[]>([]);\n const [loadingMsg, setLoadingMsg] = useState(false);\n const [composing, setComposing] = useState(false);\n const [replyTo, setReplyTo] = useState<{ to: string; subject: string; threadId: string; messageId: string } | null>(null);\n const [forwardBody, setForwardBody] = useState<string | null>(null);\n const [label, setLabel] = useState('INBOX');\n const [clientIdInput, setClientIdInput] = useState('');\n const [nextPageToken, setNextPageToken] = useState<string | null>(null);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [searchQuery, setSearchQuery] = useState('');\n const [activeSearch, setActiveSearch] = useState('');\n const [splitPane, setSplitPane] = useState(false);\n const [focusIdx, setFocusIdx] = useState(-1);\n const listRef = useRef<HTMLDivElement>(null);\n const [userLabels, setUserLabels] = useState<{ id: string; name: string; type: string }[]>([]);\n const [spreadsheetData, setSpreadsheetData] = useState<{ name: string; sheetNames: string[]; sheets: Record<string, string[][]> } | null>(null);\n const [lightbox, setLightbox] = useState<{ src: string; filename: string } | null>(null);\n const [collapsedThreadMsgs, setCollapsedThreadMsgs] = useState<Set<string>>(new Set());\n\n const isSpreadsheet = (filename: string) => /\\.(xlsx|xls|csv|tsv|ods)$/i.test(filename);\n\n const openSpreadsheet = async (msgId: string, attachmentId: string, filename: string) => {\n if (!accessToken) return;\n try {\n toast.info(`Opening ${filename}...`);\n const res = await fetch(`${GMAIL_API}/messages/${msgId}/attachments/${attachmentId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n const data = await res.json();\n if (!data.data) { toast.error('No attachment data'); return; }\n const b64 = data.data.replace(/-/g, '+').replace(/_/g, '/');\n const byteChars = atob(b64);\n const byteArr = new Uint8Array(byteChars.length);\n for (let i = 0; i < byteChars.length; i++) byteArr[i] = byteChars.charCodeAt(i);\n\n const XLSX = (await import('xlsx'));\n const wb = XLSX.read(byteArr, { type: 'array' });\n const sheets: Record<string, string[][]> = {};\n for (const name of wb.SheetNames) {\n const rows: string[][] = XLSX.utils.sheet_to_json(wb.Sheets[name], { header: 1, defval: '' });\n // Normalize: ensure all rows have the same column count\n const maxCols = rows.reduce((m, r) => Math.max(m, r.length), 0);\n sheets[name] = rows.map(r => { while (r.length < maxCols) r.push(''); return r.map(c => String(c ?? '')); });\n }\n setSpreadsheetData({ name: filename, sheetNames: wb.SheetNames, sheets });\n } catch (err: any) {\n toast.error(`Failed to open spreadsheet: ${err.message || 'Unknown error'}`);\n }\n };\n\n const unreadCount = useMemo(() => messages.filter(m => m.isUnread).length, [messages]);\n\n // Update global unread count from all cached labels (deduplicated by message ID)\n useEffect(() => {\n const allIds = new Set<string>();\n let total = 0;\n // Count from current view\n for (const m of messages) { if (m.isUnread && !allIds.has(m.id)) { allIds.add(m.id); total++; } }\n // Count from cached labels\n for (const [, cached] of Object.entries(msgCacheRef.current)) {\n for (const m of cached.items) { if (m.isUnread && !allIds.has(m.id)) { allIds.add(m.id); total++; } }\n }\n setEmailUnreadCount(total);\n }, [messages]);\n\n const msgBodyCacheRef = useRef<Record<string, { msgs: GmailMessage[]; ts: number }>>({});\n const MSG_BODY_TTL = 5 * 60 * 1000;\n\n // History API state\n const latestHistoryIdRef = useRef<string | null>(null);\n const HISTORY_ID_KEY = 'email_history_id';\n\n useEffect(() => {\n try {\n latestHistoryIdRef.current = localStorage.getItem(HISTORY_ID_KEY);\n } catch {}\n }, []);\n\n const updateHistoryId = useCallback((historyId: string | undefined) => {\n if (!historyId) return;\n const current = latestHistoryIdRef.current;\n if (!current || BigInt(historyId) > BigInt(current)) {\n latestHistoryIdRef.current = historyId;\n try { localStorage.setItem(HISTORY_ID_KEY, historyId); } catch {}\n }\n }, []);\n\n useEffect(() => {\n if (!accessToken) return;\n fetch(`${GMAIL_API}/labels`, { headers: { Authorization: `Bearer ${accessToken}` } })\n .then(r => r.json())\n .then(data => {\n const labels = (data.labels || [])\n .filter((l: any) => l.type === 'user')\n .sort((a: any, b: any) => a.name.localeCompare(b.name));\n setUserLabels(labels);\n })\n .catch(() => {});\n }, [accessToken]);\n\n const msgCacheRef = useRef<Record<string, { items: EmailItem[]; ts: number }>>({});\n const MSG_CACHE_TTL = 2 * 60 * 1000;\n const PERSIST_KEY = 'email_msg_cache';\n\n useEffect(() => {\n try {\n const stored = JSON.parse(localStorage.getItem(PERSIST_KEY) || '{}');\n for (const [key, val] of Object.entries(stored)) {\n const v = val as any;\n if (v.items) {\n v.items = v.items.map((m: any) => ({ ...m, date: new Date(m.date) }));\n msgCacheRef.current[key] = v;\n }\n }\n } catch {}\n }, []);\n\n const persistCache = useCallback(() => {\n try {\n const toSave: Record<string, any> = {};\n for (const [key, val] of Object.entries(msgCacheRef.current)) {\n if (['INBOX', 'STARRED', 'SENT', 'DRAFT'].includes(key)) toSave[key] = val;\n }\n localStorage.setItem(PERSIST_KEY, JSON.stringify(toSave));\n } catch {}\n }, []);\n\n const fetchMessages = useCallback(async (labelId: string, pageToken?: string, query?: string, force = false) => {\n if (!accessToken) return;\n const cacheKey = query ? `q:${query}` : labelId;\n\n if (!force && !pageToken && msgCacheRef.current[cacheKey]) {\n const cached = msgCacheRef.current[cacheKey];\n if (Date.now() - cached.ts < MSG_CACHE_TTL) {\n setMessages(cached.items);\n setLoadingMsgs(false);\n return;\n }\n setMessages(cached.items);\n }\n\n if (!msgCacheRef.current[cacheKey]) setLoadingMsgs(true);\n try {\n const params = new URLSearchParams({ maxResults: '30' });\n if (query) { params.set('q', query); } else { params.set('labelIds', labelId); }\n if (pageToken) params.set('pageToken', pageToken);\n const res = await fetch(`${GMAIL_API}/messages?${params}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) throw new Error('Failed to fetch messages');\n const data = await res.json();\n const msgIds: { id: string; threadId: string }[] = data.messages || [];\n setNextPageToken(data.nextPageToken || null);\n\n const details = await batchFetchMessages(accessToken, msgIds);\n\n // Track historyId from responses\n for (const item of details) {\n // Items don't have historyId directly, but we capture from raw responses in batchFetch\n }\n\n if (pageToken) {\n setMessages(prev => {\n const merged = [...prev, ...details];\n msgCacheRef.current[cacheKey] = { items: merged, ts: Date.now() };\n persistCache();\n return merged;\n });\n } else {\n setMessages(details);\n msgCacheRef.current[cacheKey] = { items: details, ts: Date.now() };\n persistCache();\n }\n } catch (err: any) {\n if (!msgCacheRef.current[cacheKey]) toast.error(err.message || 'Failed to load emails');\n }\n setLoadingMsgs(false);\n }, [accessToken]);\n\n useEffect(() => {\n if (isConnected) fetchMessages(label, undefined, activeSearch || undefined);\n }, [isConnected, label, fetchMessages, activeSearch]);\n\n const prefetchedRef = useRef(false);\n useEffect(() => {\n if (!isConnected || prefetchedRef.current) return;\n prefetchedRef.current = true;\n const timer = setTimeout(() => {\n ['STARRED', 'SENT', 'DRAFT'].forEach(l => {\n if (l !== label && !msgCacheRef.current[l]) fetchMessages(l);\n });\n }, 3000);\n return () => clearTimeout(timer);\n }, [isConnected, label, fetchMessages]);\n\n // Incremental sync via History API\n const incrementalSync = useCallback(async () => {\n if (!accessToken || !latestHistoryIdRef.current) return false;\n try {\n const params = new URLSearchParams({\n startHistoryId: latestHistoryIdRef.current,\n labelId: label,\n historyTypes: 'messageAdded,messageDeleted,labelAdded,labelRemoved',\n });\n const res = await fetch(`${GMAIL_API}/history?${params}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (res.status === 404) return false; // History too old\n if (!res.ok) return false;\n const data = await res.json();\n if (data.historyId) updateHistoryId(data.historyId);\n if (!data.history || data.history.length === 0) return true; // No changes\n return false; // Has changes, need full refresh\n } catch {\n return false;\n }\n }, [accessToken, label, updateHistoryId]);\n\n // No auto-refresh — use manual refresh button or WebSocket for real-time updates\n\n // Capture historyId from opened messages\n const captureHistoryId = useCallback((msg: GmailMessage) => {\n if (msg.historyId) updateHistoryId(msg.historyId);\n }, [updateHistoryId]);\n\n const openDraft = async (msgId: string) => {\n if (!accessToken) return;\n try {\n // Find the draft by message ID\n const draftsRes = await fetch(`${GMAIL_API}/drafts`, { headers: { Authorization: `Bearer ${accessToken}` } });\n const draftsData = await draftsRes.json();\n const draft = (draftsData.drafts || []).find((d: any) => d.message?.id === msgId);\n if (!draft) { openMessage(msgId); return; }\n // Fetch full draft content\n const res = await fetch(`${GMAIL_API}/drafts/${draft.id}`, { headers: { Authorization: `Bearer ${accessToken}` } });\n const draftData = await res.json();\n const msg: GmailMessage = draftData.message;\n const to = getHeader(msg, 'To');\n const subject = getHeader(msg, 'Subject');\n const body = getMessageBody(msg);\n setReplyTo({ to, subject, threadId: msg.threadId || '', messageId: '' });\n setForwardBody(null);\n setComposing(true);\n // Set editor content after compose mounts\n setTimeout(() => {\n const editor = document.querySelector('[contenteditable=\"true\"]') as HTMLElement;\n if (editor) editor.innerHTML = body;\n }, 100);\n } catch {\n toast.error('Failed to open draft');\n }\n };\n\n const openMessage = async (id: string, threadId?: string) => {\n if (!accessToken) return;\n setSelectedId(id);\n setCollapsedThreadMsgs(new Set());\n const tId = threadId || id;\n\n const cached = msgBodyCacheRef.current[tId];\n if (cached && Date.now() - cached.ts < MSG_BODY_TTL) {\n setThreadMsgs(cached.msgs);\n setSelectedMsg(cached.msgs[cached.msgs.length - 1]);\n // Collapse all but last\n const collapsed = new Set(cached.msgs.slice(0, -1).map(m => m.id));\n setCollapsedThreadMsgs(collapsed);\n } else {\n setLoadingMsg(true);\n setThreadMsgs([]);\n }\n\n const msgItem = messages.find(m => m.id === id);\n if (msgItem?.isUnread) {\n setMessages(prev => prev.map(m => m.id === id ? { ...m, isUnread: false } : m));\n fetch(`${GMAIL_API}/messages/${id}/modify`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ removeLabelIds: ['UNREAD'] }),\n }).catch(() => {});\n }\n\n if (!cached || Date.now() - cached.ts >= MSG_BODY_TTL) {\n try {\n const threadRes = await fetch(`${GMAIL_API}/threads/${tId}?format=full`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (threadRes.ok) {\n const threadData = await threadRes.json();\n const allMsgs: GmailMessage[] = threadData.messages || [];\n if (allMsgs.length > 0) {\n setThreadMsgs(allMsgs);\n setSelectedMsg(allMsgs[allMsgs.length - 1]);\n msgBodyCacheRef.current[tId] = { msgs: allMsgs, ts: Date.now() };\n // Collapse all but last\n const collapsed = new Set(allMsgs.slice(0, -1).map(m => m.id));\n setCollapsedThreadMsgs(collapsed);\n allMsgs.forEach(captureHistoryId);\n }\n } else {\n const res = await fetch(`${GMAIL_API}/messages/${id}?format=full`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n const msg: GmailMessage = await res.json();\n setSelectedMsg(msg);\n setThreadMsgs([msg]);\n msgBodyCacheRef.current[tId] = { msgs: [msg], ts: Date.now() };\n captureHistoryId(msg);\n }\n } catch { toast.error('Failed to load message'); }\n setLoadingMsg(false);\n }\n };\n\n const toggleStar = async (id: string, isStarred: boolean) => {\n if (!accessToken) return;\n const body = isStarred ? { removeLabelIds: ['STARRED'] } : { addLabelIds: ['STARRED'] };\n await fetch(`${GMAIL_API}/messages/${id}/modify`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n setMessages(prev => prev.map(m => m.id === id ? { ...m, isStarred: !isStarred } : m));\n };\n\n const archiveMessage = async (id: string) => {\n if (!accessToken) return;\n setMessages(prev => prev.filter(m => m.id !== id));\n if (selectedId === id) { setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); }\n toast.success('Archived.');\n fetch(`${GMAIL_API}/messages/${id}/modify`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ removeLabelIds: ['INBOX'] }),\n }).catch(() => toast.error('Failed to archive'));\n };\n\n const trashMessage = async (id: string) => {\n if (!accessToken) return;\n setMessages(prev => prev.filter(m => m.id !== id));\n if (selectedId === id) { setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); }\n toast.success('Moved to Trash.');\n fetch(`${GMAIL_API}/messages/${id}/trash`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n }).catch(() => toast.error('Failed to delete'));\n };\n\n const modifyMessages = async (ids: string[], addLabels: string[], removeLabels: string[]) => {\n if (!accessToken) return;\n await Promise.all(ids.map(id =>\n fetch(`${GMAIL_API}/messages/${id}/modify`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ addLabelIds: addLabels, removeLabelIds: removeLabels }),\n })\n ));\n };\n\n const bulkArchive = async () => {\n const ids = [...selectedIds];\n await modifyMessages(ids, [], ['INBOX']);\n setMessages(prev => prev.filter(m => !selectedIds.has(m.id)));\n setSelectedIds(new Set());\n toast.success(`Archived ${ids.length} message(s).`);\n };\n\n const bulkDelete = async () => {\n const ids = [...selectedIds];\n await Promise.all(ids.map(id => fetch(`${GMAIL_API}/messages/${id}/trash`, {\n method: 'POST', headers: { Authorization: `Bearer ${accessToken}` },\n })));\n setMessages(prev => prev.filter(m => !selectedIds.has(m.id)));\n setSelectedIds(new Set());\n toast.success(`Deleted ${ids.length} message(s).`);\n };\n\n const bulkMarkRead = async () => {\n const ids = [...selectedIds];\n await modifyMessages(ids, [], ['UNREAD']);\n setMessages(prev => prev.map(m => selectedIds.has(m.id) ? { ...m, isUnread: false } : m));\n setSelectedIds(new Set());\n toast.success('Marked as read.');\n };\n\n const bulkMarkUnread = async () => {\n const ids = [...selectedIds];\n await modifyMessages(ids, ['UNREAD'], []);\n setMessages(prev => prev.map(m => selectedIds.has(m.id) ? { ...m, isUnread: true } : m));\n setSelectedIds(new Set());\n toast.success('Marked as unread.');\n };\n\n const toggleSelect = (id: string) => {\n setSelectedIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n\n const toggleSelectAll = () => {\n if (selectedIds.size === messages.length) setSelectedIds(new Set());\n else setSelectedIds(new Set(messages.map(m => m.id)));\n };\n\n const isImage = (filename: string) => /\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(filename);\n\n const downloadAttachment = async (msgId: string, attachmentId: string, filename: string) => {\n if (!accessToken) return;\n try {\n const res = await fetch(`${GMAIL_API}/messages/${msgId}/attachments/${attachmentId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n const data = await res.json();\n if (data.data) {\n const b64 = data.data.replace(/-/g, '+').replace(/_/g, '/');\n const byteChars = atob(b64);\n const byteArr = new Uint8Array(byteChars.length);\n for (let i = 0; i < byteChars.length; i++) byteArr[i] = byteChars.charCodeAt(i);\n const blob = new Blob([byteArr]);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename; a.click();\n URL.revokeObjectURL(url);\n }\n } catch { toast.error('Failed to download attachment'); }\n };\n\n const openAttachment = async (msgId: string, attachmentId: string, filename: string, mimeType: string) => {\n if (!accessToken) return;\n if (isImage(filename) || mimeType.startsWith('image/')) {\n try {\n const res = await fetch(`${GMAIL_API}/messages/${msgId}/attachments/${attachmentId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n const data = await res.json();\n if (data.data) {\n const b64 = data.data.replace(/-/g, '+').replace(/_/g, '/');\n setLightbox({ src: `data:${mimeType};base64,${b64}`, filename });\n }\n } catch { toast.error('Failed to open image'); }\n } else {\n downloadAttachment(msgId, attachmentId, filename);\n }\n };\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n setActiveSearch(searchQuery);\n setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]);\n };\n\n const clearSearch = () => {\n setSearchQuery('');\n setActiveSearch('');\n };\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return;\n\n if (e.key === 'c' && !composing) { setComposing(true); return; }\n if (e.key === 'e' && selectedId) { archiveMessage(selectedId); return; }\n if (e.key === '#' && selectedId) { trashMessage(selectedId); return; }\n if (e.key === 'r' && selectedMsg) {\n e.preventDefault();\n setReplyTo({\n to: parseFrom(getHeader(selectedMsg, 'From')).email,\n subject: `Re: ${getHeader(selectedMsg, 'Subject')}`,\n threadId: selectedMsg.threadId,\n messageId: getHeader(selectedMsg, 'Message-ID') || selectedMsg.id,\n });\n setComposing(true);\n return;\n }\n if (e.key === 'j') { setFocusIdx(prev => Math.min(prev + 1, messages.length - 1)); return; }\n if (e.key === 'k') { setFocusIdx(prev => Math.max(prev - 1, 0)); return; }\n if (e.key === 'Enter' && focusIdx >= 0 && focusIdx < messages.length && !selectedMsg) {\n const msg = messages[focusIdx];\n openMessage(msg.id, msg.threadId);\n return;\n }\n if (e.key === 'x' && focusIdx >= 0 && focusIdx < messages.length) {\n toggleSelect(messages[focusIdx].id);\n return;\n }\n if (e.key === 'Escape') {\n if (selectedMsg) { setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); }\n return;\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [selectedId, selectedMsg, messages, focusIdx]);\n\n const LABELS = [\n { id: 'INBOX', label: 'Inbox', icon: 'M2.25 13.5h3.86a2.25 2.25 0 012.012 1.244l.256.512a2.25 2.25 0 002.013 1.244h3.218a2.25 2.25 0 002.013-1.244l.256-.512a2.25 2.25 0 012.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18v-4.162c0-.224-.034-.447-.1-.661L19.24 5.338a2.25 2.25 0 00-2.15-1.588H6.911a2.25 2.25 0 00-2.15 1.588L2.35 13.177a2.25 2.25 0 00-.1.661z' },\n { id: 'STARRED', label: 'Starred', icon: 'M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z' },\n { id: 'SENT', label: 'Sent', icon: 'M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5' },\n { id: 'DRAFT', label: 'Drafts', icon: 'M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z' },\n ];\n\n if (!isConnected) {\n // Demo mode: render a small static preview instead of the connect screen\n // so the public Pages demo has populated UI without requiring a real\n // Google OAuth Client ID.\n if (isDemoMode()) return <EmailDemoView />;\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center max-w-md space-y-4 px-6\">\n <svg className=\"h-16 w-16 mx-auto text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n <h2 className=\"text-lg font-semibold text-gray-900\">Connect Gmail</h2>\n <p className=\"text-sm text-gray-500\">Sign in with your Google account to access Gmail, Calendar, and Gemini AI.</p>\n\n {!hasClientId && (\n <div className=\"text-left space-y-2 bg-gray-50 rounded-lg p-4\">\n <label className=\"block text-xs font-medium text-gray-700\">Google OAuth Client ID</label>\n <input\n value={clientIdInput}\n onChange={e => setClientIdInput(e.target.value)}\n placeholder=\"123456789.apps.googleusercontent.com\"\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:ring-blue-500\"\n />\n <button onClick={() => { if (clientIdInput.trim()) setClientId(clientIdInput.trim()); }}\n disabled={!clientIdInput.trim()}\n className=\"w-full bg-gray-900 text-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-gray-800 disabled:opacity-40\">\n Save Client ID\n </button>\n <p className=\"text-[10px] text-gray-400\">Create one at console.cloud.google.com > APIs > Credentials > OAuth 2.0 Client ID (Web application)</p>\n </div>\n )}\n\n {hasClientId && (\n <button onClick={connect} disabled={authLoading}\n className=\"inline-flex items-center gap-2 bg-white border border-gray-300 shadow-sm px-6 py-2.5 text-sm font-medium rounded-lg hover:bg-gray-50 disabled:opacity-50\">\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n {authLoading ? 'Connecting...' : 'Sign in with Google'}\n </button>\n )}\n\n {authError && <p className=\"text-sm text-red-600\">{authError}</p>}\n </div>\n </div>\n );\n }\n\n // ── Message Detail Panel ──\n const renderDetail = () => {\n if (!selectedMsg) return null;\n const lastMsg = threadMsgs.length > 0 ? threadMsgs[threadMsgs.length - 1] : selectedMsg;\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Toolbar */}\n <div className=\"flex items-center gap-1.5 px-3 py-1.5 border-b border-gray-200 shrink-0\">\n <button onClick={() => { setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); }} className=\"p-1 rounded hover:bg-gray-100\" title=\"Back (Esc)\">\n <svg className=\"h-4 w-4 text-gray-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18\" /></svg>\n </button>\n <h3 className=\"text-sm font-semibold text-gray-900 truncate flex-1\">{getHeader(lastMsg, 'Subject')}</h3>\n <button onClick={() => archiveMessage(lastMsg.id)} title=\"Archive (e)\"\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z\" /></svg>\n Done\n </button>\n <button onClick={() => {\n setReplyTo({\n to: parseFrom(getHeader(lastMsg, 'From')).email,\n subject: `Re: ${getHeader(lastMsg, 'Subject')}`,\n threadId: lastMsg.threadId,\n messageId: getHeader(lastMsg, 'Message-ID') || lastMsg.id,\n });\n setComposing(true);\n }} className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\" title=\"Reply (r)\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15L3 9m0 0l6-6M3 9h12a6 6 0 010 12h-3\" /></svg>\n Reply\n </button>\n <button onClick={() => {\n const allRecipients = [getHeader(lastMsg, 'From'), getHeader(lastMsg, 'To'), getHeader(lastMsg, 'Cc')]\n .join(',').split(',').map(s => s.trim()).filter(Boolean)\n .map(s => parseFrom(s).email)\n .filter((e, i, a) => a.indexOf(e) === i && e !== user?.email);\n setReplyTo({\n to: allRecipients.join(', '),\n subject: `Re: ${getHeader(lastMsg, 'Subject')}`,\n threadId: lastMsg.threadId,\n messageId: getHeader(lastMsg, 'Message-ID') || lastMsg.id,\n });\n setComposing(true);\n }} className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\" title=\"Reply All\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15L3 9m0 0l6-6M3 9h12a6 6 0 010 12h-3\" /><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 15L7 9m0 0l6-6\" opacity=\"0.5\" /></svg>\n All\n </button>\n <button onClick={() => {\n const fwd = `\\n\\n---------- Forwarded message ----------\\nFrom: ${getHeader(lastMsg, 'From')}\\nDate: ${formatDateTime(new Date(parseInt(lastMsg.internalDate)).toISOString())}\\nSubject: ${getHeader(lastMsg, 'Subject')}\\nTo: ${getHeader(lastMsg, 'To')}\\n\\n`;\n setForwardBody(fwd);\n setReplyTo({ to: '', subject: `Fwd: ${getHeader(lastMsg, 'Subject')}`, threadId: '', messageId: '' });\n setComposing(true);\n }} className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\" title=\"Forward\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l6-6m0 0l-6-6m6 6H9a6 6 0 000 12h3\" /></svg>\n Forward\n </button>\n <button onClick={() => trashMessage(lastMsg.id)} title=\"Delete (#)\"\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-600 border border-gray-300 rounded-md hover:bg-red-50 hover:text-red-600 hover:border-red-300\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n </div>\n\n {loadingMsg ? (\n <div className=\"flex-1 flex items-center justify-center text-sm text-gray-400\">Loading...</div>\n ) : (\n <div className=\"flex-1 overflow-y-auto\">\n {threadMsgs.map((tmsg, idx) => {\n const from = parseFrom(getHeader(tmsg, 'From'));\n const isLast = idx === threadMsgs.length - 1;\n const isCollapsed = collapsedThreadMsgs.has(tmsg.id);\n return (\n <div key={tmsg.id} className={`border-b border-gray-100 ${!isLast ? 'bg-gray-50/50' : ''}`}>\n <div\n className={`px-4 py-2 flex items-center gap-2 ${!isLast ? 'cursor-pointer hover:bg-gray-100/50' : ''}`}\n onClick={() => {\n if (isLast) return;\n setCollapsedThreadMsgs(prev => {\n const next = new Set(prev);\n if (next.has(tmsg.id)) next.delete(tmsg.id); else next.add(tmsg.id);\n return next;\n });\n }}\n >\n <div className={`h-7 w-7 rounded-full flex items-center justify-center text-white text-xs font-medium shrink-0 ${avatarColor(from.name)}`}>\n {from.name.charAt(0).toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-gray-900 truncate\">{from.name}</span>\n <span className=\"text-xs text-gray-400\">{formatDateTime(new Date(parseInt(tmsg.internalDate)).toISOString())}</span>\n </div>\n {isCollapsed ? (\n <p className=\"text-xs text-gray-400 truncate\">{tmsg.snippet}</p>\n ) : (\n <p className=\"text-xs text-gray-500 truncate\">To: {getHeader(tmsg, 'To')}</p>\n )}\n </div>\n {threadMsgs.length > 1 && (\n <div className=\"flex items-center gap-1\">\n {!isLast && (\n <svg className={`h-3 w-3 text-gray-400 transition-transform ${isCollapsed ? '-rotate-90' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" /></svg>\n )}\n <span className=\"text-[10px] text-gray-400\">{idx + 1}/{threadMsgs.length}</span>\n </div>\n )}\n </div>\n {!isCollapsed && (\n <>\n <div className=\"px-4 pb-3\">\n <EmailBody html={getMessageBody(tmsg)} accessToken={accessToken!} />\n </div>\n {(() => {\n const msgAtts = getAttachments(tmsg);\n if (msgAtts.length === 0) return null;\n return (\n <div className=\"px-4 pb-3\">\n <div className=\"flex flex-wrap gap-2\">\n {msgAtts.map((att, i) => (\n <div key={i}>\n {isImageAttachment(att) ? (\n <InlineImagePreview msgId={tmsg.id} att={att} accessToken={accessToken!} onDownload={downloadAttachment} onLightbox={(src, fn) => setLightbox({ src, filename: fn })} />\n ) : (\n <div className=\"inline-flex items-center border border-gray-200 rounded-lg bg-white overflow-hidden\">\n <button onClick={() => openAttachment(tmsg.id, att.attachmentId, att.filename, att.mimeType)}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 text-xs hover:bg-gray-50 text-gray-700\">\n <svg className=\"h-3.5 w-3.5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13\" /></svg>\n <span className=\"truncate max-w-[140px]\">{att.filename}</span>\n </button>\n {isSpreadsheet(att.filename) && (\n <button onClick={() => openSpreadsheet(tmsg.id, att.attachmentId, att.filename)}\n title=\"Open in spreadsheet viewer\"\n className=\"px-2 py-1.5 text-xs text-green-700 hover:bg-green-50 border-l border-gray-200 font-medium\">\n Open\n </button>\n )}\n <button onClick={() => downloadAttachment(tmsg.id, att.attachmentId, att.filename)}\n title=\"Download\"\n className=\"px-1.5 py-1.5 text-gray-400 hover:bg-gray-50 border-l border-gray-200\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n </button>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n })()}\n </>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Message List Panel ──\n const renderList = () => (\n <div className=\"flex-1 flex flex-col overflow-hidden\" ref={listRef}>\n <form onSubmit={handleSearch} className=\"px-3 py-2 border-b border-gray-200 flex items-center gap-2 shrink-0\">\n <div className=\"relative flex-1\">\n <svg className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" /></svg>\n <input value={searchQuery} onChange={e => setSearchQuery(e.target.value)}\n placeholder=\"Search mail...\"\n className=\"w-full pl-8 pr-8 py-1.5 text-sm border border-gray-200 rounded-md focus:border-blue-400 focus:ring-1 focus:ring-blue-400 bg-gray-50 focus:bg-white\" />\n {activeSearch && (\n <button type=\"button\" onClick={clearSearch} className=\"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n )}\n </div>\n <button type=\"button\" onClick={() => fetchMessages(label, undefined, activeSearch || undefined, true)} title=\"Refresh\"\n className=\"p-1.5 rounded-md hover:bg-gray-100 text-gray-500\">\n <svg className={`h-4 w-4 ${loadingMsgs ? 'animate-spin' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182M2.985 19.644l3.181-3.182\" /></svg>\n </button>\n <button type=\"button\" onClick={() => setSplitPane(p => !p)} title={splitPane ? 'Full view' : 'Split pane'}\n className={`p-1.5 rounded-md hover:bg-gray-100 ${splitPane ? 'text-blue-600 bg-blue-50' : 'text-gray-500'}`}>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 4.5v15m6-15v15M4.5 19.5h15a2.25 2.25 0 002.25-2.25V6.75a2.25 2.25 0 00-2.25-2.25h-15A2.25 2.25 0 002.25 6.75v10.5a2.25 2.25 0 002.25 2.25z\" /></svg>\n </button>\n </form>\n\n {selectedIds.size > 0 && (\n <div className=\"px-3 py-1.5 border-b border-gray-200 bg-blue-50 flex items-center gap-2 shrink-0\">\n <span className=\"text-xs font-medium text-blue-700\">{selectedIds.size} selected</span>\n <div className=\"flex gap-1 ml-auto\">\n <button onClick={bulkArchive} className=\"px-2 py-1 text-xs font-medium rounded bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\">Archive</button>\n <button onClick={bulkMarkRead} className=\"px-2 py-1 text-xs font-medium rounded bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\">Mark read</button>\n <button onClick={bulkMarkUnread} className=\"px-2 py-1 text-xs font-medium rounded bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\">Mark unread</button>\n <button onClick={bulkDelete} className=\"px-2 py-1 text-xs font-medium rounded bg-white border border-red-300 text-red-600 hover:bg-red-50\">Delete</button>\n <button onClick={() => setSelectedIds(new Set())} className=\"px-2 py-1 text-xs text-gray-500 hover:text-gray-700\">Clear</button>\n </div>\n </div>\n )}\n\n {messages.length > 0 && selectedIds.size === 0 && (\n <div className=\"px-3 py-1 border-b border-gray-100 shrink-0\">\n <label className=\"inline-flex items-center gap-2 text-xs text-gray-400 cursor-pointer hover:text-gray-600\">\n <input type=\"checkbox\" checked={selectedIds.size === messages.length} onChange={toggleSelectAll}\n className=\"h-3 w-3 rounded border-gray-300 text-blue-600 focus:ring-blue-500\" />\n Select all\n </label>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto\">\n {loadingMsgs && messages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-sm text-gray-400\">Loading...</div>\n ) : messages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-sm text-gray-400\">\n {activeSearch ? 'No results' : 'No messages'}\n </div>\n ) : (\n <>\n {messages.map((msg, idx) => {\n const cat = getCategoryLabel(msg.labelIds);\n return (\n <div key={msg.id} onClick={() => {\n if (label === 'DRAFT') { openDraft(msg.id); } else { openMessage(msg.id, msg.threadId); }\n }}\n className={`w-full text-left px-3 py-2 border-b border-gray-100 flex items-center gap-2 hover:bg-gray-50 transition-colors cursor-pointer group\n ${msg.isUnread ? 'bg-blue-50/40' : ''} ${focusIdx === idx ? 'ring-1 ring-inset ring-blue-400' : ''} ${selectedIds.has(msg.id) ? 'bg-blue-50' : ''}`}>\n <input type=\"checkbox\" checked={selectedIds.has(msg.id)}\n onChange={e => { e.stopPropagation(); toggleSelect(msg.id); }}\n onClick={e => e.stopPropagation()}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600 focus:ring-blue-500 shrink-0\" />\n <button onClick={e => { e.stopPropagation(); toggleStar(msg.id, msg.isStarred); }}\n className={`shrink-0 ${msg.isStarred ? 'text-yellow-500' : 'text-gray-300 hover:text-yellow-400'}`}>\n <svg className=\"h-4 w-4\" fill={msg.isStarred ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" /></svg>\n </button>\n <div className={`h-7 w-7 rounded-full flex items-center justify-center text-white text-xs font-medium shrink-0 ${avatarColor(msg.from)}`}>\n {msg.from.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className={`text-sm truncate ${msg.isUnread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>{msg.from}</span>\n {msg.threadCount > 1 && (\n <span className=\"text-[10px] px-1 py-0.5 rounded bg-gray-200 text-gray-600 font-medium\">{msg.threadCount}</span>\n )}\n {cat && <span className={`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${cat.color}`}>{cat.text}</span>}\n <div className=\"flex items-center gap-1 shrink-0 ml-auto\">\n {msg.attachmentCount > 0 && (\n <span className=\"inline-flex items-center gap-0.5 text-gray-400\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13\" /></svg>\n {msg.attachmentCount > 1 && <span className=\"text-[10px]\">{msg.attachmentCount}</span>}\n </span>\n )}\n <button onClick={e => { e.stopPropagation(); archiveMessage(msg.id); }} title=\"Archive\"\n className=\"opacity-0 group-hover:opacity-100 text-gray-300 hover:text-gray-600 transition-all p-0.5\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z\" /></svg>\n </button>\n <button onClick={e => { e.stopPropagation(); trashMessage(msg.id); }} title=\"Delete\"\n className=\"opacity-0 group-hover:opacity-100 text-gray-300 hover:text-red-500 transition-all p-0.5\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n <span className=\"text-xs text-gray-400 ml-1 w-10 text-right\">{timeAgo(msg.date)}</span>\n </div>\n </div>\n <p className={`text-sm truncate ${msg.isUnread ? 'font-medium text-gray-900' : 'text-gray-600'}`}>{msg.subject}</p>\n <p className=\"text-xs text-gray-400 truncate\">{msg.snippet}</p>\n </div>\n </div>\n );\n })}\n {nextPageToken && (\n <div className=\"py-3 text-center\">\n <button onClick={() => fetchMessages(label, nextPageToken, activeSearch || undefined)} disabled={loadingMsgs}\n className=\"text-sm text-blue-600 hover:text-blue-800 font-medium disabled:opacity-50\">\n {loadingMsgs ? 'Loading...' : 'Load more'}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n\n return (\n <div className=\"flex h-full\">\n <div className=\"w-48 shrink-0 border-r border-gray-200 flex flex-col\">\n <div className=\"p-2\">\n <button onClick={() => setComposing(true)}\n className=\"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-2 text-sm font-medium hover:bg-blue-700\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931z\" /></svg>\n Compose\n </button>\n </div>\n <nav className=\"flex-1 px-1 space-y-0.5\">\n {LABELS.map(l => (\n <button key={l.id} onClick={() => { setLabel(l.id); setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); clearSearch(); }}\n className={`w-full flex items-center gap-2 rounded-md px-3 py-1.5 text-sm transition-colors ${label === l.id && !activeSearch ? 'bg-blue-100 text-blue-800 font-medium' : 'text-gray-700 hover:bg-gray-100'}`}>\n <svg className=\"h-4 w-4 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={l.icon} /></svg>\n <span className=\"flex-1 text-left\">{l.label}</span>\n {(() => {\n const cached = l.id === label ? messages : msgCacheRef.current[l.id]?.items;\n const count = cached?.filter(m => m.isUnread).length || 0;\n return count > 0 ? (\n <span className=\"bg-blue-600 text-white text-[10px] font-bold rounded-full px-1.5 py-0.5 min-w-[18px] text-center\">{count}</span>\n ) : null;\n })()}\n </button>\n ))}\n {userLabels.length > 0 && (\n <LabelTree labels={userLabels} activeLabel={label} activeSearch={activeSearch}\n onSelect={(id) => { setLabel(id); setSelectedId(null); setSelectedMsg(null); setThreadMsgs([]); clearSearch(); }} />\n )}\n </nav>\n <div className=\"p-3 border-t border-gray-200\">\n <button onClick={() => window.dispatchEvent(new Event('open-google-connect'))} className=\"flex items-center gap-2 w-full hover:bg-gray-50 rounded-md p-1 transition-colors\" title=\"Google Services\">\n {user?.picture ? (\n <img src={user.picture} alt=\"\" className=\"h-6 w-6 rounded-full\" />\n ) : (\n <div className=\"h-6 w-6 rounded-full bg-gray-200\" />\n )}\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-[11px] font-medium text-gray-900 truncate\">{user?.name}</p>\n <p className=\"text-[10px] text-gray-500 truncate\">{user?.email}</p>\n </div>\n </button>\n </div>\n </div>\n\n {splitPane ? (\n <div className=\"flex-1 flex\">\n <div className=\"w-[340px] shrink-0 border-r border-gray-200 flex flex-col overflow-hidden\">\n {renderList()}\n </div>\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {selectedMsg ? renderDetail() : (\n <div className=\"flex-1 flex items-center justify-center text-sm text-gray-400\">Select a message</div>\n )}\n </div>\n </div>\n ) : (\n selectedMsg ? renderDetail() : renderList()\n )}\n\n {composing && (\n <ComposeEmail\n accessToken={accessToken!}\n userEmail={user?.email || ''}\n replyTo={replyTo}\n forwardBody={forwardBody}\n onClose={() => { setComposing(false); setReplyTo(null); setForwardBody(null); }}\n onSent={() => { setComposing(false); setReplyTo(null); setForwardBody(null); fetchMessages(label, undefined, activeSearch || undefined, true); }}\n />\n )}\n\n {spreadsheetData && (\n <SpreadsheetViewer data={spreadsheetData} onClose={() => setSpreadsheetData(null)} />\n )}\n\n {lightbox && (\n <div className=\"fixed inset-0 z-[9999] bg-black/80 flex items-center justify-center\" onClick={() => setLightbox(null)}>\n <div className=\"relative max-w-[90vw] max-h-[90vh]\" onClick={e => e.stopPropagation()}>\n <img src={lightbox.src} alt={lightbox.filename} className=\"max-w-full max-h-[85vh] object-contain rounded-lg\" />\n <div className=\"absolute top-2 right-2 flex gap-1\">\n <a href={lightbox.src} download={lightbox.filename} title=\"Download\"\n className=\"p-2 rounded-full bg-black/50 text-white hover:bg-black/70 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n </a>\n <button onClick={() => setLightbox(null)} title=\"Close\"\n className=\"p-2 rounded-full bg-black/50 text-white hover:bg-black/70 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 bg-black/50 text-white text-xs px-3 py-1 rounded-full\">{lightbox.filename}</div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ── Inline Image Preview ──\nfunction InlineImagePreview({ msgId, att, accessToken, onDownload, onLightbox }: {\n msgId: string; att: AttachmentInfo; accessToken: string; onDownload: (msgId: string, attachmentId: string, filename: string) => void;\n onLightbox?: (src: string, filename: string) => void;\n}) {\n const [src, setSrc] = useState<string | null>(null);\n const [expanded, setExpanded] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n fetch(`${GMAIL_API}/messages/${msgId}/attachments/${att.attachmentId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n .then(r => r.json())\n .then(data => {\n if (cancelled || !data.data) return;\n const b64 = data.data.replace(/-/g, '+').replace(/_/g, '/');\n setSrc(`data:${att.mimeType};base64,${b64}`);\n })\n .catch(() => {});\n return () => { cancelled = true; };\n }, [msgId, att.attachmentId, att.mimeType, accessToken]);\n\n return (\n <div className=\"inline-flex flex-col border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {src ? (\n <button onClick={() => { if (expanded && onLightbox) onLightbox(src, att.filename); else setExpanded(!expanded); }} className=\"block hover:opacity-90 transition-opacity\">\n <img src={src} alt={att.filename} className={expanded ? 'max-w-md max-h-96 object-contain' : 'w-24 h-24 object-cover'} />\n </button>\n ) : (\n <div className=\"w-24 h-24 flex items-center justify-center bg-gray-50 text-gray-400 text-xs\">Loading...</div>\n )}\n <div className=\"flex items-center border-t border-gray-200\">\n <span className=\"text-[10px] text-gray-500 truncate px-2 flex-1 max-w-[120px]\">{att.filename}</span>\n <button onClick={() => onDownload(msgId, att.attachmentId, att.filename)} title=\"Download\"\n className=\"px-1.5 py-1 text-gray-400 hover:bg-gray-50 border-l border-gray-200\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n </button>\n </div>\n </div>\n );\n}\n\n// ── Rich Text Editor Toolbar ──\nfunction RichTextToolbar() {\n const exec = (cmd: string, val?: string) => { document.execCommand(cmd, false, val); };\n\n return (\n <div className=\"flex items-center gap-0.5 px-2 py-1 border-b border-gray-200 bg-gray-50\">\n <button type=\"button\" onMouseDown={e => { e.preventDefault(); exec('bold'); }} title=\"Bold\"\n className=\"p-1.5 rounded hover:bg-gray-200 text-gray-600 text-xs font-bold\">B</button>\n <button type=\"button\" onMouseDown={e => { e.preventDefault(); exec('italic'); }} title=\"Italic\"\n className=\"p-1.5 rounded hover:bg-gray-200 text-gray-600 text-xs italic\">I</button>\n <button type=\"button\" onMouseDown={e => { e.preventDefault(); exec('underline'); }} title=\"Underline\"\n className=\"p-1.5 rounded hover:bg-gray-200 text-gray-600 text-xs underline\">U</button>\n <div className=\"w-px h-4 bg-gray-300 mx-1\" />\n <button type=\"button\" onMouseDown={e => {\n e.preventDefault();\n const url = prompt('Enter URL:');\n if (url) exec('createLink', url);\n }} title=\"Link\"\n className=\"p-1.5 rounded hover:bg-gray-200 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\" /></svg>\n </button>\n <button type=\"button\" onMouseDown={e => { e.preventDefault(); exec('insertUnorderedList'); }} title=\"Bullet list\"\n className=\"p-1.5 rounded hover:bg-gray-200 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z\" /></svg>\n </button>\n </div>\n );\n}\n\n// ── Contact Autocomplete ──\nfunction ContactAutocomplete({ value, onChange, className }: {\n value: string; onChange: (val: string) => void; className: string;\n}) {\n const [suggestions, setSuggestions] = useState<{ name: string; email: string }[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIdx, setSelectedIdx] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (suggestionsRef.current && !suggestionsRef.current.contains(e.target as Node) &&\n inputRef.current && !inputRef.current.contains(e.target as Node)) {\n setShowSuggestions(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const handleInputChange = (val: string) => {\n onChange(val);\n const parts = val.split(',');\n const currentPart = parts[parts.length - 1].trim().toLowerCase();\n if (currentPart.length < 2) {\n setSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n const recent = getRecentRecipients();\n const matches = recent.filter(r =>\n r.email.toLowerCase().includes(currentPart) ||\n r.name.toLowerCase().includes(currentPart)\n ).slice(0, 8);\n setSuggestions(matches);\n setShowSuggestions(matches.length > 0);\n setSelectedIdx(-1);\n };\n\n const selectSuggestion = (s: { name: string; email: string }) => {\n const parts = value.split(',');\n parts[parts.length - 1] = ` ${s.email}`;\n onChange(parts.join(',') + ', ');\n setShowSuggestions(false);\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!showSuggestions) return;\n if (e.key === 'ArrowDown') { e.preventDefault(); setSelectedIdx(prev => Math.min(prev + 1, suggestions.length - 1)); }\n if (e.key === 'ArrowUp') { e.preventDefault(); setSelectedIdx(prev => Math.max(prev - 1, 0)); }\n if (e.key === 'Enter' && selectedIdx >= 0) { e.preventDefault(); selectSuggestion(suggestions[selectedIdx]); }\n if (e.key === 'Escape') setShowSuggestions(false);\n };\n\n return (\n <div className=\"relative\">\n <input ref={inputRef} value={value} onChange={e => handleInputChange(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => { if (suggestions.length > 0) setShowSuggestions(true); }}\n className={className} placeholder=\"recipient@example.com\" autoFocus />\n {showSuggestions && (\n <div ref={suggestionsRef} className=\"absolute z-50 left-0 right-0 top-full mt-1 rounded-2xl max-h-48 overflow-y-auto\" style={getGlassStyle()}>\n {suggestions.map((s, i) => (\n <button key={s.email} onClick={() => selectSuggestion(s)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-50 flex items-center gap-2 ${i === selectedIdx ? 'bg-blue-50' : ''}`}>\n <div className={`h-6 w-6 rounded-full flex items-center justify-center text-white text-xs font-medium shrink-0 ${avatarColor(s.name)}`}>\n {s.name.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-gray-900 truncate\">{s.name}</p>\n <p className=\"text-xs text-gray-500 truncate\">{s.email}</p>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Compose Email ──\nfunction ComposeEmail({ accessToken, userEmail, replyTo, forwardBody, onClose, onSent }: {\n accessToken: string; userEmail: string;\n replyTo: { to: string; subject: string; threadId: string; messageId: string } | null;\n forwardBody: string | null;\n onClose: () => void; onSent: () => void;\n}) {\n const [to, setTo] = useState(replyTo?.to || '');\n const [subject, setSubject] = useState(replyTo?.subject || '');\n const [sending, setSending] = useState(false);\n const editorRef = useRef<HTMLDivElement>(null);\n const [draftId, setDraftId] = useState<string | null>(null);\n const draftTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const [showSignatureEditor, setShowSignatureEditor] = useState(false);\n const [signatureText, setSignatureText] = useState(() => localStorage.getItem('email_signature') || '');\n\n const isForward = !!forwardBody;\n const isReply = !!replyTo && !isForward;\n\n useEffect(() => {\n if (editorRef.current && forwardBody) {\n editorRef.current.innerHTML = `<br><br><pre style=\"white-space:pre-wrap;font-family:inherit;color:#666;\">${forwardBody.replace(/</g, '<')}</pre>`;\n } else if (editorRef.current) {\n const sig = localStorage.getItem('email_signature');\n if (sig) {\n editorRef.current.innerHTML = `<br><br><div style=\"color:#888;border-top:1px solid #eee;padding-top:8px;margin-top:8px;\">--<br>${sig.replace(/\\n/g, '<br>')}</div>`;\n }\n }\n }, [forwardBody]);\n\n // Draft auto-save every 30s\n useEffect(() => {\n draftTimerRef.current = setInterval(async () => {\n if (!editorRef.current) return;\n const bodyHtml = editorRef.current.innerHTML;\n if (!bodyHtml.trim() && !to.trim() && !subject.trim()) return;\n\n try {\n const headers = [\n `From: ${userEmail}`,\n `To: ${to}`,\n `Subject: ${subject}`,\n 'Content-Type: text/html; charset=utf-8',\n ];\n const rawMessage = [...headers, '', bodyHtml].join('\\r\\n');\n const encoded = btoa(unescape(encodeURIComponent(rawMessage))).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n\n const draftPayload: any = { message: { raw: encoded } };\n if (isReply && replyTo?.threadId) draftPayload.message.threadId = replyTo.threadId;\n\n if (draftId) {\n await fetch(`${GMAIL_API}/drafts/${draftId}`, {\n method: 'PUT',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify(draftPayload),\n });\n } else {\n const res = await fetch(`${GMAIL_API}/drafts`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify(draftPayload),\n });\n if (res.ok) {\n const data = await res.json();\n setDraftId(data.id);\n }\n }\n } catch {}\n }, 30000);\n\n return () => { if (draftTimerRef.current) clearInterval(draftTimerRef.current); };\n }, [accessToken, to, subject, draftId, userEmail, isReply, replyTo]);\n\n const handleSend = async () => {\n if (!to.trim() || !subject.trim()) { toast.error('To and Subject are required.'); return; }\n if (!editorRef.current) return;\n setSending(true);\n\n const bodyHtml = editorRef.current.innerHTML;\n\n let cancelled = false;\n const undoToast = showUndoToast('Sending email...', () => {\n cancelled = true;\n setSending(false);\n toast.info('Send cancelled.');\n }, 5000);\n\n await new Promise(resolve => setTimeout(resolve, 5000));\n\n if (cancelled) return;\n undoToast.dismiss();\n\n try {\n const headers = [\n `From: ${userEmail}`,\n `To: ${to}`,\n `Subject: ${subject}`,\n 'Content-Type: text/html; charset=utf-8',\n ];\n if (isReply && replyTo?.messageId) {\n headers.push(`In-Reply-To: ${replyTo.messageId}`);\n headers.push(`References: ${replyTo.messageId}`);\n }\n const rawMessage = [...headers, '', bodyHtml].join('\\r\\n');\n const encoded = btoa(unescape(encodeURIComponent(rawMessage))).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n\n const payload: any = { raw: encoded };\n if (isReply && replyTo?.threadId) payload.threadId = replyTo.threadId;\n\n const res = await fetch(`${GMAIL_API}/messages/send`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n if (!res.ok) throw new Error('Failed to send');\n\n // Track recipients for autocomplete\n to.split(',').map(s => s.trim()).filter(Boolean).forEach(email => {\n addRecentRecipient(email);\n });\n\n // Delete draft if we saved one\n if (draftId) {\n fetch(`${GMAIL_API}/drafts/${draftId}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${accessToken}` },\n }).catch(() => {});\n }\n\n toast.success('Email sent.');\n onSent();\n } catch (err: any) {\n toast.error(err.message || 'Failed to send email.');\n }\n setSending(false);\n };\n\n const saveSignature = () => {\n localStorage.setItem('email_signature', signatureText);\n setShowSignatureEditor(false);\n toast.success('Signature saved.');\n };\n\n const inp = 'block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm';\n\n return (\n <Modal open onClose={onClose} title={<span className=\"text-sm font-semibold\">{isForward ? 'Forward' : isReply ? 'Reply' : 'New Email'}</span>} size=\"md\">\n <div className=\"space-y-3\">\n <div>\n <label className=\"block text-xs font-medium text-gray-500 mb-1\">To</label>\n <ContactAutocomplete value={to} onChange={setTo} className={inp} />\n </div>\n <div><label className=\"block text-xs font-medium text-gray-500 mb-1\">Subject</label><input value={subject} onChange={e => setSubject(e.target.value)} className={inp} /></div>\n <div>\n <label className=\"block text-xs font-medium text-gray-500 mb-1\">Message</label>\n <div className=\"border border-gray-300 rounded-md overflow-hidden shadow-sm focus-within:border-blue-500 focus-within:ring-1 focus-within:ring-blue-500\">\n <RichTextToolbar />\n <div ref={editorRef} contentEditable suppressContentEditableWarning\n className=\"px-3 py-2 min-h-[200px] max-h-[400px] overflow-y-auto text-sm focus:outline-none\"\n style={{ whiteSpace: 'pre-wrap' }} />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {signatureText ? (\n <div className=\"flex items-center gap-2 text-xs text-gray-500\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n Signature attached\n <button onClick={() => setShowSignatureEditor(true)} className=\"text-blue-600 hover:text-blue-800\">Edit</button>\n </div>\n ) : (\n <button onClick={() => setShowSignatureEditor(true)} className=\"text-xs text-blue-600 hover:text-blue-800\">\n Add signature\n </button>\n )}\n {draftId && <span className=\"text-xs text-gray-400 ml-auto\">Draft saved</span>}\n </div>\n </div>\n <ModalActions>\n <button onClick={handleSend} disabled={sending}\n className=\"inline-flex items-center gap-2 bg-blue-600 text-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-blue-700 disabled:opacity-50\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5\" /></svg>\n {sending ? 'Sending...' : 'Send'}\n </button>\n </ModalActions>\n\n {showSignatureEditor && (\n <Modal open onClose={() => setShowSignatureEditor(false)} title=\"Edit Signature\" size=\"sm\">\n <div className=\"space-y-3\">\n <textarea value={signatureText} onChange={e => setSignatureText(e.target.value)}\n rows={6} placeholder=\"Your email signature...\"\n className=\"block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\" />\n {signatureText && (\n <div className=\"text-xs text-gray-500\">\n <p className=\"font-medium mb-1\">Preview:</p>\n <div className=\"border-t border-gray-200 pt-2 whitespace-pre-wrap\">{signatureText}</div>\n </div>\n )}\n </div>\n <ModalActions>\n <button onClick={saveSignature}\n className=\"bg-blue-600 text-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-blue-700\">\n Save\n </button>\n </ModalActions>\n </Modal>\n )}\n </Modal>\n );\n}\n\n// ── Email Body with CID image resolution ──\nfunction EmailBody({ html, accessToken }: { html: string; accessToken: string }) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n const doc = iframe.contentDocument;\n if (!doc) return;\n\n doc.open();\n doc.write(`<!DOCTYPE html><html><head><meta charset=\"utf-8\"><style>\n body { margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 14px; line-height: 1.5; color: #333; word-wrap: break-word; }\n img { max-width: 100%; height: auto; }\n a { color: #2563eb; }\n blockquote { border-left: 3px solid #ddd; margin: 8px 0; padding-left: 12px; color: #666; }\n pre { white-space: pre-wrap; font-family: inherit; }\n </style></head><body>${html}</body></html>`);\n doc.close();\n\n const resize = () => {\n if (iframe.contentDocument?.body) {\n iframe.style.height = iframe.contentDocument.body.scrollHeight + 'px';\n }\n };\n setTimeout(resize, 100);\n setTimeout(resize, 500);\n\n const imgs = doc.querySelectorAll('img[data-cid-attachment]');\n imgs.forEach(async (img) => {\n const attachmentId = img.getAttribute('data-cid-attachment');\n const mimeType = img.getAttribute('data-cid-mime') || 'image/png';\n const msgId = img.getAttribute('data-msg-id');\n if (!attachmentId || !msgId) return;\n try {\n const res = await fetch(`${GMAIL_API}/messages/${msgId}/attachments/${attachmentId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) return;\n const data = await res.json();\n if (data.data) {\n const b64 = data.data.replace(/-/g, '+').replace(/_/g, '/');\n (img as HTMLImageElement).src = `data:${mimeType};base64,${b64}`;\n setTimeout(resize, 100);\n }\n } catch {}\n });\n\n doc.addEventListener('click', (e) => {\n const a = (e.target as HTMLElement).closest('a');\n if (a?.href) { e.preventDefault(); window.open(a.href, '_blank'); }\n });\n }, [html, accessToken]);\n\n return (\n <iframe\n ref={iframeRef}\n className=\"w-full border-0\"\n style={{ minHeight: 100 }}\n sandbox=\"allow-same-origin\"\n title=\"Email content\"\n />\n );\n}\n\n// ── Nested Label Tree ──\ninterface LabelNode {\n id: string | null;\n name: string;\n children: LabelNode[];\n}\n\nfunction buildLabelTree(labels: { id: string; name: string }[]): LabelNode[] {\n const root: LabelNode[] = [];\n const map = new Map<string, LabelNode>();\n\n const sorted = [...labels].sort((a, b) => a.name.localeCompare(b.name));\n\n for (const l of sorted) {\n const parts = l.name.split('/');\n const leafName = parts[parts.length - 1];\n const node: LabelNode = { id: l.id, name: leafName, children: [] };\n map.set(l.name, node);\n\n if (parts.length === 1) {\n root.push(node);\n } else {\n const parentPath = parts.slice(0, -1).join('/');\n const parent = map.get(parentPath);\n if (parent) {\n parent.children.push(node);\n } else {\n root.push(node);\n }\n }\n }\n return root;\n}\n\nfunction LabelTree({ labels, activeLabel, activeSearch, onSelect }: {\n labels: { id: string; name: string; type: string }[];\n activeLabel: string;\n activeSearch: string;\n onSelect: (id: string) => void;\n}) {\n const tree = useMemo(() => buildLabelTree(labels), [labels]);\n\n const LABEL_STATE_KEY = 'email_label_expanded';\n const [expanded, setExpanded] = useState<Set<string>>(() => {\n try {\n const saved = JSON.parse(localStorage.getItem(LABEL_STATE_KEY) || '[]');\n return new Set(saved);\n } catch { return new Set(); }\n });\n\n const toggle = (name: string) => {\n setExpanded(prev => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name); else next.add(name);\n localStorage.setItem(LABEL_STATE_KEY, JSON.stringify([...next]));\n return next;\n });\n };\n\n const renderNodes = (nodes: LabelNode[], depth: number): React.ReactNode => {\n return nodes.map(node => {\n const hasChildren = node.children.length > 0;\n const isOpen = expanded.has(node.name);\n const isActive = node.id === activeLabel && !activeSearch;\n\n return (\n <div key={node.id || node.name}>\n <button\n onClick={() => { if (node.id) onSelect(node.id); if (hasChildren) toggle(node.name); }}\n className={`w-full flex items-center gap-1.5 rounded-md py-1 text-sm transition-colors ${isActive ? 'bg-blue-100 text-blue-800 font-medium' : 'text-gray-700 hover:bg-gray-100'}`}\n style={{ paddingLeft: 12 + depth * 16 }}\n >\n {hasChildren ? (\n <svg className={`h-3 w-3 shrink-0 text-gray-400 transition-transform ${isOpen ? '' : '-rotate-90'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" /></svg>\n ) : (\n <span className=\"w-3 shrink-0\" />\n )}\n <svg className=\"h-3.5 w-3.5 shrink-0 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\" /><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 6h.008v.008H6V6z\" /></svg>\n <span className=\"flex-1 text-left truncate\">{node.name}</span>\n </button>\n {hasChildren && isOpen && renderNodes(node.children, depth + 1)}\n </div>\n );\n });\n };\n\n return (\n <>\n <div className=\"border-t border-gray-200 mt-2 pt-2 mb-1\">\n <span className=\"px-3 text-[10px] font-medium text-gray-400 uppercase tracking-wider\">Labels</span>\n </div>\n {renderNodes(tree, 0)}\n </>\n );\n}\n\n// ── Spreadsheet Viewer (SheetJS HTML in iframe for clean selection) ──\nfunction SpreadsheetViewer({ data, onClose }: { data: { name: string; sheetNames: string[]; sheets: Record<string, string[][]> }; onClose: () => void }) {\n const [activeSheet, setActiveSheet] = useState(data.sheetNames[0] || '');\n const rows = data.sheets[activeSheet] || [];\n\n // Build columns from first row (header) or generate A, B, C...\n const colCount = rows.reduce((m, r) => Math.max(m, r.length), 0);\n const gridColumns = Array.from({ length: colCount }, (_, i) => ({\n key: `col_${i}`,\n title: rows[0]?.[i] || String.fromCharCode(65 + (i % 26)),\n width: 120,\n readOnly: true,\n }));\n\n // Use all rows as data (read-only, selectable for copy)\n const gridData = rows.length > 1 ? rows.slice(1) : rows;\n\n return (\n <Modal open onClose={onClose} title={data.name} size=\"2xl\" bodyScroll={false}>\n <div className=\"flex flex-col h-full overflow-hidden\">\n <div className=\"flex-1 min-h-0\">\n <EditableGrid\n columns={gridColumns}\n data={gridData}\n onChange={() => {}}\n fixedRows\n maxHeight=\"70vh\"\n />\n </div>\n <div className=\"flex items-center border-t border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"flex items-center gap-0.5 px-1 py-1 overflow-x-auto flex-1 min-w-0\">\n {data.sheetNames.map(name => (\n <button key={name} onClick={() => setActiveSheet(name)}\n className={`px-3 py-1 text-xs font-medium rounded-t whitespace-nowrap transition-colors ${\n activeSheet === name\n ? 'bg-white text-blue-700 border border-b-0 border-gray-300 -mb-px relative z-10'\n : 'text-gray-500 hover:text-gray-700 hover:bg-gray-100'\n }`}>\n {name}\n </button>\n ))}\n </div>\n <span className=\"text-xs text-gray-400 px-3 shrink-0\">Select cells and Ctrl+C to copy</span>\n </div>\n </div>\n </Modal>\n );\n}\n\n// ── Demo view ──────────────────────────────────────────────────────────\n// Used when window.__REACT_OS_SHELL_DEMO_MODE__ is set. Renders a small\n// static thread list + reading pane against the bundled fixtures so the\n// public demo has populated UI without a real Google OAuth Client ID.\nfunction EmailDemoView() {\n const [emails] = useState(() => getDemoEmails());\n const [selectedId, setSelectedId] = useState<string | null>(emails[0]?.id ?? null);\n const selected = emails.find(e => e.id === selectedId);\n const formatTime = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n return `${Math.floor(hrs / 24)}d ago`;\n };\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"px-3 py-1.5 border-b border-amber-200 bg-amber-50 text-[11px] text-amber-800\">\n Demo mode — these emails are sample data. Set up a Google OAuth Client ID in Customization to see your real Gmail.\n </div>\n <div className=\"flex flex-1 min-h-0\">\n <div className=\"w-80 shrink-0 border-r border-gray-200 overflow-y-auto\">\n {emails.map(e => (\n <button\n key={e.id}\n onClick={() => setSelectedId(e.id)}\n className={`w-full text-left px-3 py-2 border-b border-gray-100 ${selectedId === e.id ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className={`truncate text-sm ${e.unread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>{e.from}</span>\n <span className=\"text-[10px] text-gray-400 shrink-0 tabular-nums\">{formatTime(e.receivedAt)}</span>\n </div>\n <div className={`truncate text-sm ${e.unread ? 'font-medium text-gray-800' : 'text-gray-600'}`}>{e.subject}</div>\n <div className=\"truncate text-xs text-gray-500\">{e.snippet}</div>\n </button>\n ))}\n </div>\n <div className=\"flex-1 p-6 overflow-y-auto bg-white\">\n {selected ? (\n <>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-1\">{selected.subject}</h2>\n <div className=\"text-xs text-gray-500 mb-4\">From {selected.from} · {formatTime(selected.receivedAt)}</div>\n <pre className=\"whitespace-pre-wrap font-sans text-sm text-gray-800 leading-relaxed\">{selected.body}</pre>\n </>\n ) : (\n <div className=\"text-sm text-gray-400 text-center pt-20\">Select a message</div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
package/dist/Files-ASKLEUNU.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export { Files as default, openFilesInTrashMode } from './chunk-YL47AVBA.js';
|
|
2
|
-
import './chunk-L2AFKNSQ.js';
|
|
3
|
-
import './chunk-FXAOT23O.js';
|
|
4
|
-
import './chunk-KUIPWCTJ.js';
|
|
5
|
-
import './chunk-WIJ45SYD.js';
|
|
6
|
-
import './chunk-MUXDKEOC.js';
|
|
7
|
-
import './chunk-GP4Y3VCB.js';
|
|
8
|
-
import './chunk-4SHZ7BZO.js';
|
|
9
|
-
import './chunk-PLGHQ7QW.js';
|
|
10
|
-
import './chunk-SSA762W5.js';
|
|
11
|
-
//# sourceMappingURL=Files-ASKLEUNU.js.map
|
|
12
|
-
//# sourceMappingURL=Files-ASKLEUNU.js.map
|