pdfjs-reader-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7777 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1292 -0
- package/dist/index.d.ts +1292 -0
- package/dist/index.js +7669 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +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/index.ts","../src/store/search-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/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/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/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/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}\n\nexport interface LoadDocumentResult {\n document: PDFDocumentProxy;\n numPages: number;\n}\n\n/**\n * Load a PDF document from a URL or data buffer.\n */\nexport async function loadDocument(options: LoadDocumentOptions): Promise<LoadDocumentResult> {\n const { src, workerSrc, password, onProgress } = options;\n\n // Initialize pdf.js if not already done\n await initializePDFJS({ workerSrc });\n\n // Prepare loading parameters\n const loadingTask = pdfjsLib.getDocument({\n url: typeof src === 'string' ? src : undefined,\n data: typeof src !== 'string' ? src : undefined,\n password,\n useWorkerFetch: true,\n isEvalSupported: false,\n useSystemFonts: true,\n });\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 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","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","export { cn } from './cn';\nexport { initializePDFJS, isPDFJSInitialized, resetPDFJS, pdfjsLib } from './pdfjs-init';\nexport {\n loadDocument,\n getPage,\n getPageTextContent,\n getOutline,\n getMetadata,\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","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","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","import { createContext, useContext, useRef, useEffect, type ReactNode } from 'react';\nimport { useStore } from 'zustand';\nimport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\n type ViewerStoreApi,\n type AnnotationStoreApi,\n type SearchStoreApi,\n type ViewerStore,\n type AnnotationStore,\n type SearchStore,\n type AnnotationState,\n} from '../store';\nimport type { ViewerState, SearchState, Theme, SidebarPanel } from '../types';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface PDFViewerContextValue {\n viewerStore: ViewerStoreApi;\n annotationStore: AnnotationStoreApi;\n searchStore: SearchStoreApi;\n}\n\nexport interface PDFViewerProviderProps {\n children: ReactNode;\n initialState?: {\n viewer?: Partial<ViewerState>;\n annotation?: Partial<AnnotationState>;\n search?: Partial<SearchState>;\n };\n theme?: Theme;\n defaultSidebarPanel?: SidebarPanel;\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}: PDFViewerProviderProps) {\n const viewerStoreRef = useRef<ViewerStoreApi | null>(null);\n const annotationStoreRef = useRef<AnnotationStoreApi | null>(null);\n const searchStoreRef = useRef<SearchStoreApi | 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 // Cleanup on unmount\n useEffect(() => {\n return () => {\n viewerStoreRef.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 }}\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 all stores directly (for actions).\n */\nexport function usePDFViewerStores() {\n return usePDFViewerContext();\n}\n\nexport { PDFViewerContext };\n","import { useCallback, useMemo } from 'react';\nimport { useViewerStore, useAnnotationStore, useSearchStore, usePDFViewerStores } from './PDFViewerContext';\nimport type { Theme, ViewMode, SidebarPanel, HighlightColor, Highlight } from '../types';\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 } = 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 // 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 [\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 ]\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","export {\n PDFViewerProvider,\n PDFViewerContext,\n useViewerStore,\n useAnnotationStore,\n useSearchStore,\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","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'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 “{highlight.text}”\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","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';\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}\n\nexport const CanvasLayer = memo(function CanvasLayer({\n page,\n scale,\n rotation,\n className,\n onRenderStart,\n onRenderComplete,\n onRenderError,\n}: CanvasLayerProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const [isRendering, setIsRendering] = useState(false);\n\n const cancelRender = useCallback(() => {\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 const context = canvas.getContext('2d');\n\n if (!context) {\n onRenderError?.(new Error('Failed to get canvas context'));\n return;\n }\n\n // Set canvas dimensions\n const outputScale = window.devicePixelRatio || 1;\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 setIsRendering(true);\n onRenderStart?.();\n\n try {\n renderTaskRef.current = page.render({\n canvasContext: context,\n viewport,\n });\n\n await renderTaskRef.current.promise;\n setIsRendering(false);\n onRenderComplete?.();\n } catch (error) {\n if ((error as Error).name !== 'RenderingCancelledException') {\n setIsRendering(false);\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 useEffect(() => {\n render();\n return () => cancelRender();\n }, [render, 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}\n\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\nexport const HighlightLayer = memo(function HighlightLayer({\n highlights,\n scale,\n selectedId,\n onHighlightClick,\n className,\n}: HighlightLayerProps) {\n const renderedHighlights = useMemo(() => {\n return highlights.map((highlight) => {\n const isSelected = highlight.id === selectedId;\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 )}\n onClick={() => onHighlightClick?.(highlight)}\n >\n {highlight.rects.map((rect, index) => (\n <div\n key={`${highlight.id}-${index}`}\n className=\"absolute transition-colors duration-150\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.width * scale,\n height: rect.height * scale,\n backgroundColor: isSelected\n ? HIGHLIGHT_COLORS_SELECTED[highlight.color]\n : HIGHLIGHT_COLORS[highlight.color],\n mixBlendMode: 'multiply',\n }}\n />\n ))}\n </div>\n );\n });\n }, [highlights, 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","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';\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 “{highlight.text.slice(0, 100)}{highlight.text.length > 100 ? '...' : ''}”\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\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\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 >\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 // Toolbar\n Toolbar,\n MobileToolbar,\n // Sidebar\n Sidebar,\n MobileSidebar,\n ThumbnailPanel,\n SearchPanel,\n OutlinePanel,\n HighlightsPanel,\n // Popovers\n SelectionToolbar,\n HighlightPopover,\n // Annotations\n AnnotationToolbar,\n StickyNote,\n DrawingCanvas,\n ShapeRenderer,\n ShapePreview,\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 usePDFViewerStores,\n usePDFViewer,\n usePageNavigation,\n useZoom,\n useTextSelection,\n useHighlights,\n useAnnotations,\n useTouchGestures,\n useIsTouchDevice,\n useIsMobile,\n usePlugins,\n} from './hooks';\n\n// Stores\nexport {\n createViewerStore,\n createAnnotationStore,\n createSearchStore,\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} 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} 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} 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} from './hooks';\n\n// Component types\nexport type {\n PDFPageProps,\n CanvasLayerProps,\n TextLayerProps,\n HighlightLayerProps,\n AnnotationLayerProps,\n ToolbarProps,\n MobileToolbarProps,\n SidebarProps,\n MobileSidebarProps,\n ThumbnailPanelProps,\n SearchPanelProps,\n OutlinePanelProps,\n HighlightsPanelProps,\n DocumentContainerProps,\n VirtualizedDocumentContainerProps,\n ContinuousScrollContainerProps,\n DualPageContainerProps,\n SelectionToolbarProps,\n HighlightPopoverProps,\n AnnotationToolbarProps,\n StickyNoteProps,\n DrawingCanvasProps,\n ShapeRendererProps,\n ShapePreviewProps,\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} 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 } from './PDFPage';\nexport { Toolbar, MobileToolbar } from './Toolbar';\nexport { Sidebar, MobileSidebar, ThumbnailPanel, SearchPanel, OutlinePanel, HighlightsPanel } from './Sidebar';\nexport { SelectionToolbar } from './SelectionToolbar';\nexport { HighlightPopover } from './HighlightPopover';\nexport { AnnotationToolbar } from './AnnotationToolbar';\nexport { StickyNote, DrawingCanvas, ShapeRenderer, ShapePreview } from './Annotations';\nexport { PDFErrorBoundary, withErrorBoundary } from './ErrorBoundary';\n\n// Re-export types\nexport type { PDFPageProps, CanvasLayerProps, TextLayerProps, HighlightLayerProps, AnnotationLayerProps } from './PDFPage';\nexport type { ToolbarProps, MobileToolbarProps } from './Toolbar';\nexport type { SidebarProps, MobileSidebarProps, ThumbnailPanelProps, SearchPanelProps, OutlinePanelProps, HighlightsPanelProps } 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 } from './Annotations';\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 { 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","initialState","document","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_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","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","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"]}
|