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.
Files changed (69) hide show
  1. package/README.md +35 -15
  2. package/dist/{Browser-UGZQMWKW.js → Browser-H5KDP5OH.js} +3 -3
  3. package/dist/{Browser-UGZQMWKW.js.map → Browser-H5KDP5OH.js.map} +1 -1
  4. package/dist/{Calculator-3ZXNXWDH.js → Calculator-QQ7NF53Q.js} +4 -4
  5. package/dist/{Calculator-3ZXNXWDH.js.map → Calculator-QQ7NF53Q.js.map} +1 -1
  6. package/dist/{Calendar-ON4AQ54T.js → Calendar-J6L7FGHS.js} +175 -108
  7. package/dist/Calendar-J6L7FGHS.js.map +1 -0
  8. package/dist/{CurrencyConverter-ACTLK72N.js → CurrencyConverter-YHOGBUPH.js} +4 -4
  9. package/dist/{CurrencyConverter-ACTLK72N.js.map → CurrencyConverter-YHOGBUPH.js.map} +1 -1
  10. package/dist/{Documents-STDXQ7I4.js → Documents-6DYALASM.js} +3 -3
  11. package/dist/{Documents-STDXQ7I4.js.map → Documents-6DYALASM.js.map} +1 -1
  12. package/dist/Email-U2U5Z4DL.js +475 -0
  13. package/dist/Email-U2U5Z4DL.js.map +1 -0
  14. package/dist/Files-T62M4V5I.js +11 -0
  15. package/dist/{Files-ASKLEUNU.js.map → Files-T62M4V5I.js.map} +1 -1
  16. package/dist/{Minesweeper-CZNIO75H.js → Minesweeper-S2JHXYLX.js} +3 -3
  17. package/dist/{Minesweeper-CZNIO75H.js.map → Minesweeper-S2JHXYLX.js.map} +1 -1
  18. package/dist/{Notepad-ZYYH4ZXN.js → Notepad-2YF7X3XO.js} +3 -3
  19. package/dist/{Notepad-ZYYH4ZXN.js.map → Notepad-2YF7X3XO.js.map} +1 -1
  20. package/dist/{PomodoroTimer-2MNIEAUM.js → PomodoroTimer-3J7Z3NVQ.js} +4 -4
  21. package/dist/{PomodoroTimer-2MNIEAUM.js.map → PomodoroTimer-3J7Z3NVQ.js.map} +1 -1
  22. package/dist/Preview-WM6ZP5PZ.js +8 -0
  23. package/dist/{Preview-U72UL74H.js.map → Preview-WM6ZP5PZ.js.map} +1 -1
  24. package/dist/Spreadsheet-ZIE2SXAF.js +6 -0
  25. package/dist/{Spreadsheet-T7Y7PRD6.js.map → Spreadsheet-ZIE2SXAF.js.map} +1 -1
  26. package/dist/{TodoList-7JZ2SLDI.js → TodoList-QGXCDEIE.js} +18 -204
  27. package/dist/TodoList-QGXCDEIE.js.map +1 -0
  28. package/dist/{Weather-DYCTCB6T.js → Weather-2GFPSZ5V.js} +4 -4
  29. package/dist/{Weather-DYCTCB6T.js.map → Weather-2GFPSZ5V.js.map} +1 -1
  30. package/dist/{WorldClock-XL4OMFOY.js → WorldClock-P4JR5I6X.js} +4 -4
  31. package/dist/{WorldClock-XL4OMFOY.js.map → WorldClock-P4JR5I6X.js.map} +1 -1
  32. package/dist/apps/index.d.ts +2 -5
  33. package/dist/apps/index.js +23 -26
  34. package/dist/apps/index.js.map +1 -1
  35. package/dist/chunk-57B3WALN.js +114 -0
  36. package/dist/chunk-57B3WALN.js.map +1 -0
  37. package/dist/{chunk-4SHZ7BZO.js → chunk-62FC2FHC.js} +92 -21
  38. package/dist/chunk-62FC2FHC.js.map +1 -0
  39. package/dist/{chunk-FXAOT23O.js → chunk-ATQVRDDQ.js} +3 -3
  40. package/dist/{chunk-FXAOT23O.js.map → chunk-ATQVRDDQ.js.map} +1 -1
  41. package/dist/{chunk-GP4Y3VCB.js → chunk-KMGWSDEI.js} +480 -4
  42. package/dist/chunk-KMGWSDEI.js.map +1 -0
  43. package/dist/{chunk-SU6XVJND.js → chunk-O6FJZAFM.js} +3 -3
  44. package/dist/{chunk-SU6XVJND.js.map → chunk-O6FJZAFM.js.map} +1 -1
  45. package/dist/{chunk-YL47AVBA.js → chunk-SEV7UXGN.js} +4 -4
  46. package/dist/{chunk-YL47AVBA.js.map → chunk-SEV7UXGN.js.map} +1 -1
  47. package/dist/{chunk-L2AFKNSQ.js → chunk-ZBRFMK3E.js} +4 -4
  48. package/dist/{chunk-L2AFKNSQ.js.map → chunk-ZBRFMK3E.js.map} +1 -1
  49. package/dist/index.d.ts +55 -1
  50. package/dist/index.js +241 -135
  51. package/dist/index.js.map +1 -1
  52. package/package.json +10 -3
  53. package/dist/Calendar-ON4AQ54T.js.map +0 -1
  54. package/dist/Email-5WL3TWC6.js +0 -1883
  55. package/dist/Email-5WL3TWC6.js.map +0 -1
  56. package/dist/Files-ASKLEUNU.js +0 -12
  57. package/dist/GeminiChat-XTEBZIVK.js +0 -184
  58. package/dist/GeminiChat-XTEBZIVK.js.map +0 -1
  59. package/dist/Preview-U72UL74H.js +0 -8
  60. package/dist/Spreadsheet-T7Y7PRD6.js +0 -7
  61. package/dist/TodoList-7JZ2SLDI.js.map +0 -1
  62. package/dist/chunk-4SHZ7BZO.js.map +0 -1
  63. package/dist/chunk-5VXRBUEH.js +0 -104
  64. package/dist/chunk-5VXRBUEH.js.map +0 -1
  65. package/dist/chunk-GP4Y3VCB.js.map +0 -1
  66. package/dist/chunk-MUXDKEOC.js +0 -485
  67. package/dist/chunk-MUXDKEOC.js.map +0 -1
  68. package/dist/chunk-MVWEL34Y.js +0 -209
  69. 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, '&lt;')}</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, '&lt;')}</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 &gt; APIs &gt; Credentials &gt; 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, '&lt;')}</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"]}
@@ -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