pdfjs-reader-core 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/utils/pdfjs-init.ts","../src/utils/document-loader.ts","../src/utils/highlight-storage.ts","../src/store/viewer-store.ts","../src/store/annotation-store.ts","../src/utils/convenience.ts","../src/utils/export-annotations.ts","../src/utils/student-storage.ts","../src/utils/agent-api.ts","../src/utils/index.ts","../src/store/search-store.ts","../src/store/agent-store.ts","../src/store/student-store.ts","../src/store/index.ts","../src/hooks/PDFViewerContext.tsx","../src/hooks/usePDFViewer.ts","../src/hooks/usePageNavigation.ts","../src/hooks/useZoom.ts","../src/hooks/useTextSelection.ts","../src/hooks/useHighlights.ts","../src/hooks/useAnnotations.ts","../src/hooks/useTouchGestures.ts","../src/plugins/PluginManager.ts","../src/hooks/usePlugins.ts","../src/hooks/useAgentContext.ts","../src/hooks/useAskAbout.ts","../src/hooks/useBookmarks.ts","../src/hooks/useQuickNotes.ts","../src/hooks/useStudentProgress.ts","../src/hooks/index.ts","../src/components/Toolbar/Toolbar.tsx","../src/components/Toolbar/MobileToolbar.tsx","../src/components/Toolbar/index.ts","../src/components/Sidebar/ThumbnailPanel.tsx","../src/components/Sidebar/SearchPanel.tsx","../src/components/Sidebar/OutlinePanel.tsx","../src/components/Sidebar/HighlightsPanel.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Sidebar/MobileSidebar.tsx","../src/components/Sidebar/BookmarksPanel.tsx","../src/components/Sidebar/TakeawaysPanel.tsx","../src/components/Sidebar/index.ts","../src/components/AnnotationToolbar/AnnotationToolbar.tsx","../src/components/AnnotationToolbar/index.ts","../src/components/PDFPage/CanvasLayer.tsx","../src/components/PDFPage/TextLayer.tsx","../src/components/PDFPage/HighlightLayer.tsx","../src/components/PDFPage/AnnotationLayer.tsx","../src/components/PDFPage/PDFPage.tsx","../src/components/PDFPage/FocusRegionLayer.tsx","../src/components/PDFPage/index.ts","../src/components/SelectionToolbar/SelectionToolbar.tsx","../src/components/SelectionToolbar/index.ts","../src/components/HighlightPopover/HighlightPopover.tsx","../src/components/HighlightPopover/index.ts","../src/components/PDFViewer/DocumentContainer.tsx","../src/components/PDFViewer/VirtualizedDocumentContainer.tsx","../src/components/PDFViewer/ContinuousScrollContainer.tsx","../src/components/PDFViewer/DualPageContainer.tsx","../src/components/PDFViewer/PDFViewerClient.tsx","../src/components/PDFViewer/PDFViewer.tsx","../src/components/PDFViewer/index.ts","../src/index.ts","../src/components/index.ts","../src/components/Annotations/StickyNote.tsx","../src/components/Annotations/DrawingCanvas.tsx","../src/components/Annotations/ShapeRenderer.tsx","../src/components/Annotations/QuickNoteButton.tsx","../src/components/Annotations/QuickNotePopover.tsx","../src/components/AskAbout/AskAboutOverlay.tsx","../src/components/AskAbout/AskAboutTrigger.tsx","../src/components/Minimap/Minimap.tsx","../src/components/ErrorBoundary/PDFErrorBoundary.tsx","../src/plugins/index.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Utility for merging class names with support for conditionals.\n * Uses clsx under the hood.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\nlet isInitialized = false;\nlet initializationPromise: Promise<void> | null = null;\n\nexport interface PDFJSInitOptions {\n /** Custom worker source URL */\n workerSrc?: string;\n /** Whether to use the fake worker (for testing) */\n useFakeWorker?: boolean;\n}\n\n/**\n * Initialize pdf.js with the worker.\n * This should be called before loading any PDFs.\n */\nexport async function initializePDFJS(options: PDFJSInitOptions = {}): Promise<void> {\n if (isInitialized) {\n return;\n }\n\n if (initializationPromise) {\n return initializationPromise;\n }\n\n initializationPromise = (async () => {\n if (options.useFakeWorker) {\n // Use fake worker for testing\n pdfjsLib.GlobalWorkerOptions.workerSrc = '';\n } else if (options.workerSrc) {\n // Use custom worker source\n pdfjsLib.GlobalWorkerOptions.workerSrc = options.workerSrc;\n } else {\n // Use the CDN worker for reliability\n const version = pdfjsLib.version;\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${version}/pdf.worker.min.mjs`;\n }\n\n isInitialized = true;\n })();\n\n return initializationPromise;\n}\n\n/**\n * Check if pdf.js is initialized\n */\nexport function isPDFJSInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset initialization state (for testing)\n */\nexport function resetPDFJS(): void {\n isInitialized = false;\n initializationPromise = null;\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { pdfjsLib, initializePDFJS } from './pdfjs-init';\n\nexport interface LoadDocumentOptions {\n /** URL or data of the PDF */\n src: string | ArrayBuffer | Uint8Array;\n /** Custom worker source */\n workerSrc?: string;\n /** Password for encrypted PDFs */\n password?: string;\n /** Callback for loading progress */\n onProgress?: (progress: { loaded: number; total: number }) => void;\n /** Enable range requests for faster loading (default: true) */\n enableRangeRequests?: boolean;\n /** Enable streaming for progressive display (default: true) */\n enableStreaming?: boolean;\n /** Cache the document data (default: true) */\n cacheDocument?: boolean;\n}\n\nexport interface LoadDocumentResult {\n document: PDFDocumentProxy;\n numPages: number;\n}\n\n// Document cache to prevent duplicate loading\nconst documentCache = new Map<string, PDFDocumentProxy>();\n\n/**\n * Load a PDF document from a URL or data buffer.\n *\n * Optimizations:\n * - Range requests allow loading only the parts needed (faster initial load)\n * - Streaming allows pages to render as data arrives\n * - Document caching prevents duplicate fetches\n * - Worker handles parsing off the main thread\n */\nexport async function loadDocument(options: LoadDocumentOptions): Promise<LoadDocumentResult> {\n const {\n src,\n workerSrc,\n password,\n onProgress,\n enableRangeRequests = true,\n enableStreaming = true,\n cacheDocument = true,\n } = options;\n\n // Initialize pdf.js if not already done\n await initializePDFJS({ workerSrc });\n\n // Check cache for URL-based documents\n const cacheKey = typeof src === 'string' ? src : null;\n if (cacheKey && cacheDocument && documentCache.has(cacheKey)) {\n const cachedDoc = documentCache.get(cacheKey)!;\n return {\n document: cachedDoc,\n numPages: cachedDoc.numPages,\n };\n }\n\n // Prepare loading parameters\n const loadingParams: Record<string, unknown> = {\n password,\n // Performance optimizations\n isEvalSupported: false,\n useSystemFonts: true,\n // Enable range requests for faster initial load\n // This allows PDF.js to request only the parts of the PDF it needs\n disableRange: !enableRangeRequests,\n // Enable streaming for progressive rendering\n disableStream: !enableStreaming,\n // Don't fetch the entire document upfront\n disableAutoFetch: true,\n };\n\n // Set source based on type\n if (typeof src === 'string') {\n loadingParams.url = src;\n } else {\n loadingParams.data = src;\n }\n\n const loadingTask = pdfjsLib.getDocument(loadingParams);\n\n // Handle progress\n if (onProgress) {\n loadingTask.onProgress = ({ loaded, total }: { loaded: number; total: number }) => {\n onProgress({ loaded, total });\n };\n }\n\n const document = await loadingTask.promise;\n\n // Cache the document\n if (cacheKey && cacheDocument) {\n documentCache.set(cacheKey, document);\n }\n\n return {\n document,\n numPages: document.numPages,\n };\n}\n\n/**\n * Get a specific page from a PDF document.\n */\nexport async function getPage(\n document: PDFDocumentProxy,\n pageNumber: number\n): Promise<PDFPageProxy> {\n if (pageNumber < 1 || pageNumber > document.numPages) {\n throw new Error(`Invalid page number: ${pageNumber}. Document has ${document.numPages} pages.`);\n }\n\n return document.getPage(pageNumber);\n}\n\n/**\n * Get text content from a PDF page.\n */\nexport async function getPageTextContent(page: PDFPageProxy) {\n return page.getTextContent();\n}\n\n/**\n * Get the outline (table of contents) from a PDF document.\n */\nexport async function getOutline(document: PDFDocumentProxy) {\n return document.getOutline();\n}\n\n/**\n * Get metadata from a PDF document.\n */\nexport async function getMetadata(document: PDFDocumentProxy) {\n return document.getMetadata();\n}\n\n/**\n * Clear a document from cache.\n */\nexport function clearDocumentCache(url?: string): void {\n if (url) {\n const doc = documentCache.get(url);\n if (doc) {\n doc.destroy();\n documentCache.delete(url);\n }\n } else {\n // Clear all\n for (const doc of documentCache.values()) {\n doc.destroy();\n }\n documentCache.clear();\n }\n}\n\n/**\n * Preload a PDF document into cache without returning it.\n * Useful for prefetching documents the user might view next.\n */\nexport async function preloadDocument(url: string): Promise<void> {\n if (documentCache.has(url)) return;\n\n await loadDocument({ src: url, cacheDocument: true });\n}\n","import type { Highlight, HighlightColor } from '../types';\n\nconst STORAGE_PREFIX = 'pdf-reader-highlights';\n\n/**\n * Generate a storage key for a document.\n * Uses documentId to uniquely identify each PDF's highlights.\n */\nfunction getStorageKey(documentId: string): string {\n return `${STORAGE_PREFIX}:${documentId}`;\n}\n\n/**\n * Check if localStorage is available (SSR-safe).\n */\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Serializable version of a highlight for storage.\n * Dates are stored as ISO strings.\n */\ninterface StoredHighlight {\n id: string;\n pageNumber: number;\n rects: Array<{ x: number; y: number; width: number; height: number }>;\n color: HighlightColor;\n text: string;\n comment?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Convert a Highlight to storable format.\n */\nfunction toStoredHighlight(highlight: Highlight): StoredHighlight {\n return {\n ...highlight,\n createdAt: highlight.createdAt.toISOString(),\n updatedAt: highlight.updatedAt.toISOString(),\n };\n}\n\n/**\n * Convert a stored highlight back to a Highlight.\n */\nfunction fromStoredHighlight(stored: StoredHighlight): Highlight {\n return {\n ...stored,\n createdAt: new Date(stored.createdAt),\n updatedAt: new Date(stored.updatedAt),\n };\n}\n\n/**\n * Save highlights to localStorage for a specific document.\n *\n * @param documentId - Unique identifier for the document (e.g., URL hash, filename)\n * @param highlights - Array of highlights to save\n * @returns true if save succeeded, false otherwise\n */\nexport function saveHighlights(documentId: string, highlights: Highlight[]): boolean {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, highlights will not persist');\n return false;\n }\n\n try {\n const key = getStorageKey(documentId);\n const storedHighlights = highlights.map(toStoredHighlight);\n localStorage.setItem(key, JSON.stringify(storedHighlights));\n return true;\n } catch (error) {\n console.error('Failed to save highlights:', error);\n return false;\n }\n}\n\n/**\n * Load highlights from localStorage for a specific document.\n *\n * @param documentId - Unique identifier for the document\n * @returns Array of highlights, empty array if none found or error\n */\nexport function loadHighlights(documentId: string): Highlight[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n try {\n const key = getStorageKey(documentId);\n const stored = localStorage.getItem(key);\n\n if (!stored) {\n return [];\n }\n\n const parsed = JSON.parse(stored) as StoredHighlight[];\n return parsed.map(fromStoredHighlight);\n } catch (error) {\n console.error('Failed to load highlights:', error);\n return [];\n }\n}\n\n/**\n * Remove all highlights for a specific document from localStorage.\n *\n * @param documentId - Unique identifier for the document\n * @returns true if removal succeeded, false otherwise\n */\nexport function clearHighlights(documentId: string): boolean {\n if (!isStorageAvailable()) {\n return false;\n }\n\n try {\n const key = getStorageKey(documentId);\n localStorage.removeItem(key);\n return true;\n } catch (error) {\n console.error('Failed to clear highlights:', error);\n return false;\n }\n}\n\n/**\n * Get all document IDs that have stored highlights.\n *\n * @returns Array of document IDs\n */\nexport function getAllDocumentIds(): string[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n const ids: string[] = [];\n const prefixLength = STORAGE_PREFIX.length + 1; // +1 for the colon\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX + ':')) {\n ids.push(key.slice(prefixLength));\n }\n }\n\n return ids;\n}\n\n/**\n * Export highlights as a JSON string.\n * Includes metadata for import/export portability.\n *\n * @param highlights - Array of highlights to export\n * @returns JSON string representation\n */\nexport function exportHighlightsAsJSON(highlights: Highlight[]): string {\n const exportData = {\n version: 1,\n exportedAt: new Date().toISOString(),\n highlights: highlights.map(toStoredHighlight),\n };\n\n return JSON.stringify(exportData, null, 2);\n}\n\n/**\n * Import highlights from a JSON string.\n *\n * @param json - JSON string to import\n * @returns Array of highlights, or null if invalid\n */\nexport function importHighlightsFromJSON(json: string): Highlight[] | null {\n try {\n const data = JSON.parse(json);\n\n // Handle both direct array format and wrapped format\n let highlights: StoredHighlight[];\n if (Array.isArray(data)) {\n highlights = data;\n } else if (data.highlights && Array.isArray(data.highlights)) {\n highlights = data.highlights;\n } else {\n return null;\n }\n\n return highlights.map(fromStoredHighlight);\n } catch (error) {\n console.error('Failed to import highlights:', error);\n return null;\n }\n}\n\n/**\n * Export highlights as Markdown format.\n * Groups by page and includes text, comments, and metadata.\n *\n * @param highlights - Array of highlights to export\n * @param documentTitle - Optional document title for the header\n * @returns Markdown string representation\n */\nexport function exportHighlightsAsMarkdown(\n highlights: Highlight[],\n documentTitle?: string\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${documentTitle || 'PDF Highlights'}`);\n lines.push('');\n lines.push(`Exported on ${new Date().toLocaleDateString()}`);\n lines.push('');\n\n if (highlights.length === 0) {\n lines.push('_No highlights_');\n return lines.join('\\n');\n }\n\n // Group by page\n const byPage = new Map<number, Highlight[]>();\n highlights.forEach((h) => {\n if (!byPage.has(h.pageNumber)) {\n byPage.set(h.pageNumber, []);\n }\n byPage.get(h.pageNumber)!.push(h);\n });\n\n // Sort pages\n const sortedPages = Array.from(byPage.keys()).sort((a, b) => a - b);\n\n // Render each page group\n sortedPages.forEach((pageNumber) => {\n lines.push(`## Page ${pageNumber}`);\n lines.push('');\n\n const pageHighlights = byPage.get(pageNumber)!;\n // Sort highlights by vertical position\n pageHighlights.sort((a, b) => (a.rects[0]?.y ?? 0) - (b.rects[0]?.y ?? 0));\n\n pageHighlights.forEach((highlight) => {\n // Color indicator as emoji\n const colorEmoji = {\n yellow: '🟡',\n green: '🟢',\n blue: '🔵',\n pink: '🩷',\n orange: '🟠',\n }[highlight.color];\n\n lines.push(`${colorEmoji} > ${highlight.text}`);\n\n if (highlight.comment) {\n lines.push('');\n lines.push(`**Note:** ${highlight.comment}`);\n }\n\n lines.push('');\n });\n });\n\n // Summary\n lines.push('---');\n lines.push(`*${highlights.length} highlight${highlights.length !== 1 ? 's' : ''} total*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a document ID from a URL or file path.\n * Creates a consistent hash for the same document.\n *\n * @param source - URL or file path\n * @returns Document ID string\n */\nexport function generateDocumentId(source: string | ArrayBuffer | Uint8Array): string {\n if (typeof source === 'string') {\n // For URLs, use a simplified hash\n let hash = 0;\n for (let i = 0; i < source.length; i++) {\n const char = source.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `doc-${Math.abs(hash).toString(36)}`;\n }\n\n // For binary data, use size-based ID (not ideal but simple)\n const size = source instanceof ArrayBuffer ? source.byteLength : source.length;\n return `doc-binary-${size}`;\n}\n","import { createStore } from 'zustand/vanilla';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ViewerState, ViewerActions, ViewMode, Theme, SidebarPanel, ScrollMode } from '../types';\n\nconst ZOOM_LEVELS = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0, 4.0];\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10;\n\nexport type ViewerStore = ViewerState & ViewerActions;\n\nconst initialState: ViewerState = {\n // Document state\n document: null,\n numPages: 0,\n isLoading: false,\n error: null,\n\n // Navigation state\n currentPage: 1,\n scale: 1.0,\n rotation: 0,\n\n // UI state\n viewMode: 'single',\n scrollMode: 'single',\n theme: 'light',\n sidebarOpen: false,\n sidebarPanel: 'thumbnails',\n\n // Feature states\n isFullscreen: false,\n isPresentationMode: false,\n};\n\nexport function createViewerStore(initialOverrides: Partial<ViewerState> = {}) {\n return createStore<ViewerStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Document actions\n setDocument: (document: PDFDocumentProxy) => {\n set({\n document,\n numPages: document.numPages,\n isLoading: false,\n error: null,\n currentPage: 1,\n });\n },\n\n setLoading: (isLoading: boolean) => {\n set({ isLoading });\n },\n\n setError: (error: Error | null) => {\n set({ error, isLoading: false });\n },\n\n // Navigation actions\n setCurrentPage: (page: number) => {\n const { numPages } = get();\n if (page >= 1 && page <= numPages) {\n set({ currentPage: page });\n }\n },\n\n goToPage: (page: number) => {\n const { numPages } = get();\n const validPage = Math.max(1, Math.min(page, numPages));\n set({ currentPage: validPage });\n },\n\n nextPage: () => {\n const { currentPage, numPages } = get();\n if (currentPage < numPages) {\n set({ currentPage: currentPage + 1 });\n }\n },\n\n previousPage: () => {\n const { currentPage } = get();\n if (currentPage > 1) {\n set({ currentPage: currentPage - 1 });\n }\n },\n\n // Zoom actions\n setScale: (scale: number) => {\n const clampedScale = Math.max(MIN_SCALE, Math.min(MAX_SCALE, scale));\n set({ scale: clampedScale });\n },\n\n zoomIn: () => {\n const { scale } = get();\n const currentIndex = ZOOM_LEVELS.findIndex((z) => z >= scale);\n const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1);\n set({ scale: ZOOM_LEVELS[nextIndex] ?? MAX_SCALE });\n },\n\n zoomOut: () => {\n const { scale } = get();\n const currentIndex = ZOOM_LEVELS.findIndex((z) => z >= scale);\n const prevIndex = Math.max(currentIndex - 1, 0);\n set({ scale: ZOOM_LEVELS[prevIndex] ?? MIN_SCALE });\n },\n\n fitToWidth: () => {\n // This will be calculated by the component based on container width\n // For now, just set a reasonable default\n set({ scale: 1.0 });\n },\n\n fitToPage: () => {\n // This will be calculated by the component based on container size\n // For now, just set a reasonable default\n set({ scale: 1.0 });\n },\n\n // Rotation actions\n setRotation: (rotation: number) => {\n // Normalize rotation to 0, 90, 180, or 270\n const normalizedRotation = ((rotation % 360) + 360) % 360;\n set({ rotation: normalizedRotation });\n },\n\n rotateClockwise: () => {\n const { rotation } = get();\n set({ rotation: (rotation + 90) % 360 });\n },\n\n rotateCounterClockwise: () => {\n const { rotation } = get();\n set({ rotation: (rotation - 90 + 360) % 360 });\n },\n\n // UI actions\n setViewMode: (viewMode: ViewMode) => {\n set({ viewMode });\n },\n\n setScrollMode: (scrollMode: ScrollMode) => {\n set({ scrollMode });\n },\n\n setTheme: (theme: Theme) => {\n set({ theme });\n },\n\n toggleSidebar: () => {\n const { sidebarOpen } = get();\n set({ sidebarOpen: !sidebarOpen });\n },\n\n setSidebarPanel: (sidebarPanel: SidebarPanel) => {\n set({ sidebarPanel, sidebarOpen: sidebarPanel !== null });\n },\n\n setFullscreen: (isFullscreen: boolean) => {\n set({ isFullscreen });\n },\n\n // Reset\n reset: () => {\n const { document } = get();\n if (document) {\n document.destroy();\n }\n set(initialState);\n },\n }));\n}\n\n// Type for the store\nexport type ViewerStoreApi = ReturnType<typeof createViewerStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type { Highlight, Annotation, HighlightColor, DrawingPath } from '../types';\n\nexport type AnnotationTool = 'note' | 'draw' | 'shape' | null;\nexport type ShapeType = 'rect' | 'circle' | 'arrow' | 'line';\n\nexport interface AnnotationState {\n highlights: Highlight[];\n annotations: Annotation[];\n selectedHighlightId: string | null;\n selectedAnnotationId: string | null;\n activeHighlightColor: HighlightColor;\n isHighlightMode: boolean;\n isAnnotationMode: boolean;\n\n // Drawing state\n activeAnnotationTool: AnnotationTool;\n activeShapeType: ShapeType;\n drawingColor: string;\n drawingStrokeWidth: number;\n currentDrawingPath: DrawingPath | null;\n currentDrawingPage: number | null;\n}\n\nexport interface AnnotationActions {\n // Highlight actions\n addHighlight: (highlight: Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>) => Highlight;\n updateHighlight: (id: string, updates: Partial<Highlight>) => void;\n removeHighlight: (id: string) => void;\n selectHighlight: (id: string | null) => void;\n setActiveHighlightColor: (color: HighlightColor) => void;\n getHighlightsByPage: (pageNumber: number) => Highlight[];\n\n // Annotation actions\n addAnnotation: (annotation: Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) => Annotation;\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\n removeAnnotation: (id: string) => void;\n selectAnnotation: (id: string | null) => void;\n getAnnotationsByPage: (pageNumber: number) => Annotation[];\n\n // Mode actions\n setHighlightMode: (enabled: boolean) => void;\n setAnnotationMode: (enabled: boolean) => void;\n\n // Drawing tool actions\n setActiveAnnotationTool: (tool: AnnotationTool) => void;\n setActiveShapeType: (shapeType: ShapeType) => void;\n setDrawingColor: (color: string) => void;\n setDrawingStrokeWidth: (width: number) => void;\n\n // Drawing path actions\n startDrawing: (pageNumber: number, point: { x: number; y: number }) => void;\n addDrawingPoint: (point: { x: number; y: number }) => void;\n finishDrawing: () => Annotation | null;\n cancelDrawing: () => void;\n\n // Export/Import\n exportHighlights: () => string;\n importHighlights: (json: string) => void;\n exportAnnotations: () => string;\n importAnnotations: (json: string) => void;\n\n // Reset\n clearAll: () => void;\n}\n\nexport type AnnotationStore = AnnotationState & AnnotationActions;\n\nconst initialState: AnnotationState = {\n highlights: [],\n annotations: [],\n selectedHighlightId: null,\n selectedAnnotationId: null,\n activeHighlightColor: 'yellow',\n isHighlightMode: false,\n isAnnotationMode: false,\n\n // Drawing state defaults\n activeAnnotationTool: null,\n activeShapeType: 'rect',\n drawingColor: '#ef4444',\n drawingStrokeWidth: 2,\n currentDrawingPath: null,\n currentDrawingPage: null,\n};\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport function createAnnotationStore(initialOverrides: Partial<AnnotationState> = {}) {\n return createStore<AnnotationStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Highlight actions\n addHighlight: (highlight) => {\n const newHighlight: Highlight = {\n ...highlight,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n set((state) => ({\n highlights: [...state.highlights, newHighlight],\n }));\n return newHighlight;\n },\n\n updateHighlight: (id, updates) => {\n set((state) => ({\n highlights: state.highlights.map((h) =>\n h.id === id ? { ...h, ...updates, updatedAt: new Date() } : h\n ),\n }));\n },\n\n removeHighlight: (id) => {\n set((state) => ({\n highlights: state.highlights.filter((h) => h.id !== id),\n selectedHighlightId: state.selectedHighlightId === id ? null : state.selectedHighlightId,\n }));\n },\n\n selectHighlight: (id) => {\n set({ selectedHighlightId: id });\n },\n\n setActiveHighlightColor: (color) => {\n set({ activeHighlightColor: color });\n },\n\n getHighlightsByPage: (pageNumber) => {\n return get().highlights.filter((h) => h.pageNumber === pageNumber);\n },\n\n // Annotation actions\n addAnnotation: (annotation) => {\n const newAnnotation = {\n ...annotation,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n } as Annotation;\n set((state) => ({\n annotations: [...state.annotations, newAnnotation],\n }));\n return newAnnotation;\n },\n\n updateAnnotation: (id, updates) => {\n set((state) => ({\n annotations: state.annotations.map((a) =>\n a.id === id ? { ...a, ...updates, updatedAt: new Date() } : a\n ) as Annotation[],\n }));\n },\n\n removeAnnotation: (id) => {\n set((state) => ({\n annotations: state.annotations.filter((a) => a.id !== id),\n selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId,\n }));\n },\n\n selectAnnotation: (id) => {\n set({ selectedAnnotationId: id });\n },\n\n getAnnotationsByPage: (pageNumber) => {\n return get().annotations.filter((a) => a.pageNumber === pageNumber);\n },\n\n // Mode actions\n setHighlightMode: (enabled) => {\n set({\n isHighlightMode: enabled,\n isAnnotationMode: enabled ? false : get().isAnnotationMode,\n activeAnnotationTool: enabled ? null : get().activeAnnotationTool,\n });\n },\n\n setAnnotationMode: (enabled) => {\n set({\n isAnnotationMode: enabled,\n isHighlightMode: enabled ? false : get().isHighlightMode,\n });\n },\n\n // Drawing tool actions\n setActiveAnnotationTool: (tool) => {\n set({\n activeAnnotationTool: tool,\n isAnnotationMode: tool !== null,\n isHighlightMode: false,\n currentDrawingPath: null,\n currentDrawingPage: null,\n });\n },\n\n setActiveShapeType: (shapeType) => {\n set({ activeShapeType: shapeType });\n },\n\n setDrawingColor: (color) => {\n set({ drawingColor: color });\n },\n\n setDrawingStrokeWidth: (width) => {\n set({ drawingStrokeWidth: Math.max(1, Math.min(20, width)) });\n },\n\n // Drawing path actions\n startDrawing: (pageNumber, point) => {\n set({\n currentDrawingPath: { points: [point] },\n currentDrawingPage: pageNumber,\n });\n },\n\n addDrawingPoint: (point) => {\n const { currentDrawingPath } = get();\n if (currentDrawingPath) {\n set({\n currentDrawingPath: {\n points: [...currentDrawingPath.points, point],\n },\n });\n }\n },\n\n finishDrawing: () => {\n const { currentDrawingPath, currentDrawingPage, activeAnnotationTool, drawingColor, drawingStrokeWidth } = get();\n\n if (!currentDrawingPath || currentDrawingPage === null || activeAnnotationTool !== 'draw') {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n return null;\n }\n\n // Only create annotation if we have at least 2 points\n if (currentDrawingPath.points.length < 2) {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n return null;\n }\n\n const newAnnotation = {\n type: 'drawing' as const,\n pageNumber: currentDrawingPage,\n paths: [currentDrawingPath],\n color: drawingColor,\n strokeWidth: drawingStrokeWidth,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n set((state) => ({\n annotations: [...state.annotations, newAnnotation],\n currentDrawingPath: null,\n currentDrawingPage: null,\n }));\n\n return newAnnotation;\n },\n\n cancelDrawing: () => {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n },\n\n // Export/Import\n exportHighlights: () => {\n const highlights = get().highlights;\n return JSON.stringify(highlights, null, 2);\n },\n\n importHighlights: (json) => {\n try {\n const highlights = JSON.parse(json) as Highlight[];\n set({ highlights });\n } catch {\n console.error('Failed to import highlights');\n }\n },\n\n exportAnnotations: () => {\n const annotations = get().annotations;\n return JSON.stringify(annotations, null, 2);\n },\n\n importAnnotations: (json) => {\n try {\n const annotations = JSON.parse(json) as Annotation[];\n set({ annotations });\n } catch {\n console.error('Failed to import annotations');\n }\n },\n\n // Reset\n clearAll: () => {\n set({\n ...initialState,\n // Preserve user preferences\n drawingColor: get().drawingColor,\n drawingStrokeWidth: get().drawingStrokeWidth,\n activeHighlightColor: get().activeHighlightColor,\n });\n },\n }));\n}\n\nexport type AnnotationStoreApi = ReturnType<typeof createAnnotationStore>;\n","import { createRoot, Root } from 'react-dom/client';\nimport { createElement } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFViewer } from '../components/PDFViewer';\nimport { createViewerStore } from '../store/viewer-store';\nimport { createAnnotationStore } from '../store/annotation-store';\nimport { loadDocument } from './document-loader';\nimport type {\n Highlight,\n Annotation,\n Theme,\n ViewMode,\n SidebarPanel,\n PDFViewerProps,\n PDFDocumentLoadedEvent,\n} from '../types';\n\nexport interface PDFViewerControllerOptions {\n /** Initial page number */\n initialPage?: number;\n /** Initial scale/zoom level */\n initialScale?: number;\n /** Theme mode */\n theme?: Theme;\n /** Whether to show the toolbar */\n showToolbar?: boolean;\n /** Whether to show the sidebar */\n showSidebar?: boolean;\n /** Custom onDocumentLoad callback */\n onDocumentLoad?: (doc: PDFDocumentProxy) => void;\n /** Custom onPageChange callback */\n onPageChange?: (page: number) => void;\n /** Custom onScaleChange callback */\n onScaleChange?: (scale: number) => void;\n /** Custom onError callback */\n onError?: (error: Error) => void;\n /** PDF source - URL, ArrayBuffer, or Uint8Array */\n src?: string | ArrayBuffer | Uint8Array;\n}\n\nexport interface PDFViewerController {\n // Document operations\n loadDocument(src: string | ArrayBuffer | Uint8Array): Promise<void>;\n getDocument(): PDFDocumentProxy | null;\n\n // Navigation\n goToPage(page: number): void;\n nextPage(): void;\n previousPage(): void;\n getCurrentPage(): number;\n getTotalPages(): number;\n\n // Zoom\n setZoom(scale: number): void;\n zoomIn(): void;\n zoomOut(): void;\n fitToWidth(): void;\n fitToPage(): void;\n getZoom(): number;\n\n // Rotation\n setRotation(rotation: number): void;\n rotateClockwise(): void;\n rotateCounterClockwise(): void;\n getRotation(): number;\n\n // Theme & View\n setTheme(theme: Theme): void;\n getTheme(): Theme;\n setViewMode(mode: ViewMode): void;\n getViewMode(): ViewMode;\n\n // Sidebar\n toggleSidebar(): void;\n setSidebarPanel(panel: SidebarPanel): void;\n isSidebarOpen(): boolean;\n\n // Highlights\n getHighlights(): Highlight[];\n addHighlight(highlight: Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>): Highlight;\n removeHighlight(id: string): void;\n exportHighlights(): string;\n importHighlights(json: string): void;\n\n // Annotations\n getAnnotations(): Annotation[];\n addAnnotation(annotation: Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>): Annotation;\n removeAnnotation(id: string): void;\n exportAnnotations(): string;\n importAnnotations(json: string): void;\n\n // Events\n on<K extends keyof PDFViewerEventHandlers>(\n event: K,\n handler: PDFViewerEventHandlers[K]\n ): () => void;\n\n // Lifecycle\n destroy(): void;\n}\n\ninterface PDFViewerEventHandlers {\n pagechange: (page: number) => void;\n scalechange: (scale: number) => void;\n documentload: (doc: PDFDocumentProxy) => void;\n error: (error: Error) => void;\n}\n\ntype EventType = keyof PDFViewerEventHandlers;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventHandler = (data: any) => void;\n\n/**\n * Create a PDF viewer instance for non-React usage\n */\nexport function createPDFViewer(\n container: HTMLElement,\n options: PDFViewerControllerOptions = {}\n): PDFViewerController {\n // Create stores\n const viewerStore = createViewerStore();\n const annotationStore = createAnnotationStore();\n\n // Event handlers\n const eventHandlers: Map<EventType, Set<EventHandler>> = new Map();\n\n // React root\n let root: Root | null = null;\n let isDestroyed = false;\n\n // Helper to emit events\n const emit = (event: EventType, data: unknown) => {\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => handler(data));\n }\n };\n\n // Render the viewer\n const render = (src?: string | ArrayBuffer | Uint8Array) => {\n if (isDestroyed) return;\n\n if (!root) {\n root = createRoot(container);\n }\n\n const props: PDFViewerProps = {\n src: src || '',\n initialPage: options.initialPage,\n initialScale: options.initialScale,\n theme: options.theme,\n showToolbar: options.showToolbar,\n showSidebar: options.showSidebar,\n onDocumentLoad: (event: PDFDocumentLoadedEvent) => {\n options.onDocumentLoad?.(event.document);\n emit('documentload', event.document);\n },\n onPageChange: (page: number) => {\n options.onPageChange?.(page);\n emit('pagechange', page);\n },\n onScaleChange: (scale: number) => {\n options.onScaleChange?.(scale);\n emit('scalechange', scale);\n },\n onError: (error: Error) => {\n options.onError?.(error);\n emit('error', error);\n },\n };\n\n root.render(createElement(PDFViewer, props));\n };\n\n // Initialize with empty render if no src provided\n if (options.src) {\n render(options.src);\n }\n\n // Controller implementation\n const controller: PDFViewerController = {\n // Document operations\n async loadDocument(src: string | ArrayBuffer | Uint8Array) {\n render(src);\n // Wait for document to load\n const result = await loadDocument({ src });\n viewerStore.getState().setDocument(result.document);\n },\n\n getDocument() {\n return viewerStore.getState().document;\n },\n\n // Navigation\n goToPage(page: number) {\n viewerStore.getState().goToPage(page);\n },\n\n nextPage() {\n viewerStore.getState().nextPage();\n },\n\n previousPage() {\n viewerStore.getState().previousPage();\n },\n\n getCurrentPage() {\n return viewerStore.getState().currentPage;\n },\n\n getTotalPages() {\n return viewerStore.getState().numPages;\n },\n\n // Zoom\n setZoom(scale: number) {\n viewerStore.getState().setScale(scale);\n },\n\n zoomIn() {\n viewerStore.getState().zoomIn();\n },\n\n zoomOut() {\n viewerStore.getState().zoomOut();\n },\n\n fitToWidth() {\n viewerStore.getState().fitToWidth();\n },\n\n fitToPage() {\n viewerStore.getState().fitToPage();\n },\n\n getZoom() {\n return viewerStore.getState().scale;\n },\n\n // Rotation\n setRotation(rotation: number) {\n viewerStore.getState().setRotation(rotation);\n },\n\n rotateClockwise() {\n viewerStore.getState().rotateClockwise();\n },\n\n rotateCounterClockwise() {\n viewerStore.getState().rotateCounterClockwise();\n },\n\n getRotation() {\n return viewerStore.getState().rotation;\n },\n\n // Theme & View\n setTheme(theme: Theme) {\n viewerStore.getState().setTheme(theme);\n },\n\n getTheme() {\n return viewerStore.getState().theme;\n },\n\n setViewMode(mode: ViewMode) {\n viewerStore.getState().setViewMode(mode);\n },\n\n getViewMode() {\n return viewerStore.getState().viewMode;\n },\n\n // Sidebar\n toggleSidebar() {\n viewerStore.getState().toggleSidebar();\n },\n\n setSidebarPanel(panel: SidebarPanel) {\n viewerStore.getState().setSidebarPanel(panel);\n },\n\n isSidebarOpen() {\n return viewerStore.getState().sidebarOpen;\n },\n\n // Highlights\n getHighlights() {\n return annotationStore.getState().highlights;\n },\n\n addHighlight(highlight) {\n return annotationStore.getState().addHighlight(highlight);\n },\n\n removeHighlight(id: string) {\n annotationStore.getState().removeHighlight(id);\n },\n\n exportHighlights() {\n return annotationStore.getState().exportHighlights();\n },\n\n importHighlights(json: string) {\n annotationStore.getState().importHighlights(json);\n },\n\n // Annotations\n getAnnotations() {\n return annotationStore.getState().annotations;\n },\n\n addAnnotation(annotation) {\n return annotationStore.getState().addAnnotation(annotation);\n },\n\n removeAnnotation(id: string) {\n annotationStore.getState().removeAnnotation(id);\n },\n\n exportAnnotations() {\n return annotationStore.getState().exportAnnotations();\n },\n\n importAnnotations(json: string) {\n annotationStore.getState().importAnnotations(json);\n },\n\n // Events\n on<K extends keyof PDFViewerEventHandlers>(event: K, handler: PDFViewerEventHandlers[K]) {\n if (!eventHandlers.has(event)) {\n eventHandlers.set(event, new Set());\n }\n eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n eventHandlers.get(event)?.delete(handler as EventHandler);\n };\n },\n\n // Lifecycle\n destroy() {\n if (isDestroyed) return;\n isDestroyed = true;\n\n // Clear event handlers\n eventHandlers.clear();\n\n // Unmount React\n if (root) {\n root.unmount();\n root = null;\n }\n\n // Reset stores\n viewerStore.getState().reset();\n annotationStore.getState().clearAll();\n },\n };\n\n return controller;\n}\n\n/**\n * Initialize a PDF viewer with minimal configuration\n */\nexport async function quickViewer(\n container: HTMLElement | string,\n src: string | ArrayBuffer | Uint8Array,\n options: Partial<PDFViewerControllerOptions> = {}\n): Promise<PDFViewerController> {\n // Resolve container\n const element =\n typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!element) {\n throw new Error(`Container element not found: ${container}`);\n }\n\n // Create and load\n const viewer = createPDFViewer(element, { ...options, src });\n return viewer;\n}\n","import type { Highlight } from '../types';\nimport type { Bookmark, QuickNote, Takeaway } from '../types/agent-context';\n\nexport interface ExportData {\n highlights?: Highlight[];\n bookmarks?: Bookmark[];\n quickNotes?: QuickNote[];\n takeaways?: Takeaway[];\n documentTitle?: string;\n}\n\n/**\n * Export all annotations as a comprehensive Markdown document.\n * Organizes content by page with highlights, notes, bookmarks, and takeaways.\n */\nexport function exportAnnotationsAsMarkdown(data: ExportData): string {\n const { highlights = [], bookmarks = [], quickNotes = [], takeaways = [], documentTitle } = data;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${documentTitle || 'PDF Study Notes'}`);\n lines.push('');\n lines.push(`Exported on ${new Date().toLocaleDateString()} at ${new Date().toLocaleTimeString()}`);\n lines.push('');\n\n // Summary statistics\n const stats: string[] = [];\n if (highlights.length > 0) stats.push(`${highlights.length} highlight${highlights.length !== 1 ? 's' : ''}`);\n if (bookmarks.length > 0) stats.push(`${bookmarks.length} bookmark${bookmarks.length !== 1 ? 's' : ''}`);\n if (quickNotes.length > 0) stats.push(`${quickNotes.length} note${quickNotes.length !== 1 ? 's' : ''}`);\n if (takeaways.length > 0) stats.push(`${takeaways.length} takeaway${takeaways.length !== 1 ? 's' : ''}`);\n\n if (stats.length > 0) {\n lines.push(`**Summary:** ${stats.join(', ')}`);\n lines.push('');\n }\n\n // Collect all page numbers that have content\n const allPages = new Set<number>();\n highlights.forEach((h) => allPages.add(h.pageNumber));\n bookmarks.forEach((b) => allPages.add(b.pageNumber));\n quickNotes.forEach((n) => allPages.add(n.pageNumber));\n takeaways.forEach((t) => allPages.add(t.pageNumber));\n\n if (allPages.size === 0) {\n lines.push('_No annotations yet._');\n return lines.join('\\n');\n }\n\n // Sort pages\n const sortedPages = Array.from(allPages).sort((a, b) => a - b);\n\n // Render each page\n sortedPages.forEach((pageNumber) => {\n lines.push(`## Page ${pageNumber}`);\n lines.push('');\n\n // Bookmarks for this page\n const pageBookmarks = bookmarks.filter((b) => b.pageNumber === pageNumber);\n if (pageBookmarks.length > 0) {\n pageBookmarks.forEach((bookmark) => {\n lines.push(`**Bookmark:** ${bookmark.label || 'Page ' + bookmark.pageNumber}`);\n if (bookmark.userNote) {\n lines.push(`> ${bookmark.userNote}`);\n }\n if (bookmark.agentContext) {\n lines.push(`> *AI context: \"${bookmark.agentContext}\"*`);\n }\n lines.push('');\n });\n }\n\n // Takeaways for this page\n const pageTakeaways = takeaways.filter((t) => t.pageNumber === pageNumber);\n if (pageTakeaways.length > 0) {\n lines.push('### Key Takeaways');\n lines.push('');\n pageTakeaways.forEach((takeaway) => {\n const icon = takeaway.source === 'agent' ? '🤖' : '📝';\n lines.push(`${icon} ${takeaway.summary}`);\n lines.push('');\n });\n }\n\n // Highlights for this page\n const pageHighlights = highlights.filter((h) => h.pageNumber === pageNumber);\n if (pageHighlights.length > 0) {\n lines.push('### Highlights');\n lines.push('');\n pageHighlights.sort((a, b) => (a.rects[0]?.y ?? 0) - (b.rects[0]?.y ?? 0));\n pageHighlights.forEach((highlight) => {\n const sourceIcon = highlight.source === 'agent' ? '🤖' : '';\n const colorEmoji = {\n yellow: '🟡',\n green: '🟢',\n blue: '🔵',\n pink: '🩷',\n orange: '🟠',\n }[highlight.color];\n\n lines.push(`${colorEmoji}${sourceIcon} > ${highlight.text}`);\n if (highlight.comment) {\n lines.push(`> **Note:** ${highlight.comment}`);\n }\n lines.push('');\n });\n }\n\n // Quick notes for this page\n const pageNotes = quickNotes.filter((n) => n.pageNumber === pageNumber);\n if (pageNotes.length > 0) {\n lines.push('### Notes');\n lines.push('');\n pageNotes.forEach((note) => {\n lines.push(`📝 ${note.content}`);\n if (note.agentLastStatement) {\n lines.push(`> *Written while AI discussed: \"${note.agentLastStatement}\"*`);\n }\n lines.push('');\n });\n }\n\n lines.push('---');\n lines.push('');\n });\n\n // Footer\n lines.push('');\n lines.push('*Generated by PDF Reader with Student Learning Features*');\n\n return lines.join('\\n');\n}\n\n/**\n * Export all annotations as JSON.\n */\nexport function exportAnnotationsAsJSON(data: ExportData): string {\n const exportPayload = {\n version: 1,\n exportedAt: new Date().toISOString(),\n documentTitle: data.documentTitle,\n highlights: data.highlights?.map((h) => ({\n ...h,\n createdAt: h.createdAt.toISOString(),\n updatedAt: h.updatedAt.toISOString(),\n })),\n bookmarks: data.bookmarks?.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: data.quickNotes?.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: data.takeaways?.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n };\n\n return JSON.stringify(exportPayload, null, 2);\n}\n\n/**\n * Download content as a file.\n */\nexport function downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Export annotations as Markdown and trigger download.\n */\nexport function downloadAnnotationsAsMarkdown(data: ExportData, filename = 'study-notes.md'): void {\n const content = exportAnnotationsAsMarkdown(data);\n downloadFile(content, filename, 'text/markdown');\n}\n\n/**\n * Export annotations as JSON and trigger download.\n */\nexport function downloadAnnotationsAsJSON(data: ExportData, filename = 'annotations.json'): void {\n const content = exportAnnotationsAsJSON(data);\n downloadFile(content, filename, 'application/json');\n}\n","import type { Bookmark, QuickNote, Takeaway } from '../types/agent-context';\n\nconst STORAGE_PREFIX = 'pdf-reader-student';\n\n/**\n * Check if localStorage is available (SSR-safe).\n */\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a storage key for a document.\n */\nfunction getStorageKey(documentId: string, type: string): string {\n return `${STORAGE_PREFIX}:${documentId}:${type}`;\n}\n\n// Serialization interfaces\ninterface StoredBookmark extends Omit<Bookmark, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredQuickNote extends Omit<QuickNote, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredTakeaway extends Omit<Takeaway, 'timestamp'> {\n timestamp: string;\n}\n\nexport interface StoredStudentData {\n bookmarks: StoredBookmark[];\n quickNotes: StoredQuickNote[];\n takeaways: StoredTakeaway[];\n visitedPages: number[];\n progress: number;\n lastAccessed: string;\n}\n\nexport interface StudentData {\n bookmarks: Bookmark[];\n quickNotes: QuickNote[];\n takeaways: Takeaway[];\n visitedPages: Set<number>;\n progress: number;\n lastAccessed: Date;\n}\n\n/**\n * Save student data to localStorage.\n */\nexport function saveStudentData(documentId: string, data: StudentData): boolean {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, student data will not persist');\n return false;\n }\n\n try {\n const storedData: StoredStudentData = {\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n visitedPages: Array.from(data.visitedPages),\n progress: data.progress,\n lastAccessed: new Date().toISOString(),\n };\n\n localStorage.setItem(getStorageKey(documentId, 'data'), JSON.stringify(storedData));\n return true;\n } catch (error) {\n console.error('Failed to save student data:', error);\n return false;\n }\n}\n\n/**\n * Load student data from localStorage.\n */\nexport function loadStudentData(documentId: string): StudentData | null {\n if (!isStorageAvailable()) {\n return null;\n }\n\n try {\n const stored = localStorage.getItem(getStorageKey(documentId, 'data'));\n if (!stored) {\n return null;\n }\n\n const data: StoredStudentData = JSON.parse(stored);\n\n return {\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: new Date(b.timestamp),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: new Date(n.timestamp),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: new Date(t.timestamp),\n })),\n visitedPages: new Set(data.visitedPages),\n progress: data.progress,\n lastAccessed: new Date(data.lastAccessed),\n };\n } catch (error) {\n console.error('Failed to load student data:', error);\n return null;\n }\n}\n\n/**\n * Clear student data for a specific document.\n */\nexport function clearStudentData(documentId: string): boolean {\n if (!isStorageAvailable()) {\n return false;\n }\n\n try {\n localStorage.removeItem(getStorageKey(documentId, 'data'));\n return true;\n } catch (error) {\n console.error('Failed to clear student data:', error);\n return false;\n }\n}\n\n/**\n * Get all document IDs that have stored student data.\n */\nexport function getAllStudentDataDocumentIds(): string[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n const ids: string[] = [];\n const prefixWithColon = STORAGE_PREFIX + ':';\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(prefixWithColon) && key.endsWith(':data')) {\n const id = key.slice(prefixWithColon.length, -5); // Remove prefix and ':data' suffix\n ids.push(id);\n }\n }\n\n return ids;\n}\n\n/**\n * Get storage usage statistics.\n */\nexport function getStorageStats(): { usedBytes: number; itemCount: number } {\n if (!isStorageAvailable()) {\n return { usedBytes: 0, itemCount: 0 };\n }\n\n let usedBytes = 0;\n let itemCount = 0;\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) {\n const value = localStorage.getItem(key);\n if (value) {\n usedBytes += key.length + value.length;\n itemCount++;\n }\n }\n }\n\n return { usedBytes, itemCount };\n}\n","import type { StoreApi } from 'zustand/vanilla';\nimport type { AgentStore } from '../store/agent-store';\nimport type { StudentStore } from '../store/student-store';\nimport type { ViewerStore } from '../store/viewer-store';\nimport type { AnnotationStore } from '../store/annotation-store';\nimport type {\n AgentAPI,\n AgentContext,\n FocusedRegion,\n Takeaway,\n AgentHighlightParams,\n} from '../types/agent-context';\nimport type { HighlightColor } from '../types';\n\nexport interface AgentAPIStores {\n agentStore: StoreApi<AgentStore>;\n studentStore: StoreApi<StudentStore>;\n viewerStore: StoreApi<ViewerStore>;\n annotationStore: StoreApi<AnnotationStore>;\n}\n\n/**\n * Create a standalone Agent API for external AI agent integration.\n * This allows external agents to interact with the PDF viewer without\n * needing direct access to React hooks.\n *\n * @example\n * ```typescript\n * import { createAgentAPI } from 'pdfjs-reader-core';\n *\n * // Get stores from the context (this would typically be done in a React component)\n * const api = createAgentAPI(stores);\n *\n * // Now the external agent can use the API\n * api.setAgentContext({ lastStatement: \"The mitochondria is the powerhouse of the cell\" });\n * api.focusRegion({ pageNumber: 1, x: 100, y: 200, width: 300, height: 50, style: 'pulse' });\n * api.addTakeaway(1, \"Key concept: Cell energy production\");\n * ```\n */\nexport function createAgentAPI(stores: AgentAPIStores): AgentAPI {\n const { agentStore, studentStore, viewerStore, annotationStore } = stores;\n\n let focusRegionIdCounter = 0;\n\n const generateFocusRegionId = (): string => {\n return `api-focus-${++focusRegionIdCounter}-${Date.now()}`;\n };\n\n const api: AgentAPI = {\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => {\n const id = generateFocusRegionId();\n const focusedRegion: FocusedRegion = {\n ...region,\n id,\n style: region.style ?? 'pulse',\n };\n\n const state = agentStore.getState();\n agentStore.setState({\n focusedRegions: [...state.focusedRegions, focusedRegion],\n });\n\n // Set up auto-clear if timeout is specified\n if (region.autoClearTimeout && region.autoClearTimeout > 0) {\n setTimeout(() => {\n api.clearFocusedRegion(id);\n }, region.autoClearTimeout);\n }\n\n return id;\n },\n\n clearFocusedRegion: (id?: string) => {\n if (id) {\n const state = agentStore.getState();\n agentStore.setState({\n focusedRegions: state.focusedRegions.filter((r) => r.id !== id),\n });\n } else {\n agentStore.setState({ focusedRegions: [] });\n }\n },\n\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n const takeaway: Takeaway = {\n id: `takeaway-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n pageNumber,\n summary,\n timestamp: new Date(),\n source: 'agent',\n metadata,\n };\n\n const state = studentStore.getState();\n studentStore.setState({\n takeaways: [...state.takeaways, takeaway],\n });\n\n return takeaway;\n },\n\n setAgentContext: (context: Partial<AgentContext>) => {\n const currentContext = agentStore.getState().currentContext;\n agentStore.setState({\n currentContext: {\n ...currentContext,\n ...context,\n timestamp: context.timestamp ?? new Date(),\n } as AgentContext,\n });\n },\n\n addAgentHighlight: (params: AgentHighlightParams) => {\n const highlightId = `agent-hl-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const now = new Date();\n\n const state = annotationStore.getState();\n annotationStore.setState({\n highlights: [\n ...state.highlights,\n {\n id: highlightId,\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? ('blue' as HighlightColor),\n comment: params.comment,\n createdAt: now,\n updatedAt: now,\n source: 'agent',\n },\n ],\n });\n\n return highlightId;\n },\n\n goToPage: (pageNumber: number) => {\n viewerStore.getState().goToPage(pageNumber);\n },\n\n getCurrentPage: () => {\n return viewerStore.getState().currentPage;\n },\n\n getAgentContext: () => {\n return agentStore.getState().currentContext;\n },\n };\n\n return api;\n}\n\n/**\n * Convenience type for the return value of createAgentAPI\n */\nexport type AgentAPIInstance = ReturnType<typeof createAgentAPI>;\n","export { cn } from './cn';\nexport { initializePDFJS, isPDFJSInitialized, resetPDFJS, pdfjsLib } from './pdfjs-init';\nexport {\n loadDocument,\n getPage,\n getPageTextContent,\n getOutline,\n getMetadata,\n clearDocumentCache,\n preloadDocument,\n type LoadDocumentOptions,\n type LoadDocumentResult,\n} from './document-loader';\nexport {\n saveHighlights,\n loadHighlights,\n clearHighlights,\n getAllDocumentIds,\n exportHighlightsAsJSON,\n importHighlightsFromJSON,\n exportHighlightsAsMarkdown,\n generateDocumentId,\n} from './highlight-storage';\nexport {\n createPDFViewer,\n quickViewer,\n type PDFViewerController,\n type PDFViewerControllerOptions,\n} from './convenience';\n\n// Student Learning Utils\nexport {\n exportAnnotationsAsMarkdown,\n exportAnnotationsAsJSON,\n downloadAnnotationsAsMarkdown,\n downloadAnnotationsAsJSON,\n downloadFile,\n type ExportData,\n} from './export-annotations';\n\nexport {\n saveStudentData,\n loadStudentData,\n clearStudentData,\n getAllStudentDataDocumentIds,\n getStorageStats,\n type StoredStudentData,\n type StudentData,\n} from './student-storage';\n\nexport {\n createAgentAPI,\n type AgentAPIStores,\n type AgentAPIInstance,\n} from './agent-api';\n\n// Mobile Optimizations\nexport {\n detectDeviceCapabilities,\n getDeviceCapabilities,\n getRenderConfig,\n getGlobalRenderConfig,\n getMemoryStatus,\n getGlobalRenderQueue,\n resetMobileConfig,\n calculateOptimalCanvasDimensions,\n throttle,\n debounce,\n requestIdleCallbackCompat,\n cancelIdleCallbackCompat,\n RenderQueue,\n type DeviceCapabilities,\n type RenderQuality,\n type RenderConfig,\n type MemoryStatus,\n} from './mobile-config';\n","import { createStore } from 'zustand/vanilla';\nimport type { SearchState, SearchResult, HighlightRect } from '../types';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\n\n// Define local text item interface to avoid pdfjs-dist type issues\ninterface TextContentItem {\n str?: string;\n transform?: number[];\n width?: number;\n height?: number;\n}\n\nexport interface SearchActions {\n setQuery: (query: string) => void;\n search: (document: PDFDocumentProxy) => Promise<void>;\n clearSearch: () => void;\n nextResult: () => void;\n previousResult: () => void;\n goToResult: (index: number) => void;\n toggleCaseSensitive: () => void;\n toggleWholeWord: () => void;\n getCurrentResult: () => SearchResult | null;\n}\n\nexport type SearchStore = SearchState & SearchActions;\n\nconst initialState: SearchState = {\n query: '',\n results: [],\n currentResultIndex: -1,\n isSearching: false,\n caseSensitive: false,\n wholeWord: false,\n};\n\nfunction isTextItem(item: TextContentItem): item is TextContentItem & { str: string; transform: number[]; width: number; height: number } {\n return typeof item.str === 'string';\n}\n\nexport function createSearchStore(initialOverrides: Partial<SearchState> = {}) {\n return createStore<SearchStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n setQuery: (query) => {\n set({ query });\n },\n\n search: async (document) => {\n const { query, caseSensitive, wholeWord } = get();\n\n if (!query.trim()) {\n set({ results: [], currentResultIndex: -1, isSearching: false });\n return;\n }\n\n set({ isSearching: true, results: [], currentResultIndex: -1 });\n\n const results: SearchResult[] = [];\n const numPages = document.numPages;\n\n // Prepare search pattern\n const searchText = caseSensitive ? query : query.toLowerCase();\n\n for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n try {\n const page = await document.getPage(pageNum);\n const textContent = await page.getTextContent();\n const viewport = page.getViewport({ scale: 1 });\n\n // Combine all text items on the page\n let pageText = '';\n const textItems: Array<{ text: string; transform: number[]; width: number; height: number }> = [];\n\n for (const item of textContent.items as TextContentItem[]) {\n if (isTextItem(item)) {\n textItems.push({\n text: item.str,\n transform: item.transform,\n width: item.width,\n height: item.height,\n });\n pageText += item.str;\n }\n }\n\n // Search in page text\n const textToSearch = caseSensitive ? pageText : pageText.toLowerCase();\n let matchIndex = 0;\n let startIndex = 0;\n\n while ((startIndex = textToSearch.indexOf(searchText, startIndex)) !== -1) {\n // Check whole word condition\n if (wholeWord) {\n const before = startIndex > 0 ? textToSearch[startIndex - 1] : ' ';\n const after = startIndex + searchText.length < textToSearch.length\n ? textToSearch[startIndex + searchText.length]\n : ' ';\n\n if (/\\w/.test(before) || /\\w/.test(after)) {\n startIndex++;\n continue;\n }\n }\n\n // Find the text items that contain this match\n const matchText = pageText.substring(startIndex, startIndex + query.length);\n const rects = calculateMatchRects(textItems, startIndex, query.length, viewport);\n\n results.push({\n pageNumber: pageNum,\n matchIndex: matchIndex++,\n text: matchText,\n rects,\n });\n\n startIndex++;\n }\n } catch (error) {\n console.error(`Error searching page ${pageNum}:`, error);\n }\n }\n\n set({\n results,\n currentResultIndex: results.length > 0 ? 0 : -1,\n isSearching: false,\n });\n },\n\n clearSearch: () => {\n set(initialState);\n },\n\n nextResult: () => {\n const { results, currentResultIndex } = get();\n if (results.length === 0) return;\n\n const nextIndex = (currentResultIndex + 1) % results.length;\n set({ currentResultIndex: nextIndex });\n },\n\n previousResult: () => {\n const { results, currentResultIndex } = get();\n if (results.length === 0) return;\n\n const prevIndex = currentResultIndex <= 0 ? results.length - 1 : currentResultIndex - 1;\n set({ currentResultIndex: prevIndex });\n },\n\n goToResult: (index) => {\n const { results } = get();\n if (index >= 0 && index < results.length) {\n set({ currentResultIndex: index });\n }\n },\n\n toggleCaseSensitive: () => {\n set((state) => ({ caseSensitive: !state.caseSensitive }));\n },\n\n toggleWholeWord: () => {\n set((state) => ({ wholeWord: !state.wholeWord }));\n },\n\n getCurrentResult: () => {\n const { results, currentResultIndex } = get();\n if (currentResultIndex >= 0 && currentResultIndex < results.length) {\n return results[currentResultIndex];\n }\n return null;\n },\n }));\n}\n\n/**\n * Calculate the bounding rectangles for a text match.\n * This is a simplified implementation that may need refinement for complex layouts.\n */\nfunction calculateMatchRects(\n textItems: Array<{ text: string; transform: number[]; width: number; height: number }>,\n startOffset: number,\n length: number,\n viewport: { width: number; height: number }\n): HighlightRect[] {\n const rects: HighlightRect[] = [];\n let currentOffset = 0;\n\n for (const item of textItems) {\n const itemStart = currentOffset;\n const itemEnd = currentOffset + item.text.length;\n\n // Check if this item overlaps with our match\n if (itemEnd > startOffset && itemStart < startOffset + length) {\n const [, , c, d, tx, ty] = item.transform;\n\n // Convert PDF coordinates to viewport coordinates\n const x = tx;\n const y = viewport.height - ty;\n\n // Approximate height from transform matrix\n const height = Math.sqrt(c * c + d * d);\n\n // Calculate the portion of this item that's part of the match\n const matchStartInItem = Math.max(0, startOffset - itemStart);\n const matchEndInItem = Math.min(item.text.length, startOffset + length - itemStart);\n const matchWidth = (item.width / item.text.length) * (matchEndInItem - matchStartInItem);\n const matchX = x + (item.width / item.text.length) * matchStartInItem;\n\n rects.push({\n x: matchX,\n y: y - height,\n width: matchWidth,\n height: height,\n });\n }\n\n currentOffset = itemEnd;\n }\n\n return rects;\n}\n\nexport type SearchStoreApi = ReturnType<typeof createSearchStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type { AgentState, AgentActions, AgentContext, FocusedRegion } from '../types/agent-context';\n\nexport type AgentStore = AgentState & AgentActions;\n\nconst initialState: AgentState = {\n currentContext: null,\n focusedRegions: [],\n};\n\nlet focusRegionIdCounter = 0;\n\nfunction generateFocusRegionId(): string {\n return `focus-region-${++focusRegionIdCounter}-${Date.now()}`;\n}\n\nexport function createAgentStore(initialOverrides: Partial<AgentState> = {}) {\n return createStore<AgentStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n setAgentContext: (context: Partial<AgentContext>) => {\n const { currentContext } = get();\n set({\n currentContext: {\n ...currentContext,\n ...context,\n timestamp: context.timestamp ?? new Date(),\n } as AgentContext,\n });\n },\n\n clearAgentContext: () => {\n set({ currentContext: null });\n },\n\n addFocusedRegion: (region: Omit<FocusedRegion, 'id'>) => {\n const id = generateFocusRegionId();\n const focusedRegion: FocusedRegion = {\n ...region,\n id,\n style: region.style ?? 'pulse',\n };\n\n set((state) => ({\n focusedRegions: [...state.focusedRegions, focusedRegion],\n }));\n\n // Set up auto-clear if timeout is specified\n if (region.autoClearTimeout && region.autoClearTimeout > 0) {\n setTimeout(() => {\n const { removeFocusedRegion } = get();\n removeFocusedRegion(id);\n }, region.autoClearTimeout);\n }\n\n return id;\n },\n\n removeFocusedRegion: (id: string) => {\n set((state) => ({\n focusedRegions: state.focusedRegions.filter((r) => r.id !== id),\n }));\n },\n\n clearAllFocusedRegions: () => {\n set({ focusedRegions: [] });\n },\n\n reset: () => {\n set(initialState);\n },\n }));\n}\n\nexport type AgentStoreApi = ReturnType<typeof createAgentStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type {\n StudentState,\n StudentActions,\n Bookmark,\n QuickNote,\n Takeaway,\n} from '../types/agent-context';\n\nexport type StudentStore = StudentState & StudentActions;\n\nconst STORAGE_PREFIX = 'pdf-reader-student';\n\nlet idCounter = 0;\n\nfunction generateId(prefix: string): string {\n return `${prefix}-${++idCounter}-${Date.now()}`;\n}\n\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getStorageKey(documentId: string, type: string): string {\n return `${STORAGE_PREFIX}:${documentId}:${type}`;\n}\n\n// Serialization helpers for dates\ninterface StoredBookmark extends Omit<Bookmark, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredQuickNote extends Omit<QuickNote, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredTakeaway extends Omit<Takeaway, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredStudentData {\n bookmarks: StoredBookmark[];\n quickNotes: StoredQuickNote[];\n takeaways: StoredTakeaway[];\n visitedPages: number[];\n progress: number;\n}\n\nconst initialState: StudentState = {\n bookmarks: [],\n quickNotes: [],\n takeaways: [],\n visitedPages: new Set<number>(),\n progress: 0,\n};\n\nexport function createStudentStore(initialOverrides: Partial<StudentState> = {}) {\n return createStore<StudentStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Bookmark actions\n addBookmark: (bookmark: Omit<Bookmark, 'id' | 'timestamp'>) => {\n const newBookmark: Bookmark = {\n ...bookmark,\n id: generateId('bookmark'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n bookmarks: [...state.bookmarks, newBookmark],\n }));\n\n return newBookmark;\n },\n\n updateBookmark: (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => {\n set((state) => ({\n bookmarks: state.bookmarks.map((b) =>\n b.id === id ? { ...b, ...updates } : b\n ),\n }));\n },\n\n removeBookmark: (id: string) => {\n set((state) => ({\n bookmarks: state.bookmarks.filter((b) => b.id !== id),\n }));\n },\n\n // Quick note actions\n addQuickNote: (note: Omit<QuickNote, 'id' | 'timestamp'>) => {\n const newNote: QuickNote = {\n ...note,\n id: generateId('note'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n quickNotes: [...state.quickNotes, newNote],\n }));\n\n return newNote;\n },\n\n updateQuickNote: (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => {\n set((state) => ({\n quickNotes: state.quickNotes.map((n) =>\n n.id === id ? { ...n, ...updates } : n\n ),\n }));\n },\n\n removeQuickNote: (id: string) => {\n set((state) => ({\n quickNotes: state.quickNotes.filter((n) => n.id !== id),\n }));\n },\n\n // Takeaway actions\n addTakeaway: (takeaway: Omit<Takeaway, 'id' | 'timestamp'>) => {\n const newTakeaway: Takeaway = {\n ...takeaway,\n id: generateId('takeaway'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n takeaways: [...state.takeaways, newTakeaway],\n }));\n\n return newTakeaway;\n },\n\n removeTakeaway: (id: string) => {\n set((state) => ({\n takeaways: state.takeaways.filter((t) => t.id !== id),\n }));\n },\n\n // Progress tracking\n markPageVisited: (pageNumber: number) => {\n set((state) => {\n const newVisitedPages = new Set(state.visitedPages);\n newVisitedPages.add(pageNumber);\n return { visitedPages: newVisitedPages };\n });\n },\n\n setProgress: (progress: number) => {\n set({ progress: Math.max(0, Math.min(1, progress)) });\n },\n\n // Persistence\n persistToStorage: (documentId: string) => {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, student data will not persist');\n return;\n }\n\n const state = get();\n\n const data: StoredStudentData = {\n bookmarks: state.bookmarks.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: state.quickNotes.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: state.takeaways.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n visitedPages: Array.from(state.visitedPages),\n progress: state.progress,\n };\n\n try {\n localStorage.setItem(getStorageKey(documentId, 'data'), JSON.stringify(data));\n } catch (error) {\n console.error('Failed to persist student data:', error);\n }\n },\n\n loadFromStorage: (documentId: string) => {\n if (!isStorageAvailable()) {\n return;\n }\n\n try {\n const stored = localStorage.getItem(getStorageKey(documentId, 'data'));\n if (!stored) {\n return;\n }\n\n const data: StoredStudentData = JSON.parse(stored);\n\n set({\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: new Date(b.timestamp),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: new Date(n.timestamp),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: new Date(t.timestamp),\n })),\n visitedPages: new Set(data.visitedPages),\n progress: data.progress,\n });\n } catch (error) {\n console.error('Failed to load student data:', error);\n }\n },\n\n reset: () => {\n set(initialState);\n },\n }));\n}\n\nexport type StudentStoreApi = ReturnType<typeof createStudentStore>;\n","export {\n createViewerStore,\n type ViewerStore,\n type ViewerStoreApi,\n} from './viewer-store';\n\nexport {\n createAnnotationStore,\n type AnnotationStore,\n type AnnotationStoreApi,\n type AnnotationState,\n type AnnotationActions,\n type AnnotationTool,\n type ShapeType,\n} from './annotation-store';\n\nexport {\n createSearchStore,\n type SearchStore,\n type SearchStoreApi,\n type SearchActions,\n} from './search-store';\n\nexport {\n createAgentStore,\n type AgentStore,\n type AgentStoreApi,\n} from './agent-store';\n\nexport {\n createStudentStore,\n type StudentStore,\n type StudentStoreApi,\n} from './student-store';\n","import { createContext, useContext, useRef, useEffect, type ReactNode } from 'react';\nimport { useStore } from 'zustand';\nimport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\n createAgentStore,\n createStudentStore,\n type ViewerStoreApi,\n type AnnotationStoreApi,\n type SearchStoreApi,\n type AgentStoreApi,\n type StudentStoreApi,\n type ViewerStore,\n type AnnotationStore,\n type SearchStore,\n type AgentStore,\n type StudentStore,\n type AnnotationState,\n} from '../store';\nimport type { ViewerState, SearchState, Theme, SidebarPanel, AgentState, StudentState } from '../types';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface PDFViewerContextValue {\n viewerStore: ViewerStoreApi;\n annotationStore: AnnotationStoreApi;\n searchStore: SearchStoreApi;\n agentStore: AgentStoreApi;\n studentStore: StudentStoreApi;\n}\n\nexport interface PDFViewerProviderProps {\n children: ReactNode;\n initialState?: {\n viewer?: Partial<ViewerState>;\n annotation?: Partial<AnnotationState>;\n search?: Partial<SearchState>;\n agent?: Partial<AgentState>;\n student?: Partial<StudentState>;\n };\n theme?: Theme;\n defaultSidebarPanel?: SidebarPanel;\n /** Enable student learning mode features */\n studentMode?: boolean;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PDFViewerContext = createContext<PDFViewerContextValue | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport function PDFViewerProvider({\n children,\n initialState,\n theme = 'light',\n defaultSidebarPanel = 'thumbnails',\n studentMode: _studentMode = false,\n}: PDFViewerProviderProps) {\n const viewerStoreRef = useRef<ViewerStoreApi | null>(null);\n const annotationStoreRef = useRef<AnnotationStoreApi | null>(null);\n const searchStoreRef = useRef<SearchStoreApi | null>(null);\n const agentStoreRef = useRef<AgentStoreApi | null>(null);\n const studentStoreRef = useRef<StudentStoreApi | null>(null);\n\n // Create stores only once\n if (!viewerStoreRef.current) {\n viewerStoreRef.current = createViewerStore({\n ...initialState?.viewer,\n theme,\n sidebarPanel: defaultSidebarPanel,\n });\n }\n\n if (!annotationStoreRef.current) {\n annotationStoreRef.current = createAnnotationStore(initialState?.annotation);\n }\n\n if (!searchStoreRef.current) {\n searchStoreRef.current = createSearchStore(initialState?.search);\n }\n\n // Create agent and student stores (always created for API consistency)\n if (!agentStoreRef.current) {\n agentStoreRef.current = createAgentStore(initialState?.agent);\n }\n\n if (!studentStoreRef.current) {\n studentStoreRef.current = createStudentStore(initialState?.student);\n }\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n viewerStoreRef.current?.getState().reset();\n agentStoreRef.current?.getState().reset();\n studentStoreRef.current?.getState().reset();\n };\n }, []);\n\n return (\n <PDFViewerContext.Provider\n value={{\n viewerStore: viewerStoreRef.current,\n annotationStore: annotationStoreRef.current,\n searchStore: searchStoreRef.current,\n agentStore: agentStoreRef.current,\n studentStore: studentStoreRef.current,\n }}\n >\n {children}\n </PDFViewerContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nfunction usePDFViewerContext() {\n const context = useContext(PDFViewerContext);\n if (!context) {\n throw new Error('usePDFViewerContext must be used within a PDFViewerProvider');\n }\n return context;\n}\n\n/**\n * Hook to access the viewer store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useViewerStore<T>(selector: (state: ViewerStore) => T): T {\n const { viewerStore } = usePDFViewerContext();\n return useStore(viewerStore, selector);\n}\n\n/**\n * Hook to access the annotation store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useAnnotationStore<T>(selector: (state: AnnotationStore) => T): T {\n const { annotationStore } = usePDFViewerContext();\n return useStore(annotationStore, selector);\n}\n\n/**\n * Hook to access the search store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useSearchStore<T>(selector: (state: SearchStore) => T): T {\n const { searchStore } = usePDFViewerContext();\n return useStore(searchStore, selector);\n}\n\n/**\n * Hook to access the agent store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useAgentStore<T>(selector: (state: AgentStore) => T): T {\n const { agentStore } = usePDFViewerContext();\n return useStore(agentStore, selector);\n}\n\n/**\n * Hook to access the student store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useStudentStore<T>(selector: (state: StudentStore) => T): T {\n const { studentStore } = usePDFViewerContext();\n return useStore(studentStore, selector);\n}\n\n/**\n * Hook to access all stores directly (for actions).\n */\nexport function usePDFViewerStores() {\n return usePDFViewerContext();\n}\n\nexport { PDFViewerContext };\n","import { useCallback, useMemo } from 'react';\nimport {\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n} from './PDFViewerContext';\nimport type { Theme, ViewMode, SidebarPanel, HighlightColor, Highlight } from '../types';\nimport type {\n AgentContext,\n FocusedRegion,\n Bookmark,\n QuickNote,\n Takeaway,\n AgentAPI,\n AgentHighlightParams,\n} from '../types/agent-context';\n\ntype AddHighlightParams = Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>;\n\n/**\n * Main unified hook for accessing PDF viewer state and actions.\n * This is the primary API for controlling the viewer.\n */\nexport function usePDFViewer() {\n const { viewerStore, annotationStore, searchStore, agentStore, studentStore } = usePDFViewerStores();\n\n // ============================================================================\n // Viewer State\n // ============================================================================\n\n const document = useViewerStore((s) => s.document);\n const numPages = useViewerStore((s) => s.numPages);\n const currentPage = useViewerStore((s) => s.currentPage);\n const scale = useViewerStore((s) => s.scale);\n const rotation = useViewerStore((s) => s.rotation);\n const isLoading = useViewerStore((s) => s.isLoading);\n const error = useViewerStore((s) => s.error);\n const theme = useViewerStore((s) => s.theme);\n const viewMode = useViewerStore((s) => s.viewMode);\n const sidebarOpen = useViewerStore((s) => s.sidebarOpen);\n const sidebarPanel = useViewerStore((s) => s.sidebarPanel);\n const isFullscreen = useViewerStore((s) => s.isFullscreen);\n\n // ============================================================================\n // Annotation State\n // ============================================================================\n\n const highlights = useAnnotationStore((s) => s.highlights);\n const annotations = useAnnotationStore((s) => s.annotations);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const activeHighlightColor = useAnnotationStore((s) => s.activeHighlightColor);\n const isHighlightMode = useAnnotationStore((s) => s.isHighlightMode);\n\n // ============================================================================\n // Search State\n // ============================================================================\n\n const searchQuery = useSearchStore((s) => s.query);\n const searchResults = useSearchStore((s) => s.results);\n const currentSearchResult = useSearchStore((s) => s.currentResultIndex);\n const isSearching = useSearchStore((s) => s.isSearching);\n\n // ============================================================================\n // Navigation Actions\n // ============================================================================\n\n const goToPage = useCallback(\n (page: number) => viewerStore.getState().goToPage(page),\n [viewerStore]\n );\n\n const nextPage = useCallback(\n () => viewerStore.getState().nextPage(),\n [viewerStore]\n );\n\n const previousPage = useCallback(\n () => viewerStore.getState().previousPage(),\n [viewerStore]\n );\n\n // ============================================================================\n // Zoom Actions\n // ============================================================================\n\n const setScale = useCallback(\n (newScale: number) => viewerStore.getState().setScale(newScale),\n [viewerStore]\n );\n\n const zoomIn = useCallback(\n () => viewerStore.getState().zoomIn(),\n [viewerStore]\n );\n\n const zoomOut = useCallback(\n () => viewerStore.getState().zoomOut(),\n [viewerStore]\n );\n\n const fitToWidth = useCallback(\n () => viewerStore.getState().fitToWidth(),\n [viewerStore]\n );\n\n const fitToPage = useCallback(\n () => viewerStore.getState().fitToPage(),\n [viewerStore]\n );\n\n // ============================================================================\n // Rotation Actions\n // ============================================================================\n\n const rotateClockwise = useCallback(\n () => viewerStore.getState().rotateClockwise(),\n [viewerStore]\n );\n\n const rotateCounterClockwise = useCallback(\n () => viewerStore.getState().rotateCounterClockwise(),\n [viewerStore]\n );\n\n // ============================================================================\n // UI Actions\n // ============================================================================\n\n const setTheme = useCallback(\n (newTheme: Theme) => viewerStore.getState().setTheme(newTheme),\n [viewerStore]\n );\n\n const setViewMode = useCallback(\n (mode: ViewMode) => viewerStore.getState().setViewMode(mode),\n [viewerStore]\n );\n\n const toggleSidebar = useCallback(\n () => viewerStore.getState().toggleSidebar(),\n [viewerStore]\n );\n\n const setSidebarPanel = useCallback(\n (panel: SidebarPanel) => viewerStore.getState().setSidebarPanel(panel),\n [viewerStore]\n );\n\n const setFullscreen = useCallback(\n (fullscreen: boolean) => viewerStore.getState().setFullscreen(fullscreen),\n [viewerStore]\n );\n\n // ============================================================================\n // Highlight Actions\n // ============================================================================\n\n const addHighlight = useCallback(\n (highlight: AddHighlightParams) =>\n annotationStore.getState().addHighlight(highlight),\n [annotationStore]\n );\n\n const removeHighlight = useCallback(\n (id: string) => annotationStore.getState().removeHighlight(id),\n [annotationStore]\n );\n\n const setActiveHighlightColor = useCallback(\n (color: HighlightColor) => annotationStore.getState().setActiveHighlightColor(color),\n [annotationStore]\n );\n\n const setHighlightMode = useCallback(\n (enabled: boolean) => annotationStore.getState().setHighlightMode(enabled),\n [annotationStore]\n );\n\n // ============================================================================\n // Search Actions\n // ============================================================================\n\n const search = useCallback(\n async (query: string) => {\n const doc = viewerStore.getState().document;\n if (!doc) return;\n searchStore.getState().setQuery(query);\n await searchStore.getState().search(doc);\n },\n [viewerStore, searchStore]\n );\n\n const clearSearch = useCallback(\n () => searchStore.getState().clearSearch(),\n [searchStore]\n );\n\n const nextSearchResult = useCallback(\n () => searchStore.getState().nextResult(),\n [searchStore]\n );\n\n const previousSearchResult = useCallback(\n () => searchStore.getState().previousResult(),\n [searchStore]\n );\n\n // ============================================================================\n // Agent Context State & Actions\n // ============================================================================\n\n const agentContext = useAgentStore((s) => s.currentContext);\n const focusedRegions = useAgentStore((s) => s.focusedRegions);\n\n const setAgentContext = useCallback(\n (context: Partial<AgentContext>) => agentStore.getState().setAgentContext(context),\n [agentStore]\n );\n\n const clearAgentContext = useCallback(\n () => agentStore.getState().clearAgentContext(),\n [agentStore]\n );\n\n const focusRegion = useCallback(\n (region: Omit<FocusedRegion, 'id'>) => agentStore.getState().addFocusedRegion(region),\n [agentStore]\n );\n\n const clearFocusedRegion = useCallback(\n (id: string) => agentStore.getState().removeFocusedRegion(id),\n [agentStore]\n );\n\n const clearAllFocusedRegions = useCallback(\n () => agentStore.getState().clearAllFocusedRegions(),\n [agentStore]\n );\n\n // ============================================================================\n // Student State & Actions\n // ============================================================================\n\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const quickNotes = useStudentStore((s) => s.quickNotes);\n const takeaways = useStudentStore((s) => s.takeaways);\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const progress = useStudentStore((s) => s.progress);\n\n const addBookmark = useCallback(\n (data: Omit<Bookmark, 'id' | 'timestamp'>) => {\n // Capture agent context when bookmarking\n const context = agentStore.getState().currentContext;\n return studentStore.getState().addBookmark({\n ...data,\n agentContext: data.agentContext ?? context?.lastStatement,\n });\n },\n [studentStore, agentStore]\n );\n\n const updateBookmark = useCallback(\n (id: string, updates: Partial<Omit<Bookmark, 'id'>>) =>\n studentStore.getState().updateBookmark(id, updates),\n [studentStore]\n );\n\n const removeBookmark = useCallback(\n (id: string) => studentStore.getState().removeBookmark(id),\n [studentStore]\n );\n\n const addQuickNote = useCallback(\n (data: Omit<QuickNote, 'id' | 'timestamp'>) => {\n // Capture agent context when adding note\n const context = agentStore.getState().currentContext;\n return studentStore.getState().addQuickNote({\n ...data,\n agentLastStatement: data.agentLastStatement ?? context?.lastStatement,\n });\n },\n [studentStore, agentStore]\n );\n\n const updateQuickNote = useCallback(\n (id: string, updates: Partial<Omit<QuickNote, 'id'>>) =>\n studentStore.getState().updateQuickNote(id, updates),\n [studentStore]\n );\n\n const removeQuickNote = useCallback(\n (id: string) => studentStore.getState().removeQuickNote(id),\n [studentStore]\n );\n\n const addTakeaway = useCallback(\n (data: Omit<Takeaway, 'id' | 'timestamp'>) => studentStore.getState().addTakeaway(data),\n [studentStore]\n );\n\n const removeTakeaway = useCallback(\n (id: string) => studentStore.getState().removeTakeaway(id),\n [studentStore]\n );\n\n const markPageVisited = useCallback(\n (pageNumber: number) => studentStore.getState().markPageVisited(pageNumber),\n [studentStore]\n );\n\n // ============================================================================\n // Agent API Factory\n // ============================================================================\n\n const getAgentAPI = useCallback((): AgentAPI => {\n return {\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => {\n return agentStore.getState().addFocusedRegion(region);\n },\n clearFocusedRegion: (id?: string) => {\n if (id) {\n agentStore.getState().removeFocusedRegion(id);\n } else {\n agentStore.getState().clearAllFocusedRegions();\n }\n },\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n return studentStore.getState().addTakeaway({\n pageNumber,\n summary,\n source: 'agent',\n metadata,\n });\n },\n setAgentContext: (context: Partial<AgentContext>) => {\n agentStore.getState().setAgentContext(context);\n },\n addAgentHighlight: (params: AgentHighlightParams) => {\n const highlight = annotationStore.getState().addHighlight({\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? 'blue',\n comment: params.comment,\n source: 'agent',\n });\n return highlight.id;\n },\n goToPage: (pageNumber: number) => {\n viewerStore.getState().goToPage(pageNumber);\n },\n getCurrentPage: () => viewerStore.getState().currentPage,\n getAgentContext: () => agentStore.getState().currentContext,\n };\n }, [agentStore, studentStore, annotationStore, viewerStore]);\n\n // ============================================================================\n // Return API\n // ============================================================================\n\n return useMemo(\n () => ({\n // Document state\n document,\n numPages,\n isLoading,\n error,\n\n // Navigation\n currentPage,\n goToPage,\n nextPage,\n previousPage,\n\n // Zoom\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n\n // Rotation\n rotation,\n rotateClockwise,\n rotateCounterClockwise,\n\n // Theme & UI\n theme,\n setTheme,\n viewMode,\n setViewMode,\n sidebarOpen,\n toggleSidebar,\n sidebarPanel,\n setSidebarPanel,\n isFullscreen,\n setFullscreen,\n\n // Highlights\n highlights,\n selectedHighlightId,\n activeHighlightColor,\n isHighlightMode,\n addHighlight,\n removeHighlight,\n setActiveHighlightColor,\n setHighlightMode,\n\n // Annotations\n annotations,\n\n // Search\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n\n // Agent Context (Student Mode)\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n getAgentAPI,\n\n // Bookmarks (Student Mode)\n bookmarks,\n addBookmark,\n updateBookmark,\n removeBookmark,\n\n // Quick Notes (Student Mode)\n quickNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n\n // Takeaways (Student Mode)\n takeaways,\n addTakeaway,\n removeTakeaway,\n\n // Progress (Student Mode)\n visitedPages,\n progress,\n markPageVisited,\n }),\n [\n document,\n numPages,\n isLoading,\n error,\n currentPage,\n goToPage,\n nextPage,\n previousPage,\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n rotation,\n rotateClockwise,\n rotateCounterClockwise,\n theme,\n setTheme,\n viewMode,\n setViewMode,\n sidebarOpen,\n toggleSidebar,\n sidebarPanel,\n setSidebarPanel,\n isFullscreen,\n setFullscreen,\n highlights,\n selectedHighlightId,\n activeHighlightColor,\n isHighlightMode,\n addHighlight,\n removeHighlight,\n setActiveHighlightColor,\n setHighlightMode,\n annotations,\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n getAgentAPI,\n bookmarks,\n addBookmark,\n updateBookmark,\n removeBookmark,\n quickNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n takeaways,\n addTakeaway,\n removeTakeaway,\n visitedPages,\n progress,\n markPageVisited,\n ]\n );\n}\n","import { useCallback, useEffect } from 'react';\nimport { useViewerStore, usePDFViewerStores } from './PDFViewerContext';\n\nexport interface UsePageNavigationOptions {\n enableKeyboardNavigation?: boolean;\n}\n\n/**\n * Hook for page navigation functionality.\n */\nexport function usePageNavigation(options: UsePageNavigationOptions = {}) {\n const { enableKeyboardNavigation = true } = options;\n const { viewerStore } = usePDFViewerStores();\n\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n\n const goToPage = useCallback(\n (page: number) => viewerStore.getState().goToPage(page),\n [viewerStore]\n );\n\n const nextPage = useCallback(\n () => viewerStore.getState().nextPage(),\n [viewerStore]\n );\n\n const previousPage = useCallback(\n () => viewerStore.getState().previousPage(),\n [viewerStore]\n );\n\n const goToFirstPage = useCallback(\n () => viewerStore.getState().goToPage(1),\n [viewerStore]\n );\n\n const goToLastPage = useCallback(\n () => {\n const { numPages } = viewerStore.getState();\n viewerStore.getState().goToPage(numPages);\n },\n [viewerStore]\n );\n\n // Keyboard navigation\n useEffect(() => {\n if (!enableKeyboardNavigation) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle if user is typing in an input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowRight':\n case 'PageDown':\n e.preventDefault();\n nextPage();\n break;\n case 'ArrowLeft':\n case 'PageUp':\n e.preventDefault();\n previousPage();\n break;\n case 'Home':\n e.preventDefault();\n goToFirstPage();\n break;\n case 'End':\n e.preventDefault();\n goToLastPage();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enableKeyboardNavigation, nextPage, previousPage, goToFirstPage, goToLastPage]);\n\n return {\n currentPage,\n numPages,\n goToPage,\n nextPage,\n previousPage,\n goToFirstPage,\n goToLastPage,\n canGoNext: currentPage < numPages,\n canGoPrevious: currentPage > 1,\n };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useViewerStore, usePDFViewerStores } from './PDFViewerContext';\n\nexport interface UseZoomOptions {\n enableWheelZoom?: boolean;\n minScale?: number;\n maxScale?: number;\n}\n\n/**\n * Hook for zoom functionality.\n */\nexport function useZoom(options: UseZoomOptions = {}) {\n const { enableWheelZoom = true, minScale = 0.1, maxScale = 10 } = options;\n const { viewerStore } = usePDFViewerStores();\n const containerRef = useRef<HTMLElement | null>(null);\n\n const scale = useViewerStore((s) => s.scale);\n\n const setScale = useCallback(\n (newScale: number) => {\n const clamped = Math.max(minScale, Math.min(maxScale, newScale));\n viewerStore.getState().setScale(clamped);\n },\n [viewerStore, minScale, maxScale]\n );\n\n const zoomIn = useCallback(\n () => viewerStore.getState().zoomIn(),\n [viewerStore]\n );\n\n const zoomOut = useCallback(\n () => viewerStore.getState().zoomOut(),\n [viewerStore]\n );\n\n const fitToWidth = useCallback(\n () => viewerStore.getState().fitToWidth(),\n [viewerStore]\n );\n\n const fitToPage = useCallback(\n () => viewerStore.getState().fitToPage(),\n [viewerStore]\n );\n\n const resetZoom = useCallback(\n () => viewerStore.getState().setScale(1),\n [viewerStore]\n );\n\n // Wheel zoom handler\n useEffect(() => {\n if (!enableWheelZoom) return;\n\n const handleWheel = (e: Event) => {\n const wheelEvent = e as WheelEvent;\n // Only zoom when Ctrl/Cmd is pressed\n if (!wheelEvent.ctrlKey && !wheelEvent.metaKey) return;\n\n e.preventDefault();\n\n const delta = wheelEvent.deltaY > 0 ? -0.1 : 0.1;\n const newScale = scale + delta;\n setScale(newScale);\n };\n\n const container = containerRef.current || document;\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [enableWheelZoom, scale, setScale]);\n\n // Keyboard zoom\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle if user is typing in an input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n if (e.ctrlKey || e.metaKey) {\n switch (e.key) {\n case '=':\n case '+':\n e.preventDefault();\n zoomIn();\n break;\n case '-':\n e.preventDefault();\n zoomOut();\n break;\n case '0':\n e.preventDefault();\n resetZoom();\n break;\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [zoomIn, zoomOut, resetZoom]);\n\n return {\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n resetZoom,\n setContainerRef: (el: HTMLElement | null) => {\n containerRef.current = el;\n },\n scalePercentage: Math.round(scale * 100),\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { TextSelection } from '../types';\n\nexport interface UseTextSelectionOptions {\n onSelect?: (selection: TextSelection) => void;\n onCopy?: (text: string) => void;\n}\n\n/**\n * Hook for handling text selection in the PDF viewer.\n */\nexport function useTextSelection(options: UseTextSelectionOptions = {}) {\n const { onSelect, onCopy } = options;\n const [selection, setSelection] = useState<TextSelection | null>(null);\n const [isSelecting, setIsSelecting] = useState(false);\n\n const handleSelectionChange = useCallback(() => {\n const windowSelection = window.getSelection();\n\n if (!windowSelection || windowSelection.isCollapsed) {\n setSelection(null);\n return;\n }\n\n const text = windowSelection.toString().trim();\n if (!text) {\n setSelection(null);\n return;\n }\n\n // Find the page number from the selection's container\n const anchorNode = windowSelection.anchorNode;\n let pageElement = anchorNode?.parentElement;\n\n while (pageElement && !pageElement.dataset.pageNumber) {\n pageElement = pageElement.parentElement;\n }\n\n const pageNumber = pageElement ? parseInt(pageElement.dataset.pageNumber || '1', 10) : 1;\n\n // Get bounding rectangles\n const range = windowSelection.getRangeAt(0);\n const rects = Array.from(range.getClientRects());\n\n const newSelection: TextSelection = {\n text,\n pageNumber,\n rects,\n };\n\n setSelection(newSelection);\n onSelect?.(newSelection);\n }, [onSelect]);\n\n const clearSelection = useCallback(() => {\n window.getSelection()?.removeAllRanges();\n setSelection(null);\n }, []);\n\n const copySelection = useCallback(() => {\n if (selection?.text) {\n navigator.clipboard.writeText(selection.text).then(() => {\n onCopy?.(selection.text);\n });\n }\n }, [selection, onCopy]);\n\n // Listen for selection changes\n useEffect(() => {\n const handleMouseUp = () => {\n setIsSelecting(false);\n handleSelectionChange();\n };\n\n const handleMouseDown = () => {\n setIsSelecting(true);\n };\n\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('selectionchange', handleSelectionChange);\n\n return () => {\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('selectionchange', handleSelectionChange);\n };\n }, [handleSelectionChange]);\n\n // Handle Ctrl+C for copy\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'c' && selection) {\n // Let the default copy behavior work, but also trigger our callback\n onCopy?.(selection.text);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selection, onCopy]);\n\n return {\n selection,\n isSelecting,\n clearSelection,\n copySelection,\n hasSelection: selection !== null && selection.text.length > 0,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { useAnnotationStore } from './PDFViewerContext';\nimport type { TextSelection, HighlightRect, HighlightColor, Highlight } from '../types';\n\nexport interface UseHighlightsOptions {\n /** Callback when a highlight is created */\n onHighlightCreate?: (highlight: Highlight) => void;\n /** Callback when a highlight is updated */\n onHighlightUpdate?: (highlight: Highlight) => void;\n /** Callback when a highlight is deleted */\n onHighlightDelete?: (id: string) => void;\n}\n\nexport interface UseHighlightsReturn {\n /** Create a highlight from the current text selection */\n createHighlightFromSelection: (\n selection: TextSelection,\n pageElement: HTMLElement,\n scale: number,\n color?: HighlightColor\n ) => Highlight | null;\n /**\n * Add a highlight programmatically with coordinates.\n * Coordinates should be in PDF points (not scaled).\n *\n * @example\n * ```tsx\n * addHighlight({\n * pageNumber: 1,\n * rects: [{ x: 100, y: 200, width: 150, height: 20 }],\n * text: \"Highlighted text\",\n * color: \"yellow\"\n * });\n * ```\n */\n addHighlight: (highlight: {\n pageNumber: number;\n rects: HighlightRect[];\n text: string;\n color?: HighlightColor;\n comment?: string;\n }) => Highlight;\n /** Update an existing highlight */\n updateHighlight: (id: string, updates: Partial<Pick<Highlight, 'color' | 'comment'>>) => void;\n /** Delete a highlight */\n deleteHighlight: (id: string) => void;\n /** Get highlights for a specific page */\n highlightsForPage: (pageNumber: number) => Highlight[];\n /** Get all highlights */\n allHighlights: Highlight[];\n /** Get the currently selected highlight */\n selectedHighlight: Highlight | null;\n /** Select a highlight by ID */\n selectHighlight: (id: string | null) => void;\n /** Get the active highlight color */\n activeColor: HighlightColor;\n /** Set the active highlight color */\n setActiveColor: (color: HighlightColor) => void;\n}\n\n/**\n * Convert DOMRect from browser selection to HighlightRect for storage.\n * Normalizes coordinates relative to page container and adjusts for scale.\n */\nfunction domRectToHighlightRect(\n domRect: DOMRect,\n pageElement: HTMLElement,\n scale: number\n): HighlightRect {\n const pageRect = pageElement.getBoundingClientRect();\n return {\n x: (domRect.left - pageRect.left) / scale,\n y: (domRect.top - pageRect.top) / scale,\n width: domRect.width / scale,\n height: domRect.height / scale,\n };\n}\n\n/**\n * Merge overlapping or adjacent rects to reduce the number of highlight rects.\n * This helps when selections span multiple lines.\n */\nfunction mergeRects(rects: HighlightRect[]): HighlightRect[] {\n if (rects.length <= 1) return rects;\n\n // Sort by y position, then x position\n const sorted = [...rects].sort((a, b) => {\n const yDiff = a.y - b.y;\n if (Math.abs(yDiff) < 2) return a.x - b.x;\n return yDiff;\n });\n\n const merged: HighlightRect[] = [];\n let current = sorted[0];\n\n for (let i = 1; i < sorted.length; i++) {\n const next = sorted[i];\n const sameRow = Math.abs(current.y - next.y) < 2 && Math.abs(current.height - next.height) < 2;\n const overlapsOrAdjacent = current.x + current.width >= next.x - 2;\n\n if (sameRow && overlapsOrAdjacent) {\n // Merge the rects\n const right = Math.max(current.x + current.width, next.x + next.width);\n current = {\n x: Math.min(current.x, next.x),\n y: Math.min(current.y, next.y),\n width: right - Math.min(current.x, next.x),\n height: Math.max(current.height, next.height),\n };\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n\n return merged;\n}\n\n/**\n * Hook for creating and managing highlights from text selections.\n */\nexport function useHighlights(options: UseHighlightsOptions = {}): UseHighlightsReturn {\n const { onHighlightCreate, onHighlightUpdate, onHighlightDelete } = options;\n\n // Store refs for callbacks to avoid stale closures\n const callbacksRef = useRef({ onHighlightCreate, onHighlightUpdate, onHighlightDelete });\n callbacksRef.current = { onHighlightCreate, onHighlightUpdate, onHighlightDelete };\n\n // Get store actions\n const addHighlightStore = useAnnotationStore((s) => s.addHighlight);\n const updateHighlightStore = useAnnotationStore((s) => s.updateHighlight);\n const removeHighlight = useAnnotationStore((s) => s.removeHighlight);\n const getHighlightsByPage = useAnnotationStore((s) => s.getHighlightsByPage);\n const highlights = useAnnotationStore((s) => s.highlights);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const selectHighlightStore = useAnnotationStore((s) => s.selectHighlight);\n const activeHighlightColor = useAnnotationStore((s) => s.activeHighlightColor);\n const setActiveHighlightColor = useAnnotationStore((s) => s.setActiveHighlightColor);\n\n const createHighlightFromSelection = useCallback(\n (\n selection: TextSelection,\n pageElement: HTMLElement,\n scale: number,\n color?: HighlightColor\n ): Highlight | null => {\n if (!selection.text || selection.rects.length === 0) {\n return null;\n }\n\n // Convert DOMRects to HighlightRects\n const highlightRects = selection.rects.map((domRect) =>\n domRectToHighlightRect(domRect, pageElement, scale)\n );\n\n // Merge adjacent rects\n const mergedRects = mergeRects(highlightRects);\n\n // Filter out any invalid rects\n const validRects = mergedRects.filter(\n (rect) => rect.width > 0 && rect.height > 0\n );\n\n if (validRects.length === 0) {\n return null;\n }\n\n // Create the highlight\n const highlight = addHighlightStore({\n pageNumber: selection.pageNumber,\n rects: validRects,\n color: color ?? activeHighlightColor,\n text: selection.text,\n });\n\n callbacksRef.current.onHighlightCreate?.(highlight);\n return highlight;\n },\n [addHighlightStore, activeHighlightColor]\n );\n\n // Programmatic highlight creation with coordinates\n const addHighlightWithCoords = useCallback(\n (data: {\n pageNumber: number;\n rects: HighlightRect[];\n text: string;\n color?: HighlightColor;\n comment?: string;\n }): Highlight => {\n const highlight = addHighlightStore({\n pageNumber: data.pageNumber,\n rects: data.rects,\n text: data.text,\n color: data.color ?? activeHighlightColor,\n comment: data.comment,\n });\n\n callbacksRef.current.onHighlightCreate?.(highlight);\n return highlight;\n },\n [addHighlightStore, activeHighlightColor]\n );\n\n const updateHighlight = useCallback(\n (id: string, updates: Partial<Pick<Highlight, 'color' | 'comment'>>) => {\n updateHighlightStore(id, updates);\n const updated = highlights.find((h) => h.id === id);\n if (updated) {\n callbacksRef.current.onHighlightUpdate?.({ ...updated, ...updates });\n }\n },\n [updateHighlightStore, highlights]\n );\n\n const deleteHighlight = useCallback(\n (id: string) => {\n removeHighlight(id);\n callbacksRef.current.onHighlightDelete?.(id);\n },\n [removeHighlight]\n );\n\n const highlightsForPage = useCallback(\n (pageNumber: number) => {\n return getHighlightsByPage(pageNumber);\n },\n [getHighlightsByPage]\n );\n\n const selectedHighlight = selectedHighlightId\n ? highlights.find((h) => h.id === selectedHighlightId) ?? null\n : null;\n\n return {\n createHighlightFromSelection,\n addHighlight: addHighlightWithCoords,\n updateHighlight,\n deleteHighlight,\n highlightsForPage,\n allHighlights: highlights,\n selectedHighlight,\n selectHighlight: selectHighlightStore,\n activeColor: activeHighlightColor,\n setActiveColor: setActiveHighlightColor,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAnnotationStore } from './PDFViewerContext';\nimport type { Annotation, NoteAnnotation, ShapeAnnotation } from '../types';\nimport type { AnnotationTool, ShapeType } from '../store/annotation-store';\n\nexport interface UseAnnotationsOptions {\n onAnnotationCreate?: (annotation: Annotation) => void;\n onAnnotationUpdate?: (annotation: Annotation) => void;\n onAnnotationDelete?: (id: string) => void;\n}\n\nexport interface UseAnnotationsReturn {\n // Annotations state\n annotations: Annotation[];\n selectedAnnotation: Annotation | undefined;\n selectedAnnotationId: string | null;\n\n // Tool state\n activeTool: AnnotationTool;\n activeShapeType: ShapeType;\n drawingColor: string;\n drawingStrokeWidth: number;\n isDrawing: boolean;\n currentDrawingPath: { points: { x: number; y: number }[] } | null;\n currentDrawingPage: number | null;\n\n // Tool actions\n setActiveTool: (tool: AnnotationTool) => void;\n setActiveShapeType: (shapeType: ShapeType) => void;\n setDrawingColor: (color: string) => void;\n setDrawingStrokeWidth: (width: number) => void;\n\n // Note actions\n createNote: (pageNumber: number, x: number, y: number, content?: string, color?: string) => NoteAnnotation;\n updateNote: (id: string, updates: Partial<NoteAnnotation>) => void;\n\n // Drawing actions\n startDrawing: (pageNumber: number, point: { x: number; y: number }) => void;\n continueDrawing: (point: { x: number; y: number }) => void;\n finishDrawing: () => Annotation | null;\n cancelDrawing: () => void;\n\n // Shape actions\n /**\n * Create a shape annotation programmatically.\n * Coordinates should be in PDF points (not scaled).\n *\n * @example\n * ```tsx\n * // Create a red rectangle box annotation\n * createShape({\n * pageNumber: 1,\n * shapeType: 'rect',\n * x: 100,\n * y: 200,\n * width: 150,\n * height: 80,\n * color: '#ef4444',\n * strokeWidth: 2\n * });\n * ```\n */\n createShape: (options: {\n pageNumber: number;\n shapeType: ShapeType;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n strokeWidth?: number;\n }) => ShapeAnnotation;\n updateShape: (id: string, updates: Partial<ShapeAnnotation>) => void;\n\n // General annotation actions\n selectAnnotation: (id: string | null) => void;\n deleteAnnotation: (id: string) => void;\n getAnnotationsByPage: (pageNumber: number) => Annotation[];\n\n // Export/Import\n exportAnnotations: () => string;\n importAnnotations: (json: string) => void;\n}\n\nexport function useAnnotations(options: UseAnnotationsOptions = {}): UseAnnotationsReturn {\n const { onAnnotationCreate, onAnnotationUpdate, onAnnotationDelete } = options;\n\n // Store selectors\n const annotations = useAnnotationStore((s) => s.annotations);\n const selectedAnnotationId = useAnnotationStore((s) => s.selectedAnnotationId);\n const activeTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const activeShapeType = useAnnotationStore((s) => s.activeShapeType);\n const drawingColor = useAnnotationStore((s) => s.drawingColor);\n const drawingStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const currentDrawingPath = useAnnotationStore((s) => s.currentDrawingPath);\n const currentDrawingPage = useAnnotationStore((s) => s.currentDrawingPage);\n\n // Store actions\n const addAnnotation = useAnnotationStore((s) => s.addAnnotation);\n const updateAnnotation = useAnnotationStore((s) => s.updateAnnotation);\n const removeAnnotation = useAnnotationStore((s) => s.removeAnnotation);\n const selectAnnotationAction = useAnnotationStore((s) => s.selectAnnotation);\n const getAnnotationsByPageAction = useAnnotationStore((s) => s.getAnnotationsByPage);\n const setActiveAnnotationTool = useAnnotationStore((s) => s.setActiveAnnotationTool);\n const setActiveShapeTypeAction = useAnnotationStore((s) => s.setActiveShapeType);\n const setDrawingColorAction = useAnnotationStore((s) => s.setDrawingColor);\n const setDrawingStrokeWidthAction = useAnnotationStore((s) => s.setDrawingStrokeWidth);\n const startDrawingAction = useAnnotationStore((s) => s.startDrawing);\n const addDrawingPoint = useAnnotationStore((s) => s.addDrawingPoint);\n const finishDrawingAction = useAnnotationStore((s) => s.finishDrawing);\n const cancelDrawingAction = useAnnotationStore((s) => s.cancelDrawing);\n const exportAnnotationsAction = useAnnotationStore((s) => s.exportAnnotations);\n const importAnnotationsAction = useAnnotationStore((s) => s.importAnnotations);\n\n // Derived state\n const selectedAnnotation = useMemo(() => {\n return annotations.find((a) => a.id === selectedAnnotationId);\n }, [annotations, selectedAnnotationId]);\n\n const isDrawing = currentDrawingPath !== null;\n\n // Tool actions\n const setActiveTool = useCallback((tool: AnnotationTool) => {\n setActiveAnnotationTool(tool);\n }, [setActiveAnnotationTool]);\n\n const setActiveShapeType = useCallback((shapeType: ShapeType) => {\n setActiveShapeTypeAction(shapeType);\n }, [setActiveShapeTypeAction]);\n\n const setDrawingColor = useCallback((color: string) => {\n setDrawingColorAction(color);\n }, [setDrawingColorAction]);\n\n const setDrawingStrokeWidth = useCallback((width: number) => {\n setDrawingStrokeWidthAction(width);\n }, [setDrawingStrokeWidthAction]);\n\n // Note actions\n const createNote = useCallback((\n pageNumber: number,\n x: number,\n y: number,\n content: string = '',\n color: string = '#fef08a'\n ): NoteAnnotation => {\n const noteData: Omit<NoteAnnotation, 'id' | 'createdAt' | 'updatedAt'> = {\n type: 'note',\n pageNumber,\n x,\n y,\n content,\n color,\n };\n const note = addAnnotation(noteData as Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) as NoteAnnotation;\n\n onAnnotationCreate?.(note);\n return note;\n }, [addAnnotation, onAnnotationCreate]);\n\n const updateNote = useCallback((id: string, updates: Partial<NoteAnnotation>) => {\n updateAnnotation(id, updates);\n const updated = annotations.find((a) => a.id === id);\n if (updated) {\n onAnnotationUpdate?.(updated);\n }\n }, [updateAnnotation, annotations, onAnnotationUpdate]);\n\n // Drawing actions\n const startDrawing = useCallback((pageNumber: number, point: { x: number; y: number }) => {\n startDrawingAction(pageNumber, point);\n }, [startDrawingAction]);\n\n const continueDrawing = useCallback((point: { x: number; y: number }) => {\n addDrawingPoint(point);\n }, [addDrawingPoint]);\n\n const finishDrawing = useCallback((): Annotation | null => {\n const annotation = finishDrawingAction();\n if (annotation) {\n onAnnotationCreate?.(annotation);\n }\n return annotation;\n }, [finishDrawingAction, onAnnotationCreate]);\n\n const cancelDrawing = useCallback(() => {\n cancelDrawingAction();\n }, [cancelDrawingAction]);\n\n // Shape actions\n const createShape = useCallback((options: {\n pageNumber: number;\n shapeType: ShapeType;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n strokeWidth?: number;\n }): ShapeAnnotation => {\n const shapeData: Omit<ShapeAnnotation, 'id' | 'createdAt' | 'updatedAt'> = {\n type: 'shape',\n pageNumber: options.pageNumber,\n shapeType: options.shapeType,\n x: options.x,\n y: options.y,\n width: options.width,\n height: options.height,\n color: options.color ?? drawingColor,\n strokeWidth: options.strokeWidth ?? drawingStrokeWidth,\n };\n const shape = addAnnotation(shapeData as Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) as ShapeAnnotation;\n\n onAnnotationCreate?.(shape);\n return shape;\n }, [addAnnotation, drawingColor, drawingStrokeWidth, onAnnotationCreate]);\n\n const updateShape = useCallback((id: string, updates: Partial<ShapeAnnotation>) => {\n updateAnnotation(id, updates);\n const updated = annotations.find((a) => a.id === id);\n if (updated) {\n onAnnotationUpdate?.(updated);\n }\n }, [updateAnnotation, annotations, onAnnotationUpdate]);\n\n // General annotation actions\n const selectAnnotation = useCallback((id: string | null) => {\n selectAnnotationAction(id);\n }, [selectAnnotationAction]);\n\n const deleteAnnotation = useCallback((id: string) => {\n removeAnnotation(id);\n onAnnotationDelete?.(id);\n }, [removeAnnotation, onAnnotationDelete]);\n\n const getAnnotationsByPage = useCallback((pageNumber: number) => {\n return getAnnotationsByPageAction(pageNumber);\n }, [getAnnotationsByPageAction]);\n\n // Export/Import\n const exportAnnotations = useCallback(() => {\n return exportAnnotationsAction();\n }, [exportAnnotationsAction]);\n\n const importAnnotations = useCallback((json: string) => {\n importAnnotationsAction(json);\n }, [importAnnotationsAction]);\n\n return {\n // State\n annotations,\n selectedAnnotation,\n selectedAnnotationId,\n activeTool,\n activeShapeType,\n drawingColor,\n drawingStrokeWidth,\n isDrawing,\n currentDrawingPath,\n currentDrawingPage,\n\n // Tool actions\n setActiveTool,\n setActiveShapeType,\n setDrawingColor,\n setDrawingStrokeWidth,\n\n // Note actions\n createNote,\n updateNote,\n\n // Drawing actions\n startDrawing,\n continueDrawing,\n finishDrawing,\n cancelDrawing,\n\n // Shape actions\n createShape,\n updateShape,\n\n // General actions\n selectAnnotation,\n deleteAnnotation,\n getAnnotationsByPage,\n\n // Export/Import\n exportAnnotations,\n importAnnotations,\n };\n}\n","import { useRef, useCallback, useEffect } from 'react';\n\nexport interface UseTouchGesturesOptions {\n /** Callback when pinch-to-zoom is detected */\n onPinchZoom?: (scale: number, center: { x: number; y: number }) => void;\n /** Callback when swipe left is detected */\n onSwipeLeft?: () => void;\n /** Callback when swipe right is detected */\n onSwipeRight?: () => void;\n /** Callback when long press is detected */\n onLongPress?: (position: { x: number; y: number }) => void;\n /** Callback when double tap is detected */\n onDoubleTap?: (position: { x: number; y: number }) => void;\n /** Minimum swipe distance in pixels */\n swipeThreshold?: number;\n /** Long press duration in milliseconds */\n longPressDuration?: number;\n /** Double tap max interval in milliseconds */\n doubleTapInterval?: number;\n /** Whether gestures are enabled */\n enabled?: boolean;\n}\n\ninterface TouchState {\n startX: number;\n startY: number;\n startTime: number;\n startDistance: number;\n currentScale: number;\n isPinching: boolean;\n longPressTimer: number | null;\n lastTapTime: number;\n}\n\nfunction getDistance(touch1: Touch, touch2: Touch): number {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction getCenter(touch1: Touch, touch2: Touch): { x: number; y: number } {\n return {\n x: (touch1.clientX + touch2.clientX) / 2,\n y: (touch1.clientY + touch2.clientY) / 2,\n };\n}\n\nexport function useTouchGestures<T extends HTMLElement = HTMLElement>(\n options: UseTouchGesturesOptions = {}\n) {\n const {\n onPinchZoom,\n onSwipeLeft,\n onSwipeRight,\n onLongPress,\n onDoubleTap,\n swipeThreshold = 50,\n longPressDuration = 500,\n doubleTapInterval = 300,\n enabled = true,\n } = options;\n\n const elementRef = useRef<T | null>(null);\n const stateRef = useRef<TouchState>({\n startX: 0,\n startY: 0,\n startTime: 0,\n startDistance: 0,\n currentScale: 1,\n isPinching: false,\n longPressTimer: null,\n lastTapTime: 0,\n });\n\n const clearLongPressTimer = useCallback(() => {\n if (stateRef.current.longPressTimer !== null) {\n clearTimeout(stateRef.current.longPressTimer);\n stateRef.current.longPressTimer = null;\n }\n }, []);\n\n const handleTouchStart = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n state.startX = touch.clientX;\n state.startY = touch.clientY;\n state.startTime = Date.now();\n state.isPinching = false;\n\n // Set up long press detection\n if (onLongPress) {\n state.longPressTimer = window.setTimeout(() => {\n onLongPress({ x: touch.clientX, y: touch.clientY });\n state.longPressTimer = null;\n }, longPressDuration);\n }\n } else if (e.touches.length === 2 && onPinchZoom) {\n // Start pinch gesture\n const touch1 = e.touches[0];\n const touch2 = e.touches[1];\n state.startDistance = getDistance(touch1, touch2);\n state.currentScale = 1;\n state.isPinching = true;\n clearLongPressTimer();\n }\n },\n [enabled, onLongPress, onPinchZoom, longPressDuration, clearLongPressTimer]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n if (e.touches.length === 2 && state.isPinching && onPinchZoom) {\n // Handle pinch zoom\n const touch1 = e.touches[0];\n const touch2 = e.touches[1];\n const currentDistance = getDistance(touch1, touch2);\n const center = getCenter(touch1, touch2);\n\n if (state.startDistance > 0) {\n const scale = currentDistance / state.startDistance;\n state.currentScale = scale;\n onPinchZoom(scale, center);\n }\n } else if (e.touches.length === 1) {\n // Check if we've moved enough to cancel long press\n const touch = e.touches[0];\n const dx = Math.abs(touch.clientX - state.startX);\n const dy = Math.abs(touch.clientY - state.startY);\n\n if (dx > 10 || dy > 10) {\n clearLongPressTimer();\n }\n }\n },\n [enabled, onPinchZoom, clearLongPressTimer]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n // Handle pinch end\n if (state.isPinching) {\n state.isPinching = false;\n state.startDistance = 0;\n return;\n }\n\n // Only process single touch end\n if (e.changedTouches.length !== 1) return;\n\n const touch = e.changedTouches[0];\n const endTime = Date.now();\n const duration = endTime - state.startTime;\n\n // Calculate movement\n const dx = touch.clientX - state.startX;\n const dy = touch.clientY - state.startY;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n // Check for double tap\n if (onDoubleTap && duration < 300 && absDx < 20 && absDy < 20) {\n const timeSinceLastTap = endTime - state.lastTapTime;\n if (timeSinceLastTap < doubleTapInterval) {\n onDoubleTap({ x: touch.clientX, y: touch.clientY });\n state.lastTapTime = 0;\n return;\n }\n state.lastTapTime = endTime;\n }\n\n // Check for swipe (quick horizontal movement)\n if (duration < 300 && absDx > swipeThreshold && absDx > absDy * 2) {\n if (dx > 0 && onSwipeRight) {\n onSwipeRight();\n } else if (dx < 0 && onSwipeLeft) {\n onSwipeLeft();\n }\n }\n },\n [enabled, onSwipeLeft, onSwipeRight, onDoubleTap, swipeThreshold, doubleTapInterval, clearLongPressTimer]\n );\n\n const handleTouchCancel = useCallback(() => {\n clearLongPressTimer();\n stateRef.current.isPinching = false;\n }, [clearLongPressTimer]);\n\n // Attach event listeners\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n element.addEventListener('touchstart', handleTouchStart, { passive: true });\n element.addEventListener('touchmove', handleTouchMove, { passive: true });\n element.addEventListener('touchend', handleTouchEnd, { passive: true });\n element.addEventListener('touchcancel', handleTouchCancel, { passive: true });\n\n return () => {\n element.removeEventListener('touchstart', handleTouchStart);\n element.removeEventListener('touchmove', handleTouchMove);\n element.removeEventListener('touchend', handleTouchEnd);\n element.removeEventListener('touchcancel', handleTouchCancel);\n clearLongPressTimer();\n };\n }, [enabled, handleTouchStart, handleTouchMove, handleTouchEnd, handleTouchCancel, clearLongPressTimer]);\n\n // Return ref to attach to element\n const setRef = useCallback((element: T | null) => {\n elementRef.current = element;\n }, []);\n\n return {\n ref: setRef,\n elementRef,\n };\n}\n\n// Utility hook for detecting if device supports touch\nexport function useIsTouchDevice(): boolean {\n if (typeof window === 'undefined') return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\n// Utility hook for detecting if device is mobile\nexport function useIsMobile(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(max-width: 640px)').matches;\n}\n","import type {\n Plugin,\n PluginAPI,\n ToolbarItem,\n SidebarPanelConfig,\n ContextMenuItem,\n ViewerState,\n ViewerActions,\n} from '../types';\n\nexport interface PluginManagerOptions {\n /** Callback when a plugin is registered */\n onPluginRegistered?: (plugin: Plugin) => void;\n /** Callback when a plugin is unregistered */\n onPluginUnregistered?: (name: string) => void;\n /** Callback when toolbar items change */\n onToolbarItemsChanged?: (items: ToolbarItem[]) => void;\n /** Callback when sidebar panels change */\n onSidebarPanelsChanged?: (panels: SidebarPanelConfig[]) => void;\n /** Callback when context menu items change */\n onContextMenuItemsChanged?: (items: ContextMenuItem[]) => void;\n}\n\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private toolbarItems: Map<string, ToolbarItem[]> = new Map();\n private sidebarPanels: Map<string, SidebarPanelConfig[]> = new Map();\n private contextMenuItems: Map<string, ContextMenuItem[]> = new Map();\n private viewerStateGetter: (() => ViewerState & ViewerActions) | null = null;\n private options: PluginManagerOptions;\n\n constructor(options: PluginManagerOptions = {}) {\n this.options = options;\n }\n\n /**\n * Set the getter function for viewer state\n */\n setViewerStateGetter(getter: () => ViewerState & ViewerActions): void {\n this.viewerStateGetter = getter;\n }\n\n /**\n * Create the plugin API for a specific plugin\n */\n private createPluginAPI(pluginName: string): PluginAPI {\n return {\n viewer: this.viewerStateGetter?.() || ({} as ViewerState & ViewerActions),\n\n registerToolbarItem: (item: ToolbarItem) => {\n const items = this.toolbarItems.get(pluginName) || [];\n items.push(item);\n this.toolbarItems.set(pluginName, items);\n this.notifyToolbarItemsChanged();\n },\n\n registerSidebarPanel: (panel: SidebarPanelConfig) => {\n const panels = this.sidebarPanels.get(pluginName) || [];\n panels.push(panel);\n this.sidebarPanels.set(pluginName, panels);\n this.notifySidebarPanelsChanged();\n },\n\n registerContextMenuItem: (item: ContextMenuItem) => {\n const items = this.contextMenuItems.get(pluginName) || [];\n items.push(item);\n this.contextMenuItems.set(pluginName, items);\n this.notifyContextMenuItemsChanged();\n },\n };\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise<void> {\n if (this.plugins.has(plugin.name)) {\n console.warn(`Plugin \"${plugin.name}\" is already registered. Unregister it first.`);\n return;\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Initialize the plugin if it has an initialize function\n if (plugin.initialize) {\n const api = this.createPluginAPI(plugin.name);\n await plugin.initialize(api);\n }\n\n this.options.onPluginRegistered?.(plugin);\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n console.warn(`Plugin \"${name}\" is not registered.`);\n return;\n }\n\n // Destroy the plugin if it has a destroy function\n if (plugin.destroy) {\n await plugin.destroy();\n }\n\n // Remove all registered items from this plugin\n this.toolbarItems.delete(name);\n this.sidebarPanels.delete(name);\n this.contextMenuItems.delete(name);\n\n this.plugins.delete(name);\n\n this.notifyToolbarItemsChanged();\n this.notifySidebarPanelsChanged();\n this.notifyContextMenuItemsChanged();\n\n this.options.onPluginUnregistered?.(name);\n }\n\n /**\n * Get a registered plugin by name\n */\n getPlugin(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Get all toolbar items from all plugins\n */\n getToolbarItems(): ToolbarItem[] {\n const allItems: ToolbarItem[] = [];\n for (const items of this.toolbarItems.values()) {\n allItems.push(...items);\n }\n // Sort by order if specified\n return allItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Get toolbar items by position\n */\n getToolbarItemsByPosition(position: 'left' | 'center' | 'right'): ToolbarItem[] {\n return this.getToolbarItems().filter((item) => item.position === position);\n }\n\n /**\n * Get all sidebar panels from all plugins\n */\n getSidebarPanels(): SidebarPanelConfig[] {\n const allPanels: SidebarPanelConfig[] = [];\n for (const panels of this.sidebarPanels.values()) {\n allPanels.push(...panels);\n }\n return allPanels;\n }\n\n /**\n * Get all context menu items from all plugins\n */\n getContextMenuItems(): ContextMenuItem[] {\n const allItems: ContextMenuItem[] = [];\n for (const items of this.contextMenuItems.values()) {\n allItems.push(...items);\n }\n // Filter by condition if specified\n return allItems.filter((item) => !item.condition || item.condition());\n }\n\n /**\n * Destroy all plugins and clean up\n */\n async destroy(): Promise<void> {\n const pluginNames = Array.from(this.plugins.keys());\n for (const name of pluginNames) {\n await this.unregister(name);\n }\n }\n\n private notifyToolbarItemsChanged(): void {\n this.options.onToolbarItemsChanged?.(this.getToolbarItems());\n }\n\n private notifySidebarPanelsChanged(): void {\n this.options.onSidebarPanelsChanged?.(this.getSidebarPanels());\n }\n\n private notifyContextMenuItemsChanged(): void {\n this.options.onContextMenuItemsChanged?.(this.getContextMenuItems());\n }\n}\n\n// Create a default plugin manager instance\nlet defaultPluginManager: PluginManager | null = null;\n\nexport function getPluginManager(): PluginManager {\n if (!defaultPluginManager) {\n defaultPluginManager = new PluginManager();\n }\n return defaultPluginManager;\n}\n\nexport function createPluginManager(options?: PluginManagerOptions): PluginManager {\n return new PluginManager(options);\n}\n","import { useRef, useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n PluginManager,\n createPluginManager,\n type PluginManagerOptions,\n} from '../plugins/PluginManager';\nimport type { Plugin, ToolbarItem, SidebarPanelConfig, ContextMenuItem } from '../types';\nimport { usePDFViewer } from './usePDFViewer';\n\nexport interface UsePluginsOptions extends PluginManagerOptions {\n /** Initial plugins to register */\n initialPlugins?: Plugin[];\n}\n\nexport interface UsePluginsReturn {\n /** The plugin manager instance */\n pluginManager: PluginManager;\n\n /** All registered plugins */\n plugins: Plugin[];\n\n /** Toolbar items from plugins */\n toolbarItems: ToolbarItem[];\n\n /** Sidebar panels from plugins */\n sidebarPanels: SidebarPanelConfig[];\n\n /** Context menu items from plugins */\n contextMenuItems: ContextMenuItem[];\n\n /** Register a plugin */\n registerPlugin: (plugin: Plugin) => Promise<void>;\n\n /** Unregister a plugin by name */\n unregisterPlugin: (name: string) => Promise<void>;\n\n /** Check if a plugin is registered */\n hasPlugin: (name: string) => boolean;\n}\n\nexport function usePlugins(options: UsePluginsOptions = {}): UsePluginsReturn {\n const { initialPlugins, ...managerOptions } = options;\n\n // Get viewer state/actions for the plugin API\n const viewerState = usePDFViewer();\n\n // State for plugin-registered items\n const [plugins, setPlugins] = useState<Plugin[]>([]);\n const [toolbarItems, setToolbarItems] = useState<ToolbarItem[]>([]);\n const [sidebarPanels, setSidebarPanels] = useState<SidebarPanelConfig[]>([]);\n const [contextMenuItems, setContextMenuItems] = useState<ContextMenuItem[]>([]);\n\n // Create the plugin manager\n const pluginManagerRef = useRef<PluginManager | null>(null);\n\n const getPluginManager = useCallback(() => {\n if (!pluginManagerRef.current) {\n pluginManagerRef.current = createPluginManager({\n ...managerOptions,\n onPluginRegistered: (plugin) => {\n setPlugins((prev) => [...prev, plugin]);\n managerOptions.onPluginRegistered?.(plugin);\n },\n onPluginUnregistered: (name) => {\n setPlugins((prev) => prev.filter((p) => p.name !== name));\n managerOptions.onPluginUnregistered?.(name);\n },\n onToolbarItemsChanged: (items) => {\n setToolbarItems(items);\n managerOptions.onToolbarItemsChanged?.(items);\n },\n onSidebarPanelsChanged: (panels) => {\n setSidebarPanels(panels);\n managerOptions.onSidebarPanelsChanged?.(panels);\n },\n onContextMenuItemsChanged: (items) => {\n setContextMenuItems(items);\n managerOptions.onContextMenuItemsChanged?.(items);\n },\n });\n }\n return pluginManagerRef.current;\n }, [managerOptions]);\n\n // Update viewer state getter when state changes\n useEffect(() => {\n const manager = getPluginManager();\n manager.setViewerStateGetter(() => viewerState as any);\n }, [viewerState, getPluginManager]);\n\n // Register initial plugins\n useEffect(() => {\n if (initialPlugins && initialPlugins.length > 0) {\n const manager = getPluginManager();\n initialPlugins.forEach((plugin) => {\n manager.register(plugin);\n });\n }\n }, [initialPlugins, getPluginManager]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n pluginManagerRef.current?.destroy();\n };\n }, []);\n\n // Memoized return value\n const registerPlugin = useCallback(async (plugin: Plugin) => {\n const manager = getPluginManager();\n await manager.register(plugin);\n }, [getPluginManager]);\n\n const unregisterPlugin = useCallback(async (name: string) => {\n const manager = getPluginManager();\n await manager.unregister(name);\n }, [getPluginManager]);\n\n const hasPlugin = useCallback((name: string) => {\n const manager = getPluginManager();\n return manager.hasPlugin(name);\n }, [getPluginManager]);\n\n return useMemo(\n () => ({\n pluginManager: getPluginManager(),\n plugins,\n toolbarItems,\n sidebarPanels,\n contextMenuItems,\n registerPlugin,\n unregisterPlugin,\n hasPlugin,\n }),\n [\n getPluginManager,\n plugins,\n toolbarItems,\n sidebarPanels,\n contextMenuItems,\n registerPlugin,\n unregisterPlugin,\n hasPlugin,\n ]\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAgentStore, useStudentStore, useAnnotationStore, useViewerStore } from './PDFViewerContext';\nimport type {\n AgentContext,\n FocusedRegion,\n Takeaway,\n AgentAPI,\n AgentHighlightParams,\n} from '../types/agent-context';\nimport type { HighlightColor } from '../types';\n\nexport interface UseAgentContextOptions {\n /** Default focus region style */\n defaultFocusStyle?: 'pulse' | 'glow' | 'border';\n /** Default focus region color */\n defaultFocusColor?: string;\n /** Default auto-clear timeout for focus regions (ms) */\n defaultAutoClearTimeout?: number;\n}\n\nexport interface UseAgentContextReturn {\n /** Current agent context */\n agentContext: AgentContext | null;\n /** Set or update agent context */\n setAgentContext: (context: Partial<AgentContext>) => void;\n /** Clear agent context */\n clearAgentContext: () => void;\n /** Currently focused regions */\n focusedRegions: FocusedRegion[];\n /** Add a focus region and return its ID */\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => string;\n /** Remove a focus region by ID */\n clearFocusedRegion: (id: string) => void;\n /** Clear all focus regions */\n clearAllFocusedRegions: () => void;\n /** Add a takeaway for a page */\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => Takeaway;\n /** Add a highlight from the agent */\n addAgentHighlight: (params: AgentHighlightParams) => string;\n /** Get the agent API for external integration */\n getAgentAPI: () => AgentAPI;\n}\n\n/**\n * Hook for agent context management and AI agent integration.\n * Provides methods for agents to interact with the PDF viewer.\n */\nexport function useAgentContext(options: UseAgentContextOptions = {}): UseAgentContextReturn {\n const {\n defaultFocusStyle = 'pulse',\n defaultFocusColor,\n defaultAutoClearTimeout = 0,\n } = options;\n\n // Agent store state and actions\n const agentContext = useAgentStore((s) => s.currentContext);\n const focusedRegions = useAgentStore((s) => s.focusedRegions);\n const setAgentContextAction = useAgentStore((s) => s.setAgentContext);\n const clearAgentContextAction = useAgentStore((s) => s.clearAgentContext);\n const addFocusedRegionAction = useAgentStore((s) => s.addFocusedRegion);\n const removeFocusedRegionAction = useAgentStore((s) => s.removeFocusedRegion);\n const clearAllFocusedRegionsAction = useAgentStore((s) => s.clearAllFocusedRegions);\n\n // Student store actions for takeaways\n const addTakeawayAction = useStudentStore((s) => s.addTakeaway);\n\n // Annotation store for agent highlights\n const addHighlightAction = useAnnotationStore((s) => s.addHighlight);\n\n // Viewer store for navigation\n const goToPageAction = useViewerStore((s) => s.goToPage);\n const currentPage = useViewerStore((s) => s.currentPage);\n\n const setAgentContext = useCallback(\n (context: Partial<AgentContext>) => {\n setAgentContextAction(context);\n },\n [setAgentContextAction]\n );\n\n const clearAgentContext = useCallback(() => {\n clearAgentContextAction();\n }, [clearAgentContextAction]);\n\n const focusRegion = useCallback(\n (region: Omit<FocusedRegion, 'id'>) => {\n const regionWithDefaults: Omit<FocusedRegion, 'id'> = {\n ...region,\n style: region.style ?? defaultFocusStyle,\n color: region.color ?? defaultFocusColor,\n autoClearTimeout: region.autoClearTimeout ?? defaultAutoClearTimeout,\n };\n return addFocusedRegionAction(regionWithDefaults);\n },\n [addFocusedRegionAction, defaultFocusStyle, defaultFocusColor, defaultAutoClearTimeout]\n );\n\n const clearFocusedRegion = useCallback(\n (id: string) => {\n removeFocusedRegionAction(id);\n },\n [removeFocusedRegionAction]\n );\n\n const clearAllFocusedRegions = useCallback(() => {\n clearAllFocusedRegionsAction();\n }, [clearAllFocusedRegionsAction]);\n\n const addTakeaway = useCallback(\n (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n return addTakeawayAction({\n pageNumber,\n summary,\n source: 'agent',\n metadata,\n });\n },\n [addTakeawayAction]\n );\n\n const addAgentHighlight = useCallback(\n (params: AgentHighlightParams) => {\n const highlight = addHighlightAction({\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? ('blue' as HighlightColor),\n comment: params.comment,\n source: 'agent',\n });\n return highlight.id;\n },\n [addHighlightAction]\n );\n\n const getAgentAPI = useCallback((): AgentAPI => {\n return {\n focusRegion,\n clearFocusedRegion: (id?: string) => {\n if (id) {\n clearFocusedRegion(id);\n } else {\n clearAllFocusedRegions();\n }\n },\n addTakeaway,\n setAgentContext,\n addAgentHighlight,\n goToPage: goToPageAction,\n getCurrentPage: () => currentPage,\n getAgentContext: () => agentContext,\n };\n }, [\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n setAgentContext,\n addAgentHighlight,\n goToPageAction,\n currentPage,\n agentContext,\n ]);\n\n return useMemo(\n () => ({\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n addAgentHighlight,\n getAgentAPI,\n }),\n [\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n addAgentHighlight,\n getAgentAPI,\n ]\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { useAgentStore } from './PDFViewerContext';\nimport type { AskAboutContext, PDFRegion } from '../types/agent-context';\n\nexport interface UseAskAboutOptions {\n /** Whether the feature is enabled */\n enabled?: boolean;\n /** Long press duration to trigger ask about (ms) */\n longPressDuration?: number;\n /** Callback when ask about is triggered */\n onAskAbout?: (context: AskAboutContext) => void;\n /** Minimum selection length to enable ask about for text */\n minSelectionLength?: number;\n}\n\nexport interface UseAskAboutReturn {\n /** Whether ask about is currently in progress (long press active) */\n isLongPressing: boolean;\n /** Progress of the long press (0-1) */\n longPressProgress: number;\n /** Position of the long press */\n longPressPosition: { x: number; y: number } | null;\n /** Trigger ask about for selected text */\n askAboutSelection: (text: string, pageNumber: number) => void;\n /** Trigger ask about for a region (diagram, image) */\n askAboutRegion: (region: PDFRegion, pageNumber: number) => void;\n /** Start long press tracking (for custom implementations) */\n startLongPress: (x: number, y: number) => void;\n /** Cancel long press */\n cancelLongPress: () => void;\n /** Complete long press and trigger callback */\n completeLongPress: (type: 'text' | 'region', pageNumber: number, text?: string, region?: PDFRegion) => void;\n /** Handlers for attaching to elements */\n handlers: {\n onMouseDown: (e: React.MouseEvent) => void;\n onMouseUp: () => void;\n onMouseLeave: () => void;\n onTouchStart: (e: React.TouchEvent) => void;\n onTouchEnd: () => void;\n onTouchCancel: () => void;\n };\n}\n\n/**\n * Hook for implementing the \"Ask About This\" feature.\n * Provides long-press detection and callbacks for asking about text or regions.\n */\nexport function useAskAbout(options: UseAskAboutOptions = {}): UseAskAboutReturn {\n const {\n enabled = true,\n longPressDuration = 800,\n onAskAbout,\n minSelectionLength = 3,\n } = options;\n\n const [isLongPressing, setIsLongPressing] = useState(false);\n const [longPressProgress, setLongPressProgress] = useState(0);\n const [longPressPosition, setLongPressPosition] = useState<{ x: number; y: number } | null>(null);\n\n const timerRef = useRef<number | null>(null);\n const progressIntervalRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // Get agent context for including in ask about\n const agentContext = useAgentStore((s) => s.currentContext);\n\n const clearTimers = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (progressIntervalRef.current !== null) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n }, []);\n\n const cancelLongPress = useCallback(() => {\n clearTimers();\n setIsLongPressing(false);\n setLongPressProgress(0);\n setLongPressPosition(null);\n }, [clearTimers]);\n\n const triggerAskAbout = useCallback(\n (context: AskAboutContext) => {\n // Include agent context if available\n const fullContext: AskAboutContext = {\n ...context,\n agentContext: agentContext ?? undefined,\n };\n onAskAbout?.(fullContext);\n },\n [onAskAbout, agentContext]\n );\n\n const startLongPress = useCallback(\n (x: number, y: number) => {\n if (!enabled) return;\n\n clearTimers();\n setIsLongPressing(true);\n setLongPressProgress(0);\n setLongPressPosition({ x, y });\n startTimeRef.current = Date.now();\n\n // Update progress every 50ms\n progressIntervalRef.current = window.setInterval(() => {\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min(elapsed / longPressDuration, 1);\n setLongPressProgress(progress);\n }, 50);\n\n // Complete after duration\n timerRef.current = window.setTimeout(() => {\n setLongPressProgress(1);\n clearTimers();\n }, longPressDuration);\n },\n [enabled, longPressDuration, clearTimers]\n );\n\n const completeLongPress = useCallback(\n (type: 'text' | 'region', pageNumber: number, text?: string, region?: PDFRegion) => {\n if (longPressProgress >= 1) {\n triggerAskAbout({\n type,\n pageNumber,\n selectedText: text,\n region,\n });\n }\n cancelLongPress();\n },\n [longPressProgress, triggerAskAbout, cancelLongPress]\n );\n\n const askAboutSelection = useCallback(\n (text: string, pageNumber: number) => {\n if (!enabled || text.length < minSelectionLength) return;\n\n triggerAskAbout({\n type: 'text',\n pageNumber,\n selectedText: text,\n });\n },\n [enabled, minSelectionLength, triggerAskAbout]\n );\n\n const askAboutRegion = useCallback(\n (region: PDFRegion, pageNumber: number) => {\n if (!enabled) return;\n\n triggerAskAbout({\n type: 'region',\n pageNumber,\n region,\n });\n },\n [enabled, triggerAskAbout]\n );\n\n // Mouse handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!enabled) return;\n startLongPress(e.clientX, e.clientY);\n },\n [enabled, startLongPress]\n );\n\n const handleMouseUp = useCallback(() => {\n if (isLongPressing && longPressProgress < 1) {\n cancelLongPress();\n }\n }, [isLongPressing, longPressProgress, cancelLongPress]);\n\n const handleMouseLeave = useCallback(() => {\n if (isLongPressing) {\n cancelLongPress();\n }\n }, [isLongPressing, cancelLongPress]);\n\n // Touch handlers\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (!enabled || e.touches.length !== 1) return;\n const touch = e.touches[0];\n startLongPress(touch.clientX, touch.clientY);\n },\n [enabled, startLongPress]\n );\n\n const handleTouchEnd = useCallback(() => {\n if (isLongPressing && longPressProgress < 1) {\n cancelLongPress();\n }\n }, [isLongPressing, longPressProgress, cancelLongPress]);\n\n const handleTouchCancel = useCallback(() => {\n cancelLongPress();\n }, [cancelLongPress]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearTimers();\n };\n }, [clearTimers]);\n\n return {\n isLongPressing,\n longPressProgress,\n longPressPosition,\n askAboutSelection,\n askAboutRegion,\n startLongPress,\n cancelLongPress,\n completeLongPress,\n handlers: {\n onMouseDown: handleMouseDown,\n onMouseUp: handleMouseUp,\n onMouseLeave: handleMouseLeave,\n onTouchStart: handleTouchStart,\n onTouchEnd: handleTouchEnd,\n onTouchCancel: handleTouchCancel,\n },\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { useStudentStore, useAgentStore, useViewerStore } from './PDFViewerContext';\nimport type { Bookmark } from '../types/agent-context';\n\nexport interface UseBookmarksOptions {\n /** Callback when bookmark is added */\n onBookmarkAdd?: (bookmark: Bookmark) => void;\n /** Callback when bookmark is removed */\n onBookmarkRemove?: (id: string) => void;\n /** Automatically capture agent context when bookmarking */\n captureAgentContext?: boolean;\n}\n\nexport interface UseBookmarksReturn {\n /** All bookmarks */\n bookmarks: Bookmark[];\n /** Bookmarks for the current page */\n currentPageBookmarks: Bookmark[];\n /** Check if current page is bookmarked */\n isCurrentPageBookmarked: boolean;\n /** Add a bookmark */\n addBookmark: (data?: Partial<Omit<Bookmark, 'id' | 'timestamp'>>) => Bookmark;\n /** Update a bookmark */\n updateBookmark: (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => void;\n /** Remove a bookmark */\n removeBookmark: (id: string) => void;\n /** Toggle bookmark on current page */\n toggleBookmark: () => void;\n /** Navigate to a bookmarked page */\n goToBookmark: (bookmark: Bookmark) => void;\n /** Get bookmarks for a specific page */\n getBookmarksForPage: (pageNumber: number) => Bookmark[];\n /** Get bookmarks grouped by page */\n bookmarksByPage: Map<number, Bookmark[]>;\n}\n\n/**\n * Hook for managing bookmarks with agent context capture.\n */\nexport function useBookmarks(options: UseBookmarksOptions = {}): UseBookmarksReturn {\n const { onBookmarkAdd, onBookmarkRemove, captureAgentContext = true } = options;\n\n // Student store state and actions\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const addBookmarkAction = useStudentStore((s) => s.addBookmark);\n const updateBookmarkAction = useStudentStore((s) => s.updateBookmark);\n const removeBookmarkAction = useStudentStore((s) => s.removeBookmark);\n\n // Agent context for capturing\n const agentContext = useAgentStore((s) => s.currentContext);\n\n // Viewer store for navigation\n const currentPage = useViewerStore((s) => s.currentPage);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n const currentPageBookmarks = useMemo(\n () => bookmarks.filter((b) => b.pageNumber === currentPage),\n [bookmarks, currentPage]\n );\n\n const isCurrentPageBookmarked = currentPageBookmarks.length > 0;\n\n const bookmarksByPage = useMemo(() => {\n const map = new Map<number, Bookmark[]>();\n bookmarks.forEach((bookmark) => {\n const existing = map.get(bookmark.pageNumber) || [];\n map.set(bookmark.pageNumber, [...existing, bookmark]);\n });\n return map;\n }, [bookmarks]);\n\n const addBookmark = useCallback(\n (data?: Partial<Omit<Bookmark, 'id' | 'timestamp'>>) => {\n const bookmarkData = {\n pageNumber: data?.pageNumber ?? currentPage,\n userNote: data?.userNote,\n label: data?.label,\n agentContext: captureAgentContext && agentContext?.lastStatement\n ? agentContext.lastStatement\n : data?.agentContext,\n };\n\n const bookmark = addBookmarkAction(bookmarkData);\n onBookmarkAdd?.(bookmark);\n return bookmark;\n },\n [currentPage, captureAgentContext, agentContext, addBookmarkAction, onBookmarkAdd]\n );\n\n const updateBookmark = useCallback(\n (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => {\n updateBookmarkAction(id, updates);\n },\n [updateBookmarkAction]\n );\n\n const removeBookmark = useCallback(\n (id: string) => {\n removeBookmarkAction(id);\n onBookmarkRemove?.(id);\n },\n [removeBookmarkAction, onBookmarkRemove]\n );\n\n const toggleBookmark = useCallback(() => {\n if (isCurrentPageBookmarked) {\n // Remove the first bookmark on the current page\n const bookmarkToRemove = currentPageBookmarks[0];\n if (bookmarkToRemove) {\n removeBookmark(bookmarkToRemove.id);\n }\n } else {\n addBookmark();\n }\n }, [isCurrentPageBookmarked, currentPageBookmarks, removeBookmark, addBookmark]);\n\n const goToBookmark = useCallback(\n (bookmark: Bookmark) => {\n goToPage(bookmark.pageNumber);\n },\n [goToPage]\n );\n\n const getBookmarksForPage = useCallback(\n (pageNumber: number) => {\n return bookmarks.filter((b) => b.pageNumber === pageNumber);\n },\n [bookmarks]\n );\n\n return useMemo(\n () => ({\n bookmarks,\n currentPageBookmarks,\n isCurrentPageBookmarked,\n addBookmark,\n updateBookmark,\n removeBookmark,\n toggleBookmark,\n goToBookmark,\n getBookmarksForPage,\n bookmarksByPage,\n }),\n [\n bookmarks,\n currentPageBookmarks,\n isCurrentPageBookmarked,\n addBookmark,\n updateBookmark,\n removeBookmark,\n toggleBookmark,\n goToBookmark,\n getBookmarksForPage,\n bookmarksByPage,\n ]\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { useStudentStore, useAgentStore, useViewerStore } from './PDFViewerContext';\nimport type { QuickNote } from '../types/agent-context';\n\nexport interface UseQuickNotesOptions {\n /** Callback when note is added */\n onNoteAdd?: (note: QuickNote) => void;\n /** Callback when note is removed */\n onNoteRemove?: (id: string) => void;\n /** Automatically capture agent's last statement when creating notes */\n captureAgentContext?: boolean;\n}\n\nexport interface UseQuickNotesReturn {\n /** All quick notes */\n quickNotes: QuickNote[];\n /** Quick notes for the current page */\n currentPageNotes: QuickNote[];\n /** Add a quick note */\n addQuickNote: (data: { content: string; x: number; y: number; pageNumber?: number }) => QuickNote;\n /** Update a quick note */\n updateQuickNote: (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => void;\n /** Remove a quick note */\n removeQuickNote: (id: string) => void;\n /** Get notes for a specific page */\n getNotesForPage: (pageNumber: number) => QuickNote[];\n /** Notes grouped by page */\n notesByPage: Map<number, QuickNote[]>;\n}\n\n/**\n * Hook for managing quick notes with agent context capture.\n */\nexport function useQuickNotes(options: UseQuickNotesOptions = {}): UseQuickNotesReturn {\n const { onNoteAdd, onNoteRemove, captureAgentContext = true } = options;\n\n // Student store state and actions\n const quickNotes = useStudentStore((s) => s.quickNotes);\n const addQuickNoteAction = useStudentStore((s) => s.addQuickNote);\n const updateQuickNoteAction = useStudentStore((s) => s.updateQuickNote);\n const removeQuickNoteAction = useStudentStore((s) => s.removeQuickNote);\n\n // Agent context for capturing\n const agentContext = useAgentStore((s) => s.currentContext);\n\n // Viewer store for current page\n const currentPage = useViewerStore((s) => s.currentPage);\n\n const currentPageNotes = useMemo(\n () => quickNotes.filter((n) => n.pageNumber === currentPage),\n [quickNotes, currentPage]\n );\n\n const notesByPage = useMemo(() => {\n const map = new Map<number, QuickNote[]>();\n quickNotes.forEach((note) => {\n const existing = map.get(note.pageNumber) || [];\n map.set(note.pageNumber, [...existing, note]);\n });\n return map;\n }, [quickNotes]);\n\n const addQuickNote = useCallback(\n (data: { content: string; x: number; y: number; pageNumber?: number }) => {\n const noteData = {\n content: data.content,\n x: data.x,\n y: data.y,\n pageNumber: data.pageNumber ?? currentPage,\n agentLastStatement: captureAgentContext && agentContext?.lastStatement\n ? agentContext.lastStatement\n : undefined,\n };\n\n const note = addQuickNoteAction(noteData);\n onNoteAdd?.(note);\n return note;\n },\n [currentPage, captureAgentContext, agentContext, addQuickNoteAction, onNoteAdd]\n );\n\n const updateQuickNote = useCallback(\n (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => {\n updateQuickNoteAction(id, updates);\n },\n [updateQuickNoteAction]\n );\n\n const removeQuickNote = useCallback(\n (id: string) => {\n removeQuickNoteAction(id);\n onNoteRemove?.(id);\n },\n [removeQuickNoteAction, onNoteRemove]\n );\n\n const getNotesForPage = useCallback(\n (pageNumber: number) => {\n return quickNotes.filter((n) => n.pageNumber === pageNumber);\n },\n [quickNotes]\n );\n\n return useMemo(\n () => ({\n quickNotes,\n currentPageNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n getNotesForPage,\n notesByPage,\n }),\n [\n quickNotes,\n currentPageNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n getNotesForPage,\n notesByPage,\n ]\n );\n}\n","import { useCallback, useMemo, useEffect } from 'react';\nimport { useStudentStore, useViewerStore } from './PDFViewerContext';\n\nexport interface UseStudentProgressOptions {\n /** Automatically track page visits */\n autoTrack?: boolean;\n /** Debounce time for page tracking (ms) */\n trackDebounce?: number;\n}\n\nexport interface UseStudentProgressReturn {\n /** Set of visited page numbers */\n visitedPages: Set<number>;\n /** Array of visited page numbers (for easier iteration) */\n visitedPagesArray: number[];\n /** Current reading progress (0-1) */\n progress: number;\n /** Percentage of pages visited */\n visitedPercentage: number;\n /** Number of pages visited */\n visitedCount: number;\n /** Total number of pages */\n totalPages: number;\n /** Current page number */\n currentPage: number;\n /** Mark a page as visited */\n markPageVisited: (pageNumber: number) => void;\n /** Check if a page has been visited */\n isPageVisited: (pageNumber: number) => boolean;\n /** Get page visit status for minimap rendering */\n getPageStatus: (pageNumber: number) => 'current' | 'visited' | 'unvisited';\n}\n\n/**\n * Hook for tracking student reading progress.\n */\nexport function useStudentProgress(options: UseStudentProgressOptions = {}): UseStudentProgressReturn {\n const { autoTrack = true, trackDebounce = 1000 } = options;\n\n // Student store state and actions\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const progress = useStudentStore((s) => s.progress);\n const markPageVisitedAction = useStudentStore((s) => s.markPageVisited);\n const setProgressAction = useStudentStore((s) => s.setProgress);\n\n // Viewer store for page info\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n\n const visitedPagesArray = useMemo(\n () => Array.from(visitedPages).sort((a, b) => a - b),\n [visitedPages]\n );\n\n const visitedCount = visitedPages.size;\n const totalPages = numPages;\n\n const visitedPercentage = useMemo(() => {\n if (totalPages === 0) return 0;\n return (visitedCount / totalPages) * 100;\n }, [visitedCount, totalPages]);\n\n const markPageVisited = useCallback(\n (pageNumber: number) => {\n markPageVisitedAction(pageNumber);\n // Update progress based on visited pages\n if (totalPages > 0) {\n const newProgress = (visitedPages.size + 1) / totalPages;\n setProgressAction(Math.min(newProgress, 1));\n }\n },\n [markPageVisitedAction, setProgressAction, totalPages, visitedPages.size]\n );\n\n const isPageVisited = useCallback(\n (pageNumber: number) => {\n return visitedPages.has(pageNumber);\n },\n [visitedPages]\n );\n\n const getPageStatus = useCallback(\n (pageNumber: number): 'current' | 'visited' | 'unvisited' => {\n if (pageNumber === currentPage) return 'current';\n if (visitedPages.has(pageNumber)) return 'visited';\n return 'unvisited';\n },\n [currentPage, visitedPages]\n );\n\n // Auto-track current page visits\n useEffect(() => {\n if (!autoTrack || currentPage <= 0) return;\n\n const timer = setTimeout(() => {\n if (!visitedPages.has(currentPage)) {\n markPageVisited(currentPage);\n }\n }, trackDebounce);\n\n return () => clearTimeout(timer);\n }, [autoTrack, currentPage, trackDebounce, visitedPages, markPageVisited]);\n\n return useMemo(\n () => ({\n visitedPages,\n visitedPagesArray,\n progress,\n visitedPercentage,\n visitedCount,\n totalPages,\n currentPage,\n markPageVisited,\n isPageVisited,\n getPageStatus,\n }),\n [\n visitedPages,\n visitedPagesArray,\n progress,\n visitedPercentage,\n visitedCount,\n totalPages,\n currentPage,\n markPageVisited,\n isPageVisited,\n getPageStatus,\n ]\n );\n}\n","export {\n PDFViewerProvider,\n PDFViewerContext,\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n type PDFViewerProviderProps,\n type PDFViewerContextValue,\n} from './PDFViewerContext';\n\nexport { usePDFViewer } from './usePDFViewer';\nexport { usePageNavigation, type UsePageNavigationOptions } from './usePageNavigation';\nexport { useZoom, type UseZoomOptions } from './useZoom';\nexport { useTextSelection, type UseTextSelectionOptions } from './useTextSelection';\nexport { useHighlights, type UseHighlightsOptions, type UseHighlightsReturn } from './useHighlights';\nexport { useAnnotations, type UseAnnotationsOptions, type UseAnnotationsReturn } from './useAnnotations';\nexport { useTouchGestures, useIsTouchDevice, useIsMobile, type UseTouchGesturesOptions } from './useTouchGestures';\nexport { usePlugins, type UsePluginsOptions, type UsePluginsReturn } from './usePlugins';\n\n// Student Learning Feature Hooks\nexport { useAgentContext, type UseAgentContextOptions, type UseAgentContextReturn } from './useAgentContext';\nexport { useAskAbout, type UseAskAboutOptions, type UseAskAboutReturn } from './useAskAbout';\nexport { useBookmarks, type UseBookmarksOptions, type UseBookmarksReturn } from './useBookmarks';\nexport { useQuickNotes, type UseQuickNotesOptions, type UseQuickNotesReturn } from './useQuickNotes';\nexport { useStudentProgress, type UseStudentProgressOptions, type UseStudentProgressReturn } from './useStudentProgress';\n","import { memo, useCallback, useState } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface ToolbarProps {\n className?: string;\n showNavigation?: boolean;\n showZoom?: boolean;\n showRotation?: boolean;\n showTheme?: boolean;\n showSidebar?: boolean;\n showFullscreen?: boolean;\n}\n\nexport const Toolbar = memo(function Toolbar({\n className,\n showNavigation = true,\n showZoom = true,\n showRotation = true,\n showTheme = true,\n showSidebar = true,\n showFullscreen = true,\n}: ToolbarProps) {\n const {\n currentPage,\n numPages,\n scale,\n theme,\n sidebarOpen,\n goToPage,\n previousPage,\n nextPage,\n zoomIn,\n zoomOut,\n setScale,\n rotateClockwise,\n setTheme,\n toggleSidebar,\n setFullscreen,\n } = usePDFViewer();\n\n const [pageInput, setPageInput] = useState(String(currentPage));\n\n const handlePageInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPageInput(e.target.value);\n },\n []\n );\n\n const handlePageInputBlur = useCallback(() => {\n const page = parseInt(pageInput, 10);\n if (!isNaN(page) && page >= 1 && page <= numPages) {\n goToPage(page);\n } else {\n setPageInput(String(currentPage));\n }\n }, [pageInput, numPages, goToPage, currentPage]);\n\n const handlePageInputKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handlePageInputBlur();\n }\n },\n [handlePageInputBlur]\n );\n\n const handleZoomChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n if (value === 'fit-width') {\n setScale(1);\n } else if (value === 'fit-page') {\n setScale(1);\n } else {\n setScale(parseFloat(value));\n }\n },\n [setScale]\n );\n\n const zoomOptions = [\n { value: '0.5', label: '50%' },\n { value: '0.75', label: '75%' },\n { value: '1', label: '100%' },\n { value: '1.25', label: '125%' },\n { value: '1.5', label: '150%' },\n { value: '2', label: '200%' },\n { value: '3', label: '300%' },\n ];\n\n // Update page input when currentPage changes\n if (pageInput !== String(currentPage) && document.activeElement?.tagName !== 'INPUT') {\n setPageInput(String(currentPage));\n }\n\n return (\n <div\n className={cn(\n 'pdf-toolbar',\n 'flex items-center justify-between',\n 'px-4 py-2',\n 'bg-white border-b border-gray-200',\n 'dark:bg-gray-800 dark:border-gray-700',\n className\n )}\n >\n {/* Left section */}\n <div className=\"flex items-center gap-2\">\n {showSidebar && (\n <button\n onClick={toggleSidebar}\n className={cn(\n 'p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700',\n sidebarOpen && 'bg-gray-100 dark:bg-gray-700'\n )}\n title=\"Toggle Sidebar\"\n aria-label=\"Toggle Sidebar\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h7\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* Center section - Navigation */}\n <div className=\"flex items-center gap-4\">\n {showNavigation && (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={previousPage}\n disabled={currentPage <= 1}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Previous Page\"\n aria-label=\"Previous Page\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-1 text-sm\">\n <input\n type=\"text\"\n value={pageInput}\n onChange={handlePageInputChange}\n onBlur={handlePageInputBlur}\n onKeyDown={handlePageInputKeyDown}\n className=\"w-12 px-2 py-1 text-center border rounded dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Current Page\"\n />\n <span className=\"text-gray-500\">/ {numPages}</span>\n </div>\n\n <button\n onClick={nextPage}\n disabled={currentPage >= numPages}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Next Page\"\n aria-label=\"Next Page\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {showZoom && (\n <div className=\"flex items-center gap-2 border-l pl-4 border-gray-200 dark:border-gray-700\">\n <button\n onClick={zoomOut}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Zoom Out\"\n aria-label=\"Zoom Out\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\"\n />\n </svg>\n </button>\n\n <select\n value={scale.toString()}\n onChange={handleZoomChange}\n className=\"px-2 py-1 border rounded text-sm dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Zoom Level\"\n >\n {zoomOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <button\n onClick={zoomIn}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Zoom In\"\n aria-label=\"Zoom In\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v6m3-3H7\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Right section */}\n <div className=\"flex items-center gap-2\">\n {showRotation && (\n <button\n onClick={rotateClockwise}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Rotate Clockwise\"\n aria-label=\"Rotate Clockwise\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n </button>\n )}\n\n {showTheme && (\n <select\n value={theme}\n onChange={(e) => setTheme(e.target.value as 'light' | 'dark' | 'sepia')}\n className=\"px-2 py-1 border rounded text-sm dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Theme\"\n >\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n <option value=\"sepia\">Sepia</option>\n </select>\n )}\n\n {showFullscreen && (\n <button\n onClick={() => setFullscreen(true)}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Fullscreen\"\n aria-label=\"Fullscreen\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useState, useCallback } from 'react';\nimport { cn } from '../../utils';\n\nexport interface MobileToolbarProps {\n // Navigation\n currentPage: number;\n totalPages: number;\n onPreviousPage: () => void;\n onNextPage: () => void;\n onGoToPage: (page: number) => void;\n\n // Zoom\n scale: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n\n // Sidebar\n onToggleSidebar: () => void;\n sidebarOpen: boolean;\n\n // Theme\n theme: 'light' | 'dark' | 'sepia';\n onThemeChange: (theme: 'light' | 'dark' | 'sepia') => void;\n\n // Position\n position?: 'top' | 'bottom';\n\n className?: string;\n}\n\nexport const MobileToolbar = memo(function MobileToolbar({\n currentPage,\n totalPages,\n onPreviousPage,\n onNextPage,\n onGoToPage,\n scale,\n onZoomIn,\n onZoomOut,\n onToggleSidebar,\n sidebarOpen,\n theme,\n onThemeChange,\n position = 'bottom',\n className,\n}: MobileToolbarProps) {\n const [showMoreMenu, setShowMoreMenu] = useState(false);\n const [showPageInput, setShowPageInput] = useState(false);\n const [pageInputValue, setPageInputValue] = useState(String(currentPage));\n\n const handlePageSubmit = useCallback(() => {\n const page = parseInt(pageInputValue, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onGoToPage(page);\n }\n setShowPageInput(false);\n }, [pageInputValue, totalPages, onGoToPage]);\n\n const toggleMoreMenu = useCallback(() => {\n setShowMoreMenu((prev) => !prev);\n }, []);\n\n const buttonClasses = cn(\n 'min-w-[44px] min-h-[44px]',\n 'flex items-center justify-center',\n 'rounded-lg transition-colors',\n 'text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'active:bg-gray-200 dark:active:bg-gray-600',\n 'disabled:opacity-40 disabled:pointer-events-none'\n );\n\n return (\n <div\n className={cn(\n 'mobile-toolbar',\n 'fixed left-0 right-0 z-50',\n 'bg-white dark:bg-gray-800',\n 'border-gray-200 dark:border-gray-700',\n 'px-2 py-1 safe-area-inset',\n position === 'top' && 'top-0 border-b',\n position === 'bottom' && 'bottom-0 border-t',\n className\n )}\n >\n <div className=\"flex items-center justify-between gap-1\">\n {/* Sidebar toggle */}\n <button\n className={cn(buttonClasses, sidebarOpen && 'bg-blue-100 dark:bg-blue-900')}\n onClick={onToggleSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n\n {/* Navigation group */}\n <div className=\"flex items-center\">\n <button\n className={buttonClasses}\n onClick={onPreviousPage}\n disabled={currentPage <= 1}\n aria-label=\"Previous page\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n {/* Page indicator */}\n {showPageInput ? (\n <input\n type=\"number\"\n className={cn(\n 'w-16 h-10 text-center text-sm',\n 'bg-gray-100 dark:bg-gray-700',\n 'border border-gray-300 dark:border-gray-600',\n 'rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n value={pageInputValue}\n onChange={(e) => setPageInputValue(e.target.value)}\n onBlur={handlePageSubmit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handlePageSubmit();\n if (e.key === 'Escape') setShowPageInput(false);\n }}\n min={1}\n max={totalPages}\n autoFocus\n />\n ) : (\n <button\n className={cn(\n 'min-w-[60px] h-10 px-2',\n 'text-sm font-medium',\n 'text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n setPageInputValue(String(currentPage));\n setShowPageInput(true);\n }}\n >\n {currentPage} / {totalPages}\n </button>\n )}\n\n <button\n className={buttonClasses}\n onClick={onNextPage}\n disabled={currentPage >= totalPages}\n aria-label=\"Next page\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Zoom group */}\n <div className=\"flex items-center\">\n <button\n className={buttonClasses}\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n </button>\n\n <span className=\"text-xs text-gray-500 dark:text-gray-400 min-w-[40px] text-center\">\n {Math.round(scale * 100)}%\n </span>\n\n <button\n className={buttonClasses}\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n\n {/* More menu */}\n <div className=\"relative\">\n <button\n className={cn(buttonClasses, showMoreMenu && 'bg-gray-100 dark:bg-gray-700')}\n onClick={toggleMoreMenu}\n aria-label=\"More options\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n\n {/* More menu dropdown */}\n {showMoreMenu && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setShowMoreMenu(false)}\n />\n <div\n className={cn(\n 'absolute right-0 z-50',\n 'w-48 p-2',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n position === 'bottom' ? 'bottom-full mb-2' : 'top-full mt-2'\n )}\n >\n {/* Theme options */}\n <div className=\"px-2 py-1 text-xs text-gray-500 dark:text-gray-400 font-medium\">\n Theme\n </div>\n {(['light', 'dark', 'sepia'] as const).map((t) => (\n <button\n key={t}\n className={cn(\n 'w-full px-3 py-2 text-left text-sm rounded-lg',\n 'flex items-center gap-2',\n theme === t\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n onThemeChange(t);\n setShowMoreMenu(false);\n }}\n >\n <span className=\"capitalize\">{t}</span>\n {theme === t && (\n <svg className=\"w-4 h-4 ml-auto\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n});\n","export { Toolbar, type ToolbarProps } from './Toolbar';\nexport { MobileToolbar, type MobileToolbarProps } from './MobileToolbar';\n","import { useEffect, useRef, useState, memo, useCallback } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface ThumbnailPanelProps {\n className?: string;\n thumbnailScale?: number;\n}\n\ninterface ThumbnailProps {\n document: PDFDocumentProxy;\n pageNumber: number;\n isActive: boolean;\n onClick: () => void;\n scale: number;\n}\n\nconst Thumbnail = memo(function Thumbnail({\n document,\n pageNumber,\n isActive,\n onClick,\n scale,\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isRendered, setIsRendered] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n\n const renderThumbnail = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n try {\n const page = await document.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale });\n const context = canvas.getContext('2d');\n\n if (!context) return;\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n await page.render({\n canvasContext: context,\n viewport,\n }).promise;\n\n if (!cancelled) {\n setIsRendered(true);\n }\n } catch (error) {\n if (!cancelled) {\n console.error(`Error rendering thumbnail for page ${pageNumber}:`, error);\n }\n }\n };\n\n renderThumbnail();\n\n return () => {\n cancelled = true;\n };\n }, [document, pageNumber, scale]);\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'thumbnail-item',\n 'flex flex-col items-center p-2 rounded',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n isActive && 'bg-blue-50 dark:bg-blue-900/30 ring-2 ring-blue-500'\n )}\n >\n <div\n className={cn(\n 'relative bg-white shadow-md',\n !isRendered && 'animate-pulse bg-gray-200'\n )}\n >\n <canvas ref={canvasRef} className=\"block\" />\n </div>\n <span className=\"mt-1 text-xs text-gray-600 dark:text-gray-400\">\n {pageNumber}\n </span>\n </button>\n );\n});\n\nexport const ThumbnailPanel = memo(function ThumbnailPanel({\n className,\n thumbnailScale = 0.2,\n}: ThumbnailPanelProps) {\n const { document, currentPage, numPages, goToPage } = usePDFViewer();\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Scroll to active thumbnail when page changes\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const activeThumb = container.querySelector(`[data-page=\"${currentPage}\"]`);\n if (activeThumb) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, [currentPage]);\n\n const handleThumbnailClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n },\n [goToPage]\n );\n\n if (!document) {\n return (\n <div className={cn('thumbnail-panel p-4', className)}>\n <div className=\"text-sm text-gray-500\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'thumbnail-panel',\n 'overflow-y-auto p-2',\n 'grid grid-cols-1 gap-2',\n className\n )}\n >\n {Array.from({ length: numPages }, (_, i) => i + 1).map((pageNumber) => (\n <div key={pageNumber} data-page={pageNumber}>\n <Thumbnail\n document={document}\n pageNumber={pageNumber}\n isActive={pageNumber === currentPage}\n onClick={() => handleThumbnailClick(pageNumber)}\n scale={thumbnailScale}\n />\n </div>\n ))}\n </div>\n );\n});\n","import { memo, useCallback, useState, useEffect, useRef } from 'react';\nimport { usePDFViewer, useSearchStore, usePDFViewerStores } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface SearchPanelProps {\n className?: string;\n}\n\nexport const SearchPanel = memo(function SearchPanel({ className }: SearchPanelProps) {\n const { searchStore } = usePDFViewerStores();\n const {\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n goToPage,\n } = usePDFViewer();\n\n const caseSensitive = useSearchStore((s) => s.caseSensitive);\n const wholeWord = useSearchStore((s) => s.wholeWord);\n const toggleCaseSensitive = useSearchStore((s) => s.toggleCaseSensitive);\n const toggleWholeWord = useSearchStore((s) => s.toggleWholeWord);\n\n const [inputValue, setInputValue] = useState(searchQuery);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus input on mount\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleSearch = useCallback(() => {\n if (inputValue.trim()) {\n search(inputValue.trim());\n }\n }, [inputValue, search]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n if (e.shiftKey) {\n previousSearchResult();\n } else if (searchResults.length > 0) {\n nextSearchResult();\n } else {\n handleSearch();\n }\n } else if (e.key === 'Escape') {\n clearSearch();\n setInputValue('');\n }\n },\n [handleSearch, searchResults, nextSearchResult, previousSearchResult, clearSearch]\n );\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n }, []);\n\n const handleClear = useCallback(() => {\n clearSearch();\n setInputValue('');\n inputRef.current?.focus();\n }, [clearSearch]);\n\n const handleResultClick = useCallback(\n (pageNumber: number, resultIndex: number) => {\n goToPage(pageNumber);\n // Navigate to specific result\n searchStore.getState().goToResult(resultIndex);\n },\n [goToPage, searchStore]\n );\n\n return (\n <div className={cn('search-panel', 'flex flex-col h-full', className)}>\n {/* Search input */}\n <div className=\"p-3 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search in document...\"\n className={cn(\n 'w-full px-3 py-2 pr-8',\n 'border rounded-md',\n 'text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'dark:bg-gray-700 dark:border-gray-600 dark:text-white'\n )}\n />\n {inputValue && (\n <button\n onClick={handleClear}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\"\n aria-label=\"Clear search\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* Search options */}\n <div className=\"flex items-center gap-4 mt-2\">\n <label className=\"flex items-center gap-1 text-xs text-gray-600 dark:text-gray-400 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={caseSensitive}\n onChange={toggleCaseSensitive}\n className=\"rounded\"\n />\n Match case\n </label>\n <label className=\"flex items-center gap-1 text-xs text-gray-600 dark:text-gray-400 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={wholeWord}\n onChange={toggleWholeWord}\n className=\"rounded\"\n />\n Whole word\n </label>\n </div>\n\n {/* Results navigation */}\n {searchResults.length > 0 && (\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n {currentSearchResult + 1} of {searchResults.length} results\n </span>\n <div className=\"flex gap-1\">\n <button\n onClick={previousSearchResult}\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Previous result\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </button>\n <button\n onClick={nextSearchResult}\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Next result\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {isSearching && (\n <div className=\"mt-2 text-xs text-gray-500\">Searching...</div>\n )}\n </div>\n\n {/* Results list */}\n <div className=\"flex-1 overflow-y-auto\">\n {searchResults.length === 0 && searchQuery && !isSearching && (\n <div className=\"p-4 text-sm text-gray-500 text-center\">\n No results found for \"{searchQuery}\"\n </div>\n )}\n\n {searchResults.length > 0 && (\n <ul className=\"divide-y divide-gray-100 dark:divide-gray-700\">\n {searchResults.map((result, index) => (\n <li key={`${result.pageNumber}-${result.matchIndex}`}>\n <button\n onClick={() => handleResultClick(result.pageNumber, index)}\n className={cn(\n 'w-full px-3 py-2 text-left',\n 'hover:bg-gray-50 dark:hover:bg-gray-700',\n 'focus:outline-none focus:bg-gray-50 dark:focus:bg-gray-700',\n index === currentSearchResult && 'bg-blue-50 dark:bg-blue-900/30'\n )}\n >\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n Page {result.pageNumber}\n </div>\n <div className=\"text-sm truncate\">{result.text}</div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useEffect, useState } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\nimport type { OutlineItem } from '../../types';\n\nexport interface OutlinePanelProps {\n className?: string;\n}\n\ninterface OutlineNodeProps {\n item: OutlineItem;\n level: number;\n onNavigate: (pageNumber: number) => void;\n}\n\nconst OutlineNode = memo(function OutlineNode({\n item,\n level,\n onNavigate,\n}: OutlineNodeProps) {\n const [isExpanded, setIsExpanded] = useState(item.expanded ?? level < 2);\n const hasChildren = item.children && item.children.length > 0;\n\n const handleClick = useCallback(() => {\n if (item.pageNumber > 0) {\n onNavigate(item.pageNumber);\n }\n }, [item.pageNumber, onNavigate]);\n\n const handleToggle = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }, [isExpanded]);\n\n return (\n <div className=\"outline-node\">\n <div\n className={cn(\n 'flex items-center gap-1 py-1.5 px-2 rounded cursor-pointer',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'text-sm text-gray-700 dark:text-gray-300',\n 'transition-colors'\n )}\n style={{ paddingLeft: `${level * 12 + 8}px` }}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleClick();\n }\n }}\n >\n {/* Expand/collapse toggle */}\n {hasChildren ? (\n <button\n onClick={handleToggle}\n className=\"p-0.5 hover:bg-gray-200 dark:hover:bg-gray-600 rounded\"\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg\n className={cn(\n 'w-3 h-3 transition-transform',\n isExpanded && 'rotate-90'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <span className=\"w-4\" /> // Spacer for alignment\n )}\n\n {/* Title */}\n <span className=\"flex-1 truncate\" title={item.title}>\n {item.title}\n </span>\n\n {/* Page number */}\n {item.pageNumber > 0 && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500 ml-2\">\n {item.pageNumber}\n </span>\n )}\n </div>\n\n {/* Children */}\n {hasChildren && isExpanded && (\n <div className=\"outline-children\">\n {item.children.map((child, index) => (\n <OutlineNode\n key={`${child.title}-${index}`}\n item={child}\n level={level + 1}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )}\n </div>\n );\n});\n\nexport const OutlinePanel = memo(function OutlinePanel({\n className,\n}: OutlinePanelProps) {\n const { document, goToPage } = usePDFViewer();\n const [outline, setOutline] = useState<OutlineItem[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Load outline when document changes\n useEffect(() => {\n if (!document) {\n setOutline(null);\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n const loadOutline = async () => {\n try {\n const rawOutline = await document.getOutline();\n\n if (cancelled) return;\n\n if (!rawOutline || rawOutline.length === 0) {\n setOutline([]);\n return;\n }\n\n // Convert PDF.js outline format to our OutlineItem format\n const convertOutlineItem = async (item: {\n title: string;\n dest: string | unknown[] | null;\n items: unknown[];\n }): Promise<OutlineItem> => {\n let pageNumber = 0;\n\n // Try to resolve the destination to a page number\n if (item.dest) {\n try {\n let destRef: unknown;\n if (typeof item.dest === 'string') {\n destRef = await document.getDestination(item.dest);\n } else {\n destRef = item.dest;\n }\n\n if (Array.isArray(destRef) && destRef[0]) {\n const pageIndex = await document.getPageIndex(destRef[0]);\n pageNumber = pageIndex + 1; // Convert to 1-indexed\n }\n } catch {\n // Destination resolution failed, leave pageNumber as 0\n }\n }\n\n const children: OutlineItem[] = [];\n if (item.items && item.items.length > 0) {\n for (const child of item.items) {\n children.push(await convertOutlineItem(child as typeof item));\n }\n }\n\n return {\n title: item.title || 'Untitled',\n pageNumber,\n children,\n };\n };\n\n const convertedOutline: OutlineItem[] = [];\n for (const item of rawOutline) {\n convertedOutline.push(await convertOutlineItem(item));\n }\n\n if (!cancelled) {\n setOutline(convertedOutline);\n }\n } catch (err) {\n if (!cancelled) {\n console.error('Failed to load outline:', err);\n setError('Failed to load document outline');\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadOutline();\n\n return () => {\n cancelled = true;\n };\n }, [document]);\n\n const handleNavigate = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n },\n [goToPage]\n );\n\n if (!document) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No document loaded\n </p>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n Loading outline...\n </span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <p className=\"text-sm text-red-500\">{error}</p>\n </div>\n );\n }\n\n if (!outline || outline.length === 0) {\n return (\n <div className={cn('flex flex-col items-center justify-center p-4 gap-2', className)}>\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400 text-center\">\n This document doesn&apos;t have an outline\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('outline-panel overflow-auto p-2', className)}>\n {outline.map((item, index) => (\n <OutlineNode\n key={`${item.title}-${index}`}\n item={item}\n level={0}\n onNavigate={handleNavigate}\n />\n ))}\n </div>\n );\n});\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useAnnotationStore } from '../../hooks';\nimport { usePDFViewer } from '../../hooks';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\nimport { exportHighlightsAsJSON, exportHighlightsAsMarkdown } from '../../utils/highlight-storage';\n\nexport interface HighlightsPanelProps {\n className?: string;\n /** Callback when a highlight item is clicked */\n onHighlightClick?: (highlight: Highlight) => void;\n}\n\nconst HIGHLIGHT_COLOR_DOT: Record<HighlightColor, string> = {\n yellow: 'bg-yellow-400',\n green: 'bg-green-400',\n blue: 'bg-blue-400',\n pink: 'bg-pink-400',\n orange: 'bg-orange-400',\n};\n\ninterface HighlightItemProps {\n highlight: Highlight;\n isSelected: boolean;\n onClick: () => void;\n onDelete: () => void;\n}\n\nconst HighlightItem = memo(function HighlightItem({\n highlight,\n isSelected,\n onClick,\n onDelete,\n}: HighlightItemProps) {\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n isSelected && 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Color dot */}\n <div\n className={cn(\n 'w-3 h-3 rounded-full mt-1 flex-shrink-0',\n HIGHLIGHT_COLOR_DOT[highlight.color]\n )}\n />\n\n <div className=\"flex-1 min-w-0\">\n {/* Text preview */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200 line-clamp-2\">\n &ldquo;{highlight.text}&rdquo;\n </p>\n\n {/* Comment if exists */}\n {highlight.comment && (\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400 line-clamp-1\">\n {highlight.comment}\n </p>\n )}\n\n {/* Page number and date */}\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n Page {highlight.pageNumber}\n </p>\n </div>\n\n {/* Delete button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded opacity-0 group-hover:opacity-100',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'transition-opacity duration-150',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete highlight\"\n aria-label=\"Delete highlight\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n highlights: Highlight[];\n selectedId: string | null;\n onHighlightClick: (highlight: Highlight) => void;\n onDeleteHighlight: (id: string) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n highlights,\n selectedId,\n onHighlightClick,\n onDeleteHighlight,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {highlights.map((highlight) => (\n <HighlightItem\n key={highlight.id}\n highlight={highlight}\n isSelected={highlight.id === selectedId}\n onClick={() => onHighlightClick(highlight)}\n onDelete={() => onDeleteHighlight(highlight.id)}\n />\n ))}\n </div>\n </div>\n );\n});\n\ntype ExportFormat = 'json' | 'markdown';\n\nexport const HighlightsPanel = memo(function HighlightsPanel({\n className,\n onHighlightClick,\n}: HighlightsPanelProps) {\n const highlights = useAnnotationStore((s) => s.highlights);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const removeHighlight = useAnnotationStore((s) => s.removeHighlight);\n const selectHighlight = useAnnotationStore((s) => s.selectHighlight);\n const { goToPage } = usePDFViewer();\n const [showExportMenu, setShowExportMenu] = useState(false);\n\n // Group highlights by page\n const groupedHighlights = useMemo(() => {\n const groups = new Map<number, Highlight[]>();\n\n // Sort highlights by page number, then by position (y coordinate)\n const sorted = [...highlights].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n const aY = a.rects[0]?.y ?? 0;\n const bY = b.rects[0]?.y ?? 0;\n return aY - bY;\n });\n\n sorted.forEach((highlight) => {\n const page = highlight.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(highlight);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [highlights]);\n\n const handleHighlightClick = useCallback(\n (highlight: Highlight) => {\n selectHighlight(highlight.id);\n goToPage(highlight.pageNumber);\n onHighlightClick?.(highlight);\n },\n [selectHighlight, goToPage, onHighlightClick]\n );\n\n const handleDeleteHighlight = useCallback(\n (id: string) => {\n removeHighlight(id);\n },\n [removeHighlight]\n );\n\n const handleExport = useCallback(\n (format: ExportFormat) => {\n let content: string;\n let filename: string;\n let mimeType: string;\n\n if (format === 'json') {\n content = exportHighlightsAsJSON(highlights);\n filename = 'highlights.json';\n mimeType = 'application/json';\n } else {\n content = exportHighlightsAsMarkdown(highlights);\n filename = 'highlights.md';\n mimeType = 'text/markdown';\n }\n\n // Create download link\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setShowExportMenu(false);\n },\n [highlights]\n );\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200\">\n Highlights ({highlights.length})\n </h2>\n\n {/* Export button */}\n {highlights.length > 0 && (\n <div className=\"relative\">\n <button\n onClick={() => setShowExportMenu(!showExportMenu)}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n title=\"Export highlights\"\n aria-label=\"Export highlights\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n </button>\n\n {/* Export dropdown menu */}\n {showExportMenu && (\n <div\n className={cn(\n 'absolute right-0 mt-1 py-1 w-40',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'z-10'\n )}\n >\n <button\n onClick={() => handleExport('json')}\n className={cn(\n 'w-full px-4 py-2 text-left text-sm',\n 'text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n >\n Export as JSON\n </button>\n <button\n onClick={() => handleExport('markdown')}\n className={cn(\n 'w-full px-4 py-2 text-left text-sm',\n 'text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n >\n Export as Markdown\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Highlight list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {highlights.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No highlights yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n Select text in the PDF and click a color to create a highlight\n </p>\n </div>\n ) : (\n groupedHighlights.map(([pageNumber, pageHighlights]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n highlights={pageHighlights}\n selectedId={selectedHighlightId}\n onHighlightClick={handleHighlightClick}\n onDeleteHighlight={handleDeleteHighlight}\n />\n ))\n )}\n </div>\n </div>\n );\n});\n\nexport default HighlightsPanel;\n","import { memo } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { ThumbnailPanel } from './ThumbnailPanel';\nimport { SearchPanel } from './SearchPanel';\nimport { OutlinePanel } from './OutlinePanel';\nimport { HighlightsPanel } from './HighlightsPanel';\nimport { cn } from '../../utils';\nimport type { SidebarPanel as SidebarPanelType } from '../../types';\n\nexport interface SidebarProps {\n className?: string;\n width?: number;\n}\n\ninterface SidebarTabProps {\n id: SidebarPanelType;\n icon: React.ReactNode;\n title: string;\n isActive: boolean;\n onClick: () => void;\n}\n\nconst SidebarTab = memo(function SidebarTab({\n icon,\n title,\n isActive,\n onClick,\n}: SidebarTabProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'p-3 flex items-center justify-center',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500',\n isActive && 'bg-gray-100 dark:bg-gray-700 border-l-2 border-blue-500'\n )}\n title={title}\n aria-label={title}\n aria-selected={isActive}\n role=\"tab\"\n >\n {icon}\n </button>\n );\n});\n\nexport const Sidebar = memo(function Sidebar({\n className,\n width = 280,\n}: SidebarProps) {\n const { sidebarOpen, sidebarPanel, setSidebarPanel } = usePDFViewer();\n\n if (!sidebarOpen) {\n return null;\n }\n\n const tabs: Array<{\n id: SidebarPanelType;\n icon: React.ReactNode;\n title: string;\n }> = [\n {\n id: 'thumbnails',\n title: 'Thumbnails',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\"\n />\n </svg>\n ),\n },\n {\n id: 'search',\n title: 'Search',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n ),\n },\n {\n id: 'outline',\n title: 'Outline',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n ),\n },\n {\n id: 'annotations',\n title: 'Annotations',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n ),\n },\n ];\n\n const renderPanel = () => {\n switch (sidebarPanel) {\n case 'thumbnails':\n return <ThumbnailPanel className=\"flex-1\" />;\n case 'search':\n return <SearchPanel className=\"flex-1\" />;\n case 'outline':\n return <OutlinePanel className=\"flex-1\" />;\n case 'annotations':\n return <HighlightsPanel className=\"flex-1\" />;\n default:\n return null;\n }\n };\n\n return (\n <div\n className={cn(\n 'pdf-sidebar',\n 'flex h-full',\n 'bg-white dark:bg-gray-800',\n 'border-r border-gray-200 dark:border-gray-700',\n className\n )}\n style={{ width }}\n >\n {/* Tab bar */}\n <div\n className={cn(\n 'flex flex-col',\n 'border-r border-gray-200 dark:border-gray-700',\n 'bg-gray-50 dark:bg-gray-900'\n )}\n role=\"tablist\"\n aria-orientation=\"vertical\"\n >\n {tabs.map((tab) => (\n <SidebarTab\n key={tab.id}\n id={tab.id}\n icon={tab.icon}\n title={tab.title}\n isActive={sidebarPanel === tab.id}\n onClick={() => setSidebarPanel(tab.id)}\n />\n ))}\n </div>\n\n {/* Panel content */}\n <div className=\"flex-1 flex flex-col overflow-hidden\">{renderPanel()}</div>\n </div>\n );\n});\n","import { memo, useCallback, useRef, useEffect, useState } from 'react';\nimport { cn } from '../../utils';\nimport type { SidebarPanel } from '../../types';\n\nexport interface MobileSidebarProps {\n isOpen: boolean;\n onClose: () => void;\n activePanel: SidebarPanel;\n onPanelChange: (panel: SidebarPanel) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst SWIPE_THRESHOLD = 50;\n\nexport const MobileSidebar = memo(function MobileSidebar({\n isOpen,\n onClose,\n activePanel,\n onPanelChange,\n children,\n className,\n}: MobileSidebarProps) {\n const sidebarRef = useRef<HTMLDivElement>(null);\n const startXRef = useRef(0);\n const [translateX, setTranslateX] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n\n // Handle touch start\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n startXRef.current = e.touches[0].clientX;\n setIsDragging(true);\n }, []);\n\n // Handle touch move\n const handleTouchMove = useCallback((e: React.TouchEvent) => {\n if (!isDragging) return;\n\n const currentX = e.touches[0].clientX;\n const diff = currentX - startXRef.current;\n\n // Only allow dragging to the left (to close)\n if (diff < 0) {\n setTranslateX(diff);\n }\n }, [isDragging]);\n\n // Handle touch end\n const handleTouchEnd = useCallback(() => {\n setIsDragging(false);\n\n // If dragged past threshold, close the sidebar\n if (translateX < -SWIPE_THRESHOLD) {\n onClose();\n }\n\n setTranslateX(0);\n }, [translateX, onClose]);\n\n // Close on escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n // Prevent body scroll when open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n const panels: { id: SidebarPanel; label: string; icon: React.ReactNode }[] = [\n {\n id: 'thumbnails',\n label: 'Pages',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n ),\n },\n {\n id: 'search',\n label: 'Search',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n ),\n },\n {\n id: 'outline',\n label: 'Outline',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n ),\n },\n {\n id: 'annotations',\n label: 'Notes',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>\n ),\n },\n ];\n\n return (\n <>\n {/* Backdrop */}\n <div\n className={cn(\n 'fixed inset-0 z-40 bg-black/50 transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sidebar drawer */}\n <div\n ref={sidebarRef}\n className={cn(\n 'mobile-sidebar',\n 'fixed inset-y-0 left-0 z-50',\n 'w-[85vw] max-w-[320px]',\n 'bg-white dark:bg-gray-800',\n 'shadow-2xl',\n 'transform transition-transform duration-300 ease-out',\n isOpen ? 'translate-x-0' : '-translate-x-full',\n className\n )}\n style={{\n transform: isOpen\n ? `translateX(${translateX}px)`\n : 'translateX(-100%)',\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">\n {panels.find((p) => p.id === activePanel)?.label || 'Menu'}\n </h2>\n <button\n className={cn(\n 'p-2 -mr-2 rounded-lg',\n 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'min-w-[44px] min-h-[44px] flex items-center justify-center'\n )}\n onClick={onClose}\n aria-label=\"Close sidebar\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Panel tabs */}\n <div className=\"flex border-b border-gray-200 dark:border-gray-700\">\n {panels.map((panel) => (\n <button\n key={panel.id}\n className={cn(\n 'flex-1 py-3 flex flex-col items-center gap-1',\n 'text-xs font-medium transition-colors',\n 'min-h-[60px]',\n activePanel === panel.id\n ? 'text-blue-600 dark:text-blue-400 border-b-2 border-blue-600 dark:border-blue-400 -mb-[2px]'\n : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'\n )}\n onClick={() => onPanelChange(panel.id)}\n >\n {panel.icon}\n <span>{panel.label}</span>\n </button>\n ))}\n </div>\n\n {/* Panel content */}\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {/* Swipe indicator */}\n <div className=\"absolute top-1/2 -translate-y-1/2 right-0 w-1 h-16 bg-gray-300 dark:bg-gray-600 rounded-l-full opacity-50\" />\n </div>\n </>\n );\n});\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport type { Bookmark } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface BookmarksPanelProps {\n className?: string;\n /** Callback when a bookmark item is clicked */\n onBookmarkClick?: (bookmark: Bookmark) => void;\n}\n\ninterface BookmarkItemProps {\n bookmark: Bookmark;\n isSelected: boolean;\n onClick: () => void;\n onDelete: () => void;\n onEdit: () => void;\n}\n\nconst BookmarkItem = memo(function BookmarkItem({\n bookmark,\n isSelected,\n onClick,\n onDelete,\n onEdit,\n}: BookmarkItemProps) {\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n isSelected && 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Bookmark icon */}\n <div className=\"mt-0.5 flex-shrink-0\">\n <svg\n className=\"w-4 h-4 text-blue-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" />\n </svg>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {/* Label or page number */}\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-200\">\n {bookmark.label || `Page ${bookmark.pageNumber}`}\n </p>\n\n {/* User note if exists */}\n {bookmark.userNote && (\n <p className=\"mt-1 text-xs text-gray-600 dark:text-gray-300 line-clamp-2\">\n {bookmark.userNote}\n </p>\n )}\n\n {/* Agent context if exists */}\n {bookmark.agentContext && (\n <p className=\"mt-1 text-xs text-blue-500 dark:text-blue-400 line-clamp-1 italic\">\n AI: &ldquo;{bookmark.agentContext}&rdquo;\n </p>\n )}\n\n {/* Timestamp */}\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n {bookmark.timestamp.toLocaleDateString()} at{' '}\n {bookmark.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n className={cn(\n 'p-1 rounded',\n 'text-gray-400 hover:text-blue-500',\n 'hover:bg-blue-50 dark:hover:bg-blue-900/20',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Edit bookmark\"\n aria-label=\"Edit bookmark\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete bookmark\"\n aria-label=\"Delete bookmark\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n bookmarks: Bookmark[];\n currentPage: number;\n onBookmarkClick: (bookmark: Bookmark) => void;\n onDeleteBookmark: (id: string) => void;\n onEditBookmark: (bookmark: Bookmark) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n bookmarks,\n currentPage,\n onBookmarkClick,\n onDeleteBookmark,\n onEditBookmark,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {bookmarks.map((bookmark) => (\n <BookmarkItem\n key={bookmark.id}\n bookmark={bookmark}\n isSelected={bookmark.pageNumber === currentPage}\n onClick={() => onBookmarkClick(bookmark)}\n onDelete={() => onDeleteBookmark(bookmark.id)}\n onEdit={() => onEditBookmark(bookmark)}\n />\n ))}\n </div>\n </div>\n );\n});\n\ninterface EditModalProps {\n bookmark: Bookmark;\n onSave: (updates: { label?: string; userNote?: string }) => void;\n onClose: () => void;\n}\n\nconst EditModal = memo(function EditModal({ bookmark, onSave, onClose }: EditModalProps) {\n const [label, setLabel] = useState(bookmark.label || '');\n const [userNote, setUserNote] = useState(bookmark.userNote || '');\n\n const handleSave = useCallback(() => {\n onSave({ label: label || undefined, userNote: userNote || undefined });\n }, [label, userNote, onSave]);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-md mx-4 p-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n Edit Bookmark\n </h3>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Label\n </label>\n <input\n type=\"text\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder={`Page ${bookmark.pageNumber}`}\n className={cn(\n 'w-full px-3 py-2 rounded-md',\n 'border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-white',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Note\n </label>\n <textarea\n value={userNote}\n onChange={(e) => setUserNote(e.target.value)}\n placeholder=\"Add a note...\"\n rows={3}\n className={cn(\n 'w-full px-3 py-2 rounded-md',\n 'border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-white',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'resize-none'\n )}\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={onClose}\n className={cn(\n 'px-4 py-2 rounded-md text-sm font-medium',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className={cn(\n 'px-4 py-2 rounded-md text-sm font-medium',\n 'bg-blue-500 text-white',\n 'hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport const BookmarksPanel = memo(function BookmarksPanel({\n className,\n onBookmarkClick,\n}: BookmarksPanelProps) {\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const removeBookmark = useStudentStore((s) => s.removeBookmark);\n const updateBookmark = useStudentStore((s) => s.updateBookmark);\n const currentPage = useViewerStore((s) => s.currentPage);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n const [editingBookmark, setEditingBookmark] = useState<Bookmark | null>(null);\n\n // Group bookmarks by page\n const groupedBookmarks = useMemo(() => {\n const groups = new Map<number, Bookmark[]>();\n\n // Sort bookmarks by page number, then by timestamp\n const sorted = [...bookmarks].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n return a.timestamp.getTime() - b.timestamp.getTime();\n });\n\n sorted.forEach((bookmark) => {\n const page = bookmark.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(bookmark);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [bookmarks]);\n\n const handleBookmarkClick = useCallback(\n (bookmark: Bookmark) => {\n goToPage(bookmark.pageNumber);\n onBookmarkClick?.(bookmark);\n },\n [goToPage, onBookmarkClick]\n );\n\n const handleDeleteBookmark = useCallback(\n (id: string) => {\n removeBookmark(id);\n },\n [removeBookmark]\n );\n\n const handleEditBookmark = useCallback((bookmark: Bookmark) => {\n setEditingBookmark(bookmark);\n }, []);\n\n const handleSaveEdit = useCallback(\n (updates: { label?: string; userNote?: string }) => {\n if (editingBookmark) {\n updateBookmark(editingBookmark.id, updates);\n setEditingBookmark(null);\n }\n },\n [editingBookmark, updateBookmark]\n );\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200\">\n Bookmarks ({bookmarks.length})\n </h2>\n </div>\n\n {/* Bookmark list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {bookmarks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No bookmarks yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n Click the bookmark button in the toolbar to save your place\n </p>\n </div>\n ) : (\n groupedBookmarks.map(([pageNumber, pageBookmarks]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n bookmarks={pageBookmarks}\n currentPage={currentPage}\n onBookmarkClick={handleBookmarkClick}\n onDeleteBookmark={handleDeleteBookmark}\n onEditBookmark={handleEditBookmark}\n />\n ))\n )}\n </div>\n\n {/* Edit modal */}\n {editingBookmark && (\n <EditModal\n bookmark={editingBookmark}\n onSave={handleSaveEdit}\n onClose={() => setEditingBookmark(null)}\n />\n )}\n </div>\n );\n});\n\nexport default BookmarksPanel;\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport type { Takeaway } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface TakeawaysPanelProps {\n className?: string;\n /** Callback when a takeaway item is clicked */\n onTakeawayClick?: (takeaway: Takeaway) => void;\n /** Filter by source */\n sourceFilter?: 'all' | 'agent' | 'user';\n}\n\ninterface TakeawayItemProps {\n takeaway: Takeaway;\n onClick: () => void;\n onDelete: () => void;\n}\n\nconst TakeawayItem = memo(function TakeawayItem({\n takeaway,\n onClick,\n onDelete,\n}: TakeawayItemProps) {\n const isAgent = takeaway.source === 'agent';\n\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Source icon */}\n <div\n className={cn(\n 'mt-0.5 flex-shrink-0 w-5 h-5 rounded-full flex items-center justify-center',\n isAgent ? 'bg-blue-100 dark:bg-blue-900/50' : 'bg-green-100 dark:bg-green-900/50'\n )}\n >\n {isAgent ? (\n <svg className=\"w-3 h-3 text-blue-600 dark:text-blue-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2a2 2 0 012 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 017 7h1a1 1 0 011 1v3a1 1 0 01-1 1h-1v1a2 2 0 01-2 2H5a2 2 0 01-2-2v-1H2a1 1 0 01-1-1v-3a1 1 0 011-1h1a7 7 0 017-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 012-2z\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-green-600 dark:text-green-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {/* Summary text */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200\">\n {takeaway.summary}\n </p>\n\n {/* Metadata */}\n <div className=\"mt-1 flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500\">\n <span>Page {takeaway.pageNumber}</span>\n <span>&middot;</span>\n <span>{isAgent ? 'AI Summary' : 'Your Note'}</span>\n </div>\n </div>\n\n {/* Delete button (only for user takeaways) */}\n {!isAgent && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded opacity-0 group-hover:opacity-100',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'transition-opacity duration-150',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete takeaway\"\n aria-label=\"Delete takeaway\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n takeaways: Takeaway[];\n onTakeawayClick: (takeaway: Takeaway) => void;\n onDeleteTakeaway: (id: string) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n takeaways,\n onTakeawayClick,\n onDeleteTakeaway,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {takeaways.map((takeaway) => (\n <TakeawayItem\n key={takeaway.id}\n takeaway={takeaway}\n onClick={() => onTakeawayClick(takeaway)}\n onDelete={() => onDeleteTakeaway(takeaway.id)}\n />\n ))}\n </div>\n </div>\n );\n});\n\nexport const TakeawaysPanel = memo(function TakeawaysPanel({\n className,\n onTakeawayClick,\n sourceFilter = 'all',\n}: TakeawaysPanelProps) {\n const takeaways = useStudentStore((s) => s.takeaways);\n const removeTakeaway = useStudentStore((s) => s.removeTakeaway);\n const goToPage = useViewerStore((s) => s.goToPage);\n const [activeFilter, setActiveFilter] = useState<'all' | 'agent' | 'user'>(sourceFilter);\n\n // Filter takeaways by source\n const filteredTakeaways = useMemo(() => {\n if (activeFilter === 'all') return takeaways;\n return takeaways.filter((t) => t.source === activeFilter);\n }, [takeaways, activeFilter]);\n\n // Group takeaways by page\n const groupedTakeaways = useMemo(() => {\n const groups = new Map<number, Takeaway[]>();\n\n const sorted = [...filteredTakeaways].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n return a.timestamp.getTime() - b.timestamp.getTime();\n });\n\n sorted.forEach((takeaway) => {\n const page = takeaway.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(takeaway);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [filteredTakeaways]);\n\n const handleTakeawayClick = useCallback(\n (takeaway: Takeaway) => {\n goToPage(takeaway.pageNumber);\n onTakeawayClick?.(takeaway);\n },\n [goToPage, onTakeawayClick]\n );\n\n const handleDeleteTakeaway = useCallback(\n (id: string) => {\n removeTakeaway(id);\n },\n [removeTakeaway]\n );\n\n const agentCount = takeaways.filter((t) => t.source === 'agent').length;\n const userCount = takeaways.filter((t) => t.source === 'user').length;\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2\">\n Key Takeaways ({filteredTakeaways.length})\n </h2>\n\n {/* Filter tabs */}\n <div className=\"flex gap-1\">\n <button\n onClick={() => setActiveFilter('all')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'all'\n ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n All ({takeaways.length})\n </button>\n <button\n onClick={() => setActiveFilter('agent')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'agent'\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n AI ({agentCount})\n </button>\n <button\n onClick={() => setActiveFilter('user')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'user'\n ? 'bg-green-100 dark:bg-green-900/50 text-green-700 dark:text-green-300'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n Mine ({userCount})\n </button>\n </div>\n </div>\n\n {/* Takeaway list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {filteredTakeaways.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No takeaways yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n {activeFilter === 'agent'\n ? 'AI summaries will appear here as you read'\n : activeFilter === 'user'\n ? 'Add your own key points while studying'\n : 'Key points and summaries will appear here'}\n </p>\n </div>\n ) : (\n groupedTakeaways.map(([pageNumber, pageTakeaways]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n takeaways={pageTakeaways}\n onTakeawayClick={handleTakeawayClick}\n onDeleteTakeaway={handleDeleteTakeaway}\n />\n ))\n )}\n </div>\n </div>\n );\n});\n\nexport default TakeawaysPanel;\n","export { Sidebar, type SidebarProps } from './Sidebar';\nexport { MobileSidebar, type MobileSidebarProps } from './MobileSidebar';\nexport { ThumbnailPanel, type ThumbnailPanelProps } from './ThumbnailPanel';\nexport { SearchPanel, type SearchPanelProps } from './SearchPanel';\nexport { OutlinePanel, type OutlinePanelProps } from './OutlinePanel';\nexport { HighlightsPanel, type HighlightsPanelProps } from './HighlightsPanel';\nexport { BookmarksPanel, type BookmarksPanelProps } from './BookmarksPanel';\nexport { TakeawaysPanel, type TakeawaysPanelProps } from './TakeawaysPanel';\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\nimport { useAnnotationStore } from '../../hooks';\nimport type { AnnotationTool, ShapeType } from '../../store/annotation-store';\n\nexport interface AnnotationToolbarProps {\n /** Override the active tool from store */\n activeTool?: AnnotationTool;\n /** Override the active shape type from store */\n activeShapeType?: ShapeType;\n /** Override the drawing color from store */\n drawingColor?: string;\n /** Override the stroke width from store */\n strokeWidth?: number;\n /** Custom tool change handler */\n onToolChange?: (tool: AnnotationTool) => void;\n /** Custom shape type change handler */\n onShapeTypeChange?: (shapeType: ShapeType) => void;\n /** Custom color change handler */\n onColorChange?: (color: string) => void;\n /** Custom stroke width change handler */\n onStrokeWidthChange?: (width: number) => void;\n /** Position of the toolbar */\n position?: 'top' | 'bottom' | 'floating';\n /** Additional class name */\n className?: string;\n}\n\nconst COLORS = [\n '#ef4444', // red\n '#f97316', // orange\n '#eab308', // yellow\n '#22c55e', // green\n '#3b82f6', // blue\n '#8b5cf6', // purple\n '#ec4899', // pink\n '#000000', // black\n];\n\nconst STROKE_WIDTHS = [1, 2, 3, 5, 8];\n\nconst SHAPE_TYPES: { type: ShapeType; icon: React.ReactNode; label: string }[] = [\n {\n type: 'rect',\n label: 'Rectangle',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" strokeWidth={2} />\n </svg>\n ),\n },\n {\n type: 'circle',\n label: 'Circle/Ellipse',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\" strokeWidth={2} />\n </svg>\n ),\n },\n {\n type: 'arrow',\n label: 'Arrow',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n ),\n },\n {\n type: 'line',\n label: 'Line',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 20L20 4\" />\n </svg>\n ),\n },\n];\n\nexport const AnnotationToolbar = memo(function AnnotationToolbar({\n activeTool: activeToolProp,\n activeShapeType: activeShapeTypeProp,\n drawingColor: drawingColorProp,\n strokeWidth: strokeWidthProp,\n onToolChange: onToolChangeProp,\n onShapeTypeChange: onShapeTypeChangeProp,\n onColorChange: onColorChangeProp,\n onStrokeWidthChange: onStrokeWidthChangeProp,\n position = 'top',\n className,\n}: AnnotationToolbarProps) {\n // Get state from store\n const storeActiveTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const storeActiveShapeType = useAnnotationStore((s) => s.activeShapeType);\n const storeDrawingColor = useAnnotationStore((s) => s.drawingColor);\n const storeStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const setActiveAnnotationTool = useAnnotationStore((s) => s.setActiveAnnotationTool);\n const setActiveShapeType = useAnnotationStore((s) => s.setActiveShapeType);\n const setDrawingColor = useAnnotationStore((s) => s.setDrawingColor);\n const setDrawingStrokeWidth = useAnnotationStore((s) => s.setDrawingStrokeWidth);\n\n // Use props if provided, otherwise use store values\n const activeTool = activeToolProp !== undefined ? activeToolProp : storeActiveTool;\n const activeShapeType = activeShapeTypeProp !== undefined ? activeShapeTypeProp : storeActiveShapeType;\n const drawingColor = drawingColorProp !== undefined ? drawingColorProp : storeDrawingColor;\n const strokeWidth = strokeWidthProp !== undefined ? strokeWidthProp : storeStrokeWidth;\n\n // Use custom handlers if provided, otherwise use store actions\n const onToolChange = onToolChangeProp || setActiveAnnotationTool;\n const onShapeTypeChange = onShapeTypeChangeProp || setActiveShapeType;\n const onColorChange = onColorChangeProp || setDrawingColor;\n const onStrokeWidthChange = onStrokeWidthChangeProp || setDrawingStrokeWidth;\n\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showShapePicker, setShowShapePicker] = useState(false);\n const [showStrokeWidth, setShowStrokeWidth] = useState(false);\n const colorPickerRef = useRef<HTMLDivElement>(null);\n const shapePickerRef = useRef<HTMLDivElement>(null);\n const strokePickerRef = useRef<HTMLDivElement>(null);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (colorPickerRef.current && !colorPickerRef.current.contains(target)) {\n setShowColorPicker(false);\n }\n if (shapePickerRef.current && !shapePickerRef.current.contains(target)) {\n setShowShapePicker(false);\n }\n if (strokePickerRef.current && !strokePickerRef.current.contains(target)) {\n setShowStrokeWidth(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleToolClick = useCallback((tool: AnnotationTool) => {\n onToolChange(activeTool === tool ? null : tool);\n }, [activeTool, onToolChange]);\n\n const isActive = activeTool !== null;\n\n return (\n <div\n className={cn(\n 'annotation-toolbar flex items-center gap-1 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700',\n position === 'floating' && 'fixed bottom-20 left-1/2 -translate-x-1/2 z-50',\n position === 'top' && 'sticky top-0 z-40',\n position === 'bottom' && 'sticky bottom-0 z-40',\n !isActive && 'opacity-90',\n className\n )}\n >\n {/* Note tool */}\n <button\n className={cn(\n 'p-2 rounded transition-colors',\n activeTool === 'note'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => handleToolClick('note')}\n title=\"Sticky Note\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>\n </button>\n\n {/* Draw tool */}\n <button\n className={cn(\n 'p-2 rounded transition-colors',\n activeTool === 'draw'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => handleToolClick('draw')}\n title=\"Freehand Draw\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n\n {/* Shape tool with dropdown */}\n <div className=\"relative\" ref={shapePickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors flex items-center gap-1',\n activeTool === 'shape'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n if (activeTool !== 'shape') {\n handleToolClick('shape');\n }\n setShowShapePicker(!showShapePicker);\n }}\n title=\"Shapes\"\n >\n {SHAPE_TYPES.find(s => s.type === activeShapeType)?.icon || SHAPE_TYPES[0].icon}\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {showShapePicker && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"flex gap-1\">\n {SHAPE_TYPES.map((shape) => (\n <button\n key={shape.type}\n className={cn(\n 'p-2 rounded transition-colors',\n activeShapeType === shape.type\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n onShapeTypeChange(shape.type);\n onToolChange('shape');\n setShowShapePicker(false);\n }}\n title={shape.label}\n >\n {shape.icon}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Color picker */}\n <div className=\"relative\" ref={colorPickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors hover:bg-gray-100 dark:hover:bg-gray-700',\n showColorPicker && 'bg-gray-100 dark:bg-gray-700'\n )}\n onClick={() => setShowColorPicker(!showColorPicker)}\n title=\"Color\"\n >\n <div\n className=\"w-5 h-5 rounded border-2 border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: drawingColor }}\n />\n </button>\n\n {showColorPicker && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"grid grid-cols-4 gap-1\">\n {COLORS.map((color) => (\n <button\n key={color}\n className={cn(\n 'w-6 h-6 rounded border-2 transition-transform hover:scale-110',\n drawingColor === color\n ? 'border-blue-500 ring-2 ring-blue-200'\n : 'border-gray-300 dark:border-gray-500'\n )}\n style={{ backgroundColor: color }}\n onClick={() => {\n onColorChange(color);\n setShowColorPicker(false);\n }}\n title={color}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Stroke width */}\n <div className=\"relative\" ref={strokePickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors hover:bg-gray-100 dark:hover:bg-gray-700',\n showStrokeWidth && 'bg-gray-100 dark:bg-gray-700'\n )}\n onClick={() => setShowStrokeWidth(!showStrokeWidth)}\n title=\"Stroke Width\"\n >\n <div className=\"w-5 h-5 flex items-center justify-center\">\n <div\n className=\"rounded-full bg-gray-700 dark:bg-gray-300\"\n style={{ width: Math.min(strokeWidth * 2, 16), height: Math.min(strokeWidth * 2, 16) }}\n />\n </div>\n </button>\n\n {showStrokeWidth && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"flex flex-col gap-1\">\n {STROKE_WIDTHS.map((width) => (\n <button\n key={width}\n className={cn(\n 'flex items-center gap-2 px-3 py-1 rounded transition-colors',\n strokeWidth === width\n ? 'bg-blue-100 dark:bg-blue-900'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n onClick={() => {\n onStrokeWidthChange(width);\n setShowStrokeWidth(false);\n }}\n >\n <div\n className=\"rounded-full bg-gray-700 dark:bg-gray-300\"\n style={{ width: width * 2, height: width * 2 }}\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">{width}px</span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Clear/Cancel button */}\n {activeTool && (\n <button\n className=\"p-2 rounded transition-colors hover:bg-red-100 dark:hover:bg-red-900/30 text-red-600 dark:text-red-400\"\n onClick={() => onToolChange(null)}\n title=\"Exit annotation mode\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n );\n});\n","export { AnnotationToolbar, type AnnotationToolbarProps } from './AnnotationToolbar';\n","import { useEffect, useRef, useCallback, useState, memo } from 'react';\nimport type { PDFPageProxy, RenderTask } from 'pdfjs-dist';\nimport { cn } from '../../utils';\n\nexport interface CanvasLayerProps {\n page: PDFPageProxy;\n scale: number;\n rotation: number;\n className?: string;\n onRenderStart?: () => void;\n onRenderComplete?: () => void;\n onRenderError?: (error: Error) => void;\n /** Priority for rendering (lower = higher priority) - used for render ordering */\n priority?: number;\n}\n\n/**\n * CanvasLayer renders a PDF page at full quality.\n *\n * Optimizations for mobile:\n * - Uses requestAnimationFrame for render timing\n * - Cancels pending renders on unmount/update\n * - Uses 'display' intent for faster rendering\n * - Disables alpha channel for better performance\n */\nexport const CanvasLayer = memo(function CanvasLayer({\n page,\n scale,\n rotation,\n className,\n onRenderStart,\n onRenderComplete,\n onRenderError,\n priority: _priority,\n}: CanvasLayerProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const [isRendering, setIsRendering] = useState(false);\n const mountedRef = useRef(true);\n const rafIdRef = useRef<number | null>(null);\n\n const cancelRender = useCallback(() => {\n // Cancel any pending animation frame\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n // Cancel any ongoing render task\n if (renderTaskRef.current) {\n renderTaskRef.current.cancel();\n renderTaskRef.current = null;\n }\n }, []);\n\n const render = useCallback(async () => {\n const canvas = canvasRef.current;\n if (!canvas || !page) return;\n\n // Cancel any ongoing render\n cancelRender();\n\n const viewport = page.getViewport({ scale, rotation });\n\n // Use 2d context without alpha for better performance\n const context = canvas.getContext('2d', {\n alpha: false,\n // Hint for better performance on mobile\n desynchronized: true,\n });\n\n if (!context) {\n onRenderError?.(new Error('Failed to get canvas context'));\n return;\n }\n\n // Use full device pixel ratio for crisp rendering\n const outputScale = window.devicePixelRatio || 1;\n\n // Set canvas dimensions at full quality\n canvas.width = Math.floor(viewport.width * outputScale);\n canvas.height = Math.floor(viewport.height * outputScale);\n canvas.style.width = `${Math.floor(viewport.width)}px`;\n canvas.style.height = `${Math.floor(viewport.height)}px`;\n\n // Scale for high DPI displays\n context.scale(outputScale, outputScale);\n\n if (mountedRef.current) {\n setIsRendering(true);\n }\n onRenderStart?.();\n\n try {\n renderTaskRef.current = page.render({\n canvasContext: context,\n viewport,\n // 'display' intent is faster than 'print' and sufficient for screen viewing\n intent: 'display',\n });\n\n await renderTaskRef.current.promise;\n\n if (mountedRef.current) {\n setIsRendering(false);\n }\n onRenderComplete?.();\n } catch (error) {\n if ((error as Error).name !== 'RenderingCancelledException') {\n if (mountedRef.current) {\n setIsRendering(false);\n }\n onRenderError?.(error as Error);\n }\n }\n }, [page, scale, rotation, cancelRender, onRenderStart, onRenderComplete, onRenderError]);\n\n // Render when page, scale, or rotation changes\n // Use requestAnimationFrame to avoid blocking the main thread\n useEffect(() => {\n rafIdRef.current = requestAnimationFrame(() => {\n render();\n });\n\n return () => {\n cancelRender();\n };\n }, [render, cancelRender]);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cancelRender();\n };\n }, [cancelRender]);\n\n return (\n <canvas\n ref={canvasRef}\n className={cn(\n 'pdf-canvas-layer',\n 'absolute inset-0',\n isRendering && 'opacity-50',\n className\n )}\n style={{ zIndex: 10 }}\n />\n );\n});\n","import { useEffect, useRef, memo } from 'react';\nimport type { PDFPageProxy } from 'pdfjs-dist';\nimport { cn } from '../../utils';\n\nexport interface TextLayerProps {\n page: PDFPageProxy;\n scale: number;\n rotation: number;\n className?: string;\n}\n\n// Local type for text content to avoid pdfjs-dist version issues\ninterface TextContentItem {\n str?: string;\n dir?: string;\n transform?: number[];\n width?: number;\n height?: number;\n fontName?: string;\n}\n\ninterface LocalTextContent {\n items: TextContentItem[];\n}\n\nfunction isTextItem(item: TextContentItem): item is Required<TextContentItem> {\n return typeof item.str === 'string' && Array.isArray(item.transform);\n}\n\nexport const TextLayer = memo(function TextLayer({\n page,\n scale,\n rotation,\n className,\n}: TextLayerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const pageNumberRef = useRef<number | null>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !page) return;\n\n let cancelled = false;\n\n const renderTextLayer = async () => {\n // Clear existing text\n container.innerHTML = '';\n\n // Check if page number changed - if so, we need fresh text content\n const currentPageNumber = page.pageNumber;\n\n try {\n // Get text content - don't cache as the page object may change\n const textContent = (await page.getTextContent()) as unknown as LocalTextContent;\n\n // Check if cancelled or page changed during async operation\n if (cancelled || pageNumberRef.current !== currentPageNumber) {\n return;\n }\n\n const viewport = page.getViewport({ scale, rotation });\n\n // Set container dimensions\n container.style.width = `${viewport.width}px`;\n container.style.height = `${viewport.height}px`;\n\n // Render each text item\n for (const item of textContent.items) {\n if (cancelled) return;\n if (!isTextItem(item) || !item.str.trim()) continue;\n\n const [scaleX, rotY, rotX, scaleY, tx, ty] = item.transform;\n\n // Calculate position and font size\n const fontSize = Math.sqrt(rotX * rotX + scaleY * scaleY) * scale;\n const angle = Math.atan2(rotY, scaleX) * (180 / Math.PI) + rotation;\n\n // Create text span\n const span = document.createElement('span');\n span.textContent = item.str;\n span.style.cssText = `\n position: absolute;\n left: ${tx * scale}px;\n top: ${viewport.height - ty * scale - fontSize}px;\n font-size: ${fontSize}px;\n font-family: sans-serif;\n transform-origin: 0 0;\n transform: rotate(${angle}deg) scaleX(${(item.width * scale) / (fontSize * item.str.length) || 1});\n white-space: pre;\n color: transparent;\n pointer-events: all;\n user-select: text;\n `;\n\n container.appendChild(span);\n }\n } catch (error) {\n // Silently ignore errors from destroyed pages\n if (!cancelled) {\n // Only log if not a page destruction error\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('sendWithStream') && !errorMessage.includes('destroyed')) {\n console.error('Error rendering text layer:', error);\n }\n }\n }\n };\n\n pageNumberRef.current = page.pageNumber;\n renderTextLayer();\n\n return () => {\n cancelled = true;\n if (container) {\n container.innerHTML = '';\n }\n };\n }, [page, scale, rotation]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'pdf-text-layer',\n 'absolute inset-0 overflow-hidden',\n 'select-text',\n className\n )}\n style={{ zIndex: 20 }}\n />\n );\n});\n","import { memo, useMemo } from 'react';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface HighlightLayerProps {\n highlights: Highlight[];\n scale: number;\n selectedId?: string | null;\n onHighlightClick?: (highlight: Highlight) => void;\n className?: string;\n /** Filter by source type */\n sourceFilter?: 'all' | 'user' | 'agent';\n}\n\n// User highlight colors (warmer tones)\nconst HIGHLIGHT_COLORS: Record<HighlightColor, string> = {\n yellow: 'rgba(254, 240, 138, 0.5)',\n green: 'rgba(134, 239, 172, 0.5)',\n blue: 'rgba(147, 197, 253, 0.5)',\n pink: 'rgba(249, 168, 212, 0.5)',\n orange: 'rgba(253, 186, 116, 0.5)',\n};\n\nconst HIGHLIGHT_COLORS_SELECTED: Record<HighlightColor, string> = {\n yellow: 'rgba(254, 240, 138, 0.8)',\n green: 'rgba(134, 239, 172, 0.8)',\n blue: 'rgba(147, 197, 253, 0.8)',\n pink: 'rgba(249, 168, 212, 0.8)',\n orange: 'rgba(253, 186, 116, 0.8)',\n};\n\n// Agent highlight colors (cooler tones with slight transparency difference)\nconst AGENT_HIGHLIGHT_COLORS: Record<HighlightColor, string> = {\n yellow: 'rgba(250, 204, 21, 0.4)', // amber-400\n green: 'rgba(74, 222, 128, 0.4)', // green-400\n blue: 'rgba(96, 165, 250, 0.45)', // blue-400\n pink: 'rgba(244, 114, 182, 0.4)', // pink-400\n orange: 'rgba(251, 146, 60, 0.4)', // orange-400\n};\n\nconst AGENT_HIGHLIGHT_COLORS_SELECTED: Record<HighlightColor, string> = {\n yellow: 'rgba(250, 204, 21, 0.7)',\n green: 'rgba(74, 222, 128, 0.7)',\n blue: 'rgba(96, 165, 250, 0.75)',\n pink: 'rgba(244, 114, 182, 0.7)',\n orange: 'rgba(251, 146, 60, 0.7)',\n};\n\nexport const HighlightLayer = memo(function HighlightLayer({\n highlights,\n scale,\n selectedId,\n onHighlightClick,\n className,\n sourceFilter = 'all',\n}: HighlightLayerProps) {\n const filteredHighlights = useMemo(() => {\n if (sourceFilter === 'all') return highlights;\n return highlights.filter((h) => {\n const source = h.source ?? 'user';\n return source === sourceFilter;\n });\n }, [highlights, sourceFilter]);\n\n const renderedHighlights = useMemo(() => {\n return filteredHighlights.map((highlight) => {\n const isSelected = highlight.id === selectedId;\n const isAgentHighlight = highlight.source === 'agent';\n\n // Choose color palette based on source\n const colorPalette = isAgentHighlight\n ? (isSelected ? AGENT_HIGHLIGHT_COLORS_SELECTED : AGENT_HIGHLIGHT_COLORS)\n : (isSelected ? HIGHLIGHT_COLORS_SELECTED : HIGHLIGHT_COLORS);\n\n return (\n <div\n key={highlight.id}\n className={cn(\n 'highlight-group',\n 'cursor-pointer',\n isSelected && 'ring-2 ring-blue-500',\n isAgentHighlight && 'highlight-agent'\n )}\n onClick={() => onHighlightClick?.(highlight)}\n data-source={highlight.source ?? 'user'}\n >\n {highlight.rects.map((rect, index) => (\n <div\n key={`${highlight.id}-${index}`}\n className={cn(\n 'absolute transition-colors duration-150',\n isAgentHighlight && 'border-b-2 border-dashed border-blue-400/50'\n )}\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.width * scale,\n height: rect.height * scale,\n backgroundColor: colorPalette[highlight.color],\n mixBlendMode: 'multiply',\n }}\n />\n ))}\n {/* Agent highlight indicator */}\n {isAgentHighlight && highlight.rects[0] && (\n <div\n className=\"absolute -left-1 flex items-center justify-center w-3 h-3 bg-blue-500 rounded-full text-white\"\n style={{\n top: highlight.rects[0].y * scale,\n }}\n title=\"AI highlighted\"\n >\n <svg className=\"w-2 h-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2a2 2 0 012 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 017 7h1a1 1 0 011 1v3a1 1 0 01-1 1h-1v1a2 2 0 01-2 2H5a2 2 0 01-2-2v-1H2a1 1 0 01-1-1v-3a1 1 0 011-1h1a7 7 0 017-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 012-2z\" />\n </svg>\n </div>\n )}\n </div>\n );\n });\n }, [filteredHighlights, scale, selectedId, onHighlightClick]);\n\n return (\n <div\n className={cn(\n 'pdf-highlight-layer',\n 'absolute inset-0 pointer-events-none',\n className\n )}\n style={{ zIndex: 40 }}\n >\n <div className=\"pointer-events-auto\">{renderedHighlights}</div>\n </div>\n );\n});\n","import { memo, useCallback, useRef, MouseEvent, TouchEvent } from 'react';\nimport type { Annotation, DrawingPath } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface AnnotationLayerProps {\n pageNumber: number;\n annotations: Annotation[];\n scale: number;\n selectedId?: string | null;\n isDrawing?: boolean;\n currentDrawingPath?: DrawingPath | null;\n drawingColor?: string;\n drawingStrokeWidth?: number;\n activeAnnotationTool?: 'note' | 'draw' | 'shape' | null;\n onAnnotationClick?: (annotation: Annotation) => void;\n onNoteClick?: (annotation: Annotation, event: { x: number; y: number }) => void;\n onDrawStart?: (point: { x: number; y: number }) => void;\n onDrawMove?: (point: { x: number; y: number }) => void;\n onDrawEnd?: () => void;\n onPageClick?: (point: { x: number; y: number }) => void;\n className?: string;\n}\n\n// Convert points to SVG path data\nfunction pointsToPath(points: { x: number; y: number }[], scale: number): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const p = points[0];\n return `M ${p.x * scale} ${p.y * scale} L ${p.x * scale} ${p.y * scale}`;\n }\n\n const path = points.reduce((acc, point, index) => {\n const scaledX = point.x * scale;\n const scaledY = point.y * scale;\n if (index === 0) {\n return `M ${scaledX} ${scaledY}`;\n }\n return `${acc} L ${scaledX} ${scaledY}`;\n }, '');\n\n return path;\n}\n\n// Render a shape annotation\nfunction renderShape(\n annotation: Annotation & { type: 'shape' },\n scale: number,\n isSelected: boolean\n): React.ReactNode {\n const { shapeType, x, y, width, height, color, strokeWidth, id } = annotation;\n const scaledX = x * scale;\n const scaledY = y * scale;\n const scaledWidth = width * scale;\n const scaledHeight = height * scale;\n const scaledStroke = strokeWidth * scale;\n\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n className: cn(\n 'cursor-pointer transition-opacity',\n isSelected && 'opacity-80'\n ),\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect\n key={id}\n x={scaledX}\n y={scaledY}\n width={scaledWidth}\n height={scaledHeight}\n {...commonProps}\n />\n );\n case 'circle':\n return (\n <ellipse\n key={id}\n cx={scaledX + scaledWidth / 2}\n cy={scaledY + scaledHeight / 2}\n rx={scaledWidth / 2}\n ry={scaledHeight / 2}\n {...commonProps}\n />\n );\n case 'line':\n return (\n <line\n key={id}\n x1={scaledX}\n y1={scaledY}\n x2={scaledX + scaledWidth}\n y2={scaledY + scaledHeight}\n {...commonProps}\n />\n );\n case 'arrow':\n const endX = scaledX + scaledWidth;\n const endY = scaledY + scaledHeight;\n const angle = Math.atan2(scaledHeight, scaledWidth);\n const arrowLength = 10 * scale;\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g key={id}>\n <line\n x1={scaledX}\n y1={scaledY}\n x2={endX}\n y2={endY}\n {...commonProps}\n />\n <line\n x1={endX}\n y1={endY}\n x2={arrow1X}\n y2={arrow1Y}\n {...commonProps}\n />\n <line\n x1={endX}\n y1={endY}\n x2={arrow2X}\n y2={arrow2Y}\n {...commonProps}\n />\n </g>\n );\n default:\n return null;\n }\n}\n\nexport const AnnotationLayer = memo(function AnnotationLayer({\n pageNumber: _pageNumber,\n annotations,\n scale,\n selectedId,\n isDrawing,\n currentDrawingPath,\n drawingColor = '#ef4444',\n drawingStrokeWidth = 2,\n activeAnnotationTool,\n onAnnotationClick,\n onNoteClick,\n onDrawStart,\n onDrawMove,\n onDrawEnd,\n onPageClick,\n className,\n}: AnnotationLayerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isDrawingRef = useRef(false);\n\n // Get relative coordinates from mouse/touch event\n const getRelativePoint = useCallback((clientX: number, clientY: number): { x: number; y: number } | null => {\n if (!containerRef.current) return null;\n const rect = containerRef.current.getBoundingClientRect();\n return {\n x: (clientX - rect.left) / scale,\n y: (clientY - rect.top) / scale,\n };\n }, [scale]);\n\n const handleMouseDown = useCallback((e: MouseEvent) => {\n if (activeAnnotationTool !== 'draw') return;\n\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n isDrawingRef.current = true;\n onDrawStart?.(point);\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawStart]);\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!isDrawingRef.current || activeAnnotationTool !== 'draw') return;\n\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n onDrawMove?.(point);\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawMove]);\n\n const handleMouseUp = useCallback(() => {\n if (isDrawingRef.current) {\n isDrawingRef.current = false;\n onDrawEnd?.();\n }\n }, [onDrawEnd]);\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (activeAnnotationTool !== 'draw') return;\n\n const touch = e.touches[0];\n if (touch) {\n const point = getRelativePoint(touch.clientX, touch.clientY);\n if (point) {\n isDrawingRef.current = true;\n onDrawStart?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawStart]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n if (!isDrawingRef.current || activeAnnotationTool !== 'draw') return;\n\n const touch = e.touches[0];\n if (touch) {\n const point = getRelativePoint(touch.clientX, touch.clientY);\n if (point) {\n e.preventDefault(); // Prevent scrolling while drawing\n onDrawMove?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawMove]);\n\n const handleTouchEnd = useCallback(() => {\n if (isDrawingRef.current) {\n isDrawingRef.current = false;\n onDrawEnd?.();\n }\n }, [onDrawEnd]);\n\n const handleClick = useCallback((e: MouseEvent) => {\n if (activeAnnotationTool === 'note') {\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n onPageClick?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onPageClick]);\n\n // Annotations are already filtered for this page by PDFPage component\n // Separate drawings/shapes from notes\n const drawings = annotations.filter(a => a.type === 'drawing');\n const shapes = annotations.filter(a => a.type === 'shape');\n const notes = annotations.filter(a => a.type === 'note');\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'pdf-annotation-layer',\n 'absolute inset-0',\n activeAnnotationTool && 'cursor-crosshair',\n className\n )}\n style={{ zIndex: 50, pointerEvents: activeAnnotationTool ? 'auto' : 'none' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onClick={handleClick}\n >\n {/* SVG layer for drawings and shapes */}\n <svg\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{ overflow: 'visible' }}\n >\n {/* Render completed drawings */}\n {drawings.map((drawing) => {\n if (drawing.type !== 'drawing') return null;\n const isSelected = drawing.id === selectedId;\n\n return drawing.paths.map((path, pathIndex) => (\n <path\n key={`${drawing.id}-${pathIndex}`}\n d={pointsToPath(path.points, scale)}\n stroke={drawing.color}\n strokeWidth={drawing.strokeWidth * scale}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'cursor-pointer pointer-events-auto',\n isSelected && 'filter drop-shadow-md'\n )}\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(drawing);\n }}\n />\n ));\n })}\n\n {/* Render shapes */}\n {shapes.map((shape) => {\n if (shape.type !== 'shape') return null;\n const isSelected = shape.id === selectedId;\n\n return (\n <g\n key={shape.id}\n className=\"pointer-events-auto\"\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(shape);\n }}\n >\n {renderShape(shape, scale, isSelected)}\n </g>\n );\n })}\n\n {/* Render current drawing path (preview) */}\n {isDrawing && currentDrawingPath && currentDrawingPath.points.length > 0 && (\n <path\n d={pointsToPath(currentDrawingPath.points, scale)}\n stroke={drawingColor}\n strokeWidth={drawingStrokeWidth * scale}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.8}\n />\n )}\n </svg>\n\n {/* Sticky notes */}\n {notes.map((note) => {\n if (note.type !== 'note') return null;\n const isSelected = note.id === selectedId;\n\n return (\n <div\n key={note.id}\n className={cn(\n 'absolute pointer-events-auto cursor-pointer',\n 'w-6 h-6 flex items-center justify-center',\n 'rounded-sm shadow-md transition-transform hover:scale-110',\n isSelected && 'ring-2 ring-blue-500'\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(note);\n onNoteClick?.(note, { x: e.clientX, y: e.clientY });\n }}\n title={note.content}\n >\n <svg\n className=\"w-4 h-4 text-white\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n );\n })}\n </div>\n );\n});\n","import { useEffect, useState, memo, useCallback, useMemo } from 'react';\nimport type { PDFPageProxy } from 'pdfjs-dist';\nimport { CanvasLayer } from './CanvasLayer';\nimport { TextLayer } from './TextLayer';\nimport { HighlightLayer } from './HighlightLayer';\nimport { AnnotationLayer } from './AnnotationLayer';\nimport { useAnnotationStore } from '../../hooks';\nimport type { Highlight, Annotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface PDFPageProps {\n pageNumber: number;\n page: PDFPageProxy | null;\n scale: number;\n rotation: number;\n className?: string;\n showTextLayer?: boolean;\n showHighlightLayer?: boolean;\n showAnnotationLayer?: boolean;\n onPageLoad?: (page: PDFPageProxy) => void;\n onRenderComplete?: () => void;\n onRenderError?: (error: Error) => void;\n onAnnotationClick?: (annotation: Annotation) => void;\n onPageClick?: (pageNumber: number, point: { x: number; y: number }) => void;\n}\n\nexport const PDFPage = memo(function PDFPage({\n pageNumber,\n page,\n scale,\n rotation,\n className,\n showTextLayer = true,\n showHighlightLayer = true,\n showAnnotationLayer = true,\n onRenderComplete,\n onRenderError,\n onAnnotationClick,\n onPageClick,\n}: PDFPageProps) {\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n const [isRendering, setIsRendering] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to highlights and annotations arrays directly to trigger re-renders\n const allHighlights = useAnnotationStore((s) => s.highlights);\n const allAnnotations = useAnnotationStore((s) => s.annotations);\n const selectHighlight = useAnnotationStore((s) => s.selectHighlight);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n\n // Get annotations state\n const selectAnnotation = useAnnotationStore((s) => s.selectAnnotation);\n const selectedAnnotationId = useAnnotationStore((s) => s.selectedAnnotationId);\n const activeAnnotationTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const drawingColor = useAnnotationStore((s) => s.drawingColor);\n const drawingStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const currentDrawingPath = useAnnotationStore((s) => s.currentDrawingPath);\n const currentDrawingPage = useAnnotationStore((s) => s.currentDrawingPage);\n const startDrawing = useAnnotationStore((s) => s.startDrawing);\n const addDrawingPoint = useAnnotationStore((s) => s.addDrawingPoint);\n const finishDrawing = useAnnotationStore((s) => s.finishDrawing);\n\n // Filter highlights and annotations for this page\n const highlights = useMemo(\n () => allHighlights.filter((h) => h.pageNumber === pageNumber),\n [allHighlights, pageNumber]\n );\n const annotations = useMemo(\n () => allAnnotations.filter((a) => a.pageNumber === pageNumber),\n [allAnnotations, pageNumber]\n );\n\n // Calculate dimensions when page or scale changes\n useEffect(() => {\n if (page) {\n const viewport = page.getViewport({ scale, rotation });\n setDimensions({\n width: Math.floor(viewport.width),\n height: Math.floor(viewport.height),\n });\n }\n }, [page, scale, rotation]);\n\n const handleRenderStart = useCallback(() => {\n setIsRendering(true);\n setError(null);\n }, []);\n\n const handleRenderComplete = useCallback(() => {\n setIsRendering(false);\n onRenderComplete?.();\n }, [onRenderComplete]);\n\n const handleRenderError = useCallback(\n (err: Error) => {\n setIsRendering(false);\n setError(err);\n onRenderError?.(err);\n },\n [onRenderError]\n );\n\n const handleHighlightClick = useCallback(\n (highlight: Highlight) => {\n selectHighlight(highlight.id);\n },\n [selectHighlight]\n );\n\n const handleAnnotationClick = useCallback(\n (annotation: Annotation) => {\n selectAnnotation(annotation.id);\n onAnnotationClick?.(annotation);\n },\n [selectAnnotation, onAnnotationClick]\n );\n\n const handleDrawStart = useCallback(\n (point: { x: number; y: number }) => {\n startDrawing(pageNumber, point);\n },\n [startDrawing, pageNumber]\n );\n\n const handleDrawMove = useCallback(\n (point: { x: number; y: number }) => {\n addDrawingPoint(point);\n },\n [addDrawingPoint]\n );\n\n const handleDrawEnd = useCallback(() => {\n finishDrawing();\n }, [finishDrawing]);\n\n const handlePageClick = useCallback(\n (point: { x: number; y: number }) => {\n onPageClick?.(pageNumber, point);\n },\n [onPageClick, pageNumber]\n );\n\n if (!page) {\n return (\n <div\n className={cn(\n 'pdf-page pdf-page-loading',\n 'relative bg-white shadow-lg',\n 'flex items-center justify-center',\n className\n )}\n style={{ width: 612 * scale, height: 792 * scale }}\n data-page-number={pageNumber}\n >\n <div className=\"text-gray-400\">Loading page {pageNumber}...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={cn(\n 'pdf-page pdf-page-error',\n 'relative bg-white shadow-lg',\n 'flex items-center justify-center',\n className\n )}\n style={{ width: dimensions.width, height: dimensions.height }}\n data-page-number={pageNumber}\n >\n <div className=\"text-red-500\">Failed to render page {pageNumber}</div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'pdf-page',\n 'relative bg-white shadow-lg',\n isRendering && 'pdf-page-rendering',\n className\n )}\n style={{\n width: dimensions.width,\n height: dimensions.height,\n }}\n data-page-number={pageNumber}\n >\n <CanvasLayer\n page={page}\n scale={scale}\n rotation={rotation}\n onRenderStart={handleRenderStart}\n onRenderComplete={handleRenderComplete}\n onRenderError={handleRenderError}\n />\n\n {showTextLayer && (\n <TextLayer page={page} scale={scale} rotation={rotation} />\n )}\n\n {showHighlightLayer && highlights.length > 0 && (\n <HighlightLayer\n highlights={highlights}\n scale={scale}\n selectedId={selectedHighlightId}\n onHighlightClick={handleHighlightClick}\n />\n )}\n\n {showAnnotationLayer && (\n <AnnotationLayer\n pageNumber={pageNumber}\n annotations={annotations}\n scale={scale}\n selectedId={selectedAnnotationId}\n isDrawing={currentDrawingPage === pageNumber}\n currentDrawingPath={currentDrawingPage === pageNumber ? currentDrawingPath : null}\n drawingColor={drawingColor}\n drawingStrokeWidth={drawingStrokeWidth}\n activeAnnotationTool={activeAnnotationTool}\n onAnnotationClick={handleAnnotationClick}\n onDrawStart={handleDrawStart}\n onDrawMove={handleDrawMove}\n onDrawEnd={handleDrawEnd}\n onPageClick={handlePageClick}\n />\n )}\n </div>\n );\n});\n","import { memo, useMemo } from 'react';\nimport type { FocusedRegion } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface FocusRegionLayerProps {\n focusedRegions: FocusedRegion[];\n scale: number;\n pageNumber: number;\n className?: string;\n}\n\nconst FOCUS_STYLES = {\n pulse: {\n animation: 'focus-pulse 2s ease-in-out infinite',\n border: '3px solid',\n boxShadow: '0 0 0 0 rgba(59, 130, 246, 0.7)',\n },\n glow: {\n animation: 'focus-glow 1.5s ease-in-out infinite alternate',\n border: '2px solid',\n boxShadow: '0 0 20px 5px',\n },\n border: {\n animation: 'none',\n border: '3px dashed',\n boxShadow: 'none',\n },\n};\n\nconst DEFAULT_COLORS = {\n pulse: '#3b82f6', // blue-500\n glow: '#f59e0b', // amber-500\n border: '#10b981', // emerald-500\n};\n\nexport const FocusRegionLayer = memo(function FocusRegionLayer({\n focusedRegions,\n scale,\n pageNumber,\n className,\n}: FocusRegionLayerProps) {\n // Filter regions for this page\n const pageRegions = useMemo(\n () => focusedRegions.filter((r) => r.pageNumber === pageNumber),\n [focusedRegions, pageNumber]\n );\n\n const renderedRegions = useMemo(() => {\n return pageRegions.map((region) => {\n const style = region.style ?? 'pulse';\n const color = region.color ?? DEFAULT_COLORS[style];\n const styleConfig = FOCUS_STYLES[style];\n\n return (\n <div\n key={region.id}\n className={cn(\n 'focus-region',\n 'absolute rounded-sm pointer-events-none',\n `focus-region-${style}`\n )}\n style={{\n left: region.x * scale,\n top: region.y * scale,\n width: region.width * scale,\n height: region.height * scale,\n borderColor: color,\n borderStyle: style === 'border' ? 'dashed' : 'solid',\n borderWidth: style === 'border' ? '3px' : '2px',\n boxShadow: style === 'glow' ? `0 0 20px 5px ${color}40` : undefined,\n animation: styleConfig.animation,\n }}\n data-focus-id={region.id}\n data-focus-style={style}\n />\n );\n });\n }, [pageRegions, scale]);\n\n if (pageRegions.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'pdf-focus-region-layer',\n 'absolute inset-0 pointer-events-none overflow-hidden',\n className\n )}\n style={{ zIndex: 45 }}\n >\n {renderedRegions}\n <style>{`\n @keyframes focus-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 70% {\n box-shadow: 0 0 0 10px rgba(59, 130, 246, 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);\n }\n }\n\n @keyframes focus-glow {\n 0% {\n opacity: 0.8;\n filter: brightness(1);\n }\n 100% {\n opacity: 1;\n filter: brightness(1.2);\n }\n }\n\n .focus-region-pulse {\n animation: focus-pulse 2s ease-in-out infinite;\n }\n\n .focus-region-glow {\n animation: focus-glow 1.5s ease-in-out infinite alternate;\n }\n `}</style>\n </div>\n );\n});\n","export { PDFPage, type PDFPageProps } from './PDFPage';\nexport { CanvasLayer, type CanvasLayerProps } from './CanvasLayer';\nexport { TextLayer, type TextLayerProps } from './TextLayer';\nexport { HighlightLayer, type HighlightLayerProps } from './HighlightLayer';\nexport { AnnotationLayer, type AnnotationLayerProps } from './AnnotationLayer';\nexport { FocusRegionLayer, type FocusRegionLayerProps } from './FocusRegionLayer';\n","import { memo, useEffect, useState, useCallback, useRef } from 'react';\nimport type { TextSelection, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface SelectionToolbarProps {\n /** Current text selection */\n selection: TextSelection | null;\n /** Callback when a color is clicked to create highlight */\n onCreateHighlight: (color: HighlightColor) => void;\n /** Callback when copy button is clicked */\n onCopy?: () => void;\n /** Active/default highlight color */\n activeColor?: HighlightColor;\n /** Additional class name */\n className?: string;\n}\n\ninterface ToolbarPosition {\n top: number;\n left: number;\n visible: boolean;\n}\n\nconst HIGHLIGHT_COLOR_BUTTONS: Array<{\n color: HighlightColor;\n bg: string;\n hoverBg: string;\n ringColor: string;\n}> = [\n { color: 'yellow', bg: 'bg-yellow-300', hoverBg: 'hover:bg-yellow-400', ringColor: 'ring-yellow-400' },\n { color: 'green', bg: 'bg-green-300', hoverBg: 'hover:bg-green-400', ringColor: 'ring-green-400' },\n { color: 'blue', bg: 'bg-blue-300', hoverBg: 'hover:bg-blue-400', ringColor: 'ring-blue-400' },\n { color: 'pink', bg: 'bg-pink-300', hoverBg: 'hover:bg-pink-400', ringColor: 'ring-pink-400' },\n { color: 'orange', bg: 'bg-orange-300', hoverBg: 'hover:bg-orange-400', ringColor: 'ring-orange-400' },\n];\n\nfunction calculatePosition(selection: TextSelection): ToolbarPosition {\n if (!selection || selection.rects.length === 0) {\n return { top: 0, left: 0, visible: false };\n }\n\n // Find the first rect (topmost, leftmost)\n const firstRect = selection.rects.reduce((min, rect) => {\n if (rect.top < min.top || (rect.top === min.top && rect.left < min.left)) {\n return rect;\n }\n return min;\n }, selection.rects[0]);\n\n // Position toolbar above the selection\n const top = firstRect.top - 48; // 48px above (40px toolbar height + 8px gap)\n const left = firstRect.left + firstRect.width / 2;\n\n return { top, left, visible: true };\n}\n\nexport const SelectionToolbar = memo(function SelectionToolbar({\n selection,\n onCreateHighlight,\n onCopy,\n activeColor = 'yellow',\n className,\n}: SelectionToolbarProps) {\n const [position, setPosition] = useState<ToolbarPosition>({ top: 0, left: 0, visible: false });\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n // Calculate position when selection changes\n useEffect(() => {\n if (selection && selection.text && selection.rects.length > 0) {\n const newPosition = calculatePosition(selection);\n\n // Adjust position to keep toolbar within viewport\n if (toolbarRef.current && newPosition.visible) {\n const toolbarWidth = 200; // Approximate toolbar width\n const viewportWidth = window.innerWidth;\n\n // Ensure toolbar doesn't go off left edge\n let adjustedLeft = newPosition.left - toolbarWidth / 2;\n if (adjustedLeft < 8) adjustedLeft = 8;\n\n // Ensure toolbar doesn't go off right edge\n if (adjustedLeft + toolbarWidth > viewportWidth - 8) {\n adjustedLeft = viewportWidth - toolbarWidth - 8;\n }\n\n // Ensure toolbar doesn't go above viewport\n let adjustedTop = newPosition.top;\n if (adjustedTop < 8) {\n // Position below selection instead\n const lastRect = selection.rects[selection.rects.length - 1];\n adjustedTop = lastRect.bottom + 8;\n }\n\n setPosition({\n top: adjustedTop,\n left: adjustedLeft + toolbarWidth / 2,\n visible: true,\n });\n } else {\n setPosition(newPosition);\n }\n } else {\n setPosition({ top: 0, left: 0, visible: false });\n }\n }, [selection]);\n\n const handleColorClick = useCallback(\n (color: HighlightColor) => {\n onCreateHighlight(color);\n },\n [onCreateHighlight]\n );\n\n const handleCopy = useCallback(() => {\n onCopy?.();\n }, [onCopy]);\n\n if (!position.visible || !selection?.text) {\n return null;\n }\n\n return (\n <div\n ref={toolbarRef}\n className={cn(\n 'selection-toolbar',\n 'fixed z-50',\n 'flex items-center gap-1 p-1.5',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n top: position.top,\n left: position.left,\n transform: 'translateX(-50%)',\n }}\n onMouseDown={(e) => {\n // Prevent toolbar clicks from clearing the selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {/* Highlight color buttons */}\n {HIGHLIGHT_COLOR_BUTTONS.map((btn) => (\n <button\n key={btn.color}\n onClick={() => handleColorClick(btn.color)}\n className={cn(\n 'w-7 h-7 rounded-full',\n 'flex items-center justify-center',\n 'transition-transform duration-100',\n 'hover:scale-110',\n 'focus:outline-none focus:ring-2 focus:ring-offset-1',\n btn.bg,\n btn.hoverBg,\n btn.ringColor,\n activeColor === btn.color && 'ring-2 ring-offset-1'\n )}\n title={`Highlight ${btn.color}`}\n aria-label={`Highlight with ${btn.color}`}\n >\n {/* Highlighter icon */}\n <svg className=\"w-4 h-4 text-gray-700\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\"\n />\n </svg>\n </button>\n ))}\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Copy button */}\n <button\n onClick={handleCopy}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n title=\"Copy text\"\n aria-label=\"Copy selected text\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n );\n});\n\nexport default SelectionToolbar;\n","export { SelectionToolbar, type SelectionToolbarProps } from './SelectionToolbar';\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface HighlightPopoverProps {\n /** The highlight to show the popover for */\n highlight: Highlight | null;\n /** The scale of the PDF page */\n scale: number;\n /** The page element containing the highlight */\n pageElement: HTMLElement | null;\n /** Callback when color is changed */\n onColorChange: (id: string, color: HighlightColor) => void;\n /** Callback when comment is updated */\n onCommentChange: (id: string, comment: string) => void;\n /** Callback when delete is clicked */\n onDelete: (id: string) => void;\n /** Callback when copy is clicked */\n onCopy?: (text: string) => void;\n /** Callback when popover is closed */\n onClose: () => void;\n /** Additional class name */\n className?: string;\n}\n\ninterface PopoverPosition {\n top: number;\n left: number;\n visible: boolean;\n}\n\nconst HIGHLIGHT_COLOR_OPTIONS: Array<{\n color: HighlightColor;\n bg: string;\n hoverBg: string;\n borderColor: string;\n}> = [\n { color: 'yellow', bg: 'bg-yellow-300', hoverBg: 'hover:bg-yellow-400', borderColor: 'border-yellow-400' },\n { color: 'green', bg: 'bg-green-300', hoverBg: 'hover:bg-green-400', borderColor: 'border-green-400' },\n { color: 'blue', bg: 'bg-blue-300', hoverBg: 'hover:bg-blue-400', borderColor: 'border-blue-400' },\n { color: 'pink', bg: 'bg-pink-300', hoverBg: 'hover:bg-pink-400', borderColor: 'border-pink-400' },\n { color: 'orange', bg: 'bg-orange-300', hoverBg: 'hover:bg-orange-400', borderColor: 'border-orange-400' },\n];\n\nfunction calculatePopoverPosition(\n highlight: Highlight,\n scale: number,\n pageElement: HTMLElement | null\n): PopoverPosition {\n if (!pageElement || !highlight.rects.length) {\n return { top: 0, left: 0, visible: false };\n }\n\n const pageRect = pageElement.getBoundingClientRect();\n\n // Find the first rect of the highlight\n const firstRect = highlight.rects[0];\n const scaledTop = firstRect.y * scale + pageRect.top;\n const scaledLeft = firstRect.x * scale + pageRect.left;\n const scaledWidth = firstRect.width * scale;\n\n // Position popover above the highlight\n const top = scaledTop - 8;\n const left = scaledLeft + scaledWidth / 2;\n\n return { top, left, visible: true };\n}\n\nexport const HighlightPopover = memo(function HighlightPopover({\n highlight,\n scale,\n pageElement,\n onColorChange,\n onCommentChange,\n onDelete,\n onCopy,\n onClose,\n className,\n}: HighlightPopoverProps) {\n const [isEditingComment, setIsEditingComment] = useState(false);\n const [comment, setComment] = useState(highlight?.comment ?? '');\n const [position, setPosition] = useState<PopoverPosition>({ top: 0, left: 0, visible: false });\n const popoverRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Update comment state when highlight changes\n useEffect(() => {\n setComment(highlight?.comment ?? '');\n setIsEditingComment(false);\n }, [highlight?.id, highlight?.comment]);\n\n // Calculate position when highlight or page element changes\n useEffect(() => {\n if (highlight && pageElement) {\n const newPosition = calculatePopoverPosition(highlight, scale, pageElement);\n\n if (newPosition.visible && popoverRef.current) {\n const popoverWidth = 280;\n const viewportWidth = window.innerWidth;\n\n let adjustedLeft = newPosition.left;\n if (adjustedLeft - popoverWidth / 2 < 8) {\n adjustedLeft = popoverWidth / 2 + 8;\n } else if (adjustedLeft + popoverWidth / 2 > viewportWidth - 8) {\n adjustedLeft = viewportWidth - popoverWidth / 2 - 8;\n }\n\n let adjustedTop = newPosition.top;\n const popoverHeight = isEditingComment ? 200 : 120;\n if (adjustedTop - popoverHeight < 8) {\n // Position below the highlight instead\n const lastRect = highlight.rects[highlight.rects.length - 1];\n adjustedTop = (lastRect.y + lastRect.height) * scale + pageElement.getBoundingClientRect().top + 8;\n }\n\n setPosition({\n top: adjustedTop,\n left: adjustedLeft,\n visible: true,\n });\n } else {\n setPosition(newPosition);\n }\n } else {\n setPosition({ top: 0, left: 0, visible: false });\n }\n }, [highlight, pageElement, scale, isEditingComment]);\n\n // Focus textarea when editing starts\n useEffect(() => {\n if (isEditingComment && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [isEditingComment]);\n\n // Close popover when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (position.visible) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [position.visible, onClose]);\n\n // Handle escape key\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n if (isEditingComment) {\n setIsEditingComment(false);\n setComment(highlight?.comment ?? '');\n } else {\n onClose();\n }\n }\n }\n\n if (position.visible) {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }\n }, [position.visible, isEditingComment, highlight?.comment, onClose]);\n\n const handleColorClick = useCallback(\n (color: HighlightColor) => {\n if (highlight) {\n onColorChange(highlight.id, color);\n }\n },\n [highlight, onColorChange]\n );\n\n const handleSaveComment = useCallback(() => {\n if (highlight) {\n onCommentChange(highlight.id, comment.trim());\n setIsEditingComment(false);\n }\n }, [highlight, comment, onCommentChange]);\n\n const handleDeleteClick = useCallback(() => {\n if (highlight) {\n onDelete(highlight.id);\n onClose();\n }\n }, [highlight, onDelete, onClose]);\n\n const handleCopyClick = useCallback(() => {\n if (highlight?.text) {\n navigator.clipboard.writeText(highlight.text);\n onCopy?.(highlight.text);\n }\n }, [highlight, onCopy]);\n\n if (!highlight || !position.visible) {\n return null;\n }\n\n return (\n <div\n ref={popoverRef}\n className={cn(\n 'highlight-popover',\n 'fixed z-50',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-xl',\n 'border border-gray-200 dark:border-gray-700',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n top: position.top,\n left: position.left,\n transform: 'translate(-50%, -100%)',\n width: 280,\n }}\n >\n {/* Color picker row */}\n <div className=\"flex items-center justify-between p-2 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center gap-1\">\n {HIGHLIGHT_COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.color}\n onClick={() => handleColorClick(opt.color)}\n className={cn(\n 'w-6 h-6 rounded-full',\n 'transition-transform duration-100',\n 'hover:scale-110',\n 'focus:outline-none',\n opt.bg,\n opt.hoverBg,\n highlight.color === opt.color && `ring-2 ring-offset-1 ${opt.borderColor}`\n )}\n title={`Change to ${opt.color}`}\n aria-label={`Change highlight color to ${opt.color}`}\n />\n ))}\n </div>\n\n {/* Delete button */}\n <button\n onClick={handleDeleteClick}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-red-500 hover:text-red-600',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:outline-none focus:ring-2 focus:ring-red-500'\n )}\n title=\"Delete highlight\"\n aria-label=\"Delete highlight\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n\n {/* Comment section */}\n <div className=\"p-2\">\n {isEditingComment ? (\n <div className=\"space-y-2\">\n <textarea\n ref={textareaRef}\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n placeholder=\"Add a note...\"\n className={cn(\n 'w-full p-2 text-sm',\n 'rounded-md border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-gray-100',\n 'placeholder-gray-500 dark:placeholder-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'resize-none'\n )}\n rows={3}\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={() => {\n setIsEditingComment(false);\n setComment(highlight.comment ?? '');\n }}\n className={cn(\n 'px-3 py-1 text-sm rounded-md',\n 'text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSaveComment}\n className={cn(\n 'px-3 py-1 text-sm rounded-md',\n 'bg-blue-500 text-white',\n 'hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {/* Text preview */}\n <p className=\"text-xs text-gray-500 dark:text-gray-400 line-clamp-2\">\n &ldquo;{highlight.text.slice(0, 100)}{highlight.text.length > 100 ? '...' : ''}&rdquo;\n </p>\n\n {/* Comment display or add button */}\n {highlight.comment ? (\n <button\n onClick={() => setIsEditingComment(true)}\n className={cn(\n 'w-full text-left p-2 rounded-md',\n 'bg-gray-50 dark:bg-gray-700/50',\n 'text-sm text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n {highlight.comment}\n </button>\n ) : (\n <button\n onClick={() => setIsEditingComment(true)}\n className={cn(\n 'w-full text-left p-2 rounded-md',\n 'text-sm text-gray-500 dark:text-gray-400',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n + Add a note...\n </button>\n )}\n\n {/* Copy button */}\n <button\n onClick={handleCopyClick}\n className={cn(\n 'flex items-center gap-2 w-full p-2 rounded-md',\n 'text-sm text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n Copy text\n </button>\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport default HighlightPopover;\n","export { HighlightPopover, type HighlightPopoverProps } from './HighlightPopover';\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface DocumentContainerProps {\n className?: string;\n /** Enable touch gestures for mobile */\n enableTouchGestures?: boolean;\n}\n\nexport const DocumentContainer = memo(function DocumentContainer({\n className,\n enableTouchGestures = true,\n}: DocumentContainerProps) {\n const {\n document,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n nextPage,\n previousPage,\n } = usePDFViewer();\n const [currentPageObj, setCurrentPageObj] = useState<PDFPageProxy | null>(null);\n const [isLoadingPage, setIsLoadingPage] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n // Text selection handling\n const { selection, clearSelection, copySelection } = useTextSelection();\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n const handleSwipeLeft = useCallback(() => {\n nextPage();\n }, [nextPage]);\n\n const handleSwipeRight = useCallback(() => {\n previousPage();\n }, [previousPage]);\n\n const handleDoubleTap = useCallback(\n (_position: { x: number; y: number }) => {\n // Toggle between 1x and 2x zoom on double tap\n const newScale = scale < 1.5 ? 2 : 1;\n setScale(newScale);\n },\n [scale, setScale]\n );\n\n // Update base scale when scale changes from other sources\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n // Set up touch gestures\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: handleSwipeLeft,\n onSwipeRight: handleSwipeRight,\n onDoubleTap: handleDoubleTap,\n enabled: enableTouchGestures && isTouchDevice,\n swipeThreshold: 50,\n doubleTapInterval: 300,\n });\n\n // Highlight management\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Clear page when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n setCurrentPageObj(null);\n }\n }, [document]);\n\n // Load the current page\n useEffect(() => {\n if (!document) {\n setCurrentPageObj(null);\n return;\n }\n\n let cancelled = false;\n\n const loadPage = async () => {\n setIsLoadingPage(true);\n\n try {\n const page = await document.getPage(currentPage);\n\n if (!cancelled && document === documentRef.current) {\n setCurrentPageObj(page);\n }\n } catch (error) {\n if (!cancelled) {\n // Silently ignore errors from document switching\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('destroyed') && !errorMessage.includes('sendWithStream')) {\n console.error('Error loading page:', error);\n }\n }\n } finally {\n if (!cancelled) {\n setIsLoadingPage(false);\n }\n }\n };\n\n loadPage();\n\n return () => {\n cancelled = true;\n };\n }, [document, currentPage]);\n\n // Get the page element for coordinate calculations\n const getPageElement = useCallback((): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${currentPage}\"]`) as HTMLElement | null;\n }, [currentPage]);\n\n // Handle creating a highlight from selection\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n\n const pageElement = getPageElement();\n if (!pageElement) return;\n\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n // Handle copying selected text\n const handleCopySelection = useCallback(() => {\n copySelection();\n }, [copySelection]);\n\n // Handle changing highlight color\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n // Handle changing highlight comment\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Handle closing the popover\n const handleClosePopover = useCallback(() => {\n selectHighlight(null);\n }, [selectHighlight]);\n\n // Combine refs for container - must be before any early returns\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n containerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Theme-based background\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n if (!document) {\n return (\n <div\n className={cn(\n 'document-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">\n No document loaded\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={setContainerRef}\n className={cn(\n 'document-container',\n 'flex-1 overflow-auto',\n 'flex flex-col items-center',\n 'p-4 gap-4',\n themeStyles[theme],\n className\n )}\n >\n {/* For single page view, show only current page */}\n <PDFPage\n pageNumber={currentPage}\n page={currentPageObj}\n scale={scale}\n rotation={rotation}\n />\n\n {/* Selection toolbar - appears when text is selected */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={handleCopySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover - appears when a highlight is clicked */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={getPageElement()}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={handleClosePopover}\n />\n\n {/* Loading indicator */}\n {isLoadingPage && !currentPageObj && (\n <div className=\"fixed bottom-4 right-4 px-3 py-2 bg-black/75 text-white text-sm rounded-lg\">\n Loading...\n </div>\n )}\n </div>\n );\n});\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface VirtualizedDocumentContainerProps {\n /** Number of pages to render above/below viewport */\n overscan?: number;\n /** Gap between pages in pixels */\n pageGap?: number;\n /** Enable touch gestures */\n enableTouchGestures?: boolean;\n className?: string;\n}\n\ninterface PageInfo {\n pageNumber: number;\n top: number;\n height: number;\n}\n\n// Default page dimensions for placeholder (US Letter)\nconst DEFAULT_PAGE_WIDTH = 612;\nconst DEFAULT_PAGE_HEIGHT = 792;\n\n/**\n * VirtualizedDocumentContainer efficiently renders only visible pages.\n *\n * Mobile optimizations:\n * - Only pages in/near viewport are rendered (virtualization)\n * - Smooth scrolling with -webkit-overflow-scrolling\n * - Touch gestures for pinch-zoom and swipe navigation\n * - Passive event listeners for scroll performance\n * - Smart page caching to avoid re-fetching\n */\nexport const VirtualizedDocumentContainer = memo(function VirtualizedDocumentContainer({\n overscan = 2,\n pageGap = 16,\n enableTouchGestures = true,\n className,\n}: VirtualizedDocumentContainerProps) {\n const {\n document,\n numPages,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n goToPage,\n nextPage,\n previousPage,\n } = usePDFViewer();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const pageCache = useRef<Map<number, PDFPageProxy>>(new Map());\n const pageDimensionsCache = useRef<Map<number, { width: number; height: number }>>(new Map());\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n const [visiblePages, setVisiblePages] = useState<number[]>([1]);\n const [pageObjects, setPageObjects] = useState<Map<number, PDFPageProxy>>(new Map());\n const [totalHeight, setTotalHeight] = useState(0);\n const [pageInfos, setPageInfos] = useState<PageInfo[]>([]);\n\n // Text selection and highlights\n const { selection, clearSelection, copySelection } = useTextSelection();\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Clear cache when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n pageCache.current.clear();\n pageDimensionsCache.current.clear();\n setPageObjects(new Map());\n }\n }, [document]);\n\n // Calculate page positions\n useEffect(() => {\n if (!document || numPages === 0) return;\n\n const calculatePageInfos = async () => {\n const infos: PageInfo[] = [];\n let currentTop = 0;\n\n for (let i = 1; i <= numPages; i++) {\n // Try to get cached dimensions or use default\n let dimensions = pageDimensionsCache.current.get(i);\n\n if (!dimensions) {\n try {\n const page = pageCache.current.get(i) || await document.getPage(i);\n if (!pageCache.current.has(i)) {\n pageCache.current.set(i, page);\n }\n const viewport = page.getViewport({ scale: 1, rotation });\n dimensions = { width: viewport.width, height: viewport.height };\n pageDimensionsCache.current.set(i, dimensions);\n } catch {\n dimensions = { width: DEFAULT_PAGE_WIDTH, height: DEFAULT_PAGE_HEIGHT };\n }\n }\n\n const scaledHeight = Math.floor(dimensions.height * scale);\n\n infos.push({\n pageNumber: i,\n top: currentTop,\n height: scaledHeight,\n });\n\n currentTop += scaledHeight + pageGap;\n }\n\n setPageInfos(infos);\n setTotalHeight(currentTop - pageGap); // Remove last gap\n };\n\n calculatePageInfos();\n }, [document, numPages, scale, rotation, pageGap]);\n\n // Update visible pages based on scroll\n const updateVisiblePages = useCallback(() => {\n if (!scrollContainerRef.current || pageInfos.length === 0) return;\n\n const container = scrollContainerRef.current;\n const scrollTop = container.scrollTop;\n const viewportHeight = container.clientHeight;\n const scrollBottom = scrollTop + viewportHeight;\n\n const visible: number[] = [];\n let firstVisiblePage = 1;\n let maxVisibleArea = 0;\n\n for (const info of pageInfos) {\n const pageTop = info.top;\n const pageBottom = info.top + info.height;\n\n // Check if page is in viewport (with overscan)\n const overscanTop = scrollTop - overscan * viewportHeight;\n const overscanBottom = scrollBottom + overscan * viewportHeight;\n\n if (pageBottom > overscanTop && pageTop < overscanBottom) {\n visible.push(info.pageNumber);\n }\n\n // Calculate which page has most visible area (for current page tracking)\n if (pageBottom > scrollTop && pageTop < scrollBottom) {\n const visibleTop = Math.max(pageTop, scrollTop);\n const visibleBottom = Math.min(pageBottom, scrollBottom);\n const visibleArea = visibleBottom - visibleTop;\n\n if (visibleArea > maxVisibleArea) {\n maxVisibleArea = visibleArea;\n firstVisiblePage = info.pageNumber;\n }\n }\n }\n\n setVisiblePages(visible);\n\n // Update current page if it changed\n if (firstVisiblePage !== currentPage) {\n goToPage(firstVisiblePage);\n }\n }, [pageInfos, overscan, currentPage, goToPage]);\n\n // Set up scroll listener with passive option for better performance\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n requestAnimationFrame(updateVisiblePages);\n };\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n updateVisiblePages(); // Initial update\n\n return () => container.removeEventListener('scroll', handleScroll);\n }, [updateVisiblePages]);\n\n // Load page objects for visible pages\n useEffect(() => {\n if (!document) return;\n\n const loadPages = async () => {\n const newPageObjects = new Map(pageObjects);\n let hasChanges = false;\n\n for (const pageNum of visiblePages) {\n if (!newPageObjects.has(pageNum)) {\n try {\n let page = pageCache.current.get(pageNum);\n if (!page) {\n page = await document.getPage(pageNum);\n pageCache.current.set(pageNum, page);\n }\n newPageObjects.set(pageNum, page);\n hasChanges = true;\n } catch (error) {\n console.error(`Error loading page ${pageNum}:`, error);\n }\n }\n }\n\n // Unload pages that are far from viewport to save memory\n const visibleSet = new Set(visiblePages);\n for (const [pageNum] of newPageObjects) {\n if (!visibleSet.has(pageNum)) {\n newPageObjects.delete(pageNum);\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n setPageObjects(newPageObjects);\n }\n };\n\n loadPages();\n }, [document, visiblePages, pageObjects]);\n\n // Scroll to page when currentPage changes externally\n useEffect(() => {\n if (!scrollContainerRef.current || pageInfos.length === 0) return;\n\n const pageInfo = pageInfos.find((p) => p.pageNumber === currentPage);\n if (pageInfo) {\n const container = scrollContainerRef.current;\n const targetScroll = pageInfo.top - pageGap;\n\n // Only scroll if not already visible\n const scrollTop = container.scrollTop;\n const viewportHeight = container.clientHeight;\n\n if (targetScroll < scrollTop || pageInfo.top + pageInfo.height > scrollTop + viewportHeight) {\n container.scrollTo({\n top: targetScroll,\n behavior: 'smooth',\n });\n }\n }\n }, [currentPage, pageInfos, pageGap]);\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: nextPage,\n onSwipeRight: previousPage,\n enabled: enableTouchGestures && isTouchDevice,\n });\n\n // Combine refs\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n scrollContainerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Highlight handlers\n const getPageElement = useCallback(\n (pageNumber: number): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n },\n []\n );\n\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n const pageElement = getPageElement(selection.pageNumber);\n if (!pageElement) return;\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Theme styles\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n if (!document) {\n return (\n <div\n className={cn(\n 'virtualized-document-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'virtualized-document-container',\n 'flex-1 relative',\n themeStyles[theme],\n className\n )}\n >\n <div\n ref={setContainerRef}\n className=\"absolute inset-0 overflow-auto\"\n style={{\n // Smooth scrolling on iOS\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {/* Scroll container with total height */}\n <div\n className=\"relative mx-auto\"\n style={{\n height: totalHeight,\n minHeight: '100%',\n }}\n >\n {/* Render visible pages */}\n {pageInfos\n .filter((info) => visiblePages.includes(info.pageNumber))\n .map((info) => {\n const page = pageObjects.get(info.pageNumber);\n const dimensions = pageDimensionsCache.current.get(info.pageNumber);\n const scaledWidth = dimensions\n ? Math.floor(dimensions.width * scale)\n : Math.floor(DEFAULT_PAGE_WIDTH * scale);\n\n return (\n <div\n key={info.pageNumber}\n className=\"absolute left-1/2 -translate-x-1/2\"\n style={{\n top: info.top,\n width: scaledWidth,\n }}\n >\n <PDFPage\n pageNumber={info.pageNumber}\n page={page || null}\n scale={scale}\n rotation={rotation}\n />\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Selection toolbar */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={copySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={selectedHighlight ? getPageElement(selectedHighlight.pageNumber) : null}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={() => selectHighlight(null)}\n />\n </div>\n );\n});\n","import { memo } from 'react';\nimport {\n VirtualizedDocumentContainer,\n type VirtualizedDocumentContainerProps,\n} from './VirtualizedDocumentContainer';\n\nexport interface ContinuousScrollContainerProps extends VirtualizedDocumentContainerProps {\n /** Scroll to page smoothly */\n smoothScroll?: boolean;\n}\n\n/**\n * ContinuousScrollContainer is a convenience wrapper around VirtualizedDocumentContainer\n * that provides continuous scrolling behavior with all pages visible in a single\n * scrollable view.\n *\n * Features:\n * - All pages rendered in a continuous scroll view\n * - Virtualized rendering for performance (only visible pages + buffer are rendered)\n * - Automatic page tracking based on scroll position\n * - Scroll-to-page functionality\n * - Memory management (unloads distant pages)\n */\nexport const ContinuousScrollContainer = memo(function ContinuousScrollContainer(\n props: ContinuousScrollContainerProps\n) {\n // ContinuousScrollContainer is essentially the same as VirtualizedDocumentContainer\n // with default settings optimized for continuous reading\n return (\n <VirtualizedDocumentContainer\n overscan={3} // Render more pages for smoother scrolling\n pageGap={16}\n {...props}\n />\n );\n});\n\n// Re-export the virtualized container for direct use\nexport { VirtualizedDocumentContainer };\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface DualPageContainerProps {\n /** Show the first page alone (like a book cover) */\n showCover?: boolean;\n /** Book spread mode: odd pages on right side */\n bookSpread?: boolean;\n /** Gap between the two pages */\n pageGap?: number;\n /** Enable touch gestures */\n enableTouchGestures?: boolean;\n className?: string;\n}\n\nexport const DualPageContainer = memo(function DualPageContainer({\n showCover = true,\n bookSpread = true,\n pageGap = 4,\n enableTouchGestures = true,\n className,\n}: DualPageContainerProps) {\n const {\n document,\n numPages,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n goToPage,\n } = usePDFViewer();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n const [leftPage, setLeftPage] = useState<PDFPageProxy | null>(null);\n const [rightPage, setRightPage] = useState<PDFPageProxy | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // Text selection and highlights\n const { selection, clearSelection, copySelection } = useTextSelection();\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Calculate which pages to show in dual view\n const getSpreadPages = useCallback(\n (page: number): { left: number | null; right: number | null } => {\n // Cover page mode: first page is shown alone on right\n if (showCover && page === 1) {\n return { left: null, right: 1 };\n }\n\n if (bookSpread) {\n // Book spread: even pages on left, odd pages on right\n // After cover: page 2 is alone on left, then 3-4, 5-6, etc.\n if (showCover) {\n if (page === 2) {\n return { left: 2, right: null };\n }\n // For pages 3 and above, pair odd with the next even\n const effectivePage = page > 2 ? page : 3;\n if (effectivePage % 2 === 1) {\n // Odd page: this is on right, previous even on left\n return {\n left: effectivePage - 1 > 1 ? effectivePage - 1 : null,\n right: effectivePage <= numPages ? effectivePage : null,\n };\n } else {\n // Even page: this is on left, next odd on right\n return {\n left: effectivePage,\n right: effectivePage + 1 <= numPages ? effectivePage + 1 : null,\n };\n }\n } else {\n // No cover: pages 1-2, 3-4, etc.\n if (page % 2 === 1) {\n return {\n left: page,\n right: page + 1 <= numPages ? page + 1 : null,\n };\n } else {\n return {\n left: page - 1,\n right: page,\n };\n }\n }\n } else {\n // Simple dual view: show current page and next\n return {\n left: page,\n right: page + 1 <= numPages ? page + 1 : null,\n };\n }\n },\n [showCover, bookSpread, numPages]\n );\n\n // Clear pages when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n setLeftPage(null);\n setRightPage(null);\n }\n }, [document]);\n\n // Load pages when currentPage changes\n useEffect(() => {\n if (!document) {\n setLeftPage(null);\n setRightPage(null);\n return;\n }\n\n const spread = getSpreadPages(currentPage);\n let cancelled = false;\n\n const loadPages = async () => {\n setIsLoading(true);\n\n try {\n const [left, right] = await Promise.all([\n spread.left ? document.getPage(spread.left) : Promise.resolve(null),\n spread.right ? document.getPage(spread.right) : Promise.resolve(null),\n ]);\n\n if (!cancelled) {\n setLeftPage(left);\n setRightPage(right);\n }\n } catch (error) {\n if (!cancelled) {\n console.error('Error loading pages:', error);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadPages();\n\n return () => {\n cancelled = true;\n };\n }, [document, currentPage, getSpreadPages]);\n\n // Navigate by spread\n const goToPreviousSpread = useCallback(() => {\n const spread = getSpreadPages(currentPage);\n const leftmostPage = spread.left || spread.right || currentPage;\n\n if (showCover && leftmostPage === 2) {\n goToPage(1);\n } else if (showCover && leftmostPage <= 3) {\n goToPage(2);\n } else {\n const newPage = Math.max(1, leftmostPage - 2);\n goToPage(newPage);\n }\n }, [currentPage, showCover, getSpreadPages, goToPage]);\n\n const goToNextSpread = useCallback(() => {\n const spread = getSpreadPages(currentPage);\n const rightmostPage = spread.right || spread.left || currentPage;\n\n if (rightmostPage < numPages) {\n goToPage(Math.min(numPages, rightmostPage + 1));\n }\n }, [currentPage, numPages, getSpreadPages, goToPage]);\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: goToNextSpread,\n onSwipeRight: goToPreviousSpread,\n enabled: enableTouchGestures && isTouchDevice,\n });\n\n // Combine refs\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n containerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Highlight handlers\n const getPageElement = useCallback(\n (pageNumber: number): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n },\n []\n );\n\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n const pageElement = getPageElement(selection.pageNumber);\n if (!pageElement) return;\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Theme styles\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n const spread = getSpreadPages(currentPage);\n\n if (!document) {\n return (\n <div\n className={cn(\n 'dual-page-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={setContainerRef}\n className={cn(\n 'dual-page-container',\n 'flex-1 overflow-auto',\n 'flex items-center justify-center',\n 'p-4',\n themeStyles[theme],\n className\n )}\n >\n {/* Page spread */}\n <div\n className=\"flex items-center\"\n style={{ gap: pageGap }}\n >\n {/* Left page */}\n {spread.left && (\n <PDFPage\n pageNumber={spread.left}\n page={leftPage}\n scale={scale}\n rotation={rotation}\n />\n )}\n\n {/* Center divider for book spread effect */}\n {spread.left && spread.right && (\n <div\n className=\"w-px h-full bg-gray-300 dark:bg-gray-600 opacity-50\"\n style={{ minHeight: '100%' }}\n />\n )}\n\n {/* Right page */}\n {spread.right && (\n <PDFPage\n pageNumber={spread.right}\n page={rightPage}\n scale={scale}\n rotation={rotation}\n />\n )}\n\n {/* Placeholder for single page spread */}\n {(!spread.left || !spread.right) && (\n <div\n className=\"flex items-center justify-center\"\n style={{\n width: spread.left ? 0 : 612 * scale,\n height: spread.right ? 792 * scale : 0,\n }}\n />\n )}\n </div>\n\n {/* Selection toolbar */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={copySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={selectedHighlight ? getPageElement(selectedHighlight.pageNumber) : null}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={() => selectHighlight(null)}\n />\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"fixed bottom-4 right-4 px-3 py-2 bg-black/75 text-white text-sm rounded-lg\">\n Loading...\n </div>\n )}\n </div>\n );\n});\n","import { useEffect, useCallback, memo, useRef } from 'react';\nimport { PDFViewerProvider, usePDFViewerStores, useViewerStore } from '../../hooks';\nimport { loadDocument } from '../../utils';\nimport { Toolbar } from '../Toolbar';\nimport { Sidebar } from '../Sidebar';\nimport { AnnotationToolbar } from '../AnnotationToolbar';\nimport { DocumentContainer } from './DocumentContainer';\nimport { ContinuousScrollContainer } from './ContinuousScrollContainer';\nimport { DualPageContainer } from './DualPageContainer';\nimport { cn } from '../../utils';\nimport type { PDFViewerProps } from '../../types';\n\ninterface PDFViewerInnerProps extends PDFViewerProps {}\n\nconst PDFViewerInner = memo(function PDFViewerInner({\n src,\n initialPage = 1,\n initialScale = 1,\n showToolbar = true,\n showSidebar = true,\n showAnnotationToolbar = false,\n viewMode = 'single',\n onDocumentLoad,\n onPageChange,\n onScaleChange,\n onError,\n workerSrc,\n className,\n}: PDFViewerInnerProps) {\n const { viewerStore } = usePDFViewerStores();\n const loadingRef = useRef(false);\n const srcRef = useRef(src);\n\n const currentPage = useViewerStore((s) => s.currentPage);\n const scale = useViewerStore((s) => s.scale);\n const theme = useViewerStore((s) => s.theme);\n const isLoading = useViewerStore((s) => s.isLoading);\n const error = useViewerStore((s) => s.error);\n const sidebarOpen = useViewerStore((s) => s.sidebarOpen);\n\n // Load document\n const loadDoc = useCallback(async () => {\n if (loadingRef.current) return;\n loadingRef.current = true;\n\n try {\n viewerStore.getState().setLoading(true);\n viewerStore.getState().setError(null);\n\n const { document, numPages } = await loadDocument({\n src,\n workerSrc,\n });\n\n // Only update if this is still the current src\n if (srcRef.current === src) {\n viewerStore.getState().setDocument(document);\n\n // Set initial page and scale\n if (initialPage !== 1) {\n viewerStore.getState().goToPage(initialPage);\n }\n\n if (typeof initialScale === 'number' && initialScale !== 1) {\n viewerStore.getState().setScale(initialScale);\n }\n\n onDocumentLoad?.({ document, numPages });\n } else {\n // Document changed while loading, destroy this one\n document.destroy();\n }\n } catch (err) {\n if (srcRef.current === src) {\n const error = err instanceof Error ? err : new Error('Failed to load document');\n viewerStore.getState().setError(error);\n onError?.(error);\n }\n } finally {\n loadingRef.current = false;\n }\n }, [src, workerSrc, initialPage, initialScale, onDocumentLoad, onError, viewerStore]);\n\n // Load document on mount or when src changes\n useEffect(() => {\n srcRef.current = src;\n\n // Reset the current document before loading new one\n const currentDoc = viewerStore.getState().document;\n if (currentDoc) {\n viewerStore.getState().reset();\n }\n\n loadDoc();\n\n return () => {\n // Cleanup when unmounting or src changes\n srcRef.current = null as unknown as typeof src;\n };\n }, [src, loadDoc, viewerStore]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n viewerStore.getState().reset();\n };\n }, [viewerStore]);\n\n // Notify parent of page changes\n useEffect(() => {\n onPageChange?.(currentPage);\n }, [currentPage, onPageChange]);\n\n // Notify parent of scale changes\n useEffect(() => {\n onScaleChange?.(scale);\n }, [scale, onScaleChange]);\n\n // Theme class\n const themeClass = theme === 'dark' ? 'dark' : '';\n\n if (error) {\n return (\n <div\n className={cn(\n 'pdf-viewer pdf-viewer-error',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n themeClass,\n className\n )}\n >\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center p-8\">\n <div className=\"text-red-500 text-lg font-semibold mb-2\">\n Failed to load PDF\n </div>\n <div className=\"text-gray-500 text-sm\">{error.message}</div>\n <button\n onClick={loadDoc}\n className=\"mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600\"\n >\n Retry\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Render the appropriate container based on view mode\n const renderContainer = () => {\n switch (viewMode) {\n case 'continuous':\n return <ContinuousScrollContainer />;\n case 'dual':\n return <DualPageContainer />;\n case 'single':\n default:\n return <DocumentContainer />;\n }\n };\n\n return (\n <div\n className={cn(\n 'pdf-viewer',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n 'text-gray-900 dark:text-gray-100',\n themeClass,\n className\n )}\n >\n {showToolbar && <Toolbar />}\n {showAnnotationToolbar && <AnnotationToolbar />}\n\n <div className=\"flex flex-1 overflow-hidden\">\n {showSidebar && sidebarOpen && <Sidebar />}\n {renderContainer()}\n </div>\n\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-900/80\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <div className=\"mt-2 text-sm text-gray-500\">Loading PDF...</div>\n </div>\n </div>\n )}\n </div>\n );\n});\n\n/**\n * SSR-safe PDF Viewer component.\n * Wraps the inner viewer with the context provider.\n */\nexport const PDFViewerClient = memo(function PDFViewerClient(props: PDFViewerProps) {\n return (\n <PDFViewerProvider\n theme={props.theme}\n defaultSidebarPanel={props.defaultSidebarPanel}\n >\n <PDFViewerInner {...props} />\n </PDFViewerProvider>\n );\n});\n","import { lazy, Suspense, memo } from 'react';\nimport type { PDFViewerProps } from '../../types';\nimport { cn } from '../../utils';\n\n// Lazy load the client component to ensure it's only loaded on the client\nconst PDFViewerClient = lazy(() =>\n import('./PDFViewerClient').then((mod) => ({ default: mod.PDFViewerClient }))\n);\n\ninterface PDFViewerLoadingProps {\n className?: string;\n}\n\nconst PDFViewerLoading = memo(function PDFViewerLoading({\n className,\n}: PDFViewerLoadingProps) {\n return (\n <div\n className={cn(\n 'pdf-viewer pdf-viewer-loading',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n className\n )}\n >\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <div className=\"mt-2 text-sm text-gray-500\">Loading PDF viewer...</div>\n </div>\n </div>\n </div>\n );\n});\n\n/**\n * Main PDF Viewer component.\n *\n * This component is SSR-safe and will only render on the client side.\n * It uses React.lazy and Suspense to defer loading of the PDF viewer\n * which depends on browser APIs.\n *\n * @example\n * ```tsx\n * import { PDFViewer } from '@pdf-reader/core';\n *\n * function App() {\n * return (\n * <PDFViewer\n * src=\"/document.pdf\"\n * showToolbar\n * showSidebar\n * onDocumentLoad={(doc) => console.log('Loaded', doc.numPages, 'pages')}\n * />\n * );\n * }\n * ```\n */\nexport const PDFViewer = memo(function PDFViewer(props: PDFViewerProps) {\n // Check if we're on the server\n if (typeof window === 'undefined') {\n return <PDFViewerLoading className={props.className} />;\n }\n\n return (\n <Suspense fallback={<PDFViewerLoading className={props.className} />}>\n <PDFViewerClient {...props} />\n </Suspense>\n );\n});\n","export { PDFViewer } from './PDFViewer';\nexport { PDFViewerClient } from './PDFViewerClient';\nexport { DocumentContainer, type DocumentContainerProps } from './DocumentContainer';\nexport { VirtualizedDocumentContainer, type VirtualizedDocumentContainerProps } from './VirtualizedDocumentContainer';\nexport { ContinuousScrollContainer, type ContinuousScrollContainerProps } from './ContinuousScrollContainer';\nexport { DualPageContainer, type DualPageContainerProps } from './DualPageContainer';\n","// Components\nexport {\n // PDF Viewer\n PDFViewer,\n PDFViewerClient,\n DocumentContainer,\n VirtualizedDocumentContainer,\n ContinuousScrollContainer,\n DualPageContainer,\n // PDF Page\n PDFPage,\n CanvasLayer,\n TextLayer,\n HighlightLayer,\n AnnotationLayer,\n FocusRegionLayer,\n // Toolbar\n Toolbar,\n MobileToolbar,\n // Sidebar\n Sidebar,\n MobileSidebar,\n ThumbnailPanel,\n SearchPanel,\n OutlinePanel,\n HighlightsPanel,\n BookmarksPanel,\n TakeawaysPanel,\n // Popovers\n SelectionToolbar,\n HighlightPopover,\n // Annotations\n AnnotationToolbar,\n StickyNote,\n DrawingCanvas,\n ShapeRenderer,\n ShapePreview,\n QuickNoteButton,\n QuickNotePopover,\n // Ask About\n AskAboutOverlay,\n AskAboutTrigger,\n // Minimap\n Minimap,\n // Error Boundary\n PDFErrorBoundary,\n withErrorBoundary,\n} from './components';\n\n// Hooks\nexport {\n PDFViewerProvider,\n PDFViewerContext,\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n usePDFViewer,\n usePageNavigation,\n useZoom,\n useTextSelection,\n useHighlights,\n useAnnotations,\n useTouchGestures,\n useIsTouchDevice,\n useIsMobile,\n usePlugins,\n // Student Learning Hooks\n useAgentContext,\n useAskAbout,\n useBookmarks,\n useQuickNotes,\n useStudentProgress,\n} from './hooks';\n\n// Stores\nexport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\n createAgentStore,\n createStudentStore,\n} from './store';\n\n// Plugins\nexport {\n PluginManager,\n getPluginManager,\n createPluginManager,\n} from './plugins';\n\n// Utils\nexport {\n cn,\n initializePDFJS,\n isPDFJSInitialized,\n loadDocument,\n getPage,\n getPageTextContent,\n getOutline,\n getMetadata,\n pdfjsLib,\n // Highlight storage\n saveHighlights,\n loadHighlights,\n clearHighlights,\n getAllDocumentIds,\n exportHighlightsAsJSON,\n importHighlightsFromJSON,\n exportHighlightsAsMarkdown,\n generateDocumentId,\n // Convenience API\n createPDFViewer,\n quickViewer,\n // Student Learning Utils\n exportAnnotationsAsMarkdown,\n exportAnnotationsAsJSON,\n downloadAnnotationsAsMarkdown,\n downloadAnnotationsAsJSON,\n downloadFile,\n // Student Storage\n saveStudentData,\n loadStudentData,\n clearStudentData,\n getAllStudentDataDocumentIds,\n getStorageStats,\n // Agent API\n createAgentAPI,\n} from './utils';\n\n// Types\nexport type {\n // Core types\n PDFViewerProps,\n PDFDocumentLoadedEvent,\n TextSelection,\n PDFPageState,\n PageDimensions,\n\n // Viewer types\n ViewerState,\n ViewerActions,\n ViewMode,\n ScrollMode,\n Theme,\n SidebarPanel,\n\n // Highlight types\n Highlight,\n HighlightRect,\n HighlightColor,\n\n // Annotation types\n Annotation,\n AnnotationType,\n NoteAnnotation,\n DrawingAnnotation,\n DrawingPath,\n ShapeAnnotation,\n\n // Search types\n SearchResult,\n SearchState,\n\n // Outline types\n OutlineItem,\n\n // Plugin types\n Plugin,\n PluginAPI,\n ToolbarItem,\n SidebarPanelConfig,\n ContextMenuItem,\n PDFViewerEventMap,\n\n // Agent & Student Learning types\n AgentContext,\n AskAboutContext,\n PDFRegion,\n FocusedRegion,\n Bookmark,\n QuickNote,\n Takeaway,\n AgentHighlightParams,\n AgentAPI,\n StudentState,\n StudentActions,\n AgentState,\n AgentActions,\n StudentModeCallbacks,\n StudentModeProps,\n} from './types';\n\n// Store types\nexport type {\n ViewerStore,\n ViewerStoreApi,\n AnnotationStore,\n AnnotationStoreApi,\n AnnotationState,\n AnnotationActions,\n AnnotationTool,\n ShapeType,\n SearchStore,\n SearchStoreApi,\n SearchActions,\n AgentStore,\n AgentStoreApi,\n StudentStore,\n StudentStoreApi,\n} from './store';\n\n// Hook types\nexport type {\n PDFViewerProviderProps,\n PDFViewerContextValue,\n UsePageNavigationOptions,\n UseZoomOptions,\n UseTextSelectionOptions,\n UseHighlightsOptions,\n UseHighlightsReturn,\n UseAnnotationsOptions,\n UseAnnotationsReturn,\n UseTouchGesturesOptions,\n UsePluginsOptions,\n UsePluginsReturn,\n UseAgentContextOptions,\n UseAgentContextReturn,\n UseAskAboutOptions,\n UseAskAboutReturn,\n UseBookmarksOptions,\n UseBookmarksReturn,\n UseQuickNotesOptions,\n UseQuickNotesReturn,\n UseStudentProgressOptions,\n UseStudentProgressReturn,\n} from './hooks';\n\n// Component types\nexport type {\n PDFPageProps,\n CanvasLayerProps,\n TextLayerProps,\n HighlightLayerProps,\n AnnotationLayerProps,\n FocusRegionLayerProps,\n ToolbarProps,\n MobileToolbarProps,\n SidebarProps,\n MobileSidebarProps,\n ThumbnailPanelProps,\n SearchPanelProps,\n OutlinePanelProps,\n HighlightsPanelProps,\n BookmarksPanelProps,\n TakeawaysPanelProps,\n DocumentContainerProps,\n VirtualizedDocumentContainerProps,\n ContinuousScrollContainerProps,\n DualPageContainerProps,\n SelectionToolbarProps,\n HighlightPopoverProps,\n AnnotationToolbarProps,\n StickyNoteProps,\n DrawingCanvasProps,\n ShapeRendererProps,\n ShapePreviewProps,\n QuickNoteButtonProps,\n QuickNotePopoverProps,\n AskAboutOverlayProps,\n AskAboutTriggerProps,\n MinimapProps,\n PDFErrorBoundaryProps,\n WithErrorBoundaryProps,\n} from './components';\n\n// Plugin types\nexport type { PluginManagerOptions } from './plugins';\n\n// Utils types\nexport type {\n LoadDocumentOptions,\n LoadDocumentResult,\n PDFViewerController,\n PDFViewerControllerOptions,\n ExportData,\n StoredStudentData,\n StudentData,\n AgentAPIStores,\n AgentAPIInstance,\n} from './utils';\n","export {\n PDFViewer,\n PDFViewerClient,\n DocumentContainer,\n VirtualizedDocumentContainer,\n ContinuousScrollContainer,\n DualPageContainer,\n} from './PDFViewer';\nexport { PDFPage, CanvasLayer, TextLayer, HighlightLayer, AnnotationLayer, FocusRegionLayer } from './PDFPage';\nexport { Toolbar, MobileToolbar } from './Toolbar';\nexport { Sidebar, MobileSidebar, ThumbnailPanel, SearchPanel, OutlinePanel, HighlightsPanel, BookmarksPanel, TakeawaysPanel } from './Sidebar';\nexport { SelectionToolbar } from './SelectionToolbar';\nexport { HighlightPopover } from './HighlightPopover';\nexport { AnnotationToolbar } from './AnnotationToolbar';\nexport { StickyNote, DrawingCanvas, ShapeRenderer, ShapePreview, QuickNoteButton, QuickNotePopover } from './Annotations';\nexport { AskAboutOverlay, AskAboutTrigger } from './AskAbout';\nexport { Minimap } from './Minimap';\nexport { PDFErrorBoundary, withErrorBoundary } from './ErrorBoundary';\n\n// Re-export types\nexport type { PDFPageProps, CanvasLayerProps, TextLayerProps, HighlightLayerProps, AnnotationLayerProps, FocusRegionLayerProps } from './PDFPage';\nexport type { ToolbarProps, MobileToolbarProps } from './Toolbar';\nexport type { SidebarProps, MobileSidebarProps, ThumbnailPanelProps, SearchPanelProps, OutlinePanelProps, HighlightsPanelProps, BookmarksPanelProps, TakeawaysPanelProps } from './Sidebar';\nexport type {\n DocumentContainerProps,\n VirtualizedDocumentContainerProps,\n ContinuousScrollContainerProps,\n DualPageContainerProps,\n} from './PDFViewer';\nexport type { SelectionToolbarProps } from './SelectionToolbar';\nexport type { HighlightPopoverProps } from './HighlightPopover';\nexport type { AnnotationToolbarProps } from './AnnotationToolbar';\nexport type { StickyNoteProps, DrawingCanvasProps, ShapeRendererProps, ShapePreviewProps, QuickNoteButtonProps, QuickNotePopoverProps } from './Annotations';\nexport type { AskAboutOverlayProps, AskAboutTriggerProps } from './AskAbout';\nexport type { MinimapProps } from './Minimap';\nexport type { PDFErrorBoundaryProps, WithErrorBoundaryProps } from './ErrorBoundary';\n","import { memo, useState, useRef, useEffect, useCallback, KeyboardEvent } from 'react';\nimport type { NoteAnnotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface StickyNoteProps {\n note: NoteAnnotation;\n scale: number;\n isSelected?: boolean;\n isEditing?: boolean;\n onSelect?: () => void;\n onUpdate?: (updates: Partial<NoteAnnotation>) => void;\n onDelete?: () => void;\n onStartEdit?: () => void;\n onEndEdit?: () => void;\n onDragStart?: (e: React.MouseEvent | React.TouchEvent) => void;\n className?: string;\n}\n\nconst NOTE_COLORS = [\n '#fef08a', // yellow\n '#bbf7d0', // green\n '#bfdbfe', // blue\n '#fbcfe8', // pink\n '#fed7aa', // orange\n];\n\nexport const StickyNote = memo(function StickyNote({\n note,\n scale,\n isSelected,\n isEditing,\n onSelect,\n onUpdate,\n onDelete,\n onStartEdit,\n onEndEdit,\n onDragStart,\n className,\n}: StickyNoteProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [localContent, setLocalContent] = useState(note.content);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const noteRef = useRef<HTMLDivElement>(null);\n\n // Update local content when note changes\n useEffect(() => {\n setLocalContent(note.content);\n }, [note.content]);\n\n // Focus textarea when editing starts\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n }\n }, [isEditing]);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n onSelect?.();\n if (!isExpanded) {\n setIsExpanded(true);\n }\n }, [isExpanded, onSelect]);\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n onStartEdit?.();\n }, [onStartEdit]);\n\n const handleBlur = useCallback(() => {\n if (isEditing && localContent !== note.content) {\n onUpdate?.({ content: localContent });\n }\n onEndEdit?.();\n }, [isEditing, localContent, note.content, onUpdate, onEndEdit]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n setLocalContent(note.content);\n onEndEdit?.();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleBlur();\n }\n }, [note.content, onEndEdit, handleBlur]);\n\n const handleColorChange = useCallback((color: string) => {\n onUpdate?.({ color });\n }, [onUpdate]);\n\n const handleCollapse = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsExpanded(false);\n onEndEdit?.();\n }, [onEndEdit]);\n\n // Collapsed note icon\n if (!isExpanded) {\n return (\n <div\n ref={noteRef}\n className={cn(\n 'absolute cursor-pointer transition-transform hover:scale-110',\n 'w-6 h-6 rounded-sm shadow-md',\n 'flex items-center justify-center',\n isSelected && 'ring-2 ring-blue-500 ring-offset-1',\n className\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n zIndex: isSelected ? 60 : 55,\n }}\n onClick={handleClick}\n onMouseDown={onDragStart}\n onTouchStart={onDragStart}\n title={note.content || 'Empty note'}\n >\n <svg\n className=\"w-4 h-4 opacity-70\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n style={{ color: '#333' }}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n );\n }\n\n // Expanded note\n return (\n <div\n ref={noteRef}\n className={cn(\n 'absolute rounded shadow-lg transition-shadow',\n 'min-w-[180px] max-w-[280px]',\n isSelected && 'ring-2 ring-blue-500',\n className\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n zIndex: isSelected ? 60 : 55,\n }}\n onClick={handleClick}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-2 py-1 border-b border-black/10 cursor-move\"\n onMouseDown={onDragStart}\n onTouchStart={onDragStart}\n >\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {NOTE_COLORS.map((color) => (\n <button\n key={color}\n className={cn(\n 'w-4 h-4 rounded-full border border-black/20',\n 'hover:scale-110 transition-transform',\n note.color === color && 'ring-1 ring-black/30'\n )}\n style={{ backgroundColor: color }}\n onClick={(e) => {\n e.stopPropagation();\n handleColorChange(color);\n }}\n title={`Change to ${color}`}\n />\n ))}\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-1\">\n <button\n className=\"p-0.5 hover:bg-black/10 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n title=\"Delete note\"\n >\n <svg className=\"w-3.5 h-3.5 text-gray-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n <button\n className=\"p-0.5 hover:bg-black/10 rounded\"\n onClick={handleCollapse}\n title=\"Collapse note\"\n >\n <svg className=\"w-3.5 h-3.5 text-gray-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-2\">\n {isEditing ? (\n <textarea\n ref={textareaRef}\n className={cn(\n 'w-full min-h-[60px] resize-none bg-transparent',\n 'text-sm text-gray-800 placeholder-gray-500',\n 'border-none outline-none focus:ring-0'\n )}\n value={localContent}\n onChange={(e) => setLocalContent(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter note...\"\n />\n ) : (\n <div\n className={cn(\n 'text-sm text-gray-800 whitespace-pre-wrap min-h-[40px]',\n !note.content && 'text-gray-500 italic'\n )}\n onDoubleClick={handleDoubleClick}\n >\n {note.content || 'Double-click to edit...'}\n </div>\n )}\n </div>\n\n {/* Timestamp */}\n <div className=\"px-2 pb-1 text-[10px] text-gray-500\">\n {new Date(note.updatedAt).toLocaleDateString()}\n </div>\n </div>\n );\n});\n","import { memo, useRef, useCallback, useState } from 'react';\nimport type { DrawingPath } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface DrawingCanvasProps {\n width: number;\n height: number;\n scale: number;\n color?: string;\n strokeWidth?: number;\n isActive?: boolean;\n onDrawingComplete?: (path: DrawingPath) => void;\n className?: string;\n}\n\n// Convert points to SVG path string\nfunction pointsToSvgPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const p = points[0];\n return `M ${p.x} ${p.y} L ${p.x} ${p.y}`;\n }\n\n // Use quadratic bezier curves for smoother lines\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 1; i < points.length - 1; i++) {\n const p1 = points[i];\n const p2 = points[i + 1];\n\n // Calculate control point as midpoint\n const midX = (p1.x + p2.x) / 2;\n const midY = (p1.y + p2.y) / 2;\n\n // Quadratic curve to the midpoint using p1 as control point\n path += ` Q ${p1.x} ${p1.y} ${midX} ${midY}`;\n }\n\n // Line to the last point\n if (points.length > 1) {\n const lastPoint = points[points.length - 1];\n path += ` L ${lastPoint.x} ${lastPoint.y}`;\n }\n\n return path;\n}\n\n// Simplify path by removing redundant points\nfunction simplifyPath(\n points: { x: number; y: number }[],\n tolerance: number = 1\n): { x: number; y: number }[] {\n if (points.length < 3) return points;\n\n const result: { x: number; y: number }[] = [points[0]];\n let lastAdded = points[0];\n\n for (let i = 1; i < points.length - 1; i++) {\n const point = points[i];\n const dx = point.x - lastAdded.x;\n const dy = point.y - lastAdded.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist >= tolerance) {\n result.push(point);\n lastAdded = point;\n }\n }\n\n // Always add the last point\n result.push(points[points.length - 1]);\n return result;\n}\n\nexport const DrawingCanvas = memo(function DrawingCanvas({\n width,\n height,\n scale,\n color = '#ef4444',\n strokeWidth = 2,\n isActive = false,\n onDrawingComplete,\n className,\n}: DrawingCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [currentPath, setCurrentPath] = useState<{ x: number; y: number }[]>([]);\n\n const getPoint = useCallback((e: React.MouseEvent | React.TouchEvent): { x: number; y: number } | null => {\n if (!svgRef.current) return null;\n\n const svg = svgRef.current;\n const rect = svg.getBoundingClientRect();\n\n let clientX: number;\n let clientY: number;\n\n if ('touches' in e) {\n const touch = e.touches[0];\n if (!touch) return null;\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n clientX = e.clientX;\n clientY = e.clientY;\n }\n\n return {\n x: (clientX - rect.left) / scale,\n y: (clientY - rect.top) / scale,\n };\n }, [scale]);\n\n const handleStart = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isActive) return;\n\n const point = getPoint(e);\n if (point) {\n setIsDrawing(true);\n setCurrentPath([point]);\n }\n }, [isActive, getPoint]);\n\n const handleMove = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isDrawing || !isActive) return;\n\n const point = getPoint(e);\n if (point) {\n setCurrentPath(prev => [...prev, point]);\n }\n }, [isDrawing, isActive, getPoint]);\n\n const handleEnd = useCallback(() => {\n if (!isDrawing) return;\n\n setIsDrawing(false);\n\n if (currentPath.length >= 2) {\n const simplifiedPoints = simplifyPath(currentPath, 2);\n onDrawingComplete?.({ points: simplifiedPoints });\n }\n\n setCurrentPath([]);\n }, [isDrawing, currentPath, onDrawingComplete]);\n\n return (\n <svg\n ref={svgRef}\n className={cn(\n 'drawing-canvas',\n isActive && 'cursor-crosshair',\n className\n )}\n width={width * scale}\n height={height * scale}\n viewBox={`0 0 ${width} ${height}`}\n style={{ touchAction: isActive ? 'none' : 'auto' }}\n onMouseDown={handleStart}\n onMouseMove={handleMove}\n onMouseUp={handleEnd}\n onMouseLeave={handleEnd}\n onTouchStart={handleStart}\n onTouchMove={handleMove}\n onTouchEnd={handleEnd}\n >\n {/* Current drawing path preview */}\n {isDrawing && currentPath.length > 0 && (\n <path\n d={pointsToSvgPath(currentPath)}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.8}\n />\n )}\n </svg>\n );\n});\n\n// Export helper functions for reuse\nexport { pointsToSvgPath, simplifyPath };\n","import { memo, useCallback, useState, useRef } from 'react';\nimport type { ShapeAnnotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface ShapeRendererProps {\n shape: ShapeAnnotation;\n scale: number;\n isSelected?: boolean;\n isEditing?: boolean;\n onSelect?: () => void;\n onUpdate?: (updates: Partial<ShapeAnnotation>) => void;\n onDelete?: () => void;\n className?: string;\n}\n\ninterface ResizeHandle {\n position: 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n cursor: string;\n x: number;\n y: number;\n}\n\nexport const ShapeRenderer = memo(function ShapeRenderer({\n shape,\n scale,\n isSelected,\n isEditing,\n onSelect,\n onUpdate,\n onDelete: _onDelete,\n className,\n}: ShapeRendererProps) {\n const [_isDragging, setIsDragging] = useState(false);\n const [_isResizing, setIsResizing] = useState(false);\n const [activeHandle, setActiveHandle] = useState<string | null>(null);\n const startPosRef = useRef({ x: 0, y: 0 });\n const startShapeRef = useRef({ x: 0, y: 0, width: 0, height: 0 });\n\n const { shapeType, x, y, width, height, color, strokeWidth, id: _id } = shape;\n const scaledX = x * scale;\n const scaledY = y * scale;\n const scaledWidth = width * scale;\n const scaledHeight = height * scale;\n const scaledStroke = strokeWidth * scale;\n\n // Calculate resize handles positions\n const getResizeHandles = useCallback((): ResizeHandle[] => {\n const handleSize = 8;\n const half = handleSize / 2;\n\n return [\n { position: 'nw', cursor: 'nwse-resize', x: scaledX - half, y: scaledY - half },\n { position: 'n', cursor: 'ns-resize', x: scaledX + scaledWidth / 2 - half, y: scaledY - half },\n { position: 'ne', cursor: 'nesw-resize', x: scaledX + scaledWidth - half, y: scaledY - half },\n { position: 'e', cursor: 'ew-resize', x: scaledX + scaledWidth - half, y: scaledY + scaledHeight / 2 - half },\n { position: 'se', cursor: 'nwse-resize', x: scaledX + scaledWidth - half, y: scaledY + scaledHeight - half },\n { position: 's', cursor: 'ns-resize', x: scaledX + scaledWidth / 2 - half, y: scaledY + scaledHeight - half },\n { position: 'sw', cursor: 'nesw-resize', x: scaledX - half, y: scaledY + scaledHeight - half },\n { position: 'w', cursor: 'ew-resize', x: scaledX - half, y: scaledY + scaledHeight / 2 - half },\n ];\n }, [scaledX, scaledY, scaledWidth, scaledHeight]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent, handle?: string) => {\n e.stopPropagation();\n onSelect?.();\n\n if (!isEditing) return;\n\n startPosRef.current = { x: e.clientX, y: e.clientY };\n startShapeRef.current = { x, y, width, height };\n\n if (handle) {\n setIsResizing(true);\n setActiveHandle(handle);\n } else {\n setIsDragging(true);\n }\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const dx = (moveEvent.clientX - startPosRef.current.x) / scale;\n const dy = (moveEvent.clientY - startPosRef.current.y) / scale;\n\n if (handle) {\n // Resizing\n let newX = startShapeRef.current.x;\n let newY = startShapeRef.current.y;\n let newWidth = startShapeRef.current.width;\n let newHeight = startShapeRef.current.height;\n\n switch (handle) {\n case 'nw':\n newX += dx;\n newY += dy;\n newWidth -= dx;\n newHeight -= dy;\n break;\n case 'n':\n newY += dy;\n newHeight -= dy;\n break;\n case 'ne':\n newY += dy;\n newWidth += dx;\n newHeight -= dy;\n break;\n case 'e':\n newWidth += dx;\n break;\n case 'se':\n newWidth += dx;\n newHeight += dy;\n break;\n case 's':\n newHeight += dy;\n break;\n case 'sw':\n newX += dx;\n newWidth -= dx;\n newHeight += dy;\n break;\n case 'w':\n newX += dx;\n newWidth -= dx;\n break;\n }\n\n // Ensure minimum size\n if (newWidth >= 10 && newHeight >= 10) {\n onUpdate?.({ x: newX, y: newY, width: newWidth, height: newHeight });\n }\n } else {\n // Dragging\n onUpdate?.({\n x: startShapeRef.current.x + dx,\n y: startShapeRef.current.y + dy,\n });\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n setIsResizing(false);\n setActiveHandle(null);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [isEditing, x, y, width, height, scale, onSelect, onUpdate]);\n\n const renderShape = useCallback(() => {\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n className: cn(\n 'cursor-pointer transition-opacity',\n isSelected && 'filter drop-shadow-sm'\n ),\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect\n x={scaledX}\n y={scaledY}\n width={scaledWidth}\n height={scaledHeight}\n {...commonProps}\n />\n );\n\n case 'circle':\n return (\n <ellipse\n cx={scaledX + scaledWidth / 2}\n cy={scaledY + scaledHeight / 2}\n rx={scaledWidth / 2}\n ry={scaledHeight / 2}\n {...commonProps}\n />\n );\n\n case 'line':\n return (\n <line\n x1={scaledX}\n y1={scaledY}\n x2={scaledX + scaledWidth}\n y2={scaledY + scaledHeight}\n {...commonProps}\n />\n );\n\n case 'arrow':\n const endX = scaledX + scaledWidth;\n const endY = scaledY + scaledHeight;\n const angle = Math.atan2(scaledHeight, scaledWidth);\n const arrowLength = Math.min(15, Math.sqrt(scaledWidth * scaledWidth + scaledHeight * scaledHeight) * 0.2);\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g>\n <line x1={scaledX} y1={scaledY} x2={endX} y2={endY} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow1X} y2={arrow1Y} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow2X} y2={arrow2Y} {...commonProps} />\n </g>\n );\n\n default:\n return null;\n }\n }, [shapeType, scaledX, scaledY, scaledWidth, scaledHeight, color, scaledStroke, isSelected]);\n\n return (\n <g\n className={cn('shape-renderer', className)}\n onMouseDown={(e) => handleMouseDown(e)}\n >\n {/* Hit area for selection (invisible, larger) */}\n <rect\n x={scaledX - 5}\n y={scaledY - 5}\n width={scaledWidth + 10}\n height={scaledHeight + 10}\n fill=\"transparent\"\n stroke=\"none\"\n className=\"cursor-pointer\"\n />\n\n {/* The actual shape */}\n {renderShape()}\n\n {/* Selection outline */}\n {isSelected && (\n <rect\n x={scaledX - 2}\n y={scaledY - 2}\n width={scaledWidth + 4}\n height={scaledHeight + 4}\n fill=\"none\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n )}\n\n {/* Resize handles when editing */}\n {isSelected && isEditing && getResizeHandles().map((handle) => (\n <rect\n key={handle.position}\n x={handle.x}\n y={handle.y}\n width={8}\n height={8}\n fill=\"white\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n className={cn('cursor-pointer', activeHandle === handle.position && 'fill-blue-500')}\n style={{ cursor: handle.cursor }}\n onMouseDown={(e) => handleMouseDown(e, handle.position)}\n />\n ))}\n </g>\n );\n});\n\n// Shape preview component for drawing new shapes\nexport interface ShapePreviewProps {\n shapeType: 'rect' | 'circle' | 'arrow' | 'line';\n startPoint: { x: number; y: number };\n endPoint: { x: number; y: number };\n scale: number;\n color: string;\n strokeWidth: number;\n}\n\nexport const ShapePreview = memo(function ShapePreview({\n shapeType,\n startPoint,\n endPoint,\n scale,\n color,\n strokeWidth,\n}: ShapePreviewProps) {\n const x = Math.min(startPoint.x, endPoint.x) * scale;\n const y = Math.min(startPoint.y, endPoint.y) * scale;\n const width = Math.abs(endPoint.x - startPoint.x) * scale;\n const height = Math.abs(endPoint.y - startPoint.y) * scale;\n const scaledStroke = strokeWidth * scale;\n\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n opacity: 0.7,\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect x={x} y={y} width={width} height={height} {...commonProps} />\n );\n\n case 'circle':\n return (\n <ellipse\n cx={x + width / 2}\n cy={y + height / 2}\n rx={width / 2}\n ry={height / 2}\n {...commonProps}\n />\n );\n\n case 'line':\n return (\n <line\n x1={startPoint.x * scale}\n y1={startPoint.y * scale}\n x2={endPoint.x * scale}\n y2={endPoint.y * scale}\n {...commonProps}\n />\n );\n\n case 'arrow':\n const endX = endPoint.x * scale;\n const endY = endPoint.y * scale;\n const dx = endPoint.x - startPoint.x;\n const dy = endPoint.y - startPoint.y;\n const angle = Math.atan2(dy, dx);\n const arrowLength = Math.min(15, Math.sqrt(width * width + height * height) * 0.2);\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g>\n <line\n x1={startPoint.x * scale}\n y1={startPoint.y * scale}\n x2={endX}\n y2={endY}\n {...commonProps}\n />\n <line x1={endX} y1={endY} x2={arrow1X} y2={arrow1Y} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow2X} y2={arrow2Y} {...commonProps} />\n </g>\n );\n\n default:\n return null;\n }\n});\n","import { memo, useCallback, useState } from 'react';\nimport { cn } from '../../utils';\n\nexport interface QuickNoteButtonProps {\n /** Page number this button is for */\n pageNumber: number;\n /** Scale of the page */\n scale: number;\n /** Position of the button (relative to page) */\n position?: 'top-right' | 'bottom-right';\n /** Callback when button is clicked */\n onClick: (pageNumber: number, x: number, y: number) => void;\n /** Custom className */\n className?: string;\n /** Whether the button is visible */\n visible?: boolean;\n}\n\n/**\n * Floating button on each page to quickly add a note.\n */\nexport const QuickNoteButton = memo(function QuickNoteButton({\n pageNumber,\n scale,\n position = 'top-right',\n onClick,\n className,\n visible = true,\n}: QuickNoteButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n // Default position near button (based on button position)\n const x = position === 'top-right' ? 80 : 80;\n const y = position === 'top-right' ? 20 : 80;\n onClick(pageNumber, x / scale, y / scale);\n },\n [pageNumber, onClick, position, scale]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <button\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={cn(\n 'quick-note-button',\n 'absolute z-50',\n 'w-8 h-8 rounded-full',\n 'bg-yellow-400 hover:bg-yellow-500',\n 'shadow-md hover:shadow-lg',\n 'flex items-center justify-center',\n 'transition-all duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:ring-offset-2',\n isHovered && 'scale-110',\n position === 'top-right' && 'top-3 right-3',\n position === 'bottom-right' && 'bottom-3 right-3',\n className\n )}\n title=\"Add quick note\"\n aria-label=\"Add quick note\"\n >\n <svg\n className=\"w-4 h-4 text-yellow-900\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n );\n});\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\n\nexport interface QuickNotePopoverProps {\n /** Whether the popover is visible */\n visible: boolean;\n /** Position of the popover */\n position: { x: number; y: number };\n /** Initial content */\n initialContent?: string;\n /** Agent's last statement to display */\n agentLastStatement?: string;\n /** Callback when note is saved */\n onSave: (content: string) => void;\n /** Callback when cancelled */\n onCancel: () => void;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Popover for entering quick note content.\n */\nexport const QuickNotePopover = memo(function QuickNotePopover({\n visible,\n position,\n initialContent = '',\n agentLastStatement,\n onSave,\n onCancel,\n className,\n}: QuickNotePopoverProps) {\n const [content, setContent] = useState(initialContent);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const [adjustedPosition, setAdjustedPosition] = useState(position);\n\n // Focus textarea when visible\n useEffect(() => {\n if (visible && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [visible]);\n\n // Reset content when opening\n useEffect(() => {\n if (visible) {\n setContent(initialContent);\n }\n }, [visible, initialContent]);\n\n // Adjust position to stay within viewport\n useEffect(() => {\n if (!visible || !popoverRef.current) return;\n\n const rect = popoverRef.current.getBoundingClientRect();\n const padding = 10;\n let { x, y } = position;\n\n // Adjust horizontal position\n if (x + rect.width > window.innerWidth - padding) {\n x = window.innerWidth - rect.width - padding;\n }\n if (x < padding) {\n x = padding;\n }\n\n // Adjust vertical position\n if (y + rect.height > window.innerHeight - padding) {\n y = window.innerHeight - rect.height - padding;\n }\n if (y < padding) {\n y = padding;\n }\n\n setAdjustedPosition({ x, y });\n }, [position, visible]);\n\n const handleSave = useCallback(() => {\n if (content.trim()) {\n onSave(content.trim());\n } else {\n onCancel();\n }\n }, [content, onSave, onCancel]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleSave();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n },\n [handleSave, onCancel]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n ref={popoverRef}\n className={cn(\n 'quick-note-popover',\n 'fixed z-[9999]',\n 'bg-yellow-50 dark:bg-yellow-900/90',\n 'rounded-lg shadow-xl',\n 'border border-yellow-200 dark:border-yellow-700',\n 'p-3 w-72',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n }}\n >\n {/* Agent context hint */}\n {agentLastStatement && (\n <div className=\"mb-2 p-2 bg-blue-50 dark:bg-blue-900/50 rounded text-xs text-blue-600 dark:text-blue-300 border border-blue-100 dark:border-blue-800\">\n <div className=\"flex items-start gap-1\">\n <svg className=\"w-3 h-3 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n </svg>\n <span className=\"line-clamp-2\">AI discussed: &ldquo;{agentLastStatement}&rdquo;</span>\n </div>\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Write your note...\"\n className={cn(\n 'w-full h-24 px-2 py-1.5 rounded',\n 'bg-white dark:bg-gray-800',\n 'border border-yellow-200 dark:border-yellow-700',\n 'text-gray-900 dark:text-white text-sm',\n 'placeholder:text-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500',\n 'resize-none'\n )}\n />\n\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to save\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onCancel}\n className={cn(\n 'px-3 py-1 rounded text-sm',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!content.trim()}\n className={cn(\n 'px-3 py-1 rounded text-sm font-medium',\n 'bg-yellow-500 text-yellow-900',\n 'hover:bg-yellow-600',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n});\n","import { memo } from 'react';\nimport { cn } from '../../utils';\n\nexport interface AskAboutOverlayProps {\n /** Whether the overlay is visible */\n visible: boolean;\n /** Progress of the long press (0-1) */\n progress: number;\n /** Position of the overlay */\n position: { x: number; y: number } | null;\n /** Size of the progress indicator */\n size?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Visual feedback overlay shown during long-press for \"Ask About This\" feature.\n * Displays a circular progress indicator.\n */\nexport const AskAboutOverlay = memo(function AskAboutOverlay({\n visible,\n progress,\n position,\n size = 60,\n className,\n}: AskAboutOverlayProps) {\n if (!visible || !position) {\n return null;\n }\n\n const strokeWidth = 4;\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference * (1 - progress);\n\n return (\n <div\n className={cn(\n 'ask-about-overlay',\n 'fixed pointer-events-none z-[9999]',\n className\n )}\n style={{\n left: position.x - size / 2,\n top: position.y - size / 2,\n }}\n >\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n className=\"transform -rotate-90\"\n >\n {/* Background circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"rgba(0, 0, 0, 0.3)\"\n stroke=\"rgba(255, 255, 255, 0.3)\"\n strokeWidth={strokeWidth}\n />\n {/* Progress circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"#3b82f6\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className=\"transition-[stroke-dashoffset] duration-75 ease-linear\"\n />\n </svg>\n {/* Center icon */}\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{ color: progress >= 1 ? '#22c55e' : 'white' }}\n >\n {progress >= 1 ? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\n\nexport interface AskAboutTriggerProps {\n /** Position to display the trigger */\n position: { x: number; y: number };\n /** Callback when ask about is confirmed */\n onConfirm: () => void;\n /** Callback when cancelled */\n onCancel: () => void;\n /** Whether to show the trigger */\n visible: boolean;\n /** Auto-hide delay in ms (0 = no auto-hide) */\n autoHideDelay?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Confirmation UI shown after long-press completes.\n * Provides buttons to confirm or cancel the \"Ask About This\" action.\n */\nexport const AskAboutTrigger = memo(function AskAboutTrigger({\n position,\n onConfirm,\n onCancel,\n visible,\n autoHideDelay = 5000,\n className,\n}: AskAboutTriggerProps) {\n const [adjustedPosition, setAdjustedPosition] = useState(position);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n // Adjust position to stay within viewport\n useEffect(() => {\n if (!visible || !triggerRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n const padding = 10;\n let { x, y } = position;\n\n // Adjust horizontal position\n if (x + rect.width / 2 > window.innerWidth - padding) {\n x = window.innerWidth - rect.width / 2 - padding;\n }\n if (x - rect.width / 2 < padding) {\n x = rect.width / 2 + padding;\n }\n\n // Adjust vertical position (show above if too close to bottom)\n if (y + rect.height > window.innerHeight - padding) {\n y = position.y - rect.height - 20;\n }\n\n setAdjustedPosition({ x, y });\n }, [position, visible]);\n\n // Auto-hide after delay\n useEffect(() => {\n if (!visible || autoHideDelay === 0) return;\n\n const timer = setTimeout(onCancel, autoHideDelay);\n return () => clearTimeout(timer);\n }, [visible, autoHideDelay, onCancel]);\n\n const handleConfirm = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onConfirm();\n },\n [onConfirm]\n );\n\n const handleCancel = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onCancel();\n },\n [onCancel]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n ref={triggerRef}\n className={cn(\n 'ask-about-trigger',\n 'fixed z-[9999]',\n 'bg-white dark:bg-gray-800 rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'p-2 flex items-center gap-2',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n transform: 'translate(-50%, 0)',\n }}\n >\n <span className=\"text-sm text-gray-600 dark:text-gray-300 px-2\">\n Ask about this?\n </span>\n <button\n onClick={handleConfirm}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium',\n 'bg-blue-500 text-white hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Ask\n </button>\n <button\n onClick={handleCancel}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Cancel\n </button>\n </div>\n );\n});\n","import { memo, useMemo, useCallback } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface MinimapProps {\n /** Display variant */\n variant?: 'sidebar' | 'floating';\n /** Position for floating variant */\n floatingPosition?: 'left' | 'right';\n /** Maximum height in pixels */\n maxHeight?: number;\n /** Whether to show page numbers */\n showPageNumbers?: boolean;\n /** Callback when a page is clicked */\n onPageClick?: (pageNumber: number) => void;\n /** Custom className */\n className?: string;\n}\n\ntype PageStatus = 'current' | 'visited' | 'bookmarked' | 'unvisited';\n\ninterface PageIndicatorProps {\n pageNumber: number;\n status: PageStatus;\n isBookmarked: boolean;\n onClick: () => void;\n showNumber: boolean;\n compact: boolean;\n}\n\nconst PageIndicator = memo(function PageIndicator({\n pageNumber,\n status,\n isBookmarked,\n onClick,\n showNumber,\n compact,\n}: PageIndicatorProps) {\n const getStatusColor = () => {\n if (status === 'current') return 'bg-blue-500';\n if (isBookmarked) return 'bg-yellow-400';\n if (status === 'visited') return 'bg-green-400';\n return 'bg-gray-200 dark:bg-gray-700';\n };\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'minimap-page-indicator',\n 'relative rounded-sm transition-all duration-150',\n 'hover:ring-2 hover:ring-blue-300 hover:ring-offset-1',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n compact ? 'w-2 h-3' : 'w-4 h-5',\n getStatusColor(),\n status === 'current' && 'ring-2 ring-blue-600 ring-offset-1'\n )}\n title={`Page ${pageNumber}${isBookmarked ? ' (bookmarked)' : ''}`}\n aria-label={`Go to page ${pageNumber}`}\n >\n {isBookmarked && !compact && (\n <div className=\"absolute -top-1 -right-1 w-2 h-2 bg-yellow-500 rounded-full border border-white\" />\n )}\n {showNumber && !compact && (\n <span className=\"absolute inset-0 flex items-center justify-center text-[8px] font-medium text-white\">\n {pageNumber}\n </span>\n )}\n </button>\n );\n});\n\n/**\n * Visual minimap showing reading progress and navigation.\n */\nexport const Minimap = memo(function Minimap({\n variant = 'sidebar',\n floatingPosition = 'right',\n maxHeight = 300,\n showPageNumbers = false,\n onPageClick,\n className,\n}: MinimapProps) {\n // Store state\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n // Create set of bookmarked pages for quick lookup\n const bookmarkedPages = useMemo(() => {\n return new Set(bookmarks.map((b) => b.pageNumber));\n }, [bookmarks]);\n\n // Determine if we should use compact mode based on page count\n const compact = numPages > 50;\n\n const handlePageClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n onPageClick?.(pageNumber);\n },\n [goToPage, onPageClick]\n );\n\n const getPageStatus = useCallback(\n (pageNumber: number): PageStatus => {\n if (pageNumber === currentPage) return 'current';\n if (bookmarkedPages.has(pageNumber)) return 'bookmarked';\n if (visitedPages.has(pageNumber)) return 'visited';\n return 'unvisited';\n },\n [currentPage, visitedPages, bookmarkedPages]\n );\n\n // Generate page indicators\n const pageIndicators = useMemo(() => {\n const pages = [];\n for (let i = 1; i <= numPages; i++) {\n pages.push(\n <PageIndicator\n key={i}\n pageNumber={i}\n status={getPageStatus(i)}\n isBookmarked={bookmarkedPages.has(i)}\n onClick={() => handlePageClick(i)}\n showNumber={showPageNumbers}\n compact={compact}\n />\n );\n }\n return pages;\n }, [numPages, getPageStatus, bookmarkedPages, handlePageClick, showPageNumbers, compact]);\n\n // Progress stats\n const visitedCount = visitedPages.size;\n const progressPercentage = numPages > 0 ? Math.round((visitedCount / numPages) * 100) : 0;\n\n if (numPages === 0) {\n return null;\n }\n\n const content = (\n <>\n {/* Progress bar */}\n <div className=\"mb-3\">\n <div className=\"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400 mb-1\">\n <span>Progress</span>\n <span>{progressPercentage}%</span>\n </div>\n <div className=\"h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-green-500 rounded-full transition-all duration-300\"\n style={{ width: `${progressPercentage}%` }}\n />\n </div>\n </div>\n\n {/* Page indicators */}\n <div\n className={cn(\n 'flex flex-wrap gap-1 overflow-y-auto',\n compact ? 'gap-0.5' : 'gap-1'\n )}\n style={{ maxHeight: maxHeight - 60 }}\n >\n {pageIndicators}\n </div>\n\n {/* Legend */}\n <div className=\"mt-3 pt-2 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"flex flex-wrap gap-3 text-xs text-gray-500 dark:text-gray-400\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-blue-500\" />\n <span>Current</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-green-400\" />\n <span>Visited</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-yellow-400\" />\n <span>Bookmarked</span>\n </div>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n {visitedCount} of {numPages} pages visited\n </div>\n </>\n );\n\n if (variant === 'floating') {\n return (\n <div\n className={cn(\n 'minimap minimap-floating',\n 'fixed z-40',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'p-3 w-48',\n floatingPosition === 'right' ? 'right-4' : 'left-4',\n 'top-1/2 -translate-y-1/2',\n className\n )}\n style={{ maxHeight }}\n >\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2\">\n Reading Progress\n </h3>\n {content}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'minimap minimap-sidebar',\n 'p-3',\n className\n )}\n style={{ maxHeight }}\n >\n {content}\n </div>\n );\n});\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { cn } from '../../utils';\n\nexport interface PDFErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Whether to show the default error UI */\n showDefaultUI?: boolean;\n className?: string;\n}\n\ninterface PDFErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class PDFErrorBoundary extends Component<PDFErrorBoundaryProps, PDFErrorBoundaryState> {\n constructor(props: PDFErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): PDFErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n\n // Log to console for debugging\n console.error('PDFErrorBoundary caught an error:', error);\n console.error('Component stack:', errorInfo.componentStack);\n }\n\n handleReset = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback, showDefaultUI = true, className } = this.props;\n\n if (hasError && error) {\n // Custom fallback UI\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, this.handleReset);\n }\n return fallback;\n }\n\n // Default error UI\n if (showDefaultUI) {\n return (\n <DefaultErrorUI\n error={error}\n onReset={this.handleReset}\n className={className}\n />\n );\n }\n\n // No UI - return null\n return null;\n }\n\n return children;\n }\n}\n\ninterface DefaultErrorUIProps {\n error: Error;\n onReset: () => void;\n className?: string;\n}\n\nfunction DefaultErrorUI({ error, onReset, className }: DefaultErrorUIProps) {\n const isPDFError = error.message.includes('PDF') || error.message.includes('pdf');\n const isNetworkError =\n error.message.includes('fetch') ||\n error.message.includes('network') ||\n error.message.includes('Failed to load');\n\n let title = 'Something went wrong';\n let description = error.message;\n let icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n );\n\n if (isPDFError) {\n title = 'Unable to load PDF';\n description = 'The PDF file could not be loaded. It may be corrupted or in an unsupported format.';\n icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n );\n } else if (isNetworkError) {\n title = 'Network error';\n description = 'Unable to fetch the PDF file. Please check your internet connection and try again.';\n icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M18.364 5.636a9 9 0 010 12.728m0 0l-2.829-2.829m2.829 2.829L21 21M15.536 8.464a5 5 0 010 7.072m0 0l-2.829-2.829m-4.243 2.829a4.978 4.978 0 01-1.414-2.83m-1.414 5.658a9 9 0 01-2.167-9.238m7.824 2.167a1 1 0 111.414 1.414m-1.414-1.414L3 3m8.293 8.293l1.414 1.414\"\n />\n </svg>\n );\n }\n\n return (\n <div\n className={cn(\n 'pdf-error-boundary',\n 'flex flex-col items-center justify-center',\n 'min-h-[300px] p-8',\n 'bg-gray-50 dark:bg-gray-900',\n 'text-center',\n className\n )}\n >\n {icon}\n\n <h2 className=\"mt-4 text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h2>\n\n <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400 max-w-md\">\n {description}\n </p>\n\n <details className=\"mt-4 text-left max-w-md w-full\">\n <summary className=\"cursor-pointer text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\">\n Technical details\n </summary>\n <pre className=\"mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded text-xs overflow-auto\">\n {error.stack || error.message}\n </pre>\n </details>\n\n <div className=\"mt-6 flex gap-3\">\n <button\n onClick={onReset}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium',\n 'bg-blue-600 text-white',\n 'hover:bg-blue-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Try again\n </button>\n\n <button\n onClick={() => window.location.reload()}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium',\n 'bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-200',\n 'hover:bg-gray-300 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Reload page\n </button>\n </div>\n </div>\n );\n}\n\n// Helper component for wrapping PDF viewers with error boundary\nexport interface WithErrorBoundaryProps extends Omit<PDFErrorBoundaryProps, 'children'> {\n component: ReactNode;\n}\n\nexport function withErrorBoundary({ component, ...props }: WithErrorBoundaryProps): ReactNode {\n return <PDFErrorBoundary {...props}>{component}</PDFErrorBoundary>;\n}\n","export {\n PluginManager,\n getPluginManager,\n createPluginManager,\n type PluginManagerOptions,\n} from './PluginManager';\n"],"mappings":"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","names":["version","document","document","initialState","import_vanilla","init_PDFViewer","isStorageAvailable","getStorageKey","STORAGE_PREFIX","focusRegionIdCounter","generateFocusRegionId","initialState","document","import_vanilla","initialState","import_vanilla","generateId","isStorageAvailable","getStorageKey","STORAGE_PREFIX","initialState","import_vanilla","initialState","import_react","document","import_react","numPages","import_react","import_react","import_react","import_react","options","import_react","import_react","getPluginManager","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","Toolbar","import_react","import_jsx_runtime","MobileToolbar","init_Toolbar","import_react","import_jsx_runtime","Thumbnail","document","ThumbnailPanel","import_react","import_jsx_runtime","SearchPanel","import_react","import_jsx_runtime","OutlineNode","OutlinePanel","document","import_react","import_jsx_runtime","HighlightItem","PageGroup","HighlightsPanel","import_react","import_jsx_runtime","SidebarTab","Sidebar","import_react","import_jsx_runtime","MobileSidebar","import_react","import_jsx_runtime","PageGroup","BookmarkItem","EditModal","BookmarksPanel","import_react","import_jsx_runtime","PageGroup","TakeawayItem","TakeawaysPanel","init_Sidebar","import_react","import_jsx_runtime","AnnotationToolbar","init_AnnotationToolbar","import_react","import_jsx_runtime","CanvasLayer","isTextItem","import_react","import_jsx_runtime","TextLayer","import_react","import_jsx_runtime","HighlightLayer","import_react","import_jsx_runtime","AnnotationLayer","import_react","import_jsx_runtime","PDFPage","import_react","import_jsx_runtime","FocusRegionLayer","init_PDFPage","import_react","import_jsx_runtime","SelectionToolbar","init_SelectionToolbar","import_react","import_jsx_runtime","HighlightPopover","init_HighlightPopover","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","DocumentContainer","document","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","VirtualizedDocumentContainer","document","import_react","import_jsx_runtime","ContinuousScrollContainer","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","DualPageContainer","document","spread","import_react","import_jsx_runtime","init_Toolbar","init_Sidebar","init_AnnotationToolbar","PDFViewerInner","document","error","PDFViewerClient","import_react","import_jsx_runtime","PDFViewerClient","PDFViewerLoading","PDFViewer","init_PDFViewer","init_PDFViewer","init_PDFPage","init_Toolbar","init_Sidebar","init_SelectionToolbar","init_HighlightPopover","init_AnnotationToolbar","import_react","import_jsx_runtime","StickyNote","import_react","import_jsx_runtime","DrawingCanvas","import_react","import_jsx_runtime","ShapeRenderer","renderShape","ShapePreview","import_react","import_jsx_runtime","QuickNoteButton","import_react","import_jsx_runtime","QuickNotePopover","import_react","import_jsx_runtime","AskAboutOverlay","import_react","import_jsx_runtime","AskAboutTrigger","import_react","import_jsx_runtime","PageIndicator","Minimap","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/utils/pdfjs-init.ts","../src/utils/document-loader.ts","../src/utils/highlight-storage.ts","../src/store/viewer-store.ts","../src/store/annotation-store.ts","../src/utils/convenience.ts","../src/utils/export-annotations.ts","../src/utils/student-storage.ts","../src/utils/agent-api.ts","../src/utils/index.ts","../src/store/search-store.ts","../src/store/agent-store.ts","../src/store/student-store.ts","../src/store/index.ts","../src/hooks/PDFViewerContext.tsx","../src/hooks/usePDFViewer.ts","../src/hooks/usePageNavigation.ts","../src/hooks/useZoom.ts","../src/hooks/useTextSelection.ts","../src/hooks/useHighlights.ts","../src/hooks/useAnnotations.ts","../src/hooks/useTouchGestures.ts","../src/plugins/PluginManager.ts","../src/hooks/usePlugins.ts","../src/hooks/useAgentContext.ts","../src/hooks/useAskAbout.ts","../src/hooks/useBookmarks.ts","../src/hooks/useQuickNotes.ts","../src/hooks/useStudentProgress.ts","../src/hooks/index.ts","../src/components/Toolbar/Toolbar.tsx","../src/components/Toolbar/MobileToolbar.tsx","../src/components/Toolbar/index.ts","../src/components/Sidebar/ThumbnailPanel.tsx","../src/components/Sidebar/SearchPanel.tsx","../src/components/Sidebar/OutlinePanel.tsx","../src/components/Sidebar/HighlightsPanel.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Sidebar/MobileSidebar.tsx","../src/components/Sidebar/BookmarksPanel.tsx","../src/components/Sidebar/TakeawaysPanel.tsx","../src/components/Sidebar/index.ts","../src/components/AnnotationToolbar/AnnotationToolbar.tsx","../src/components/AnnotationToolbar/index.ts","../src/components/PDFPage/CanvasLayer.tsx","../src/components/PDFPage/TextLayer.tsx","../src/components/PDFPage/HighlightLayer.tsx","../src/components/PDFPage/AnnotationLayer.tsx","../src/components/PDFPage/PDFPage.tsx","../src/components/PDFPage/FocusRegionLayer.tsx","../src/components/PDFPage/index.ts","../src/components/SelectionToolbar/SelectionToolbar.tsx","../src/components/SelectionToolbar/index.ts","../src/components/HighlightPopover/HighlightPopover.tsx","../src/components/HighlightPopover/index.ts","../src/components/PDFViewer/DocumentContainer.tsx","../src/components/PDFViewer/VirtualizedDocumentContainer.tsx","../src/components/PDFViewer/ContinuousScrollContainer.tsx","../src/components/PDFViewer/DualPageContainer.tsx","../src/components/PDFViewer/PDFViewerClient.tsx","../src/components/PDFViewer/PDFViewer.tsx","../src/components/PDFViewer/index.ts","../src/index.ts","../src/components/index.ts","../src/components/Annotations/StickyNote.tsx","../src/components/Annotations/DrawingCanvas.tsx","../src/components/Annotations/ShapeRenderer.tsx","../src/components/Annotations/QuickNoteButton.tsx","../src/components/Annotations/QuickNotePopover.tsx","../src/components/AskAbout/AskAboutOverlay.tsx","../src/components/AskAbout/AskAboutTrigger.tsx","../src/components/Minimap/Minimap.tsx","../src/components/ErrorBoundary/PDFErrorBoundary.tsx","../src/plugins/index.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Utility for merging class names with support for conditionals.\n * Uses clsx under the hood.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\nlet isInitialized = false;\nlet initializationPromise: Promise<void> | null = null;\n\nexport interface PDFJSInitOptions {\n /** Custom worker source URL */\n workerSrc?: string;\n /** Whether to use the fake worker (for testing) */\n useFakeWorker?: boolean;\n}\n\n/**\n * Initialize pdf.js with the worker.\n * This should be called before loading any PDFs.\n */\nexport async function initializePDFJS(options: PDFJSInitOptions = {}): Promise<void> {\n if (isInitialized) {\n return;\n }\n\n if (initializationPromise) {\n return initializationPromise;\n }\n\n initializationPromise = (async () => {\n if (options.useFakeWorker) {\n // Use fake worker for testing\n pdfjsLib.GlobalWorkerOptions.workerSrc = '';\n } else if (options.workerSrc) {\n // Use custom worker source\n pdfjsLib.GlobalWorkerOptions.workerSrc = options.workerSrc;\n } else {\n // Use the CDN worker for reliability\n const version = pdfjsLib.version;\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${version}/pdf.worker.min.mjs`;\n }\n\n isInitialized = true;\n })();\n\n return initializationPromise;\n}\n\n/**\n * Check if pdf.js is initialized\n */\nexport function isPDFJSInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset initialization state (for testing)\n */\nexport function resetPDFJS(): void {\n isInitialized = false;\n initializationPromise = null;\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { pdfjsLib, initializePDFJS } from './pdfjs-init';\n\nexport interface LoadDocumentOptions {\n /** URL or data of the PDF */\n src: string | ArrayBuffer | Uint8Array;\n /** Custom worker source */\n workerSrc?: string;\n /** Password for encrypted PDFs */\n password?: string;\n /** Callback for loading progress */\n onProgress?: (progress: { loaded: number; total: number }) => void;\n /** Enable range requests for faster loading (default: true) */\n enableRangeRequests?: boolean;\n /** Enable streaming for progressive display (default: true) */\n enableStreaming?: boolean;\n /** Cache the document data (default: true) */\n cacheDocument?: boolean;\n}\n\nexport interface LoadDocumentResult {\n document: PDFDocumentProxy;\n numPages: number;\n}\n\n// Document cache to prevent duplicate loading\nconst documentCache = new Map<string, PDFDocumentProxy>();\n\n/**\n * Load a PDF document from a URL or data buffer.\n *\n * Optimizations:\n * - Range requests allow loading only the parts needed (faster initial load)\n * - Streaming allows pages to render as data arrives\n * - Document caching prevents duplicate fetches\n * - Worker handles parsing off the main thread\n */\nexport async function loadDocument(options: LoadDocumentOptions): Promise<LoadDocumentResult> {\n const {\n src,\n workerSrc,\n password,\n onProgress,\n enableRangeRequests = true,\n enableStreaming = true,\n cacheDocument = true,\n } = options;\n\n // Initialize pdf.js if not already done\n await initializePDFJS({ workerSrc });\n\n // Check cache for URL-based documents\n const cacheKey = typeof src === 'string' ? src : null;\n if (cacheKey && cacheDocument && documentCache.has(cacheKey)) {\n const cachedDoc = documentCache.get(cacheKey)!;\n return {\n document: cachedDoc,\n numPages: cachedDoc.numPages,\n };\n }\n\n // Prepare loading parameters\n const loadingParams: Record<string, unknown> = {\n password,\n // Performance optimizations\n isEvalSupported: false,\n useSystemFonts: true,\n // Enable range requests for faster initial load\n // This allows PDF.js to request only the parts of the PDF it needs\n disableRange: !enableRangeRequests,\n // Enable streaming for progressive rendering\n disableStream: !enableStreaming,\n // Don't fetch the entire document upfront\n disableAutoFetch: true,\n };\n\n // Set source based on type\n if (typeof src === 'string') {\n loadingParams.url = src;\n } else {\n loadingParams.data = src;\n }\n\n const loadingTask = pdfjsLib.getDocument(loadingParams);\n\n // Handle progress\n if (onProgress) {\n loadingTask.onProgress = ({ loaded, total }: { loaded: number; total: number }) => {\n onProgress({ loaded, total });\n };\n }\n\n const document = await loadingTask.promise;\n\n // Cache the document\n if (cacheKey && cacheDocument) {\n documentCache.set(cacheKey, document);\n }\n\n return {\n document,\n numPages: document.numPages,\n };\n}\n\n/**\n * Get a specific page from a PDF document.\n */\nexport async function getPage(\n document: PDFDocumentProxy,\n pageNumber: number\n): Promise<PDFPageProxy> {\n if (pageNumber < 1 || pageNumber > document.numPages) {\n throw new Error(`Invalid page number: ${pageNumber}. Document has ${document.numPages} pages.`);\n }\n\n return document.getPage(pageNumber);\n}\n\n/**\n * Get text content from a PDF page.\n */\nexport async function getPageTextContent(page: PDFPageProxy) {\n return page.getTextContent();\n}\n\n/**\n * Get the outline (table of contents) from a PDF document.\n */\nexport async function getOutline(document: PDFDocumentProxy) {\n return document.getOutline();\n}\n\n/**\n * Get metadata from a PDF document.\n */\nexport async function getMetadata(document: PDFDocumentProxy) {\n return document.getMetadata();\n}\n\n/**\n * Clear a document from cache.\n */\nexport function clearDocumentCache(url?: string): void {\n if (url) {\n const doc = documentCache.get(url);\n if (doc) {\n doc.destroy();\n documentCache.delete(url);\n }\n } else {\n // Clear all\n for (const doc of documentCache.values()) {\n doc.destroy();\n }\n documentCache.clear();\n }\n}\n\n/**\n * Preload a PDF document into cache without returning it.\n * Useful for prefetching documents the user might view next.\n */\nexport async function preloadDocument(url: string): Promise<void> {\n if (documentCache.has(url)) return;\n\n await loadDocument({ src: url, cacheDocument: true });\n}\n","import type { Highlight, HighlightColor } from '../types';\n\nconst STORAGE_PREFIX = 'pdf-reader-highlights';\n\n/**\n * Generate a storage key for a document.\n * Uses documentId to uniquely identify each PDF's highlights.\n */\nfunction getStorageKey(documentId: string): string {\n return `${STORAGE_PREFIX}:${documentId}`;\n}\n\n/**\n * Check if localStorage is available (SSR-safe).\n */\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Serializable version of a highlight for storage.\n * Dates are stored as ISO strings.\n */\ninterface StoredHighlight {\n id: string;\n pageNumber: number;\n rects: Array<{ x: number; y: number; width: number; height: number }>;\n color: HighlightColor;\n text: string;\n comment?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Convert a Highlight to storable format.\n */\nfunction toStoredHighlight(highlight: Highlight): StoredHighlight {\n return {\n ...highlight,\n createdAt: highlight.createdAt.toISOString(),\n updatedAt: highlight.updatedAt.toISOString(),\n };\n}\n\n/**\n * Convert a stored highlight back to a Highlight.\n */\nfunction fromStoredHighlight(stored: StoredHighlight): Highlight {\n return {\n ...stored,\n createdAt: new Date(stored.createdAt),\n updatedAt: new Date(stored.updatedAt),\n };\n}\n\n/**\n * Save highlights to localStorage for a specific document.\n *\n * @param documentId - Unique identifier for the document (e.g., URL hash, filename)\n * @param highlights - Array of highlights to save\n * @returns true if save succeeded, false otherwise\n */\nexport function saveHighlights(documentId: string, highlights: Highlight[]): boolean {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, highlights will not persist');\n return false;\n }\n\n try {\n const key = getStorageKey(documentId);\n const storedHighlights = highlights.map(toStoredHighlight);\n localStorage.setItem(key, JSON.stringify(storedHighlights));\n return true;\n } catch (error) {\n console.error('Failed to save highlights:', error);\n return false;\n }\n}\n\n/**\n * Load highlights from localStorage for a specific document.\n *\n * @param documentId - Unique identifier for the document\n * @returns Array of highlights, empty array if none found or error\n */\nexport function loadHighlights(documentId: string): Highlight[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n try {\n const key = getStorageKey(documentId);\n const stored = localStorage.getItem(key);\n\n if (!stored) {\n return [];\n }\n\n const parsed = JSON.parse(stored) as StoredHighlight[];\n return parsed.map(fromStoredHighlight);\n } catch (error) {\n console.error('Failed to load highlights:', error);\n return [];\n }\n}\n\n/**\n * Remove all highlights for a specific document from localStorage.\n *\n * @param documentId - Unique identifier for the document\n * @returns true if removal succeeded, false otherwise\n */\nexport function clearHighlights(documentId: string): boolean {\n if (!isStorageAvailable()) {\n return false;\n }\n\n try {\n const key = getStorageKey(documentId);\n localStorage.removeItem(key);\n return true;\n } catch (error) {\n console.error('Failed to clear highlights:', error);\n return false;\n }\n}\n\n/**\n * Get all document IDs that have stored highlights.\n *\n * @returns Array of document IDs\n */\nexport function getAllDocumentIds(): string[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n const ids: string[] = [];\n const prefixLength = STORAGE_PREFIX.length + 1; // +1 for the colon\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX + ':')) {\n ids.push(key.slice(prefixLength));\n }\n }\n\n return ids;\n}\n\n/**\n * Export highlights as a JSON string.\n * Includes metadata for import/export portability.\n *\n * @param highlights - Array of highlights to export\n * @returns JSON string representation\n */\nexport function exportHighlightsAsJSON(highlights: Highlight[]): string {\n const exportData = {\n version: 1,\n exportedAt: new Date().toISOString(),\n highlights: highlights.map(toStoredHighlight),\n };\n\n return JSON.stringify(exportData, null, 2);\n}\n\n/**\n * Import highlights from a JSON string.\n *\n * @param json - JSON string to import\n * @returns Array of highlights, or null if invalid\n */\nexport function importHighlightsFromJSON(json: string): Highlight[] | null {\n try {\n const data = JSON.parse(json);\n\n // Handle both direct array format and wrapped format\n let highlights: StoredHighlight[];\n if (Array.isArray(data)) {\n highlights = data;\n } else if (data.highlights && Array.isArray(data.highlights)) {\n highlights = data.highlights;\n } else {\n return null;\n }\n\n return highlights.map(fromStoredHighlight);\n } catch (error) {\n console.error('Failed to import highlights:', error);\n return null;\n }\n}\n\n/**\n * Export highlights as Markdown format.\n * Groups by page and includes text, comments, and metadata.\n *\n * @param highlights - Array of highlights to export\n * @param documentTitle - Optional document title for the header\n * @returns Markdown string representation\n */\nexport function exportHighlightsAsMarkdown(\n highlights: Highlight[],\n documentTitle?: string\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${documentTitle || 'PDF Highlights'}`);\n lines.push('');\n lines.push(`Exported on ${new Date().toLocaleDateString()}`);\n lines.push('');\n\n if (highlights.length === 0) {\n lines.push('_No highlights_');\n return lines.join('\\n');\n }\n\n // Group by page\n const byPage = new Map<number, Highlight[]>();\n highlights.forEach((h) => {\n if (!byPage.has(h.pageNumber)) {\n byPage.set(h.pageNumber, []);\n }\n byPage.get(h.pageNumber)!.push(h);\n });\n\n // Sort pages\n const sortedPages = Array.from(byPage.keys()).sort((a, b) => a - b);\n\n // Render each page group\n sortedPages.forEach((pageNumber) => {\n lines.push(`## Page ${pageNumber}`);\n lines.push('');\n\n const pageHighlights = byPage.get(pageNumber)!;\n // Sort highlights by vertical position\n pageHighlights.sort((a, b) => (a.rects[0]?.y ?? 0) - (b.rects[0]?.y ?? 0));\n\n pageHighlights.forEach((highlight) => {\n // Color indicator as emoji\n const colorEmoji = {\n yellow: '🟡',\n green: '🟢',\n blue: '🔵',\n pink: '🩷',\n orange: '🟠',\n }[highlight.color];\n\n lines.push(`${colorEmoji} > ${highlight.text}`);\n\n if (highlight.comment) {\n lines.push('');\n lines.push(`**Note:** ${highlight.comment}`);\n }\n\n lines.push('');\n });\n });\n\n // Summary\n lines.push('---');\n lines.push(`*${highlights.length} highlight${highlights.length !== 1 ? 's' : ''} total*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a document ID from a URL or file path.\n * Creates a consistent hash for the same document.\n *\n * @param source - URL or file path\n * @returns Document ID string\n */\nexport function generateDocumentId(source: string | ArrayBuffer | Uint8Array): string {\n if (typeof source === 'string') {\n // For URLs, use a simplified hash\n let hash = 0;\n for (let i = 0; i < source.length; i++) {\n const char = source.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `doc-${Math.abs(hash).toString(36)}`;\n }\n\n // For binary data, use size-based ID (not ideal but simple)\n const size = source instanceof ArrayBuffer ? source.byteLength : source.length;\n return `doc-binary-${size}`;\n}\n","import { createStore } from 'zustand/vanilla';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ViewerState, ViewerActions, ViewMode, Theme, SidebarPanel, ScrollMode } from '../types';\n\nconst ZOOM_LEVELS = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0, 4.0];\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10;\n\nexport type ViewerStore = ViewerState & ViewerActions;\n\nconst initialState: ViewerState = {\n // Document state\n document: null,\n numPages: 0,\n isLoading: false,\n error: null,\n\n // Navigation state\n currentPage: 1,\n scale: 1.0,\n rotation: 0,\n\n // UI state\n viewMode: 'single',\n scrollMode: 'single',\n theme: 'light',\n sidebarOpen: false,\n sidebarPanel: 'thumbnails',\n\n // Feature states\n isFullscreen: false,\n isPresentationMode: false,\n};\n\nexport function createViewerStore(initialOverrides: Partial<ViewerState> = {}) {\n return createStore<ViewerStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Document actions\n setDocument: (document: PDFDocumentProxy | null) => {\n if (document) {\n set({\n document,\n numPages: document.numPages,\n isLoading: false,\n error: null,\n currentPage: 1,\n });\n } else {\n set({\n document: null,\n numPages: 0,\n isLoading: false,\n });\n }\n },\n\n setLoading: (isLoading: boolean) => {\n set({ isLoading });\n },\n\n setError: (error: Error | null) => {\n set({ error, isLoading: false });\n },\n\n // Navigation actions\n setCurrentPage: (page: number) => {\n const { numPages } = get();\n if (page >= 1 && page <= numPages) {\n set({ currentPage: page });\n }\n },\n\n goToPage: (page: number) => {\n const { numPages } = get();\n const validPage = Math.max(1, Math.min(page, numPages));\n set({ currentPage: validPage });\n },\n\n nextPage: () => {\n const { currentPage, numPages } = get();\n if (currentPage < numPages) {\n set({ currentPage: currentPage + 1 });\n }\n },\n\n previousPage: () => {\n const { currentPage } = get();\n if (currentPage > 1) {\n set({ currentPage: currentPage - 1 });\n }\n },\n\n // Zoom actions\n setScale: (scale: number) => {\n const clampedScale = Math.max(MIN_SCALE, Math.min(MAX_SCALE, scale));\n set({ scale: clampedScale });\n },\n\n zoomIn: () => {\n const { scale } = get();\n const currentIndex = ZOOM_LEVELS.findIndex((z) => z >= scale);\n const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1);\n set({ scale: ZOOM_LEVELS[nextIndex] ?? MAX_SCALE });\n },\n\n zoomOut: () => {\n const { scale } = get();\n const currentIndex = ZOOM_LEVELS.findIndex((z) => z >= scale);\n const prevIndex = Math.max(currentIndex - 1, 0);\n set({ scale: ZOOM_LEVELS[prevIndex] ?? MIN_SCALE });\n },\n\n fitToWidth: () => {\n // This will be calculated by the component based on container width\n // For now, just set a reasonable default\n set({ scale: 1.0 });\n },\n\n fitToPage: () => {\n // This will be calculated by the component based on container size\n // For now, just set a reasonable default\n set({ scale: 1.0 });\n },\n\n // Rotation actions\n setRotation: (rotation: number) => {\n // Normalize rotation to 0, 90, 180, or 270\n const normalizedRotation = ((rotation % 360) + 360) % 360;\n set({ rotation: normalizedRotation });\n },\n\n rotateClockwise: () => {\n const { rotation } = get();\n set({ rotation: (rotation + 90) % 360 });\n },\n\n rotateCounterClockwise: () => {\n const { rotation } = get();\n set({ rotation: (rotation - 90 + 360) % 360 });\n },\n\n // UI actions\n setViewMode: (viewMode: ViewMode) => {\n set({ viewMode });\n },\n\n setScrollMode: (scrollMode: ScrollMode) => {\n set({ scrollMode });\n },\n\n setTheme: (theme: Theme) => {\n set({ theme });\n },\n\n toggleSidebar: () => {\n const { sidebarOpen } = get();\n set({ sidebarOpen: !sidebarOpen });\n },\n\n setSidebarPanel: (sidebarPanel: SidebarPanel) => {\n set({ sidebarPanel, sidebarOpen: sidebarPanel !== null });\n },\n\n setFullscreen: (isFullscreen: boolean) => {\n set({ isFullscreen });\n },\n\n // Reset\n reset: () => {\n const { document } = get();\n if (document) {\n document.destroy();\n }\n set(initialState);\n },\n }));\n}\n\n// Type for the store\nexport type ViewerStoreApi = ReturnType<typeof createViewerStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type { Highlight, Annotation, HighlightColor, DrawingPath } from '../types';\n\nexport type AnnotationTool = 'note' | 'draw' | 'shape' | null;\nexport type ShapeType = 'rect' | 'circle' | 'arrow' | 'line';\n\nexport interface AnnotationState {\n highlights: Highlight[];\n annotations: Annotation[];\n selectedHighlightId: string | null;\n selectedAnnotationId: string | null;\n activeHighlightColor: HighlightColor;\n isHighlightMode: boolean;\n isAnnotationMode: boolean;\n\n // Drawing state\n activeAnnotationTool: AnnotationTool;\n activeShapeType: ShapeType;\n drawingColor: string;\n drawingStrokeWidth: number;\n currentDrawingPath: DrawingPath | null;\n currentDrawingPage: number | null;\n}\n\nexport interface AnnotationActions {\n // Highlight actions\n addHighlight: (highlight: Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>) => Highlight;\n updateHighlight: (id: string, updates: Partial<Highlight>) => void;\n removeHighlight: (id: string) => void;\n selectHighlight: (id: string | null) => void;\n setActiveHighlightColor: (color: HighlightColor) => void;\n getHighlightsByPage: (pageNumber: number) => Highlight[];\n\n // Annotation actions\n addAnnotation: (annotation: Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) => Annotation;\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\n removeAnnotation: (id: string) => void;\n selectAnnotation: (id: string | null) => void;\n getAnnotationsByPage: (pageNumber: number) => Annotation[];\n\n // Mode actions\n setHighlightMode: (enabled: boolean) => void;\n setAnnotationMode: (enabled: boolean) => void;\n\n // Drawing tool actions\n setActiveAnnotationTool: (tool: AnnotationTool) => void;\n setActiveShapeType: (shapeType: ShapeType) => void;\n setDrawingColor: (color: string) => void;\n setDrawingStrokeWidth: (width: number) => void;\n\n // Drawing path actions\n startDrawing: (pageNumber: number, point: { x: number; y: number }) => void;\n addDrawingPoint: (point: { x: number; y: number }) => void;\n finishDrawing: () => Annotation | null;\n cancelDrawing: () => void;\n\n // Export/Import\n exportHighlights: () => string;\n importHighlights: (json: string) => void;\n exportAnnotations: () => string;\n importAnnotations: (json: string) => void;\n\n // Reset\n clearAll: () => void;\n}\n\nexport type AnnotationStore = AnnotationState & AnnotationActions;\n\nconst initialState: AnnotationState = {\n highlights: [],\n annotations: [],\n selectedHighlightId: null,\n selectedAnnotationId: null,\n activeHighlightColor: 'yellow',\n isHighlightMode: false,\n isAnnotationMode: false,\n\n // Drawing state defaults\n activeAnnotationTool: null,\n activeShapeType: 'rect',\n drawingColor: '#ef4444',\n drawingStrokeWidth: 2,\n currentDrawingPath: null,\n currentDrawingPage: null,\n};\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport function createAnnotationStore(initialOverrides: Partial<AnnotationState> = {}) {\n return createStore<AnnotationStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Highlight actions\n addHighlight: (highlight) => {\n const newHighlight: Highlight = {\n ...highlight,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n set((state) => ({\n highlights: [...state.highlights, newHighlight],\n }));\n return newHighlight;\n },\n\n updateHighlight: (id, updates) => {\n set((state) => ({\n highlights: state.highlights.map((h) =>\n h.id === id ? { ...h, ...updates, updatedAt: new Date() } : h\n ),\n }));\n },\n\n removeHighlight: (id) => {\n set((state) => ({\n highlights: state.highlights.filter((h) => h.id !== id),\n selectedHighlightId: state.selectedHighlightId === id ? null : state.selectedHighlightId,\n }));\n },\n\n selectHighlight: (id) => {\n set({ selectedHighlightId: id });\n },\n\n setActiveHighlightColor: (color) => {\n set({ activeHighlightColor: color });\n },\n\n getHighlightsByPage: (pageNumber) => {\n return get().highlights.filter((h) => h.pageNumber === pageNumber);\n },\n\n // Annotation actions\n addAnnotation: (annotation) => {\n const newAnnotation = {\n ...annotation,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n } as Annotation;\n set((state) => ({\n annotations: [...state.annotations, newAnnotation],\n }));\n return newAnnotation;\n },\n\n updateAnnotation: (id, updates) => {\n set((state) => ({\n annotations: state.annotations.map((a) =>\n a.id === id ? { ...a, ...updates, updatedAt: new Date() } : a\n ) as Annotation[],\n }));\n },\n\n removeAnnotation: (id) => {\n set((state) => ({\n annotations: state.annotations.filter((a) => a.id !== id),\n selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId,\n }));\n },\n\n selectAnnotation: (id) => {\n set({ selectedAnnotationId: id });\n },\n\n getAnnotationsByPage: (pageNumber) => {\n return get().annotations.filter((a) => a.pageNumber === pageNumber);\n },\n\n // Mode actions\n setHighlightMode: (enabled) => {\n set({\n isHighlightMode: enabled,\n isAnnotationMode: enabled ? false : get().isAnnotationMode,\n activeAnnotationTool: enabled ? null : get().activeAnnotationTool,\n });\n },\n\n setAnnotationMode: (enabled) => {\n set({\n isAnnotationMode: enabled,\n isHighlightMode: enabled ? false : get().isHighlightMode,\n });\n },\n\n // Drawing tool actions\n setActiveAnnotationTool: (tool) => {\n set({\n activeAnnotationTool: tool,\n isAnnotationMode: tool !== null,\n isHighlightMode: false,\n currentDrawingPath: null,\n currentDrawingPage: null,\n });\n },\n\n setActiveShapeType: (shapeType) => {\n set({ activeShapeType: shapeType });\n },\n\n setDrawingColor: (color) => {\n set({ drawingColor: color });\n },\n\n setDrawingStrokeWidth: (width) => {\n set({ drawingStrokeWidth: Math.max(1, Math.min(20, width)) });\n },\n\n // Drawing path actions\n startDrawing: (pageNumber, point) => {\n set({\n currentDrawingPath: { points: [point] },\n currentDrawingPage: pageNumber,\n });\n },\n\n addDrawingPoint: (point) => {\n const { currentDrawingPath } = get();\n if (currentDrawingPath) {\n set({\n currentDrawingPath: {\n points: [...currentDrawingPath.points, point],\n },\n });\n }\n },\n\n finishDrawing: () => {\n const { currentDrawingPath, currentDrawingPage, activeAnnotationTool, drawingColor, drawingStrokeWidth } = get();\n\n if (!currentDrawingPath || currentDrawingPage === null || activeAnnotationTool !== 'draw') {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n return null;\n }\n\n // Only create annotation if we have at least 2 points\n if (currentDrawingPath.points.length < 2) {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n return null;\n }\n\n const newAnnotation = {\n type: 'drawing' as const,\n pageNumber: currentDrawingPage,\n paths: [currentDrawingPath],\n color: drawingColor,\n strokeWidth: drawingStrokeWidth,\n id: generateId(),\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n set((state) => ({\n annotations: [...state.annotations, newAnnotation],\n currentDrawingPath: null,\n currentDrawingPage: null,\n }));\n\n return newAnnotation;\n },\n\n cancelDrawing: () => {\n set({ currentDrawingPath: null, currentDrawingPage: null });\n },\n\n // Export/Import\n exportHighlights: () => {\n const highlights = get().highlights;\n return JSON.stringify(highlights, null, 2);\n },\n\n importHighlights: (json) => {\n try {\n const highlights = JSON.parse(json) as Highlight[];\n set({ highlights });\n } catch {\n console.error('Failed to import highlights');\n }\n },\n\n exportAnnotations: () => {\n const annotations = get().annotations;\n return JSON.stringify(annotations, null, 2);\n },\n\n importAnnotations: (json) => {\n try {\n const annotations = JSON.parse(json) as Annotation[];\n set({ annotations });\n } catch {\n console.error('Failed to import annotations');\n }\n },\n\n // Reset\n clearAll: () => {\n set({\n ...initialState,\n // Preserve user preferences\n drawingColor: get().drawingColor,\n drawingStrokeWidth: get().drawingStrokeWidth,\n activeHighlightColor: get().activeHighlightColor,\n });\n },\n }));\n}\n\nexport type AnnotationStoreApi = ReturnType<typeof createAnnotationStore>;\n","import { createRoot, Root } from 'react-dom/client';\nimport { createElement } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFViewer } from '../components/PDFViewer';\nimport { createViewerStore } from '../store/viewer-store';\nimport { createAnnotationStore } from '../store/annotation-store';\nimport { loadDocument } from './document-loader';\nimport type {\n Highlight,\n Annotation,\n Theme,\n ViewMode,\n SidebarPanel,\n PDFViewerProps,\n PDFDocumentLoadedEvent,\n} from '../types';\n\nexport interface PDFViewerControllerOptions {\n /** Initial page number */\n initialPage?: number;\n /** Initial scale/zoom level */\n initialScale?: number;\n /** Theme mode */\n theme?: Theme;\n /** Whether to show the toolbar */\n showToolbar?: boolean;\n /** Whether to show the sidebar */\n showSidebar?: boolean;\n /** Custom onDocumentLoad callback */\n onDocumentLoad?: (doc: PDFDocumentProxy) => void;\n /** Custom onPageChange callback */\n onPageChange?: (page: number) => void;\n /** Custom onScaleChange callback */\n onScaleChange?: (scale: number) => void;\n /** Custom onError callback */\n onError?: (error: Error) => void;\n /** PDF source - URL, ArrayBuffer, or Uint8Array */\n src?: string | ArrayBuffer | Uint8Array;\n}\n\nexport interface PDFViewerController {\n // Document operations\n loadDocument(src: string | ArrayBuffer | Uint8Array): Promise<void>;\n getDocument(): PDFDocumentProxy | null;\n\n // Navigation\n goToPage(page: number): void;\n nextPage(): void;\n previousPage(): void;\n getCurrentPage(): number;\n getTotalPages(): number;\n\n // Zoom\n setZoom(scale: number): void;\n zoomIn(): void;\n zoomOut(): void;\n fitToWidth(): void;\n fitToPage(): void;\n getZoom(): number;\n\n // Rotation\n setRotation(rotation: number): void;\n rotateClockwise(): void;\n rotateCounterClockwise(): void;\n getRotation(): number;\n\n // Theme & View\n setTheme(theme: Theme): void;\n getTheme(): Theme;\n setViewMode(mode: ViewMode): void;\n getViewMode(): ViewMode;\n\n // Sidebar\n toggleSidebar(): void;\n setSidebarPanel(panel: SidebarPanel): void;\n isSidebarOpen(): boolean;\n\n // Highlights\n getHighlights(): Highlight[];\n addHighlight(highlight: Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>): Highlight;\n removeHighlight(id: string): void;\n exportHighlights(): string;\n importHighlights(json: string): void;\n\n // Annotations\n getAnnotations(): Annotation[];\n addAnnotation(annotation: Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>): Annotation;\n removeAnnotation(id: string): void;\n exportAnnotations(): string;\n importAnnotations(json: string): void;\n\n // Events\n on<K extends keyof PDFViewerEventHandlers>(\n event: K,\n handler: PDFViewerEventHandlers[K]\n ): () => void;\n\n // Lifecycle\n destroy(): void;\n}\n\ninterface PDFViewerEventHandlers {\n pagechange: (page: number) => void;\n scalechange: (scale: number) => void;\n documentload: (doc: PDFDocumentProxy) => void;\n error: (error: Error) => void;\n}\n\ntype EventType = keyof PDFViewerEventHandlers;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventHandler = (data: any) => void;\n\n/**\n * Create a PDF viewer instance for non-React usage\n */\nexport function createPDFViewer(\n container: HTMLElement,\n options: PDFViewerControllerOptions = {}\n): PDFViewerController {\n // Create stores\n const viewerStore = createViewerStore();\n const annotationStore = createAnnotationStore();\n\n // Event handlers\n const eventHandlers: Map<EventType, Set<EventHandler>> = new Map();\n\n // React root\n let root: Root | null = null;\n let isDestroyed = false;\n\n // Helper to emit events\n const emit = (event: EventType, data: unknown) => {\n const handlers = eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => handler(data));\n }\n };\n\n // Render the viewer\n const render = (src?: string | ArrayBuffer | Uint8Array) => {\n if (isDestroyed) return;\n\n if (!root) {\n root = createRoot(container);\n }\n\n const props: PDFViewerProps = {\n src: src || '',\n initialPage: options.initialPage,\n initialScale: options.initialScale,\n theme: options.theme,\n showToolbar: options.showToolbar,\n showSidebar: options.showSidebar,\n onDocumentLoad: (event: PDFDocumentLoadedEvent) => {\n options.onDocumentLoad?.(event.document);\n emit('documentload', event.document);\n },\n onPageChange: (page: number) => {\n options.onPageChange?.(page);\n emit('pagechange', page);\n },\n onScaleChange: (scale: number) => {\n options.onScaleChange?.(scale);\n emit('scalechange', scale);\n },\n onError: (error: Error) => {\n options.onError?.(error);\n emit('error', error);\n },\n };\n\n root.render(createElement(PDFViewer, props));\n };\n\n // Initialize with empty render if no src provided\n if (options.src) {\n render(options.src);\n }\n\n // Controller implementation\n const controller: PDFViewerController = {\n // Document operations\n async loadDocument(src: string | ArrayBuffer | Uint8Array) {\n render(src);\n // Wait for document to load\n const result = await loadDocument({ src });\n viewerStore.getState().setDocument(result.document);\n },\n\n getDocument() {\n return viewerStore.getState().document;\n },\n\n // Navigation\n goToPage(page: number) {\n viewerStore.getState().goToPage(page);\n },\n\n nextPage() {\n viewerStore.getState().nextPage();\n },\n\n previousPage() {\n viewerStore.getState().previousPage();\n },\n\n getCurrentPage() {\n return viewerStore.getState().currentPage;\n },\n\n getTotalPages() {\n return viewerStore.getState().numPages;\n },\n\n // Zoom\n setZoom(scale: number) {\n viewerStore.getState().setScale(scale);\n },\n\n zoomIn() {\n viewerStore.getState().zoomIn();\n },\n\n zoomOut() {\n viewerStore.getState().zoomOut();\n },\n\n fitToWidth() {\n viewerStore.getState().fitToWidth();\n },\n\n fitToPage() {\n viewerStore.getState().fitToPage();\n },\n\n getZoom() {\n return viewerStore.getState().scale;\n },\n\n // Rotation\n setRotation(rotation: number) {\n viewerStore.getState().setRotation(rotation);\n },\n\n rotateClockwise() {\n viewerStore.getState().rotateClockwise();\n },\n\n rotateCounterClockwise() {\n viewerStore.getState().rotateCounterClockwise();\n },\n\n getRotation() {\n return viewerStore.getState().rotation;\n },\n\n // Theme & View\n setTheme(theme: Theme) {\n viewerStore.getState().setTheme(theme);\n },\n\n getTheme() {\n return viewerStore.getState().theme;\n },\n\n setViewMode(mode: ViewMode) {\n viewerStore.getState().setViewMode(mode);\n },\n\n getViewMode() {\n return viewerStore.getState().viewMode;\n },\n\n // Sidebar\n toggleSidebar() {\n viewerStore.getState().toggleSidebar();\n },\n\n setSidebarPanel(panel: SidebarPanel) {\n viewerStore.getState().setSidebarPanel(panel);\n },\n\n isSidebarOpen() {\n return viewerStore.getState().sidebarOpen;\n },\n\n // Highlights\n getHighlights() {\n return annotationStore.getState().highlights;\n },\n\n addHighlight(highlight) {\n return annotationStore.getState().addHighlight(highlight);\n },\n\n removeHighlight(id: string) {\n annotationStore.getState().removeHighlight(id);\n },\n\n exportHighlights() {\n return annotationStore.getState().exportHighlights();\n },\n\n importHighlights(json: string) {\n annotationStore.getState().importHighlights(json);\n },\n\n // Annotations\n getAnnotations() {\n return annotationStore.getState().annotations;\n },\n\n addAnnotation(annotation) {\n return annotationStore.getState().addAnnotation(annotation);\n },\n\n removeAnnotation(id: string) {\n annotationStore.getState().removeAnnotation(id);\n },\n\n exportAnnotations() {\n return annotationStore.getState().exportAnnotations();\n },\n\n importAnnotations(json: string) {\n annotationStore.getState().importAnnotations(json);\n },\n\n // Events\n on<K extends keyof PDFViewerEventHandlers>(event: K, handler: PDFViewerEventHandlers[K]) {\n if (!eventHandlers.has(event)) {\n eventHandlers.set(event, new Set());\n }\n eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n eventHandlers.get(event)?.delete(handler as EventHandler);\n };\n },\n\n // Lifecycle\n destroy() {\n if (isDestroyed) return;\n isDestroyed = true;\n\n // Clear event handlers\n eventHandlers.clear();\n\n // Unmount React\n if (root) {\n root.unmount();\n root = null;\n }\n\n // Reset stores\n viewerStore.getState().reset();\n annotationStore.getState().clearAll();\n },\n };\n\n return controller;\n}\n\n/**\n * Initialize a PDF viewer with minimal configuration\n */\nexport async function quickViewer(\n container: HTMLElement | string,\n src: string | ArrayBuffer | Uint8Array,\n options: Partial<PDFViewerControllerOptions> = {}\n): Promise<PDFViewerController> {\n // Resolve container\n const element =\n typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!element) {\n throw new Error(`Container element not found: ${container}`);\n }\n\n // Create and load\n const viewer = createPDFViewer(element, { ...options, src });\n return viewer;\n}\n","import type { Highlight } from '../types';\nimport type { Bookmark, QuickNote, Takeaway } from '../types/agent-context';\n\nexport interface ExportData {\n highlights?: Highlight[];\n bookmarks?: Bookmark[];\n quickNotes?: QuickNote[];\n takeaways?: Takeaway[];\n documentTitle?: string;\n}\n\n/**\n * Export all annotations as a comprehensive Markdown document.\n * Organizes content by page with highlights, notes, bookmarks, and takeaways.\n */\nexport function exportAnnotationsAsMarkdown(data: ExportData): string {\n const { highlights = [], bookmarks = [], quickNotes = [], takeaways = [], documentTitle } = data;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${documentTitle || 'PDF Study Notes'}`);\n lines.push('');\n lines.push(`Exported on ${new Date().toLocaleDateString()} at ${new Date().toLocaleTimeString()}`);\n lines.push('');\n\n // Summary statistics\n const stats: string[] = [];\n if (highlights.length > 0) stats.push(`${highlights.length} highlight${highlights.length !== 1 ? 's' : ''}`);\n if (bookmarks.length > 0) stats.push(`${bookmarks.length} bookmark${bookmarks.length !== 1 ? 's' : ''}`);\n if (quickNotes.length > 0) stats.push(`${quickNotes.length} note${quickNotes.length !== 1 ? 's' : ''}`);\n if (takeaways.length > 0) stats.push(`${takeaways.length} takeaway${takeaways.length !== 1 ? 's' : ''}`);\n\n if (stats.length > 0) {\n lines.push(`**Summary:** ${stats.join(', ')}`);\n lines.push('');\n }\n\n // Collect all page numbers that have content\n const allPages = new Set<number>();\n highlights.forEach((h) => allPages.add(h.pageNumber));\n bookmarks.forEach((b) => allPages.add(b.pageNumber));\n quickNotes.forEach((n) => allPages.add(n.pageNumber));\n takeaways.forEach((t) => allPages.add(t.pageNumber));\n\n if (allPages.size === 0) {\n lines.push('_No annotations yet._');\n return lines.join('\\n');\n }\n\n // Sort pages\n const sortedPages = Array.from(allPages).sort((a, b) => a - b);\n\n // Render each page\n sortedPages.forEach((pageNumber) => {\n lines.push(`## Page ${pageNumber}`);\n lines.push('');\n\n // Bookmarks for this page\n const pageBookmarks = bookmarks.filter((b) => b.pageNumber === pageNumber);\n if (pageBookmarks.length > 0) {\n pageBookmarks.forEach((bookmark) => {\n lines.push(`**Bookmark:** ${bookmark.label || 'Page ' + bookmark.pageNumber}`);\n if (bookmark.userNote) {\n lines.push(`> ${bookmark.userNote}`);\n }\n if (bookmark.agentContext) {\n lines.push(`> *AI context: \"${bookmark.agentContext}\"*`);\n }\n lines.push('');\n });\n }\n\n // Takeaways for this page\n const pageTakeaways = takeaways.filter((t) => t.pageNumber === pageNumber);\n if (pageTakeaways.length > 0) {\n lines.push('### Key Takeaways');\n lines.push('');\n pageTakeaways.forEach((takeaway) => {\n const icon = takeaway.source === 'agent' ? '🤖' : '📝';\n lines.push(`${icon} ${takeaway.summary}`);\n lines.push('');\n });\n }\n\n // Highlights for this page\n const pageHighlights = highlights.filter((h) => h.pageNumber === pageNumber);\n if (pageHighlights.length > 0) {\n lines.push('### Highlights');\n lines.push('');\n pageHighlights.sort((a, b) => (a.rects[0]?.y ?? 0) - (b.rects[0]?.y ?? 0));\n pageHighlights.forEach((highlight) => {\n const sourceIcon = highlight.source === 'agent' ? '🤖' : '';\n const colorEmoji = {\n yellow: '🟡',\n green: '🟢',\n blue: '🔵',\n pink: '🩷',\n orange: '🟠',\n }[highlight.color];\n\n lines.push(`${colorEmoji}${sourceIcon} > ${highlight.text}`);\n if (highlight.comment) {\n lines.push(`> **Note:** ${highlight.comment}`);\n }\n lines.push('');\n });\n }\n\n // Quick notes for this page\n const pageNotes = quickNotes.filter((n) => n.pageNumber === pageNumber);\n if (pageNotes.length > 0) {\n lines.push('### Notes');\n lines.push('');\n pageNotes.forEach((note) => {\n lines.push(`📝 ${note.content}`);\n if (note.agentLastStatement) {\n lines.push(`> *Written while AI discussed: \"${note.agentLastStatement}\"*`);\n }\n lines.push('');\n });\n }\n\n lines.push('---');\n lines.push('');\n });\n\n // Footer\n lines.push('');\n lines.push('*Generated by PDF Reader with Student Learning Features*');\n\n return lines.join('\\n');\n}\n\n/**\n * Export all annotations as JSON.\n */\nexport function exportAnnotationsAsJSON(data: ExportData): string {\n const exportPayload = {\n version: 1,\n exportedAt: new Date().toISOString(),\n documentTitle: data.documentTitle,\n highlights: data.highlights?.map((h) => ({\n ...h,\n createdAt: h.createdAt.toISOString(),\n updatedAt: h.updatedAt.toISOString(),\n })),\n bookmarks: data.bookmarks?.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: data.quickNotes?.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: data.takeaways?.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n };\n\n return JSON.stringify(exportPayload, null, 2);\n}\n\n/**\n * Download content as a file.\n */\nexport function downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Export annotations as Markdown and trigger download.\n */\nexport function downloadAnnotationsAsMarkdown(data: ExportData, filename = 'study-notes.md'): void {\n const content = exportAnnotationsAsMarkdown(data);\n downloadFile(content, filename, 'text/markdown');\n}\n\n/**\n * Export annotations as JSON and trigger download.\n */\nexport function downloadAnnotationsAsJSON(data: ExportData, filename = 'annotations.json'): void {\n const content = exportAnnotationsAsJSON(data);\n downloadFile(content, filename, 'application/json');\n}\n","import type { Bookmark, QuickNote, Takeaway } from '../types/agent-context';\n\nconst STORAGE_PREFIX = 'pdf-reader-student';\n\n/**\n * Check if localStorage is available (SSR-safe).\n */\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a storage key for a document.\n */\nfunction getStorageKey(documentId: string, type: string): string {\n return `${STORAGE_PREFIX}:${documentId}:${type}`;\n}\n\n// Serialization interfaces\ninterface StoredBookmark extends Omit<Bookmark, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredQuickNote extends Omit<QuickNote, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredTakeaway extends Omit<Takeaway, 'timestamp'> {\n timestamp: string;\n}\n\nexport interface StoredStudentData {\n bookmarks: StoredBookmark[];\n quickNotes: StoredQuickNote[];\n takeaways: StoredTakeaway[];\n visitedPages: number[];\n progress: number;\n lastAccessed: string;\n}\n\nexport interface StudentData {\n bookmarks: Bookmark[];\n quickNotes: QuickNote[];\n takeaways: Takeaway[];\n visitedPages: Set<number>;\n progress: number;\n lastAccessed: Date;\n}\n\n/**\n * Save student data to localStorage.\n */\nexport function saveStudentData(documentId: string, data: StudentData): boolean {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, student data will not persist');\n return false;\n }\n\n try {\n const storedData: StoredStudentData = {\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n visitedPages: Array.from(data.visitedPages),\n progress: data.progress,\n lastAccessed: new Date().toISOString(),\n };\n\n localStorage.setItem(getStorageKey(documentId, 'data'), JSON.stringify(storedData));\n return true;\n } catch (error) {\n console.error('Failed to save student data:', error);\n return false;\n }\n}\n\n/**\n * Load student data from localStorage.\n */\nexport function loadStudentData(documentId: string): StudentData | null {\n if (!isStorageAvailable()) {\n return null;\n }\n\n try {\n const stored = localStorage.getItem(getStorageKey(documentId, 'data'));\n if (!stored) {\n return null;\n }\n\n const data: StoredStudentData = JSON.parse(stored);\n\n return {\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: new Date(b.timestamp),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: new Date(n.timestamp),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: new Date(t.timestamp),\n })),\n visitedPages: new Set(data.visitedPages),\n progress: data.progress,\n lastAccessed: new Date(data.lastAccessed),\n };\n } catch (error) {\n console.error('Failed to load student data:', error);\n return null;\n }\n}\n\n/**\n * Clear student data for a specific document.\n */\nexport function clearStudentData(documentId: string): boolean {\n if (!isStorageAvailable()) {\n return false;\n }\n\n try {\n localStorage.removeItem(getStorageKey(documentId, 'data'));\n return true;\n } catch (error) {\n console.error('Failed to clear student data:', error);\n return false;\n }\n}\n\n/**\n * Get all document IDs that have stored student data.\n */\nexport function getAllStudentDataDocumentIds(): string[] {\n if (!isStorageAvailable()) {\n return [];\n }\n\n const ids: string[] = [];\n const prefixWithColon = STORAGE_PREFIX + ':';\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(prefixWithColon) && key.endsWith(':data')) {\n const id = key.slice(prefixWithColon.length, -5); // Remove prefix and ':data' suffix\n ids.push(id);\n }\n }\n\n return ids;\n}\n\n/**\n * Get storage usage statistics.\n */\nexport function getStorageStats(): { usedBytes: number; itemCount: number } {\n if (!isStorageAvailable()) {\n return { usedBytes: 0, itemCount: 0 };\n }\n\n let usedBytes = 0;\n let itemCount = 0;\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) {\n const value = localStorage.getItem(key);\n if (value) {\n usedBytes += key.length + value.length;\n itemCount++;\n }\n }\n }\n\n return { usedBytes, itemCount };\n}\n","import type { StoreApi } from 'zustand/vanilla';\nimport type { AgentStore } from '../store/agent-store';\nimport type { StudentStore } from '../store/student-store';\nimport type { ViewerStore } from '../store/viewer-store';\nimport type { AnnotationStore } from '../store/annotation-store';\nimport type {\n AgentAPI,\n AgentContext,\n FocusedRegion,\n Takeaway,\n AgentHighlightParams,\n} from '../types/agent-context';\nimport type { HighlightColor } from '../types';\n\nexport interface AgentAPIStores {\n agentStore: StoreApi<AgentStore>;\n studentStore: StoreApi<StudentStore>;\n viewerStore: StoreApi<ViewerStore>;\n annotationStore: StoreApi<AnnotationStore>;\n}\n\n/**\n * Create a standalone Agent API for external AI agent integration.\n * This allows external agents to interact with the PDF viewer without\n * needing direct access to React hooks.\n *\n * @example\n * ```typescript\n * import { createAgentAPI } from 'pdfjs-reader-core';\n *\n * // Get stores from the context (this would typically be done in a React component)\n * const api = createAgentAPI(stores);\n *\n * // Now the external agent can use the API\n * api.setAgentContext({ lastStatement: \"The mitochondria is the powerhouse of the cell\" });\n * api.focusRegion({ pageNumber: 1, x: 100, y: 200, width: 300, height: 50, style: 'pulse' });\n * api.addTakeaway(1, \"Key concept: Cell energy production\");\n * ```\n */\nexport function createAgentAPI(stores: AgentAPIStores): AgentAPI {\n const { agentStore, studentStore, viewerStore, annotationStore } = stores;\n\n let focusRegionIdCounter = 0;\n\n const generateFocusRegionId = (): string => {\n return `api-focus-${++focusRegionIdCounter}-${Date.now()}`;\n };\n\n const api: AgentAPI = {\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => {\n const id = generateFocusRegionId();\n const focusedRegion: FocusedRegion = {\n ...region,\n id,\n style: region.style ?? 'pulse',\n };\n\n const state = agentStore.getState();\n agentStore.setState({\n focusedRegions: [...state.focusedRegions, focusedRegion],\n });\n\n // Set up auto-clear if timeout is specified\n if (region.autoClearTimeout && region.autoClearTimeout > 0) {\n setTimeout(() => {\n api.clearFocusedRegion(id);\n }, region.autoClearTimeout);\n }\n\n return id;\n },\n\n clearFocusedRegion: (id?: string) => {\n if (id) {\n const state = agentStore.getState();\n agentStore.setState({\n focusedRegions: state.focusedRegions.filter((r) => r.id !== id),\n });\n } else {\n agentStore.setState({ focusedRegions: [] });\n }\n },\n\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n const takeaway: Takeaway = {\n id: `takeaway-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n pageNumber,\n summary,\n timestamp: new Date(),\n source: 'agent',\n metadata,\n };\n\n const state = studentStore.getState();\n studentStore.setState({\n takeaways: [...state.takeaways, takeaway],\n });\n\n return takeaway;\n },\n\n setAgentContext: (context: Partial<AgentContext>) => {\n const currentContext = agentStore.getState().currentContext;\n agentStore.setState({\n currentContext: {\n ...currentContext,\n ...context,\n timestamp: context.timestamp ?? new Date(),\n } as AgentContext,\n });\n },\n\n addAgentHighlight: (params: AgentHighlightParams) => {\n const highlightId = `agent-hl-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const now = new Date();\n\n const state = annotationStore.getState();\n annotationStore.setState({\n highlights: [\n ...state.highlights,\n {\n id: highlightId,\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? ('blue' as HighlightColor),\n comment: params.comment,\n createdAt: now,\n updatedAt: now,\n source: 'agent',\n },\n ],\n });\n\n return highlightId;\n },\n\n goToPage: (pageNumber: number) => {\n viewerStore.getState().goToPage(pageNumber);\n },\n\n getCurrentPage: () => {\n return viewerStore.getState().currentPage;\n },\n\n getAgentContext: () => {\n return agentStore.getState().currentContext;\n },\n };\n\n return api;\n}\n\n/**\n * Convenience type for the return value of createAgentAPI\n */\nexport type AgentAPIInstance = ReturnType<typeof createAgentAPI>;\n","export { cn } from './cn';\nexport { initializePDFJS, isPDFJSInitialized, resetPDFJS, pdfjsLib } from './pdfjs-init';\nexport {\n loadDocument,\n getPage,\n getPageTextContent,\n getOutline,\n getMetadata,\n clearDocumentCache,\n preloadDocument,\n type LoadDocumentOptions,\n type LoadDocumentResult,\n} from './document-loader';\nexport {\n saveHighlights,\n loadHighlights,\n clearHighlights,\n getAllDocumentIds,\n exportHighlightsAsJSON,\n importHighlightsFromJSON,\n exportHighlightsAsMarkdown,\n generateDocumentId,\n} from './highlight-storage';\nexport {\n createPDFViewer,\n quickViewer,\n type PDFViewerController,\n type PDFViewerControllerOptions,\n} from './convenience';\n\n// Student Learning Utils\nexport {\n exportAnnotationsAsMarkdown,\n exportAnnotationsAsJSON,\n downloadAnnotationsAsMarkdown,\n downloadAnnotationsAsJSON,\n downloadFile,\n type ExportData,\n} from './export-annotations';\n\nexport {\n saveStudentData,\n loadStudentData,\n clearStudentData,\n getAllStudentDataDocumentIds,\n getStorageStats,\n type StoredStudentData,\n type StudentData,\n} from './student-storage';\n\nexport {\n createAgentAPI,\n type AgentAPIStores,\n type AgentAPIInstance,\n} from './agent-api';\n\n// Mobile Optimizations\nexport {\n detectDeviceCapabilities,\n getDeviceCapabilities,\n getRenderConfig,\n getGlobalRenderConfig,\n getMemoryStatus,\n getGlobalRenderQueue,\n resetMobileConfig,\n calculateOptimalCanvasDimensions,\n throttle,\n debounce,\n requestIdleCallbackCompat,\n cancelIdleCallbackCompat,\n RenderQueue,\n type DeviceCapabilities,\n type RenderQuality,\n type RenderConfig,\n type MemoryStatus,\n} from './mobile-config';\n","import { createStore } from 'zustand/vanilla';\nimport type { SearchState, SearchResult, HighlightRect } from '../types';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\n\n// Define local text item interface to avoid pdfjs-dist type issues\ninterface TextContentItem {\n str?: string;\n transform?: number[];\n width?: number;\n height?: number;\n}\n\nexport interface SearchActions {\n setQuery: (query: string) => void;\n search: (document: PDFDocumentProxy) => Promise<void>;\n clearSearch: () => void;\n nextResult: () => void;\n previousResult: () => void;\n goToResult: (index: number) => void;\n toggleCaseSensitive: () => void;\n toggleWholeWord: () => void;\n getCurrentResult: () => SearchResult | null;\n}\n\nexport type SearchStore = SearchState & SearchActions;\n\nconst initialState: SearchState = {\n query: '',\n results: [],\n currentResultIndex: -1,\n isSearching: false,\n caseSensitive: false,\n wholeWord: false,\n};\n\nfunction isTextItem(item: TextContentItem): item is TextContentItem & { str: string; transform: number[]; width: number; height: number } {\n return typeof item.str === 'string';\n}\n\nexport function createSearchStore(initialOverrides: Partial<SearchState> = {}) {\n return createStore<SearchStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n setQuery: (query) => {\n set({ query });\n },\n\n search: async (document) => {\n const { query, caseSensitive, wholeWord } = get();\n\n if (!query.trim()) {\n set({ results: [], currentResultIndex: -1, isSearching: false });\n return;\n }\n\n set({ isSearching: true, results: [], currentResultIndex: -1 });\n\n const results: SearchResult[] = [];\n const numPages = document.numPages;\n\n // Prepare search pattern\n const searchText = caseSensitive ? query : query.toLowerCase();\n\n for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n try {\n const page = await document.getPage(pageNum);\n const textContent = await page.getTextContent();\n const viewport = page.getViewport({ scale: 1 });\n\n // Combine all text items on the page\n let pageText = '';\n const textItems: Array<{ text: string; transform: number[]; width: number; height: number }> = [];\n\n for (const item of textContent.items as TextContentItem[]) {\n if (isTextItem(item)) {\n textItems.push({\n text: item.str,\n transform: item.transform,\n width: item.width,\n height: item.height,\n });\n pageText += item.str;\n }\n }\n\n // Search in page text\n const textToSearch = caseSensitive ? pageText : pageText.toLowerCase();\n let matchIndex = 0;\n let startIndex = 0;\n\n while ((startIndex = textToSearch.indexOf(searchText, startIndex)) !== -1) {\n // Check whole word condition\n if (wholeWord) {\n const before = startIndex > 0 ? textToSearch[startIndex - 1] : ' ';\n const after = startIndex + searchText.length < textToSearch.length\n ? textToSearch[startIndex + searchText.length]\n : ' ';\n\n if (/\\w/.test(before) || /\\w/.test(after)) {\n startIndex++;\n continue;\n }\n }\n\n // Find the text items that contain this match\n const matchText = pageText.substring(startIndex, startIndex + query.length);\n const rects = calculateMatchRects(textItems, startIndex, query.length, viewport);\n\n results.push({\n pageNumber: pageNum,\n matchIndex: matchIndex++,\n text: matchText,\n rects,\n });\n\n startIndex++;\n }\n } catch (error) {\n console.error(`Error searching page ${pageNum}:`, error);\n }\n }\n\n set({\n results,\n currentResultIndex: results.length > 0 ? 0 : -1,\n isSearching: false,\n });\n },\n\n clearSearch: () => {\n set(initialState);\n },\n\n nextResult: () => {\n const { results, currentResultIndex } = get();\n if (results.length === 0) return;\n\n const nextIndex = (currentResultIndex + 1) % results.length;\n set({ currentResultIndex: nextIndex });\n },\n\n previousResult: () => {\n const { results, currentResultIndex } = get();\n if (results.length === 0) return;\n\n const prevIndex = currentResultIndex <= 0 ? results.length - 1 : currentResultIndex - 1;\n set({ currentResultIndex: prevIndex });\n },\n\n goToResult: (index) => {\n const { results } = get();\n if (index >= 0 && index < results.length) {\n set({ currentResultIndex: index });\n }\n },\n\n toggleCaseSensitive: () => {\n set((state) => ({ caseSensitive: !state.caseSensitive }));\n },\n\n toggleWholeWord: () => {\n set((state) => ({ wholeWord: !state.wholeWord }));\n },\n\n getCurrentResult: () => {\n const { results, currentResultIndex } = get();\n if (currentResultIndex >= 0 && currentResultIndex < results.length) {\n return results[currentResultIndex];\n }\n return null;\n },\n }));\n}\n\n/**\n * Calculate the bounding rectangles for a text match.\n * This is a simplified implementation that may need refinement for complex layouts.\n */\nfunction calculateMatchRects(\n textItems: Array<{ text: string; transform: number[]; width: number; height: number }>,\n startOffset: number,\n length: number,\n viewport: { width: number; height: number }\n): HighlightRect[] {\n const rects: HighlightRect[] = [];\n let currentOffset = 0;\n\n for (const item of textItems) {\n const itemStart = currentOffset;\n const itemEnd = currentOffset + item.text.length;\n\n // Check if this item overlaps with our match\n if (itemEnd > startOffset && itemStart < startOffset + length) {\n const [, , c, d, tx, ty] = item.transform;\n\n // Convert PDF coordinates to viewport coordinates\n const x = tx;\n const y = viewport.height - ty;\n\n // Approximate height from transform matrix\n const height = Math.sqrt(c * c + d * d);\n\n // Calculate the portion of this item that's part of the match\n const matchStartInItem = Math.max(0, startOffset - itemStart);\n const matchEndInItem = Math.min(item.text.length, startOffset + length - itemStart);\n const matchWidth = (item.width / item.text.length) * (matchEndInItem - matchStartInItem);\n const matchX = x + (item.width / item.text.length) * matchStartInItem;\n\n rects.push({\n x: matchX,\n y: y - height,\n width: matchWidth,\n height: height,\n });\n }\n\n currentOffset = itemEnd;\n }\n\n return rects;\n}\n\nexport type SearchStoreApi = ReturnType<typeof createSearchStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type { AgentState, AgentActions, AgentContext, FocusedRegion } from '../types/agent-context';\n\nexport type AgentStore = AgentState & AgentActions;\n\nconst initialState: AgentState = {\n currentContext: null,\n focusedRegions: [],\n};\n\nlet focusRegionIdCounter = 0;\n\nfunction generateFocusRegionId(): string {\n return `focus-region-${++focusRegionIdCounter}-${Date.now()}`;\n}\n\nexport function createAgentStore(initialOverrides: Partial<AgentState> = {}) {\n return createStore<AgentStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n setAgentContext: (context: Partial<AgentContext>) => {\n const { currentContext } = get();\n set({\n currentContext: {\n ...currentContext,\n ...context,\n timestamp: context.timestamp ?? new Date(),\n } as AgentContext,\n });\n },\n\n clearAgentContext: () => {\n set({ currentContext: null });\n },\n\n addFocusedRegion: (region: Omit<FocusedRegion, 'id'>) => {\n const id = generateFocusRegionId();\n const focusedRegion: FocusedRegion = {\n ...region,\n id,\n style: region.style ?? 'pulse',\n };\n\n set((state) => ({\n focusedRegions: [...state.focusedRegions, focusedRegion],\n }));\n\n // Set up auto-clear if timeout is specified\n if (region.autoClearTimeout && region.autoClearTimeout > 0) {\n setTimeout(() => {\n const { removeFocusedRegion } = get();\n removeFocusedRegion(id);\n }, region.autoClearTimeout);\n }\n\n return id;\n },\n\n removeFocusedRegion: (id: string) => {\n set((state) => ({\n focusedRegions: state.focusedRegions.filter((r) => r.id !== id),\n }));\n },\n\n clearAllFocusedRegions: () => {\n set({ focusedRegions: [] });\n },\n\n reset: () => {\n set(initialState);\n },\n }));\n}\n\nexport type AgentStoreApi = ReturnType<typeof createAgentStore>;\n","import { createStore } from 'zustand/vanilla';\nimport type {\n StudentState,\n StudentActions,\n Bookmark,\n QuickNote,\n Takeaway,\n} from '../types/agent-context';\n\nexport type StudentStore = StudentState & StudentActions;\n\nconst STORAGE_PREFIX = 'pdf-reader-student';\n\nlet idCounter = 0;\n\nfunction generateId(prefix: string): string {\n return `${prefix}-${++idCounter}-${Date.now()}`;\n}\n\nfunction isStorageAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const test = '__storage_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getStorageKey(documentId: string, type: string): string {\n return `${STORAGE_PREFIX}:${documentId}:${type}`;\n}\n\n// Serialization helpers for dates\ninterface StoredBookmark extends Omit<Bookmark, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredQuickNote extends Omit<QuickNote, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredTakeaway extends Omit<Takeaway, 'timestamp'> {\n timestamp: string;\n}\n\ninterface StoredStudentData {\n bookmarks: StoredBookmark[];\n quickNotes: StoredQuickNote[];\n takeaways: StoredTakeaway[];\n visitedPages: number[];\n progress: number;\n}\n\nconst initialState: StudentState = {\n bookmarks: [],\n quickNotes: [],\n takeaways: [],\n visitedPages: new Set<number>(),\n progress: 0,\n};\n\nexport function createStudentStore(initialOverrides: Partial<StudentState> = {}) {\n return createStore<StudentStore>()((set, get) => ({\n ...initialState,\n ...initialOverrides,\n\n // Bookmark actions\n addBookmark: (bookmark: Omit<Bookmark, 'id' | 'timestamp'>) => {\n const newBookmark: Bookmark = {\n ...bookmark,\n id: generateId('bookmark'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n bookmarks: [...state.bookmarks, newBookmark],\n }));\n\n return newBookmark;\n },\n\n updateBookmark: (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => {\n set((state) => ({\n bookmarks: state.bookmarks.map((b) =>\n b.id === id ? { ...b, ...updates } : b\n ),\n }));\n },\n\n removeBookmark: (id: string) => {\n set((state) => ({\n bookmarks: state.bookmarks.filter((b) => b.id !== id),\n }));\n },\n\n // Quick note actions\n addQuickNote: (note: Omit<QuickNote, 'id' | 'timestamp'>) => {\n const newNote: QuickNote = {\n ...note,\n id: generateId('note'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n quickNotes: [...state.quickNotes, newNote],\n }));\n\n return newNote;\n },\n\n updateQuickNote: (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => {\n set((state) => ({\n quickNotes: state.quickNotes.map((n) =>\n n.id === id ? { ...n, ...updates } : n\n ),\n }));\n },\n\n removeQuickNote: (id: string) => {\n set((state) => ({\n quickNotes: state.quickNotes.filter((n) => n.id !== id),\n }));\n },\n\n // Takeaway actions\n addTakeaway: (takeaway: Omit<Takeaway, 'id' | 'timestamp'>) => {\n const newTakeaway: Takeaway = {\n ...takeaway,\n id: generateId('takeaway'),\n timestamp: new Date(),\n };\n\n set((state) => ({\n takeaways: [...state.takeaways, newTakeaway],\n }));\n\n return newTakeaway;\n },\n\n removeTakeaway: (id: string) => {\n set((state) => ({\n takeaways: state.takeaways.filter((t) => t.id !== id),\n }));\n },\n\n // Progress tracking\n markPageVisited: (pageNumber: number) => {\n set((state) => {\n const newVisitedPages = new Set(state.visitedPages);\n newVisitedPages.add(pageNumber);\n return { visitedPages: newVisitedPages };\n });\n },\n\n setProgress: (progress: number) => {\n set({ progress: Math.max(0, Math.min(1, progress)) });\n },\n\n // Persistence\n persistToStorage: (documentId: string) => {\n if (!isStorageAvailable()) {\n console.warn('localStorage not available, student data will not persist');\n return;\n }\n\n const state = get();\n\n const data: StoredStudentData = {\n bookmarks: state.bookmarks.map((b) => ({\n ...b,\n timestamp: b.timestamp.toISOString(),\n })),\n quickNotes: state.quickNotes.map((n) => ({\n ...n,\n timestamp: n.timestamp.toISOString(),\n })),\n takeaways: state.takeaways.map((t) => ({\n ...t,\n timestamp: t.timestamp.toISOString(),\n })),\n visitedPages: Array.from(state.visitedPages),\n progress: state.progress,\n };\n\n try {\n localStorage.setItem(getStorageKey(documentId, 'data'), JSON.stringify(data));\n } catch (error) {\n console.error('Failed to persist student data:', error);\n }\n },\n\n loadFromStorage: (documentId: string) => {\n if (!isStorageAvailable()) {\n return;\n }\n\n try {\n const stored = localStorage.getItem(getStorageKey(documentId, 'data'));\n if (!stored) {\n return;\n }\n\n const data: StoredStudentData = JSON.parse(stored);\n\n set({\n bookmarks: data.bookmarks.map((b) => ({\n ...b,\n timestamp: new Date(b.timestamp),\n })),\n quickNotes: data.quickNotes.map((n) => ({\n ...n,\n timestamp: new Date(n.timestamp),\n })),\n takeaways: data.takeaways.map((t) => ({\n ...t,\n timestamp: new Date(t.timestamp),\n })),\n visitedPages: new Set(data.visitedPages),\n progress: data.progress,\n });\n } catch (error) {\n console.error('Failed to load student data:', error);\n }\n },\n\n reset: () => {\n set(initialState);\n },\n }));\n}\n\nexport type StudentStoreApi = ReturnType<typeof createStudentStore>;\n","export {\n createViewerStore,\n type ViewerStore,\n type ViewerStoreApi,\n} from './viewer-store';\n\nexport {\n createAnnotationStore,\n type AnnotationStore,\n type AnnotationStoreApi,\n type AnnotationState,\n type AnnotationActions,\n type AnnotationTool,\n type ShapeType,\n} from './annotation-store';\n\nexport {\n createSearchStore,\n type SearchStore,\n type SearchStoreApi,\n type SearchActions,\n} from './search-store';\n\nexport {\n createAgentStore,\n type AgentStore,\n type AgentStoreApi,\n} from './agent-store';\n\nexport {\n createStudentStore,\n type StudentStore,\n type StudentStoreApi,\n} from './student-store';\n","import { createContext, useContext, useRef, useEffect, type ReactNode } from 'react';\nimport { useStore } from 'zustand';\nimport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\n createAgentStore,\n createStudentStore,\n type ViewerStoreApi,\n type AnnotationStoreApi,\n type SearchStoreApi,\n type AgentStoreApi,\n type StudentStoreApi,\n type ViewerStore,\n type AnnotationStore,\n type SearchStore,\n type AgentStore,\n type StudentStore,\n type AnnotationState,\n} from '../store';\nimport type { ViewerState, SearchState, Theme, SidebarPanel, AgentState, StudentState } from '../types';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface PDFViewerContextValue {\n viewerStore: ViewerStoreApi;\n annotationStore: AnnotationStoreApi;\n searchStore: SearchStoreApi;\n agentStore: AgentStoreApi;\n studentStore: StudentStoreApi;\n}\n\nexport interface PDFViewerProviderProps {\n children: ReactNode;\n initialState?: {\n viewer?: Partial<ViewerState>;\n annotation?: Partial<AnnotationState>;\n search?: Partial<SearchState>;\n agent?: Partial<AgentState>;\n student?: Partial<StudentState>;\n };\n theme?: Theme;\n defaultSidebarPanel?: SidebarPanel;\n /** Enable student learning mode features */\n studentMode?: boolean;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PDFViewerContext = createContext<PDFViewerContextValue | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport function PDFViewerProvider({\n children,\n initialState,\n theme = 'light',\n defaultSidebarPanel = 'thumbnails',\n studentMode: _studentMode = false,\n}: PDFViewerProviderProps) {\n const viewerStoreRef = useRef<ViewerStoreApi | null>(null);\n const annotationStoreRef = useRef<AnnotationStoreApi | null>(null);\n const searchStoreRef = useRef<SearchStoreApi | null>(null);\n const agentStoreRef = useRef<AgentStoreApi | null>(null);\n const studentStoreRef = useRef<StudentStoreApi | null>(null);\n\n // Create stores only once\n if (!viewerStoreRef.current) {\n viewerStoreRef.current = createViewerStore({\n ...initialState?.viewer,\n theme,\n sidebarPanel: defaultSidebarPanel,\n });\n }\n\n if (!annotationStoreRef.current) {\n annotationStoreRef.current = createAnnotationStore(initialState?.annotation);\n }\n\n if (!searchStoreRef.current) {\n searchStoreRef.current = createSearchStore(initialState?.search);\n }\n\n // Create agent and student stores (always created for API consistency)\n if (!agentStoreRef.current) {\n agentStoreRef.current = createAgentStore(initialState?.agent);\n }\n\n if (!studentStoreRef.current) {\n studentStoreRef.current = createStudentStore(initialState?.student);\n }\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n viewerStoreRef.current?.getState().reset();\n agentStoreRef.current?.getState().reset();\n studentStoreRef.current?.getState().reset();\n };\n }, []);\n\n return (\n <PDFViewerContext.Provider\n value={{\n viewerStore: viewerStoreRef.current,\n annotationStore: annotationStoreRef.current,\n searchStore: searchStoreRef.current,\n agentStore: agentStoreRef.current,\n studentStore: studentStoreRef.current,\n }}\n >\n {children}\n </PDFViewerContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nfunction usePDFViewerContext() {\n const context = useContext(PDFViewerContext);\n if (!context) {\n throw new Error('usePDFViewerContext must be used within a PDFViewerProvider');\n }\n return context;\n}\n\n/**\n * Hook to access the viewer store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useViewerStore<T>(selector: (state: ViewerStore) => T): T {\n const { viewerStore } = usePDFViewerContext();\n return useStore(viewerStore, selector);\n}\n\n/**\n * Hook to access the annotation store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useAnnotationStore<T>(selector: (state: AnnotationStore) => T): T {\n const { annotationStore } = usePDFViewerContext();\n return useStore(annotationStore, selector);\n}\n\n/**\n * Hook to access the search store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useSearchStore<T>(selector: (state: SearchStore) => T): T {\n const { searchStore } = usePDFViewerContext();\n return useStore(searchStore, selector);\n}\n\n/**\n * Hook to access the agent store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useAgentStore<T>(selector: (state: AgentStore) => T): T {\n const { agentStore } = usePDFViewerContext();\n return useStore(agentStore, selector);\n}\n\n/**\n * Hook to access the student store.\n * Optionally pass a selector to subscribe to specific state.\n */\nexport function useStudentStore<T>(selector: (state: StudentStore) => T): T {\n const { studentStore } = usePDFViewerContext();\n return useStore(studentStore, selector);\n}\n\n/**\n * Hook to access all stores directly (for actions).\n */\nexport function usePDFViewerStores() {\n return usePDFViewerContext();\n}\n\nexport { PDFViewerContext };\n","import { useCallback, useMemo } from 'react';\nimport {\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n} from './PDFViewerContext';\nimport type { Theme, ViewMode, SidebarPanel, HighlightColor, Highlight } from '../types';\nimport type {\n AgentContext,\n FocusedRegion,\n Bookmark,\n QuickNote,\n Takeaway,\n AgentAPI,\n AgentHighlightParams,\n} from '../types/agent-context';\n\ntype AddHighlightParams = Omit<Highlight, 'id' | 'createdAt' | 'updatedAt'>;\n\n/**\n * Main unified hook for accessing PDF viewer state and actions.\n * This is the primary API for controlling the viewer.\n */\nexport function usePDFViewer() {\n const { viewerStore, annotationStore, searchStore, agentStore, studentStore } = usePDFViewerStores();\n\n // ============================================================================\n // Viewer State\n // ============================================================================\n\n const document = useViewerStore((s) => s.document);\n const numPages = useViewerStore((s) => s.numPages);\n const currentPage = useViewerStore((s) => s.currentPage);\n const scale = useViewerStore((s) => s.scale);\n const rotation = useViewerStore((s) => s.rotation);\n const isLoading = useViewerStore((s) => s.isLoading);\n const error = useViewerStore((s) => s.error);\n const theme = useViewerStore((s) => s.theme);\n const viewMode = useViewerStore((s) => s.viewMode);\n const sidebarOpen = useViewerStore((s) => s.sidebarOpen);\n const sidebarPanel = useViewerStore((s) => s.sidebarPanel);\n const isFullscreen = useViewerStore((s) => s.isFullscreen);\n\n // ============================================================================\n // Annotation State\n // ============================================================================\n\n const highlights = useAnnotationStore((s) => s.highlights);\n const annotations = useAnnotationStore((s) => s.annotations);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const activeHighlightColor = useAnnotationStore((s) => s.activeHighlightColor);\n const isHighlightMode = useAnnotationStore((s) => s.isHighlightMode);\n\n // ============================================================================\n // Search State\n // ============================================================================\n\n const searchQuery = useSearchStore((s) => s.query);\n const searchResults = useSearchStore((s) => s.results);\n const currentSearchResult = useSearchStore((s) => s.currentResultIndex);\n const isSearching = useSearchStore((s) => s.isSearching);\n\n // ============================================================================\n // Navigation Actions\n // ============================================================================\n\n const goToPage = useCallback(\n (page: number) => viewerStore.getState().goToPage(page),\n [viewerStore]\n );\n\n const nextPage = useCallback(\n () => viewerStore.getState().nextPage(),\n [viewerStore]\n );\n\n const previousPage = useCallback(\n () => viewerStore.getState().previousPage(),\n [viewerStore]\n );\n\n // ============================================================================\n // Zoom Actions\n // ============================================================================\n\n const setScale = useCallback(\n (newScale: number) => viewerStore.getState().setScale(newScale),\n [viewerStore]\n );\n\n const zoomIn = useCallback(\n () => viewerStore.getState().zoomIn(),\n [viewerStore]\n );\n\n const zoomOut = useCallback(\n () => viewerStore.getState().zoomOut(),\n [viewerStore]\n );\n\n const fitToWidth = useCallback(\n () => viewerStore.getState().fitToWidth(),\n [viewerStore]\n );\n\n const fitToPage = useCallback(\n () => viewerStore.getState().fitToPage(),\n [viewerStore]\n );\n\n // ============================================================================\n // Rotation Actions\n // ============================================================================\n\n const rotateClockwise = useCallback(\n () => viewerStore.getState().rotateClockwise(),\n [viewerStore]\n );\n\n const rotateCounterClockwise = useCallback(\n () => viewerStore.getState().rotateCounterClockwise(),\n [viewerStore]\n );\n\n // ============================================================================\n // UI Actions\n // ============================================================================\n\n const setTheme = useCallback(\n (newTheme: Theme) => viewerStore.getState().setTheme(newTheme),\n [viewerStore]\n );\n\n const setViewMode = useCallback(\n (mode: ViewMode) => viewerStore.getState().setViewMode(mode),\n [viewerStore]\n );\n\n const toggleSidebar = useCallback(\n () => viewerStore.getState().toggleSidebar(),\n [viewerStore]\n );\n\n const setSidebarPanel = useCallback(\n (panel: SidebarPanel) => viewerStore.getState().setSidebarPanel(panel),\n [viewerStore]\n );\n\n const setFullscreen = useCallback(\n (fullscreen: boolean) => viewerStore.getState().setFullscreen(fullscreen),\n [viewerStore]\n );\n\n // ============================================================================\n // Highlight Actions\n // ============================================================================\n\n const addHighlight = useCallback(\n (highlight: AddHighlightParams) =>\n annotationStore.getState().addHighlight(highlight),\n [annotationStore]\n );\n\n const removeHighlight = useCallback(\n (id: string) => annotationStore.getState().removeHighlight(id),\n [annotationStore]\n );\n\n const setActiveHighlightColor = useCallback(\n (color: HighlightColor) => annotationStore.getState().setActiveHighlightColor(color),\n [annotationStore]\n );\n\n const setHighlightMode = useCallback(\n (enabled: boolean) => annotationStore.getState().setHighlightMode(enabled),\n [annotationStore]\n );\n\n // ============================================================================\n // Search Actions\n // ============================================================================\n\n const search = useCallback(\n async (query: string) => {\n const doc = viewerStore.getState().document;\n if (!doc) return;\n searchStore.getState().setQuery(query);\n await searchStore.getState().search(doc);\n },\n [viewerStore, searchStore]\n );\n\n const clearSearch = useCallback(\n () => searchStore.getState().clearSearch(),\n [searchStore]\n );\n\n const nextSearchResult = useCallback(\n () => searchStore.getState().nextResult(),\n [searchStore]\n );\n\n const previousSearchResult = useCallback(\n () => searchStore.getState().previousResult(),\n [searchStore]\n );\n\n // ============================================================================\n // Agent Context State & Actions\n // ============================================================================\n\n const agentContext = useAgentStore((s) => s.currentContext);\n const focusedRegions = useAgentStore((s) => s.focusedRegions);\n\n const setAgentContext = useCallback(\n (context: Partial<AgentContext>) => agentStore.getState().setAgentContext(context),\n [agentStore]\n );\n\n const clearAgentContext = useCallback(\n () => agentStore.getState().clearAgentContext(),\n [agentStore]\n );\n\n const focusRegion = useCallback(\n (region: Omit<FocusedRegion, 'id'>) => agentStore.getState().addFocusedRegion(region),\n [agentStore]\n );\n\n const clearFocusedRegion = useCallback(\n (id: string) => agentStore.getState().removeFocusedRegion(id),\n [agentStore]\n );\n\n const clearAllFocusedRegions = useCallback(\n () => agentStore.getState().clearAllFocusedRegions(),\n [agentStore]\n );\n\n // ============================================================================\n // Student State & Actions\n // ============================================================================\n\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const quickNotes = useStudentStore((s) => s.quickNotes);\n const takeaways = useStudentStore((s) => s.takeaways);\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const progress = useStudentStore((s) => s.progress);\n\n const addBookmark = useCallback(\n (data: Omit<Bookmark, 'id' | 'timestamp'>) => {\n // Capture agent context when bookmarking\n const context = agentStore.getState().currentContext;\n return studentStore.getState().addBookmark({\n ...data,\n agentContext: data.agentContext ?? context?.lastStatement,\n });\n },\n [studentStore, agentStore]\n );\n\n const updateBookmark = useCallback(\n (id: string, updates: Partial<Omit<Bookmark, 'id'>>) =>\n studentStore.getState().updateBookmark(id, updates),\n [studentStore]\n );\n\n const removeBookmark = useCallback(\n (id: string) => studentStore.getState().removeBookmark(id),\n [studentStore]\n );\n\n const addQuickNote = useCallback(\n (data: Omit<QuickNote, 'id' | 'timestamp'>) => {\n // Capture agent context when adding note\n const context = agentStore.getState().currentContext;\n return studentStore.getState().addQuickNote({\n ...data,\n agentLastStatement: data.agentLastStatement ?? context?.lastStatement,\n });\n },\n [studentStore, agentStore]\n );\n\n const updateQuickNote = useCallback(\n (id: string, updates: Partial<Omit<QuickNote, 'id'>>) =>\n studentStore.getState().updateQuickNote(id, updates),\n [studentStore]\n );\n\n const removeQuickNote = useCallback(\n (id: string) => studentStore.getState().removeQuickNote(id),\n [studentStore]\n );\n\n const addTakeaway = useCallback(\n (data: Omit<Takeaway, 'id' | 'timestamp'>) => studentStore.getState().addTakeaway(data),\n [studentStore]\n );\n\n const removeTakeaway = useCallback(\n (id: string) => studentStore.getState().removeTakeaway(id),\n [studentStore]\n );\n\n const markPageVisited = useCallback(\n (pageNumber: number) => studentStore.getState().markPageVisited(pageNumber),\n [studentStore]\n );\n\n // ============================================================================\n // Agent API Factory\n // ============================================================================\n\n const getAgentAPI = useCallback((): AgentAPI => {\n return {\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => {\n return agentStore.getState().addFocusedRegion(region);\n },\n clearFocusedRegion: (id?: string) => {\n if (id) {\n agentStore.getState().removeFocusedRegion(id);\n } else {\n agentStore.getState().clearAllFocusedRegions();\n }\n },\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n return studentStore.getState().addTakeaway({\n pageNumber,\n summary,\n source: 'agent',\n metadata,\n });\n },\n setAgentContext: (context: Partial<AgentContext>) => {\n agentStore.getState().setAgentContext(context);\n },\n addAgentHighlight: (params: AgentHighlightParams) => {\n const highlight = annotationStore.getState().addHighlight({\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? 'blue',\n comment: params.comment,\n source: 'agent',\n });\n return highlight.id;\n },\n goToPage: (pageNumber: number) => {\n viewerStore.getState().goToPage(pageNumber);\n },\n getCurrentPage: () => viewerStore.getState().currentPage,\n getAgentContext: () => agentStore.getState().currentContext,\n };\n }, [agentStore, studentStore, annotationStore, viewerStore]);\n\n // ============================================================================\n // Return API\n // ============================================================================\n\n return useMemo(\n () => ({\n // Document state\n document,\n numPages,\n isLoading,\n error,\n\n // Navigation\n currentPage,\n goToPage,\n nextPage,\n previousPage,\n\n // Zoom\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n\n // Rotation\n rotation,\n rotateClockwise,\n rotateCounterClockwise,\n\n // Theme & UI\n theme,\n setTheme,\n viewMode,\n setViewMode,\n sidebarOpen,\n toggleSidebar,\n sidebarPanel,\n setSidebarPanel,\n isFullscreen,\n setFullscreen,\n\n // Highlights\n highlights,\n selectedHighlightId,\n activeHighlightColor,\n isHighlightMode,\n addHighlight,\n removeHighlight,\n setActiveHighlightColor,\n setHighlightMode,\n\n // Annotations\n annotations,\n\n // Search\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n\n // Agent Context (Student Mode)\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n getAgentAPI,\n\n // Bookmarks (Student Mode)\n bookmarks,\n addBookmark,\n updateBookmark,\n removeBookmark,\n\n // Quick Notes (Student Mode)\n quickNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n\n // Takeaways (Student Mode)\n takeaways,\n addTakeaway,\n removeTakeaway,\n\n // Progress (Student Mode)\n visitedPages,\n progress,\n markPageVisited,\n }),\n [\n document,\n numPages,\n isLoading,\n error,\n currentPage,\n goToPage,\n nextPage,\n previousPage,\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n rotation,\n rotateClockwise,\n rotateCounterClockwise,\n theme,\n setTheme,\n viewMode,\n setViewMode,\n sidebarOpen,\n toggleSidebar,\n sidebarPanel,\n setSidebarPanel,\n isFullscreen,\n setFullscreen,\n highlights,\n selectedHighlightId,\n activeHighlightColor,\n isHighlightMode,\n addHighlight,\n removeHighlight,\n setActiveHighlightColor,\n setHighlightMode,\n annotations,\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n getAgentAPI,\n bookmarks,\n addBookmark,\n updateBookmark,\n removeBookmark,\n quickNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n takeaways,\n addTakeaway,\n removeTakeaway,\n visitedPages,\n progress,\n markPageVisited,\n ]\n );\n}\n","import { useCallback, useEffect } from 'react';\nimport { useViewerStore, usePDFViewerStores } from './PDFViewerContext';\n\nexport interface UsePageNavigationOptions {\n enableKeyboardNavigation?: boolean;\n}\n\n/**\n * Hook for page navigation functionality.\n */\nexport function usePageNavigation(options: UsePageNavigationOptions = {}) {\n const { enableKeyboardNavigation = true } = options;\n const { viewerStore } = usePDFViewerStores();\n\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n\n const goToPage = useCallback(\n (page: number) => viewerStore.getState().goToPage(page),\n [viewerStore]\n );\n\n const nextPage = useCallback(\n () => viewerStore.getState().nextPage(),\n [viewerStore]\n );\n\n const previousPage = useCallback(\n () => viewerStore.getState().previousPage(),\n [viewerStore]\n );\n\n const goToFirstPage = useCallback(\n () => viewerStore.getState().goToPage(1),\n [viewerStore]\n );\n\n const goToLastPage = useCallback(\n () => {\n const { numPages } = viewerStore.getState();\n viewerStore.getState().goToPage(numPages);\n },\n [viewerStore]\n );\n\n // Keyboard navigation\n useEffect(() => {\n if (!enableKeyboardNavigation) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle if user is typing in an input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowRight':\n case 'PageDown':\n e.preventDefault();\n nextPage();\n break;\n case 'ArrowLeft':\n case 'PageUp':\n e.preventDefault();\n previousPage();\n break;\n case 'Home':\n e.preventDefault();\n goToFirstPage();\n break;\n case 'End':\n e.preventDefault();\n goToLastPage();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enableKeyboardNavigation, nextPage, previousPage, goToFirstPage, goToLastPage]);\n\n return {\n currentPage,\n numPages,\n goToPage,\n nextPage,\n previousPage,\n goToFirstPage,\n goToLastPage,\n canGoNext: currentPage < numPages,\n canGoPrevious: currentPage > 1,\n };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useViewerStore, usePDFViewerStores } from './PDFViewerContext';\n\nexport interface UseZoomOptions {\n enableWheelZoom?: boolean;\n minScale?: number;\n maxScale?: number;\n}\n\n/**\n * Hook for zoom functionality.\n */\nexport function useZoom(options: UseZoomOptions = {}) {\n const { enableWheelZoom = true, minScale = 0.1, maxScale = 10 } = options;\n const { viewerStore } = usePDFViewerStores();\n const containerRef = useRef<HTMLElement | null>(null);\n\n const scale = useViewerStore((s) => s.scale);\n\n const setScale = useCallback(\n (newScale: number) => {\n const clamped = Math.max(minScale, Math.min(maxScale, newScale));\n viewerStore.getState().setScale(clamped);\n },\n [viewerStore, minScale, maxScale]\n );\n\n const zoomIn = useCallback(\n () => viewerStore.getState().zoomIn(),\n [viewerStore]\n );\n\n const zoomOut = useCallback(\n () => viewerStore.getState().zoomOut(),\n [viewerStore]\n );\n\n const fitToWidth = useCallback(\n () => viewerStore.getState().fitToWidth(),\n [viewerStore]\n );\n\n const fitToPage = useCallback(\n () => viewerStore.getState().fitToPage(),\n [viewerStore]\n );\n\n const resetZoom = useCallback(\n () => viewerStore.getState().setScale(1),\n [viewerStore]\n );\n\n // Wheel zoom handler\n useEffect(() => {\n if (!enableWheelZoom) return;\n\n const handleWheel = (e: Event) => {\n const wheelEvent = e as WheelEvent;\n // Only zoom when Ctrl/Cmd is pressed\n if (!wheelEvent.ctrlKey && !wheelEvent.metaKey) return;\n\n e.preventDefault();\n\n const delta = wheelEvent.deltaY > 0 ? -0.1 : 0.1;\n const newScale = scale + delta;\n setScale(newScale);\n };\n\n const container = containerRef.current || document;\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [enableWheelZoom, scale, setScale]);\n\n // Keyboard zoom\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle if user is typing in an input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n if (e.ctrlKey || e.metaKey) {\n switch (e.key) {\n case '=':\n case '+':\n e.preventDefault();\n zoomIn();\n break;\n case '-':\n e.preventDefault();\n zoomOut();\n break;\n case '0':\n e.preventDefault();\n resetZoom();\n break;\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [zoomIn, zoomOut, resetZoom]);\n\n return {\n scale,\n setScale,\n zoomIn,\n zoomOut,\n fitToWidth,\n fitToPage,\n resetZoom,\n setContainerRef: (el: HTMLElement | null) => {\n containerRef.current = el;\n },\n scalePercentage: Math.round(scale * 100),\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { TextSelection } from '../types';\n\nexport interface UseTextSelectionOptions {\n onSelect?: (selection: TextSelection) => void;\n onCopy?: (text: string) => void;\n}\n\n/**\n * Hook for handling text selection in the PDF viewer.\n */\nexport function useTextSelection(options: UseTextSelectionOptions = {}) {\n const { onSelect, onCopy } = options;\n const [selection, setSelection] = useState<TextSelection | null>(null);\n const [isSelecting, setIsSelecting] = useState(false);\n\n const handleSelectionChange = useCallback(() => {\n const windowSelection = window.getSelection();\n\n if (!windowSelection || windowSelection.isCollapsed) {\n setSelection(null);\n return;\n }\n\n const text = windowSelection.toString().trim();\n if (!text) {\n setSelection(null);\n return;\n }\n\n // Find the page number from the selection's container\n const anchorNode = windowSelection.anchorNode;\n let pageElement = anchorNode?.parentElement;\n\n while (pageElement && !pageElement.dataset.pageNumber) {\n pageElement = pageElement.parentElement;\n }\n\n const pageNumber = pageElement ? parseInt(pageElement.dataset.pageNumber || '1', 10) : 1;\n\n // Get bounding rectangles\n const range = windowSelection.getRangeAt(0);\n const rects = Array.from(range.getClientRects());\n\n const newSelection: TextSelection = {\n text,\n pageNumber,\n rects,\n };\n\n setSelection(newSelection);\n onSelect?.(newSelection);\n }, [onSelect]);\n\n const clearSelection = useCallback(() => {\n window.getSelection()?.removeAllRanges();\n setSelection(null);\n }, []);\n\n const copySelection = useCallback(() => {\n if (selection?.text) {\n navigator.clipboard.writeText(selection.text).then(() => {\n onCopy?.(selection.text);\n });\n }\n }, [selection, onCopy]);\n\n // Listen for selection changes\n useEffect(() => {\n const handleMouseUp = () => {\n setIsSelecting(false);\n handleSelectionChange();\n };\n\n const handleMouseDown = () => {\n setIsSelecting(true);\n };\n\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('selectionchange', handleSelectionChange);\n\n return () => {\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('selectionchange', handleSelectionChange);\n };\n }, [handleSelectionChange]);\n\n // Handle Ctrl+C for copy\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'c' && selection) {\n // Let the default copy behavior work, but also trigger our callback\n onCopy?.(selection.text);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selection, onCopy]);\n\n return {\n selection,\n isSelecting,\n clearSelection,\n copySelection,\n hasSelection: selection !== null && selection.text.length > 0,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { useAnnotationStore } from './PDFViewerContext';\nimport type { TextSelection, HighlightRect, HighlightColor, Highlight } from '../types';\n\nexport interface UseHighlightsOptions {\n /** Callback when a highlight is created */\n onHighlightCreate?: (highlight: Highlight) => void;\n /** Callback when a highlight is updated */\n onHighlightUpdate?: (highlight: Highlight) => void;\n /** Callback when a highlight is deleted */\n onHighlightDelete?: (id: string) => void;\n}\n\nexport interface UseHighlightsReturn {\n /** Create a highlight from the current text selection */\n createHighlightFromSelection: (\n selection: TextSelection,\n pageElement: HTMLElement,\n scale: number,\n color?: HighlightColor\n ) => Highlight | null;\n /**\n * Add a highlight programmatically with coordinates.\n * Coordinates should be in PDF points (not scaled).\n *\n * @example\n * ```tsx\n * addHighlight({\n * pageNumber: 1,\n * rects: [{ x: 100, y: 200, width: 150, height: 20 }],\n * text: \"Highlighted text\",\n * color: \"yellow\"\n * });\n * ```\n */\n addHighlight: (highlight: {\n pageNumber: number;\n rects: HighlightRect[];\n text: string;\n color?: HighlightColor;\n comment?: string;\n }) => Highlight;\n /** Update an existing highlight */\n updateHighlight: (id: string, updates: Partial<Pick<Highlight, 'color' | 'comment'>>) => void;\n /** Delete a highlight */\n deleteHighlight: (id: string) => void;\n /** Get highlights for a specific page */\n highlightsForPage: (pageNumber: number) => Highlight[];\n /** Get all highlights */\n allHighlights: Highlight[];\n /** Get the currently selected highlight */\n selectedHighlight: Highlight | null;\n /** Select a highlight by ID */\n selectHighlight: (id: string | null) => void;\n /** Get the active highlight color */\n activeColor: HighlightColor;\n /** Set the active highlight color */\n setActiveColor: (color: HighlightColor) => void;\n}\n\n/**\n * Convert DOMRect from browser selection to HighlightRect for storage.\n * Normalizes coordinates relative to page container and adjusts for scale.\n */\nfunction domRectToHighlightRect(\n domRect: DOMRect,\n pageElement: HTMLElement,\n scale: number\n): HighlightRect {\n const pageRect = pageElement.getBoundingClientRect();\n return {\n x: (domRect.left - pageRect.left) / scale,\n y: (domRect.top - pageRect.top) / scale,\n width: domRect.width / scale,\n height: domRect.height / scale,\n };\n}\n\n/**\n * Merge overlapping or adjacent rects to reduce the number of highlight rects.\n * This helps when selections span multiple lines.\n */\nfunction mergeRects(rects: HighlightRect[]): HighlightRect[] {\n if (rects.length <= 1) return rects;\n\n // Sort by y position, then x position\n const sorted = [...rects].sort((a, b) => {\n const yDiff = a.y - b.y;\n if (Math.abs(yDiff) < 2) return a.x - b.x;\n return yDiff;\n });\n\n const merged: HighlightRect[] = [];\n let current = sorted[0];\n\n for (let i = 1; i < sorted.length; i++) {\n const next = sorted[i];\n const sameRow = Math.abs(current.y - next.y) < 2 && Math.abs(current.height - next.height) < 2;\n const overlapsOrAdjacent = current.x + current.width >= next.x - 2;\n\n if (sameRow && overlapsOrAdjacent) {\n // Merge the rects\n const right = Math.max(current.x + current.width, next.x + next.width);\n current = {\n x: Math.min(current.x, next.x),\n y: Math.min(current.y, next.y),\n width: right - Math.min(current.x, next.x),\n height: Math.max(current.height, next.height),\n };\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n\n return merged;\n}\n\n/**\n * Hook for creating and managing highlights from text selections.\n */\nexport function useHighlights(options: UseHighlightsOptions = {}): UseHighlightsReturn {\n const { onHighlightCreate, onHighlightUpdate, onHighlightDelete } = options;\n\n // Store refs for callbacks to avoid stale closures\n const callbacksRef = useRef({ onHighlightCreate, onHighlightUpdate, onHighlightDelete });\n callbacksRef.current = { onHighlightCreate, onHighlightUpdate, onHighlightDelete };\n\n // Get store actions\n const addHighlightStore = useAnnotationStore((s) => s.addHighlight);\n const updateHighlightStore = useAnnotationStore((s) => s.updateHighlight);\n const removeHighlight = useAnnotationStore((s) => s.removeHighlight);\n const getHighlightsByPage = useAnnotationStore((s) => s.getHighlightsByPage);\n const highlights = useAnnotationStore((s) => s.highlights);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const selectHighlightStore = useAnnotationStore((s) => s.selectHighlight);\n const activeHighlightColor = useAnnotationStore((s) => s.activeHighlightColor);\n const setActiveHighlightColor = useAnnotationStore((s) => s.setActiveHighlightColor);\n\n const createHighlightFromSelection = useCallback(\n (\n selection: TextSelection,\n pageElement: HTMLElement,\n scale: number,\n color?: HighlightColor\n ): Highlight | null => {\n if (!selection.text || selection.rects.length === 0) {\n return null;\n }\n\n // Convert DOMRects to HighlightRects\n const highlightRects = selection.rects.map((domRect) =>\n domRectToHighlightRect(domRect, pageElement, scale)\n );\n\n // Merge adjacent rects\n const mergedRects = mergeRects(highlightRects);\n\n // Filter out any invalid rects\n const validRects = mergedRects.filter(\n (rect) => rect.width > 0 && rect.height > 0\n );\n\n if (validRects.length === 0) {\n return null;\n }\n\n // Create the highlight\n const highlight = addHighlightStore({\n pageNumber: selection.pageNumber,\n rects: validRects,\n color: color ?? activeHighlightColor,\n text: selection.text,\n });\n\n callbacksRef.current.onHighlightCreate?.(highlight);\n return highlight;\n },\n [addHighlightStore, activeHighlightColor]\n );\n\n // Programmatic highlight creation with coordinates\n const addHighlightWithCoords = useCallback(\n (data: {\n pageNumber: number;\n rects: HighlightRect[];\n text: string;\n color?: HighlightColor;\n comment?: string;\n }): Highlight => {\n const highlight = addHighlightStore({\n pageNumber: data.pageNumber,\n rects: data.rects,\n text: data.text,\n color: data.color ?? activeHighlightColor,\n comment: data.comment,\n });\n\n callbacksRef.current.onHighlightCreate?.(highlight);\n return highlight;\n },\n [addHighlightStore, activeHighlightColor]\n );\n\n const updateHighlight = useCallback(\n (id: string, updates: Partial<Pick<Highlight, 'color' | 'comment'>>) => {\n updateHighlightStore(id, updates);\n const updated = highlights.find((h) => h.id === id);\n if (updated) {\n callbacksRef.current.onHighlightUpdate?.({ ...updated, ...updates });\n }\n },\n [updateHighlightStore, highlights]\n );\n\n const deleteHighlight = useCallback(\n (id: string) => {\n removeHighlight(id);\n callbacksRef.current.onHighlightDelete?.(id);\n },\n [removeHighlight]\n );\n\n const highlightsForPage = useCallback(\n (pageNumber: number) => {\n return getHighlightsByPage(pageNumber);\n },\n [getHighlightsByPage]\n );\n\n const selectedHighlight = selectedHighlightId\n ? highlights.find((h) => h.id === selectedHighlightId) ?? null\n : null;\n\n return {\n createHighlightFromSelection,\n addHighlight: addHighlightWithCoords,\n updateHighlight,\n deleteHighlight,\n highlightsForPage,\n allHighlights: highlights,\n selectedHighlight,\n selectHighlight: selectHighlightStore,\n activeColor: activeHighlightColor,\n setActiveColor: setActiveHighlightColor,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAnnotationStore } from './PDFViewerContext';\nimport type { Annotation, NoteAnnotation, ShapeAnnotation } from '../types';\nimport type { AnnotationTool, ShapeType } from '../store/annotation-store';\n\nexport interface UseAnnotationsOptions {\n onAnnotationCreate?: (annotation: Annotation) => void;\n onAnnotationUpdate?: (annotation: Annotation) => void;\n onAnnotationDelete?: (id: string) => void;\n}\n\nexport interface UseAnnotationsReturn {\n // Annotations state\n annotations: Annotation[];\n selectedAnnotation: Annotation | undefined;\n selectedAnnotationId: string | null;\n\n // Tool state\n activeTool: AnnotationTool;\n activeShapeType: ShapeType;\n drawingColor: string;\n drawingStrokeWidth: number;\n isDrawing: boolean;\n currentDrawingPath: { points: { x: number; y: number }[] } | null;\n currentDrawingPage: number | null;\n\n // Tool actions\n setActiveTool: (tool: AnnotationTool) => void;\n setActiveShapeType: (shapeType: ShapeType) => void;\n setDrawingColor: (color: string) => void;\n setDrawingStrokeWidth: (width: number) => void;\n\n // Note actions\n createNote: (pageNumber: number, x: number, y: number, content?: string, color?: string) => NoteAnnotation;\n updateNote: (id: string, updates: Partial<NoteAnnotation>) => void;\n\n // Drawing actions\n startDrawing: (pageNumber: number, point: { x: number; y: number }) => void;\n continueDrawing: (point: { x: number; y: number }) => void;\n finishDrawing: () => Annotation | null;\n cancelDrawing: () => void;\n\n // Shape actions\n /**\n * Create a shape annotation programmatically.\n * Coordinates should be in PDF points (not scaled).\n *\n * @example\n * ```tsx\n * // Create a red rectangle box annotation\n * createShape({\n * pageNumber: 1,\n * shapeType: 'rect',\n * x: 100,\n * y: 200,\n * width: 150,\n * height: 80,\n * color: '#ef4444',\n * strokeWidth: 2\n * });\n * ```\n */\n createShape: (options: {\n pageNumber: number;\n shapeType: ShapeType;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n strokeWidth?: number;\n }) => ShapeAnnotation;\n updateShape: (id: string, updates: Partial<ShapeAnnotation>) => void;\n\n // General annotation actions\n selectAnnotation: (id: string | null) => void;\n deleteAnnotation: (id: string) => void;\n getAnnotationsByPage: (pageNumber: number) => Annotation[];\n\n // Export/Import\n exportAnnotations: () => string;\n importAnnotations: (json: string) => void;\n}\n\nexport function useAnnotations(options: UseAnnotationsOptions = {}): UseAnnotationsReturn {\n const { onAnnotationCreate, onAnnotationUpdate, onAnnotationDelete } = options;\n\n // Store selectors\n const annotations = useAnnotationStore((s) => s.annotations);\n const selectedAnnotationId = useAnnotationStore((s) => s.selectedAnnotationId);\n const activeTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const activeShapeType = useAnnotationStore((s) => s.activeShapeType);\n const drawingColor = useAnnotationStore((s) => s.drawingColor);\n const drawingStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const currentDrawingPath = useAnnotationStore((s) => s.currentDrawingPath);\n const currentDrawingPage = useAnnotationStore((s) => s.currentDrawingPage);\n\n // Store actions\n const addAnnotation = useAnnotationStore((s) => s.addAnnotation);\n const updateAnnotation = useAnnotationStore((s) => s.updateAnnotation);\n const removeAnnotation = useAnnotationStore((s) => s.removeAnnotation);\n const selectAnnotationAction = useAnnotationStore((s) => s.selectAnnotation);\n const getAnnotationsByPageAction = useAnnotationStore((s) => s.getAnnotationsByPage);\n const setActiveAnnotationTool = useAnnotationStore((s) => s.setActiveAnnotationTool);\n const setActiveShapeTypeAction = useAnnotationStore((s) => s.setActiveShapeType);\n const setDrawingColorAction = useAnnotationStore((s) => s.setDrawingColor);\n const setDrawingStrokeWidthAction = useAnnotationStore((s) => s.setDrawingStrokeWidth);\n const startDrawingAction = useAnnotationStore((s) => s.startDrawing);\n const addDrawingPoint = useAnnotationStore((s) => s.addDrawingPoint);\n const finishDrawingAction = useAnnotationStore((s) => s.finishDrawing);\n const cancelDrawingAction = useAnnotationStore((s) => s.cancelDrawing);\n const exportAnnotationsAction = useAnnotationStore((s) => s.exportAnnotations);\n const importAnnotationsAction = useAnnotationStore((s) => s.importAnnotations);\n\n // Derived state\n const selectedAnnotation = useMemo(() => {\n return annotations.find((a) => a.id === selectedAnnotationId);\n }, [annotations, selectedAnnotationId]);\n\n const isDrawing = currentDrawingPath !== null;\n\n // Tool actions\n const setActiveTool = useCallback((tool: AnnotationTool) => {\n setActiveAnnotationTool(tool);\n }, [setActiveAnnotationTool]);\n\n const setActiveShapeType = useCallback((shapeType: ShapeType) => {\n setActiveShapeTypeAction(shapeType);\n }, [setActiveShapeTypeAction]);\n\n const setDrawingColor = useCallback((color: string) => {\n setDrawingColorAction(color);\n }, [setDrawingColorAction]);\n\n const setDrawingStrokeWidth = useCallback((width: number) => {\n setDrawingStrokeWidthAction(width);\n }, [setDrawingStrokeWidthAction]);\n\n // Note actions\n const createNote = useCallback((\n pageNumber: number,\n x: number,\n y: number,\n content: string = '',\n color: string = '#fef08a'\n ): NoteAnnotation => {\n const noteData: Omit<NoteAnnotation, 'id' | 'createdAt' | 'updatedAt'> = {\n type: 'note',\n pageNumber,\n x,\n y,\n content,\n color,\n };\n const note = addAnnotation(noteData as Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) as NoteAnnotation;\n\n onAnnotationCreate?.(note);\n return note;\n }, [addAnnotation, onAnnotationCreate]);\n\n const updateNote = useCallback((id: string, updates: Partial<NoteAnnotation>) => {\n updateAnnotation(id, updates);\n const updated = annotations.find((a) => a.id === id);\n if (updated) {\n onAnnotationUpdate?.(updated);\n }\n }, [updateAnnotation, annotations, onAnnotationUpdate]);\n\n // Drawing actions\n const startDrawing = useCallback((pageNumber: number, point: { x: number; y: number }) => {\n startDrawingAction(pageNumber, point);\n }, [startDrawingAction]);\n\n const continueDrawing = useCallback((point: { x: number; y: number }) => {\n addDrawingPoint(point);\n }, [addDrawingPoint]);\n\n const finishDrawing = useCallback((): Annotation | null => {\n const annotation = finishDrawingAction();\n if (annotation) {\n onAnnotationCreate?.(annotation);\n }\n return annotation;\n }, [finishDrawingAction, onAnnotationCreate]);\n\n const cancelDrawing = useCallback(() => {\n cancelDrawingAction();\n }, [cancelDrawingAction]);\n\n // Shape actions\n const createShape = useCallback((options: {\n pageNumber: number;\n shapeType: ShapeType;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n strokeWidth?: number;\n }): ShapeAnnotation => {\n const shapeData: Omit<ShapeAnnotation, 'id' | 'createdAt' | 'updatedAt'> = {\n type: 'shape',\n pageNumber: options.pageNumber,\n shapeType: options.shapeType,\n x: options.x,\n y: options.y,\n width: options.width,\n height: options.height,\n color: options.color ?? drawingColor,\n strokeWidth: options.strokeWidth ?? drawingStrokeWidth,\n };\n const shape = addAnnotation(shapeData as Omit<Annotation, 'id' | 'createdAt' | 'updatedAt'>) as ShapeAnnotation;\n\n onAnnotationCreate?.(shape);\n return shape;\n }, [addAnnotation, drawingColor, drawingStrokeWidth, onAnnotationCreate]);\n\n const updateShape = useCallback((id: string, updates: Partial<ShapeAnnotation>) => {\n updateAnnotation(id, updates);\n const updated = annotations.find((a) => a.id === id);\n if (updated) {\n onAnnotationUpdate?.(updated);\n }\n }, [updateAnnotation, annotations, onAnnotationUpdate]);\n\n // General annotation actions\n const selectAnnotation = useCallback((id: string | null) => {\n selectAnnotationAction(id);\n }, [selectAnnotationAction]);\n\n const deleteAnnotation = useCallback((id: string) => {\n removeAnnotation(id);\n onAnnotationDelete?.(id);\n }, [removeAnnotation, onAnnotationDelete]);\n\n const getAnnotationsByPage = useCallback((pageNumber: number) => {\n return getAnnotationsByPageAction(pageNumber);\n }, [getAnnotationsByPageAction]);\n\n // Export/Import\n const exportAnnotations = useCallback(() => {\n return exportAnnotationsAction();\n }, [exportAnnotationsAction]);\n\n const importAnnotations = useCallback((json: string) => {\n importAnnotationsAction(json);\n }, [importAnnotationsAction]);\n\n return {\n // State\n annotations,\n selectedAnnotation,\n selectedAnnotationId,\n activeTool,\n activeShapeType,\n drawingColor,\n drawingStrokeWidth,\n isDrawing,\n currentDrawingPath,\n currentDrawingPage,\n\n // Tool actions\n setActiveTool,\n setActiveShapeType,\n setDrawingColor,\n setDrawingStrokeWidth,\n\n // Note actions\n createNote,\n updateNote,\n\n // Drawing actions\n startDrawing,\n continueDrawing,\n finishDrawing,\n cancelDrawing,\n\n // Shape actions\n createShape,\n updateShape,\n\n // General actions\n selectAnnotation,\n deleteAnnotation,\n getAnnotationsByPage,\n\n // Export/Import\n exportAnnotations,\n importAnnotations,\n };\n}\n","import { useRef, useCallback, useEffect } from 'react';\n\nexport interface UseTouchGesturesOptions {\n /** Callback when pinch-to-zoom is detected */\n onPinchZoom?: (scale: number, center: { x: number; y: number }) => void;\n /** Callback when swipe left is detected */\n onSwipeLeft?: () => void;\n /** Callback when swipe right is detected */\n onSwipeRight?: () => void;\n /** Callback when long press is detected */\n onLongPress?: (position: { x: number; y: number }) => void;\n /** Callback when double tap is detected */\n onDoubleTap?: (position: { x: number; y: number }) => void;\n /** Minimum swipe distance in pixels */\n swipeThreshold?: number;\n /** Long press duration in milliseconds */\n longPressDuration?: number;\n /** Double tap max interval in milliseconds */\n doubleTapInterval?: number;\n /** Whether gestures are enabled */\n enabled?: boolean;\n}\n\ninterface TouchState {\n startX: number;\n startY: number;\n startTime: number;\n startDistance: number;\n currentScale: number;\n isPinching: boolean;\n longPressTimer: number | null;\n lastTapTime: number;\n}\n\nfunction getDistance(touch1: Touch, touch2: Touch): number {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction getCenter(touch1: Touch, touch2: Touch): { x: number; y: number } {\n return {\n x: (touch1.clientX + touch2.clientX) / 2,\n y: (touch1.clientY + touch2.clientY) / 2,\n };\n}\n\nexport function useTouchGestures<T extends HTMLElement = HTMLElement>(\n options: UseTouchGesturesOptions = {}\n) {\n const {\n onPinchZoom,\n onSwipeLeft,\n onSwipeRight,\n onLongPress,\n onDoubleTap,\n swipeThreshold = 50,\n longPressDuration = 500,\n doubleTapInterval = 300,\n enabled = true,\n } = options;\n\n const elementRef = useRef<T | null>(null);\n const stateRef = useRef<TouchState>({\n startX: 0,\n startY: 0,\n startTime: 0,\n startDistance: 0,\n currentScale: 1,\n isPinching: false,\n longPressTimer: null,\n lastTapTime: 0,\n });\n\n const clearLongPressTimer = useCallback(() => {\n if (stateRef.current.longPressTimer !== null) {\n clearTimeout(stateRef.current.longPressTimer);\n stateRef.current.longPressTimer = null;\n }\n }, []);\n\n const handleTouchStart = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n state.startX = touch.clientX;\n state.startY = touch.clientY;\n state.startTime = Date.now();\n state.isPinching = false;\n\n // Set up long press detection\n if (onLongPress) {\n state.longPressTimer = window.setTimeout(() => {\n onLongPress({ x: touch.clientX, y: touch.clientY });\n state.longPressTimer = null;\n }, longPressDuration);\n }\n } else if (e.touches.length === 2 && onPinchZoom) {\n // Start pinch gesture\n const touch1 = e.touches[0];\n const touch2 = e.touches[1];\n state.startDistance = getDistance(touch1, touch2);\n state.currentScale = 1;\n state.isPinching = true;\n clearLongPressTimer();\n }\n },\n [enabled, onLongPress, onPinchZoom, longPressDuration, clearLongPressTimer]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n if (e.touches.length === 2 && state.isPinching && onPinchZoom) {\n // Handle pinch zoom\n const touch1 = e.touches[0];\n const touch2 = e.touches[1];\n const currentDistance = getDistance(touch1, touch2);\n const center = getCenter(touch1, touch2);\n\n if (state.startDistance > 0) {\n const scale = currentDistance / state.startDistance;\n state.currentScale = scale;\n onPinchZoom(scale, center);\n }\n } else if (e.touches.length === 1) {\n // Check if we've moved enough to cancel long press\n const touch = e.touches[0];\n const dx = Math.abs(touch.clientX - state.startX);\n const dy = Math.abs(touch.clientY - state.startY);\n\n if (dx > 10 || dy > 10) {\n clearLongPressTimer();\n }\n }\n },\n [enabled, onPinchZoom, clearLongPressTimer]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (!enabled) return;\n\n const state = stateRef.current;\n clearLongPressTimer();\n\n // Handle pinch end\n if (state.isPinching) {\n state.isPinching = false;\n state.startDistance = 0;\n return;\n }\n\n // Only process single touch end\n if (e.changedTouches.length !== 1) return;\n\n const touch = e.changedTouches[0];\n const endTime = Date.now();\n const duration = endTime - state.startTime;\n\n // Calculate movement\n const dx = touch.clientX - state.startX;\n const dy = touch.clientY - state.startY;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n // Check for double tap\n if (onDoubleTap && duration < 300 && absDx < 20 && absDy < 20) {\n const timeSinceLastTap = endTime - state.lastTapTime;\n if (timeSinceLastTap < doubleTapInterval) {\n onDoubleTap({ x: touch.clientX, y: touch.clientY });\n state.lastTapTime = 0;\n return;\n }\n state.lastTapTime = endTime;\n }\n\n // Check for swipe (quick horizontal movement)\n if (duration < 300 && absDx > swipeThreshold && absDx > absDy * 2) {\n if (dx > 0 && onSwipeRight) {\n onSwipeRight();\n } else if (dx < 0 && onSwipeLeft) {\n onSwipeLeft();\n }\n }\n },\n [enabled, onSwipeLeft, onSwipeRight, onDoubleTap, swipeThreshold, doubleTapInterval, clearLongPressTimer]\n );\n\n const handleTouchCancel = useCallback(() => {\n clearLongPressTimer();\n stateRef.current.isPinching = false;\n }, [clearLongPressTimer]);\n\n // Attach event listeners\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n element.addEventListener('touchstart', handleTouchStart, { passive: true });\n element.addEventListener('touchmove', handleTouchMove, { passive: true });\n element.addEventListener('touchend', handleTouchEnd, { passive: true });\n element.addEventListener('touchcancel', handleTouchCancel, { passive: true });\n\n return () => {\n element.removeEventListener('touchstart', handleTouchStart);\n element.removeEventListener('touchmove', handleTouchMove);\n element.removeEventListener('touchend', handleTouchEnd);\n element.removeEventListener('touchcancel', handleTouchCancel);\n clearLongPressTimer();\n };\n }, [enabled, handleTouchStart, handleTouchMove, handleTouchEnd, handleTouchCancel, clearLongPressTimer]);\n\n // Return ref to attach to element\n const setRef = useCallback((element: T | null) => {\n elementRef.current = element;\n }, []);\n\n return {\n ref: setRef,\n elementRef,\n };\n}\n\n// Utility hook for detecting if device supports touch\nexport function useIsTouchDevice(): boolean {\n if (typeof window === 'undefined') return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\n// Utility hook for detecting if device is mobile\nexport function useIsMobile(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(max-width: 640px)').matches;\n}\n","import type {\n Plugin,\n PluginAPI,\n ToolbarItem,\n SidebarPanelConfig,\n ContextMenuItem,\n ViewerState,\n ViewerActions,\n} from '../types';\n\nexport interface PluginManagerOptions {\n /** Callback when a plugin is registered */\n onPluginRegistered?: (plugin: Plugin) => void;\n /** Callback when a plugin is unregistered */\n onPluginUnregistered?: (name: string) => void;\n /** Callback when toolbar items change */\n onToolbarItemsChanged?: (items: ToolbarItem[]) => void;\n /** Callback when sidebar panels change */\n onSidebarPanelsChanged?: (panels: SidebarPanelConfig[]) => void;\n /** Callback when context menu items change */\n onContextMenuItemsChanged?: (items: ContextMenuItem[]) => void;\n}\n\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private toolbarItems: Map<string, ToolbarItem[]> = new Map();\n private sidebarPanels: Map<string, SidebarPanelConfig[]> = new Map();\n private contextMenuItems: Map<string, ContextMenuItem[]> = new Map();\n private viewerStateGetter: (() => ViewerState & ViewerActions) | null = null;\n private options: PluginManagerOptions;\n\n constructor(options: PluginManagerOptions = {}) {\n this.options = options;\n }\n\n /**\n * Set the getter function for viewer state\n */\n setViewerStateGetter(getter: () => ViewerState & ViewerActions): void {\n this.viewerStateGetter = getter;\n }\n\n /**\n * Create the plugin API for a specific plugin\n */\n private createPluginAPI(pluginName: string): PluginAPI {\n return {\n viewer: this.viewerStateGetter?.() || ({} as ViewerState & ViewerActions),\n\n registerToolbarItem: (item: ToolbarItem) => {\n const items = this.toolbarItems.get(pluginName) || [];\n items.push(item);\n this.toolbarItems.set(pluginName, items);\n this.notifyToolbarItemsChanged();\n },\n\n registerSidebarPanel: (panel: SidebarPanelConfig) => {\n const panels = this.sidebarPanels.get(pluginName) || [];\n panels.push(panel);\n this.sidebarPanels.set(pluginName, panels);\n this.notifySidebarPanelsChanged();\n },\n\n registerContextMenuItem: (item: ContextMenuItem) => {\n const items = this.contextMenuItems.get(pluginName) || [];\n items.push(item);\n this.contextMenuItems.set(pluginName, items);\n this.notifyContextMenuItemsChanged();\n },\n };\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise<void> {\n if (this.plugins.has(plugin.name)) {\n console.warn(`Plugin \"${plugin.name}\" is already registered. Unregister it first.`);\n return;\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Initialize the plugin if it has an initialize function\n if (plugin.initialize) {\n const api = this.createPluginAPI(plugin.name);\n await plugin.initialize(api);\n }\n\n this.options.onPluginRegistered?.(plugin);\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n console.warn(`Plugin \"${name}\" is not registered.`);\n return;\n }\n\n // Destroy the plugin if it has a destroy function\n if (plugin.destroy) {\n await plugin.destroy();\n }\n\n // Remove all registered items from this plugin\n this.toolbarItems.delete(name);\n this.sidebarPanels.delete(name);\n this.contextMenuItems.delete(name);\n\n this.plugins.delete(name);\n\n this.notifyToolbarItemsChanged();\n this.notifySidebarPanelsChanged();\n this.notifyContextMenuItemsChanged();\n\n this.options.onPluginUnregistered?.(name);\n }\n\n /**\n * Get a registered plugin by name\n */\n getPlugin(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Get all toolbar items from all plugins\n */\n getToolbarItems(): ToolbarItem[] {\n const allItems: ToolbarItem[] = [];\n for (const items of this.toolbarItems.values()) {\n allItems.push(...items);\n }\n // Sort by order if specified\n return allItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n }\n\n /**\n * Get toolbar items by position\n */\n getToolbarItemsByPosition(position: 'left' | 'center' | 'right'): ToolbarItem[] {\n return this.getToolbarItems().filter((item) => item.position === position);\n }\n\n /**\n * Get all sidebar panels from all plugins\n */\n getSidebarPanels(): SidebarPanelConfig[] {\n const allPanels: SidebarPanelConfig[] = [];\n for (const panels of this.sidebarPanels.values()) {\n allPanels.push(...panels);\n }\n return allPanels;\n }\n\n /**\n * Get all context menu items from all plugins\n */\n getContextMenuItems(): ContextMenuItem[] {\n const allItems: ContextMenuItem[] = [];\n for (const items of this.contextMenuItems.values()) {\n allItems.push(...items);\n }\n // Filter by condition if specified\n return allItems.filter((item) => !item.condition || item.condition());\n }\n\n /**\n * Destroy all plugins and clean up\n */\n async destroy(): Promise<void> {\n const pluginNames = Array.from(this.plugins.keys());\n for (const name of pluginNames) {\n await this.unregister(name);\n }\n }\n\n private notifyToolbarItemsChanged(): void {\n this.options.onToolbarItemsChanged?.(this.getToolbarItems());\n }\n\n private notifySidebarPanelsChanged(): void {\n this.options.onSidebarPanelsChanged?.(this.getSidebarPanels());\n }\n\n private notifyContextMenuItemsChanged(): void {\n this.options.onContextMenuItemsChanged?.(this.getContextMenuItems());\n }\n}\n\n// Create a default plugin manager instance\nlet defaultPluginManager: PluginManager | null = null;\n\nexport function getPluginManager(): PluginManager {\n if (!defaultPluginManager) {\n defaultPluginManager = new PluginManager();\n }\n return defaultPluginManager;\n}\n\nexport function createPluginManager(options?: PluginManagerOptions): PluginManager {\n return new PluginManager(options);\n}\n","import { useRef, useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n PluginManager,\n createPluginManager,\n type PluginManagerOptions,\n} from '../plugins/PluginManager';\nimport type { Plugin, ToolbarItem, SidebarPanelConfig, ContextMenuItem } from '../types';\nimport { usePDFViewer } from './usePDFViewer';\n\nexport interface UsePluginsOptions extends PluginManagerOptions {\n /** Initial plugins to register */\n initialPlugins?: Plugin[];\n}\n\nexport interface UsePluginsReturn {\n /** The plugin manager instance */\n pluginManager: PluginManager;\n\n /** All registered plugins */\n plugins: Plugin[];\n\n /** Toolbar items from plugins */\n toolbarItems: ToolbarItem[];\n\n /** Sidebar panels from plugins */\n sidebarPanels: SidebarPanelConfig[];\n\n /** Context menu items from plugins */\n contextMenuItems: ContextMenuItem[];\n\n /** Register a plugin */\n registerPlugin: (plugin: Plugin) => Promise<void>;\n\n /** Unregister a plugin by name */\n unregisterPlugin: (name: string) => Promise<void>;\n\n /** Check if a plugin is registered */\n hasPlugin: (name: string) => boolean;\n}\n\nexport function usePlugins(options: UsePluginsOptions = {}): UsePluginsReturn {\n const { initialPlugins, ...managerOptions } = options;\n\n // Get viewer state/actions for the plugin API\n const viewerState = usePDFViewer();\n\n // State for plugin-registered items\n const [plugins, setPlugins] = useState<Plugin[]>([]);\n const [toolbarItems, setToolbarItems] = useState<ToolbarItem[]>([]);\n const [sidebarPanels, setSidebarPanels] = useState<SidebarPanelConfig[]>([]);\n const [contextMenuItems, setContextMenuItems] = useState<ContextMenuItem[]>([]);\n\n // Create the plugin manager\n const pluginManagerRef = useRef<PluginManager | null>(null);\n\n const getPluginManager = useCallback(() => {\n if (!pluginManagerRef.current) {\n pluginManagerRef.current = createPluginManager({\n ...managerOptions,\n onPluginRegistered: (plugin) => {\n setPlugins((prev) => [...prev, plugin]);\n managerOptions.onPluginRegistered?.(plugin);\n },\n onPluginUnregistered: (name) => {\n setPlugins((prev) => prev.filter((p) => p.name !== name));\n managerOptions.onPluginUnregistered?.(name);\n },\n onToolbarItemsChanged: (items) => {\n setToolbarItems(items);\n managerOptions.onToolbarItemsChanged?.(items);\n },\n onSidebarPanelsChanged: (panels) => {\n setSidebarPanels(panels);\n managerOptions.onSidebarPanelsChanged?.(panels);\n },\n onContextMenuItemsChanged: (items) => {\n setContextMenuItems(items);\n managerOptions.onContextMenuItemsChanged?.(items);\n },\n });\n }\n return pluginManagerRef.current;\n }, [managerOptions]);\n\n // Update viewer state getter when state changes\n useEffect(() => {\n const manager = getPluginManager();\n manager.setViewerStateGetter(() => viewerState as any);\n }, [viewerState, getPluginManager]);\n\n // Register initial plugins\n useEffect(() => {\n if (initialPlugins && initialPlugins.length > 0) {\n const manager = getPluginManager();\n initialPlugins.forEach((plugin) => {\n manager.register(plugin);\n });\n }\n }, [initialPlugins, getPluginManager]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n pluginManagerRef.current?.destroy();\n };\n }, []);\n\n // Memoized return value\n const registerPlugin = useCallback(async (plugin: Plugin) => {\n const manager = getPluginManager();\n await manager.register(plugin);\n }, [getPluginManager]);\n\n const unregisterPlugin = useCallback(async (name: string) => {\n const manager = getPluginManager();\n await manager.unregister(name);\n }, [getPluginManager]);\n\n const hasPlugin = useCallback((name: string) => {\n const manager = getPluginManager();\n return manager.hasPlugin(name);\n }, [getPluginManager]);\n\n return useMemo(\n () => ({\n pluginManager: getPluginManager(),\n plugins,\n toolbarItems,\n sidebarPanels,\n contextMenuItems,\n registerPlugin,\n unregisterPlugin,\n hasPlugin,\n }),\n [\n getPluginManager,\n plugins,\n toolbarItems,\n sidebarPanels,\n contextMenuItems,\n registerPlugin,\n unregisterPlugin,\n hasPlugin,\n ]\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAgentStore, useStudentStore, useAnnotationStore, useViewerStore } from './PDFViewerContext';\nimport type {\n AgentContext,\n FocusedRegion,\n Takeaway,\n AgentAPI,\n AgentHighlightParams,\n} from '../types/agent-context';\nimport type { HighlightColor } from '../types';\n\nexport interface UseAgentContextOptions {\n /** Default focus region style */\n defaultFocusStyle?: 'pulse' | 'glow' | 'border';\n /** Default focus region color */\n defaultFocusColor?: string;\n /** Default auto-clear timeout for focus regions (ms) */\n defaultAutoClearTimeout?: number;\n}\n\nexport interface UseAgentContextReturn {\n /** Current agent context */\n agentContext: AgentContext | null;\n /** Set or update agent context */\n setAgentContext: (context: Partial<AgentContext>) => void;\n /** Clear agent context */\n clearAgentContext: () => void;\n /** Currently focused regions */\n focusedRegions: FocusedRegion[];\n /** Add a focus region and return its ID */\n focusRegion: (region: Omit<FocusedRegion, 'id'>) => string;\n /** Remove a focus region by ID */\n clearFocusedRegion: (id: string) => void;\n /** Clear all focus regions */\n clearAllFocusedRegions: () => void;\n /** Add a takeaway for a page */\n addTakeaway: (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => Takeaway;\n /** Add a highlight from the agent */\n addAgentHighlight: (params: AgentHighlightParams) => string;\n /** Get the agent API for external integration */\n getAgentAPI: () => AgentAPI;\n}\n\n/**\n * Hook for agent context management and AI agent integration.\n * Provides methods for agents to interact with the PDF viewer.\n */\nexport function useAgentContext(options: UseAgentContextOptions = {}): UseAgentContextReturn {\n const {\n defaultFocusStyle = 'pulse',\n defaultFocusColor,\n defaultAutoClearTimeout = 0,\n } = options;\n\n // Agent store state and actions\n const agentContext = useAgentStore((s) => s.currentContext);\n const focusedRegions = useAgentStore((s) => s.focusedRegions);\n const setAgentContextAction = useAgentStore((s) => s.setAgentContext);\n const clearAgentContextAction = useAgentStore((s) => s.clearAgentContext);\n const addFocusedRegionAction = useAgentStore((s) => s.addFocusedRegion);\n const removeFocusedRegionAction = useAgentStore((s) => s.removeFocusedRegion);\n const clearAllFocusedRegionsAction = useAgentStore((s) => s.clearAllFocusedRegions);\n\n // Student store actions for takeaways\n const addTakeawayAction = useStudentStore((s) => s.addTakeaway);\n\n // Annotation store for agent highlights\n const addHighlightAction = useAnnotationStore((s) => s.addHighlight);\n\n // Viewer store for navigation\n const goToPageAction = useViewerStore((s) => s.goToPage);\n const currentPage = useViewerStore((s) => s.currentPage);\n\n const setAgentContext = useCallback(\n (context: Partial<AgentContext>) => {\n setAgentContextAction(context);\n },\n [setAgentContextAction]\n );\n\n const clearAgentContext = useCallback(() => {\n clearAgentContextAction();\n }, [clearAgentContextAction]);\n\n const focusRegion = useCallback(\n (region: Omit<FocusedRegion, 'id'>) => {\n const regionWithDefaults: Omit<FocusedRegion, 'id'> = {\n ...region,\n style: region.style ?? defaultFocusStyle,\n color: region.color ?? defaultFocusColor,\n autoClearTimeout: region.autoClearTimeout ?? defaultAutoClearTimeout,\n };\n return addFocusedRegionAction(regionWithDefaults);\n },\n [addFocusedRegionAction, defaultFocusStyle, defaultFocusColor, defaultAutoClearTimeout]\n );\n\n const clearFocusedRegion = useCallback(\n (id: string) => {\n removeFocusedRegionAction(id);\n },\n [removeFocusedRegionAction]\n );\n\n const clearAllFocusedRegions = useCallback(() => {\n clearAllFocusedRegionsAction();\n }, [clearAllFocusedRegionsAction]);\n\n const addTakeaway = useCallback(\n (pageNumber: number, summary: string, metadata?: Record<string, unknown>) => {\n return addTakeawayAction({\n pageNumber,\n summary,\n source: 'agent',\n metadata,\n });\n },\n [addTakeawayAction]\n );\n\n const addAgentHighlight = useCallback(\n (params: AgentHighlightParams) => {\n const highlight = addHighlightAction({\n pageNumber: params.pageNumber,\n rects: params.rects,\n text: params.text,\n color: params.color ?? ('blue' as HighlightColor),\n comment: params.comment,\n source: 'agent',\n });\n return highlight.id;\n },\n [addHighlightAction]\n );\n\n const getAgentAPI = useCallback((): AgentAPI => {\n return {\n focusRegion,\n clearFocusedRegion: (id?: string) => {\n if (id) {\n clearFocusedRegion(id);\n } else {\n clearAllFocusedRegions();\n }\n },\n addTakeaway,\n setAgentContext,\n addAgentHighlight,\n goToPage: goToPageAction,\n getCurrentPage: () => currentPage,\n getAgentContext: () => agentContext,\n };\n }, [\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n setAgentContext,\n addAgentHighlight,\n goToPageAction,\n currentPage,\n agentContext,\n ]);\n\n return useMemo(\n () => ({\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n addAgentHighlight,\n getAgentAPI,\n }),\n [\n agentContext,\n setAgentContext,\n clearAgentContext,\n focusedRegions,\n focusRegion,\n clearFocusedRegion,\n clearAllFocusedRegions,\n addTakeaway,\n addAgentHighlight,\n getAgentAPI,\n ]\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { useAgentStore } from './PDFViewerContext';\nimport type { AskAboutContext, PDFRegion } from '../types/agent-context';\n\nexport interface UseAskAboutOptions {\n /** Whether the feature is enabled */\n enabled?: boolean;\n /** Long press duration to trigger ask about (ms) */\n longPressDuration?: number;\n /** Callback when ask about is triggered */\n onAskAbout?: (context: AskAboutContext) => void;\n /** Minimum selection length to enable ask about for text */\n minSelectionLength?: number;\n}\n\nexport interface UseAskAboutReturn {\n /** Whether ask about is currently in progress (long press active) */\n isLongPressing: boolean;\n /** Progress of the long press (0-1) */\n longPressProgress: number;\n /** Position of the long press */\n longPressPosition: { x: number; y: number } | null;\n /** Trigger ask about for selected text */\n askAboutSelection: (text: string, pageNumber: number) => void;\n /** Trigger ask about for a region (diagram, image) */\n askAboutRegion: (region: PDFRegion, pageNumber: number) => void;\n /** Start long press tracking (for custom implementations) */\n startLongPress: (x: number, y: number) => void;\n /** Cancel long press */\n cancelLongPress: () => void;\n /** Complete long press and trigger callback */\n completeLongPress: (type: 'text' | 'region', pageNumber: number, text?: string, region?: PDFRegion) => void;\n /** Handlers for attaching to elements */\n handlers: {\n onMouseDown: (e: React.MouseEvent) => void;\n onMouseUp: () => void;\n onMouseLeave: () => void;\n onTouchStart: (e: React.TouchEvent) => void;\n onTouchEnd: () => void;\n onTouchCancel: () => void;\n };\n}\n\n/**\n * Hook for implementing the \"Ask About This\" feature.\n * Provides long-press detection and callbacks for asking about text or regions.\n */\nexport function useAskAbout(options: UseAskAboutOptions = {}): UseAskAboutReturn {\n const {\n enabled = true,\n longPressDuration = 800,\n onAskAbout,\n minSelectionLength = 3,\n } = options;\n\n const [isLongPressing, setIsLongPressing] = useState(false);\n const [longPressProgress, setLongPressProgress] = useState(0);\n const [longPressPosition, setLongPressPosition] = useState<{ x: number; y: number } | null>(null);\n\n const timerRef = useRef<number | null>(null);\n const progressIntervalRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // Get agent context for including in ask about\n const agentContext = useAgentStore((s) => s.currentContext);\n\n const clearTimers = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (progressIntervalRef.current !== null) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n }, []);\n\n const cancelLongPress = useCallback(() => {\n clearTimers();\n setIsLongPressing(false);\n setLongPressProgress(0);\n setLongPressPosition(null);\n }, [clearTimers]);\n\n const triggerAskAbout = useCallback(\n (context: AskAboutContext) => {\n // Include agent context if available\n const fullContext: AskAboutContext = {\n ...context,\n agentContext: agentContext ?? undefined,\n };\n onAskAbout?.(fullContext);\n },\n [onAskAbout, agentContext]\n );\n\n const startLongPress = useCallback(\n (x: number, y: number) => {\n if (!enabled) return;\n\n clearTimers();\n setIsLongPressing(true);\n setLongPressProgress(0);\n setLongPressPosition({ x, y });\n startTimeRef.current = Date.now();\n\n // Update progress every 50ms\n progressIntervalRef.current = window.setInterval(() => {\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min(elapsed / longPressDuration, 1);\n setLongPressProgress(progress);\n }, 50);\n\n // Complete after duration\n timerRef.current = window.setTimeout(() => {\n setLongPressProgress(1);\n clearTimers();\n }, longPressDuration);\n },\n [enabled, longPressDuration, clearTimers]\n );\n\n const completeLongPress = useCallback(\n (type: 'text' | 'region', pageNumber: number, text?: string, region?: PDFRegion) => {\n if (longPressProgress >= 1) {\n triggerAskAbout({\n type,\n pageNumber,\n selectedText: text,\n region,\n });\n }\n cancelLongPress();\n },\n [longPressProgress, triggerAskAbout, cancelLongPress]\n );\n\n const askAboutSelection = useCallback(\n (text: string, pageNumber: number) => {\n if (!enabled || text.length < minSelectionLength) return;\n\n triggerAskAbout({\n type: 'text',\n pageNumber,\n selectedText: text,\n });\n },\n [enabled, minSelectionLength, triggerAskAbout]\n );\n\n const askAboutRegion = useCallback(\n (region: PDFRegion, pageNumber: number) => {\n if (!enabled) return;\n\n triggerAskAbout({\n type: 'region',\n pageNumber,\n region,\n });\n },\n [enabled, triggerAskAbout]\n );\n\n // Mouse handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!enabled) return;\n startLongPress(e.clientX, e.clientY);\n },\n [enabled, startLongPress]\n );\n\n const handleMouseUp = useCallback(() => {\n if (isLongPressing && longPressProgress < 1) {\n cancelLongPress();\n }\n }, [isLongPressing, longPressProgress, cancelLongPress]);\n\n const handleMouseLeave = useCallback(() => {\n if (isLongPressing) {\n cancelLongPress();\n }\n }, [isLongPressing, cancelLongPress]);\n\n // Touch handlers\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (!enabled || e.touches.length !== 1) return;\n const touch = e.touches[0];\n startLongPress(touch.clientX, touch.clientY);\n },\n [enabled, startLongPress]\n );\n\n const handleTouchEnd = useCallback(() => {\n if (isLongPressing && longPressProgress < 1) {\n cancelLongPress();\n }\n }, [isLongPressing, longPressProgress, cancelLongPress]);\n\n const handleTouchCancel = useCallback(() => {\n cancelLongPress();\n }, [cancelLongPress]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearTimers();\n };\n }, [clearTimers]);\n\n return {\n isLongPressing,\n longPressProgress,\n longPressPosition,\n askAboutSelection,\n askAboutRegion,\n startLongPress,\n cancelLongPress,\n completeLongPress,\n handlers: {\n onMouseDown: handleMouseDown,\n onMouseUp: handleMouseUp,\n onMouseLeave: handleMouseLeave,\n onTouchStart: handleTouchStart,\n onTouchEnd: handleTouchEnd,\n onTouchCancel: handleTouchCancel,\n },\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { useStudentStore, useAgentStore, useViewerStore } from './PDFViewerContext';\nimport type { Bookmark } from '../types/agent-context';\n\nexport interface UseBookmarksOptions {\n /** Callback when bookmark is added */\n onBookmarkAdd?: (bookmark: Bookmark) => void;\n /** Callback when bookmark is removed */\n onBookmarkRemove?: (id: string) => void;\n /** Automatically capture agent context when bookmarking */\n captureAgentContext?: boolean;\n}\n\nexport interface UseBookmarksReturn {\n /** All bookmarks */\n bookmarks: Bookmark[];\n /** Bookmarks for the current page */\n currentPageBookmarks: Bookmark[];\n /** Check if current page is bookmarked */\n isCurrentPageBookmarked: boolean;\n /** Add a bookmark */\n addBookmark: (data?: Partial<Omit<Bookmark, 'id' | 'timestamp'>>) => Bookmark;\n /** Update a bookmark */\n updateBookmark: (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => void;\n /** Remove a bookmark */\n removeBookmark: (id: string) => void;\n /** Toggle bookmark on current page */\n toggleBookmark: () => void;\n /** Navigate to a bookmarked page */\n goToBookmark: (bookmark: Bookmark) => void;\n /** Get bookmarks for a specific page */\n getBookmarksForPage: (pageNumber: number) => Bookmark[];\n /** Get bookmarks grouped by page */\n bookmarksByPage: Map<number, Bookmark[]>;\n}\n\n/**\n * Hook for managing bookmarks with agent context capture.\n */\nexport function useBookmarks(options: UseBookmarksOptions = {}): UseBookmarksReturn {\n const { onBookmarkAdd, onBookmarkRemove, captureAgentContext = true } = options;\n\n // Student store state and actions\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const addBookmarkAction = useStudentStore((s) => s.addBookmark);\n const updateBookmarkAction = useStudentStore((s) => s.updateBookmark);\n const removeBookmarkAction = useStudentStore((s) => s.removeBookmark);\n\n // Agent context for capturing\n const agentContext = useAgentStore((s) => s.currentContext);\n\n // Viewer store for navigation\n const currentPage = useViewerStore((s) => s.currentPage);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n const currentPageBookmarks = useMemo(\n () => bookmarks.filter((b) => b.pageNumber === currentPage),\n [bookmarks, currentPage]\n );\n\n const isCurrentPageBookmarked = currentPageBookmarks.length > 0;\n\n const bookmarksByPage = useMemo(() => {\n const map = new Map<number, Bookmark[]>();\n bookmarks.forEach((bookmark) => {\n const existing = map.get(bookmark.pageNumber) || [];\n map.set(bookmark.pageNumber, [...existing, bookmark]);\n });\n return map;\n }, [bookmarks]);\n\n const addBookmark = useCallback(\n (data?: Partial<Omit<Bookmark, 'id' | 'timestamp'>>) => {\n const bookmarkData = {\n pageNumber: data?.pageNumber ?? currentPage,\n userNote: data?.userNote,\n label: data?.label,\n agentContext: captureAgentContext && agentContext?.lastStatement\n ? agentContext.lastStatement\n : data?.agentContext,\n };\n\n const bookmark = addBookmarkAction(bookmarkData);\n onBookmarkAdd?.(bookmark);\n return bookmark;\n },\n [currentPage, captureAgentContext, agentContext, addBookmarkAction, onBookmarkAdd]\n );\n\n const updateBookmark = useCallback(\n (id: string, updates: Partial<Omit<Bookmark, 'id'>>) => {\n updateBookmarkAction(id, updates);\n },\n [updateBookmarkAction]\n );\n\n const removeBookmark = useCallback(\n (id: string) => {\n removeBookmarkAction(id);\n onBookmarkRemove?.(id);\n },\n [removeBookmarkAction, onBookmarkRemove]\n );\n\n const toggleBookmark = useCallback(() => {\n if (isCurrentPageBookmarked) {\n // Remove the first bookmark on the current page\n const bookmarkToRemove = currentPageBookmarks[0];\n if (bookmarkToRemove) {\n removeBookmark(bookmarkToRemove.id);\n }\n } else {\n addBookmark();\n }\n }, [isCurrentPageBookmarked, currentPageBookmarks, removeBookmark, addBookmark]);\n\n const goToBookmark = useCallback(\n (bookmark: Bookmark) => {\n goToPage(bookmark.pageNumber);\n },\n [goToPage]\n );\n\n const getBookmarksForPage = useCallback(\n (pageNumber: number) => {\n return bookmarks.filter((b) => b.pageNumber === pageNumber);\n },\n [bookmarks]\n );\n\n return useMemo(\n () => ({\n bookmarks,\n currentPageBookmarks,\n isCurrentPageBookmarked,\n addBookmark,\n updateBookmark,\n removeBookmark,\n toggleBookmark,\n goToBookmark,\n getBookmarksForPage,\n bookmarksByPage,\n }),\n [\n bookmarks,\n currentPageBookmarks,\n isCurrentPageBookmarked,\n addBookmark,\n updateBookmark,\n removeBookmark,\n toggleBookmark,\n goToBookmark,\n getBookmarksForPage,\n bookmarksByPage,\n ]\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { useStudentStore, useAgentStore, useViewerStore } from './PDFViewerContext';\nimport type { QuickNote } from '../types/agent-context';\n\nexport interface UseQuickNotesOptions {\n /** Callback when note is added */\n onNoteAdd?: (note: QuickNote) => void;\n /** Callback when note is removed */\n onNoteRemove?: (id: string) => void;\n /** Automatically capture agent's last statement when creating notes */\n captureAgentContext?: boolean;\n}\n\nexport interface UseQuickNotesReturn {\n /** All quick notes */\n quickNotes: QuickNote[];\n /** Quick notes for the current page */\n currentPageNotes: QuickNote[];\n /** Add a quick note */\n addQuickNote: (data: { content: string; x: number; y: number; pageNumber?: number }) => QuickNote;\n /** Update a quick note */\n updateQuickNote: (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => void;\n /** Remove a quick note */\n removeQuickNote: (id: string) => void;\n /** Get notes for a specific page */\n getNotesForPage: (pageNumber: number) => QuickNote[];\n /** Notes grouped by page */\n notesByPage: Map<number, QuickNote[]>;\n}\n\n/**\n * Hook for managing quick notes with agent context capture.\n */\nexport function useQuickNotes(options: UseQuickNotesOptions = {}): UseQuickNotesReturn {\n const { onNoteAdd, onNoteRemove, captureAgentContext = true } = options;\n\n // Student store state and actions\n const quickNotes = useStudentStore((s) => s.quickNotes);\n const addQuickNoteAction = useStudentStore((s) => s.addQuickNote);\n const updateQuickNoteAction = useStudentStore((s) => s.updateQuickNote);\n const removeQuickNoteAction = useStudentStore((s) => s.removeQuickNote);\n\n // Agent context for capturing\n const agentContext = useAgentStore((s) => s.currentContext);\n\n // Viewer store for current page\n const currentPage = useViewerStore((s) => s.currentPage);\n\n const currentPageNotes = useMemo(\n () => quickNotes.filter((n) => n.pageNumber === currentPage),\n [quickNotes, currentPage]\n );\n\n const notesByPage = useMemo(() => {\n const map = new Map<number, QuickNote[]>();\n quickNotes.forEach((note) => {\n const existing = map.get(note.pageNumber) || [];\n map.set(note.pageNumber, [...existing, note]);\n });\n return map;\n }, [quickNotes]);\n\n const addQuickNote = useCallback(\n (data: { content: string; x: number; y: number; pageNumber?: number }) => {\n const noteData = {\n content: data.content,\n x: data.x,\n y: data.y,\n pageNumber: data.pageNumber ?? currentPage,\n agentLastStatement: captureAgentContext && agentContext?.lastStatement\n ? agentContext.lastStatement\n : undefined,\n };\n\n const note = addQuickNoteAction(noteData);\n onNoteAdd?.(note);\n return note;\n },\n [currentPage, captureAgentContext, agentContext, addQuickNoteAction, onNoteAdd]\n );\n\n const updateQuickNote = useCallback(\n (id: string, updates: Partial<Omit<QuickNote, 'id'>>) => {\n updateQuickNoteAction(id, updates);\n },\n [updateQuickNoteAction]\n );\n\n const removeQuickNote = useCallback(\n (id: string) => {\n removeQuickNoteAction(id);\n onNoteRemove?.(id);\n },\n [removeQuickNoteAction, onNoteRemove]\n );\n\n const getNotesForPage = useCallback(\n (pageNumber: number) => {\n return quickNotes.filter((n) => n.pageNumber === pageNumber);\n },\n [quickNotes]\n );\n\n return useMemo(\n () => ({\n quickNotes,\n currentPageNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n getNotesForPage,\n notesByPage,\n }),\n [\n quickNotes,\n currentPageNotes,\n addQuickNote,\n updateQuickNote,\n removeQuickNote,\n getNotesForPage,\n notesByPage,\n ]\n );\n}\n","import { useCallback, useMemo, useEffect } from 'react';\nimport { useStudentStore, useViewerStore } from './PDFViewerContext';\n\nexport interface UseStudentProgressOptions {\n /** Automatically track page visits */\n autoTrack?: boolean;\n /** Debounce time for page tracking (ms) */\n trackDebounce?: number;\n}\n\nexport interface UseStudentProgressReturn {\n /** Set of visited page numbers */\n visitedPages: Set<number>;\n /** Array of visited page numbers (for easier iteration) */\n visitedPagesArray: number[];\n /** Current reading progress (0-1) */\n progress: number;\n /** Percentage of pages visited */\n visitedPercentage: number;\n /** Number of pages visited */\n visitedCount: number;\n /** Total number of pages */\n totalPages: number;\n /** Current page number */\n currentPage: number;\n /** Mark a page as visited */\n markPageVisited: (pageNumber: number) => void;\n /** Check if a page has been visited */\n isPageVisited: (pageNumber: number) => boolean;\n /** Get page visit status for minimap rendering */\n getPageStatus: (pageNumber: number) => 'current' | 'visited' | 'unvisited';\n}\n\n/**\n * Hook for tracking student reading progress.\n */\nexport function useStudentProgress(options: UseStudentProgressOptions = {}): UseStudentProgressReturn {\n const { autoTrack = true, trackDebounce = 1000 } = options;\n\n // Student store state and actions\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const progress = useStudentStore((s) => s.progress);\n const markPageVisitedAction = useStudentStore((s) => s.markPageVisited);\n const setProgressAction = useStudentStore((s) => s.setProgress);\n\n // Viewer store for page info\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n\n const visitedPagesArray = useMemo(\n () => Array.from(visitedPages).sort((a, b) => a - b),\n [visitedPages]\n );\n\n const visitedCount = visitedPages.size;\n const totalPages = numPages;\n\n const visitedPercentage = useMemo(() => {\n if (totalPages === 0) return 0;\n return (visitedCount / totalPages) * 100;\n }, [visitedCount, totalPages]);\n\n const markPageVisited = useCallback(\n (pageNumber: number) => {\n markPageVisitedAction(pageNumber);\n // Update progress based on visited pages\n if (totalPages > 0) {\n const newProgress = (visitedPages.size + 1) / totalPages;\n setProgressAction(Math.min(newProgress, 1));\n }\n },\n [markPageVisitedAction, setProgressAction, totalPages, visitedPages.size]\n );\n\n const isPageVisited = useCallback(\n (pageNumber: number) => {\n return visitedPages.has(pageNumber);\n },\n [visitedPages]\n );\n\n const getPageStatus = useCallback(\n (pageNumber: number): 'current' | 'visited' | 'unvisited' => {\n if (pageNumber === currentPage) return 'current';\n if (visitedPages.has(pageNumber)) return 'visited';\n return 'unvisited';\n },\n [currentPage, visitedPages]\n );\n\n // Auto-track current page visits\n useEffect(() => {\n if (!autoTrack || currentPage <= 0) return;\n\n const timer = setTimeout(() => {\n if (!visitedPages.has(currentPage)) {\n markPageVisited(currentPage);\n }\n }, trackDebounce);\n\n return () => clearTimeout(timer);\n }, [autoTrack, currentPage, trackDebounce, visitedPages, markPageVisited]);\n\n return useMemo(\n () => ({\n visitedPages,\n visitedPagesArray,\n progress,\n visitedPercentage,\n visitedCount,\n totalPages,\n currentPage,\n markPageVisited,\n isPageVisited,\n getPageStatus,\n }),\n [\n visitedPages,\n visitedPagesArray,\n progress,\n visitedPercentage,\n visitedCount,\n totalPages,\n currentPage,\n markPageVisited,\n isPageVisited,\n getPageStatus,\n ]\n );\n}\n","export {\n PDFViewerProvider,\n PDFViewerContext,\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n type PDFViewerProviderProps,\n type PDFViewerContextValue,\n} from './PDFViewerContext';\n\nexport { usePDFViewer } from './usePDFViewer';\nexport { usePageNavigation, type UsePageNavigationOptions } from './usePageNavigation';\nexport { useZoom, type UseZoomOptions } from './useZoom';\nexport { useTextSelection, type UseTextSelectionOptions } from './useTextSelection';\nexport { useHighlights, type UseHighlightsOptions, type UseHighlightsReturn } from './useHighlights';\nexport { useAnnotations, type UseAnnotationsOptions, type UseAnnotationsReturn } from './useAnnotations';\nexport { useTouchGestures, useIsTouchDevice, useIsMobile, type UseTouchGesturesOptions } from './useTouchGestures';\nexport { usePlugins, type UsePluginsOptions, type UsePluginsReturn } from './usePlugins';\n\n// Student Learning Feature Hooks\nexport { useAgentContext, type UseAgentContextOptions, type UseAgentContextReturn } from './useAgentContext';\nexport { useAskAbout, type UseAskAboutOptions, type UseAskAboutReturn } from './useAskAbout';\nexport { useBookmarks, type UseBookmarksOptions, type UseBookmarksReturn } from './useBookmarks';\nexport { useQuickNotes, type UseQuickNotesOptions, type UseQuickNotesReturn } from './useQuickNotes';\nexport { useStudentProgress, type UseStudentProgressOptions, type UseStudentProgressReturn } from './useStudentProgress';\n","import { memo, useCallback, useState } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface ToolbarProps {\n className?: string;\n showNavigation?: boolean;\n showZoom?: boolean;\n showRotation?: boolean;\n showTheme?: boolean;\n showSidebar?: boolean;\n showFullscreen?: boolean;\n}\n\nexport const Toolbar = memo(function Toolbar({\n className,\n showNavigation = true,\n showZoom = true,\n showRotation = true,\n showTheme = true,\n showSidebar = true,\n showFullscreen = true,\n}: ToolbarProps) {\n const {\n currentPage,\n numPages,\n scale,\n theme,\n sidebarOpen,\n goToPage,\n previousPage,\n nextPage,\n zoomIn,\n zoomOut,\n setScale,\n rotateClockwise,\n setTheme,\n toggleSidebar,\n setFullscreen,\n } = usePDFViewer();\n\n const [pageInput, setPageInput] = useState(String(currentPage));\n\n const handlePageInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPageInput(e.target.value);\n },\n []\n );\n\n const handlePageInputBlur = useCallback(() => {\n const page = parseInt(pageInput, 10);\n if (!isNaN(page) && page >= 1 && page <= numPages) {\n goToPage(page);\n } else {\n setPageInput(String(currentPage));\n }\n }, [pageInput, numPages, goToPage, currentPage]);\n\n const handlePageInputKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handlePageInputBlur();\n }\n },\n [handlePageInputBlur]\n );\n\n const handleZoomChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n if (value === 'fit-width') {\n setScale(1);\n } else if (value === 'fit-page') {\n setScale(1);\n } else {\n setScale(parseFloat(value));\n }\n },\n [setScale]\n );\n\n const zoomOptions = [\n { value: '0.5', label: '50%' },\n { value: '0.75', label: '75%' },\n { value: '1', label: '100%' },\n { value: '1.25', label: '125%' },\n { value: '1.5', label: '150%' },\n { value: '2', label: '200%' },\n { value: '3', label: '300%' },\n ];\n\n // Update page input when currentPage changes\n if (pageInput !== String(currentPage) && document.activeElement?.tagName !== 'INPUT') {\n setPageInput(String(currentPage));\n }\n\n return (\n <div\n className={cn(\n 'pdf-toolbar',\n 'flex items-center justify-between',\n 'px-4 py-2',\n 'bg-white border-b border-gray-200',\n 'dark:bg-gray-800 dark:border-gray-700',\n className\n )}\n >\n {/* Left section */}\n <div className=\"flex items-center gap-2\">\n {showSidebar && (\n <button\n onClick={toggleSidebar}\n className={cn(\n 'p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700',\n sidebarOpen && 'bg-gray-100 dark:bg-gray-700'\n )}\n title=\"Toggle Sidebar\"\n aria-label=\"Toggle Sidebar\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h7\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* Center section - Navigation */}\n <div className=\"flex items-center gap-4\">\n {showNavigation && (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={previousPage}\n disabled={currentPage <= 1}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Previous Page\"\n aria-label=\"Previous Page\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-1 text-sm\">\n <input\n type=\"text\"\n value={pageInput}\n onChange={handlePageInputChange}\n onBlur={handlePageInputBlur}\n onKeyDown={handlePageInputKeyDown}\n className=\"w-12 px-2 py-1 text-center border rounded dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Current Page\"\n />\n <span className=\"text-gray-500\">/ {numPages}</span>\n </div>\n\n <button\n onClick={nextPage}\n disabled={currentPage >= numPages}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Next Page\"\n aria-label=\"Next Page\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {showZoom && (\n <div className=\"flex items-center gap-2 border-l pl-4 border-gray-200 dark:border-gray-700\">\n <button\n onClick={zoomOut}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Zoom Out\"\n aria-label=\"Zoom Out\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\"\n />\n </svg>\n </button>\n\n <select\n value={scale.toString()}\n onChange={handleZoomChange}\n className=\"px-2 py-1 border rounded text-sm dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Zoom Level\"\n >\n {zoomOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <button\n onClick={zoomIn}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Zoom In\"\n aria-label=\"Zoom In\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v6m3-3H7\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Right section */}\n <div className=\"flex items-center gap-2\">\n {showRotation && (\n <button\n onClick={rotateClockwise}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Rotate Clockwise\"\n aria-label=\"Rotate Clockwise\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n </button>\n )}\n\n {showTheme && (\n <select\n value={theme}\n onChange={(e) => setTheme(e.target.value as 'light' | 'dark' | 'sepia')}\n className=\"px-2 py-1 border rounded text-sm dark:bg-gray-700 dark:border-gray-600\"\n aria-label=\"Theme\"\n >\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n <option value=\"sepia\">Sepia</option>\n </select>\n )}\n\n {showFullscreen && (\n <button\n onClick={() => setFullscreen(true)}\n className=\"p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Fullscreen\"\n aria-label=\"Fullscreen\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useState, useCallback } from 'react';\nimport { cn } from '../../utils';\n\nexport interface MobileToolbarProps {\n // Navigation\n currentPage: number;\n totalPages: number;\n onPreviousPage: () => void;\n onNextPage: () => void;\n onGoToPage: (page: number) => void;\n\n // Zoom\n scale: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n\n // Sidebar\n onToggleSidebar: () => void;\n sidebarOpen: boolean;\n\n // Theme\n theme: 'light' | 'dark' | 'sepia';\n onThemeChange: (theme: 'light' | 'dark' | 'sepia') => void;\n\n // Position\n position?: 'top' | 'bottom';\n\n className?: string;\n}\n\nexport const MobileToolbar = memo(function MobileToolbar({\n currentPage,\n totalPages,\n onPreviousPage,\n onNextPage,\n onGoToPage,\n scale,\n onZoomIn,\n onZoomOut,\n onToggleSidebar,\n sidebarOpen,\n theme,\n onThemeChange,\n position = 'bottom',\n className,\n}: MobileToolbarProps) {\n const [showMoreMenu, setShowMoreMenu] = useState(false);\n const [showPageInput, setShowPageInput] = useState(false);\n const [pageInputValue, setPageInputValue] = useState(String(currentPage));\n\n const handlePageSubmit = useCallback(() => {\n const page = parseInt(pageInputValue, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onGoToPage(page);\n }\n setShowPageInput(false);\n }, [pageInputValue, totalPages, onGoToPage]);\n\n const toggleMoreMenu = useCallback(() => {\n setShowMoreMenu((prev) => !prev);\n }, []);\n\n const buttonClasses = cn(\n 'min-w-[44px] min-h-[44px]',\n 'flex items-center justify-center',\n 'rounded-lg transition-colors',\n 'text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'active:bg-gray-200 dark:active:bg-gray-600',\n 'disabled:opacity-40 disabled:pointer-events-none'\n );\n\n return (\n <div\n className={cn(\n 'mobile-toolbar',\n 'fixed left-0 right-0 z-50',\n 'bg-white dark:bg-gray-800',\n 'border-gray-200 dark:border-gray-700',\n 'px-2 py-1 safe-area-inset',\n position === 'top' && 'top-0 border-b',\n position === 'bottom' && 'bottom-0 border-t',\n className\n )}\n >\n <div className=\"flex items-center justify-between gap-1\">\n {/* Sidebar toggle */}\n <button\n className={cn(buttonClasses, sidebarOpen && 'bg-blue-100 dark:bg-blue-900')}\n onClick={onToggleSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n\n {/* Navigation group */}\n <div className=\"flex items-center\">\n <button\n className={buttonClasses}\n onClick={onPreviousPage}\n disabled={currentPage <= 1}\n aria-label=\"Previous page\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n {/* Page indicator */}\n {showPageInput ? (\n <input\n type=\"number\"\n className={cn(\n 'w-16 h-10 text-center text-sm',\n 'bg-gray-100 dark:bg-gray-700',\n 'border border-gray-300 dark:border-gray-600',\n 'rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n value={pageInputValue}\n onChange={(e) => setPageInputValue(e.target.value)}\n onBlur={handlePageSubmit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handlePageSubmit();\n if (e.key === 'Escape') setShowPageInput(false);\n }}\n min={1}\n max={totalPages}\n autoFocus\n />\n ) : (\n <button\n className={cn(\n 'min-w-[60px] h-10 px-2',\n 'text-sm font-medium',\n 'text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n setPageInputValue(String(currentPage));\n setShowPageInput(true);\n }}\n >\n {currentPage} / {totalPages}\n </button>\n )}\n\n <button\n className={buttonClasses}\n onClick={onNextPage}\n disabled={currentPage >= totalPages}\n aria-label=\"Next page\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Zoom group */}\n <div className=\"flex items-center\">\n <button\n className={buttonClasses}\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n </button>\n\n <span className=\"text-xs text-gray-500 dark:text-gray-400 min-w-[40px] text-center\">\n {Math.round(scale * 100)}%\n </span>\n\n <button\n className={buttonClasses}\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n\n {/* More menu */}\n <div className=\"relative\">\n <button\n className={cn(buttonClasses, showMoreMenu && 'bg-gray-100 dark:bg-gray-700')}\n onClick={toggleMoreMenu}\n aria-label=\"More options\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n\n {/* More menu dropdown */}\n {showMoreMenu && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setShowMoreMenu(false)}\n />\n <div\n className={cn(\n 'absolute right-0 z-50',\n 'w-48 p-2',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n position === 'bottom' ? 'bottom-full mb-2' : 'top-full mt-2'\n )}\n >\n {/* Theme options */}\n <div className=\"px-2 py-1 text-xs text-gray-500 dark:text-gray-400 font-medium\">\n Theme\n </div>\n {(['light', 'dark', 'sepia'] as const).map((t) => (\n <button\n key={t}\n className={cn(\n 'w-full px-3 py-2 text-left text-sm rounded-lg',\n 'flex items-center gap-2',\n theme === t\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n onThemeChange(t);\n setShowMoreMenu(false);\n }}\n >\n <span className=\"capitalize\">{t}</span>\n {theme === t && (\n <svg className=\"w-4 h-4 ml-auto\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n});\n","export { Toolbar, type ToolbarProps } from './Toolbar';\nexport { MobileToolbar, type MobileToolbarProps } from './MobileToolbar';\n","import { useEffect, useRef, useState, memo, useCallback } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface ThumbnailPanelProps {\n className?: string;\n thumbnailScale?: number;\n}\n\ninterface ThumbnailProps {\n document: PDFDocumentProxy;\n pageNumber: number;\n isActive: boolean;\n onClick: () => void;\n scale: number;\n}\n\nconst Thumbnail = memo(function Thumbnail({\n document,\n pageNumber,\n isActive,\n onClick,\n scale,\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isRendered, setIsRendered] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n\n const renderThumbnail = async () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n try {\n const page = await document.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale });\n const context = canvas.getContext('2d');\n\n if (!context) return;\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n await page.render({\n canvasContext: context,\n viewport,\n }).promise;\n\n if (!cancelled) {\n setIsRendered(true);\n }\n } catch (error) {\n if (!cancelled) {\n console.error(`Error rendering thumbnail for page ${pageNumber}:`, error);\n }\n }\n };\n\n renderThumbnail();\n\n return () => {\n cancelled = true;\n };\n }, [document, pageNumber, scale]);\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'thumbnail-item',\n 'flex flex-col items-center p-2 rounded',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n isActive && 'bg-blue-50 dark:bg-blue-900/30 ring-2 ring-blue-500'\n )}\n >\n <div\n className={cn(\n 'relative bg-white shadow-md',\n !isRendered && 'animate-pulse bg-gray-200'\n )}\n >\n <canvas ref={canvasRef} className=\"block\" />\n </div>\n <span className=\"mt-1 text-xs text-gray-600 dark:text-gray-400\">\n {pageNumber}\n </span>\n </button>\n );\n});\n\nexport const ThumbnailPanel = memo(function ThumbnailPanel({\n className,\n thumbnailScale = 0.2,\n}: ThumbnailPanelProps) {\n const { document, currentPage, numPages, goToPage } = usePDFViewer();\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Scroll to active thumbnail when page changes\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const activeThumb = container.querySelector(`[data-page=\"${currentPage}\"]`);\n if (activeThumb) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, [currentPage]);\n\n const handleThumbnailClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n },\n [goToPage]\n );\n\n if (!document) {\n return (\n <div className={cn('thumbnail-panel p-4', className)}>\n <div className=\"text-sm text-gray-500\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'thumbnail-panel',\n 'overflow-y-auto p-2',\n 'grid grid-cols-1 gap-2',\n className\n )}\n >\n {Array.from({ length: numPages }, (_, i) => i + 1).map((pageNumber) => (\n <div key={pageNumber} data-page={pageNumber}>\n <Thumbnail\n document={document}\n pageNumber={pageNumber}\n isActive={pageNumber === currentPage}\n onClick={() => handleThumbnailClick(pageNumber)}\n scale={thumbnailScale}\n />\n </div>\n ))}\n </div>\n );\n});\n","import { memo, useCallback, useState, useEffect, useRef } from 'react';\nimport { usePDFViewer, useSearchStore, usePDFViewerStores } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface SearchPanelProps {\n className?: string;\n}\n\nexport const SearchPanel = memo(function SearchPanel({ className }: SearchPanelProps) {\n const { searchStore } = usePDFViewerStores();\n const {\n searchQuery,\n searchResults,\n currentSearchResult,\n isSearching,\n search,\n clearSearch,\n nextSearchResult,\n previousSearchResult,\n goToPage,\n } = usePDFViewer();\n\n const caseSensitive = useSearchStore((s) => s.caseSensitive);\n const wholeWord = useSearchStore((s) => s.wholeWord);\n const toggleCaseSensitive = useSearchStore((s) => s.toggleCaseSensitive);\n const toggleWholeWord = useSearchStore((s) => s.toggleWholeWord);\n\n const [inputValue, setInputValue] = useState(searchQuery);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus input on mount\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleSearch = useCallback(() => {\n if (inputValue.trim()) {\n search(inputValue.trim());\n }\n }, [inputValue, search]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n if (e.shiftKey) {\n previousSearchResult();\n } else if (searchResults.length > 0) {\n nextSearchResult();\n } else {\n handleSearch();\n }\n } else if (e.key === 'Escape') {\n clearSearch();\n setInputValue('');\n }\n },\n [handleSearch, searchResults, nextSearchResult, previousSearchResult, clearSearch]\n );\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n }, []);\n\n const handleClear = useCallback(() => {\n clearSearch();\n setInputValue('');\n inputRef.current?.focus();\n }, [clearSearch]);\n\n const handleResultClick = useCallback(\n (pageNumber: number, resultIndex: number) => {\n goToPage(pageNumber);\n // Navigate to specific result\n searchStore.getState().goToResult(resultIndex);\n },\n [goToPage, searchStore]\n );\n\n return (\n <div className={cn('search-panel', 'flex flex-col h-full', className)}>\n {/* Search input */}\n <div className=\"p-3 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search in document...\"\n className={cn(\n 'w-full px-3 py-2 pr-8',\n 'border rounded-md',\n 'text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'dark:bg-gray-700 dark:border-gray-600 dark:text-white'\n )}\n />\n {inputValue && (\n <button\n onClick={handleClear}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\"\n aria-label=\"Clear search\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* Search options */}\n <div className=\"flex items-center gap-4 mt-2\">\n <label className=\"flex items-center gap-1 text-xs text-gray-600 dark:text-gray-400 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={caseSensitive}\n onChange={toggleCaseSensitive}\n className=\"rounded\"\n />\n Match case\n </label>\n <label className=\"flex items-center gap-1 text-xs text-gray-600 dark:text-gray-400 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={wholeWord}\n onChange={toggleWholeWord}\n className=\"rounded\"\n />\n Whole word\n </label>\n </div>\n\n {/* Results navigation */}\n {searchResults.length > 0 && (\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n {currentSearchResult + 1} of {searchResults.length} results\n </span>\n <div className=\"flex gap-1\">\n <button\n onClick={previousSearchResult}\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Previous result\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </button>\n <button\n onClick={nextSearchResult}\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\"\n title=\"Next result\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {isSearching && (\n <div className=\"mt-2 text-xs text-gray-500\">Searching...</div>\n )}\n </div>\n\n {/* Results list */}\n <div className=\"flex-1 overflow-y-auto\">\n {searchResults.length === 0 && searchQuery && !isSearching && (\n <div className=\"p-4 text-sm text-gray-500 text-center\">\n No results found for \"{searchQuery}\"\n </div>\n )}\n\n {searchResults.length > 0 && (\n <ul className=\"divide-y divide-gray-100 dark:divide-gray-700\">\n {searchResults.map((result, index) => (\n <li key={`${result.pageNumber}-${result.matchIndex}`}>\n <button\n onClick={() => handleResultClick(result.pageNumber, index)}\n className={cn(\n 'w-full px-3 py-2 text-left',\n 'hover:bg-gray-50 dark:hover:bg-gray-700',\n 'focus:outline-none focus:bg-gray-50 dark:focus:bg-gray-700',\n index === currentSearchResult && 'bg-blue-50 dark:bg-blue-900/30'\n )}\n >\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n Page {result.pageNumber}\n </div>\n <div className=\"text-sm truncate\">{result.text}</div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useEffect, useState } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { cn } from '../../utils';\nimport type { OutlineItem } from '../../types';\n\nexport interface OutlinePanelProps {\n className?: string;\n}\n\ninterface OutlineNodeProps {\n item: OutlineItem;\n level: number;\n onNavigate: (pageNumber: number) => void;\n}\n\nconst OutlineNode = memo(function OutlineNode({\n item,\n level,\n onNavigate,\n}: OutlineNodeProps) {\n const [isExpanded, setIsExpanded] = useState(item.expanded ?? level < 2);\n const hasChildren = item.children && item.children.length > 0;\n\n const handleClick = useCallback(() => {\n if (item.pageNumber > 0) {\n onNavigate(item.pageNumber);\n }\n }, [item.pageNumber, onNavigate]);\n\n const handleToggle = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }, [isExpanded]);\n\n return (\n <div className=\"outline-node\">\n <div\n className={cn(\n 'flex items-center gap-1 py-1.5 px-2 rounded cursor-pointer',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'text-sm text-gray-700 dark:text-gray-300',\n 'transition-colors'\n )}\n style={{ paddingLeft: `${level * 12 + 8}px` }}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleClick();\n }\n }}\n >\n {/* Expand/collapse toggle */}\n {hasChildren ? (\n <button\n onClick={handleToggle}\n className=\"p-0.5 hover:bg-gray-200 dark:hover:bg-gray-600 rounded\"\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg\n className={cn(\n 'w-3 h-3 transition-transform',\n isExpanded && 'rotate-90'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <span className=\"w-4\" /> // Spacer for alignment\n )}\n\n {/* Title */}\n <span className=\"flex-1 truncate\" title={item.title}>\n {item.title}\n </span>\n\n {/* Page number */}\n {item.pageNumber > 0 && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500 ml-2\">\n {item.pageNumber}\n </span>\n )}\n </div>\n\n {/* Children */}\n {hasChildren && isExpanded && (\n <div className=\"outline-children\">\n {item.children.map((child, index) => (\n <OutlineNode\n key={`${child.title}-${index}`}\n item={child}\n level={level + 1}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )}\n </div>\n );\n});\n\nexport const OutlinePanel = memo(function OutlinePanel({\n className,\n}: OutlinePanelProps) {\n const { document, goToPage } = usePDFViewer();\n const [outline, setOutline] = useState<OutlineItem[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Load outline when document changes\n useEffect(() => {\n if (!document) {\n setOutline(null);\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n const loadOutline = async () => {\n try {\n const rawOutline = await document.getOutline();\n\n if (cancelled) return;\n\n if (!rawOutline || rawOutline.length === 0) {\n setOutline([]);\n return;\n }\n\n // Convert PDF.js outline format to our OutlineItem format\n const convertOutlineItem = async (item: {\n title: string;\n dest: string | unknown[] | null;\n items: unknown[];\n }): Promise<OutlineItem> => {\n let pageNumber = 0;\n\n // Try to resolve the destination to a page number\n if (item.dest) {\n try {\n let destRef: unknown;\n if (typeof item.dest === 'string') {\n destRef = await document.getDestination(item.dest);\n } else {\n destRef = item.dest;\n }\n\n if (Array.isArray(destRef) && destRef[0]) {\n const pageIndex = await document.getPageIndex(destRef[0]);\n pageNumber = pageIndex + 1; // Convert to 1-indexed\n }\n } catch {\n // Destination resolution failed, leave pageNumber as 0\n }\n }\n\n const children: OutlineItem[] = [];\n if (item.items && item.items.length > 0) {\n for (const child of item.items) {\n children.push(await convertOutlineItem(child as typeof item));\n }\n }\n\n return {\n title: item.title || 'Untitled',\n pageNumber,\n children,\n };\n };\n\n const convertedOutline: OutlineItem[] = [];\n for (const item of rawOutline) {\n convertedOutline.push(await convertOutlineItem(item));\n }\n\n if (!cancelled) {\n setOutline(convertedOutline);\n }\n } catch (err) {\n if (!cancelled) {\n console.error('Failed to load outline:', err);\n setError('Failed to load document outline');\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadOutline();\n\n return () => {\n cancelled = true;\n };\n }, [document]);\n\n const handleNavigate = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n },\n [goToPage]\n );\n\n if (!document) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No document loaded\n </p>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n Loading outline...\n </span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn('flex items-center justify-center p-4', className)}>\n <p className=\"text-sm text-red-500\">{error}</p>\n </div>\n );\n }\n\n if (!outline || outline.length === 0) {\n return (\n <div className={cn('flex flex-col items-center justify-center p-4 gap-2', className)}>\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400 text-center\">\n This document doesn&apos;t have an outline\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('outline-panel overflow-auto p-2', className)}>\n {outline.map((item, index) => (\n <OutlineNode\n key={`${item.title}-${index}`}\n item={item}\n level={0}\n onNavigate={handleNavigate}\n />\n ))}\n </div>\n );\n});\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useAnnotationStore } from '../../hooks';\nimport { usePDFViewer } from '../../hooks';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\nimport { exportHighlightsAsJSON, exportHighlightsAsMarkdown } from '../../utils/highlight-storage';\n\nexport interface HighlightsPanelProps {\n className?: string;\n /** Callback when a highlight item is clicked */\n onHighlightClick?: (highlight: Highlight) => void;\n}\n\nconst HIGHLIGHT_COLOR_DOT: Record<HighlightColor, string> = {\n yellow: 'bg-yellow-400',\n green: 'bg-green-400',\n blue: 'bg-blue-400',\n pink: 'bg-pink-400',\n orange: 'bg-orange-400',\n};\n\ninterface HighlightItemProps {\n highlight: Highlight;\n isSelected: boolean;\n onClick: () => void;\n onDelete: () => void;\n}\n\nconst HighlightItem = memo(function HighlightItem({\n highlight,\n isSelected,\n onClick,\n onDelete,\n}: HighlightItemProps) {\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n isSelected && 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Color dot */}\n <div\n className={cn(\n 'w-3 h-3 rounded-full mt-1 flex-shrink-0',\n HIGHLIGHT_COLOR_DOT[highlight.color]\n )}\n />\n\n <div className=\"flex-1 min-w-0\">\n {/* Text preview */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200 line-clamp-2\">\n &ldquo;{highlight.text}&rdquo;\n </p>\n\n {/* Comment if exists */}\n {highlight.comment && (\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400 line-clamp-1\">\n {highlight.comment}\n </p>\n )}\n\n {/* Page number and date */}\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n Page {highlight.pageNumber}\n </p>\n </div>\n\n {/* Delete button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded opacity-0 group-hover:opacity-100',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'transition-opacity duration-150',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete highlight\"\n aria-label=\"Delete highlight\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n highlights: Highlight[];\n selectedId: string | null;\n onHighlightClick: (highlight: Highlight) => void;\n onDeleteHighlight: (id: string) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n highlights,\n selectedId,\n onHighlightClick,\n onDeleteHighlight,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {highlights.map((highlight) => (\n <HighlightItem\n key={highlight.id}\n highlight={highlight}\n isSelected={highlight.id === selectedId}\n onClick={() => onHighlightClick(highlight)}\n onDelete={() => onDeleteHighlight(highlight.id)}\n />\n ))}\n </div>\n </div>\n );\n});\n\ntype ExportFormat = 'json' | 'markdown';\n\nexport const HighlightsPanel = memo(function HighlightsPanel({\n className,\n onHighlightClick,\n}: HighlightsPanelProps) {\n const highlights = useAnnotationStore((s) => s.highlights);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n const removeHighlight = useAnnotationStore((s) => s.removeHighlight);\n const selectHighlight = useAnnotationStore((s) => s.selectHighlight);\n const { goToPage } = usePDFViewer();\n const [showExportMenu, setShowExportMenu] = useState(false);\n\n // Group highlights by page\n const groupedHighlights = useMemo(() => {\n const groups = new Map<number, Highlight[]>();\n\n // Sort highlights by page number, then by position (y coordinate)\n const sorted = [...highlights].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n const aY = a.rects[0]?.y ?? 0;\n const bY = b.rects[0]?.y ?? 0;\n return aY - bY;\n });\n\n sorted.forEach((highlight) => {\n const page = highlight.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(highlight);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [highlights]);\n\n const handleHighlightClick = useCallback(\n (highlight: Highlight) => {\n selectHighlight(highlight.id);\n goToPage(highlight.pageNumber);\n onHighlightClick?.(highlight);\n },\n [selectHighlight, goToPage, onHighlightClick]\n );\n\n const handleDeleteHighlight = useCallback(\n (id: string) => {\n removeHighlight(id);\n },\n [removeHighlight]\n );\n\n const handleExport = useCallback(\n (format: ExportFormat) => {\n let content: string;\n let filename: string;\n let mimeType: string;\n\n if (format === 'json') {\n content = exportHighlightsAsJSON(highlights);\n filename = 'highlights.json';\n mimeType = 'application/json';\n } else {\n content = exportHighlightsAsMarkdown(highlights);\n filename = 'highlights.md';\n mimeType = 'text/markdown';\n }\n\n // Create download link\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setShowExportMenu(false);\n },\n [highlights]\n );\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200\">\n Highlights ({highlights.length})\n </h2>\n\n {/* Export button */}\n {highlights.length > 0 && (\n <div className=\"relative\">\n <button\n onClick={() => setShowExportMenu(!showExportMenu)}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n title=\"Export highlights\"\n aria-label=\"Export highlights\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n </button>\n\n {/* Export dropdown menu */}\n {showExportMenu && (\n <div\n className={cn(\n 'absolute right-0 mt-1 py-1 w-40',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'z-10'\n )}\n >\n <button\n onClick={() => handleExport('json')}\n className={cn(\n 'w-full px-4 py-2 text-left text-sm',\n 'text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n >\n Export as JSON\n </button>\n <button\n onClick={() => handleExport('markdown')}\n className={cn(\n 'w-full px-4 py-2 text-left text-sm',\n 'text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n >\n Export as Markdown\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Highlight list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {highlights.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No highlights yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n Select text in the PDF and click a color to create a highlight\n </p>\n </div>\n ) : (\n groupedHighlights.map(([pageNumber, pageHighlights]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n highlights={pageHighlights}\n selectedId={selectedHighlightId}\n onHighlightClick={handleHighlightClick}\n onDeleteHighlight={handleDeleteHighlight}\n />\n ))\n )}\n </div>\n </div>\n );\n});\n\nexport default HighlightsPanel;\n","import { memo } from 'react';\nimport { usePDFViewer } from '../../hooks';\nimport { ThumbnailPanel } from './ThumbnailPanel';\nimport { SearchPanel } from './SearchPanel';\nimport { OutlinePanel } from './OutlinePanel';\nimport { HighlightsPanel } from './HighlightsPanel';\nimport { cn } from '../../utils';\nimport type { SidebarPanel as SidebarPanelType } from '../../types';\n\nexport interface SidebarProps {\n className?: string;\n width?: number;\n}\n\ninterface SidebarTabProps {\n id: SidebarPanelType;\n icon: React.ReactNode;\n title: string;\n isActive: boolean;\n onClick: () => void;\n}\n\nconst SidebarTab = memo(function SidebarTab({\n icon,\n title,\n isActive,\n onClick,\n}: SidebarTabProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'p-3 flex items-center justify-center',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500',\n isActive && 'bg-gray-100 dark:bg-gray-700 border-l-2 border-blue-500'\n )}\n title={title}\n aria-label={title}\n aria-selected={isActive}\n role=\"tab\"\n >\n {icon}\n </button>\n );\n});\n\nexport const Sidebar = memo(function Sidebar({\n className,\n width = 280,\n}: SidebarProps) {\n const { sidebarOpen, sidebarPanel, setSidebarPanel } = usePDFViewer();\n\n if (!sidebarOpen) {\n return null;\n }\n\n const tabs: Array<{\n id: SidebarPanelType;\n icon: React.ReactNode;\n title: string;\n }> = [\n {\n id: 'thumbnails',\n title: 'Thumbnails',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\"\n />\n </svg>\n ),\n },\n {\n id: 'search',\n title: 'Search',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n ),\n },\n {\n id: 'outline',\n title: 'Outline',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n ),\n },\n {\n id: 'annotations',\n title: 'Annotations',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n ),\n },\n ];\n\n const renderPanel = () => {\n switch (sidebarPanel) {\n case 'thumbnails':\n return <ThumbnailPanel className=\"flex-1\" />;\n case 'search':\n return <SearchPanel className=\"flex-1\" />;\n case 'outline':\n return <OutlinePanel className=\"flex-1\" />;\n case 'annotations':\n return <HighlightsPanel className=\"flex-1\" />;\n default:\n return null;\n }\n };\n\n return (\n <div\n className={cn(\n 'pdf-sidebar',\n 'flex h-full',\n 'bg-white dark:bg-gray-800',\n 'border-r border-gray-200 dark:border-gray-700',\n className\n )}\n style={{ width }}\n >\n {/* Tab bar */}\n <div\n className={cn(\n 'flex flex-col',\n 'border-r border-gray-200 dark:border-gray-700',\n 'bg-gray-50 dark:bg-gray-900'\n )}\n role=\"tablist\"\n aria-orientation=\"vertical\"\n >\n {tabs.map((tab) => (\n <SidebarTab\n key={tab.id}\n id={tab.id}\n icon={tab.icon}\n title={tab.title}\n isActive={sidebarPanel === tab.id}\n onClick={() => setSidebarPanel(tab.id)}\n />\n ))}\n </div>\n\n {/* Panel content */}\n <div className=\"flex-1 flex flex-col overflow-hidden\">{renderPanel()}</div>\n </div>\n );\n});\n","import { memo, useCallback, useRef, useEffect, useState } from 'react';\nimport { cn } from '../../utils';\nimport type { SidebarPanel } from '../../types';\n\nexport interface MobileSidebarProps {\n isOpen: boolean;\n onClose: () => void;\n activePanel: SidebarPanel;\n onPanelChange: (panel: SidebarPanel) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst SWIPE_THRESHOLD = 50;\n\nexport const MobileSidebar = memo(function MobileSidebar({\n isOpen,\n onClose,\n activePanel,\n onPanelChange,\n children,\n className,\n}: MobileSidebarProps) {\n const sidebarRef = useRef<HTMLDivElement>(null);\n const startXRef = useRef(0);\n const [translateX, setTranslateX] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n\n // Handle touch start\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n startXRef.current = e.touches[0].clientX;\n setIsDragging(true);\n }, []);\n\n // Handle touch move\n const handleTouchMove = useCallback((e: React.TouchEvent) => {\n if (!isDragging) return;\n\n const currentX = e.touches[0].clientX;\n const diff = currentX - startXRef.current;\n\n // Only allow dragging to the left (to close)\n if (diff < 0) {\n setTranslateX(diff);\n }\n }, [isDragging]);\n\n // Handle touch end\n const handleTouchEnd = useCallback(() => {\n setIsDragging(false);\n\n // If dragged past threshold, close the sidebar\n if (translateX < -SWIPE_THRESHOLD) {\n onClose();\n }\n\n setTranslateX(0);\n }, [translateX, onClose]);\n\n // Close on escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n // Prevent body scroll when open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n const panels: { id: SidebarPanel; label: string; icon: React.ReactNode }[] = [\n {\n id: 'thumbnails',\n label: 'Pages',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n ),\n },\n {\n id: 'search',\n label: 'Search',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n ),\n },\n {\n id: 'outline',\n label: 'Outline',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n ),\n },\n {\n id: 'annotations',\n label: 'Notes',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>\n ),\n },\n ];\n\n return (\n <>\n {/* Backdrop */}\n <div\n className={cn(\n 'fixed inset-0 z-40 bg-black/50 transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sidebar drawer */}\n <div\n ref={sidebarRef}\n className={cn(\n 'mobile-sidebar',\n 'fixed inset-y-0 left-0 z-50',\n 'w-[85vw] max-w-[320px]',\n 'bg-white dark:bg-gray-800',\n 'shadow-2xl',\n 'transform transition-transform duration-300 ease-out',\n isOpen ? 'translate-x-0' : '-translate-x-full',\n className\n )}\n style={{\n transform: isOpen\n ? `translateX(${translateX}px)`\n : 'translateX(-100%)',\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">\n {panels.find((p) => p.id === activePanel)?.label || 'Menu'}\n </h2>\n <button\n className={cn(\n 'p-2 -mr-2 rounded-lg',\n 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'min-w-[44px] min-h-[44px] flex items-center justify-center'\n )}\n onClick={onClose}\n aria-label=\"Close sidebar\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Panel tabs */}\n <div className=\"flex border-b border-gray-200 dark:border-gray-700\">\n {panels.map((panel) => (\n <button\n key={panel.id}\n className={cn(\n 'flex-1 py-3 flex flex-col items-center gap-1',\n 'text-xs font-medium transition-colors',\n 'min-h-[60px]',\n activePanel === panel.id\n ? 'text-blue-600 dark:text-blue-400 border-b-2 border-blue-600 dark:border-blue-400 -mb-[2px]'\n : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'\n )}\n onClick={() => onPanelChange(panel.id)}\n >\n {panel.icon}\n <span>{panel.label}</span>\n </button>\n ))}\n </div>\n\n {/* Panel content */}\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {/* Swipe indicator */}\n <div className=\"absolute top-1/2 -translate-y-1/2 right-0 w-1 h-16 bg-gray-300 dark:bg-gray-600 rounded-l-full opacity-50\" />\n </div>\n </>\n );\n});\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport type { Bookmark } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface BookmarksPanelProps {\n className?: string;\n /** Callback when a bookmark item is clicked */\n onBookmarkClick?: (bookmark: Bookmark) => void;\n}\n\ninterface BookmarkItemProps {\n bookmark: Bookmark;\n isSelected: boolean;\n onClick: () => void;\n onDelete: () => void;\n onEdit: () => void;\n}\n\nconst BookmarkItem = memo(function BookmarkItem({\n bookmark,\n isSelected,\n onClick,\n onDelete,\n onEdit,\n}: BookmarkItemProps) {\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n isSelected && 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Bookmark icon */}\n <div className=\"mt-0.5 flex-shrink-0\">\n <svg\n className=\"w-4 h-4 text-blue-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" />\n </svg>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {/* Label or page number */}\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-200\">\n {bookmark.label || `Page ${bookmark.pageNumber}`}\n </p>\n\n {/* User note if exists */}\n {bookmark.userNote && (\n <p className=\"mt-1 text-xs text-gray-600 dark:text-gray-300 line-clamp-2\">\n {bookmark.userNote}\n </p>\n )}\n\n {/* Agent context if exists */}\n {bookmark.agentContext && (\n <p className=\"mt-1 text-xs text-blue-500 dark:text-blue-400 line-clamp-1 italic\">\n AI: &ldquo;{bookmark.agentContext}&rdquo;\n </p>\n )}\n\n {/* Timestamp */}\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n {bookmark.timestamp.toLocaleDateString()} at{' '}\n {bookmark.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n className={cn(\n 'p-1 rounded',\n 'text-gray-400 hover:text-blue-500',\n 'hover:bg-blue-50 dark:hover:bg-blue-900/20',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Edit bookmark\"\n aria-label=\"Edit bookmark\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete bookmark\"\n aria-label=\"Delete bookmark\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n bookmarks: Bookmark[];\n currentPage: number;\n onBookmarkClick: (bookmark: Bookmark) => void;\n onDeleteBookmark: (id: string) => void;\n onEditBookmark: (bookmark: Bookmark) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n bookmarks,\n currentPage,\n onBookmarkClick,\n onDeleteBookmark,\n onEditBookmark,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {bookmarks.map((bookmark) => (\n <BookmarkItem\n key={bookmark.id}\n bookmark={bookmark}\n isSelected={bookmark.pageNumber === currentPage}\n onClick={() => onBookmarkClick(bookmark)}\n onDelete={() => onDeleteBookmark(bookmark.id)}\n onEdit={() => onEditBookmark(bookmark)}\n />\n ))}\n </div>\n </div>\n );\n});\n\ninterface EditModalProps {\n bookmark: Bookmark;\n onSave: (updates: { label?: string; userNote?: string }) => void;\n onClose: () => void;\n}\n\nconst EditModal = memo(function EditModal({ bookmark, onSave, onClose }: EditModalProps) {\n const [label, setLabel] = useState(bookmark.label || '');\n const [userNote, setUserNote] = useState(bookmark.userNote || '');\n\n const handleSave = useCallback(() => {\n onSave({ label: label || undefined, userNote: userNote || undefined });\n }, [label, userNote, onSave]);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-md mx-4 p-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n Edit Bookmark\n </h3>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Label\n </label>\n <input\n type=\"text\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder={`Page ${bookmark.pageNumber}`}\n className={cn(\n 'w-full px-3 py-2 rounded-md',\n 'border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-white',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Note\n </label>\n <textarea\n value={userNote}\n onChange={(e) => setUserNote(e.target.value)}\n placeholder=\"Add a note...\"\n rows={3}\n className={cn(\n 'w-full px-3 py-2 rounded-md',\n 'border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-white',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'resize-none'\n )}\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={onClose}\n className={cn(\n 'px-4 py-2 rounded-md text-sm font-medium',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className={cn(\n 'px-4 py-2 rounded-md text-sm font-medium',\n 'bg-blue-500 text-white',\n 'hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n});\n\nexport const BookmarksPanel = memo(function BookmarksPanel({\n className,\n onBookmarkClick,\n}: BookmarksPanelProps) {\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const removeBookmark = useStudentStore((s) => s.removeBookmark);\n const updateBookmark = useStudentStore((s) => s.updateBookmark);\n const currentPage = useViewerStore((s) => s.currentPage);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n const [editingBookmark, setEditingBookmark] = useState<Bookmark | null>(null);\n\n // Group bookmarks by page\n const groupedBookmarks = useMemo(() => {\n const groups = new Map<number, Bookmark[]>();\n\n // Sort bookmarks by page number, then by timestamp\n const sorted = [...bookmarks].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n return a.timestamp.getTime() - b.timestamp.getTime();\n });\n\n sorted.forEach((bookmark) => {\n const page = bookmark.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(bookmark);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [bookmarks]);\n\n const handleBookmarkClick = useCallback(\n (bookmark: Bookmark) => {\n goToPage(bookmark.pageNumber);\n onBookmarkClick?.(bookmark);\n },\n [goToPage, onBookmarkClick]\n );\n\n const handleDeleteBookmark = useCallback(\n (id: string) => {\n removeBookmark(id);\n },\n [removeBookmark]\n );\n\n const handleEditBookmark = useCallback((bookmark: Bookmark) => {\n setEditingBookmark(bookmark);\n }, []);\n\n const handleSaveEdit = useCallback(\n (updates: { label?: string; userNote?: string }) => {\n if (editingBookmark) {\n updateBookmark(editingBookmark.id, updates);\n setEditingBookmark(null);\n }\n },\n [editingBookmark, updateBookmark]\n );\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200\">\n Bookmarks ({bookmarks.length})\n </h2>\n </div>\n\n {/* Bookmark list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {bookmarks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No bookmarks yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n Click the bookmark button in the toolbar to save your place\n </p>\n </div>\n ) : (\n groupedBookmarks.map(([pageNumber, pageBookmarks]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n bookmarks={pageBookmarks}\n currentPage={currentPage}\n onBookmarkClick={handleBookmarkClick}\n onDeleteBookmark={handleDeleteBookmark}\n onEditBookmark={handleEditBookmark}\n />\n ))\n )}\n </div>\n\n {/* Edit modal */}\n {editingBookmark && (\n <EditModal\n bookmark={editingBookmark}\n onSave={handleSaveEdit}\n onClose={() => setEditingBookmark(null)}\n />\n )}\n </div>\n );\n});\n\nexport default BookmarksPanel;\n","import { memo, useMemo, useCallback, useState } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport type { Takeaway } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface TakeawaysPanelProps {\n className?: string;\n /** Callback when a takeaway item is clicked */\n onTakeawayClick?: (takeaway: Takeaway) => void;\n /** Filter by source */\n sourceFilter?: 'all' | 'agent' | 'user';\n}\n\ninterface TakeawayItemProps {\n takeaway: Takeaway;\n onClick: () => void;\n onDelete: () => void;\n}\n\nconst TakeawayItem = memo(function TakeawayItem({\n takeaway,\n onClick,\n onDelete,\n}: TakeawayItemProps) {\n const isAgent = takeaway.source === 'agent';\n\n return (\n <div\n className={cn(\n 'group p-3 rounded-lg cursor-pointer',\n 'border border-transparent',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-3\">\n {/* Source icon */}\n <div\n className={cn(\n 'mt-0.5 flex-shrink-0 w-5 h-5 rounded-full flex items-center justify-center',\n isAgent ? 'bg-blue-100 dark:bg-blue-900/50' : 'bg-green-100 dark:bg-green-900/50'\n )}\n >\n {isAgent ? (\n <svg className=\"w-3 h-3 text-blue-600 dark:text-blue-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2a2 2 0 012 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 017 7h1a1 1 0 011 1v3a1 1 0 01-1 1h-1v1a2 2 0 01-2 2H5a2 2 0 01-2-2v-1H2a1 1 0 01-1-1v-3a1 1 0 011-1h1a7 7 0 017-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 012-2z\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-green-600 dark:text-green-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {/* Summary text */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200\">\n {takeaway.summary}\n </p>\n\n {/* Metadata */}\n <div className=\"mt-1 flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500\">\n <span>Page {takeaway.pageNumber}</span>\n <span>&middot;</span>\n <span>{isAgent ? 'AI Summary' : 'Your Note'}</span>\n </div>\n </div>\n\n {/* Delete button (only for user takeaways) */}\n {!isAgent && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n 'p-1 rounded opacity-0 group-hover:opacity-100',\n 'text-gray-400 hover:text-red-500',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'transition-opacity duration-150',\n 'focus:outline-none focus:opacity-100'\n )}\n title=\"Delete takeaway\"\n aria-label=\"Delete takeaway\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n});\n\ninterface PageGroupProps {\n pageNumber: number;\n takeaways: Takeaway[];\n onTakeawayClick: (takeaway: Takeaway) => void;\n onDeleteTakeaway: (id: string) => void;\n}\n\nconst PageGroup = memo(function PageGroup({\n pageNumber,\n takeaways,\n onTakeawayClick,\n onDeleteTakeaway,\n}: PageGroupProps) {\n return (\n <div className=\"mb-4\">\n <h3 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 px-3\">\n Page {pageNumber}\n </h3>\n <div className=\"space-y-1\">\n {takeaways.map((takeaway) => (\n <TakeawayItem\n key={takeaway.id}\n takeaway={takeaway}\n onClick={() => onTakeawayClick(takeaway)}\n onDelete={() => onDeleteTakeaway(takeaway.id)}\n />\n ))}\n </div>\n </div>\n );\n});\n\nexport const TakeawaysPanel = memo(function TakeawaysPanel({\n className,\n onTakeawayClick,\n sourceFilter = 'all',\n}: TakeawaysPanelProps) {\n const takeaways = useStudentStore((s) => s.takeaways);\n const removeTakeaway = useStudentStore((s) => s.removeTakeaway);\n const goToPage = useViewerStore((s) => s.goToPage);\n const [activeFilter, setActiveFilter] = useState<'all' | 'agent' | 'user'>(sourceFilter);\n\n // Filter takeaways by source\n const filteredTakeaways = useMemo(() => {\n if (activeFilter === 'all') return takeaways;\n return takeaways.filter((t) => t.source === activeFilter);\n }, [takeaways, activeFilter]);\n\n // Group takeaways by page\n const groupedTakeaways = useMemo(() => {\n const groups = new Map<number, Takeaway[]>();\n\n const sorted = [...filteredTakeaways].sort((a, b) => {\n if (a.pageNumber !== b.pageNumber) return a.pageNumber - b.pageNumber;\n return a.timestamp.getTime() - b.timestamp.getTime();\n });\n\n sorted.forEach((takeaway) => {\n const page = takeaway.pageNumber;\n if (!groups.has(page)) {\n groups.set(page, []);\n }\n groups.get(page)!.push(takeaway);\n });\n\n return Array.from(groups.entries()).sort(([a], [b]) => a - b);\n }, [filteredTakeaways]);\n\n const handleTakeawayClick = useCallback(\n (takeaway: Takeaway) => {\n goToPage(takeaway.pageNumber);\n onTakeawayClick?.(takeaway);\n },\n [goToPage, onTakeawayClick]\n );\n\n const handleDeleteTakeaway = useCallback(\n (id: string) => {\n removeTakeaway(id);\n },\n [removeTakeaway]\n );\n\n const agentCount = takeaways.filter((t) => t.source === 'agent').length;\n const userCount = takeaways.filter((t) => t.source === 'user').length;\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2\">\n Key Takeaways ({filteredTakeaways.length})\n </h2>\n\n {/* Filter tabs */}\n <div className=\"flex gap-1\">\n <button\n onClick={() => setActiveFilter('all')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'all'\n ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n All ({takeaways.length})\n </button>\n <button\n onClick={() => setActiveFilter('agent')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'agent'\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n AI ({agentCount})\n </button>\n <button\n onClick={() => setActiveFilter('user')}\n className={cn(\n 'px-2 py-1 text-xs rounded-md transition-colors',\n activeFilter === 'user'\n ? 'bg-green-100 dark:bg-green-900/50 text-green-700 dark:text-green-300'\n : 'text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800'\n )}\n >\n Mine ({userCount})\n </button>\n </div>\n </div>\n\n {/* Takeaway list */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {filteredTakeaways.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n <svg\n className=\"w-12 h-12 text-gray-300 dark:text-gray-600 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n No takeaways yet\n </p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mt-1\">\n {activeFilter === 'agent'\n ? 'AI summaries will appear here as you read'\n : activeFilter === 'user'\n ? 'Add your own key points while studying'\n : 'Key points and summaries will appear here'}\n </p>\n </div>\n ) : (\n groupedTakeaways.map(([pageNumber, pageTakeaways]) => (\n <PageGroup\n key={pageNumber}\n pageNumber={pageNumber}\n takeaways={pageTakeaways}\n onTakeawayClick={handleTakeawayClick}\n onDeleteTakeaway={handleDeleteTakeaway}\n />\n ))\n )}\n </div>\n </div>\n );\n});\n\nexport default TakeawaysPanel;\n","export { Sidebar, type SidebarProps } from './Sidebar';\nexport { MobileSidebar, type MobileSidebarProps } from './MobileSidebar';\nexport { ThumbnailPanel, type ThumbnailPanelProps } from './ThumbnailPanel';\nexport { SearchPanel, type SearchPanelProps } from './SearchPanel';\nexport { OutlinePanel, type OutlinePanelProps } from './OutlinePanel';\nexport { HighlightsPanel, type HighlightsPanelProps } from './HighlightsPanel';\nexport { BookmarksPanel, type BookmarksPanelProps } from './BookmarksPanel';\nexport { TakeawaysPanel, type TakeawaysPanelProps } from './TakeawaysPanel';\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\nimport { useAnnotationStore } from '../../hooks';\nimport type { AnnotationTool, ShapeType } from '../../store/annotation-store';\n\nexport interface AnnotationToolbarProps {\n /** Override the active tool from store */\n activeTool?: AnnotationTool;\n /** Override the active shape type from store */\n activeShapeType?: ShapeType;\n /** Override the drawing color from store */\n drawingColor?: string;\n /** Override the stroke width from store */\n strokeWidth?: number;\n /** Custom tool change handler */\n onToolChange?: (tool: AnnotationTool) => void;\n /** Custom shape type change handler */\n onShapeTypeChange?: (shapeType: ShapeType) => void;\n /** Custom color change handler */\n onColorChange?: (color: string) => void;\n /** Custom stroke width change handler */\n onStrokeWidthChange?: (width: number) => void;\n /** Position of the toolbar */\n position?: 'top' | 'bottom' | 'floating';\n /** Additional class name */\n className?: string;\n}\n\nconst COLORS = [\n '#ef4444', // red\n '#f97316', // orange\n '#eab308', // yellow\n '#22c55e', // green\n '#3b82f6', // blue\n '#8b5cf6', // purple\n '#ec4899', // pink\n '#000000', // black\n];\n\nconst STROKE_WIDTHS = [1, 2, 3, 5, 8];\n\nconst SHAPE_TYPES: { type: ShapeType; icon: React.ReactNode; label: string }[] = [\n {\n type: 'rect',\n label: 'Rectangle',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" strokeWidth={2} />\n </svg>\n ),\n },\n {\n type: 'circle',\n label: 'Circle/Ellipse',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\" strokeWidth={2} />\n </svg>\n ),\n },\n {\n type: 'arrow',\n label: 'Arrow',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n ),\n },\n {\n type: 'line',\n label: 'Line',\n icon: (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 20L20 4\" />\n </svg>\n ),\n },\n];\n\nexport const AnnotationToolbar = memo(function AnnotationToolbar({\n activeTool: activeToolProp,\n activeShapeType: activeShapeTypeProp,\n drawingColor: drawingColorProp,\n strokeWidth: strokeWidthProp,\n onToolChange: onToolChangeProp,\n onShapeTypeChange: onShapeTypeChangeProp,\n onColorChange: onColorChangeProp,\n onStrokeWidthChange: onStrokeWidthChangeProp,\n position = 'top',\n className,\n}: AnnotationToolbarProps) {\n // Get state from store\n const storeActiveTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const storeActiveShapeType = useAnnotationStore((s) => s.activeShapeType);\n const storeDrawingColor = useAnnotationStore((s) => s.drawingColor);\n const storeStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const setActiveAnnotationTool = useAnnotationStore((s) => s.setActiveAnnotationTool);\n const setActiveShapeType = useAnnotationStore((s) => s.setActiveShapeType);\n const setDrawingColor = useAnnotationStore((s) => s.setDrawingColor);\n const setDrawingStrokeWidth = useAnnotationStore((s) => s.setDrawingStrokeWidth);\n\n // Use props if provided, otherwise use store values\n const activeTool = activeToolProp !== undefined ? activeToolProp : storeActiveTool;\n const activeShapeType = activeShapeTypeProp !== undefined ? activeShapeTypeProp : storeActiveShapeType;\n const drawingColor = drawingColorProp !== undefined ? drawingColorProp : storeDrawingColor;\n const strokeWidth = strokeWidthProp !== undefined ? strokeWidthProp : storeStrokeWidth;\n\n // Use custom handlers if provided, otherwise use store actions\n const onToolChange = onToolChangeProp || setActiveAnnotationTool;\n const onShapeTypeChange = onShapeTypeChangeProp || setActiveShapeType;\n const onColorChange = onColorChangeProp || setDrawingColor;\n const onStrokeWidthChange = onStrokeWidthChangeProp || setDrawingStrokeWidth;\n\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showShapePicker, setShowShapePicker] = useState(false);\n const [showStrokeWidth, setShowStrokeWidth] = useState(false);\n const colorPickerRef = useRef<HTMLDivElement>(null);\n const shapePickerRef = useRef<HTMLDivElement>(null);\n const strokePickerRef = useRef<HTMLDivElement>(null);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (colorPickerRef.current && !colorPickerRef.current.contains(target)) {\n setShowColorPicker(false);\n }\n if (shapePickerRef.current && !shapePickerRef.current.contains(target)) {\n setShowShapePicker(false);\n }\n if (strokePickerRef.current && !strokePickerRef.current.contains(target)) {\n setShowStrokeWidth(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleToolClick = useCallback((tool: AnnotationTool) => {\n onToolChange(activeTool === tool ? null : tool);\n }, [activeTool, onToolChange]);\n\n const isActive = activeTool !== null;\n\n return (\n <div\n className={cn(\n 'annotation-toolbar flex items-center gap-1 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700',\n position === 'floating' && 'fixed bottom-20 left-1/2 -translate-x-1/2 z-50',\n position === 'top' && 'sticky top-0 z-40',\n position === 'bottom' && 'sticky bottom-0 z-40',\n !isActive && 'opacity-90',\n className\n )}\n >\n {/* Note tool */}\n <button\n className={cn(\n 'p-2 rounded transition-colors',\n activeTool === 'note'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => handleToolClick('note')}\n title=\"Sticky Note\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>\n </button>\n\n {/* Draw tool */}\n <button\n className={cn(\n 'p-2 rounded transition-colors',\n activeTool === 'draw'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => handleToolClick('draw')}\n title=\"Freehand Draw\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n\n {/* Shape tool with dropdown */}\n <div className=\"relative\" ref={shapePickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors flex items-center gap-1',\n activeTool === 'shape'\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n if (activeTool !== 'shape') {\n handleToolClick('shape');\n }\n setShowShapePicker(!showShapePicker);\n }}\n title=\"Shapes\"\n >\n {SHAPE_TYPES.find(s => s.type === activeShapeType)?.icon || SHAPE_TYPES[0].icon}\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {showShapePicker && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"flex gap-1\">\n {SHAPE_TYPES.map((shape) => (\n <button\n key={shape.type}\n className={cn(\n 'p-2 rounded transition-colors',\n activeShapeType === shape.type\n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'\n )}\n onClick={() => {\n onShapeTypeChange(shape.type);\n onToolChange('shape');\n setShowShapePicker(false);\n }}\n title={shape.label}\n >\n {shape.icon}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Color picker */}\n <div className=\"relative\" ref={colorPickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors hover:bg-gray-100 dark:hover:bg-gray-700',\n showColorPicker && 'bg-gray-100 dark:bg-gray-700'\n )}\n onClick={() => setShowColorPicker(!showColorPicker)}\n title=\"Color\"\n >\n <div\n className=\"w-5 h-5 rounded border-2 border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: drawingColor }}\n />\n </button>\n\n {showColorPicker && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"grid grid-cols-4 gap-1\">\n {COLORS.map((color) => (\n <button\n key={color}\n className={cn(\n 'w-6 h-6 rounded border-2 transition-transform hover:scale-110',\n drawingColor === color\n ? 'border-blue-500 ring-2 ring-blue-200'\n : 'border-gray-300 dark:border-gray-500'\n )}\n style={{ backgroundColor: color }}\n onClick={() => {\n onColorChange(color);\n setShowColorPicker(false);\n }}\n title={color}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Stroke width */}\n <div className=\"relative\" ref={strokePickerRef}>\n <button\n className={cn(\n 'p-2 rounded transition-colors hover:bg-gray-100 dark:hover:bg-gray-700',\n showStrokeWidth && 'bg-gray-100 dark:bg-gray-700'\n )}\n onClick={() => setShowStrokeWidth(!showStrokeWidth)}\n title=\"Stroke Width\"\n >\n <div className=\"w-5 h-5 flex items-center justify-center\">\n <div\n className=\"rounded-full bg-gray-700 dark:bg-gray-300\"\n style={{ width: Math.min(strokeWidth * 2, 16), height: Math.min(strokeWidth * 2, 16) }}\n />\n </div>\n </button>\n\n {showStrokeWidth && (\n <div className=\"absolute bottom-full left-0 mb-2 p-2 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"flex flex-col gap-1\">\n {STROKE_WIDTHS.map((width) => (\n <button\n key={width}\n className={cn(\n 'flex items-center gap-2 px-3 py-1 rounded transition-colors',\n strokeWidth === width\n ? 'bg-blue-100 dark:bg-blue-900'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700'\n )}\n onClick={() => {\n onStrokeWidthChange(width);\n setShowStrokeWidth(false);\n }}\n >\n <div\n className=\"rounded-full bg-gray-700 dark:bg-gray-300\"\n style={{ width: width * 2, height: width * 2 }}\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">{width}px</span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Clear/Cancel button */}\n {activeTool && (\n <button\n className=\"p-2 rounded transition-colors hover:bg-red-100 dark:hover:bg-red-900/30 text-red-600 dark:text-red-400\"\n onClick={() => onToolChange(null)}\n title=\"Exit annotation mode\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n );\n});\n","export { AnnotationToolbar, type AnnotationToolbarProps } from './AnnotationToolbar';\n","import { useEffect, useRef, useCallback, useState, memo } from 'react';\nimport type { PDFPageProxy, RenderTask } from 'pdfjs-dist';\nimport { cn } from '../../utils';\n\nexport interface CanvasLayerProps {\n page: PDFPageProxy;\n scale: number;\n rotation: number;\n className?: string;\n onRenderStart?: () => void;\n onRenderComplete?: () => void;\n onRenderError?: (error: Error) => void;\n /** Priority for rendering (lower = higher priority) - used for render ordering */\n priority?: number;\n}\n\n/**\n * CanvasLayer renders a PDF page at full quality.\n *\n * Optimizations for mobile:\n * - Uses requestAnimationFrame for render timing\n * - Cancels pending renders on unmount/update\n * - Uses 'display' intent for faster rendering\n * - Disables alpha channel for better performance\n */\nexport const CanvasLayer = memo(function CanvasLayer({\n page,\n scale,\n rotation,\n className,\n onRenderStart,\n onRenderComplete,\n onRenderError,\n priority: _priority,\n}: CanvasLayerProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const [isRendering, setIsRendering] = useState(false);\n const mountedRef = useRef(true);\n const rafIdRef = useRef<number | null>(null);\n\n const cancelRender = useCallback(() => {\n // Cancel any pending animation frame\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n // Cancel any ongoing render task\n if (renderTaskRef.current) {\n renderTaskRef.current.cancel();\n renderTaskRef.current = null;\n }\n }, []);\n\n const render = useCallback(async () => {\n const canvas = canvasRef.current;\n if (!canvas || !page) return;\n\n // Cancel any ongoing render\n cancelRender();\n\n const viewport = page.getViewport({ scale, rotation });\n\n // Use 2d context without alpha for better performance\n const context = canvas.getContext('2d', {\n alpha: false,\n // Hint for better performance on mobile\n desynchronized: true,\n });\n\n if (!context) {\n onRenderError?.(new Error('Failed to get canvas context'));\n return;\n }\n\n // Use full device pixel ratio for crisp rendering\n const outputScale = window.devicePixelRatio || 1;\n\n // Set canvas dimensions at full quality\n canvas.width = Math.floor(viewport.width * outputScale);\n canvas.height = Math.floor(viewport.height * outputScale);\n canvas.style.width = `${Math.floor(viewport.width)}px`;\n canvas.style.height = `${Math.floor(viewport.height)}px`;\n\n // Scale for high DPI displays\n context.scale(outputScale, outputScale);\n\n if (mountedRef.current) {\n setIsRendering(true);\n }\n onRenderStart?.();\n\n try {\n renderTaskRef.current = page.render({\n canvasContext: context,\n viewport,\n // 'display' intent is faster than 'print' and sufficient for screen viewing\n intent: 'display',\n });\n\n await renderTaskRef.current.promise;\n\n if (mountedRef.current) {\n setIsRendering(false);\n }\n onRenderComplete?.();\n } catch (error) {\n if ((error as Error).name !== 'RenderingCancelledException') {\n if (mountedRef.current) {\n setIsRendering(false);\n }\n onRenderError?.(error as Error);\n }\n }\n }, [page, scale, rotation, cancelRender, onRenderStart, onRenderComplete, onRenderError]);\n\n // Render when page, scale, or rotation changes\n // Use requestAnimationFrame to avoid blocking the main thread\n useEffect(() => {\n rafIdRef.current = requestAnimationFrame(() => {\n render();\n });\n\n return () => {\n cancelRender();\n };\n }, [render, cancelRender]);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cancelRender();\n };\n }, [cancelRender]);\n\n return (\n <canvas\n ref={canvasRef}\n className={cn(\n 'pdf-canvas-layer',\n 'absolute inset-0',\n isRendering && 'opacity-50',\n className\n )}\n style={{ zIndex: 10 }}\n />\n );\n});\n","import { useEffect, useRef, memo } from 'react';\nimport type { PDFPageProxy } from 'pdfjs-dist';\nimport { cn } from '../../utils';\n\nexport interface TextLayerProps {\n page: PDFPageProxy;\n scale: number;\n rotation: number;\n className?: string;\n}\n\n// Local type for text content to avoid pdfjs-dist version issues\ninterface TextContentItem {\n str?: string;\n dir?: string;\n transform?: number[];\n width?: number;\n height?: number;\n fontName?: string;\n}\n\ninterface LocalTextContent {\n items: TextContentItem[];\n}\n\nfunction isTextItem(item: TextContentItem): item is Required<TextContentItem> {\n return typeof item.str === 'string' && Array.isArray(item.transform);\n}\n\nexport const TextLayer = memo(function TextLayer({\n page,\n scale,\n rotation,\n className,\n}: TextLayerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const pageNumberRef = useRef<number | null>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !page) return;\n\n let cancelled = false;\n\n const renderTextLayer = async () => {\n // Clear existing text\n container.innerHTML = '';\n\n // Check if page number changed - if so, we need fresh text content\n const currentPageNumber = page.pageNumber;\n\n try {\n // Get text content - don't cache as the page object may change\n const textContent = (await page.getTextContent()) as unknown as LocalTextContent;\n\n // Check if cancelled or page changed during async operation\n if (cancelled || pageNumberRef.current !== currentPageNumber) {\n return;\n }\n\n const viewport = page.getViewport({ scale, rotation });\n\n // Set container dimensions\n container.style.width = `${viewport.width}px`;\n container.style.height = `${viewport.height}px`;\n\n // Render each text item\n for (const item of textContent.items) {\n if (cancelled) return;\n if (!isTextItem(item) || !item.str.trim()) continue;\n\n const [scaleX, rotY, rotX, scaleY, tx, ty] = item.transform;\n\n // Calculate position and font size\n const fontSize = Math.sqrt(rotX * rotX + scaleY * scaleY) * scale;\n const angle = Math.atan2(rotY, scaleX) * (180 / Math.PI) + rotation;\n\n // Create text span\n const span = document.createElement('span');\n span.textContent = item.str;\n span.style.cssText = `\n position: absolute;\n left: ${tx * scale}px;\n top: ${viewport.height - ty * scale - fontSize}px;\n font-size: ${fontSize}px;\n font-family: sans-serif;\n transform-origin: 0 0;\n transform: rotate(${angle}deg) scaleX(${(item.width * scale) / (fontSize * item.str.length) || 1});\n white-space: pre;\n color: transparent;\n pointer-events: all;\n user-select: text;\n `;\n\n container.appendChild(span);\n }\n } catch (error) {\n // Silently ignore errors from destroyed pages\n if (!cancelled) {\n // Only log if not a page destruction error\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('sendWithStream') && !errorMessage.includes('destroyed')) {\n console.error('Error rendering text layer:', error);\n }\n }\n }\n };\n\n pageNumberRef.current = page.pageNumber;\n renderTextLayer();\n\n return () => {\n cancelled = true;\n if (container) {\n container.innerHTML = '';\n }\n };\n }, [page, scale, rotation]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'pdf-text-layer',\n 'absolute inset-0 overflow-hidden',\n 'select-text',\n className\n )}\n style={{ zIndex: 20 }}\n />\n );\n});\n","import { memo, useMemo } from 'react';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface HighlightLayerProps {\n highlights: Highlight[];\n scale: number;\n selectedId?: string | null;\n onHighlightClick?: (highlight: Highlight) => void;\n className?: string;\n /** Filter by source type */\n sourceFilter?: 'all' | 'user' | 'agent';\n}\n\n// User highlight colors (warmer tones)\nconst HIGHLIGHT_COLORS: Record<HighlightColor, string> = {\n yellow: 'rgba(254, 240, 138, 0.5)',\n green: 'rgba(134, 239, 172, 0.5)',\n blue: 'rgba(147, 197, 253, 0.5)',\n pink: 'rgba(249, 168, 212, 0.5)',\n orange: 'rgba(253, 186, 116, 0.5)',\n};\n\nconst HIGHLIGHT_COLORS_SELECTED: Record<HighlightColor, string> = {\n yellow: 'rgba(254, 240, 138, 0.8)',\n green: 'rgba(134, 239, 172, 0.8)',\n blue: 'rgba(147, 197, 253, 0.8)',\n pink: 'rgba(249, 168, 212, 0.8)',\n orange: 'rgba(253, 186, 116, 0.8)',\n};\n\n// Agent highlight colors (cooler tones with slight transparency difference)\nconst AGENT_HIGHLIGHT_COLORS: Record<HighlightColor, string> = {\n yellow: 'rgba(250, 204, 21, 0.4)', // amber-400\n green: 'rgba(74, 222, 128, 0.4)', // green-400\n blue: 'rgba(96, 165, 250, 0.45)', // blue-400\n pink: 'rgba(244, 114, 182, 0.4)', // pink-400\n orange: 'rgba(251, 146, 60, 0.4)', // orange-400\n};\n\nconst AGENT_HIGHLIGHT_COLORS_SELECTED: Record<HighlightColor, string> = {\n yellow: 'rgba(250, 204, 21, 0.7)',\n green: 'rgba(74, 222, 128, 0.7)',\n blue: 'rgba(96, 165, 250, 0.75)',\n pink: 'rgba(244, 114, 182, 0.7)',\n orange: 'rgba(251, 146, 60, 0.7)',\n};\n\nexport const HighlightLayer = memo(function HighlightLayer({\n highlights,\n scale,\n selectedId,\n onHighlightClick,\n className,\n sourceFilter = 'all',\n}: HighlightLayerProps) {\n const filteredHighlights = useMemo(() => {\n if (sourceFilter === 'all') return highlights;\n return highlights.filter((h) => {\n const source = h.source ?? 'user';\n return source === sourceFilter;\n });\n }, [highlights, sourceFilter]);\n\n const renderedHighlights = useMemo(() => {\n return filteredHighlights.map((highlight) => {\n const isSelected = highlight.id === selectedId;\n const isAgentHighlight = highlight.source === 'agent';\n\n // Choose color palette based on source\n const colorPalette = isAgentHighlight\n ? (isSelected ? AGENT_HIGHLIGHT_COLORS_SELECTED : AGENT_HIGHLIGHT_COLORS)\n : (isSelected ? HIGHLIGHT_COLORS_SELECTED : HIGHLIGHT_COLORS);\n\n return (\n <div\n key={highlight.id}\n className={cn(\n 'highlight-group',\n 'cursor-pointer',\n isSelected && 'ring-2 ring-blue-500',\n isAgentHighlight && 'highlight-agent'\n )}\n onClick={() => onHighlightClick?.(highlight)}\n data-source={highlight.source ?? 'user'}\n >\n {highlight.rects.map((rect, index) => (\n <div\n key={`${highlight.id}-${index}`}\n className={cn(\n 'absolute transition-colors duration-150',\n isAgentHighlight && 'border-b-2 border-dashed border-blue-400/50'\n )}\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.width * scale,\n height: rect.height * scale,\n backgroundColor: colorPalette[highlight.color],\n mixBlendMode: 'multiply',\n }}\n />\n ))}\n {/* Agent highlight indicator */}\n {isAgentHighlight && highlight.rects[0] && (\n <div\n className=\"absolute -left-1 flex items-center justify-center w-3 h-3 bg-blue-500 rounded-full text-white\"\n style={{\n top: highlight.rects[0].y * scale,\n }}\n title=\"AI highlighted\"\n >\n <svg className=\"w-2 h-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2a2 2 0 012 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 017 7h1a1 1 0 011 1v3a1 1 0 01-1 1h-1v1a2 2 0 01-2 2H5a2 2 0 01-2-2v-1H2a1 1 0 01-1-1v-3a1 1 0 011-1h1a7 7 0 017-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 012-2z\" />\n </svg>\n </div>\n )}\n </div>\n );\n });\n }, [filteredHighlights, scale, selectedId, onHighlightClick]);\n\n return (\n <div\n className={cn(\n 'pdf-highlight-layer',\n 'absolute inset-0 pointer-events-none',\n className\n )}\n style={{ zIndex: 40 }}\n >\n <div className=\"pointer-events-auto\">{renderedHighlights}</div>\n </div>\n );\n});\n","import { memo, useCallback, useRef, MouseEvent, TouchEvent } from 'react';\nimport type { Annotation, DrawingPath } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface AnnotationLayerProps {\n pageNumber: number;\n annotations: Annotation[];\n scale: number;\n selectedId?: string | null;\n isDrawing?: boolean;\n currentDrawingPath?: DrawingPath | null;\n drawingColor?: string;\n drawingStrokeWidth?: number;\n activeAnnotationTool?: 'note' | 'draw' | 'shape' | null;\n onAnnotationClick?: (annotation: Annotation) => void;\n onNoteClick?: (annotation: Annotation, event: { x: number; y: number }) => void;\n onDrawStart?: (point: { x: number; y: number }) => void;\n onDrawMove?: (point: { x: number; y: number }) => void;\n onDrawEnd?: () => void;\n onPageClick?: (point: { x: number; y: number }) => void;\n className?: string;\n}\n\n// Convert points to SVG path data\nfunction pointsToPath(points: { x: number; y: number }[], scale: number): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const p = points[0];\n return `M ${p.x * scale} ${p.y * scale} L ${p.x * scale} ${p.y * scale}`;\n }\n\n const path = points.reduce((acc, point, index) => {\n const scaledX = point.x * scale;\n const scaledY = point.y * scale;\n if (index === 0) {\n return `M ${scaledX} ${scaledY}`;\n }\n return `${acc} L ${scaledX} ${scaledY}`;\n }, '');\n\n return path;\n}\n\n// Render a shape annotation\nfunction renderShape(\n annotation: Annotation & { type: 'shape' },\n scale: number,\n isSelected: boolean\n): React.ReactNode {\n const { shapeType, x, y, width, height, color, strokeWidth, id } = annotation;\n const scaledX = x * scale;\n const scaledY = y * scale;\n const scaledWidth = width * scale;\n const scaledHeight = height * scale;\n const scaledStroke = strokeWidth * scale;\n\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n className: cn(\n 'cursor-pointer transition-opacity',\n isSelected && 'opacity-80'\n ),\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect\n key={id}\n x={scaledX}\n y={scaledY}\n width={scaledWidth}\n height={scaledHeight}\n {...commonProps}\n />\n );\n case 'circle':\n return (\n <ellipse\n key={id}\n cx={scaledX + scaledWidth / 2}\n cy={scaledY + scaledHeight / 2}\n rx={scaledWidth / 2}\n ry={scaledHeight / 2}\n {...commonProps}\n />\n );\n case 'line':\n return (\n <line\n key={id}\n x1={scaledX}\n y1={scaledY}\n x2={scaledX + scaledWidth}\n y2={scaledY + scaledHeight}\n {...commonProps}\n />\n );\n case 'arrow':\n const endX = scaledX + scaledWidth;\n const endY = scaledY + scaledHeight;\n const angle = Math.atan2(scaledHeight, scaledWidth);\n const arrowLength = 10 * scale;\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g key={id}>\n <line\n x1={scaledX}\n y1={scaledY}\n x2={endX}\n y2={endY}\n {...commonProps}\n />\n <line\n x1={endX}\n y1={endY}\n x2={arrow1X}\n y2={arrow1Y}\n {...commonProps}\n />\n <line\n x1={endX}\n y1={endY}\n x2={arrow2X}\n y2={arrow2Y}\n {...commonProps}\n />\n </g>\n );\n default:\n return null;\n }\n}\n\nexport const AnnotationLayer = memo(function AnnotationLayer({\n pageNumber: _pageNumber,\n annotations,\n scale,\n selectedId,\n isDrawing,\n currentDrawingPath,\n drawingColor = '#ef4444',\n drawingStrokeWidth = 2,\n activeAnnotationTool,\n onAnnotationClick,\n onNoteClick,\n onDrawStart,\n onDrawMove,\n onDrawEnd,\n onPageClick,\n className,\n}: AnnotationLayerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isDrawingRef = useRef(false);\n\n // Get relative coordinates from mouse/touch event\n const getRelativePoint = useCallback((clientX: number, clientY: number): { x: number; y: number } | null => {\n if (!containerRef.current) return null;\n const rect = containerRef.current.getBoundingClientRect();\n return {\n x: (clientX - rect.left) / scale,\n y: (clientY - rect.top) / scale,\n };\n }, [scale]);\n\n const handleMouseDown = useCallback((e: MouseEvent) => {\n if (activeAnnotationTool !== 'draw') return;\n\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n isDrawingRef.current = true;\n onDrawStart?.(point);\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawStart]);\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!isDrawingRef.current || activeAnnotationTool !== 'draw') return;\n\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n onDrawMove?.(point);\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawMove]);\n\n const handleMouseUp = useCallback(() => {\n if (isDrawingRef.current) {\n isDrawingRef.current = false;\n onDrawEnd?.();\n }\n }, [onDrawEnd]);\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (activeAnnotationTool !== 'draw') return;\n\n const touch = e.touches[0];\n if (touch) {\n const point = getRelativePoint(touch.clientX, touch.clientY);\n if (point) {\n isDrawingRef.current = true;\n onDrawStart?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawStart]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n if (!isDrawingRef.current || activeAnnotationTool !== 'draw') return;\n\n const touch = e.touches[0];\n if (touch) {\n const point = getRelativePoint(touch.clientX, touch.clientY);\n if (point) {\n e.preventDefault(); // Prevent scrolling while drawing\n onDrawMove?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onDrawMove]);\n\n const handleTouchEnd = useCallback(() => {\n if (isDrawingRef.current) {\n isDrawingRef.current = false;\n onDrawEnd?.();\n }\n }, [onDrawEnd]);\n\n const handleClick = useCallback((e: MouseEvent) => {\n if (activeAnnotationTool === 'note') {\n const point = getRelativePoint(e.clientX, e.clientY);\n if (point) {\n onPageClick?.(point);\n }\n }\n }, [activeAnnotationTool, getRelativePoint, onPageClick]);\n\n // Annotations are already filtered for this page by PDFPage component\n // Separate drawings/shapes from notes\n const drawings = annotations.filter(a => a.type === 'drawing');\n const shapes = annotations.filter(a => a.type === 'shape');\n const notes = annotations.filter(a => a.type === 'note');\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'pdf-annotation-layer',\n 'absolute inset-0',\n activeAnnotationTool && 'cursor-crosshair',\n className\n )}\n style={{ zIndex: 50, pointerEvents: activeAnnotationTool ? 'auto' : 'none' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onClick={handleClick}\n >\n {/* SVG layer for drawings and shapes */}\n <svg\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{ overflow: 'visible' }}\n >\n {/* Render completed drawings */}\n {drawings.map((drawing) => {\n if (drawing.type !== 'drawing') return null;\n const isSelected = drawing.id === selectedId;\n\n return drawing.paths.map((path, pathIndex) => (\n <path\n key={`${drawing.id}-${pathIndex}`}\n d={pointsToPath(path.points, scale)}\n stroke={drawing.color}\n strokeWidth={drawing.strokeWidth * scale}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'cursor-pointer pointer-events-auto',\n isSelected && 'filter drop-shadow-md'\n )}\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(drawing);\n }}\n />\n ));\n })}\n\n {/* Render shapes */}\n {shapes.map((shape) => {\n if (shape.type !== 'shape') return null;\n const isSelected = shape.id === selectedId;\n\n return (\n <g\n key={shape.id}\n className=\"pointer-events-auto\"\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(shape);\n }}\n >\n {renderShape(shape, scale, isSelected)}\n </g>\n );\n })}\n\n {/* Render current drawing path (preview) */}\n {isDrawing && currentDrawingPath && currentDrawingPath.points.length > 0 && (\n <path\n d={pointsToPath(currentDrawingPath.points, scale)}\n stroke={drawingColor}\n strokeWidth={drawingStrokeWidth * scale}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.8}\n />\n )}\n </svg>\n\n {/* Sticky notes */}\n {notes.map((note) => {\n if (note.type !== 'note') return null;\n const isSelected = note.id === selectedId;\n\n return (\n <div\n key={note.id}\n className={cn(\n 'absolute pointer-events-auto cursor-pointer',\n 'w-6 h-6 flex items-center justify-center',\n 'rounded-sm shadow-md transition-transform hover:scale-110',\n isSelected && 'ring-2 ring-blue-500'\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onAnnotationClick?.(note);\n onNoteClick?.(note, { x: e.clientX, y: e.clientY });\n }}\n title={note.content}\n >\n <svg\n className=\"w-4 h-4 text-white\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n );\n })}\n </div>\n );\n});\n","import { useEffect, useState, memo, useCallback, useMemo } from 'react';\nimport type { PDFPageProxy } from 'pdfjs-dist';\nimport { CanvasLayer } from './CanvasLayer';\nimport { TextLayer } from './TextLayer';\nimport { HighlightLayer } from './HighlightLayer';\nimport { AnnotationLayer } from './AnnotationLayer';\nimport { useAnnotationStore } from '../../hooks';\nimport type { Highlight, Annotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface PDFPageProps {\n pageNumber: number;\n page: PDFPageProxy | null;\n scale: number;\n rotation: number;\n className?: string;\n showTextLayer?: boolean;\n showHighlightLayer?: boolean;\n showAnnotationLayer?: boolean;\n onPageLoad?: (page: PDFPageProxy) => void;\n onRenderComplete?: () => void;\n onRenderError?: (error: Error) => void;\n onAnnotationClick?: (annotation: Annotation) => void;\n onPageClick?: (pageNumber: number, point: { x: number; y: number }) => void;\n}\n\nexport const PDFPage = memo(function PDFPage({\n pageNumber,\n page,\n scale,\n rotation,\n className,\n showTextLayer = true,\n showHighlightLayer = true,\n showAnnotationLayer = true,\n onRenderComplete,\n onRenderError,\n onAnnotationClick,\n onPageClick,\n}: PDFPageProps) {\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n const [isRendering, setIsRendering] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to highlights and annotations arrays directly to trigger re-renders\n const allHighlights = useAnnotationStore((s) => s.highlights);\n const allAnnotations = useAnnotationStore((s) => s.annotations);\n const selectHighlight = useAnnotationStore((s) => s.selectHighlight);\n const selectedHighlightId = useAnnotationStore((s) => s.selectedHighlightId);\n\n // Get annotations state\n const selectAnnotation = useAnnotationStore((s) => s.selectAnnotation);\n const selectedAnnotationId = useAnnotationStore((s) => s.selectedAnnotationId);\n const activeAnnotationTool = useAnnotationStore((s) => s.activeAnnotationTool);\n const drawingColor = useAnnotationStore((s) => s.drawingColor);\n const drawingStrokeWidth = useAnnotationStore((s) => s.drawingStrokeWidth);\n const currentDrawingPath = useAnnotationStore((s) => s.currentDrawingPath);\n const currentDrawingPage = useAnnotationStore((s) => s.currentDrawingPage);\n const startDrawing = useAnnotationStore((s) => s.startDrawing);\n const addDrawingPoint = useAnnotationStore((s) => s.addDrawingPoint);\n const finishDrawing = useAnnotationStore((s) => s.finishDrawing);\n\n // Filter highlights and annotations for this page\n const highlights = useMemo(\n () => allHighlights.filter((h) => h.pageNumber === pageNumber),\n [allHighlights, pageNumber]\n );\n const annotations = useMemo(\n () => allAnnotations.filter((a) => a.pageNumber === pageNumber),\n [allAnnotations, pageNumber]\n );\n\n // Calculate dimensions when page or scale changes\n useEffect(() => {\n if (page) {\n const viewport = page.getViewport({ scale, rotation });\n setDimensions({\n width: Math.floor(viewport.width),\n height: Math.floor(viewport.height),\n });\n }\n }, [page, scale, rotation]);\n\n const handleRenderStart = useCallback(() => {\n setIsRendering(true);\n setError(null);\n }, []);\n\n const handleRenderComplete = useCallback(() => {\n setIsRendering(false);\n onRenderComplete?.();\n }, [onRenderComplete]);\n\n const handleRenderError = useCallback(\n (err: Error) => {\n setIsRendering(false);\n setError(err);\n onRenderError?.(err);\n },\n [onRenderError]\n );\n\n const handleHighlightClick = useCallback(\n (highlight: Highlight) => {\n selectHighlight(highlight.id);\n },\n [selectHighlight]\n );\n\n const handleAnnotationClick = useCallback(\n (annotation: Annotation) => {\n selectAnnotation(annotation.id);\n onAnnotationClick?.(annotation);\n },\n [selectAnnotation, onAnnotationClick]\n );\n\n const handleDrawStart = useCallback(\n (point: { x: number; y: number }) => {\n startDrawing(pageNumber, point);\n },\n [startDrawing, pageNumber]\n );\n\n const handleDrawMove = useCallback(\n (point: { x: number; y: number }) => {\n addDrawingPoint(point);\n },\n [addDrawingPoint]\n );\n\n const handleDrawEnd = useCallback(() => {\n finishDrawing();\n }, [finishDrawing]);\n\n const handlePageClick = useCallback(\n (point: { x: number; y: number }) => {\n onPageClick?.(pageNumber, point);\n },\n [onPageClick, pageNumber]\n );\n\n if (!page) {\n return (\n <div\n className={cn(\n 'pdf-page pdf-page-loading',\n 'relative bg-white shadow-lg',\n 'flex items-center justify-center',\n className\n )}\n style={{ width: 612 * scale, height: 792 * scale }}\n data-page-number={pageNumber}\n >\n <div className=\"text-gray-400\">Loading page {pageNumber}...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={cn(\n 'pdf-page pdf-page-error',\n 'relative bg-white shadow-lg',\n 'flex items-center justify-center',\n className\n )}\n style={{ width: dimensions.width, height: dimensions.height }}\n data-page-number={pageNumber}\n >\n <div className=\"text-red-500\">Failed to render page {pageNumber}</div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'pdf-page',\n 'relative bg-white shadow-lg',\n isRendering && 'pdf-page-rendering',\n className\n )}\n style={{\n width: dimensions.width,\n height: dimensions.height,\n }}\n data-page-number={pageNumber}\n >\n <CanvasLayer\n page={page}\n scale={scale}\n rotation={rotation}\n onRenderStart={handleRenderStart}\n onRenderComplete={handleRenderComplete}\n onRenderError={handleRenderError}\n />\n\n {showTextLayer && (\n <TextLayer page={page} scale={scale} rotation={rotation} />\n )}\n\n {showHighlightLayer && highlights.length > 0 && (\n <HighlightLayer\n highlights={highlights}\n scale={scale}\n selectedId={selectedHighlightId}\n onHighlightClick={handleHighlightClick}\n />\n )}\n\n {showAnnotationLayer && (\n <AnnotationLayer\n pageNumber={pageNumber}\n annotations={annotations}\n scale={scale}\n selectedId={selectedAnnotationId}\n isDrawing={currentDrawingPage === pageNumber}\n currentDrawingPath={currentDrawingPage === pageNumber ? currentDrawingPath : null}\n drawingColor={drawingColor}\n drawingStrokeWidth={drawingStrokeWidth}\n activeAnnotationTool={activeAnnotationTool}\n onAnnotationClick={handleAnnotationClick}\n onDrawStart={handleDrawStart}\n onDrawMove={handleDrawMove}\n onDrawEnd={handleDrawEnd}\n onPageClick={handlePageClick}\n />\n )}\n </div>\n );\n});\n","import { memo, useMemo } from 'react';\nimport type { FocusedRegion } from '../../types/agent-context';\nimport { cn } from '../../utils';\n\nexport interface FocusRegionLayerProps {\n focusedRegions: FocusedRegion[];\n scale: number;\n pageNumber: number;\n className?: string;\n}\n\nconst FOCUS_STYLES = {\n pulse: {\n animation: 'focus-pulse 2s ease-in-out infinite',\n border: '3px solid',\n boxShadow: '0 0 0 0 rgba(59, 130, 246, 0.7)',\n },\n glow: {\n animation: 'focus-glow 1.5s ease-in-out infinite alternate',\n border: '2px solid',\n boxShadow: '0 0 20px 5px',\n },\n border: {\n animation: 'none',\n border: '3px dashed',\n boxShadow: 'none',\n },\n};\n\nconst DEFAULT_COLORS = {\n pulse: '#3b82f6', // blue-500\n glow: '#f59e0b', // amber-500\n border: '#10b981', // emerald-500\n};\n\nexport const FocusRegionLayer = memo(function FocusRegionLayer({\n focusedRegions,\n scale,\n pageNumber,\n className,\n}: FocusRegionLayerProps) {\n // Filter regions for this page\n const pageRegions = useMemo(\n () => focusedRegions.filter((r) => r.pageNumber === pageNumber),\n [focusedRegions, pageNumber]\n );\n\n const renderedRegions = useMemo(() => {\n return pageRegions.map((region) => {\n const style = region.style ?? 'pulse';\n const color = region.color ?? DEFAULT_COLORS[style];\n const styleConfig = FOCUS_STYLES[style];\n\n return (\n <div\n key={region.id}\n className={cn(\n 'focus-region',\n 'absolute rounded-sm pointer-events-none',\n `focus-region-${style}`\n )}\n style={{\n left: region.x * scale,\n top: region.y * scale,\n width: region.width * scale,\n height: region.height * scale,\n borderColor: color,\n borderStyle: style === 'border' ? 'dashed' : 'solid',\n borderWidth: style === 'border' ? '3px' : '2px',\n boxShadow: style === 'glow' ? `0 0 20px 5px ${color}40` : undefined,\n animation: styleConfig.animation,\n }}\n data-focus-id={region.id}\n data-focus-style={style}\n />\n );\n });\n }, [pageRegions, scale]);\n\n if (pageRegions.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'pdf-focus-region-layer',\n 'absolute inset-0 pointer-events-none overflow-hidden',\n className\n )}\n style={{ zIndex: 45 }}\n >\n {renderedRegions}\n <style>{`\n @keyframes focus-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 70% {\n box-shadow: 0 0 0 10px rgba(59, 130, 246, 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);\n }\n }\n\n @keyframes focus-glow {\n 0% {\n opacity: 0.8;\n filter: brightness(1);\n }\n 100% {\n opacity: 1;\n filter: brightness(1.2);\n }\n }\n\n .focus-region-pulse {\n animation: focus-pulse 2s ease-in-out infinite;\n }\n\n .focus-region-glow {\n animation: focus-glow 1.5s ease-in-out infinite alternate;\n }\n `}</style>\n </div>\n );\n});\n","export { PDFPage, type PDFPageProps } from './PDFPage';\nexport { CanvasLayer, type CanvasLayerProps } from './CanvasLayer';\nexport { TextLayer, type TextLayerProps } from './TextLayer';\nexport { HighlightLayer, type HighlightLayerProps } from './HighlightLayer';\nexport { AnnotationLayer, type AnnotationLayerProps } from './AnnotationLayer';\nexport { FocusRegionLayer, type FocusRegionLayerProps } from './FocusRegionLayer';\n","import { memo, useEffect, useState, useCallback, useRef } from 'react';\nimport type { TextSelection, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface SelectionToolbarProps {\n /** Current text selection */\n selection: TextSelection | null;\n /** Callback when a color is clicked to create highlight */\n onCreateHighlight: (color: HighlightColor) => void;\n /** Callback when copy button is clicked */\n onCopy?: () => void;\n /** Active/default highlight color */\n activeColor?: HighlightColor;\n /** Additional class name */\n className?: string;\n}\n\ninterface ToolbarPosition {\n top: number;\n left: number;\n visible: boolean;\n}\n\nconst HIGHLIGHT_COLOR_BUTTONS: Array<{\n color: HighlightColor;\n bg: string;\n hoverBg: string;\n ringColor: string;\n}> = [\n { color: 'yellow', bg: 'bg-yellow-300', hoverBg: 'hover:bg-yellow-400', ringColor: 'ring-yellow-400' },\n { color: 'green', bg: 'bg-green-300', hoverBg: 'hover:bg-green-400', ringColor: 'ring-green-400' },\n { color: 'blue', bg: 'bg-blue-300', hoverBg: 'hover:bg-blue-400', ringColor: 'ring-blue-400' },\n { color: 'pink', bg: 'bg-pink-300', hoverBg: 'hover:bg-pink-400', ringColor: 'ring-pink-400' },\n { color: 'orange', bg: 'bg-orange-300', hoverBg: 'hover:bg-orange-400', ringColor: 'ring-orange-400' },\n];\n\nfunction calculatePosition(selection: TextSelection): ToolbarPosition {\n if (!selection || selection.rects.length === 0) {\n return { top: 0, left: 0, visible: false };\n }\n\n // Find the first rect (topmost, leftmost)\n const firstRect = selection.rects.reduce((min, rect) => {\n if (rect.top < min.top || (rect.top === min.top && rect.left < min.left)) {\n return rect;\n }\n return min;\n }, selection.rects[0]);\n\n // Position toolbar above the selection\n const top = firstRect.top - 48; // 48px above (40px toolbar height + 8px gap)\n const left = firstRect.left + firstRect.width / 2;\n\n return { top, left, visible: true };\n}\n\nexport const SelectionToolbar = memo(function SelectionToolbar({\n selection,\n onCreateHighlight,\n onCopy,\n activeColor = 'yellow',\n className,\n}: SelectionToolbarProps) {\n const [position, setPosition] = useState<ToolbarPosition>({ top: 0, left: 0, visible: false });\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n // Calculate position when selection changes\n useEffect(() => {\n if (selection && selection.text && selection.rects.length > 0) {\n const newPosition = calculatePosition(selection);\n\n // Adjust position to keep toolbar within viewport\n if (toolbarRef.current && newPosition.visible) {\n const toolbarWidth = 200; // Approximate toolbar width\n const viewportWidth = window.innerWidth;\n\n // Ensure toolbar doesn't go off left edge\n let adjustedLeft = newPosition.left - toolbarWidth / 2;\n if (adjustedLeft < 8) adjustedLeft = 8;\n\n // Ensure toolbar doesn't go off right edge\n if (adjustedLeft + toolbarWidth > viewportWidth - 8) {\n adjustedLeft = viewportWidth - toolbarWidth - 8;\n }\n\n // Ensure toolbar doesn't go above viewport\n let adjustedTop = newPosition.top;\n if (adjustedTop < 8) {\n // Position below selection instead\n const lastRect = selection.rects[selection.rects.length - 1];\n adjustedTop = lastRect.bottom + 8;\n }\n\n setPosition({\n top: adjustedTop,\n left: adjustedLeft + toolbarWidth / 2,\n visible: true,\n });\n } else {\n setPosition(newPosition);\n }\n } else {\n setPosition({ top: 0, left: 0, visible: false });\n }\n }, [selection]);\n\n const handleColorClick = useCallback(\n (color: HighlightColor) => {\n onCreateHighlight(color);\n },\n [onCreateHighlight]\n );\n\n const handleCopy = useCallback(() => {\n onCopy?.();\n }, [onCopy]);\n\n if (!position.visible || !selection?.text) {\n return null;\n }\n\n return (\n <div\n ref={toolbarRef}\n className={cn(\n 'selection-toolbar',\n 'fixed z-50',\n 'flex items-center gap-1 p-1.5',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n top: position.top,\n left: position.left,\n transform: 'translateX(-50%)',\n }}\n onMouseDown={(e) => {\n // Prevent toolbar clicks from clearing the selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {/* Highlight color buttons */}\n {HIGHLIGHT_COLOR_BUTTONS.map((btn) => (\n <button\n key={btn.color}\n onClick={() => handleColorClick(btn.color)}\n className={cn(\n 'w-7 h-7 rounded-full',\n 'flex items-center justify-center',\n 'transition-transform duration-100',\n 'hover:scale-110',\n 'focus:outline-none focus:ring-2 focus:ring-offset-1',\n btn.bg,\n btn.hoverBg,\n btn.ringColor,\n activeColor === btn.color && 'ring-2 ring-offset-1'\n )}\n title={`Highlight ${btn.color}`}\n aria-label={`Highlight with ${btn.color}`}\n >\n {/* Highlighter icon */}\n <svg className=\"w-4 h-4 text-gray-700\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\"\n />\n </svg>\n </button>\n ))}\n\n {/* Divider */}\n <div className=\"w-px h-6 bg-gray-300 dark:bg-gray-600 mx-1\" />\n\n {/* Copy button */}\n <button\n onClick={handleCopy}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n title=\"Copy text\"\n aria-label=\"Copy selected text\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n );\n});\n\nexport default SelectionToolbar;\n","export { SelectionToolbar, type SelectionToolbarProps } from './SelectionToolbar';\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport type { Highlight, HighlightColor } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface HighlightPopoverProps {\n /** The highlight to show the popover for */\n highlight: Highlight | null;\n /** The scale of the PDF page */\n scale: number;\n /** The page element containing the highlight */\n pageElement: HTMLElement | null;\n /** Callback when color is changed */\n onColorChange: (id: string, color: HighlightColor) => void;\n /** Callback when comment is updated */\n onCommentChange: (id: string, comment: string) => void;\n /** Callback when delete is clicked */\n onDelete: (id: string) => void;\n /** Callback when copy is clicked */\n onCopy?: (text: string) => void;\n /** Callback when popover is closed */\n onClose: () => void;\n /** Additional class name */\n className?: string;\n}\n\ninterface PopoverPosition {\n top: number;\n left: number;\n visible: boolean;\n}\n\nconst HIGHLIGHT_COLOR_OPTIONS: Array<{\n color: HighlightColor;\n bg: string;\n hoverBg: string;\n borderColor: string;\n}> = [\n { color: 'yellow', bg: 'bg-yellow-300', hoverBg: 'hover:bg-yellow-400', borderColor: 'border-yellow-400' },\n { color: 'green', bg: 'bg-green-300', hoverBg: 'hover:bg-green-400', borderColor: 'border-green-400' },\n { color: 'blue', bg: 'bg-blue-300', hoverBg: 'hover:bg-blue-400', borderColor: 'border-blue-400' },\n { color: 'pink', bg: 'bg-pink-300', hoverBg: 'hover:bg-pink-400', borderColor: 'border-pink-400' },\n { color: 'orange', bg: 'bg-orange-300', hoverBg: 'hover:bg-orange-400', borderColor: 'border-orange-400' },\n];\n\nfunction calculatePopoverPosition(\n highlight: Highlight,\n scale: number,\n pageElement: HTMLElement | null\n): PopoverPosition {\n if (!pageElement || !highlight.rects.length) {\n return { top: 0, left: 0, visible: false };\n }\n\n const pageRect = pageElement.getBoundingClientRect();\n\n // Find the first rect of the highlight\n const firstRect = highlight.rects[0];\n const scaledTop = firstRect.y * scale + pageRect.top;\n const scaledLeft = firstRect.x * scale + pageRect.left;\n const scaledWidth = firstRect.width * scale;\n\n // Position popover above the highlight\n const top = scaledTop - 8;\n const left = scaledLeft + scaledWidth / 2;\n\n return { top, left, visible: true };\n}\n\nexport const HighlightPopover = memo(function HighlightPopover({\n highlight,\n scale,\n pageElement,\n onColorChange,\n onCommentChange,\n onDelete,\n onCopy,\n onClose,\n className,\n}: HighlightPopoverProps) {\n const [isEditingComment, setIsEditingComment] = useState(false);\n const [comment, setComment] = useState(highlight?.comment ?? '');\n const [position, setPosition] = useState<PopoverPosition>({ top: 0, left: 0, visible: false });\n const popoverRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Update comment state when highlight changes\n useEffect(() => {\n setComment(highlight?.comment ?? '');\n setIsEditingComment(false);\n }, [highlight?.id, highlight?.comment]);\n\n // Calculate position when highlight or page element changes\n useEffect(() => {\n if (highlight && pageElement) {\n const newPosition = calculatePopoverPosition(highlight, scale, pageElement);\n\n if (newPosition.visible && popoverRef.current) {\n const popoverWidth = 280;\n const viewportWidth = window.innerWidth;\n\n let adjustedLeft = newPosition.left;\n if (adjustedLeft - popoverWidth / 2 < 8) {\n adjustedLeft = popoverWidth / 2 + 8;\n } else if (adjustedLeft + popoverWidth / 2 > viewportWidth - 8) {\n adjustedLeft = viewportWidth - popoverWidth / 2 - 8;\n }\n\n let adjustedTop = newPosition.top;\n const popoverHeight = isEditingComment ? 200 : 120;\n if (adjustedTop - popoverHeight < 8) {\n // Position below the highlight instead\n const lastRect = highlight.rects[highlight.rects.length - 1];\n adjustedTop = (lastRect.y + lastRect.height) * scale + pageElement.getBoundingClientRect().top + 8;\n }\n\n setPosition({\n top: adjustedTop,\n left: adjustedLeft,\n visible: true,\n });\n } else {\n setPosition(newPosition);\n }\n } else {\n setPosition({ top: 0, left: 0, visible: false });\n }\n }, [highlight, pageElement, scale, isEditingComment]);\n\n // Focus textarea when editing starts\n useEffect(() => {\n if (isEditingComment && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [isEditingComment]);\n\n // Close popover when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (position.visible) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [position.visible, onClose]);\n\n // Handle escape key\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n if (isEditingComment) {\n setIsEditingComment(false);\n setComment(highlight?.comment ?? '');\n } else {\n onClose();\n }\n }\n }\n\n if (position.visible) {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }\n }, [position.visible, isEditingComment, highlight?.comment, onClose]);\n\n const handleColorClick = useCallback(\n (color: HighlightColor) => {\n if (highlight) {\n onColorChange(highlight.id, color);\n }\n },\n [highlight, onColorChange]\n );\n\n const handleSaveComment = useCallback(() => {\n if (highlight) {\n onCommentChange(highlight.id, comment.trim());\n setIsEditingComment(false);\n }\n }, [highlight, comment, onCommentChange]);\n\n const handleDeleteClick = useCallback(() => {\n if (highlight) {\n onDelete(highlight.id);\n onClose();\n }\n }, [highlight, onDelete, onClose]);\n\n const handleCopyClick = useCallback(() => {\n if (highlight?.text) {\n navigator.clipboard.writeText(highlight.text);\n onCopy?.(highlight.text);\n }\n }, [highlight, onCopy]);\n\n if (!highlight || !position.visible) {\n return null;\n }\n\n return (\n <div\n ref={popoverRef}\n className={cn(\n 'highlight-popover',\n 'fixed z-50',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-xl',\n 'border border-gray-200 dark:border-gray-700',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n top: position.top,\n left: position.left,\n transform: 'translate(-50%, -100%)',\n width: 280,\n }}\n >\n {/* Color picker row */}\n <div className=\"flex items-center justify-between p-2 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center gap-1\">\n {HIGHLIGHT_COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.color}\n onClick={() => handleColorClick(opt.color)}\n className={cn(\n 'w-6 h-6 rounded-full',\n 'transition-transform duration-100',\n 'hover:scale-110',\n 'focus:outline-none',\n opt.bg,\n opt.hoverBg,\n highlight.color === opt.color && `ring-2 ring-offset-1 ${opt.borderColor}`\n )}\n title={`Change to ${opt.color}`}\n aria-label={`Change highlight color to ${opt.color}`}\n />\n ))}\n </div>\n\n {/* Delete button */}\n <button\n onClick={handleDeleteClick}\n className={cn(\n 'p-1.5 rounded-md',\n 'text-red-500 hover:text-red-600',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:outline-none focus:ring-2 focus:ring-red-500'\n )}\n title=\"Delete highlight\"\n aria-label=\"Delete highlight\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n\n {/* Comment section */}\n <div className=\"p-2\">\n {isEditingComment ? (\n <div className=\"space-y-2\">\n <textarea\n ref={textareaRef}\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n placeholder=\"Add a note...\"\n className={cn(\n 'w-full p-2 text-sm',\n 'rounded-md border border-gray-300 dark:border-gray-600',\n 'bg-white dark:bg-gray-700',\n 'text-gray-900 dark:text-gray-100',\n 'placeholder-gray-500 dark:placeholder-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n 'resize-none'\n )}\n rows={3}\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={() => {\n setIsEditingComment(false);\n setComment(highlight.comment ?? '');\n }}\n className={cn(\n 'px-3 py-1 text-sm rounded-md',\n 'text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSaveComment}\n className={cn(\n 'px-3 py-1 text-sm rounded-md',\n 'bg-blue-500 text-white',\n 'hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {/* Text preview */}\n <p className=\"text-xs text-gray-500 dark:text-gray-400 line-clamp-2\">\n &ldquo;{highlight.text.slice(0, 100)}{highlight.text.length > 100 ? '...' : ''}&rdquo;\n </p>\n\n {/* Comment display or add button */}\n {highlight.comment ? (\n <button\n onClick={() => setIsEditingComment(true)}\n className={cn(\n 'w-full text-left p-2 rounded-md',\n 'bg-gray-50 dark:bg-gray-700/50',\n 'text-sm text-gray-700 dark:text-gray-200',\n 'hover:bg-gray-100 dark:hover:bg-gray-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n {highlight.comment}\n </button>\n ) : (\n <button\n onClick={() => setIsEditingComment(true)}\n className={cn(\n 'w-full text-left p-2 rounded-md',\n 'text-sm text-gray-500 dark:text-gray-400',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n + Add a note...\n </button>\n )}\n\n {/* Copy button */}\n <button\n onClick={handleCopyClick}\n className={cn(\n 'flex items-center gap-2 w-full p-2 rounded-md',\n 'text-sm text-gray-600 dark:text-gray-300',\n 'hover:bg-gray-50 dark:hover:bg-gray-700/50',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500'\n )}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n Copy text\n </button>\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport default HighlightPopover;\n","export { HighlightPopover, type HighlightPopoverProps } from './HighlightPopover';\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface DocumentContainerProps {\n className?: string;\n /** Enable touch gestures for mobile */\n enableTouchGestures?: boolean;\n}\n\nexport const DocumentContainer = memo(function DocumentContainer({\n className,\n enableTouchGestures = true,\n}: DocumentContainerProps) {\n const {\n document,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n nextPage,\n previousPage,\n } = usePDFViewer();\n const [currentPageObj, setCurrentPageObj] = useState<PDFPageProxy | null>(null);\n const [isLoadingPage, setIsLoadingPage] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n // Text selection handling\n const { selection, clearSelection, copySelection } = useTextSelection();\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n const handleSwipeLeft = useCallback(() => {\n nextPage();\n }, [nextPage]);\n\n const handleSwipeRight = useCallback(() => {\n previousPage();\n }, [previousPage]);\n\n const handleDoubleTap = useCallback(\n (_position: { x: number; y: number }) => {\n // Toggle between 1x and 2x zoom on double tap\n const newScale = scale < 1.5 ? 2 : 1;\n setScale(newScale);\n },\n [scale, setScale]\n );\n\n // Update base scale when scale changes from other sources\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n // Set up touch gestures\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: handleSwipeLeft,\n onSwipeRight: handleSwipeRight,\n onDoubleTap: handleDoubleTap,\n enabled: enableTouchGestures && isTouchDevice,\n swipeThreshold: 50,\n doubleTapInterval: 300,\n });\n\n // Highlight management\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Clear page when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n setCurrentPageObj(null);\n }\n }, [document]);\n\n // Load the current page\n useEffect(() => {\n if (!document) {\n setCurrentPageObj(null);\n return;\n }\n\n let cancelled = false;\n\n const loadPage = async () => {\n setIsLoadingPage(true);\n\n try {\n const page = await document.getPage(currentPage);\n\n if (!cancelled && document === documentRef.current) {\n setCurrentPageObj(page);\n }\n } catch (error) {\n if (!cancelled) {\n // Silently ignore errors from document switching\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('destroyed') && !errorMessage.includes('sendWithStream')) {\n console.error('Error loading page:', error);\n }\n }\n } finally {\n if (!cancelled) {\n setIsLoadingPage(false);\n }\n }\n };\n\n loadPage();\n\n return () => {\n cancelled = true;\n };\n }, [document, currentPage]);\n\n // Get the page element for coordinate calculations\n const getPageElement = useCallback((): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${currentPage}\"]`) as HTMLElement | null;\n }, [currentPage]);\n\n // Handle creating a highlight from selection\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n\n const pageElement = getPageElement();\n if (!pageElement) return;\n\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n // Handle copying selected text\n const handleCopySelection = useCallback(() => {\n copySelection();\n }, [copySelection]);\n\n // Handle changing highlight color\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n // Handle changing highlight comment\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Handle closing the popover\n const handleClosePopover = useCallback(() => {\n selectHighlight(null);\n }, [selectHighlight]);\n\n // Combine refs for container - must be before any early returns\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n containerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Theme-based background\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n if (!document) {\n return (\n <div\n className={cn(\n 'document-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">\n No document loaded\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={setContainerRef}\n className={cn(\n 'document-container',\n 'flex-1 overflow-auto',\n 'flex flex-col items-center',\n 'p-4 gap-4',\n themeStyles[theme],\n className\n )}\n >\n {/* For single page view, show only current page */}\n <PDFPage\n pageNumber={currentPage}\n page={currentPageObj}\n scale={scale}\n rotation={rotation}\n />\n\n {/* Selection toolbar - appears when text is selected */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={handleCopySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover - appears when a highlight is clicked */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={getPageElement()}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={handleClosePopover}\n />\n\n {/* Loading indicator */}\n {isLoadingPage && !currentPageObj && (\n <div className=\"fixed bottom-4 right-4 px-3 py-2 bg-black/75 text-white text-sm rounded-lg\">\n Loading...\n </div>\n )}\n </div>\n );\n});\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface VirtualizedDocumentContainerProps {\n /** Number of pages to render above/below viewport */\n overscan?: number;\n /** Gap between pages in pixels */\n pageGap?: number;\n /** Enable touch gestures */\n enableTouchGestures?: boolean;\n className?: string;\n}\n\ninterface PageInfo {\n pageNumber: number;\n top: number;\n height: number;\n}\n\n// Default page dimensions for placeholder (US Letter)\nconst DEFAULT_PAGE_WIDTH = 612;\nconst DEFAULT_PAGE_HEIGHT = 792;\n\n/**\n * VirtualizedDocumentContainer efficiently renders only visible pages.\n *\n * Mobile optimizations:\n * - Only pages in/near viewport are rendered (virtualization)\n * - Smooth scrolling with -webkit-overflow-scrolling\n * - Touch gestures for pinch-zoom and swipe navigation\n * - Passive event listeners for scroll performance\n * - Smart page caching to avoid re-fetching\n */\nexport const VirtualizedDocumentContainer = memo(function VirtualizedDocumentContainer({\n overscan = 2,\n pageGap = 16,\n enableTouchGestures = true,\n className,\n}: VirtualizedDocumentContainerProps) {\n const {\n document,\n numPages,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n goToPage,\n nextPage,\n previousPage,\n } = usePDFViewer();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const pageCache = useRef<Map<number, PDFPageProxy>>(new Map());\n const pageDimensionsCache = useRef<Map<number, { width: number; height: number }>>(new Map());\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n const [visiblePages, setVisiblePages] = useState<number[]>([1]);\n const [pageObjects, setPageObjects] = useState<Map<number, PDFPageProxy>>(new Map());\n const [totalHeight, setTotalHeight] = useState(0);\n const [pageInfos, setPageInfos] = useState<PageInfo[]>([]);\n\n // Text selection and highlights\n const { selection, clearSelection, copySelection } = useTextSelection();\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Clear cache when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n pageCache.current.clear();\n pageDimensionsCache.current.clear();\n setPageObjects(new Map());\n }\n }, [document]);\n\n // Calculate page positions\n useEffect(() => {\n if (!document || numPages === 0) return;\n\n const calculatePageInfos = async () => {\n const infos: PageInfo[] = [];\n let currentTop = 0;\n\n for (let i = 1; i <= numPages; i++) {\n // Try to get cached dimensions or use default\n let dimensions = pageDimensionsCache.current.get(i);\n\n if (!dimensions) {\n try {\n const page = pageCache.current.get(i) || await document.getPage(i);\n if (!pageCache.current.has(i)) {\n pageCache.current.set(i, page);\n }\n const viewport = page.getViewport({ scale: 1, rotation });\n dimensions = { width: viewport.width, height: viewport.height };\n pageDimensionsCache.current.set(i, dimensions);\n } catch {\n dimensions = { width: DEFAULT_PAGE_WIDTH, height: DEFAULT_PAGE_HEIGHT };\n }\n }\n\n const scaledHeight = Math.floor(dimensions.height * scale);\n\n infos.push({\n pageNumber: i,\n top: currentTop,\n height: scaledHeight,\n });\n\n currentTop += scaledHeight + pageGap;\n }\n\n setPageInfos(infos);\n setTotalHeight(currentTop - pageGap); // Remove last gap\n };\n\n calculatePageInfos();\n }, [document, numPages, scale, rotation, pageGap]);\n\n // Update visible pages based on scroll\n const updateVisiblePages = useCallback(() => {\n if (!scrollContainerRef.current || pageInfos.length === 0) return;\n\n const container = scrollContainerRef.current;\n const scrollTop = container.scrollTop;\n const viewportHeight = container.clientHeight;\n const scrollBottom = scrollTop + viewportHeight;\n\n const visible: number[] = [];\n let firstVisiblePage = 1;\n let maxVisibleArea = 0;\n\n for (const info of pageInfos) {\n const pageTop = info.top;\n const pageBottom = info.top + info.height;\n\n // Check if page is in viewport (with overscan)\n const overscanTop = scrollTop - overscan * viewportHeight;\n const overscanBottom = scrollBottom + overscan * viewportHeight;\n\n if (pageBottom > overscanTop && pageTop < overscanBottom) {\n visible.push(info.pageNumber);\n }\n\n // Calculate which page has most visible area (for current page tracking)\n if (pageBottom > scrollTop && pageTop < scrollBottom) {\n const visibleTop = Math.max(pageTop, scrollTop);\n const visibleBottom = Math.min(pageBottom, scrollBottom);\n const visibleArea = visibleBottom - visibleTop;\n\n if (visibleArea > maxVisibleArea) {\n maxVisibleArea = visibleArea;\n firstVisiblePage = info.pageNumber;\n }\n }\n }\n\n setVisiblePages(visible);\n\n // Update current page if it changed\n if (firstVisiblePage !== currentPage) {\n goToPage(firstVisiblePage);\n }\n }, [pageInfos, overscan, currentPage, goToPage]);\n\n // Set up scroll listener with passive option for better performance\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n requestAnimationFrame(updateVisiblePages);\n };\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n updateVisiblePages(); // Initial update\n\n return () => container.removeEventListener('scroll', handleScroll);\n }, [updateVisiblePages]);\n\n // Load page objects for visible pages\n useEffect(() => {\n if (!document) return;\n\n const loadPages = async () => {\n const newPageObjects = new Map(pageObjects);\n let hasChanges = false;\n\n for (const pageNum of visiblePages) {\n if (!newPageObjects.has(pageNum)) {\n try {\n let page = pageCache.current.get(pageNum);\n if (!page) {\n page = await document.getPage(pageNum);\n pageCache.current.set(pageNum, page);\n }\n newPageObjects.set(pageNum, page);\n hasChanges = true;\n } catch (error) {\n console.error(`Error loading page ${pageNum}:`, error);\n }\n }\n }\n\n // Unload pages that are far from viewport to save memory\n const visibleSet = new Set(visiblePages);\n for (const [pageNum] of newPageObjects) {\n if (!visibleSet.has(pageNum)) {\n newPageObjects.delete(pageNum);\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n setPageObjects(newPageObjects);\n }\n };\n\n loadPages();\n }, [document, visiblePages, pageObjects]);\n\n // Scroll to page when currentPage changes externally\n useEffect(() => {\n if (!scrollContainerRef.current || pageInfos.length === 0) return;\n\n const pageInfo = pageInfos.find((p) => p.pageNumber === currentPage);\n if (pageInfo) {\n const container = scrollContainerRef.current;\n const targetScroll = pageInfo.top - pageGap;\n\n // Only scroll if not already visible\n const scrollTop = container.scrollTop;\n const viewportHeight = container.clientHeight;\n\n if (targetScroll < scrollTop || pageInfo.top + pageInfo.height > scrollTop + viewportHeight) {\n container.scrollTo({\n top: targetScroll,\n behavior: 'smooth',\n });\n }\n }\n }, [currentPage, pageInfos, pageGap]);\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: nextPage,\n onSwipeRight: previousPage,\n enabled: enableTouchGestures && isTouchDevice,\n });\n\n // Combine refs\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n scrollContainerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Highlight handlers\n const getPageElement = useCallback(\n (pageNumber: number): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n },\n []\n );\n\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n const pageElement = getPageElement(selection.pageNumber);\n if (!pageElement) return;\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Theme styles\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n if (!document) {\n return (\n <div\n className={cn(\n 'virtualized-document-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'virtualized-document-container',\n 'flex-1 relative',\n themeStyles[theme],\n className\n )}\n >\n <div\n ref={setContainerRef}\n className=\"absolute inset-0 overflow-auto\"\n style={{\n // Smooth scrolling on iOS\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {/* Scroll container with total height */}\n <div\n className=\"relative mx-auto\"\n style={{\n height: totalHeight,\n minHeight: '100%',\n }}\n >\n {/* Render visible pages */}\n {pageInfos\n .filter((info) => visiblePages.includes(info.pageNumber))\n .map((info) => {\n const page = pageObjects.get(info.pageNumber);\n const dimensions = pageDimensionsCache.current.get(info.pageNumber);\n const scaledWidth = dimensions\n ? Math.floor(dimensions.width * scale)\n : Math.floor(DEFAULT_PAGE_WIDTH * scale);\n\n return (\n <div\n key={info.pageNumber}\n className=\"absolute left-1/2 -translate-x-1/2\"\n style={{\n top: info.top,\n width: scaledWidth,\n }}\n >\n <PDFPage\n pageNumber={info.pageNumber}\n page={page || null}\n scale={scale}\n rotation={rotation}\n />\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Selection toolbar */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={copySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={selectedHighlight ? getPageElement(selectedHighlight.pageNumber) : null}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={() => selectHighlight(null)}\n />\n </div>\n );\n});\n","import { memo } from 'react';\nimport {\n VirtualizedDocumentContainer,\n type VirtualizedDocumentContainerProps,\n} from './VirtualizedDocumentContainer';\n\nexport interface ContinuousScrollContainerProps extends VirtualizedDocumentContainerProps {\n /** Scroll to page smoothly */\n smoothScroll?: boolean;\n}\n\n/**\n * ContinuousScrollContainer is a convenience wrapper around VirtualizedDocumentContainer\n * that provides continuous scrolling behavior with all pages visible in a single\n * scrollable view.\n *\n * Features:\n * - All pages rendered in a continuous scroll view\n * - Virtualized rendering for performance (only visible pages + buffer are rendered)\n * - Automatic page tracking based on scroll position\n * - Scroll-to-page functionality\n * - Memory management (unloads distant pages)\n */\nexport const ContinuousScrollContainer = memo(function ContinuousScrollContainer(\n props: ContinuousScrollContainerProps\n) {\n // ContinuousScrollContainer is essentially the same as VirtualizedDocumentContainer\n // with default settings optimized for continuous reading\n return (\n <VirtualizedDocumentContainer\n overscan={3} // Render more pages for smoother scrolling\n pageGap={16}\n {...props}\n />\n );\n});\n\n// Re-export the virtualized container for direct use\nexport { VirtualizedDocumentContainer };\n","import { memo, useEffect, useState, useRef, useCallback } from 'react';\nimport type { PDFPageProxy, PDFDocumentProxy } from 'pdfjs-dist';\nimport { PDFPage } from '../PDFPage';\nimport { usePDFViewer, useTextSelection, useTouchGestures, useIsTouchDevice } from '../../hooks';\nimport { useHighlights } from '../../hooks/useHighlights';\nimport { SelectionToolbar } from '../SelectionToolbar';\nimport { HighlightPopover } from '../HighlightPopover';\nimport { cn } from '../../utils';\nimport type { HighlightColor } from '../../types';\n\nexport interface DualPageContainerProps {\n /** Show the first page alone (like a book cover) */\n showCover?: boolean;\n /** Book spread mode: odd pages on right side */\n bookSpread?: boolean;\n /** Gap between the two pages */\n pageGap?: number;\n /** Enable touch gestures */\n enableTouchGestures?: boolean;\n className?: string;\n}\n\nexport const DualPageContainer = memo(function DualPageContainer({\n showCover = true,\n bookSpread = true,\n pageGap = 4,\n enableTouchGestures = true,\n className,\n}: DualPageContainerProps) {\n const {\n document,\n numPages,\n currentPage,\n scale,\n rotation,\n theme,\n setScale,\n goToPage,\n } = usePDFViewer();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef<PDFDocumentProxy | null>(null);\n const baseScaleRef = useRef(scale);\n const isTouchDevice = useIsTouchDevice();\n\n const [leftPage, setLeftPage] = useState<PDFPageProxy | null>(null);\n const [rightPage, setRightPage] = useState<PDFPageProxy | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // Text selection and highlights\n const { selection, clearSelection, copySelection } = useTextSelection();\n const {\n createHighlightFromSelection,\n updateHighlight,\n deleteHighlight,\n selectedHighlight,\n selectHighlight,\n activeColor,\n } = useHighlights();\n\n // Calculate which pages to show in dual view\n const getSpreadPages = useCallback(\n (page: number): { left: number | null; right: number | null } => {\n // Cover page mode: first page is shown alone on right\n if (showCover && page === 1) {\n return { left: null, right: 1 };\n }\n\n if (bookSpread) {\n // Book spread: even pages on left, odd pages on right\n // After cover: page 2 is alone on left, then 3-4, 5-6, etc.\n if (showCover) {\n if (page === 2) {\n return { left: 2, right: null };\n }\n // For pages 3 and above, pair odd with the next even\n const effectivePage = page > 2 ? page : 3;\n if (effectivePage % 2 === 1) {\n // Odd page: this is on right, previous even on left\n return {\n left: effectivePage - 1 > 1 ? effectivePage - 1 : null,\n right: effectivePage <= numPages ? effectivePage : null,\n };\n } else {\n // Even page: this is on left, next odd on right\n return {\n left: effectivePage,\n right: effectivePage + 1 <= numPages ? effectivePage + 1 : null,\n };\n }\n } else {\n // No cover: pages 1-2, 3-4, etc.\n if (page % 2 === 1) {\n return {\n left: page,\n right: page + 1 <= numPages ? page + 1 : null,\n };\n } else {\n return {\n left: page - 1,\n right: page,\n };\n }\n }\n } else {\n // Simple dual view: show current page and next\n return {\n left: page,\n right: page + 1 <= numPages ? page + 1 : null,\n };\n }\n },\n [showCover, bookSpread, numPages]\n );\n\n // Clear pages when document changes\n useEffect(() => {\n if (document !== documentRef.current) {\n documentRef.current = document;\n setLeftPage(null);\n setRightPage(null);\n }\n }, [document]);\n\n // Load pages when currentPage changes\n useEffect(() => {\n if (!document) {\n setLeftPage(null);\n setRightPage(null);\n return;\n }\n\n const spread = getSpreadPages(currentPage);\n let cancelled = false;\n\n const loadPages = async () => {\n setIsLoading(true);\n\n try {\n const [left, right] = await Promise.all([\n spread.left ? document.getPage(spread.left) : Promise.resolve(null),\n spread.right ? document.getPage(spread.right) : Promise.resolve(null),\n ]);\n\n if (!cancelled) {\n setLeftPage(left);\n setRightPage(right);\n }\n } catch (error) {\n if (!cancelled) {\n console.error('Error loading pages:', error);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadPages();\n\n return () => {\n cancelled = true;\n };\n }, [document, currentPage, getSpreadPages]);\n\n // Navigate by spread\n const goToPreviousSpread = useCallback(() => {\n const spread = getSpreadPages(currentPage);\n const leftmostPage = spread.left || spread.right || currentPage;\n\n if (showCover && leftmostPage === 2) {\n goToPage(1);\n } else if (showCover && leftmostPage <= 3) {\n goToPage(2);\n } else {\n const newPage = Math.max(1, leftmostPage - 2);\n goToPage(newPage);\n }\n }, [currentPage, showCover, getSpreadPages, goToPage]);\n\n const goToNextSpread = useCallback(() => {\n const spread = getSpreadPages(currentPage);\n const rightmostPage = spread.right || spread.left || currentPage;\n\n if (rightmostPage < numPages) {\n goToPage(Math.min(numPages, rightmostPage + 1));\n }\n }, [currentPage, numPages, getSpreadPages, goToPage]);\n\n // Touch gesture handlers\n const handlePinchZoom = useCallback(\n (pinchScale: number) => {\n const newScale = Math.max(0.25, Math.min(4, baseScaleRef.current * pinchScale));\n setScale(newScale);\n },\n [setScale]\n );\n\n useEffect(() => {\n baseScaleRef.current = scale;\n }, [scale]);\n\n const { ref: touchRef } = useTouchGestures<HTMLDivElement>({\n onPinchZoom: handlePinchZoom,\n onSwipeLeft: goToNextSpread,\n onSwipeRight: goToPreviousSpread,\n enabled: enableTouchGestures && isTouchDevice,\n });\n\n // Combine refs\n const setContainerRef = useCallback(\n (element: HTMLDivElement | null) => {\n containerRef.current = element;\n touchRef(element);\n },\n [touchRef]\n );\n\n // Highlight handlers\n const getPageElement = useCallback(\n (pageNumber: number): HTMLElement | null => {\n return containerRef.current?.querySelector(`[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n },\n []\n );\n\n const handleCreateHighlight = useCallback(\n (color: HighlightColor) => {\n if (!selection) return;\n const pageElement = getPageElement(selection.pageNumber);\n if (!pageElement) return;\n createHighlightFromSelection(selection, pageElement, scale, color);\n clearSelection();\n },\n [selection, getPageElement, createHighlightFromSelection, scale, clearSelection]\n );\n\n const handleColorChange = useCallback(\n (id: string, color: HighlightColor) => {\n updateHighlight(id, { color });\n },\n [updateHighlight]\n );\n\n const handleCommentChange = useCallback(\n (id: string, comment: string) => {\n updateHighlight(id, { comment: comment || undefined });\n },\n [updateHighlight]\n );\n\n // Theme styles\n const themeStyles = {\n light: 'bg-gray-100',\n dark: 'bg-gray-900',\n sepia: 'bg-amber-50',\n };\n\n const spread = getSpreadPages(currentPage);\n\n if (!document) {\n return (\n <div\n className={cn(\n 'dual-page-container',\n 'flex-1 flex items-center justify-center',\n themeStyles[theme],\n className\n )}\n >\n <div className=\"text-gray-500 dark:text-gray-400\">No document loaded</div>\n </div>\n );\n }\n\n return (\n <div\n ref={setContainerRef}\n className={cn(\n 'dual-page-container',\n 'flex-1 overflow-auto',\n 'flex items-center justify-center',\n 'p-4',\n themeStyles[theme],\n className\n )}\n >\n {/* Page spread */}\n <div\n className=\"flex items-center\"\n style={{ gap: pageGap }}\n >\n {/* Left page */}\n {spread.left && (\n <PDFPage\n pageNumber={spread.left}\n page={leftPage}\n scale={scale}\n rotation={rotation}\n />\n )}\n\n {/* Center divider for book spread effect */}\n {spread.left && spread.right && (\n <div\n className=\"w-px h-full bg-gray-300 dark:bg-gray-600 opacity-50\"\n style={{ minHeight: '100%' }}\n />\n )}\n\n {/* Right page */}\n {spread.right && (\n <PDFPage\n pageNumber={spread.right}\n page={rightPage}\n scale={scale}\n rotation={rotation}\n />\n )}\n\n {/* Placeholder for single page spread */}\n {(!spread.left || !spread.right) && (\n <div\n className=\"flex items-center justify-center\"\n style={{\n width: spread.left ? 0 : 612 * scale,\n height: spread.right ? 792 * scale : 0,\n }}\n />\n )}\n </div>\n\n {/* Selection toolbar */}\n <SelectionToolbar\n selection={selection}\n onCreateHighlight={handleCreateHighlight}\n onCopy={copySelection}\n activeColor={activeColor}\n />\n\n {/* Highlight popover */}\n <HighlightPopover\n highlight={selectedHighlight}\n scale={scale}\n pageElement={selectedHighlight ? getPageElement(selectedHighlight.pageNumber) : null}\n onColorChange={handleColorChange}\n onCommentChange={handleCommentChange}\n onDelete={deleteHighlight}\n onClose={() => selectHighlight(null)}\n />\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"fixed bottom-4 right-4 px-3 py-2 bg-black/75 text-white text-sm rounded-lg\">\n Loading...\n </div>\n )}\n </div>\n );\n});\n","import { useEffect, useCallback, memo, useRef, useState } from 'react';\nimport { PDFViewerProvider, usePDFViewerStores, useViewerStore } from '../../hooks';\nimport { loadDocument } from '../../utils';\nimport { Toolbar } from '../Toolbar';\nimport { Sidebar } from '../Sidebar';\nimport { AnnotationToolbar } from '../AnnotationToolbar';\nimport { DocumentContainer } from './DocumentContainer';\nimport { ContinuousScrollContainer } from './ContinuousScrollContainer';\nimport { DualPageContainer } from './DualPageContainer';\nimport { cn } from '../../utils';\nimport type { PDFViewerProps } from '../../types';\n\ninterface PDFViewerInnerProps extends PDFViewerProps {}\n\n/**\n * Generate a stable identifier for the src prop.\n * For strings (URLs), use the string itself.\n * For ArrayBuffer/Uint8Array, use a hash of the byte length and first/last bytes.\n */\nfunction getSrcIdentifier(src: string | ArrayBuffer | Uint8Array): string {\n if (typeof src === 'string') {\n return src;\n }\n\n // For binary data, create a simple identifier based on content\n const data = src instanceof ArrayBuffer ? new Uint8Array(src) : src;\n const len = data.byteLength;\n\n if (len === 0) return 'empty';\n\n // Use length + first 4 bytes + last 4 bytes as identifier\n const first = Array.from(data.slice(0, 4))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n const last = Array.from(data.slice(-4))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `binary:${len}:${first}:${last}`;\n}\n\nconst PDFViewerInner = memo(function PDFViewerInner({\n src,\n initialPage = 1,\n initialScale = 1,\n showToolbar = true,\n showSidebar = true,\n showAnnotationToolbar = false,\n viewMode = 'single',\n onDocumentLoad,\n onPageChange,\n onScaleChange,\n onError,\n workerSrc,\n className,\n}: PDFViewerInnerProps) {\n const { viewerStore } = usePDFViewerStores();\n\n // Track mount state to prevent updates after unmount\n const mountedRef = useRef(true);\n\n // Track loading state (used to trigger re-render on retry)\n const [, setLoadState] = useState<'idle' | 'loading' | 'loaded' | 'error'>('idle');\n\n // Store callbacks in refs to avoid re-triggering effects\n const onDocumentLoadRef = useRef(onDocumentLoad);\n const onErrorRef = useRef(onError);\n const onPageChangeRef = useRef(onPageChange);\n const onScaleChangeRef = useRef(onScaleChange);\n\n // Keep refs updated\n onDocumentLoadRef.current = onDocumentLoad;\n onErrorRef.current = onError;\n onPageChangeRef.current = onPageChange;\n onScaleChangeRef.current = onScaleChange;\n\n // Track current src identifier to detect changes\n const srcIdRef = useRef<string | null>(null);\n\n const currentPage = useViewerStore((s) => s.currentPage);\n const scale = useViewerStore((s) => s.scale);\n const theme = useViewerStore((s) => s.theme);\n const isLoading = useViewerStore((s) => s.isLoading);\n const error = useViewerStore((s) => s.error);\n const sidebarOpen = useViewerStore((s) => s.sidebarOpen);\n\n // Compute stable src identifier\n const srcId = getSrcIdentifier(src);\n\n // Retry handler for error state\n const handleRetry = useCallback(() => {\n srcIdRef.current = null;\n viewerStore.getState().setError(null);\n setLoadState('idle');\n }, [viewerStore]);\n\n // Set mounted ref\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Load document on mount or when src changes\n useEffect(() => {\n // Skip if src hasn't changed\n if (srcIdRef.current === srcId && viewerStore.getState().document) {\n return;\n }\n\n // Track this load operation\n const loadId = srcId;\n srcIdRef.current = srcId;\n\n // Reset the current document before loading new one\n const currentDoc = viewerStore.getState().document;\n if (currentDoc) {\n currentDoc.destroy();\n viewerStore.getState().setDocument(null);\n }\n\n const loadDoc = async () => {\n if (!mountedRef.current) return;\n\n try {\n viewerStore.getState().setLoading(true);\n viewerStore.getState().setError(null);\n setLoadState('loading');\n\n const { document, numPages } = await loadDocument({\n src,\n workerSrc,\n });\n\n // Only update if this is still the current load and component is mounted\n if (mountedRef.current && srcIdRef.current === loadId) {\n viewerStore.getState().setDocument(document);\n setLoadState('loaded');\n\n // Set initial page and scale\n if (initialPage !== 1) {\n viewerStore.getState().goToPage(initialPage);\n }\n\n if (typeof initialScale === 'number' && initialScale !== 1) {\n viewerStore.getState().setScale(initialScale);\n }\n\n onDocumentLoadRef.current?.({ document, numPages });\n } else {\n // Load was superseded or component unmounted, destroy the document\n document.destroy();\n }\n } catch (err) {\n if (mountedRef.current && srcIdRef.current === loadId) {\n const error = err instanceof Error ? err : new Error('Failed to load document');\n viewerStore.getState().setError(error);\n viewerStore.getState().setLoading(false);\n setLoadState('error');\n onErrorRef.current?.(error);\n }\n }\n };\n\n loadDoc();\n\n // Cleanup: mark this load as superseded (but don't call reset)\n return () => {\n // If srcIdRef changed, this load is superseded\n // Don't destroy anything here - the new load will handle it\n };\n }, [srcId, src, workerSrc, initialPage, initialScale, viewerStore]);\n\n // Notify parent of page changes\n const prevPageRef = useRef(currentPage);\n useEffect(() => {\n if (prevPageRef.current !== currentPage) {\n prevPageRef.current = currentPage;\n onPageChangeRef.current?.(currentPage);\n }\n }, [currentPage]);\n\n // Notify parent of scale changes\n const prevScaleRef = useRef(scale);\n useEffect(() => {\n if (prevScaleRef.current !== scale) {\n prevScaleRef.current = scale;\n onScaleChangeRef.current?.(scale);\n }\n }, [scale]);\n\n // Theme class\n const themeClass = theme === 'dark' ? 'dark' : '';\n\n if (error) {\n return (\n <div\n className={cn(\n 'pdf-viewer pdf-viewer-error',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n themeClass,\n className\n )}\n >\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center p-8\">\n <div className=\"text-red-500 text-lg font-semibold mb-2\">\n Failed to load PDF\n </div>\n <div className=\"text-gray-500 text-sm\">{error.message}</div>\n <button\n onClick={handleRetry}\n className=\"mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600\"\n >\n Retry\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Render the appropriate container based on view mode\n const renderContainer = () => {\n switch (viewMode) {\n case 'continuous':\n return <ContinuousScrollContainer />;\n case 'dual':\n return <DualPageContainer />;\n case 'single':\n default:\n return <DocumentContainer />;\n }\n };\n\n return (\n <div\n className={cn(\n 'pdf-viewer',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n 'text-gray-900 dark:text-gray-100',\n themeClass,\n className\n )}\n >\n {showToolbar && <Toolbar />}\n {showAnnotationToolbar && <AnnotationToolbar />}\n\n <div className=\"flex flex-1 overflow-hidden\">\n {showSidebar && sidebarOpen && <Sidebar />}\n {renderContainer()}\n </div>\n\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-900/80\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <div className=\"mt-2 text-sm text-gray-500\">Loading PDF...</div>\n </div>\n </div>\n )}\n </div>\n );\n});\n\n/**\n * SSR-safe PDF Viewer component.\n * Wraps the inner viewer with the context provider.\n */\nexport const PDFViewerClient = memo(function PDFViewerClient(props: PDFViewerProps) {\n return (\n <PDFViewerProvider\n theme={props.theme}\n defaultSidebarPanel={props.defaultSidebarPanel}\n >\n <PDFViewerInner {...props} />\n </PDFViewerProvider>\n );\n});\n","import { lazy, Suspense, memo } from 'react';\nimport type { PDFViewerProps } from '../../types';\nimport { cn } from '../../utils';\n\n// Lazy load the client component to ensure it's only loaded on the client\nconst PDFViewerClient = lazy(() =>\n import('./PDFViewerClient').then((mod) => ({ default: mod.PDFViewerClient }))\n);\n\ninterface PDFViewerLoadingProps {\n className?: string;\n}\n\nconst PDFViewerLoading = memo(function PDFViewerLoading({\n className,\n}: PDFViewerLoadingProps) {\n return (\n <div\n className={cn(\n 'pdf-viewer pdf-viewer-loading',\n 'flex flex-col h-full',\n 'bg-white dark:bg-gray-900',\n className\n )}\n >\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n <div className=\"mt-2 text-sm text-gray-500\">Loading PDF viewer...</div>\n </div>\n </div>\n </div>\n );\n});\n\n/**\n * Main PDF Viewer component.\n *\n * This component is SSR-safe and will only render on the client side.\n * It uses React.lazy and Suspense to defer loading of the PDF viewer\n * which depends on browser APIs.\n *\n * @example\n * ```tsx\n * import { PDFViewer } from '@pdf-reader/core';\n *\n * function App() {\n * return (\n * <PDFViewer\n * src=\"/document.pdf\"\n * showToolbar\n * showSidebar\n * onDocumentLoad={(doc) => console.log('Loaded', doc.numPages, 'pages')}\n * />\n * );\n * }\n * ```\n */\nexport const PDFViewer = memo(function PDFViewer(props: PDFViewerProps) {\n // Check if we're on the server\n if (typeof window === 'undefined') {\n return <PDFViewerLoading className={props.className} />;\n }\n\n return (\n <Suspense fallback={<PDFViewerLoading className={props.className} />}>\n <PDFViewerClient {...props} />\n </Suspense>\n );\n});\n","export { PDFViewer } from './PDFViewer';\nexport { PDFViewerClient } from './PDFViewerClient';\nexport { DocumentContainer, type DocumentContainerProps } from './DocumentContainer';\nexport { VirtualizedDocumentContainer, type VirtualizedDocumentContainerProps } from './VirtualizedDocumentContainer';\nexport { ContinuousScrollContainer, type ContinuousScrollContainerProps } from './ContinuousScrollContainer';\nexport { DualPageContainer, type DualPageContainerProps } from './DualPageContainer';\n","// Components\nexport {\n // PDF Viewer\n PDFViewer,\n PDFViewerClient,\n DocumentContainer,\n VirtualizedDocumentContainer,\n ContinuousScrollContainer,\n DualPageContainer,\n // PDF Page\n PDFPage,\n CanvasLayer,\n TextLayer,\n HighlightLayer,\n AnnotationLayer,\n FocusRegionLayer,\n // Toolbar\n Toolbar,\n MobileToolbar,\n // Sidebar\n Sidebar,\n MobileSidebar,\n ThumbnailPanel,\n SearchPanel,\n OutlinePanel,\n HighlightsPanel,\n BookmarksPanel,\n TakeawaysPanel,\n // Popovers\n SelectionToolbar,\n HighlightPopover,\n // Annotations\n AnnotationToolbar,\n StickyNote,\n DrawingCanvas,\n ShapeRenderer,\n ShapePreview,\n QuickNoteButton,\n QuickNotePopover,\n // Ask About\n AskAboutOverlay,\n AskAboutTrigger,\n // Minimap\n Minimap,\n // Error Boundary\n PDFErrorBoundary,\n withErrorBoundary,\n} from './components';\n\n// Hooks\nexport {\n PDFViewerProvider,\n PDFViewerContext,\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\n useAgentStore,\n useStudentStore,\n usePDFViewerStores,\n usePDFViewer,\n usePageNavigation,\n useZoom,\n useTextSelection,\n useHighlights,\n useAnnotations,\n useTouchGestures,\n useIsTouchDevice,\n useIsMobile,\n usePlugins,\n // Student Learning Hooks\n useAgentContext,\n useAskAbout,\n useBookmarks,\n useQuickNotes,\n useStudentProgress,\n} from './hooks';\n\n// Stores\nexport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\n createAgentStore,\n createStudentStore,\n} from './store';\n\n// Plugins\nexport {\n PluginManager,\n getPluginManager,\n createPluginManager,\n} from './plugins';\n\n// Utils\nexport {\n cn,\n initializePDFJS,\n isPDFJSInitialized,\n loadDocument,\n getPage,\n getPageTextContent,\n getOutline,\n getMetadata,\n pdfjsLib,\n // Highlight storage\n saveHighlights,\n loadHighlights,\n clearHighlights,\n getAllDocumentIds,\n exportHighlightsAsJSON,\n importHighlightsFromJSON,\n exportHighlightsAsMarkdown,\n generateDocumentId,\n // Convenience API\n createPDFViewer,\n quickViewer,\n // Student Learning Utils\n exportAnnotationsAsMarkdown,\n exportAnnotationsAsJSON,\n downloadAnnotationsAsMarkdown,\n downloadAnnotationsAsJSON,\n downloadFile,\n // Student Storage\n saveStudentData,\n loadStudentData,\n clearStudentData,\n getAllStudentDataDocumentIds,\n getStorageStats,\n // Agent API\n createAgentAPI,\n} from './utils';\n\n// Types\nexport type {\n // Core types\n PDFViewerProps,\n PDFDocumentLoadedEvent,\n TextSelection,\n PDFPageState,\n PageDimensions,\n\n // Viewer types\n ViewerState,\n ViewerActions,\n ViewMode,\n ScrollMode,\n Theme,\n SidebarPanel,\n\n // Highlight types\n Highlight,\n HighlightRect,\n HighlightColor,\n\n // Annotation types\n Annotation,\n AnnotationType,\n NoteAnnotation,\n DrawingAnnotation,\n DrawingPath,\n ShapeAnnotation,\n\n // Search types\n SearchResult,\n SearchState,\n\n // Outline types\n OutlineItem,\n\n // Plugin types\n Plugin,\n PluginAPI,\n ToolbarItem,\n SidebarPanelConfig,\n ContextMenuItem,\n PDFViewerEventMap,\n\n // Agent & Student Learning types\n AgentContext,\n AskAboutContext,\n PDFRegion,\n FocusedRegion,\n Bookmark,\n QuickNote,\n Takeaway,\n AgentHighlightParams,\n AgentAPI,\n StudentState,\n StudentActions,\n AgentState,\n AgentActions,\n StudentModeCallbacks,\n StudentModeProps,\n} from './types';\n\n// Store types\nexport type {\n ViewerStore,\n ViewerStoreApi,\n AnnotationStore,\n AnnotationStoreApi,\n AnnotationState,\n AnnotationActions,\n AnnotationTool,\n ShapeType,\n SearchStore,\n SearchStoreApi,\n SearchActions,\n AgentStore,\n AgentStoreApi,\n StudentStore,\n StudentStoreApi,\n} from './store';\n\n// Hook types\nexport type {\n PDFViewerProviderProps,\n PDFViewerContextValue,\n UsePageNavigationOptions,\n UseZoomOptions,\n UseTextSelectionOptions,\n UseHighlightsOptions,\n UseHighlightsReturn,\n UseAnnotationsOptions,\n UseAnnotationsReturn,\n UseTouchGesturesOptions,\n UsePluginsOptions,\n UsePluginsReturn,\n UseAgentContextOptions,\n UseAgentContextReturn,\n UseAskAboutOptions,\n UseAskAboutReturn,\n UseBookmarksOptions,\n UseBookmarksReturn,\n UseQuickNotesOptions,\n UseQuickNotesReturn,\n UseStudentProgressOptions,\n UseStudentProgressReturn,\n} from './hooks';\n\n// Component types\nexport type {\n PDFPageProps,\n CanvasLayerProps,\n TextLayerProps,\n HighlightLayerProps,\n AnnotationLayerProps,\n FocusRegionLayerProps,\n ToolbarProps,\n MobileToolbarProps,\n SidebarProps,\n MobileSidebarProps,\n ThumbnailPanelProps,\n SearchPanelProps,\n OutlinePanelProps,\n HighlightsPanelProps,\n BookmarksPanelProps,\n TakeawaysPanelProps,\n DocumentContainerProps,\n VirtualizedDocumentContainerProps,\n ContinuousScrollContainerProps,\n DualPageContainerProps,\n SelectionToolbarProps,\n HighlightPopoverProps,\n AnnotationToolbarProps,\n StickyNoteProps,\n DrawingCanvasProps,\n ShapeRendererProps,\n ShapePreviewProps,\n QuickNoteButtonProps,\n QuickNotePopoverProps,\n AskAboutOverlayProps,\n AskAboutTriggerProps,\n MinimapProps,\n PDFErrorBoundaryProps,\n WithErrorBoundaryProps,\n} from './components';\n\n// Plugin types\nexport type { PluginManagerOptions } from './plugins';\n\n// Utils types\nexport type {\n LoadDocumentOptions,\n LoadDocumentResult,\n PDFViewerController,\n PDFViewerControllerOptions,\n ExportData,\n StoredStudentData,\n StudentData,\n AgentAPIStores,\n AgentAPIInstance,\n} from './utils';\n","export {\n PDFViewer,\n PDFViewerClient,\n DocumentContainer,\n VirtualizedDocumentContainer,\n ContinuousScrollContainer,\n DualPageContainer,\n} from './PDFViewer';\nexport { PDFPage, CanvasLayer, TextLayer, HighlightLayer, AnnotationLayer, FocusRegionLayer } from './PDFPage';\nexport { Toolbar, MobileToolbar } from './Toolbar';\nexport { Sidebar, MobileSidebar, ThumbnailPanel, SearchPanel, OutlinePanel, HighlightsPanel, BookmarksPanel, TakeawaysPanel } from './Sidebar';\nexport { SelectionToolbar } from './SelectionToolbar';\nexport { HighlightPopover } from './HighlightPopover';\nexport { AnnotationToolbar } from './AnnotationToolbar';\nexport { StickyNote, DrawingCanvas, ShapeRenderer, ShapePreview, QuickNoteButton, QuickNotePopover } from './Annotations';\nexport { AskAboutOverlay, AskAboutTrigger } from './AskAbout';\nexport { Minimap } from './Minimap';\nexport { PDFErrorBoundary, withErrorBoundary } from './ErrorBoundary';\n\n// Re-export types\nexport type { PDFPageProps, CanvasLayerProps, TextLayerProps, HighlightLayerProps, AnnotationLayerProps, FocusRegionLayerProps } from './PDFPage';\nexport type { ToolbarProps, MobileToolbarProps } from './Toolbar';\nexport type { SidebarProps, MobileSidebarProps, ThumbnailPanelProps, SearchPanelProps, OutlinePanelProps, HighlightsPanelProps, BookmarksPanelProps, TakeawaysPanelProps } from './Sidebar';\nexport type {\n DocumentContainerProps,\n VirtualizedDocumentContainerProps,\n ContinuousScrollContainerProps,\n DualPageContainerProps,\n} from './PDFViewer';\nexport type { SelectionToolbarProps } from './SelectionToolbar';\nexport type { HighlightPopoverProps } from './HighlightPopover';\nexport type { AnnotationToolbarProps } from './AnnotationToolbar';\nexport type { StickyNoteProps, DrawingCanvasProps, ShapeRendererProps, ShapePreviewProps, QuickNoteButtonProps, QuickNotePopoverProps } from './Annotations';\nexport type { AskAboutOverlayProps, AskAboutTriggerProps } from './AskAbout';\nexport type { MinimapProps } from './Minimap';\nexport type { PDFErrorBoundaryProps, WithErrorBoundaryProps } from './ErrorBoundary';\n","import { memo, useState, useRef, useEffect, useCallback, KeyboardEvent } from 'react';\nimport type { NoteAnnotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface StickyNoteProps {\n note: NoteAnnotation;\n scale: number;\n isSelected?: boolean;\n isEditing?: boolean;\n onSelect?: () => void;\n onUpdate?: (updates: Partial<NoteAnnotation>) => void;\n onDelete?: () => void;\n onStartEdit?: () => void;\n onEndEdit?: () => void;\n onDragStart?: (e: React.MouseEvent | React.TouchEvent) => void;\n className?: string;\n}\n\nconst NOTE_COLORS = [\n '#fef08a', // yellow\n '#bbf7d0', // green\n '#bfdbfe', // blue\n '#fbcfe8', // pink\n '#fed7aa', // orange\n];\n\nexport const StickyNote = memo(function StickyNote({\n note,\n scale,\n isSelected,\n isEditing,\n onSelect,\n onUpdate,\n onDelete,\n onStartEdit,\n onEndEdit,\n onDragStart,\n className,\n}: StickyNoteProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [localContent, setLocalContent] = useState(note.content);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const noteRef = useRef<HTMLDivElement>(null);\n\n // Update local content when note changes\n useEffect(() => {\n setLocalContent(note.content);\n }, [note.content]);\n\n // Focus textarea when editing starts\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n }\n }, [isEditing]);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n onSelect?.();\n if (!isExpanded) {\n setIsExpanded(true);\n }\n }, [isExpanded, onSelect]);\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n onStartEdit?.();\n }, [onStartEdit]);\n\n const handleBlur = useCallback(() => {\n if (isEditing && localContent !== note.content) {\n onUpdate?.({ content: localContent });\n }\n onEndEdit?.();\n }, [isEditing, localContent, note.content, onUpdate, onEndEdit]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n setLocalContent(note.content);\n onEndEdit?.();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleBlur();\n }\n }, [note.content, onEndEdit, handleBlur]);\n\n const handleColorChange = useCallback((color: string) => {\n onUpdate?.({ color });\n }, [onUpdate]);\n\n const handleCollapse = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsExpanded(false);\n onEndEdit?.();\n }, [onEndEdit]);\n\n // Collapsed note icon\n if (!isExpanded) {\n return (\n <div\n ref={noteRef}\n className={cn(\n 'absolute cursor-pointer transition-transform hover:scale-110',\n 'w-6 h-6 rounded-sm shadow-md',\n 'flex items-center justify-center',\n isSelected && 'ring-2 ring-blue-500 ring-offset-1',\n className\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n zIndex: isSelected ? 60 : 55,\n }}\n onClick={handleClick}\n onMouseDown={onDragStart}\n onTouchStart={onDragStart}\n title={note.content || 'Empty note'}\n >\n <svg\n className=\"w-4 h-4 opacity-70\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n style={{ color: '#333' }}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n );\n }\n\n // Expanded note\n return (\n <div\n ref={noteRef}\n className={cn(\n 'absolute rounded shadow-lg transition-shadow',\n 'min-w-[180px] max-w-[280px]',\n isSelected && 'ring-2 ring-blue-500',\n className\n )}\n style={{\n left: note.x * scale,\n top: note.y * scale,\n backgroundColor: note.color,\n zIndex: isSelected ? 60 : 55,\n }}\n onClick={handleClick}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-2 py-1 border-b border-black/10 cursor-move\"\n onMouseDown={onDragStart}\n onTouchStart={onDragStart}\n >\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {NOTE_COLORS.map((color) => (\n <button\n key={color}\n className={cn(\n 'w-4 h-4 rounded-full border border-black/20',\n 'hover:scale-110 transition-transform',\n note.color === color && 'ring-1 ring-black/30'\n )}\n style={{ backgroundColor: color }}\n onClick={(e) => {\n e.stopPropagation();\n handleColorChange(color);\n }}\n title={`Change to ${color}`}\n />\n ))}\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-1\">\n <button\n className=\"p-0.5 hover:bg-black/10 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n title=\"Delete note\"\n >\n <svg className=\"w-3.5 h-3.5 text-gray-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n <button\n className=\"p-0.5 hover:bg-black/10 rounded\"\n onClick={handleCollapse}\n title=\"Collapse note\"\n >\n <svg className=\"w-3.5 h-3.5 text-gray-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-2\">\n {isEditing ? (\n <textarea\n ref={textareaRef}\n className={cn(\n 'w-full min-h-[60px] resize-none bg-transparent',\n 'text-sm text-gray-800 placeholder-gray-500',\n 'border-none outline-none focus:ring-0'\n )}\n value={localContent}\n onChange={(e) => setLocalContent(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter note...\"\n />\n ) : (\n <div\n className={cn(\n 'text-sm text-gray-800 whitespace-pre-wrap min-h-[40px]',\n !note.content && 'text-gray-500 italic'\n )}\n onDoubleClick={handleDoubleClick}\n >\n {note.content || 'Double-click to edit...'}\n </div>\n )}\n </div>\n\n {/* Timestamp */}\n <div className=\"px-2 pb-1 text-[10px] text-gray-500\">\n {new Date(note.updatedAt).toLocaleDateString()}\n </div>\n </div>\n );\n});\n","import { memo, useRef, useCallback, useState } from 'react';\nimport type { DrawingPath } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface DrawingCanvasProps {\n width: number;\n height: number;\n scale: number;\n color?: string;\n strokeWidth?: number;\n isActive?: boolean;\n onDrawingComplete?: (path: DrawingPath) => void;\n className?: string;\n}\n\n// Convert points to SVG path string\nfunction pointsToSvgPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const p = points[0];\n return `M ${p.x} ${p.y} L ${p.x} ${p.y}`;\n }\n\n // Use quadratic bezier curves for smoother lines\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 1; i < points.length - 1; i++) {\n const p1 = points[i];\n const p2 = points[i + 1];\n\n // Calculate control point as midpoint\n const midX = (p1.x + p2.x) / 2;\n const midY = (p1.y + p2.y) / 2;\n\n // Quadratic curve to the midpoint using p1 as control point\n path += ` Q ${p1.x} ${p1.y} ${midX} ${midY}`;\n }\n\n // Line to the last point\n if (points.length > 1) {\n const lastPoint = points[points.length - 1];\n path += ` L ${lastPoint.x} ${lastPoint.y}`;\n }\n\n return path;\n}\n\n// Simplify path by removing redundant points\nfunction simplifyPath(\n points: { x: number; y: number }[],\n tolerance: number = 1\n): { x: number; y: number }[] {\n if (points.length < 3) return points;\n\n const result: { x: number; y: number }[] = [points[0]];\n let lastAdded = points[0];\n\n for (let i = 1; i < points.length - 1; i++) {\n const point = points[i];\n const dx = point.x - lastAdded.x;\n const dy = point.y - lastAdded.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist >= tolerance) {\n result.push(point);\n lastAdded = point;\n }\n }\n\n // Always add the last point\n result.push(points[points.length - 1]);\n return result;\n}\n\nexport const DrawingCanvas = memo(function DrawingCanvas({\n width,\n height,\n scale,\n color = '#ef4444',\n strokeWidth = 2,\n isActive = false,\n onDrawingComplete,\n className,\n}: DrawingCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [currentPath, setCurrentPath] = useState<{ x: number; y: number }[]>([]);\n\n const getPoint = useCallback((e: React.MouseEvent | React.TouchEvent): { x: number; y: number } | null => {\n if (!svgRef.current) return null;\n\n const svg = svgRef.current;\n const rect = svg.getBoundingClientRect();\n\n let clientX: number;\n let clientY: number;\n\n if ('touches' in e) {\n const touch = e.touches[0];\n if (!touch) return null;\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n clientX = e.clientX;\n clientY = e.clientY;\n }\n\n return {\n x: (clientX - rect.left) / scale,\n y: (clientY - rect.top) / scale,\n };\n }, [scale]);\n\n const handleStart = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isActive) return;\n\n const point = getPoint(e);\n if (point) {\n setIsDrawing(true);\n setCurrentPath([point]);\n }\n }, [isActive, getPoint]);\n\n const handleMove = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isDrawing || !isActive) return;\n\n const point = getPoint(e);\n if (point) {\n setCurrentPath(prev => [...prev, point]);\n }\n }, [isDrawing, isActive, getPoint]);\n\n const handleEnd = useCallback(() => {\n if (!isDrawing) return;\n\n setIsDrawing(false);\n\n if (currentPath.length >= 2) {\n const simplifiedPoints = simplifyPath(currentPath, 2);\n onDrawingComplete?.({ points: simplifiedPoints });\n }\n\n setCurrentPath([]);\n }, [isDrawing, currentPath, onDrawingComplete]);\n\n return (\n <svg\n ref={svgRef}\n className={cn(\n 'drawing-canvas',\n isActive && 'cursor-crosshair',\n className\n )}\n width={width * scale}\n height={height * scale}\n viewBox={`0 0 ${width} ${height}`}\n style={{ touchAction: isActive ? 'none' : 'auto' }}\n onMouseDown={handleStart}\n onMouseMove={handleMove}\n onMouseUp={handleEnd}\n onMouseLeave={handleEnd}\n onTouchStart={handleStart}\n onTouchMove={handleMove}\n onTouchEnd={handleEnd}\n >\n {/* Current drawing path preview */}\n {isDrawing && currentPath.length > 0 && (\n <path\n d={pointsToSvgPath(currentPath)}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.8}\n />\n )}\n </svg>\n );\n});\n\n// Export helper functions for reuse\nexport { pointsToSvgPath, simplifyPath };\n","import { memo, useCallback, useState, useRef } from 'react';\nimport type { ShapeAnnotation } from '../../types';\nimport { cn } from '../../utils';\n\nexport interface ShapeRendererProps {\n shape: ShapeAnnotation;\n scale: number;\n isSelected?: boolean;\n isEditing?: boolean;\n onSelect?: () => void;\n onUpdate?: (updates: Partial<ShapeAnnotation>) => void;\n onDelete?: () => void;\n className?: string;\n}\n\ninterface ResizeHandle {\n position: 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n cursor: string;\n x: number;\n y: number;\n}\n\nexport const ShapeRenderer = memo(function ShapeRenderer({\n shape,\n scale,\n isSelected,\n isEditing,\n onSelect,\n onUpdate,\n onDelete: _onDelete,\n className,\n}: ShapeRendererProps) {\n const [_isDragging, setIsDragging] = useState(false);\n const [_isResizing, setIsResizing] = useState(false);\n const [activeHandle, setActiveHandle] = useState<string | null>(null);\n const startPosRef = useRef({ x: 0, y: 0 });\n const startShapeRef = useRef({ x: 0, y: 0, width: 0, height: 0 });\n\n const { shapeType, x, y, width, height, color, strokeWidth, id: _id } = shape;\n const scaledX = x * scale;\n const scaledY = y * scale;\n const scaledWidth = width * scale;\n const scaledHeight = height * scale;\n const scaledStroke = strokeWidth * scale;\n\n // Calculate resize handles positions\n const getResizeHandles = useCallback((): ResizeHandle[] => {\n const handleSize = 8;\n const half = handleSize / 2;\n\n return [\n { position: 'nw', cursor: 'nwse-resize', x: scaledX - half, y: scaledY - half },\n { position: 'n', cursor: 'ns-resize', x: scaledX + scaledWidth / 2 - half, y: scaledY - half },\n { position: 'ne', cursor: 'nesw-resize', x: scaledX + scaledWidth - half, y: scaledY - half },\n { position: 'e', cursor: 'ew-resize', x: scaledX + scaledWidth - half, y: scaledY + scaledHeight / 2 - half },\n { position: 'se', cursor: 'nwse-resize', x: scaledX + scaledWidth - half, y: scaledY + scaledHeight - half },\n { position: 's', cursor: 'ns-resize', x: scaledX + scaledWidth / 2 - half, y: scaledY + scaledHeight - half },\n { position: 'sw', cursor: 'nesw-resize', x: scaledX - half, y: scaledY + scaledHeight - half },\n { position: 'w', cursor: 'ew-resize', x: scaledX - half, y: scaledY + scaledHeight / 2 - half },\n ];\n }, [scaledX, scaledY, scaledWidth, scaledHeight]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent, handle?: string) => {\n e.stopPropagation();\n onSelect?.();\n\n if (!isEditing) return;\n\n startPosRef.current = { x: e.clientX, y: e.clientY };\n startShapeRef.current = { x, y, width, height };\n\n if (handle) {\n setIsResizing(true);\n setActiveHandle(handle);\n } else {\n setIsDragging(true);\n }\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const dx = (moveEvent.clientX - startPosRef.current.x) / scale;\n const dy = (moveEvent.clientY - startPosRef.current.y) / scale;\n\n if (handle) {\n // Resizing\n let newX = startShapeRef.current.x;\n let newY = startShapeRef.current.y;\n let newWidth = startShapeRef.current.width;\n let newHeight = startShapeRef.current.height;\n\n switch (handle) {\n case 'nw':\n newX += dx;\n newY += dy;\n newWidth -= dx;\n newHeight -= dy;\n break;\n case 'n':\n newY += dy;\n newHeight -= dy;\n break;\n case 'ne':\n newY += dy;\n newWidth += dx;\n newHeight -= dy;\n break;\n case 'e':\n newWidth += dx;\n break;\n case 'se':\n newWidth += dx;\n newHeight += dy;\n break;\n case 's':\n newHeight += dy;\n break;\n case 'sw':\n newX += dx;\n newWidth -= dx;\n newHeight += dy;\n break;\n case 'w':\n newX += dx;\n newWidth -= dx;\n break;\n }\n\n // Ensure minimum size\n if (newWidth >= 10 && newHeight >= 10) {\n onUpdate?.({ x: newX, y: newY, width: newWidth, height: newHeight });\n }\n } else {\n // Dragging\n onUpdate?.({\n x: startShapeRef.current.x + dx,\n y: startShapeRef.current.y + dy,\n });\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n setIsResizing(false);\n setActiveHandle(null);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [isEditing, x, y, width, height, scale, onSelect, onUpdate]);\n\n const renderShape = useCallback(() => {\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n className: cn(\n 'cursor-pointer transition-opacity',\n isSelected && 'filter drop-shadow-sm'\n ),\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect\n x={scaledX}\n y={scaledY}\n width={scaledWidth}\n height={scaledHeight}\n {...commonProps}\n />\n );\n\n case 'circle':\n return (\n <ellipse\n cx={scaledX + scaledWidth / 2}\n cy={scaledY + scaledHeight / 2}\n rx={scaledWidth / 2}\n ry={scaledHeight / 2}\n {...commonProps}\n />\n );\n\n case 'line':\n return (\n <line\n x1={scaledX}\n y1={scaledY}\n x2={scaledX + scaledWidth}\n y2={scaledY + scaledHeight}\n {...commonProps}\n />\n );\n\n case 'arrow':\n const endX = scaledX + scaledWidth;\n const endY = scaledY + scaledHeight;\n const angle = Math.atan2(scaledHeight, scaledWidth);\n const arrowLength = Math.min(15, Math.sqrt(scaledWidth * scaledWidth + scaledHeight * scaledHeight) * 0.2);\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g>\n <line x1={scaledX} y1={scaledY} x2={endX} y2={endY} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow1X} y2={arrow1Y} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow2X} y2={arrow2Y} {...commonProps} />\n </g>\n );\n\n default:\n return null;\n }\n }, [shapeType, scaledX, scaledY, scaledWidth, scaledHeight, color, scaledStroke, isSelected]);\n\n return (\n <g\n className={cn('shape-renderer', className)}\n onMouseDown={(e) => handleMouseDown(e)}\n >\n {/* Hit area for selection (invisible, larger) */}\n <rect\n x={scaledX - 5}\n y={scaledY - 5}\n width={scaledWidth + 10}\n height={scaledHeight + 10}\n fill=\"transparent\"\n stroke=\"none\"\n className=\"cursor-pointer\"\n />\n\n {/* The actual shape */}\n {renderShape()}\n\n {/* Selection outline */}\n {isSelected && (\n <rect\n x={scaledX - 2}\n y={scaledY - 2}\n width={scaledWidth + 4}\n height={scaledHeight + 4}\n fill=\"none\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n )}\n\n {/* Resize handles when editing */}\n {isSelected && isEditing && getResizeHandles().map((handle) => (\n <rect\n key={handle.position}\n x={handle.x}\n y={handle.y}\n width={8}\n height={8}\n fill=\"white\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n className={cn('cursor-pointer', activeHandle === handle.position && 'fill-blue-500')}\n style={{ cursor: handle.cursor }}\n onMouseDown={(e) => handleMouseDown(e, handle.position)}\n />\n ))}\n </g>\n );\n});\n\n// Shape preview component for drawing new shapes\nexport interface ShapePreviewProps {\n shapeType: 'rect' | 'circle' | 'arrow' | 'line';\n startPoint: { x: number; y: number };\n endPoint: { x: number; y: number };\n scale: number;\n color: string;\n strokeWidth: number;\n}\n\nexport const ShapePreview = memo(function ShapePreview({\n shapeType,\n startPoint,\n endPoint,\n scale,\n color,\n strokeWidth,\n}: ShapePreviewProps) {\n const x = Math.min(startPoint.x, endPoint.x) * scale;\n const y = Math.min(startPoint.y, endPoint.y) * scale;\n const width = Math.abs(endPoint.x - startPoint.x) * scale;\n const height = Math.abs(endPoint.y - startPoint.y) * scale;\n const scaledStroke = strokeWidth * scale;\n\n const commonProps = {\n stroke: color,\n strokeWidth: scaledStroke,\n fill: 'none',\n opacity: 0.7,\n };\n\n switch (shapeType) {\n case 'rect':\n return (\n <rect x={x} y={y} width={width} height={height} {...commonProps} />\n );\n\n case 'circle':\n return (\n <ellipse\n cx={x + width / 2}\n cy={y + height / 2}\n rx={width / 2}\n ry={height / 2}\n {...commonProps}\n />\n );\n\n case 'line':\n return (\n <line\n x1={startPoint.x * scale}\n y1={startPoint.y * scale}\n x2={endPoint.x * scale}\n y2={endPoint.y * scale}\n {...commonProps}\n />\n );\n\n case 'arrow':\n const endX = endPoint.x * scale;\n const endY = endPoint.y * scale;\n const dx = endPoint.x - startPoint.x;\n const dy = endPoint.y - startPoint.y;\n const angle = Math.atan2(dy, dx);\n const arrowLength = Math.min(15, Math.sqrt(width * width + height * height) * 0.2);\n const arrowAngle = Math.PI / 6;\n\n const arrow1X = endX - arrowLength * Math.cos(angle - arrowAngle);\n const arrow1Y = endY - arrowLength * Math.sin(angle - arrowAngle);\n const arrow2X = endX - arrowLength * Math.cos(angle + arrowAngle);\n const arrow2Y = endY - arrowLength * Math.sin(angle + arrowAngle);\n\n return (\n <g>\n <line\n x1={startPoint.x * scale}\n y1={startPoint.y * scale}\n x2={endX}\n y2={endY}\n {...commonProps}\n />\n <line x1={endX} y1={endY} x2={arrow1X} y2={arrow1Y} {...commonProps} />\n <line x1={endX} y1={endY} x2={arrow2X} y2={arrow2Y} {...commonProps} />\n </g>\n );\n\n default:\n return null;\n }\n});\n","import { memo, useCallback, useState } from 'react';\nimport { cn } from '../../utils';\n\nexport interface QuickNoteButtonProps {\n /** Page number this button is for */\n pageNumber: number;\n /** Scale of the page */\n scale: number;\n /** Position of the button (relative to page) */\n position?: 'top-right' | 'bottom-right';\n /** Callback when button is clicked */\n onClick: (pageNumber: number, x: number, y: number) => void;\n /** Custom className */\n className?: string;\n /** Whether the button is visible */\n visible?: boolean;\n}\n\n/**\n * Floating button on each page to quickly add a note.\n */\nexport const QuickNoteButton = memo(function QuickNoteButton({\n pageNumber,\n scale,\n position = 'top-right',\n onClick,\n className,\n visible = true,\n}: QuickNoteButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n // Default position near button (based on button position)\n const x = position === 'top-right' ? 80 : 80;\n const y = position === 'top-right' ? 20 : 80;\n onClick(pageNumber, x / scale, y / scale);\n },\n [pageNumber, onClick, position, scale]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <button\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={cn(\n 'quick-note-button',\n 'absolute z-50',\n 'w-8 h-8 rounded-full',\n 'bg-yellow-400 hover:bg-yellow-500',\n 'shadow-md hover:shadow-lg',\n 'flex items-center justify-center',\n 'transition-all duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:ring-offset-2',\n isHovered && 'scale-110',\n position === 'top-right' && 'top-3 right-3',\n position === 'bottom-right' && 'bottom-3 right-3',\n className\n )}\n title=\"Add quick note\"\n aria-label=\"Add quick note\"\n >\n <svg\n className=\"w-4 h-4 text-yellow-900\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n );\n});\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\n\nexport interface QuickNotePopoverProps {\n /** Whether the popover is visible */\n visible: boolean;\n /** Position of the popover */\n position: { x: number; y: number };\n /** Initial content */\n initialContent?: string;\n /** Agent's last statement to display */\n agentLastStatement?: string;\n /** Callback when note is saved */\n onSave: (content: string) => void;\n /** Callback when cancelled */\n onCancel: () => void;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Popover for entering quick note content.\n */\nexport const QuickNotePopover = memo(function QuickNotePopover({\n visible,\n position,\n initialContent = '',\n agentLastStatement,\n onSave,\n onCancel,\n className,\n}: QuickNotePopoverProps) {\n const [content, setContent] = useState(initialContent);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const [adjustedPosition, setAdjustedPosition] = useState(position);\n\n // Focus textarea when visible\n useEffect(() => {\n if (visible && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [visible]);\n\n // Reset content when opening\n useEffect(() => {\n if (visible) {\n setContent(initialContent);\n }\n }, [visible, initialContent]);\n\n // Adjust position to stay within viewport\n useEffect(() => {\n if (!visible || !popoverRef.current) return;\n\n const rect = popoverRef.current.getBoundingClientRect();\n const padding = 10;\n let { x, y } = position;\n\n // Adjust horizontal position\n if (x + rect.width > window.innerWidth - padding) {\n x = window.innerWidth - rect.width - padding;\n }\n if (x < padding) {\n x = padding;\n }\n\n // Adjust vertical position\n if (y + rect.height > window.innerHeight - padding) {\n y = window.innerHeight - rect.height - padding;\n }\n if (y < padding) {\n y = padding;\n }\n\n setAdjustedPosition({ x, y });\n }, [position, visible]);\n\n const handleSave = useCallback(() => {\n if (content.trim()) {\n onSave(content.trim());\n } else {\n onCancel();\n }\n }, [content, onSave, onCancel]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleSave();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n },\n [handleSave, onCancel]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n ref={popoverRef}\n className={cn(\n 'quick-note-popover',\n 'fixed z-[9999]',\n 'bg-yellow-50 dark:bg-yellow-900/90',\n 'rounded-lg shadow-xl',\n 'border border-yellow-200 dark:border-yellow-700',\n 'p-3 w-72',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n }}\n >\n {/* Agent context hint */}\n {agentLastStatement && (\n <div className=\"mb-2 p-2 bg-blue-50 dark:bg-blue-900/50 rounded text-xs text-blue-600 dark:text-blue-300 border border-blue-100 dark:border-blue-800\">\n <div className=\"flex items-start gap-1\">\n <svg className=\"w-3 h-3 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n </svg>\n <span className=\"line-clamp-2\">AI discussed: &ldquo;{agentLastStatement}&rdquo;</span>\n </div>\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Write your note...\"\n className={cn(\n 'w-full h-24 px-2 py-1.5 rounded',\n 'bg-white dark:bg-gray-800',\n 'border border-yellow-200 dark:border-yellow-700',\n 'text-gray-900 dark:text-white text-sm',\n 'placeholder:text-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500',\n 'resize-none'\n )}\n />\n\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to save\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onCancel}\n className={cn(\n 'px-3 py-1 rounded text-sm',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!content.trim()}\n className={cn(\n 'px-3 py-1 rounded text-sm font-medium',\n 'bg-yellow-500 text-yellow-900',\n 'hover:bg-yellow-600',\n 'focus:outline-none focus:ring-2 focus:ring-yellow-500',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n});\n","import { memo } from 'react';\nimport { cn } from '../../utils';\n\nexport interface AskAboutOverlayProps {\n /** Whether the overlay is visible */\n visible: boolean;\n /** Progress of the long press (0-1) */\n progress: number;\n /** Position of the overlay */\n position: { x: number; y: number } | null;\n /** Size of the progress indicator */\n size?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Visual feedback overlay shown during long-press for \"Ask About This\" feature.\n * Displays a circular progress indicator.\n */\nexport const AskAboutOverlay = memo(function AskAboutOverlay({\n visible,\n progress,\n position,\n size = 60,\n className,\n}: AskAboutOverlayProps) {\n if (!visible || !position) {\n return null;\n }\n\n const strokeWidth = 4;\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference * (1 - progress);\n\n return (\n <div\n className={cn(\n 'ask-about-overlay',\n 'fixed pointer-events-none z-[9999]',\n className\n )}\n style={{\n left: position.x - size / 2,\n top: position.y - size / 2,\n }}\n >\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n className=\"transform -rotate-90\"\n >\n {/* Background circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"rgba(0, 0, 0, 0.3)\"\n stroke=\"rgba(255, 255, 255, 0.3)\"\n strokeWidth={strokeWidth}\n />\n {/* Progress circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"#3b82f6\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className=\"transition-[stroke-dashoffset] duration-75 ease-linear\"\n />\n </svg>\n {/* Center icon */}\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{ color: progress >= 1 ? '#22c55e' : 'white' }}\n >\n {progress >= 1 ? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n )}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useState, useRef, useEffect } from 'react';\nimport { cn } from '../../utils';\n\nexport interface AskAboutTriggerProps {\n /** Position to display the trigger */\n position: { x: number; y: number };\n /** Callback when ask about is confirmed */\n onConfirm: () => void;\n /** Callback when cancelled */\n onCancel: () => void;\n /** Whether to show the trigger */\n visible: boolean;\n /** Auto-hide delay in ms (0 = no auto-hide) */\n autoHideDelay?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Confirmation UI shown after long-press completes.\n * Provides buttons to confirm or cancel the \"Ask About This\" action.\n */\nexport const AskAboutTrigger = memo(function AskAboutTrigger({\n position,\n onConfirm,\n onCancel,\n visible,\n autoHideDelay = 5000,\n className,\n}: AskAboutTriggerProps) {\n const [adjustedPosition, setAdjustedPosition] = useState(position);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n // Adjust position to stay within viewport\n useEffect(() => {\n if (!visible || !triggerRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n const padding = 10;\n let { x, y } = position;\n\n // Adjust horizontal position\n if (x + rect.width / 2 > window.innerWidth - padding) {\n x = window.innerWidth - rect.width / 2 - padding;\n }\n if (x - rect.width / 2 < padding) {\n x = rect.width / 2 + padding;\n }\n\n // Adjust vertical position (show above if too close to bottom)\n if (y + rect.height > window.innerHeight - padding) {\n y = position.y - rect.height - 20;\n }\n\n setAdjustedPosition({ x, y });\n }, [position, visible]);\n\n // Auto-hide after delay\n useEffect(() => {\n if (!visible || autoHideDelay === 0) return;\n\n const timer = setTimeout(onCancel, autoHideDelay);\n return () => clearTimeout(timer);\n }, [visible, autoHideDelay, onCancel]);\n\n const handleConfirm = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onConfirm();\n },\n [onConfirm]\n );\n\n const handleCancel = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onCancel();\n },\n [onCancel]\n );\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n ref={triggerRef}\n className={cn(\n 'ask-about-trigger',\n 'fixed z-[9999]',\n 'bg-white dark:bg-gray-800 rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'p-2 flex items-center gap-2',\n 'animate-in fade-in zoom-in-95 duration-150',\n className\n )}\n style={{\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n transform: 'translate(-50%, 0)',\n }}\n >\n <span className=\"text-sm text-gray-600 dark:text-gray-300 px-2\">\n Ask about this?\n </span>\n <button\n onClick={handleConfirm}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium',\n 'bg-blue-500 text-white hover:bg-blue-600',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Ask\n </button>\n <button\n onClick={handleCancel}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium',\n 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300',\n 'hover:bg-gray-200 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Cancel\n </button>\n </div>\n );\n});\n","import { memo, useMemo, useCallback } from 'react';\nimport { useStudentStore, useViewerStore } from '../../hooks';\nimport { cn } from '../../utils';\n\nexport interface MinimapProps {\n /** Display variant */\n variant?: 'sidebar' | 'floating';\n /** Position for floating variant */\n floatingPosition?: 'left' | 'right';\n /** Maximum height in pixels */\n maxHeight?: number;\n /** Whether to show page numbers */\n showPageNumbers?: boolean;\n /** Callback when a page is clicked */\n onPageClick?: (pageNumber: number) => void;\n /** Custom className */\n className?: string;\n}\n\ntype PageStatus = 'current' | 'visited' | 'bookmarked' | 'unvisited';\n\ninterface PageIndicatorProps {\n pageNumber: number;\n status: PageStatus;\n isBookmarked: boolean;\n onClick: () => void;\n showNumber: boolean;\n compact: boolean;\n}\n\nconst PageIndicator = memo(function PageIndicator({\n pageNumber,\n status,\n isBookmarked,\n onClick,\n showNumber,\n compact,\n}: PageIndicatorProps) {\n const getStatusColor = () => {\n if (status === 'current') return 'bg-blue-500';\n if (isBookmarked) return 'bg-yellow-400';\n if (status === 'visited') return 'bg-green-400';\n return 'bg-gray-200 dark:bg-gray-700';\n };\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'minimap-page-indicator',\n 'relative rounded-sm transition-all duration-150',\n 'hover:ring-2 hover:ring-blue-300 hover:ring-offset-1',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500',\n compact ? 'w-2 h-3' : 'w-4 h-5',\n getStatusColor(),\n status === 'current' && 'ring-2 ring-blue-600 ring-offset-1'\n )}\n title={`Page ${pageNumber}${isBookmarked ? ' (bookmarked)' : ''}`}\n aria-label={`Go to page ${pageNumber}`}\n >\n {isBookmarked && !compact && (\n <div className=\"absolute -top-1 -right-1 w-2 h-2 bg-yellow-500 rounded-full border border-white\" />\n )}\n {showNumber && !compact && (\n <span className=\"absolute inset-0 flex items-center justify-center text-[8px] font-medium text-white\">\n {pageNumber}\n </span>\n )}\n </button>\n );\n});\n\n/**\n * Visual minimap showing reading progress and navigation.\n */\nexport const Minimap = memo(function Minimap({\n variant = 'sidebar',\n floatingPosition = 'right',\n maxHeight = 300,\n showPageNumbers = false,\n onPageClick,\n className,\n}: MinimapProps) {\n // Store state\n const visitedPages = useStudentStore((s) => s.visitedPages);\n const bookmarks = useStudentStore((s) => s.bookmarks);\n const currentPage = useViewerStore((s) => s.currentPage);\n const numPages = useViewerStore((s) => s.numPages);\n const goToPage = useViewerStore((s) => s.goToPage);\n\n // Create set of bookmarked pages for quick lookup\n const bookmarkedPages = useMemo(() => {\n return new Set(bookmarks.map((b) => b.pageNumber));\n }, [bookmarks]);\n\n // Determine if we should use compact mode based on page count\n const compact = numPages > 50;\n\n const handlePageClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n onPageClick?.(pageNumber);\n },\n [goToPage, onPageClick]\n );\n\n const getPageStatus = useCallback(\n (pageNumber: number): PageStatus => {\n if (pageNumber === currentPage) return 'current';\n if (bookmarkedPages.has(pageNumber)) return 'bookmarked';\n if (visitedPages.has(pageNumber)) return 'visited';\n return 'unvisited';\n },\n [currentPage, visitedPages, bookmarkedPages]\n );\n\n // Generate page indicators\n const pageIndicators = useMemo(() => {\n const pages = [];\n for (let i = 1; i <= numPages; i++) {\n pages.push(\n <PageIndicator\n key={i}\n pageNumber={i}\n status={getPageStatus(i)}\n isBookmarked={bookmarkedPages.has(i)}\n onClick={() => handlePageClick(i)}\n showNumber={showPageNumbers}\n compact={compact}\n />\n );\n }\n return pages;\n }, [numPages, getPageStatus, bookmarkedPages, handlePageClick, showPageNumbers, compact]);\n\n // Progress stats\n const visitedCount = visitedPages.size;\n const progressPercentage = numPages > 0 ? Math.round((visitedCount / numPages) * 100) : 0;\n\n if (numPages === 0) {\n return null;\n }\n\n const content = (\n <>\n {/* Progress bar */}\n <div className=\"mb-3\">\n <div className=\"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400 mb-1\">\n <span>Progress</span>\n <span>{progressPercentage}%</span>\n </div>\n <div className=\"h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-green-500 rounded-full transition-all duration-300\"\n style={{ width: `${progressPercentage}%` }}\n />\n </div>\n </div>\n\n {/* Page indicators */}\n <div\n className={cn(\n 'flex flex-wrap gap-1 overflow-y-auto',\n compact ? 'gap-0.5' : 'gap-1'\n )}\n style={{ maxHeight: maxHeight - 60 }}\n >\n {pageIndicators}\n </div>\n\n {/* Legend */}\n <div className=\"mt-3 pt-2 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"flex flex-wrap gap-3 text-xs text-gray-500 dark:text-gray-400\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-blue-500\" />\n <span>Current</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-green-400\" />\n <span>Visited</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-sm bg-yellow-400\" />\n <span>Bookmarked</span>\n </div>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n {visitedCount} of {numPages} pages visited\n </div>\n </>\n );\n\n if (variant === 'floating') {\n return (\n <div\n className={cn(\n 'minimap minimap-floating',\n 'fixed z-40',\n 'bg-white dark:bg-gray-800',\n 'rounded-lg shadow-lg',\n 'border border-gray-200 dark:border-gray-700',\n 'p-3 w-48',\n floatingPosition === 'right' ? 'right-4' : 'left-4',\n 'top-1/2 -translate-y-1/2',\n className\n )}\n style={{ maxHeight }}\n >\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2\">\n Reading Progress\n </h3>\n {content}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'minimap minimap-sidebar',\n 'p-3',\n className\n )}\n style={{ maxHeight }}\n >\n {content}\n </div>\n );\n});\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { cn } from '../../utils';\n\nexport interface PDFErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Whether to show the default error UI */\n showDefaultUI?: boolean;\n className?: string;\n}\n\ninterface PDFErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class PDFErrorBoundary extends Component<PDFErrorBoundaryProps, PDFErrorBoundaryState> {\n constructor(props: PDFErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): PDFErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n\n // Log to console for debugging\n console.error('PDFErrorBoundary caught an error:', error);\n console.error('Component stack:', errorInfo.componentStack);\n }\n\n handleReset = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback, showDefaultUI = true, className } = this.props;\n\n if (hasError && error) {\n // Custom fallback UI\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, this.handleReset);\n }\n return fallback;\n }\n\n // Default error UI\n if (showDefaultUI) {\n return (\n <DefaultErrorUI\n error={error}\n onReset={this.handleReset}\n className={className}\n />\n );\n }\n\n // No UI - return null\n return null;\n }\n\n return children;\n }\n}\n\ninterface DefaultErrorUIProps {\n error: Error;\n onReset: () => void;\n className?: string;\n}\n\nfunction DefaultErrorUI({ error, onReset, className }: DefaultErrorUIProps) {\n const isPDFError = error.message.includes('PDF') || error.message.includes('pdf');\n const isNetworkError =\n error.message.includes('fetch') ||\n error.message.includes('network') ||\n error.message.includes('Failed to load');\n\n let title = 'Something went wrong';\n let description = error.message;\n let icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n );\n\n if (isPDFError) {\n title = 'Unable to load PDF';\n description = 'The PDF file could not be loaded. It may be corrupted or in an unsupported format.';\n icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n );\n } else if (isNetworkError) {\n title = 'Network error';\n description = 'Unable to fetch the PDF file. Please check your internet connection and try again.';\n icon = (\n <svg className=\"w-12 h-12 text-red-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M18.364 5.636a9 9 0 010 12.728m0 0l-2.829-2.829m2.829 2.829L21 21M15.536 8.464a5 5 0 010 7.072m0 0l-2.829-2.829m-4.243 2.829a4.978 4.978 0 01-1.414-2.83m-1.414 5.658a9 9 0 01-2.167-9.238m7.824 2.167a1 1 0 111.414 1.414m-1.414-1.414L3 3m8.293 8.293l1.414 1.414\"\n />\n </svg>\n );\n }\n\n return (\n <div\n className={cn(\n 'pdf-error-boundary',\n 'flex flex-col items-center justify-center',\n 'min-h-[300px] p-8',\n 'bg-gray-50 dark:bg-gray-900',\n 'text-center',\n className\n )}\n >\n {icon}\n\n <h2 className=\"mt-4 text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h2>\n\n <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400 max-w-md\">\n {description}\n </p>\n\n <details className=\"mt-4 text-left max-w-md w-full\">\n <summary className=\"cursor-pointer text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\">\n Technical details\n </summary>\n <pre className=\"mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded text-xs overflow-auto\">\n {error.stack || error.message}\n </pre>\n </details>\n\n <div className=\"mt-6 flex gap-3\">\n <button\n onClick={onReset}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium',\n 'bg-blue-600 text-white',\n 'hover:bg-blue-700',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Try again\n </button>\n\n <button\n onClick={() => window.location.reload()}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium',\n 'bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-200',\n 'hover:bg-gray-300 dark:hover:bg-gray-600',\n 'focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2',\n 'transition-colors'\n )}\n >\n Reload page\n </button>\n </div>\n </div>\n );\n}\n\n// Helper component for wrapping PDF viewers with error boundary\nexport interface WithErrorBoundaryProps extends Omit<PDFErrorBoundaryProps, 'children'> {\n component: ReactNode;\n}\n\nexport function withErrorBoundary({ component, ...props }: WithErrorBoundaryProps): ReactNode {\n return <PDFErrorBoundary {...props}>{component}</PDFErrorBoundary>;\n}\n","export {\n PluginManager,\n getPluginManager,\n createPluginManager,\n type PluginManagerOptions,\n} from './PluginManager';\n"],"mappings":"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AA,MAGA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,M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","names":["version","document","document","initialState","import_vanilla","init_PDFViewer","isStorageAvailable","getStorageKey","STORAGE_PREFIX","focusRegionIdCounter","generateFocusRegionId","initialState","document","import_vanilla","initialState","import_vanilla","generateId","isStorageAvailable","getStorageKey","STORAGE_PREFIX","initialState","import_vanilla","initialState","import_react","document","import_react","numPages","import_react","import_react","import_react","import_react","options","import_react","import_react","getPluginManager","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","Toolbar","import_react","import_jsx_runtime","MobileToolbar","init_Toolbar","import_react","import_jsx_runtime","Thumbnail","document","ThumbnailPanel","import_react","import_jsx_runtime","SearchPanel","import_react","import_jsx_runtime","OutlineNode","OutlinePanel","document","import_react","import_jsx_runtime","HighlightItem","PageGroup","HighlightsPanel","import_react","import_jsx_runtime","SidebarTab","Sidebar","import_react","import_jsx_runtime","MobileSidebar","import_react","import_jsx_runtime","PageGroup","BookmarkItem","EditModal","BookmarksPanel","import_react","import_jsx_runtime","PageGroup","TakeawayItem","TakeawaysPanel","init_Sidebar","import_react","import_jsx_runtime","AnnotationToolbar","init_AnnotationToolbar","import_react","import_jsx_runtime","CanvasLayer","isTextItem","import_react","import_jsx_runtime","TextLayer","import_react","import_jsx_runtime","HighlightLayer","import_react","import_jsx_runtime","AnnotationLayer","import_react","import_jsx_runtime","PDFPage","import_react","import_jsx_runtime","FocusRegionLayer","init_PDFPage","import_react","import_jsx_runtime","SelectionToolbar","init_SelectionToolbar","import_react","import_jsx_runtime","HighlightPopover","init_HighlightPopover","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","DocumentContainer","document","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","VirtualizedDocumentContainer","document","import_react","import_jsx_runtime","ContinuousScrollContainer","import_react","import_jsx_runtime","init_PDFPage","init_SelectionToolbar","init_HighlightPopover","DualPageContainer","document","spread","import_react","import_jsx_runtime","init_Toolbar","init_Sidebar","init_AnnotationToolbar","PDFViewerInner","document","error","PDFViewerClient","import_react","import_jsx_runtime","PDFViewerClient","PDFViewerLoading","PDFViewer","init_PDFViewer","init_PDFViewer","init_PDFPage","init_Toolbar","init_Sidebar","init_SelectionToolbar","init_HighlightPopover","init_AnnotationToolbar","import_react","import_jsx_runtime","StickyNote","import_react","import_jsx_runtime","DrawingCanvas","import_react","import_jsx_runtime","ShapeRenderer","renderShape","ShapePreview","import_react","import_jsx_runtime","QuickNoteButton","import_react","import_jsx_runtime","QuickNotePopover","import_react","import_jsx_runtime","AskAboutOverlay","import_react","import_jsx_runtime","AskAboutTrigger","import_react","import_jsx_runtime","PageIndicator","Minimap","import_react","import_jsx_runtime"]}