react-pdf-highlighter-plus 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PdfHighlighter.tsx","../../src/contexts/PdfHighlighterContext.ts","../../src/lib/coordinates.ts","../../src/lib/dark-mode.ts","../../src/lib/recolor-context.ts","../../src/lib/get-bounding-rect.ts","../../src/lib/optimize-client-rects.ts","../../src/lib/get-client-rects.ts","../../src/lib/group-highlights-by-page.ts","../../src/lib/pdfjs-dom.ts","../../src/components/DrawingCanvas.tsx","../../src/components/HighlightLayer.tsx","../../src/contexts/HighlightContext.ts","../../src/lib/screenshot.ts","../../src/components/MouseSelection.tsx","../../src/components/ShapeCanvas.tsx","../../src/components/TipContainer.tsx","../../src/components/TextHighlight.tsx","../../src/lib/copy-highlight-content.ts","../../src/lib/highlight-config-layer.ts","../../src/components/MonitoredHighlightContainer.tsx","../../src/components/MouseMonitor.tsx","../../src/components/AreaHighlight.tsx","../../src/components/FreetextHighlight.tsx","../../src/components/ImageHighlight.tsx","../../src/components/SignaturePad.tsx","../../src/components/DrawingHighlight.tsx","../../src/components/ShapeHighlight.tsx","../../src/components/PdfLoader.tsx","../../src/lib/extract-sentences.ts","../../src/components/leftpanel/LeftPanel.tsx","../../src/contexts/LeftPanelContext.ts","../../src/hooks/useDocumentOutline.ts","../../src/hooks/useThumbnails.ts","../../src/hooks/usePageNavigation.ts","../../src/components/leftpanel/DocumentOutline.tsx","../../src/components/leftpanel/OutlineItem.tsx","../../src/components/leftpanel/ThumbnailPanel.tsx","../../src/components/leftpanel/ThumbnailItem.tsx","../../src/index.ts"],"sourcesContent":["import { PDFDocumentProxy, PDFPageProxy } from \"pdfjs-dist\";\nimport React, {\n CSSProperties,\n PointerEventHandler,\n ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport {\n PdfHighlighterContext,\n PdfSearchOptions,\n PdfHighlighterUtils,\n} from \"../contexts/PdfHighlighterContext\";\nimport { scaledToViewport, viewportPositionToScaled } from \"../lib/coordinates\";\nimport { createDarkModeColorMap, type RenderColorMap } from \"../lib/dark-mode\";\nimport { applyContextRecolor } from \"../lib/recolor-context\";\nimport getBoundingRect from \"../lib/get-bounding-rect\";\nimport getClientRects from \"../lib/get-client-rects\";\nimport groupHighlightsByPage from \"../lib/group-highlights-by-page\";\nimport {\n asElement,\n getDocument,\n getPageFromElement,\n getPagesFromRange,\n getWindow,\n isHTMLElement,\n} from \"../lib/pdfjs-dom\";\nimport {\n Content,\n DrawingStroke,\n GhostHighlight,\n Highlight,\n HighlightBindings,\n PdfScaleValue,\n PdfSelection,\n ScaledPosition,\n ShapeData,\n ShapeType,\n Tip,\n ViewportPosition,\n} from \"../types\";\nimport { DrawingCanvas } from \"./DrawingCanvas\";\nimport { HighlightLayer } from \"./HighlightLayer\";\nimport { MouseSelection } from \"./MouseSelection\";\nimport { ShapeCanvas } from \"./ShapeCanvas\";\nimport { TipContainer } from \"./TipContainer\";\n\nimport type { EventBus as TEventBus, PDFFindController as TPDFFindController, PDFLinkService as TPDFLinkService, PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\nlet EventBus: typeof TEventBus, PDFFindController: typeof TPDFFindController, PDFLinkService: typeof TPDFLinkService, PDFViewer: typeof TPDFViewer;\n\n(async () => {\n // Due to breaking changes in PDF.js 4.0.189. See issue #17228\n const pdfjs = await import(\"pdfjs-dist/web/pdf_viewer.mjs\");\n EventBus = pdfjs.EventBus;\n PDFFindController = pdfjs.PDFFindController;\n PDFLinkService = pdfjs.PDFLinkService;\n PDFViewer = pdfjs.PDFViewer;\n})();\n\n\nconst SCROLL_MARGIN = 10;\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_TEXT_SELECTION_COLOR = \"rgba(153,193,218,255)\";\n\n/**\n * Theme configuration for PdfHighlighter styling.\n * Controls the appearance of the PDF viewer including dark mode support.\n *\n * @category Type\n */\nexport interface PdfHighlighterTheme {\n /**\n * Theme mode. In dark mode, pages are recolored at draw time (hue-preserving,\n * photos kept) using {@link PdfHighlighterTheme.darkModeColors}.\n * @default \"light\"\n */\n mode?: \"light\" | \"dark\";\n\n /**\n * Background color of the viewer container.\n * @default \"#e5e5e5\" for light mode, \"#1e1e1e\" for dark mode\n */\n containerBackgroundColor?: string;\n\n /**\n * Scrollbar thumb color.\n * @default \"#9f9f9f\" for light mode, \"#6b6b6b\" for dark mode\n */\n scrollbarThumbColor?: string;\n\n /**\n * Scrollbar track color.\n * @default \"#d1d1d1\" for light mode, \"#2c2c2c\" for dark mode\n */\n scrollbarTrackColor?: string;\n\n /**\n * Inversion intensity for dark mode (0-1).\n * Lower values create softer dark backgrounds that are easier on the eyes.\n * - 1.0 = Pure black background (harsh)\n * - 0.9 = Dark gray ~#1a1a1a (recommended)\n * - 0.85 = Softer gray ~#262626 (very comfortable)\n * - 0.8 = Medium gray ~#333333 (maximum softness)\n * @default 0.9\n * @deprecated Dark mode now recolors at draw time (OKLab, hue-preserving,\n * photos untouched) instead of a CSS `invert()` filter. This value is\n * ignored. Use {@link PdfHighlighterTheme.darkModeColors} instead.\n */\n darkModeInvertIntensity?: number;\n\n /**\n * Dark-mode recolor palette. White paper maps to `background` and black\n * text/line-art to `foreground`, recolored per-color at draw time (OKLab\n * ramp) so hues are preserved and embedded photos keep their pixels.\n * Only used when `mode === \"dark\"`.\n * @default { background: \"#141210\", foreground: \"#eae6e0\" }\n */\n darkModeColors?: {\n /** Replaces the white paper background. */\n background: string;\n /** Replaces black text and line art. */\n foreground: string;\n };\n}\n\n// Warm gray (red >= green >= blue): easier on the eyes than pure black, and\n// white paper maps onto it exactly. Matches lector's default dark palette.\nconst DEFAULT_DARK_MODE_COLORS = {\n background: \"#141210\",\n foreground: \"#eae6e0\",\n};\n\n// Unmount a per-page React root, deferred so it never runs synchronously inside\n// a React render/commit (which React warns about). Tolerates double-unmount.\nconst unmountReactRoot = (root?: Root | null) => {\n if (!root) return;\n queueMicrotask(() => {\n try {\n root.unmount();\n } catch {\n /* already unmounted */\n }\n });\n};\n\nconst RECOLOR_PATCHED = Symbol(\"pdfRecolorPatched\");\n\n/**\n * Patches a loaded PDF document so every page renders through the dark-mode\n * recolor map (when one is active). PDF.js draws each page by calling\n * `page.render({ canvasContext })`; we wrap that context with\n * `applyContextRecolor` right before the real render and restore it after, so\n * text/vector art is recolored at draw time while photos (drawImage) keep\n * their pixels. The map is read live via `getMap()` so a palette/scheme toggle\n * only needs a re-render, not a re-patch. Idempotent per document and page.\n */\nconst patchPageRenderRecolor = (\n pdfDocument: PDFDocumentProxy,\n getMap: () => RenderColorMap | null,\n) => {\n const doc = pdfDocument as PDFDocumentProxy & { [RECOLOR_PATCHED]?: boolean };\n if (doc[RECOLOR_PATCHED]) return;\n doc[RECOLOR_PATCHED] = true;\n\n const origGetPage = doc.getPage.bind(doc);\n doc.getPage = (pageNumber: number) =>\n origGetPage(pageNumber).then((page) => {\n const p = page as PDFPageProxy & { [RECOLOR_PATCHED]?: boolean };\n if (p[RECOLOR_PATCHED]) return p;\n p[RECOLOR_PATCHED] = true;\n\n const origRender = p.render.bind(p);\n p.render = ((params: Parameters<typeof origRender>[0]) => {\n const map = getMap();\n const ctx = params?.canvasContext as\n | CanvasRenderingContext2D\n | undefined;\n if (map && ctx) {\n const cleanup = applyContextRecolor(ctx, map);\n const task = origRender(params);\n // Restore pristine context when the page settles (done OR cancelled),\n // so pdf.js readbacks and the next render observe original colors.\n task.promise.then(cleanup, cleanup);\n return task;\n }\n return origRender(params);\n }) as typeof p.render;\n return p;\n });\n};\n\nconst defaultLightTheme: Required<PdfHighlighterTheme> = {\n mode: \"light\",\n containerBackgroundColor: \"#e5e5e5\",\n scrollbarThumbColor: \"#9f9f9f\",\n scrollbarTrackColor: \"#d1d1d1\",\n darkModeInvertIntensity: 0.9,\n darkModeColors: DEFAULT_DARK_MODE_COLORS,\n};\n\nconst defaultDarkTheme: Required<PdfHighlighterTheme> = {\n mode: \"dark\",\n containerBackgroundColor: \"#3a3a3a\", // Lighter than PDF page for contrast\n scrollbarThumbColor: \"#6b6b6b\",\n scrollbarTrackColor: \"#2c2c2c\",\n darkModeInvertIntensity: 0.9,\n darkModeColors: DEFAULT_DARK_MODE_COLORS,\n};\n\n/**\n * Returns a stable per-page React-root layer, re-attaching the SAME element to\n * the current parent when PDF.js has re-rendered the page into a fresh layer.\n *\n * This is critical: PDF.js detaches our layer when it rebuilds a page's text\n * layer, but the element keeps its own children (React's content). Re-attaching\n * the same element — instead of creating a new one and a new root — means React\n * never finds its content \"removed\", which is what triggered the\n * `render(...): content was removed` warning under React 18's async commits.\n */\nconst ensurePersistentLayer = (\n bindings: { [page: number]: HighlightBindings },\n pageNumber: number,\n parent: HTMLElement,\n className: string,\n): HighlightBindings => {\n let binding = bindings[pageNumber];\n if (!binding) {\n const doc = getDocument(parent);\n const layer = doc.createElement(\"div\");\n layer.className = className;\n parent.appendChild(layer);\n binding = {\n reactRoot: createRoot(layer),\n container: layer,\n textLayer: parent,\n };\n bindings[pageNumber] = binding;\n } else if (binding.container.parentNode !== parent) {\n // PDF.js replaced/cleared the parent — move our element (with its React\n // content) into the current one, keeping the same root valid.\n parent.appendChild(binding.container);\n binding.textLayer = parent;\n }\n return binding;\n};\n\nconst isFreetextHighlight = (highlight: Highlight | GhostHighlight) =>\n \"type\" in highlight && highlight.type === \"freetext\";\n\nconst disableTextSelection = (viewer: InstanceType<typeof PDFViewer>, flag: boolean) => {\n viewer.viewer?.classList.toggle(\"PdfHighlighter--disable-selection\", flag);\n};\n\n/**\n * The props type for {@link PdfHighlighter}.\n *\n * @category Component Properties\n */\nexport interface PdfHighlighterProps {\n /**\n * Array of all highlights to be organised and fed through to the child\n * highlight container.\n */\n highlights: Array<Highlight>;\n\n /**\n * Event is called only once whenever the user changes scroll after\n * the autoscroll function, scrollToHighlight, has been called.\n */\n onScrollAway?(): void;\n\n /**\n * What scale to render the PDF at inside the viewer.\n */\n pdfScaleValue?: PdfScaleValue;\n\n /**\n * Fired when the user changes zoom by pinch / ctrl+wheel gesture, with the new\n * numeric scale. Use it to keep an external zoom indicator / `pdfScaleValue`\n * state in sync.\n *\n * @param scale - The new numeric scale (e.g. 1.25).\n */\n onZoomChange?(scale: number): void;\n\n /**\n * Page to scroll to once the document first finishes loading (1-indexed).\n * Use for deep-linking (e.g. `?page=12`) or restoring a saved position.\n * Applied only on initial load, not on subsequent re-renders.\n */\n initialPage?: number;\n\n /**\n * Callback fired whenever the current (most visible) page changes, including\n * the initial page. Use to sync the page into a URL/localStorage.\n *\n * @param pageNumber - The new current page (1-indexed).\n */\n onPageChange?(pageNumber: number): void;\n\n /**\n * Callback triggered whenever a user finishes making a mouse selection or has\n * selected text.\n *\n * @param PdfSelection - Content and positioning of the selection. NOTE:\n * `makeGhostHighlight` will not work if the selection disappears.\n */\n onSelection?(PdfSelection: PdfSelection): void;\n\n /**\n * Callback triggered whenever a ghost (non-permanent) highlight is created.\n *\n * @param ghostHighlight - Ghost Highlight that has been created.\n */\n onCreateGhostHighlight?(ghostHighlight: GhostHighlight): void;\n\n /**\n * Callback triggered whenever a ghost (non-permanent) highlight is removed.\n *\n * @param ghostHighlight - Ghost Highlight that has been removed.\n */\n onRemoveGhostHighlight?(ghostHighlight: GhostHighlight): void;\n\n /**\n * Optional element that can be displayed as a tip whenever a user makes a\n * selection.\n */\n selectionTip?: ReactNode;\n\n /**\n * Condition to check before any mouse selection starts.\n *\n * @param event - mouse event associated with the new selection.\n * @returns - `True` if mouse selection should start.\n */\n enableAreaSelection?(event: MouseEvent): boolean;\n\n /**\n * When true, shows crosshair cursor indicating area selection mode is active.\n * Use this when area selection should be persistently enabled (not just on modifier key).\n */\n areaSelectionMode?: boolean;\n\n /**\n * Optional CSS styling for the rectangular mouse selection.\n */\n mouseSelectionStyle?: CSSProperties;\n\n /**\n * PDF document to view and overlay highlights.\n */\n pdfDocument: PDFDocumentProxy;\n\n /**\n * This should be a highlight container/renderer of some sorts. It will be\n * given appropriate context for a single highlight which it can then use to\n * render a TextHighlight, AreaHighlight, etc. in the correct place.\n */\n children: ReactNode;\n\n /**\n * Coloring for unhighlighted, selected text.\n */\n textSelectionColor?: string;\n\n /**\n * Creates a reference to the PdfHighlighterContext above the component.\n *\n * @param pdfHighlighterUtils - various useful tools with a PdfHighlighter.\n * See {@link PdfHighlighterContext} for more description.\n */\n utilsRef(pdfHighlighterUtils: PdfHighlighterUtils): void;\n\n /**\n * Style properties for the PdfHighlighter (scrollbar, background, etc.), NOT\n * the PDF.js viewer it encloses. If you want to edit the latter, use the\n * other style props like `textSelectionColor` or overwrite pdf_viewer.css\n */\n style?: CSSProperties;\n\n /**\n * Condition to check before freetext creation starts.\n *\n * @param event - mouse event associated with the click.\n * @returns - `True` if freetext creation should occur.\n */\n enableFreetextCreation?(event: MouseEvent): boolean;\n\n /**\n * Callback triggered when user clicks to create a freetext annotation.\n *\n * @param position - Scaled position where the click occurred.\n */\n onFreetextClick?(position: ScaledPosition): void;\n\n /**\n * Condition to check before image creation starts.\n *\n * @param event - mouse event associated with the click.\n * @returns - `True` if image creation should occur.\n */\n enableImageCreation?(event: MouseEvent): boolean;\n\n /**\n * Callback triggered when user clicks to create an image annotation.\n *\n * @param position - Scaled position where the click occurred.\n */\n onImageClick?(position: ScaledPosition): void;\n\n /**\n * Whether drawing mode is enabled.\n */\n enableDrawingMode?: boolean;\n\n /**\n * Callback triggered when a drawing is completed.\n *\n * @param dataUrl - The drawing as a PNG data URL.\n * @param position - Scaled position of the drawing on the page.\n * @param strokes - The stroke data for later editing.\n */\n onDrawingComplete?(dataUrl: string, position: ScaledPosition, strokes: DrawingStroke[]): void;\n\n /**\n * Callback triggered when drawing is cancelled.\n */\n onDrawingCancel?(): void;\n\n /**\n * Stroke color for drawing mode.\n * @default \"#000000\"\n */\n drawingStrokeColor?: string;\n\n /**\n * Stroke width for drawing mode.\n * @default 3\n */\n drawingStrokeWidth?: number;\n\n /**\n * The type of shape to create, or null if shape mode is not active.\n */\n enableShapeMode?: ShapeType | null;\n\n /**\n * Callback triggered when a shape is completed.\n *\n * @param position - Scaled position of the shape on the page.\n * @param shape - The shape data (type, color, width).\n */\n onShapeComplete?(position: ScaledPosition, shape: ShapeData): void;\n\n /**\n * Callback triggered when shape creation is cancelled.\n */\n onShapeCancel?(): void;\n\n /**\n * Stroke color for shape mode.\n * @default \"#000000\"\n */\n shapeStrokeColor?: string;\n\n /**\n * Stroke width for shape mode.\n * @default 2\n */\n shapeStrokeWidth?: number;\n\n /**\n * Theme configuration for the PDF viewer.\n * Controls container background color and PDF page color inversion for dark mode.\n *\n * @default { mode: \"light\" }\n */\n theme?: PdfHighlighterTheme;\n}\n\n/**\n * This is a large-scale PDF viewer component designed to facilitate\n * highlighting. It should be used as a child to a {@link PdfLoader} to ensure\n * proper document loading. This does not itself render any highlights, but\n * instead its child should be the container component for each individual\n * highlight. This component will be provided appropriate HighlightContext for\n * rendering.\n *\n * @category Component\n */\nexport const PdfHighlighter = ({\n highlights,\n onScrollAway,\n pdfScaleValue = DEFAULT_SCALE_VALUE,\n onZoomChange,\n initialPage,\n onPageChange,\n onSelection: onSelectionFinished,\n onCreateGhostHighlight,\n onRemoveGhostHighlight,\n selectionTip,\n enableAreaSelection,\n areaSelectionMode,\n mouseSelectionStyle,\n pdfDocument,\n children,\n textSelectionColor = DEFAULT_TEXT_SELECTION_COLOR,\n utilsRef,\n style,\n enableFreetextCreation,\n onFreetextClick,\n enableImageCreation,\n onImageClick,\n enableDrawingMode,\n onDrawingComplete,\n onDrawingCancel,\n drawingStrokeColor: drawingStrokeColorProp,\n drawingStrokeWidth = 3,\n enableShapeMode,\n onShapeComplete,\n onShapeCancel,\n shapeStrokeColor: shapeStrokeColorProp,\n shapeStrokeWidth = 2,\n theme: userTheme,\n}: PdfHighlighterProps) => {\n // Resolve theme with defaults based on mode\n const resolvedTheme = useMemo(() => {\n const mode = userTheme?.mode ?? \"light\";\n const defaults = mode === \"light\" ? defaultLightTheme : defaultDarkTheme;\n return { ...defaults, ...userTheme, mode };\n }, [userTheme]);\n\n // Draw-time recolor map (lector-ported). Dark mode only; null = render\n // document colors as-is. Photos are preserved (the wrapper skips drawImage),\n // unlike PDF.js `pageColors`. String key drives effect re-runs on a real\n // palette/mode change only.\n const recolorKey =\n resolvedTheme.mode === \"dark\"\n ? `${resolvedTheme.darkModeColors.background}|${resolvedTheme.darkModeColors.foreground}`\n : \"light\";\n const recolorMap = useMemo(\n () =>\n resolvedTheme.mode === \"dark\"\n ? createDarkModeColorMap(resolvedTheme.darkModeColors)\n : null,\n // recolorKey captures the palette + mode; map identity is stable per key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [recolorKey],\n );\n // The patched page.render reads the live map from this ref, so toggling the\n // palette never needs re-patching — only a re-render (setDocument).\n const recolorMapRef = useRef(recolorMap);\n recolorMapRef.current = recolorMap;\n\n // Default drawing/shape ink follows the scheme: white on a dark page, black on\n // light, so strokes stay visible. An explicit prop always wins.\n const defaultStrokeColor = resolvedTheme.mode === \"dark\" ? \"#ffffff\" : \"#000000\";\n const drawingStrokeColor = drawingStrokeColorProp ?? defaultStrokeColor;\n const shapeStrokeColor = shapeStrokeColorProp ?? defaultStrokeColor;\n\n // State\n const [tip, setTip] = useState<Tip | null>(null);\n const [isViewerReady, setIsViewerReady] = useState(false);\n\n // Refs\n const containerNodeRef = useRef<HTMLDivElement | null>(null);\n const highlightBindingsRef = useRef<{ [page: number]: HighlightBindings }>(\n {},\n );\n const noteBindingsRef = useRef<{ [page: number]: HighlightBindings }>({});\n const highlightsRef = useRef(highlights);\n const childrenRef = useRef(children);\n const ghostHighlightRef = useRef<GhostHighlight | null>(null);\n const selectionRef = useRef<PdfSelection | null>(null);\n const scrolledToHighlightIdRef = useRef<string | null>(null);\n const isAreaSelectionInProgressRef = useRef(false);\n const isEditInProgressRef = useRef(false);\n const updateTipPositionRef = useRef(() => { });\n\n const eventBusRef = useRef<InstanceType<typeof EventBus>>(new EventBus());\n const linkServiceRef = useRef<InstanceType<typeof PDFLinkService>>(\n new PDFLinkService({\n eventBus: eventBusRef.current,\n externalLinkTarget: 2,\n }),\n );\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const renderRetryTimeoutsRef = useRef<Array<ReturnType<typeof setTimeout>>>(\n [],\n );\n const resumeScrollAwayTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const findControllerRef = useRef<InstanceType<typeof PDFFindController> | null>(null);\n const viewerRef = useRef<InstanceType<typeof PDFViewer> | null>(null);\n // Last document the viewer ran setDocument for (to tell first load from a\n // toggle) and the last (document + recolor) key actually rendered. The key\n // dedupes StrictMode's double-invoke: without it, two overlapping async\n // setDocument calls make pdf.js append the page list twice (a 12-page doc\n // shows 24 pages).\n const prevDocRef = useRef<PDFDocumentProxy | null>(null);\n const lastRenderKeyRef = useRef<string | null>(null);\n\n highlightsRef.current = highlights;\n childrenRef.current = children;\n\n // Initialise PDF Viewer\n useLayoutEffect(() => {\n if (!containerNodeRef.current) return;\n\n // Dedupe StrictMode's double-invoke (and any identical re-run): the same\n // document + recolor key must not call setDocument twice, or pdf.js renders\n // the page list twice. recolorKey changes on a real palette/scheme toggle.\n const renderKey = `${(pdfDocument as { fingerprints?: unknown }).fingerprints ?? pdfDocument.numPages}::${recolorKey}`;\n if (lastRenderKeyRef.current === renderKey) {\n console.log(\"[PdfHighlighter] skip duplicate setDocument\", renderKey);\n return;\n }\n\n findControllerRef.current =\n findControllerRef.current ||\n new PDFFindController({\n eventBus: eventBusRef.current,\n linkService: linkServiceRef.current,\n });\n\n viewerRef.current =\n viewerRef.current ||\n new PDFViewer({\n container: containerNodeRef.current,\n eventBus: eventBusRef.current,\n findController: findControllerRef.current,\n textLayerMode: 2,\n removePageBorders: true,\n linkService: linkServiceRef.current,\n });\n\n // Draw-time dark-mode recolor: patch the document's page.render to wrap the\n // canvas context with the live map (idempotent). Toggling the palette only\n // re-runs this effect (recolorKey dep) → setDocument re-renders the pages →\n // the patched render picks up the new map from recolorMapRef.\n patchPageRenderRecolor(pdfDocument, () => recolorMapRef.current);\n\n // Toggle vs first load: same document object means this re-run is a\n // palette/scheme toggle, where setDocument would otherwise reset both the\n // scroll position (resetView -> top) and the zoom (handleScaleValue\n // re-applies the pdfScaleValue prop on pagesinit). Capture the live scroll\n // (as a fraction of the scrollable range, so it survives any height change)\n // and the live zoom, then restore both once the rebuilt pages re-init.\n const isToggle = prevDocRef.current === pdfDocument;\n prevDocRef.current = pdfDocument;\n\n let scrollFraction = 0;\n let savedScaleValue: string | number | undefined;\n if (isToggle && viewerRef.current.container) {\n const c = viewerRef.current.container;\n const range = c.scrollHeight - c.clientHeight;\n scrollFraction = range > 0 ? c.scrollTop / range : 0;\n // currentScaleValue is \"auto\"/\"page-width\"/... or a numeric zoom; keep\n // whichever it is so a responsive scale stays responsive and an explicit\n // zoom stays exact. Fall back to the computed numeric scale.\n savedScaleValue =\n viewerRef.current.currentScaleValue ?? viewerRef.current.currentScale;\n }\n\n console.log(\"[PdfHighlighter] recolor active?\", {\n mode: resolvedTheme.mode,\n hasMap: !!recolorMapRef.current,\n palette: resolvedTheme.darkModeColors,\n isToggle,\n scrollFraction,\n savedScaleValue,\n });\n\n if (isToggle) {\n const restoreView = () => {\n eventBusRef.current.off(\"pagesinit\", restoreView);\n // Restore zoom first (this fires after handleScaleValue's pagesinit\n // handler, so it wins), then the scroll fraction in an rAF once the\n // re-scaled layout has settled and the scrollable range is final.\n if (savedScaleValue != null && viewerRef.current) {\n viewerRef.current.currentScaleValue = String(savedScaleValue);\n }\n requestAnimationFrame(() => {\n const c = viewerRef.current?.container;\n if (!c) return;\n const range = c.scrollHeight - c.clientHeight;\n c.scrollTop = scrollFraction * Math.max(0, range);\n console.log(\"[PdfHighlighter] restored view after toggle\", {\n scrollFraction,\n scrollTop: c.scrollTop,\n scaleValue: viewerRef.current?.currentScaleValue,\n });\n });\n };\n eventBusRef.current.on(\"pagesinit\", restoreView);\n }\n\n lastRenderKeyRef.current = renderKey;\n viewerRef.current.setDocument(pdfDocument);\n linkServiceRef.current.setDocument(pdfDocument);\n linkServiceRef.current.setViewer(viewerRef.current);\n setIsViewerReady(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pdfDocument, recolorKey]);\n\n // Initialise viewer event listeners\n useLayoutEffect(() => {\n if (!containerNodeRef.current) return;\n\n resizeObserverRef.current = new ResizeObserver(handleScaleValue);\n resizeObserverRef.current.observe(containerNodeRef.current);\n\n const doc = containerNodeRef.current.ownerDocument;\n\n eventBusRef.current.on(\"textlayerrendered\", scheduleRenderHighlightLayers);\n eventBusRef.current.on(\"pagerendered\", scheduleRenderHighlightLayers);\n eventBusRef.current.on(\"pagesinit\", handleScaleValue);\n doc.addEventListener(\"keydown\", handleKeyDown);\n doc.addEventListener(\"copy\", handleCopy, true);\n\n scheduleRenderHighlightLayers();\n\n return () => {\n eventBusRef.current.off(\"pagesinit\", handleScaleValue);\n eventBusRef.current.off(\"pagerendered\", scheduleRenderHighlightLayers);\n eventBusRef.current.off(\"textlayerrendered\", scheduleRenderHighlightLayers);\n doc.removeEventListener(\"keydown\", handleKeyDown);\n doc.removeEventListener(\"copy\", handleCopy, true);\n resizeObserverRef.current?.disconnect();\n renderRetryTimeoutsRef.current.forEach(clearTimeout);\n renderRetryTimeoutsRef.current = [];\n if (resumeScrollAwayTimeoutRef.current) {\n clearTimeout(resumeScrollAwayTimeoutRef.current);\n resumeScrollAwayTimeoutRef.current = null;\n }\n };\n }, [selectionTip, highlights, onSelectionFinished]);\n\n // Unmount every per-page highlight/note React root when the viewer unmounts —\n // these roots are mounted into PDF.js-owned DOM (outside React's tree) so they\n // are not torn down automatically and would otherwise leak.\n useEffect(() => {\n return () => {\n for (const binding of Object.values(highlightBindingsRef.current))\n unmountReactRoot(binding?.reactRoot);\n for (const binding of Object.values(noteBindingsRef.current))\n unmountReactRoot(binding?.reactRoot);\n };\n }, []);\n\n // Page tracking + deep-link / initial page. Registered after the listeners\n // effect so this `pagesinit` handler runs after handleScaleValue (scale set\n // before we scroll to the initial page). Refs keep the listeners stable so we\n // never resubscribe on prop changes.\n const onPageChangeRef = useRef(onPageChange);\n onPageChangeRef.current = onPageChange;\n const initialPageRef = useRef(initialPage);\n initialPageRef.current = initialPage;\n const initialPageAppliedRef = useRef(false);\n // While the initial page is being homed in, the viewer fires spurious\n // pagechanging events (1, target, 1, 2…) as scale/resize relayout settles.\n // This holds the target during that window so we (a) suppress URL writes that\n // would clobber the deep link and (b) re-assert the target until it sticks.\n const pendingInitialPageRef = useRef<number | null>(null);\n\n useEffect(() => {\n const eventBus = eventBusRef.current;\n\n const handlePageChanging = (evt: { pageNumber: number }) => {\n // Don't let the load-time bounce overwrite the deep-linked page.\n if (pendingInitialPageRef.current != null) return;\n onPageChangeRef.current?.(evt.pageNumber);\n };\n eventBus.on(\"pagechanging\", handlePageChanging);\n\n // First load only: home in on the requested initial page once pages exist.\n // Guarded so a dark-mode toggle (which also fires pagesinit) never re-jumps.\n const handlePagesInit = () => {\n if (initialPageAppliedRef.current) return;\n initialPageAppliedRef.current = true;\n const page = initialPageRef.current;\n console.log(\"[PdfHighlighter] pagesinit, initialPage =\", page);\n if (!page || page <= 1) return;\n\n pendingInitialPageRef.current = page;\n let tries = 0;\n let matches = 0;\n\n // Poll: scale/resize relayout keeps yanking the view back to the top for\n // a few hundred ms after load. Re-assert the target until the viewer\n // reports it as the current page for a few consecutive ticks, then\n // release and write the URL once. Bounded so we never spin forever.\n const tick = () => {\n const viewer = viewerRef.current;\n if (!viewer || pendingInitialPageRef.current == null) return;\n tries++;\n\n if (viewer.currentPageNumber === page) {\n matches++;\n } else {\n matches = 0;\n try {\n viewer.scrollPageIntoView({ pageNumber: page });\n } catch (e) {\n console.log(\"[PdfHighlighter] scrollPageIntoView threw\", e);\n }\n }\n\n if (matches >= 3) {\n pendingInitialPageRef.current = null;\n onPageChangeRef.current?.(page); // ensure URL = the resolved page\n console.log(\"[PdfHighlighter] initialPage settled at\", page);\n return;\n }\n if (tries > 40) {\n pendingInitialPageRef.current = null;\n console.log(\"[PdfHighlighter] initialPage gave up at\", page);\n return;\n }\n setTimeout(tick, 50);\n };\n setTimeout(tick, 0);\n };\n eventBus.on(\"pagesinit\", handlePagesInit);\n\n return () => {\n eventBus.off(\"pagechanging\", handlePageChanging);\n eventBus.off(\"pagesinit\", handlePagesInit);\n pendingInitialPageRef.current = null;\n };\n }, []);\n\n // Pinch-to-zoom: ctrl/⌘ + wheel (trackpad pinch) and two-finger touch. For\n // smoothness we DON'T re-rasterise per frame (that's janky). During the\n // gesture we only apply a GPU-composited CSS `transform: scale()` to the\n // .pdfViewer — buttery, anchored to the cursor / pinch centre via\n // transform-origin. When the gesture settles we commit ONCE: set the real\n // PDF.js scale (one crisp re-raster) and fix the scroll so the anchor stays\n // put. This is the lector approach adapted to PDFViewer.\n const onZoomChangeRef = useRef(onZoomChange);\n onZoomChangeRef.current = onZoomChange;\n\n useEffect(() => {\n const container = containerNodeRef.current;\n if (!container || !isViewerReady) return;\n\n const MIN_SCALE = 0.25;\n const MAX_SCALE = 10;\n const COMMIT_DELAY = 140; // ms of no wheel events before committing\n\n // Live gesture state. originX/Y are the anchor in CONTENT coords (fixed for\n // the whole gesture); anchorX/Y are the same point relative to the container.\n const g = {\n active: false,\n startScale: 1,\n startScrollLeft: 0,\n startScrollTop: 0,\n anchorX: 0,\n anchorY: 0,\n originX: 0,\n originY: 0,\n k: 1,\n raf: 0,\n commitTimer: 0 as number | ReturnType<typeof setTimeout>,\n };\n\n const pdfViewerEl = () =>\n container.querySelector(\".pdfViewer\") as HTMLElement | null;\n\n const clampK = (k: number) =>\n Math.min(\n MAX_SCALE / g.startScale,\n Math.max(MIN_SCALE / g.startScale, k),\n );\n\n const begin = (anchorX: number, anchorY: number) => {\n const viewer = viewerRef.current;\n const el = pdfViewerEl();\n if (!viewer || !el) return false;\n g.active = true;\n g.startScale = viewer.currentScale;\n g.startScrollLeft = container.scrollLeft;\n g.startScrollTop = container.scrollTop;\n g.anchorX = anchorX;\n g.anchorY = anchorY;\n g.originX = container.scrollLeft + anchorX;\n g.originY = container.scrollTop + anchorY;\n g.k = 1;\n // Scale about the anchor point (in the element's own coord space) so it\n // stays under the fingers; no layout/scroll change during the preview.\n el.style.transformOrigin = `${g.originX}px ${g.originY}px`;\n el.style.willChange = \"transform\";\n return true;\n };\n\n const previewRaf = () => {\n g.raf = 0;\n const el = pdfViewerEl();\n if (el) el.style.transform = `scale(${g.k})`;\n };\n const preview = () => {\n if (!g.raf) g.raf = requestAnimationFrame(previewRaf);\n };\n\n const commit = () => {\n if (!g.active) return;\n g.active = false;\n if (g.raf) {\n cancelAnimationFrame(g.raf);\n g.raf = 0;\n }\n const viewer = viewerRef.current;\n const el = pdfViewerEl();\n if (el) {\n el.style.transform = \"\";\n el.style.transformOrigin = \"\";\n el.style.willChange = \"\";\n }\n if (!viewer) return;\n const finalScale = Math.min(\n MAX_SCALE,\n Math.max(MIN_SCALE, g.startScale * g.k),\n );\n const ratio = finalScale / g.startScale;\n // Re-raster once at the new scale, then anchor the scroll so the content\n // point under the gesture stays in place.\n viewer.currentScaleValue = String(finalScale);\n container.scrollLeft = g.originX * ratio - g.anchorX;\n container.scrollTop = g.originY * ratio - g.anchorY;\n onZoomChangeRef.current?.(finalScale);\n console.log(\"[PdfHighlighter] pinch commit\", {\n from: g.startScale,\n to: finalScale,\n });\n };\n\n const scheduleCommit = () => {\n clearTimeout(g.commitTimer);\n g.commitTimer = setTimeout(commit, COMMIT_DELAY);\n };\n\n const handleWheel = (e: WheelEvent) => {\n if (!e.ctrlKey && !e.metaKey) return; // pinch / ctrl-scroll only\n e.preventDefault();\n const rect = container.getBoundingClientRect();\n const ax = e.clientX - rect.left;\n const ay = e.clientY - rect.top;\n if (!g.active && !begin(ax, ay)) return;\n // Exponential: each notch is a constant ratio. Up = zoom in.\n g.k = clampK(g.k * Math.exp(-e.deltaY * 0.01));\n preview();\n scheduleCommit(); // wheel has no end event — commit after it stops\n };\n container.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n // Two-finger touch pinch via pointer events.\n const pointers = new Map<number, PointerEvent>();\n let startDist = 0;\n const spread = () => {\n const [a, b] = [...pointers.values()];\n return Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n };\n const onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === \"touch\") pointers.set(e.pointerId, e);\n };\n const onPointerMove = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return;\n pointers.set(e.pointerId, e);\n if (pointers.size !== 2) return;\n e.preventDefault();\n const d = spread();\n const [a, b] = [...pointers.values()];\n const rect = container.getBoundingClientRect();\n const cx = (a.clientX + b.clientX) / 2 - rect.left;\n const cy = (a.clientY + b.clientY) / 2 - rect.top;\n if (!g.active) {\n startDist = d;\n if (!begin(cx, cy)) return;\n return;\n }\n g.k = clampK(d / startDist);\n preview();\n };\n const onPointerUp = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (pointers.size < 2 && g.active) {\n startDist = 0;\n commit(); // pinch ended — commit immediately\n }\n };\n container.addEventListener(\"pointerdown\", onPointerDown);\n container.addEventListener(\"pointermove\", onPointerMove, { passive: false });\n container.addEventListener(\"pointerup\", onPointerUp);\n container.addEventListener(\"pointercancel\", onPointerUp);\n\n return () => {\n container.removeEventListener(\"wheel\", handleWheel);\n container.removeEventListener(\"pointerdown\", onPointerDown);\n container.removeEventListener(\"pointermove\", onPointerMove);\n container.removeEventListener(\"pointerup\", onPointerUp);\n container.removeEventListener(\"pointercancel\", onPointerUp);\n clearTimeout(g.commitTimer);\n if (g.raf) cancelAnimationFrame(g.raf);\n const el = pdfViewerEl();\n if (el) {\n el.style.transform = \"\";\n el.style.transformOrigin = \"\";\n el.style.willChange = \"\";\n }\n };\n }, [isViewerReady]);\n\n // Event listeners\n const handleScroll = () => {\n onScrollAway && onScrollAway();\n scrolledToHighlightIdRef.current = null;\n renderHighlightLayers();\n };\n\n const handleMouseUp: PointerEventHandler = () => {\n const container = containerNodeRef.current;\n const selection = getWindow(container).getSelection();\n\n if (!container || !selection || selection.isCollapsed || !viewerRef.current)\n return;\n\n const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\n // Check the selected text is in the document, not the tip\n if (!range || !container.contains(range.commonAncestorContainer)) return;\n\n const pages = getPagesFromRange(range);\n if (!pages || pages.length === 0) return;\n\n const rects = getClientRects(range, pages);\n if (rects.length === 0) return;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: getBoundingRect(rects),\n rects,\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n const content: Content = {\n text: selection.toString().split(\"\\n\").join(\" \"), // Make all line breaks spaces\n };\n\n selectionRef.current = {\n content,\n type: \"text\",\n position: scaledPosition,\n makeGhostHighlight: () => {\n ghostHighlightRef.current = {\n content: content,\n type: \"text\",\n position: scaledPosition,\n };\n\n onCreateGhostHighlight &&\n onCreateGhostHighlight(ghostHighlightRef.current);\n clearTextSelection();\n renderHighlightLayers();\n return ghostHighlightRef.current;\n },\n };\n\n onSelectionFinished && onSelectionFinished(selectionRef.current);\n\n selectionTip &&\n setTip({ position: viewportPosition, content: selectionTip });\n };\n\n const handleMouseDown: PointerEventHandler = (event) => {\n if (\n !isHTMLElement(event.target) ||\n asElement(event.target).closest(\".PdfHighlighter__tip-container\") // Ignore selections on tip container\n ) {\n return;\n }\n\n // Check for freetext creation mode\n if (\n enableFreetextCreation?.(event.nativeEvent) &&\n onFreetextClick &&\n !isEditInProgressRef.current\n ) {\n const target = asElement(event.target);\n const page = getPageFromElement(target);\n\n if (page && viewerRef.current) {\n const pageRect = page.node.getBoundingClientRect();\n const clickX = event.clientX - pageRect.left;\n const clickY = event.clientY - pageRect.top;\n\n // Default size for new freetext note\n const defaultWidth = 150;\n const defaultHeight = 80;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: clickX,\n top: clickY,\n width: defaultWidth,\n height: defaultHeight,\n pageNumber: page.number,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n onFreetextClick(scaledPosition);\n return; // Don't proceed with normal mousedown handling\n }\n }\n\n // Check for image creation mode\n if (\n enableImageCreation?.(event.nativeEvent) &&\n onImageClick &&\n !isEditInProgressRef.current\n ) {\n const target = asElement(event.target);\n const page = getPageFromElement(target);\n\n if (page && viewerRef.current) {\n const pageRect = page.node.getBoundingClientRect();\n const clickX = event.clientX - pageRect.left;\n const clickY = event.clientY - pageRect.top;\n\n // Default size for new image\n const defaultWidth = 150;\n const defaultHeight = 100;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: clickX,\n top: clickY,\n width: defaultWidth,\n height: defaultHeight,\n pageNumber: page.number,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n onImageClick(scaledPosition);\n return; // Don't proceed with normal mousedown handling\n }\n }\n\n setTip(null);\n clearTextSelection(); // TODO: Check if clearing text selection only if not clicking on tip breaks anything.\n removeGhostHighlight();\n toggleEditInProgress(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.code === \"Escape\") {\n clearTextSelection();\n removeGhostHighlight();\n setTip(null);\n }\n };\n\n const handleCopy = (event: ClipboardEvent) => {\n const container = containerNodeRef.current;\n\n if (!container || !event.clipboardData) return;\n\n const target = event.target;\n const targetElement =\n target instanceof HTMLElement\n ? target\n : target instanceof Node\n ? target.parentElement\n : null;\n\n if (\n targetElement &&\n (targetElement.closest(\"input, textarea, [contenteditable='true']\") ||\n targetElement.closest(\".PdfHighlighter__tip-container\"))\n ) {\n return;\n }\n\n const selection = getWindow(container).getSelection();\n const range = selection?.rangeCount ? selection.getRangeAt(0) : null;\n\n if (\n !selection ||\n selection.isCollapsed ||\n !range ||\n !container.contains(range.commonAncestorContainer)\n ) {\n return;\n }\n\n const text =\n selectionRef.current?.content.text?.trim() ||\n selection.toString().split(\"\\n\").join(\" \").trim();\n\n if (!text) return;\n\n event.clipboardData.setData(\"text/plain\", text);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleScaleValue = () => {\n if (viewerRef.current) {\n viewerRef.current.currentScaleValue = pdfScaleValue.toString();\n }\n };\n\n // Render Highlight layers\n const renderHighlightLayer = (\n highlightBindings: HighlightBindings,\n pageNumber: number,\n shouldRenderHighlight?: (highlight: Highlight | GhostHighlight) => boolean,\n ) => {\n if (!viewerRef.current) return;\n\n highlightBindings.reactRoot.render(\n <PdfHighlighterContext.Provider value={pdfHighlighterUtils}>\n <HighlightLayer\n highlightsByPage={groupHighlightsByPage([\n ...highlightsRef.current,\n ghostHighlightRef.current,\n ])}\n pageNumber={pageNumber}\n scrolledToHighlightId={scrolledToHighlightIdRef.current}\n viewer={viewerRef.current}\n highlightBindings={highlightBindings}\n shouldRenderHighlight={shouldRenderHighlight}\n children={childrenRef.current}\n />\n </PdfHighlighterContext.Provider>,\n );\n };\n\n const renderHighlightLayers = () => {\n if (!viewerRef.current) return;\n\n for (let pageNumber = 1; pageNumber <= pdfDocument.numPages; pageNumber++) {\n const { textLayer } = viewerRef.current!.getPageView(pageNumber - 1) || {};\n if (!textLayer) continue; // Viewer hasn't rendered page yet\n\n const textLayerDiv = textLayer.div; // textLayer.div for version >=3.0 and textLayer.textLayerDiv otherwise.\n\n // Highlight layer lives inside the (volatile) text layer; reuse + re-attach\n // the same element/root rather than recreating it, so PDF.js page\n // re-renders don't make React render into an emptied container.\n const highlightBindings = ensurePersistentLayer(\n highlightBindingsRef.current,\n pageNumber,\n textLayerDiv,\n \"PdfHighlighter__highlight-layer\",\n );\n renderHighlightLayer(\n highlightBindings,\n pageNumber,\n (highlight) => !isFreetextHighlight(highlight),\n );\n\n // Note layer lives in the stable .page element.\n const pageEl = textLayerDiv.closest(\".page\") as HTMLElement | null;\n if (pageEl) {\n const noteBindings = ensurePersistentLayer(\n noteBindingsRef.current,\n pageNumber,\n pageEl,\n \"PdfHighlighter__note-layer\",\n );\n renderHighlightLayer(noteBindings, pageNumber, isFreetextHighlight);\n }\n }\n };\n\n const scheduleRenderHighlightLayers = () => {\n renderHighlightLayers();\n\n renderRetryTimeoutsRef.current.forEach(clearTimeout);\n renderRetryTimeoutsRef.current = [50, 150, 350, 750, 1200].map((delay) =>\n setTimeout(renderHighlightLayers, delay),\n );\n };\n\n const resumeScrollAwayListenerAfterNavigation = () => {\n const container = viewerRef.current?.container;\n if (!container) return;\n\n if (resumeScrollAwayTimeoutRef.current) {\n clearTimeout(resumeScrollAwayTimeoutRef.current);\n }\n\n resumeScrollAwayTimeoutRef.current = setTimeout(() => {\n container.addEventListener(\"scroll\", handleScroll, {\n once: true,\n });\n resumeScrollAwayTimeoutRef.current = null;\n }, 1200);\n };\n\n // Utils\n const isEditingOrHighlighting = () => {\n return (\n Boolean(selectionRef.current) ||\n Boolean(ghostHighlightRef.current) ||\n isAreaSelectionInProgressRef.current ||\n isEditInProgressRef.current\n );\n };\n\n const toggleEditInProgress = (flag?: boolean) => {\n if (flag !== undefined) {\n isEditInProgressRef.current = flag;\n } else {\n isEditInProgressRef.current = !isEditInProgressRef.current;\n }\n\n // Disable text selection\n if (viewerRef.current)\n viewerRef.current.viewer?.classList.toggle(\n \"PdfHighlighter--disable-selection\",\n isEditInProgressRef.current,\n );\n };\n\n const removeGhostHighlight = () => {\n if (onRemoveGhostHighlight && ghostHighlightRef.current)\n onRemoveGhostHighlight(ghostHighlightRef.current);\n ghostHighlightRef.current = null;\n renderHighlightLayers();\n };\n\n const clearTextSelection = () => {\n selectionRef.current = null;\n\n const container = containerNodeRef.current;\n const selection = getWindow(container).getSelection();\n if (!container || !selection) return;\n selection.removeAllRanges();\n };\n\n const scrollToHighlight = (highlight: Highlight) => {\n const { boundingRect, usePdfCoordinates } = highlight.position;\n const pageNumber = boundingRect.pageNumber;\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n // Remove scroll listener in case user auto-scrolls in succession.\n viewer.container.removeEventListener(\"scroll\", handleScroll);\n\n const pageView = viewer.getPageView(pageNumber - 1);\n const container = viewer.container;\n\n if (pageView?.div && pageView.viewport) {\n // Compute the absolute scroll target ourselves so we can animate it\n // smoothly (pdf.js scrollPageIntoView jumps instantly). The page div\n // already has its final offset even before the page is rasterised, so\n // jumping across many pages still lands in the right place.\n const topInPage = scaledToViewport(\n boundingRect,\n pageView.viewport,\n usePdfCoordinates,\n ).top;\n const pageRect = pageView.div.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const target =\n container.scrollTop +\n (pageRect.top - containerRect.top) +\n topInPage -\n SCROLL_MARGIN;\n // Respect the OS \"reduce motion\" setting (JS smooth scroll ignores CSS).\n const prefersReducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n container.scrollTo({\n top: Math.max(0, target),\n behavior: prefersReducedMotion ? \"auto\" : \"smooth\",\n });\n } else {\n // Fallback: page view not available — let pdf.js handle it.\n viewer.scrollPageIntoView({ pageNumber });\n }\n\n scrolledToHighlightIdRef.current = highlight.id;\n scheduleRenderHighlightLayers();\n\n resumeScrollAwayListenerAfterNavigation();\n };\n\n const dispatchFind = (\n query: string,\n findPrevious: boolean,\n options: PdfSearchOptions = {},\n type?: \"again\" | \"highlightallchange\",\n ) => {\n eventBusRef.current.dispatch(\"find\", {\n source: findControllerRef.current || viewerRef.current,\n type,\n query,\n phraseSearch: true,\n caseSensitive: options.caseSensitive ?? false,\n entireWord: options.entireWord ?? false,\n highlightAll: options.highlightAll ?? true,\n findPrevious,\n matchDiacritics: options.matchDiacritics ?? false,\n });\n };\n\n const currentSearchRef = useRef<{\n query: string;\n options: PdfSearchOptions;\n }>({\n query: \"\",\n options: {},\n });\n\n const search = (query: string, options: PdfSearchOptions = {}) => {\n currentSearchRef.current = { query, options };\n\n if (!query.trim()) {\n clearSearch();\n return;\n }\n\n dispatchFind(query, false, options);\n };\n\n const findNext = () => {\n const { query, options } = currentSearchRef.current;\n if (!query.trim()) return;\n dispatchFind(query, false, options, \"again\");\n };\n\n const findPrevious = () => {\n const { query, options } = currentSearchRef.current;\n if (!query.trim()) return;\n dispatchFind(query, true, options, \"again\");\n };\n\n const clearSearch = () => {\n currentSearchRef.current = { query: \"\", options: {} };\n eventBusRef.current.dispatch(\"findbarclose\", {\n source: findControllerRef.current || viewerRef.current,\n });\n };\n\n const pdfHighlighterUtils: PdfHighlighterUtils = {\n isEditingOrHighlighting,\n getCurrentSelection: () => selectionRef.current,\n getGhostHighlight: () => ghostHighlightRef.current,\n removeGhostHighlight,\n toggleEditInProgress,\n isEditInProgress: () => isEditInProgressRef.current,\n isSelectionInProgress: () =>\n Boolean(selectionRef.current) || isAreaSelectionInProgressRef.current,\n scrollToHighlight,\n getViewer: () => viewerRef.current,\n getTip: () => tip,\n setTip,\n updateTipPosition: updateTipPositionRef.current,\n getLinkService: () => linkServiceRef.current,\n getEventBus: () => eventBusRef.current,\n search,\n findNext,\n findPrevious,\n clearSearch,\n goToPage: (pageNumber: number) => {\n console.log('[PdfHighlighter] goToPage called with page:', pageNumber);\n const viewer = viewerRef.current;\n if (!viewer) {\n console.log('[PdfHighlighter] goToPage: viewer not available');\n return;\n }\n\n // Check if viewer container has a valid offsetParent (required by PDF.js)\n const container = viewer.container;\n console.log('[PdfHighlighter] goToPage: container:', !!container, 'offsetParent:', !!container?.offsetParent);\n if (container && container.offsetParent) {\n try {\n console.log('[PdfHighlighter] goToPage: using viewer.scrollPageIntoView');\n viewer.scrollPageIntoView({ pageNumber });\n return;\n } catch (e) {\n console.log('[PdfHighlighter] goToPage: scrollPageIntoView threw error:', e);\n // Fall through to DOM-based scrolling\n }\n }\n\n // Fallback: Use DOM-based scrolling when PDF.js scrollPageIntoView fails\n const pageElement = container?.querySelector(`.page[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n console.log('[PdfHighlighter] goToPage: DOM fallback, pageElement found:', !!pageElement);\n if (pageElement && container) {\n // PDF.js pages use position:absolute with inline style.top set to their position\n // Parse the inline style.top value to get the scroll target\n const styleTop = pageElement.style.top;\n const scrollTarget = styleTop ? parseInt(styleTop, 10) : 0;\n console.log('[PdfHighlighter] goToPage: style.top =', styleTop, 'scrollTarget =', scrollTarget);\n\n if (scrollTarget > 0) {\n container.scrollTo({\n top: scrollTarget,\n behavior: 'smooth'\n });\n } else {\n // Fallback: use getBoundingClientRect if style.top is not set\n const containerRect = container.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const scrollTop = container.scrollTop + (pageRect.top - containerRect.top);\n console.log('[PdfHighlighter] goToPage: using getBoundingClientRect, scrollTop =', scrollTop);\n container.scrollTo({\n top: scrollTop,\n behavior: 'smooth'\n });\n }\n } else {\n // Try document-wide search as last resort\n const docPageElement = document.querySelector(`.page[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n console.log('[PdfHighlighter] goToPage: document-wide search, found:', !!docPageElement);\n if (docPageElement) {\n // Parse inline style.top\n const styleTop = docPageElement.style.top;\n const scrollTarget = styleTop ? parseInt(styleTop, 10) : 0;\n const scrollContainer = docPageElement.closest('.pdfViewer')?.parentElement as HTMLElement | null;\n\n if (scrollContainer && scrollTarget > 0) {\n console.log('[PdfHighlighter] goToPage: document search, scrolling to style.top =', scrollTarget);\n scrollContainer.scrollTo({\n top: scrollTarget,\n behavior: 'smooth'\n });\n } else {\n // Last resort: use scrollIntoView\n console.log('[PdfHighlighter] goToPage: using scrollIntoView fallback');\n docPageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n }\n },\n };\n\n // Only call utilsRef once when viewer is ready to prevent infinite re-render loop\n const utilsRefCalledRef = useRef(false);\n useEffect(() => {\n if (viewerRef.current && !utilsRefCalledRef.current) {\n utilsRefCalledRef.current = true;\n utilsRef(pdfHighlighterUtils);\n }\n }, [pdfHighlighterUtils, utilsRef]);\n\n // Check if freetext or image mode is active for cursor styling\n const isFreetextMode = enableFreetextCreation?.({} as MouseEvent) ?? false;\n const isImageMode = enableImageCreation?.({} as MouseEvent) ?? false;\n\n // Build class name based on active modes and theme\n let containerClassName = 'PdfHighlighter';\n if (resolvedTheme.mode === 'dark') containerClassName += ' PdfHighlighter--dark';\n if (isFreetextMode) containerClassName += ' PdfHighlighter--freetext-mode';\n if (isImageMode) containerClassName += ' PdfHighlighter--image-mode';\n if (enableDrawingMode) containerClassName += ' PdfHighlighter--drawing-mode';\n if (enableShapeMode) containerClassName += ' PdfHighlighter--shape-mode';\n if (areaSelectionMode) containerClassName += ' PdfHighlighter--area-mode';\n\n // Merge user style with theme background\n const containerStyle: CSSProperties = {\n ...style,\n backgroundColor: resolvedTheme.containerBackgroundColor,\n };\n\n return (\n <PdfHighlighterContext.Provider value={pdfHighlighterUtils}>\n <div\n ref={containerNodeRef}\n className={containerClassName}\n onPointerDown={handleMouseDown}\n onPointerUp={handleMouseUp}\n style={containerStyle}\n >\n <div className=\"pdfViewer\" />\n <style>\n {`\n .textLayer ::selection {\n background: ${textSelectionColor};\n }\n .PdfHighlighter::-webkit-scrollbar-thumb {\n background-color: ${resolvedTheme.scrollbarThumbColor};\n }\n .PdfHighlighter::-webkit-scrollbar-track,\n .PdfHighlighter::-webkit-scrollbar-track-piece {\n background-color: ${resolvedTheme.scrollbarTrackColor};\n }\n `}\n </style>\n {isViewerReady && (\n <TipContainer\n viewer={viewerRef.current!}\n updateTipPositionRef={updateTipPositionRef}\n />\n )}\n {isViewerReady && enableAreaSelection && (\n <MouseSelection\n viewer={viewerRef.current!}\n onChange={(isVisible) =>\n (isAreaSelectionInProgressRef.current = isVisible)\n }\n enableAreaSelection={enableAreaSelection}\n style={mouseSelectionStyle}\n onDragStart={() => disableTextSelection(viewerRef.current!, true)}\n onReset={() => {\n selectionRef.current = null;\n disableTextSelection(viewerRef.current!, false);\n }}\n onSelection={(\n viewportPosition,\n scaledPosition,\n image,\n resetSelection,\n ) => {\n selectionRef.current = {\n content: { image },\n type: \"area\",\n position: scaledPosition,\n makeGhostHighlight: () => {\n ghostHighlightRef.current = {\n position: scaledPosition,\n type: \"area\",\n content: { image },\n };\n onCreateGhostHighlight &&\n onCreateGhostHighlight(ghostHighlightRef.current);\n resetSelection();\n renderHighlightLayers();\n return ghostHighlightRef.current;\n },\n };\n\n onSelectionFinished && onSelectionFinished(selectionRef.current);\n selectionTip &&\n setTip({ position: viewportPosition, content: selectionTip });\n }}\n />\n )}\n {isViewerReady && enableDrawingMode && (\n <DrawingCanvas\n isActive={enableDrawingMode}\n strokeColor={drawingStrokeColor}\n strokeWidth={drawingStrokeWidth}\n viewer={viewerRef.current!}\n onComplete={(dataUrl, position, strokes) => {\n console.log(\"PdfHighlighter: Drawing complete\");\n onDrawingComplete?.(dataUrl, position, strokes);\n }}\n onCancel={() => {\n console.log(\"PdfHighlighter: Drawing cancelled\");\n onDrawingCancel?.();\n }}\n />\n )}\n {isViewerReady && enableShapeMode && (\n <ShapeCanvas\n isActive={!!enableShapeMode}\n shapeType={enableShapeMode}\n strokeColor={shapeStrokeColor}\n strokeWidth={shapeStrokeWidth}\n viewer={viewerRef.current!}\n onComplete={(position, shape) => {\n console.log(\"PdfHighlighter: Shape complete\", shape.shapeType);\n onShapeComplete?.(position, shape);\n }}\n onCancel={() => {\n console.log(\"PdfHighlighter: Shape cancelled\");\n onShapeCancel?.();\n }}\n />\n )}\n </div>\n </PdfHighlighterContext.Provider>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport { GhostHighlight, Highlight, PdfSelection, Tip } from \"../types\";\nimport { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\n\n/**\n * Options for searching text in the PDF document.\n *\n * @category Type\n */\nexport type PdfSearchOptions = {\n /** If true, search is case-sensitive. */\n caseSensitive?: boolean;\n /** If true, only whole-word matches are returned. */\n entireWord?: boolean;\n /** If true, all matches are highlighted, not just the selected match. */\n highlightAll?: boolean;\n /** If true, diacritics must match exactly. */\n matchDiacritics?: boolean;\n};\n\n/**\n * A set of utilities for to control the behaviour of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport type PdfHighlighterUtils = {\n /**\n * Checks whether a selection is progress, a ghost highlight, or an edit.\n *\n * @returns - `true` if editing, ghost highlighting, or selecting.\n */\n isEditingOrHighlighting(): boolean;\n\n /**\n * Get currently selected area or text selection.\n *\n * @returns - current selection or `null` if no selection is being made.\n */\n getCurrentSelection(): PdfSelection | null;\n\n /**\n * Get the currently present ghost highlight.\n *\n * @return - currently present ghost highlight or `null` if non-existent.\n */\n getGhostHighlight(): GhostHighlight | null;\n\n /**\n * Cancel any ghost highlight.\n * The selected area will stay selected until the user clicks away.\n */\n removeGhostHighlight(): void;\n /**\n * If enabled, automatic tips/popups inside of a PdfHighlighter will be disabled.\n * Additional niceties will also be provided to prevent new highlights being made.\n */\n toggleEditInProgress(flag?: boolean): void;\n\n /**\n * Whether an AreaHighlight is being moved/resized, or a manual highlight edit has\n * been toggled.\n *\n * @returns - `true` if AreaHighlight is being edited or edit mode was set.\n */\n isEditInProgress(): boolean;\n\n /**\n * Whether a mouse selection or text selection is currently being performed.\n *\n * @returns - `true` if mouse selection or text selection is being performed.\n */\n isSelectionInProgress(): boolean;\n\n /**\n * Scroll to a highlight in this viewer.\n *\n * @param highlight - A highlight provided to the {@link PdfHighlighter} to\n * scroll to.\n */\n scrollToHighlight(highlight: Highlight): void;\n\n /**\n * Get a reference to the currently used instance of a PDF Viewer.\n *\n * @returns - The currently active PDF Viewer.\n */\n getViewer(): PDFViewer | null;\n\n /**\n * Get the currently active tip, if any.\n *\n * @returns - the currently active tip or `null` if inactive.\n */\n getTip(): Tip | null;\n\n /**\n * Set a tip to be displayed in the current PDF Viewer.\n *\n * @param tip - tip to be displayed, or `null` to hide any tip.\n */\n setTip(tip: Tip | null): void;\n\n /**\n * Callback to update any currently active tip's position. This will make sure\n * the tip is visible above/below its highlight.\n */\n updateTipPosition(): void;\n\n /**\n * Get the PDF link service instance for navigation.\n *\n * @returns - The currently active PDF link service or null.\n */\n getLinkService(): unknown | null;\n\n /**\n * Get the event bus instance for page events.\n *\n * @returns - The currently active event bus or null.\n */\n getEventBus(): unknown | null;\n\n /**\n * Navigate to a specific page number.\n *\n * @param pageNumber - 1-indexed page number to navigate to.\n */\n goToPage(pageNumber: number): void;\n\n /**\n * Search for text in the PDF document.\n *\n * @param query - Search text.\n * @param options - Search options.\n */\n search(query: string, options?: PdfSearchOptions): void;\n\n /**\n * Move to the next search result.\n */\n findNext(): void;\n\n /**\n * Move to the previous search result.\n */\n findPrevious(): void;\n\n /**\n * Clear active search highlights.\n */\n clearSearch(): void;\n};\n\nexport const PdfHighlighterContext = createContext<\n PdfHighlighterUtils | undefined\n>(undefined);\n\n/**\n * Custom hook for providing {@link PdfHighlighterUtils}. Must be used\n * within a child of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport const usePdfHighlighterContext = () => {\n const pdfHighlighterUtils = useContext(PdfHighlighterContext);\n\n if (pdfHighlighterUtils === undefined) {\n throw new Error(\n \"usePdfHighlighterContext must be used within PdfHighlighter!\",\n );\n }\n\n return pdfHighlighterUtils;\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport type { LTWHP, ViewportPosition, Scaled, ScaledPosition } from \"../types\";\nimport { PageViewport } from \"pdfjs-dist\";\n\ninterface WIDTH_HEIGHT {\n width: number;\n height: number;\n}\n\n/** @category Utilities */\nexport const viewportToScaled = (\n rect: LTWHP,\n { width, height }: WIDTH_HEIGHT,\n): Scaled => {\n return {\n x1: rect.left,\n y1: rect.top,\n\n x2: rect.left + rect.width,\n y2: rect.top + rect.height,\n\n width,\n height,\n\n pageNumber: rect.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const viewportPositionToScaled = (\n { boundingRect, rects }: ViewportPosition,\n viewer: PDFViewer,\n): ScaledPosition => {\n const pageNumber = boundingRect.pageNumber;\n const viewport = viewer.getPageView(pageNumber - 1).viewport; // Account for 1 indexing of PDF documents\n const scale = (obj: LTWHP) => viewportToScaled(obj, viewport);\n\n return {\n boundingRect: scale(boundingRect),\n rects: (rects || []).map(scale),\n };\n};\n\nconst pdfToViewport = (pdf: Scaled, viewport: PageViewport): LTWHP => {\n const [x1, y1, x2, y2] = viewport.convertToViewportRectangle([\n pdf.x1,\n pdf.y1,\n pdf.x2,\n pdf.y2,\n ]);\n\n return {\n left: Math.min(x1, x2),\n top: Math.min(y1, y2),\n\n width: Math.abs(x2 - x1),\n height: Math.abs(y1 - y2),\n\n pageNumber: pdf.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const scaledToViewport = (\n scaled: Scaled,\n viewport: PageViewport,\n usePdfCoordinates: boolean = false,\n): LTWHP => {\n const { width, height } = viewport;\n\n if (usePdfCoordinates) {\n return pdfToViewport(scaled, viewport);\n }\n\n if (scaled.x1 === undefined) {\n throw new Error(\"You are using old position format, please update\");\n }\n\n const x1 = (width * scaled.x1) / scaled.width;\n const y1 = (height * scaled.y1) / scaled.height;\n\n const x2 = (width * scaled.x2) / scaled.width;\n const y2 = (height * scaled.y2) / scaled.height;\n\n return {\n left: x1,\n top: y1,\n width: x2 - x1,\n height: y2 - y1,\n pageNumber: scaled.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const scaledPositionToViewport = (\n { boundingRect, rects, usePdfCoordinates }: ScaledPosition,\n viewer: PDFViewer,\n): ViewportPosition => {\n const pageNumber = boundingRect.pageNumber;\n const viewport = viewer.getPageView(pageNumber - 1).viewport; // Account for 1 indexing of PDF documents\n const scale = (obj: Scaled) =>\n scaledToViewport(obj, viewport, usePdfCoordinates);\n\n return {\n boundingRect: scale(boundingRect),\n rects: (rects || []).map(scale),\n };\n};\n","// Ported from @anaralabs/lector (lib/dark-mode.ts). Pure, self-contained.\n// Hue-preserving dark-mode recolor: flips perceived lightness onto a\n// background<->foreground ramp in OKLab while keeping hue/chroma, so red stays\n// red and blue links stay blue (unlike a CSS invert + hue-rotate).\n\nexport type ColorScheme = \"light\" | \"dark\";\n\nexport interface DarkModeColors {\n /** Replaces the white paper background. Any CSS hex/rgb color. */\n background?: string;\n /** Replaces black text and line art. Any CSS hex/rgb color. */\n foreground?: string;\n}\n\n/**\n * Maps a color from the original document to its dark-scheme equivalent.\n * Unparseable and fully-transparent colors are returned unchanged.\n */\nexport type RenderColorMap = (color: string) => string;\n\n// Darker warm gray (red >= green >= blue): easier on the eyes than a cool or\n// pure-black surface, and white paper maps onto it exactly.\nexport const DEFAULT_DARK_MODE_COLORS: Required<DarkModeColors> = {\n background: \"#141210\",\n foreground: \"#eae6e0\",\n};\n\ntype Rgba = [number, number, number, number];\ntype Lab = [number, number, number];\n\nconst NAMED_COLORS: Record<string, Rgba> = {\n white: [1, 1, 1, 1],\n black: [0, 0, 0, 1],\n transparent: [0, 0, 0, 0],\n};\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\nfunction parseColor(input: string): Rgba | null {\n const str = input.trim().toLowerCase();\n // hasOwn: a plain-object lookup would resolve \"constructor\"/\"__proto__\".\n const named = Object.hasOwn(NAMED_COLORS, str)\n ? NAMED_COLORS[str]\n : undefined;\n if (named) return named;\n\n if (str.startsWith(\"#\")) {\n const hex = str.slice(1);\n if (!/^[0-9a-f]{3,8}$/.test(hex)) return null;\n if (hex.length === 3 || hex.length === 4) {\n const r = Number.parseInt(hex[0]!, 16) / 15;\n const g = Number.parseInt(hex[1]!, 16) / 15;\n const b = Number.parseInt(hex[2]!, 16) / 15;\n const a = hex.length === 4 ? Number.parseInt(hex[3]!, 16) / 15 : 1;\n return [r, g, b, a];\n }\n if (hex.length === 6 || hex.length === 8) {\n const r = Number.parseInt(hex.slice(0, 2), 16) / 255;\n const g = Number.parseInt(hex.slice(2, 4), 16) / 255;\n const b = Number.parseInt(hex.slice(4, 6), 16) / 255;\n const a =\n hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n return null;\n }\n\n const fn = /^rgba?\\(([^)]+)\\)$/.exec(str);\n if (fn) {\n const parts = fn[1]!.split(/[,\\s/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const channel = (part: string) =>\n part.endsWith(\"%\")\n ? Number.parseFloat(part) / 100\n : Number.parseFloat(part) / 255;\n const alpha = (part: string) =>\n part.endsWith(\"%\")\n ? Number.parseFloat(part) / 100\n : Number.parseFloat(part);\n const r = channel(parts[0]!);\n const g = channel(parts[1]!);\n const b = channel(parts[2]!);\n const a = parts[3] !== undefined ? alpha(parts[3]) : 1;\n if (\n Number.isNaN(r) ||\n Number.isNaN(g) ||\n Number.isNaN(b) ||\n Number.isNaN(a)\n )\n return null;\n return [clamp01(r), clamp01(g), clamp01(b), clamp01(a)];\n }\n\n // Last resort for the rest of the CSS color grammar (named colors,\n // hsl()/oklch()/color-mix()/...): let the browser normalize it to a\n // hex/rgba serialization, then parse that.\n const normalized = normalizeCssColor(str);\n if (normalized !== null && normalized !== str) return parseColor(normalized);\n\n return null;\n}\n\nlet normalizeCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Normalizes any valid CSS color to its canvas fillStyle serialization\n * (\"#rrggbb\" or \"rgba(...)\"). Returns null for invalid colors (assigning\n * one leaves fillStyle unchanged, detected by priming with two different\n * values) and outside the DOM (SSR).\n */\nfunction normalizeCssColor(input: string): string | null {\n if (normalizeCtx === undefined) {\n normalizeCtx =\n typeof document === \"undefined\"\n ? null\n : document.createElement(\"canvas\").getContext(\"2d\", {\n willReadFrequently: true,\n });\n }\n const ctx = normalizeCtx;\n if (!ctx) return null;\n ctx.fillStyle = \"#000000\";\n ctx.fillStyle = input;\n const first = ctx.fillStyle;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillStyle = input;\n return first === ctx.fillStyle ? first : null;\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\n// sRGB <-> OKLab, reference implementation by Björn Ottosson (public domain).\nfunction rgbToOklab(r: number, g: number, b: number): Lab {\n const lr = srgbToLinear(r);\n const lg = srgbToLinear(g);\n const lb = srgbToLinear(b);\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\nfunction oklabToLinearRgb(L: number, a: number, b: number): Lab {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst GAMUT_EPSILON = 0.0005;\n\nfunction oklabToSrgbExact(L: number, a: number, b: number): Lab | null {\n const [lr, lg, lb] = oklabToLinearRgb(L, a, b);\n if (\n lr < -GAMUT_EPSILON ||\n lr > 1 + GAMUT_EPSILON ||\n lg < -GAMUT_EPSILON ||\n lg > 1 + GAMUT_EPSILON ||\n lb < -GAMUT_EPSILON ||\n lb > 1 + GAMUT_EPSILON\n ) {\n return null;\n }\n return [\n linearToSrgb(clamp01(lr)),\n linearToSrgb(clamp01(lg)),\n linearToSrgb(clamp01(lb)),\n ];\n}\n\n/** Reduce chroma until the color fits the sRGB gamut, then hard-clamp. */\nfunction oklabToSrgbGamutMapped(L: number, a: number, b: number): Lab {\n const exact = oklabToSrgbExact(L, a, b);\n if (exact) return exact;\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 12; i++) {\n const mid = (lo + hi) / 2;\n if (oklabToSrgbExact(L, a * mid, b * mid)) lo = mid;\n else hi = mid;\n }\n const [lr, lg, lb] = oklabToLinearRgb(L, a * lo, b * lo);\n return [\n linearToSrgb(clamp01(lr)),\n linearToSrgb(clamp01(lg)),\n linearToSrgb(clamp01(lb)),\n ];\n}\n\nfunction toHexByte(channel: number): string {\n return Math.round(clamp01(channel) * 255)\n .toString(16)\n .padStart(2, \"0\");\n}\n\nfunction toCssColor(r: number, g: number, b: number, a: number): string {\n const rgb = `#${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`;\n return a >= 1 ? rgb : `${rgb}${toHexByte(a)}`;\n}\n\n// Above this OKLab chroma a color fully keeps its own hue/chroma; below it,\n// it is progressively pulled onto the background<->foreground ramp so the\n// palette's tint applies to grays too.\nconst NEUTRAL_CHROMA_THRESHOLD = 0.04;\n\nconst COLOR_CACHE_MAX = 4096;\nconst mapInstances = new Map<string, RenderColorMap>();\n\n/**\n * Builds a memoized color map that flips perceived lightness onto the\n * background<->foreground ramp while preserving hue and chroma (OKLab).\n * Position on the ramp follows gamma-encoded BT.709 luma so saturated accents\n * move the way readers expect (red becomes pink, not cyan; blue links become\n * light blue). Neutrals land exactly on the ramp: white maps to `background`,\n * black to `foreground`, including the palette's tint.\n */\nexport function createDarkModeColorMap(colors?: DarkModeColors): RenderColorMap {\n const background = colors?.background ?? DEFAULT_DARK_MODE_COLORS.background;\n const foreground = colors?.foreground ?? DEFAULT_DARK_MODE_COLORS.foreground;\n const instanceKey = `${background}|${foreground}`;\n const existing = mapInstances.get(instanceKey);\n if (existing) {\n // LRU touch: keep palettes in active use away from the eviction end.\n mapInstances.delete(instanceKey);\n mapInstances.set(instanceKey, existing);\n return existing;\n }\n\n const bgRgba =\n parseColor(background) ?? parseColor(DEFAULT_DARK_MODE_COLORS.background)!;\n const fgRgba =\n parseColor(foreground) ?? parseColor(DEFAULT_DARK_MODE_COLORS.foreground)!;\n const bgLab = rgbToOklab(bgRgba[0], bgRgba[1], bgRgba[2]);\n const fgLab = rgbToOklab(fgRgba[0], fgRgba[1], fgRgba[2]);\n\n const cache = new Map<string, string>();\n // Exact poles: pure white/black must reproduce the palette strings verbatim\n // (no float round-tripping), so page backgrounds match CSS.\n const backgroundCss = toCssColor(bgRgba[0], bgRgba[1], bgRgba[2], 1);\n const foregroundCss = toCssColor(fgRgba[0], fgRgba[1], fgRgba[2], 1);\n const seedPoles = () => {\n for (const white of [\"#ffffff\", \"#fff\", \"white\"])\n cache.set(white, backgroundCss);\n for (const black of [\"#000000\", \"#000\", \"black\"])\n cache.set(black, foregroundCss);\n };\n seedPoles();\n\n const transform = (input: string): string => {\n const parsed = parseColor(input);\n if (!parsed || parsed[3] === 0) return input;\n const [r, g, b, alpha] = parsed;\n const [, labA, labB] = rgbToOklab(r, g, b);\n // Gamma-encoded BT.709 luma as ramp position: 0 = black, 1 = white.\n const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n const rampL = fgLab[0] + (bgLab[0] - fgLab[0]) * luma;\n const rampA = fgLab[1] + (bgLab[1] - fgLab[1]) * luma;\n const rampB = fgLab[2] + (bgLab[2] - fgLab[2]) * luma;\n const chroma = Math.hypot(labA, labB);\n const hueWeight = Math.min(1, chroma / NEUTRAL_CHROMA_THRESHOLD);\n const outA = rampA + (labA - rampA) * hueWeight;\n const outB = rampB + (labB - rampB) * hueWeight;\n const [sr, sg, sb] = oklabToSrgbGamutMapped(rampL, outA, outB);\n return toCssColor(sr, sg, sb, alpha);\n };\n\n const map: RenderColorMap = (input) => {\n const hit = cache.get(input);\n if (hit !== undefined) return hit;\n const out = transform(input);\n if (cache.size >= COLOR_CACHE_MAX) {\n cache.clear();\n seedPoles();\n }\n cache.set(input, out);\n return out;\n };\n\n // Evict the oldest palette instead of clearing: live components depend on\n // stable function identity per palette, and a wholesale clear would hand a\n // still-mounted consumer a new instance.\n if (mapInstances.size >= 16) {\n const oldest = mapInstances.keys().next().value;\n if (oldest !== undefined) mapInstances.delete(oldest);\n }\n mapInstances.set(instanceKey, map);\n return map;\n}\n","// Ported from @anaralabs/lector (lib/recolor-context.ts).\n// Recolors a 2D canvas context at draw time. Photos (drawImage) are left\n// untouched; only fills/strokes/gradients are mapped — so illustrations stay\n// recolored but real images keep their pixels.\n\nimport type { RenderColorMap } from \"./dark-mode\";\n\nconst RECOLOR_CLEANUP = Symbol(\"recolorCleanup\");\nconst RECOLOR_PAINTED = Symbol(\"recolorPainted\");\n\ntype RecolorableContext = CanvasRenderingContext2D & {\n [RECOLOR_CLEANUP]?: () => void;\n /** True once any draw on this context actually swapped a color. */\n [RECOLOR_PAINTED]?: boolean;\n};\n\ntype AnyFn = (this: CanvasRenderingContext2D, ...args: never[]) => unknown;\n\nconst FILL_METHODS = [\"fill\", \"fillRect\", \"fillText\"] as const;\nconst STROKE_METHODS = [\"stroke\", \"strokeRect\", \"strokeText\"] as const;\nconst GRADIENT_METHODS = [\n \"createLinearGradient\",\n \"createRadialGradient\",\n] as const;\n\n// NTSC weights — the same ones pdf.js's luminosity SVG filter uses.\nfunction ntscLuma(r: number, g: number, b: number): number {\n return 0.3 * r + 0.59 * g + 0.11 * b;\n}\n\nfunction parseHexLuma(color: string): number | null {\n if (!/^#[0-9a-f]{6}$/i.test(color)) return null;\n return ntscLuma(\n Number.parseInt(color.slice(1, 3), 16),\n Number.parseInt(color.slice(3, 5), 16),\n Number.parseInt(color.slice(5, 7), 16),\n );\n}\n\n/**\n * pdf.js composes a luminosity soft mask by drawing the mask canvas through a\n * luminosity SVG filter with `destination-in`: pixel luma BECOMES alpha. The\n * mask artwork was painted through the recolor map (white flipped to the dark\n * background and vice versa), so its luma — and therefore the mask's alpha —\n * would be inverted: visible content disappears, hidden content appears. This\n * produces a copy of the mask with the neutral luma ramp un-mapped for the\n * filter to consume.\n */\nfunction correctLuminosityMask(\n source: CanvasImageSource,\n mappedWhiteLuma: number,\n mappedBlackLuma: number,\n): HTMLCanvasElement | null {\n if (typeof document === \"undefined\") return null;\n if (\n !(\n typeof HTMLCanvasElement !== \"undefined\" &&\n source instanceof HTMLCanvasElement\n ) &&\n !(\n typeof OffscreenCanvas !== \"undefined\" &&\n source instanceof OffscreenCanvas\n )\n ) {\n return null;\n }\n const width = source.width;\n const height = source.height;\n if (!width || !height) return null;\n const span = mappedWhiteLuma - mappedBlackLuma;\n if (Math.abs(span) < 1) return null;\n\n const tmp = document.createElement(\"canvas\");\n tmp.width = width;\n tmp.height = height;\n const tmpCtx = tmp.getContext(\"2d\", { willReadFrequently: true });\n if (!tmpCtx) return null;\n tmpCtx.drawImage(source, 0, 0);\n let image: ImageData;\n try {\n image = tmpCtx.getImageData(0, 0, width, height);\n } catch {\n return null;\n }\n const data = image.data;\n for (let i = 0; i < data.length; i += 4) {\n const luma = ntscLuma(data[i]!, data[i + 1]!, data[i + 2]!);\n const t = (luma - mappedBlackLuma) / span;\n const gray = t <= 0 ? 0 : t >= 1 ? 255 : Math.round(t * 255);\n data[i] = data[i + 1] = data[i + 2] = gray;\n }\n tmpCtx.putImageData(image, 0, 0);\n return tmp;\n}\n\n/**\n * Recolors a 2D context at draw time: every fill/stroke whose style is a\n * string is painted with `map(style)` and the original style is restored right\n * after, so pdf.js readbacks always observe original-document colors and\n * nothing is ever mapped twice. Gradients are recolored per stop at creation.\n * `drawImage` and `putImageData` are deliberately untouched — photos keep\n * their pixels — with one exception: a drawImage that composes a luminosity\n * soft mask draws a luma-corrected copy so the recoloring doesn't invert the\n * mask's alpha.\n *\n * Returns a cleanup that restores the pristine context.\n */\nexport function applyContextRecolor(\n ctx: CanvasRenderingContext2D,\n map: RenderColorMap,\n): () => void {\n const target = ctx as RecolorableContext;\n // Re-wrapping replaces the previous map instead of stacking wrappers.\n target[RECOLOR_CLEANUP]?.();\n\n // Luma poles of the map's neutral ramp, in pixel space.\n const mappedWhiteLuma = parseHexLuma(map(\"#ffffff\"));\n const mappedBlackLuma = parseHexLuma(map(\"#000000\"));\n\n const withMaskCorrection = (original: AnyFn) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n if (\n mappedWhiteLuma !== null &&\n mappedBlackLuma !== null &&\n this.globalCompositeOperation === \"destination-in\" &&\n typeof this.filter === \"string\" &&\n this.filter.includes(\"luminosity\")\n ) {\n const source = args[0] as unknown as CanvasImageSource;\n const sourcePainted =\n ((typeof HTMLCanvasElement !== \"undefined\" &&\n source instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== \"undefined\" &&\n source instanceof OffscreenCanvas)) &&\n (source.getContext(\"2d\") as RecolorableContext | null)?.[\n RECOLOR_PAINTED\n ] === true;\n const corrected = sourcePainted\n ? correctLuminosityMask(source, mappedWhiteLuma, mappedBlackLuma)\n : null;\n if (corrected) {\n const next = [corrected, ...args.slice(1)] as never[];\n return original.apply(this, next);\n }\n }\n return original.apply(this, args);\n };\n\n const withMappedStyle = (\n original: AnyFn,\n styleProp: \"fillStyle\" | \"strokeStyle\",\n ) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n const style = this[styleProp];\n if (typeof style === \"string\") {\n const mapped = map(style);\n if (mapped !== style) {\n (this as RecolorableContext)[RECOLOR_PAINTED] = true;\n this[styleProp] = mapped;\n try {\n return original.apply(this, args);\n } finally {\n this[styleProp] = style;\n }\n }\n }\n return original.apply(this, args);\n };\n\n const withMappedStops = (original: AnyFn) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n const gradient = original.apply(this, args) as CanvasGradient;\n const addColorStop = gradient.addColorStop.bind(gradient);\n const context = this as RecolorableContext;\n gradient.addColorStop = (offset: number, color: string) => {\n const mapped = map(color);\n if (mapped !== color) context[RECOLOR_PAINTED] = true;\n addColorStop(offset, mapped);\n };\n return gradient;\n };\n\n const record = target as unknown as Record<string, unknown>;\n for (const name of FILL_METHODS)\n record[name] = withMappedStyle(target[name] as AnyFn, \"fillStyle\");\n for (const name of STROKE_METHODS)\n record[name] = withMappedStyle(target[name] as AnyFn, \"strokeStyle\");\n for (const name of GRADIENT_METHODS)\n record[name] = withMappedStops(target[name] as AnyFn);\n record.drawImage = withMaskCorrection(target.drawImage as AnyFn);\n\n const cleanup = () => {\n // A later applyContextRecolor call already replaced these wrappers.\n if (target[RECOLOR_CLEANUP] !== cleanup) return;\n for (const name of [\n ...FILL_METHODS,\n ...STROKE_METHODS,\n ...GRADIENT_METHODS,\n \"drawImage\",\n ])\n delete record[name];\n delete target[RECOLOR_CLEANUP];\n delete target[RECOLOR_PAINTED];\n };\n target[RECOLOR_CLEANUP] = cleanup;\n return cleanup;\n}\n\n/**\n * Removes any recolor wrapper installed on the context. For long-lived\n * contexts about to render in the light scheme.\n */\nexport function removeContextRecolor(ctx: CanvasRenderingContext2D): void {\n (ctx as RecolorableContext)[RECOLOR_CLEANUP]?.();\n}\n","import type { LTWHP } from \"../types\";\n\nconst getBoundingRect = (clientRects: Array<LTWHP>): LTWHP => {\n const rects = Array.from(clientRects).map((rect) => {\n const { left, top, width, height, pageNumber } = rect;\n\n const X0 = left;\n const X1 = left + width;\n\n const Y0 = top;\n const Y1 = top + height;\n\n return { X0, X1, Y0, Y1, pageNumber };\n });\n\n let firstPageNumber = Number.MAX_SAFE_INTEGER;\n\n rects.forEach((rect) => {\n firstPageNumber = Math.min(\n firstPageNumber,\n rect.pageNumber ?? firstPageNumber,\n );\n });\n\n const rectsWithSizeOnFirstPage = rects.filter(\n (rect) =>\n (rect.X0 > 0 || rect.X1 > 0 || rect.Y0 > 0 || rect.Y1 > 0) &&\n rect.pageNumber === firstPageNumber,\n );\n\n const optimal = rectsWithSizeOnFirstPage.reduce((res, rect) => {\n return {\n X0: Math.min(res.X0, rect.X0),\n X1: Math.max(res.X1, rect.X1),\n\n Y0: Math.min(res.Y0, rect.Y0),\n Y1: Math.max(res.Y1, rect.Y1),\n\n pageNumber: firstPageNumber,\n };\n }, rectsWithSizeOnFirstPage[0]);\n\n const { X0, X1, Y0, Y1, pageNumber } = optimal;\n\n return {\n left: X0,\n top: Y0,\n width: X1 - X0,\n height: Y1 - Y0,\n pageNumber,\n };\n};\n\nexport default getBoundingRect;\n","import type { LTWHP } from \"../types.js\";\n\nconst sort = (rects: Array<LTWHP>) =>\n rects.sort((A, B) => {\n const top = (A.pageNumber || 0) * A.top - (B.pageNumber || 0) * B.top;\n\n if (top === 0) {\n return A.left - B.left;\n }\n\n return top;\n });\n\nconst overlaps = (A: LTWHP, B: LTWHP) =>\n A.pageNumber === B.pageNumber &&\n A.left <= B.left &&\n B.left <= A.left + A.width;\n\nconst sameLine = (A: LTWHP, B: LTWHP, yMargin = 5) =>\n A.pageNumber === B.pageNumber &&\n Math.abs(A.top - B.top) < yMargin &&\n Math.abs(A.height - B.height) < yMargin;\n\nconst inside = (A: LTWHP, B: LTWHP) =>\n A.pageNumber === B.pageNumber &&\n A.top > B.top &&\n A.left > B.left &&\n A.top + A.height < B.top + B.height &&\n A.left + A.width < B.left + B.width;\n\nconst nextTo = (A: LTWHP, B: LTWHP, xMargin = 10) => {\n const Aright = A.left + A.width;\n const Bright = B.left + B.width;\n\n return (\n A.pageNumber === B.pageNumber &&\n A.left <= B.left &&\n Aright <= Bright &&\n B.left - Aright <= xMargin\n );\n};\n\nconst extendWidth = (A: LTWHP, B: LTWHP) => {\n // extend width of A to cover B\n A.width = Math.max(B.width - A.left + B.left, A.width);\n};\n\nconst optimizeClientRects = (clientRects: Array<LTWHP>): Array<LTWHP> => {\n const rects = sort(clientRects);\n\n const toRemove = new Set();\n\n const firstPass = rects.filter((rect) => {\n return rects.every((otherRect) => {\n return !inside(rect, otherRect);\n });\n });\n\n let passCount = 0;\n\n while (passCount <= 2) {\n firstPass.forEach((A) => {\n firstPass.forEach((B) => {\n if (A === B || toRemove.has(A) || toRemove.has(B)) {\n return;\n }\n\n if (!sameLine(A, B)) {\n return;\n }\n\n if (overlaps(A, B)) {\n extendWidth(A, B);\n A.height = Math.max(A.height, B.height);\n\n toRemove.add(B);\n }\n\n if (nextTo(A, B)) {\n extendWidth(A, B);\n\n toRemove.add(B);\n }\n });\n });\n passCount += 1;\n }\n\n return firstPass.filter((rect) => !toRemove.has(rect));\n};\n\nexport default optimizeClientRects;\n","import type { LTWHP, Page } from \"../types\";\n\nimport optimizeClientRects from \"./optimize-client-rects\";\n\nconst isClientRectInsidePageRect = (clientRect: DOMRect, pageRect: DOMRect) => {\n if (clientRect.top < pageRect.top) {\n return false;\n }\n if (clientRect.bottom > pageRect.bottom) {\n return false;\n }\n if (clientRect.right > pageRect.right) {\n return false;\n }\n if (clientRect.left < pageRect.left) {\n return false;\n }\n\n return true;\n};\n\nconst getClientRects = (\n range: Range,\n pages: Page[],\n shouldOptimize: boolean = true,\n): Array<LTWHP> => {\n const clientRects = Array.from(range.getClientRects());\n\n const rects: LTWHP[] = [];\n\n for (const clientRect of clientRects) {\n for (const page of pages) {\n const pageRect = page.node.getBoundingClientRect();\n\n if (\n isClientRectInsidePageRect(clientRect, pageRect) &&\n clientRect.width > 0 &&\n clientRect.height > 0 &&\n clientRect.width < pageRect.width &&\n clientRect.left > pageRect.left &&\n clientRect.height < pageRect.height\n ) {\n const highlightedRect = {\n top: clientRect.top + page.node.scrollTop - pageRect.top,\n left: clientRect.left + page.node.scrollLeft - pageRect.left,\n width: clientRect.width,\n height: clientRect.height,\n pageNumber: page.number,\n } as LTWHP;\n\n rects.push(highlightedRect);\n }\n }\n }\n\n return shouldOptimize ? optimizeClientRects(rects) : rects;\n};\n\nexport default getClientRects;\n","import { GhostHighlight, Highlight } from \"../types\";\n\ntype GroupedHighlights = {\n [pageNumber: number]: Array<Highlight | GhostHighlight>;\n};\n\nconst groupHighlightsByPage = (\n highlights: Array<Highlight | GhostHighlight | null>,\n): GroupedHighlights =>\n highlights.reduce<GroupedHighlights>((acc, highlight) => {\n if (!highlight) {\n return acc;\n }\n const pageNumbers = [\n highlight.position.boundingRect.pageNumber,\n ...highlight.position.rects.map((rect) => rect.pageNumber || 0),\n ];\n\n pageNumbers.forEach((pageNumber) => {\n acc[pageNumber] ||= [];\n const pageSpecificHighlight = {\n ...highlight,\n position: {\n ...highlight.position,\n rects: highlight.position.rects.filter(\n (rect) => pageNumber === rect.pageNumber,\n ),\n },\n };\n acc[pageNumber].push(pageSpecificHighlight);\n });\n\n return acc;\n }, {});\n\nexport default groupHighlightsByPage;\n","import { Page } from \"../types\";\n\nexport const getDocument = (elm: any): Document =>\n (elm || {}).ownerDocument || document;\n\nexport const getWindow = (elm: any): typeof window =>\n (getDocument(elm) || {}).defaultView || window;\n\nexport const isHTMLElement = (elm: any) =>\n elm instanceof HTMLElement || elm instanceof getWindow(elm).HTMLElement;\n\nexport const isHTMLCanvasElement = (elm: any) =>\n elm instanceof HTMLCanvasElement ||\n elm instanceof getWindow(elm).HTMLCanvasElement;\n\nexport const asElement = (x: any): HTMLElement => x;\n\nexport const getPageFromElement = (target: HTMLElement): Page | null => {\n const node = asElement(target.closest(\".page\"));\n\n if (!node || !isHTMLElement(node)) {\n return null;\n }\n\n const number = Number(asElement(node).dataset.pageNumber);\n\n return { node, number } as Page;\n};\n\nexport const getPagesFromRange = (range: Range): Page[] => {\n const startParentElement = range.startContainer.parentElement;\n const endParentElement = range.endContainer.parentElement;\n\n if (!isHTMLElement(startParentElement) || !isHTMLElement(endParentElement)) {\n return [] as Page[];\n }\n\n const startPage = getPageFromElement(asElement(startParentElement));\n const endPage = getPageFromElement(asElement(endParentElement));\n\n if (!startPage?.number || !endPage?.number) {\n return [] as Page[];\n }\n\n if (startPage.number === endPage.number) {\n return [startPage] as Page[];\n }\n\n if (startPage.number === endPage.number - 1) {\n return [startPage, endPage] as Page[];\n }\n\n const pages: Page[] = [];\n\n let currentPageNumber = startPage.number;\n\n const document = startPage.node.ownerDocument;\n\n while (currentPageNumber <= endPage.number) {\n const currentPage = getPageFromElement(\n document.querySelector(\n `[data-page-number='${currentPageNumber}'`,\n ) as HTMLElement,\n );\n if (currentPage) {\n pages.push(currentPage);\n }\n currentPageNumber++;\n }\n\n return pages as Page[];\n};\n\nexport const findOrCreateContainerLayer = (\n container: HTMLElement,\n className: string,\n) => {\n const doc = getDocument(container);\n let layer = container.querySelector(`.${className}`);\n\n // To ensure predictable zIndexing, wait until the pdfjs element has children.\n if (!layer && container.children.length) {\n layer = doc.createElement(\"div\");\n layer.className = className;\n container.appendChild(layer);\n }\n\n return layer;\n};\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport { DrawingStroke, ScaledPosition, ViewportPosition } from \"../types\";\n\nimport type { PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\n/**\n * The props type for {@link DrawingCanvas}.\n *\n * @category Component Properties\n */\nexport interface DrawingCanvasProps {\n /**\n * Whether drawing mode is active.\n */\n isActive: boolean;\n\n /**\n * Stroke color for drawing.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for drawing.\n * @default 3\n */\n strokeWidth?: number;\n\n /**\n * The PDF viewer instance.\n */\n viewer: InstanceType<typeof TPDFViewer>;\n\n /**\n * Callback when drawing is complete.\n *\n * @param dataUrl - The drawing as a PNG data URL.\n * @param position - Scaled position of the drawing on the page.\n * @param strokes - The stroke data for later editing.\n */\n onComplete: (dataUrl: string, position: ScaledPosition, strokes: DrawingStroke[]) => void;\n\n /**\n * Callback when drawing is cancelled.\n */\n onCancel: () => void;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface Stroke {\n points: Point[];\n color: string;\n width: number;\n}\n\n/**\n * A transparent overlay canvas for freehand drawing on PDF pages.\n * Supports mouse and touch input.\n *\n * @category Component\n */\nexport const DrawingCanvas = ({\n isActive,\n strokeColor = \"#000000\",\n strokeWidth = 3,\n viewer,\n onComplete,\n onCancel,\n}: DrawingCanvasProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [strokes, setStrokes] = useState<Stroke[]>([]);\n const [currentStroke, setCurrentStroke] = useState<Stroke | null>(null);\n const isDrawingRef = useRef(false);\n const [pageNumber, setPageNumber] = useState<number | null>(null);\n const [pageElement, setPageElement] = useState<HTMLElement | null>(null);\n\n // Find which page the user is drawing on\n const findPageFromPoint = useCallback(\n (clientX: number, clientY: number) => {\n if (!viewer) return null;\n\n for (let i = 0; i < viewer.pagesCount; i++) {\n const pageView = viewer.getPageView(i);\n if (!pageView?.div) continue;\n\n const rect = pageView.div.getBoundingClientRect();\n if (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n ) {\n return {\n pageNumber: i + 1,\n element: pageView.div as HTMLElement,\n rect,\n };\n }\n }\n return null;\n },\n [viewer]\n );\n\n // Redraw all strokes\n const redrawCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx || !canvas) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw all completed strokes with their own color/width\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n stroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n });\n\n // Draw current stroke with current color/width\n if (currentStroke && currentStroke.points.length >= 2) {\n ctx.strokeStyle = currentStroke.color;\n ctx.lineWidth = currentStroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(currentStroke.points[0].x, currentStroke.points[0].y);\n currentStroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n }\n }, [strokes, currentStroke]);\n\n // Redraw when strokes change\n useEffect(() => {\n redrawCanvas();\n }, [redrawCanvas]);\n\n // Handle mouse/touch down\n const handleStart = useCallback(\n (clientX: number, clientY: number) => {\n const pageInfo = findPageFromPoint(clientX, clientY);\n if (!pageInfo) return;\n\n console.log(\"DrawingCanvas: Started drawing on page\", pageInfo.pageNumber);\n\n // Set page context if not already set\n if (pageNumber === null) {\n setPageNumber(pageInfo.pageNumber);\n setPageElement(pageInfo.element);\n\n // Resize canvas to match page\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = pageInfo.rect.width;\n canvas.height = pageInfo.rect.height;\n canvas.style.left = `${pageInfo.rect.left}px`;\n canvas.style.top = `${pageInfo.rect.top}px`;\n }\n } else if (pageInfo.pageNumber !== pageNumber) {\n // User trying to draw on different page - ignore\n console.log(\"DrawingCanvas: Ignoring - different page\");\n return;\n }\n\n isDrawingRef.current = true;\n const pos = {\n x: clientX - pageInfo.rect.left,\n y: clientY - pageInfo.rect.top,\n };\n setCurrentStroke({ points: [pos], color: strokeColor, width: strokeWidth });\n },\n [pageNumber, findPageFromPoint, strokeColor, strokeWidth]\n );\n\n // Handle mouse/touch move\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDrawingRef.current || !pageElement) return;\n\n const rect = pageElement.getBoundingClientRect();\n const pos = {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n\n setCurrentStroke((prev) => {\n if (!prev) return null;\n return { ...prev, points: [...prev.points, pos] };\n });\n },\n [pageElement]\n );\n\n // Handle mouse/touch end\n const handleEnd = useCallback(() => {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n\n if (currentStroke && currentStroke.points.length >= 2) {\n setStrokes((prev) => [...prev, currentStroke]);\n }\n setCurrentStroke(null);\n }, [currentStroke]);\n\n // Mouse event handlers\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent) => {\n e.preventDefault();\n handleStart(e.clientX, e.clientY);\n },\n [handleStart]\n );\n\n const handleMouseMove = useCallback(\n (e: ReactMouseEvent) => {\n handleMove(e.clientX, e.clientY);\n },\n [handleMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Touch event handlers\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleStart(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleStart]\n );\n\n const handleTouchMove = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Handle keyboard events\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n console.log(\"DrawingCanvas: Cancelled via Escape\");\n onCancel();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, onCancel]);\n\n // Clear drawing\n const handleClear = () => {\n console.log(\"DrawingCanvas: Cleared strokes\");\n setStrokes([]);\n setCurrentStroke(null);\n setPageNumber(null);\n setPageElement(null);\n };\n\n // Complete drawing\n const handleDone = () => {\n if (strokes.length === 0 || pageNumber === null || !pageElement || !viewer) {\n console.log(\"DrawingCanvas: No strokes to save\");\n onCancel();\n return;\n }\n\n console.log(\"DrawingCanvas: Completing drawing with\", strokes.length, \"strokes\");\n\n // Calculate bounding box of all strokes\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n strokes.forEach((stroke) => {\n stroke.points.forEach((point) => {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n });\n });\n\n // Find max stroke width for padding\n const maxStrokeWidth = Math.max(...strokes.map(s => s.width));\n const padding = maxStrokeWidth * 2;\n minX = Math.max(0, minX - padding);\n minY = Math.max(0, minY - padding);\n maxX = maxX + padding;\n maxY = maxY + padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n // Create a new canvas with just the drawing (cropped to bounding box)\n const outputCanvas = document.createElement(\"canvas\");\n outputCanvas.width = width;\n outputCanvas.height = height;\n const outputCtx = outputCanvas.getContext(\"2d\");\n\n if (!outputCtx) {\n console.error(\"DrawingCanvas: Could not get output canvas context\");\n onCancel();\n return;\n }\n\n // Draw all strokes offset by bounding box origin, using per-stroke color/width\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n outputCtx.strokeStyle = stroke.color;\n outputCtx.lineWidth = stroke.width;\n outputCtx.lineCap = \"round\";\n outputCtx.lineJoin = \"round\";\n\n outputCtx.beginPath();\n outputCtx.moveTo(stroke.points[0].x - minX, stroke.points[0].y - minY);\n stroke.points.slice(1).forEach((point) => {\n outputCtx.lineTo(point.x - minX, point.y - minY);\n });\n outputCtx.stroke();\n });\n\n const dataUrl = outputCanvas.toDataURL(\"image/png\");\n\n // Create viewport position\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: minX,\n top: minY,\n width: width,\n height: height,\n pageNumber: pageNumber,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n // Normalize strokes relative to bounding box for storage\n const normalizedStrokes: DrawingStroke[] = strokes.map((stroke) => ({\n ...stroke,\n points: stroke.points.map((point) => ({\n x: point.x - minX,\n y: point.y - minY,\n })),\n }));\n\n console.log(\"DrawingCanvas: Created drawing at position\", scaledPosition);\n onComplete(dataUrl, scaledPosition, normalizedStrokes);\n\n // Reset state\n setStrokes([]);\n setCurrentStroke(null);\n setPageNumber(null);\n setPageElement(null);\n };\n\n if (!isActive) return null;\n\n return (\n <>\n <canvas\n ref={canvasRef}\n className=\"DrawingCanvas\"\n style={{\n width: pageElement ? pageElement.getBoundingClientRect().width : \"100%\",\n height: pageElement ? pageElement.getBoundingClientRect().height : \"100%\",\n position: \"fixed\",\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n />\n <div className=\"DrawingCanvas__controls\">\n <button\n type=\"button\"\n className=\"DrawingCanvas__clearButton\"\n onClick={handleClear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"DrawingCanvas__cancelButton\"\n onClick={onCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"DrawingCanvas__doneButton\"\n onClick={handleDone}\n >\n Done\n </button>\n </div>\n </>\n );\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport React, { ReactNode } from \"react\";\nimport {\n HighlightContainerUtils,\n HighlightContext,\n} from \"../contexts/HighlightContext\";\nimport { scaledPositionToViewport, viewportToScaled } from \"../lib/coordinates\";\nimport screenshot from \"../lib/screenshot\";\nimport {\n GhostHighlight,\n Highlight,\n HighlightBindings,\n LTWH,\n LTWHP,\n ViewportHighlight,\n} from \"../types\";\n\nconst EMPTY_ID = \"empty-id\";\n\n/**\n * The props type for {@link HighlightLayer}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface HighlightLayerProps {\n /**\n * Highlights and GhostHighlights organised by page number.\n */\n highlightsByPage: { [pageNumber: number]: Array<Highlight | GhostHighlight> };\n\n /**\n * The page number of the PDF document to highlight (1 indexed).\n */\n pageNumber: number;\n\n /**\n * ID of the highlight that the parent PDF Highlighter is trying to autoscroll to.\n */\n scrolledToHighlightId?: string | null;\n\n /**\n * The PDFViewer instance containing the HighlightLayer\n */\n viewer: PDFViewer;\n\n /**\n * Group of DOM refs for all the highlights on this layer.\n */\n highlightBindings: HighlightBindings;\n\n /**\n * The Highlight container that should be used to render highlights for this layer.\n * It will be given appropriate context for a single highlight, allowing it to render\n * a single {@link TextHighlight}, {@link AreaHighlight}, etc., in the correct place.\n */\n children: ReactNode;\n\n /**\n * Optional predicate for splitting highlights across multiple DOM layers.\n */\n shouldRenderHighlight?(highlight: Highlight | GhostHighlight): boolean;\n}\n\n/**\n * A component responsible for managing all the highlights and ghost highlights\n * for a single page of a PDF document. It does not render each highlight\n * but it provides context for a highlight container to do so.\n * Its rendering should be controlled by a {@link PdfHighlighter}.\n *\n * @category Component\n * @internal\n */\nexport const HighlightLayer = ({\n highlightsByPage,\n pageNumber,\n scrolledToHighlightId,\n viewer,\n highlightBindings,\n children,\n shouldRenderHighlight,\n}: HighlightLayerProps) => {\n const currentHighlights = (highlightsByPage[pageNumber] || []).filter(\n (highlight) => shouldRenderHighlight?.(highlight) ?? true,\n );\n\n return (\n <div>\n {currentHighlights.map((highlight, index) => {\n const viewportHighlight: ViewportHighlight = {\n ...highlight,\n id: \"id\" in highlight ? highlight.id : EMPTY_ID, // Give Empty ID to GhostHighlight\n position: scaledPositionToViewport(highlight.position, viewer),\n };\n\n const isScrolledTo = Boolean(\n scrolledToHighlightId === viewportHighlight.id,\n );\n\n const highlightUtils: HighlightContainerUtils = {\n highlight: viewportHighlight,\n viewportToScaled: (rect: LTWHP) => {\n const viewport = viewer.getPageView(\n (rect.pageNumber || pageNumber) - 1, // Convert to 0 index\n ).viewport;\n\n return viewportToScaled(rect, viewport);\n },\n screenshot: (boundingRect: LTWH) =>\n screenshot(boundingRect, pageNumber, viewer),\n isScrolledTo: isScrolledTo,\n highlightBindings,\n };\n\n return (\n <HighlightContext.Provider value={highlightUtils} key={index}>\n {children}\n </HighlightContext.Provider>\n );\n })}\n </div>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport {\n Highlight,\n HighlightBindings,\n LTWH,\n LTWHP,\n Scaled,\n ViewportHighlight,\n} from \"../types\";\n\n/**\n * A set of utilities for rendering highlights. Designed to be used within a\n * highlight container.\n *\n * @category Context\n */\nexport type HighlightContainerUtils<T extends Highlight = Highlight> = {\n /**\n * The highlight being rendered at this component.\n */\n highlight: ViewportHighlight<T>;\n\n /**\n * Convert a Viewport rectangle to a scaled rectangle. Can be used\n * for storing and updating area selection highlights, for example.\n *\n * @returns - Scaled/display agnostic rectangle.\n */\n viewportToScaled(rect: LTWHP): Scaled;\n\n /**\n * Capture a PNG data url of a viewport rectangle.\n *\n * @returns - PNG data url. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs\n */\n screenshot(position: LTWH): string;\n\n /**\n * Whether the highlight has been autoscrolled to.\n */\n isScrolledTo: boolean;\n\n /**\n * All the DOM refs for the highlights shared on the same page\n * as `highlight`\n */\n highlightBindings: HighlightBindings;\n};\n\nexport const HighlightContext = createContext<\n HighlightContainerUtils | undefined\n>(undefined);\n\n/**\n * Custom hook for providing {@link HighlightContainerUtils}. Must be used\n * within a child of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport const useHighlightContainerContext = <\n T extends Highlight = Highlight,\n>() => {\n const highlightContainerUtils = useContext(HighlightContext);\n\n if (highlightContainerUtils === undefined) {\n throw new Error(\n \"useHighlightContainerContext must be used within a child of PdfHighlighter!\",\n );\n }\n\n return highlightContainerUtils as HighlightContainerUtils<T>;\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport type { LTWH } from \"../types\";\nimport { isHTMLCanvasElement } from \"./pdfjs-dom\";\n\nconst getAreaAsPng = (canvas: HTMLCanvasElement, position: LTWH): string => {\n const { left, top, width, height } = position;\n\n const doc = canvas ? canvas.ownerDocument : null;\n // @TODO: cache this?\n const newCanvas = doc && doc.createElement(\"canvas\");\n\n if (!newCanvas || !isHTMLCanvasElement(newCanvas)) {\n return \"\";\n }\n\n newCanvas.width = width;\n newCanvas.height = height;\n\n const newCanvasContext = newCanvas.getContext(\"2d\");\n\n if (!newCanvasContext || !canvas) {\n return \"\";\n }\n\n const dpr: number = window.devicePixelRatio;\n\n newCanvasContext.drawImage(\n canvas,\n left * dpr,\n top * dpr,\n width * dpr,\n height * dpr,\n 0,\n 0,\n width,\n height,\n );\n\n return newCanvas.toDataURL(\"image/png\");\n};\n\nconst screenshot = (position: LTWH, pageNumber: number, viewer: PDFViewer) => {\n return getAreaAsPng(viewer.getPageView(pageNumber - 1).canvas, position);\n};\n\nexport default screenshot;\n","import React, { CSSProperties, useEffect, useRef, useState } from \"react\";\n\nimport { asElement, getPageFromElement, isHTMLElement } from \"../lib/pdfjs-dom\";\n\nimport { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport screenshot from \"../lib/screenshot\";\nimport type { LTWH, LTWHP, ScaledPosition, ViewportPosition } from \"../types\";\n\ntype Coords = {\n x: number;\n y: number;\n};\n\nconst getBoundingRect = (start: Coords, end: Coords): LTWH => {\n return {\n left: Math.min(end.x, start.x),\n top: Math.min(end.y, start.y),\n\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y),\n };\n};\n\nconst getContainerCoords = (\n container: HTMLElement,\n pageX: number,\n pageY: number,\n) => {\n const containerBoundingRect = container.getBoundingClientRect();\n return {\n x: pageX - containerBoundingRect.left + container.scrollLeft,\n y: pageY - containerBoundingRect.top + container.scrollTop - window.scrollY,\n };\n};\n\n/**\n * The props type for {@link MouseSelection}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface MouseSelectionProps {\n /**\n * The PDFViewer instance containing this MouseSelection.\n */\n viewer: PDFViewer;\n\n /**\n * Callback triggered whenever the user stops dragging their mouse and a valid\n * mouse selection is made. In general, this will only be called if a mouse\n * selection is rendered.\n *\n * @param viewportPosition - viewport position of the mouse selection.\n * @param scaledPosition - scaled position of the mouse selection.\n * @param image - PNG screenshot of the mouse selection.\n * @param resetSelection - Callback to reset the current selection.\n * @param event - Mouse event associated with ending the selection.\n */\n onSelection?(\n viewportPosition: ViewportPosition,\n scaledPosition: ScaledPosition,\n image: string,\n resetSelection: () => void,\n event: MouseEvent,\n ): void;\n\n /**\n * Callback triggered whenever the current mouse selection is reset.\n * This includes when dragging ends but the selection is invalid.\n */\n onReset?(): void;\n\n /**\n * Callback triggered whenever a new valid mouse selection begins.\n *\n * @param event - mouse event associated with the new selection.\n */\n onDragStart?(event: MouseEvent): void;\n\n /**\n * Condition to check before any mouse selection starts.\n *\n * @param event - mouse event associated with the new selection.\n * @returns - `True` if mouse selection should start.\n */\n enableAreaSelection(event: MouseEvent): boolean;\n\n /**\n * Callback whenever the mouse selection area changes.\n *\n * @param isVisible - Whether the mouse selection is rendered (i.e., non-zero area)\n */\n onChange?(isVisible: boolean): void;\n\n /**\n * Optional style props for the mouse selection rectangle.\n */\n style?: CSSProperties;\n}\n\n/**\n * A component that enables the creation of rectangular and interactive mouse\n * selections within a given container. NOTE: This does not disable selection in\n * whatever container the component is placed in. That must be handled through\n * the component's events.\n *\n * @category Component\n * @internal\n */\nexport const MouseSelection = ({\n viewer,\n onSelection,\n onReset,\n onDragStart,\n enableAreaSelection,\n onChange,\n style,\n}: MouseSelectionProps) => {\n const [start, setStart] = useState<Coords | null>(null);\n const [end, setEnd] = useState<Coords | null>(null);\n const [locked, setLocked] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n // Needed in order to grab the page info of a mouse selection\n const startTargetRef = useRef<HTMLElement | null>(null);\n\n const reset = () => {\n onReset && onReset();\n setStart(null);\n setEnd(null);\n setLocked(false);\n };\n\n // Register event listeners onChange\n useEffect(() => {\n onChange && onChange(Boolean(start && end));\n if (!rootRef.current) return;\n\n // Should be the PdfHighlighter\n const container = asElement(rootRef.current.parentElement);\n\n const handleMouseUp = (event: MouseEvent) => {\n if (!start || !end || !startTargetRef.current) return;\n\n const boundingRect = getBoundingRect(start, end);\n\n // Check if the bounding rectangle has a minimum width and height\n // to prevent recording selections with 0 area\n const shouldEnd = boundingRect.width >= 1 && boundingRect.height >= 1;\n\n if (!container.contains(asElement(event.target)) || !shouldEnd) {\n reset();\n return;\n }\n\n setLocked(true);\n\n const page = getPageFromElement(startTargetRef.current);\n if (!page) return;\n\n const pageBoundingRect: LTWHP = {\n ...boundingRect,\n top: boundingRect.top - page.node.offsetTop,\n left: boundingRect.left - page.node.offsetLeft,\n pageNumber: page.number,\n };\n\n const viewportPosition: ViewportPosition = {\n boundingRect: pageBoundingRect,\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n const image = screenshot(\n pageBoundingRect,\n pageBoundingRect.pageNumber,\n viewer,\n );\n\n onSelection &&\n onSelection(viewportPosition, scaledPosition, image, reset, event);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n if (!rootRef.current || !start || locked) return;\n setEnd(getContainerCoords(container, event.pageX, event.pageY));\n };\n\n const handleMouseDown = (event: MouseEvent) => {\n const shouldStart = (event: MouseEvent) =>\n enableAreaSelection(event) &&\n isHTMLElement(event.target) &&\n Boolean(asElement(event.target).closest(\".page\"));\n\n // If the user clicks anywhere outside a tip, reset the selection\n const shouldReset = (event: MouseEvent) =>\n start &&\n !asElement(event.target).closest(\".PdfHighlighter__tip-container\");\n\n if (!shouldStart(event)) {\n if (shouldReset(event)) reset();\n return;\n }\n\n startTargetRef.current = asElement(event.target);\n onDragStart && onDragStart(event);\n setStart(getContainerCoords(container, event.pageX, event.pageY));\n setEnd(null);\n setLocked(false);\n };\n\n /**\n * Although we register the event listeners on the PdfHighlighter component, we encapsulate\n * them in this separate component to enhance maintainability and prevent unnecessary\n * rerenders of the PdfHighlighter itself. While synthetic events on PdfHighlighter would\n * be preferable, we need to register \"mouseup\" on the entire document anyway. Therefore,\n * we can't avoid using useEffect. We must re-register all events on state changes, as\n * custom event listeners may otherwise receive stale state.\n */\n container.addEventListener(\"mousemove\", handleMouseMove);\n container.addEventListener(\"mousedown\", handleMouseDown);\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n container.removeEventListener(\"mousemove\", handleMouseMove);\n container.removeEventListener(\"mousedown\", handleMouseDown);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [start, end, enableAreaSelection]);\n\n return (\n <div className=\"MouseSelection-container\" ref={rootRef}>\n {start && end && (\n <div\n className=\"MouseSelection\"\n style={{ ...getBoundingRect(start, end), ...style }}\n />\n )}\n </div>\n );\n};\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport { ShapeType, ShapeData, ScaledPosition, ViewportPosition } from \"../types\";\n\nimport type { PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\n/**\n * The props type for {@link ShapeCanvas}.\n *\n * @category Component Properties\n */\nexport interface ShapeCanvasProps {\n /**\n * Whether shape mode is active.\n */\n isActive: boolean;\n\n /**\n * The type of shape to create.\n */\n shapeType: ShapeType;\n\n /**\n * Stroke color for the shape.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for the shape.\n * @default 2\n */\n strokeWidth?: number;\n\n /**\n * The PDF viewer instance.\n */\n viewer: InstanceType<typeof TPDFViewer>;\n\n /**\n * Callback when shape creation is complete.\n *\n * @param position - Scaled position of the shape on the page.\n * @param shape - The shape data.\n */\n onComplete: (position: ScaledPosition, shape: ShapeData) => void;\n\n /**\n * Callback when shape creation is cancelled.\n */\n onCancel: () => void;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * A transparent overlay for creating shape annotations on PDF pages.\n * Supports mouse and touch input with click-and-drag to define shape bounds.\n *\n * @category Component\n */\nexport const ShapeCanvas = ({\n isActive,\n shapeType,\n strokeColor = \"#000000\",\n strokeWidth = 2,\n viewer,\n onComplete,\n onCancel,\n}: ShapeCanvasProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [startPoint, setStartPoint] = useState<Point | null>(null);\n const [currentPoint, setCurrentPoint] = useState<Point | null>(null);\n const [pageNumber, setPageNumber] = useState<number | null>(null);\n const [pageRect, setPageRect] = useState<DOMRect | null>(null);\n const isDrawingRef = useRef(false);\n\n // Find which page the user is drawing on\n const findPageFromPoint = useCallback(\n (clientX: number, clientY: number) => {\n if (!viewer) return null;\n\n for (let i = 0; i < viewer.pagesCount; i++) {\n const pageView = viewer.getPageView(i);\n if (!pageView?.div) continue;\n\n const rect = pageView.div.getBoundingClientRect();\n if (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n ) {\n return {\n pageNumber: i + 1,\n element: pageView.div as HTMLElement,\n rect,\n };\n }\n }\n return null;\n },\n [viewer]\n );\n\n // Handle mouse/touch down\n const handleStart = useCallback(\n (clientX: number, clientY: number) => {\n const pageInfo = findPageFromPoint(clientX, clientY);\n if (!pageInfo) return;\n\n console.log(\"ShapeCanvas: Started drawing on page\", pageInfo.pageNumber);\n\n setPageNumber(pageInfo.pageNumber);\n setPageRect(pageInfo.rect);\n\n isDrawingRef.current = true;\n const pos = {\n x: clientX - pageInfo.rect.left,\n y: clientY - pageInfo.rect.top,\n };\n setStartPoint(pos);\n setCurrentPoint(pos);\n },\n [findPageFromPoint]\n );\n\n // Handle mouse/touch move\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDrawingRef.current || !pageRect) return;\n\n const pos = {\n x: clientX - pageRect.left,\n y: clientY - pageRect.top,\n };\n setCurrentPoint(pos);\n },\n [pageRect]\n );\n\n // Handle mouse/touch end\n const handleEnd = useCallback(() => {\n if (!isDrawingRef.current || !startPoint || !currentPoint || pageNumber === null || !viewer) {\n isDrawingRef.current = false;\n setStartPoint(null);\n setCurrentPoint(null);\n return;\n }\n\n isDrawingRef.current = false;\n\n // Calculate bounding box\n const minX = Math.min(startPoint.x, currentPoint.x);\n const minY = Math.min(startPoint.y, currentPoint.y);\n const maxX = Math.max(startPoint.x, currentPoint.x);\n const maxY = Math.max(startPoint.y, currentPoint.y);\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n // Minimum size check\n if (width < 10 || height < 10) {\n console.log(\"ShapeCanvas: Shape too small, ignoring\");\n setStartPoint(null);\n setCurrentPoint(null);\n return;\n }\n\n console.log(\"ShapeCanvas: Creating shape\", shapeType, \"at\", { minX, minY, width, height });\n\n // Create viewport position\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: minX,\n top: minY,\n width: width,\n height: height,\n pageNumber: pageNumber,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n // For arrows, calculate start/end points as percentages within the bounding box\n let shapeData: ShapeData = {\n shapeType,\n strokeColor,\n strokeWidth,\n };\n\n if (shapeType === \"arrow\") {\n // Calculate start and end points relative to bounding box (0-1 range)\n shapeData.startPoint = {\n x: (startPoint.x - minX) / width,\n y: (startPoint.y - minY) / height,\n };\n shapeData.endPoint = {\n x: (currentPoint.x - minX) / width,\n y: (currentPoint.y - minY) / height,\n };\n console.log(\"ShapeCanvas: Arrow points\", shapeData.startPoint, \"->\", shapeData.endPoint);\n }\n\n console.log(\"ShapeCanvas: Created shape at position\", scaledPosition);\n onComplete(scaledPosition, shapeData);\n\n // Reset state\n setStartPoint(null);\n setCurrentPoint(null);\n setPageNumber(null);\n setPageRect(null);\n }, [startPoint, currentPoint, pageNumber, viewer, shapeType, strokeColor, strokeWidth, onComplete]);\n\n // Mouse event handlers\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent) => {\n e.preventDefault();\n handleStart(e.clientX, e.clientY);\n },\n [handleStart]\n );\n\n const handleMouseMove = useCallback(\n (e: ReactMouseEvent) => {\n handleMove(e.clientX, e.clientY);\n },\n [handleMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Touch event handlers\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleStart(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleStart]\n );\n\n const handleTouchMove = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Handle keyboard events\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n console.log(\"ShapeCanvas: Cancelled via Escape\");\n onCancel();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, onCancel]);\n\n // Render shape preview\n const renderShapePreview = () => {\n if (!startPoint || !currentPoint || !pageRect) return null;\n\n const minX = Math.min(startPoint.x, currentPoint.x);\n const minY = Math.min(startPoint.y, currentPoint.y);\n const width = Math.abs(currentPoint.x - startPoint.x);\n const height = Math.abs(currentPoint.y - startPoint.y);\n\n const svgStyle: React.CSSProperties = {\n position: \"fixed\",\n left: pageRect.left,\n top: pageRect.top,\n width: pageRect.width,\n height: pageRect.height,\n pointerEvents: \"none\",\n zIndex: 1001,\n };\n\n return (\n <svg style={svgStyle}>\n {shapeType === \"rectangle\" && (\n <rect\n x={minX}\n y={minY}\n width={width}\n height={height}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n )}\n {shapeType === \"circle\" && (\n <ellipse\n cx={minX + width / 2}\n cy={minY + height / 2}\n rx={width / 2}\n ry={height / 2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n )}\n {shapeType === \"arrow\" && (\n <>\n <defs>\n <marker\n id=\"shape-canvas-arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n </defs>\n <line\n x1={startPoint.x}\n y1={startPoint.y}\n x2={currentPoint.x}\n y2={currentPoint.y}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerEnd=\"url(#shape-canvas-arrowhead)\"\n />\n </>\n )}\n </svg>\n );\n };\n\n if (!isActive) return null;\n\n return (\n <>\n <div\n ref={containerRef}\n className=\"ShapeCanvas\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n />\n {renderShapePreview()}\n <div className=\"ShapeCanvas__controls\">\n <div className=\"ShapeCanvas__hint\">\n Click and drag to draw a {shapeType}. Press Escape to cancel.\n </div>\n <button\n type=\"button\"\n className=\"ShapeCanvas__cancelButton\"\n onClick={onCancel}\n >\n Cancel\n </button>\n </div>\n </>\n );\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport React, {\n MutableRefObject,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { usePdfHighlighterContext } from \"../contexts/PdfHighlighterContext\";\n\nconst clamp = (value: number, left: number, right: number) =>\n Math.min(Math.max(value, left), right);\n\nconst VERTICAL_PADDING = 5;\n\n/**\n * The props type for {@link TipContainer}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface TipContainerProps {\n /**\n * The PDFViewer instance containing the HighlightLayer\n */\n viewer: PDFViewer;\n\n /**\n * Reference to the callback to update the tip's position.This should be\n * managed by the PdfHighlighter.\n */\n updateTipPositionRef: MutableRefObject<() => void>;\n}\n\n/**\n * A component that manages rendering and placement of a tip around a highlight.\n * It does not automatically update the tip's position if it resizes.\n *\n * @category Component\n * @internal\n */\nexport const TipContainer = ({\n viewer,\n updateTipPositionRef,\n}: TipContainerProps) => {\n const [height, setHeight] = useState(0);\n const [width, setWidth] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const updatePosition = () => {\n if (!containerRef.current) return;\n const { offsetHeight, offsetWidth } = containerRef.current;\n setHeight(offsetHeight);\n setWidth(offsetWidth);\n };\n\n updateTipPositionRef.current = updatePosition;\n\n // useLayoutEffect ensures state is updated before re-render, preventing flickering\n useLayoutEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n const { getTip } = usePdfHighlighterContext();\n const currentTip = getTip();\n if (!currentTip) return null;\n\n // Destructuring current tip's position and content\n const { position, content } = currentTip;\n const { boundingRect } = position;\n const pageNumber = boundingRect.pageNumber;\n const pageNode = viewer.getPageView(pageNumber - 1).div; // Account for 1 indexing of pdf documents\n const pageBoundingClientRect = pageNode.getBoundingClientRect();\n const { left: pageLeft, width: pageWidth } = pageBoundingClientRect;\n\n // Calculate the position and dimensions of the tip container\n const scrollTop = viewer.container.scrollTop; // How much the viewer has been scrolled vertically\n const left = pageNode.offsetLeft + boundingRect.left + boundingRect.width / 2; // center tip over highlight\n const highlightTop = boundingRect.top + pageNode.offsetTop;\n const highlightBottom = highlightTop + boundingRect.height;\n\n // Determine whether the tip should be moved below the highlight\n const shouldMove = highlightTop - height - VERTICAL_PADDING < scrollTop; // Would the tip render beyond the top of the visible document?\n const top = shouldMove\n ? highlightBottom + VERTICAL_PADDING\n : highlightTop - height - VERTICAL_PADDING;\n\n // Ensure the tip stays within the left edge of the viewer and the right edge of the page\n const clampedLeft = clamp(left - width / 2, 0, pageLeft + pageWidth - width);\n\n return (\n <div\n className=\"PdfHighlighter__tip-container\"\n style={{\n top,\n left: clampedLeft,\n height: \"max-content\",\n width: \"max-content\",\n }}\n ref={containerRef}\n >\n {content}\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n copyTextToClipboard,\n extractTextFromHighlightRect,\n} from \"../lib/copy-highlight-content\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport type { ViewportHighlight } from \"../types\";\n\n/**\n * Style options for text highlight appearance.\n */\nexport interface TextHighlightStyle {\n highlightColor?: string;\n highlightStyle?: \"highlight\" | \"underline\" | \"strikethrough\";\n}\n\n/**\n * The props type for {@link TextHighlight}.\n *\n * @category Component Properties\n */\nexport interface TextHighlightProps {\n /**\n * Highlight to render over text.\n */\n highlight: ViewportHighlight;\n\n /**\n * Callback triggered whenever the user clicks on the part of a highlight.\n *\n * @param event - Mouse event associated with click.\n */\n onClick?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Callback triggered whenever the user enters the area of a text highlight.\n *\n * @param event - Mouse event associated with movement.\n */\n onMouseOver?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Callback triggered whenever the user leaves the area of a text highlight.\n *\n * @param event - Mouse event associated with movement.\n */\n onMouseOut?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Indicates whether the component is autoscrolled into view, affecting\n * default theming.\n */\n isScrolledTo: boolean;\n\n /**\n * Callback triggered whenever the user tries to open context menu on highlight.\n *\n * @param event - Mouse event associated with click.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Optional CSS styling applied to each TextHighlight part.\n */\n style?: CSSProperties;\n\n /**\n * Background/line color for the highlight.\n * Default: \"rgba(255, 226, 143, 1)\" (yellow)\n */\n highlightColor?: string;\n\n /**\n * Style mode for the highlight.\n * - \"highlight\": Solid background color (default)\n * - \"underline\": Line under the text\n * - \"strikethrough\": Line through the text\n */\n highlightStyle?: \"highlight\" | \"underline\" | \"strikethrough\";\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: TextHighlightStyle): void;\n\n /**\n * Text to copy for this highlight.\n */\n copyText?: string;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom style icon. Replaces the default palette icon.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n * Default: [\"rgba(255, 226, 143, 1)\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n colorPresets?: string[];\n}\n\n// Default icons\nconst DefaultStyleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\nconst DefaultCopyIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v12h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </svg>\n);\n\nconst DefaultCopiedIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n);\n\n// Highlight style icons\nconst HighlightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 14l3 3v5h6v-5l3-3V9H6v5zm5-12h2v3h-2V2zM3.5 5.875L4.914 4.46l2.12 2.122L5.622 8 3.5 5.875zm13.46.71l2.123-2.12 1.414 1.414L18.375 8l-1.414-1.414z\" />\n </svg>\n);\n\nconst UnderlineIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n </svg>\n);\n\nconst StrikethroughIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n </svg>\n);\n\n// Default color presets\nconst DEFAULT_COLOR_PRESETS = [\n \"rgba(255, 226, 143, 1)\", // Yellow (default)\n \"#ffcdd2\", // Light red\n \"#c8e6c9\", // Light green\n \"#bbdefb\", // Light blue\n \"#e1bee7\", // Light purple\n];\n\n/**\n * A component for displaying a highlighted text area.\n *\n * @category Component\n */\nexport const TextHighlight = ({\n highlight,\n onClick,\n onMouseOver,\n onMouseOut,\n isScrolledTo,\n onContextMenu,\n style,\n highlightColor = \"rgba(255, 226, 143, 1)\",\n highlightStyle = \"highlight\",\n onStyleChange,\n onDelete,\n styleIcon,\n deleteIcon,\n copyText,\n colorPresets = DEFAULT_COLOR_PRESETS,\n}: TextHighlightProps) => {\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const copyResetTimeoutRef = useRef<number | null>(null);\n\n useLayoutEffect(() => {\n if (containerRef.current) {\n setConfigLayer(findOrCreateHighlightConfigLayer(containerRef.current));\n }\n }, []);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n stylePanelRef.current &&\n !stylePanelRef.current.contains(e.target as Node)\n ) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n const highlightClass = isScrolledTo ? \"TextHighlight--scrolledTo\" : \"\";\n const { rects } = highlight.position;\n\n // Get the first rect to position the toolbar\n const firstRect = rects[0];\n\n // Build style class based on highlight style\n const getPartStyleClass = () => {\n switch (highlightStyle) {\n case \"underline\":\n return \"TextHighlight__part--underline\";\n case \"strikethrough\":\n return \"TextHighlight__part--strikethrough\";\n default:\n return \"\";\n }\n };\n\n // Build inline style for each part\n const getPartStyle = (rect: typeof firstRect): CSSProperties => {\n const baseStyle: CSSProperties = { ...rect, ...style };\n\n if (highlightStyle === \"highlight\") {\n // --hl-fill-alpha (set to <100% in dark mode by PdfHighlighter.css) makes\n // the fill translucent so the light recolored text stays readable, while\n // the element stays fully opaque so the border ring isn't dimmed. Light\n // mode leaves the var unset → 100% → the original opaque color.\n baseStyle.backgroundColor = `color-mix(in srgb, ${highlightColor} var(--hl-fill-alpha, 100%), transparent)`;\n } else {\n // For underline and strikethrough, use the color for the line\n baseStyle.backgroundColor = \"transparent\";\n baseStyle.color = highlightColor;\n }\n\n return baseStyle;\n };\n\n const handleCopy = async (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const text =\n copyText ||\n highlight.content?.text ||\n (containerRef.current && firstRect\n ? extractTextFromHighlightRect(containerRef.current, firstRect)\n : \"\");\n\n await copyTextToClipboard(text);\n setIsCopied(true);\n\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n\n copyResetTimeoutRef.current = window.setTimeout(() => {\n setIsCopied(false);\n copyResetTimeoutRef.current = null;\n }, 1500);\n };\n\n return (\n <div\n className={`TextHighlight ${highlightClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) && firstRect &&\n createPortal(\n <div\n className=\"TextHighlight__toolbar-wrapper\"\n style={{\n position: \"absolute\",\n left: firstRect.left,\n top: firstRect.top - 28,\n paddingBottom: 12,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div\n className={`TextHighlight__toolbar ${isHovered || isScrolledTo || isStylePanelOpen ? \"TextHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <button\n className=\"TextHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change style\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n )}\n <button\n className=\"TextHighlight__copy-button\"\n onClick={handleCopy}\n title={isCopied ? \"Copied\" : \"Copy text\"}\n type=\"button\"\n >\n {isCopied ? <DefaultCopiedIcon /> : <DefaultCopyIcon />}\n </button>\n {onDelete && (\n <button\n className=\"TextHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Style Panel - inside wrapper */}\n {isStylePanelOpen && onStyleChange && (\n <div\n className=\"TextHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"TextHighlight__style-row\">\n <label>Style</label>\n <div className=\"TextHighlight__style-buttons\">\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"highlight\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"highlight\" })\n }\n title=\"Highlight\"\n >\n <HighlightIcon />\n </button>\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"underline\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"underline\" })\n }\n title=\"Underline\"\n >\n <UnderlineIcon />\n </button>\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"strikethrough\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"strikethrough\" })\n }\n title=\"Strikethrough\"\n >\n <StrikethroughIcon />\n </button>\n </div>\n </div>\n <div className=\"TextHighlight__style-row\">\n <label>Color</label>\n <div className=\"TextHighlight__color-options\">\n <div className=\"TextHighlight__color-presets\">\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`TextHighlight__color-preset ${highlightColor === c ? \"active\" : \"\"}`}\n style={{ backgroundColor: c }}\n onClick={() => onStyleChange({ highlightColor: c })}\n title={c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={highlightColor}\n onChange={(e) => {\n onStyleChange({ highlightColor: e.target.value });\n }}\n />\n </div>\n </div>\n </div>\n )}\n </div>,\n configLayer,\n )}\n\n <div\n className=\"TextHighlight__parts\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {rects.map((rect, index) => (\n <div\n onMouseOver={onMouseOver}\n onMouseOut={onMouseOut}\n onClick={onClick}\n key={index}\n style={getPartStyle(rect)}\n className={`TextHighlight__part ${getPartStyleClass()}`}\n />\n ))}\n </div>\n </div>\n );\n};\n","import type { LTWH } from \"../types\";\n\nconst intersects = (a: LTWH, b: LTWH) =>\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top;\n\nexport const copyTextToClipboard = async (text: string) => {\n if (!text) return;\n\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n};\n\nexport const extractTextFromHighlightRect = (\n anchor: HTMLElement,\n rect: LTWH,\n) => {\n const page = anchor.closest(\".page\") as HTMLElement | null;\n const textLayer = page?.querySelector(\".textLayer\");\n\n if (!page || !textLayer) return \"\";\n\n const pageRect = page.getBoundingClientRect();\n const targetRect: LTWH = {\n left: pageRect.left + rect.left,\n top: pageRect.top + rect.top,\n width: rect.width,\n height: rect.height,\n };\n\n const matches = Array.from(textLayer.querySelectorAll(\"span\"))\n .map((span) => {\n const spanRect = span.getBoundingClientRect();\n\n return {\n text: span.textContent || \"\",\n rect: {\n left: spanRect.left,\n top: spanRect.top,\n width: spanRect.width,\n height: spanRect.height,\n },\n };\n })\n .filter(({ text, rect }) => text.trim() && intersects(rect, targetRect))\n .sort((a, b) => {\n const lineDelta = a.rect.top - b.rect.top;\n return Math.abs(lineDelta) > 4 ? lineDelta : a.rect.left - b.rect.left;\n });\n\n return matches\n .map(({ text }) => text)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n};\n","import { getDocument } from \"./pdfjs-dom\";\n\nexport const findOrCreateHighlightConfigLayer = (anchor: HTMLElement) => {\n const pageLayer = anchor.closest(\".page\") as HTMLElement | null;\n\n if (!pageLayer) return null;\n\n const doc = getDocument(pageLayer);\n let layer = Array.from(pageLayer.children).find((child) =>\n child.classList.contains(\"PdfHighlighter__config-layer\"),\n ) as HTMLElement | undefined;\n\n if (!layer) {\n layer = doc.createElement(\"div\");\n layer.className = \"PdfHighlighter__config-layer\";\n pageLayer.appendChild(layer);\n }\n\n return layer;\n};\n","import React, { ReactNode, useRef } from \"react\";\nimport { usePdfHighlighterContext } from \"../contexts/PdfHighlighterContext\";\nimport { Tip } from \"../types\";\nimport { MouseMonitor } from \"./MouseMonitor\";\n\n/**\n * The props type for {@link MonitoredHighlightContainer}.\n *\n * @category Component Properties\n */\nexport interface MonitoredHighlightContainerProps {\n /**\n * A callback triggered whenever the mouse hovers over a highlight.\n */\n onMouseEnter?(): void;\n\n /**\n * What tip to automatically display whenever a mouse hovers over a highlight.\n * The tip will persist even as the user puts their mouse over it and not the\n * highlight, but will disappear once it no longer hovers both.\n */\n highlightTip?: Tip;\n\n /**\n * A callback triggered whenever the mouse completely moves out from both the\n * highlight (children) and any highlightTip.\n */\n onMouseLeave?(): void;\n\n /**\n * Component to monitor mouse activity over. This should be a highlight within the {@link PdfHighlighter}.\n */\n children: ReactNode;\n}\n\n/**\n * A container for a highlight component that monitors whether a mouse is over a\n * highlight and over some secondary highlight tip. It will display the tip\n * whenever the mouse is over the highlight and it will hide the tip only when\n * the mouse has left the highlight AND the tip.\n *\n * @category Component\n */\nexport const MonitoredHighlightContainer = ({\n onMouseEnter,\n highlightTip,\n onMouseLeave,\n children,\n}: MonitoredHighlightContainerProps) => {\n const mouseInRef = useRef(false); // Whether the mouse is over the child (highlight)\n\n const { setTip, isEditingOrHighlighting } = usePdfHighlighterContext();\n\n return (\n <div\n onMouseEnter={() => {\n mouseInRef.current = true;\n onMouseEnter && onMouseEnter();\n\n if (isEditingOrHighlighting()) return;\n\n if (highlightTip) {\n // MouseMonitor the highlightTip to prevent it from disappearing if the mouse is over it and not the highlight.\n const monitoredHighlightTip = (\n <MouseMonitor\n onMoveAway={() => {\n // The event will keep triggering if the mouse is not on the highlightTip,\n // but don't do anything if the mouse is over the highlight.\n if (mouseInRef.current) {\n return;\n }\n\n setTip(null);\n onMouseLeave && onMouseLeave();\n }}\n paddingX={60}\n paddingY={30}\n >\n {highlightTip.content}\n </MouseMonitor>\n );\n\n setTip({\n position: highlightTip.position,\n content: monitoredHighlightTip,\n });\n }\n }}\n onMouseLeave={() => {\n mouseInRef.current = false;\n\n // Trigger onMouseLeave if no highlightTip exists\n !highlightTip && onMouseLeave && onMouseLeave();\n }}\n >\n {children}\n </div>\n );\n};\n","import React, { ReactNode, useEffect, useRef } from \"react\";\n\n/**\n * The props type for {@link MouseMonitor}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface MouseMonitorProps {\n /**\n * Callback triggered whenever the mouse moves not within the bounds of the\n * child component. This will keep triggering as long as the component is\n * rendered.\n */\n onMoveAway(): void;\n\n /**\n * X padding in pixels for the container to monitor mouse activity in.\n */\n paddingX: number;\n\n /**\n * Y padding in pixels for the container to monitor mouse activity in.\n */\n paddingY: number;\n\n /**\n * Component over which mouse activity is monitored.\n */\n children: ReactNode;\n}\n\n/**\n * A component that monitors mouse movements over a child and invisible padded area.\n *\n * @category Component\n * @internal\n */\nexport const MouseMonitor = ({\n onMoveAway,\n paddingX,\n paddingY,\n children,\n}: MouseMonitorProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = (event: MouseEvent) => {\n if (!containerRef.current) return;\n\n const { clientX, clientY } = event;\n const { left, top, width, height } =\n containerRef.current.getBoundingClientRect();\n\n const inBoundsX =\n clientX > left - paddingX && clientX < left + width + paddingX;\n const inBoundsY =\n clientY > top - paddingY && clientY < top + height + paddingY;\n\n if (!(inBoundsX && inBoundsY)) {\n onMoveAway();\n }\n };\n\n useEffect(() => {\n // TODO: Maybe optimise or throttle?\n document.addEventListener(\"mousemove\", onMouseMove);\n\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n };\n }, []);\n\n return <div ref={containerRef}>{children}</div>;\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n copyTextToClipboard,\n extractTextFromHighlightRect,\n} from \"../lib/copy-highlight-content\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport { Rnd } from \"react-rnd\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\n\n/**\n * Style options for area highlight appearance.\n */\nexport interface AreaHighlightStyle {\n highlightColor?: string;\n}\n\n/**\n * The props type for {@link AreaHighlight}.\n *\n * @category Component Properties\n */\nexport interface AreaHighlightProps {\n /**\n * The highlight to be rendered as an {@link AreaHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight area is either finished\n * being moved or resized.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view? By default, this will render the highlight red.\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area. This is useful for preventing the user\n * moving the highlight off the viewer/page. See [react-rnd docs](https://github.com/bokuweb/react-rnd).\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered whenever a context menu is opened on the highlight area.\n *\n * @param event - The mouse event associated with the context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called whenever the user tries to move or resize an {@link AreaHighlight}.\n */\n onEditStart?(): void;\n\n /**\n * Custom styling to be applied to the {@link AreaHighlight} component.\n */\n style?: CSSProperties;\n\n /**\n * Background color for the highlight.\n * Default: \"rgba(255, 226, 143, 1)\" (yellow)\n */\n highlightColor?: string;\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: AreaHighlightStyle): void;\n\n /**\n * Text to copy for this area highlight.\n */\n copyText?: string;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom style icon. Replaces the default palette icon.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n * Default: [\"rgba(255, 226, 143, 1)\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n colorPresets?: string[];\n}\n\n// Default icons\nconst DefaultStyleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\nconst DefaultCopyIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v12h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </svg>\n);\n\nconst DefaultCopiedIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n);\n\n// Default color presets\nconst DEFAULT_COLOR_PRESETS = [\n \"rgba(255, 226, 143, 1)\", // Yellow (default)\n \"#ffcdd2\", // Light red\n \"#c8e6c9\", // Light green\n \"#bbdefb\", // Light blue\n \"#e1bee7\", // Light purple\n];\n\n/**\n * Renders a resizeable and interactive rectangular area for a highlight.\n *\n * @category Component\n */\nexport const AreaHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n style,\n highlightColor = \"rgba(255, 226, 143, 1)\",\n onStyleChange,\n onDelete,\n styleIcon,\n deleteIcon,\n copyText,\n colorPresets = DEFAULT_COLOR_PRESETS,\n}: AreaHighlightProps) => {\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const copyResetTimeoutRef = useRef<number | null>(null);\n\n useLayoutEffect(() => {\n if (containerRef.current) {\n setConfigLayer(findOrCreateHighlightConfigLayer(containerRef.current));\n }\n }, []);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n stylePanelRef.current &&\n !stylePanelRef.current.contains(e.target as Node)\n ) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n const highlightClass = isScrolledTo ? \"AreaHighlight--scrolledTo\" : \"\";\n\n // Generate key based on position. This forces a remount (and a defaultpos update)\n // whenever highlight position changes (e.g., when updated, scale changes, etc.)\n // We don't use position as state because when updating Rnd this would happen and cause flickering:\n // User moves Rnd -> Rnd records new pos -> Rnd jumps back -> highlight updates -> Rnd re-renders at new pos\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n // Merge custom style with highlight color. --hl-fill-alpha (set <100% in dark\n // mode) keeps the fill translucent so underlying content stays visible while\n // the border ring stays crisp (no element opacity). Light mode = 100%.\n const mergedStyle: CSSProperties = {\n ...style,\n backgroundColor: `color-mix(in srgb, ${highlightColor} var(--hl-fill-alpha, 100%), transparent)`,\n };\n\n const handleCopy = async (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const text =\n copyText ||\n highlight.content?.text ||\n (containerRef.current\n ? extractTextFromHighlightRect(\n containerRef.current,\n highlight.position.boundingRect,\n )\n : \"\");\n\n await copyTextToClipboard(text);\n setIsCopied(true);\n\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n\n copyResetTimeoutRef.current = window.setTimeout(() => {\n setIsCopied(false);\n copyResetTimeoutRef.current = null;\n }, 1500);\n };\n\n return (\n <div\n className={`AreaHighlight ${highlightClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) &&\n createPortal(\n <div\n className=\"AreaHighlight__toolbar-wrapper\"\n style={{\n position: \"absolute\",\n left: highlight.position.boundingRect.left,\n top: highlight.position.boundingRect.top - 28,\n paddingBottom: 12,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div\n className={`AreaHighlight__toolbar ${isHovered || isScrolledTo || isStylePanelOpen ? \"AreaHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <button\n className=\"AreaHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change color\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n )}\n <button\n className=\"AreaHighlight__copy-button\"\n onClick={handleCopy}\n title={isCopied ? \"Copied\" : \"Copy text\"}\n type=\"button\"\n >\n {isCopied ? <DefaultCopiedIcon /> : <DefaultCopyIcon />}\n </button>\n {onDelete && (\n <button\n className=\"AreaHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Style Panel - inside wrapper */}\n {isStylePanelOpen && onStyleChange && (\n <div\n className=\"AreaHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"AreaHighlight__style-row\">\n <label>Color</label>\n <div className=\"AreaHighlight__color-options\">\n <div className=\"AreaHighlight__color-presets\">\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`AreaHighlight__color-preset ${highlightColor === c ? \"active\" : \"\"}`}\n style={{ backgroundColor: c }}\n onClick={() => onStyleChange({ highlightColor: c })}\n title={c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={highlightColor}\n onChange={(e) => {\n onStyleChange({ highlightColor: e.target.value });\n }}\n />\n </div>\n </div>\n </div>\n )}\n </div>,\n configLayer,\n )}\n\n <Rnd\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className=\"AreaHighlight__part\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n\n onChange && onChange(boundingRect);\n }}\n onResizeStop={(_mouseEvent, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber: getPageFromElement(ref)?.number || -1,\n };\n\n onChange && onChange(boundingRect);\n }}\n onDragStart={onEditStart}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width,\n height: highlight.position.boundingRect.height,\n }}\n key={key}\n bounds={bounds}\n // Prevevent any event clicks as clicking is already used for movement\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n style={mergedStyle}\n />\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n} from \"react\";\nimport { Rnd } from \"react-rnd\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\n\n/**\n * Style options for freetext highlight appearance.\n */\nexport interface FreetextStyle {\n color?: string;\n backgroundColor?: string;\n fontFamily?: string;\n fontSize?: string;\n}\n\n/**\n * The props type for {@link FreetextHighlight}.\n *\n * @category Component Properties\n */\nexport interface FreetextHighlightProps {\n /**\n * The highlight to be rendered as a {@link FreetextHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position changes (drag).\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * A callback triggered whenever the text content changes.\n *\n * @param text - The new text content.\n */\n onTextChange?(text: string): void;\n\n /**\n * A callback triggered whenever the style changes.\n *\n * @param style - The new style options.\n */\n onStyleChange?(style: FreetextStyle): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or text edit).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Text color.\n */\n color?: string;\n\n /**\n * Background color.\n */\n backgroundColor?: string;\n\n /**\n * Font family.\n */\n fontFamily?: string;\n\n /**\n * Font size (e.g., \"14px\").\n */\n fontSize?: string;\n\n /**\n * Custom drag icon. Receives default icon as child if not provided.\n */\n dragIcon?: ReactNode;\n\n /**\n * Custom edit icon. Receives default icon as child if not provided.\n */\n editIcon?: ReactNode;\n\n /**\n * Custom style/settings icon. Receives default icon as child if not provided.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom background color presets for the style panel.\n * Default: [\"#ffffc8\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n backgroundColorPresets?: string[];\n\n /**\n * Custom text color presets for the style panel.\n * Default: [\"#333333\", \"#d32f2f\", \"#1976d2\", \"#388e3c\", \"#7b1fa2\"]\n */\n textColorPresets?: string[];\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Render the note as a compact marker until opened.\n */\n compact?: boolean;\n\n /**\n * Size of the compact marker in pixels.\n */\n compactSize?: number;\n\n /**\n * Custom compact marker icon.\n */\n compactIcon?: ReactNode;\n}\n\n/**\n * Renders a draggable, editable freetext annotation.\n *\n * @category Component\n */\n// Default icons\nconst DefaultDragIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"6\" r=\"2\" />\n <circle cx=\"16\" cy=\"6\" r=\"2\" />\n <circle cx=\"8\" cy=\"12\" r=\"2\" />\n <circle cx=\"16\" cy=\"12\" r=\"2\" />\n <circle cx=\"8\" cy=\"18\" r=\"2\" />\n <circle cx=\"16\" cy=\"18\" r=\"2\" />\n </svg>\n);\n\nconst DefaultEditIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\" />\n </svg>\n);\n\nconst DefaultStyleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\nconst DefaultCompactIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 3h9l5 5v13H6V3zm8 1.5V9h4.5L14 4.5zM8 12h8v1.5H8V12zm0 3h8v1.5H8V15zm0 3h5v1.5H8V18z\" />\n </svg>\n);\n\nconst DefaultCollapseIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7 10v2h10v-2H7zm-2-7h14c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2zm0 2v14h14V5H5z\" />\n </svg>\n);\n\n// Default color presets\nconst DEFAULT_BACKGROUND_PRESETS = [\"transparent\", \"#ffffc8\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"];\nconst DEFAULT_TEXT_PRESETS = [\"#333333\", \"#d32f2f\", \"#1976d2\", \"#388e3c\", \"#7b1fa2\"];\n\nexport const FreetextHighlight = ({\n highlight,\n onChange,\n onTextChange,\n onStyleChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n color = \"#333333\",\n backgroundColor = \"#ffffc8\",\n fontFamily = \"inherit\",\n fontSize = \"14px\",\n dragIcon,\n editIcon,\n styleIcon,\n backgroundColorPresets = DEFAULT_BACKGROUND_PRESETS,\n textColorPresets = DEFAULT_TEXT_PRESETS,\n onDelete,\n deleteIcon,\n compact = false,\n compactSize = 32,\n compactIcon,\n}: FreetextHighlightProps) => {\n const [isEditing, setIsEditing] = useState(false);\n const [isExpanded, setIsExpanded] = useState(!compact);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [text, setText] = useState(highlight.content?.text || \"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n\n // Sync text with highlight content when it changes externally\n useEffect(() => {\n setText(highlight.content?.text || \"\");\n }, [highlight.content?.text]);\n\n useEffect(() => {\n setIsExpanded(!compact);\n setIsStylePanelOpen(false);\n if (!compact) {\n setIsEditing(false);\n }\n }, [compact]);\n\n // Focus textarea when entering edit mode\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n }\n }, [isEditing]);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (stylePanelRef.current && !stylePanelRef.current.contains(e.target as Node)) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n const highlightClass = isScrolledTo ? \"FreetextHighlight--scrolledTo\" : \"\";\n const editingClass = isEditing ? \"FreetextHighlight--editing\" : \"\";\n const compactClass = compact ? \"FreetextHighlight--compact\" : \"\";\n const isCompactCollapsed = compact && !isExpanded && !isEditing && !isStylePanelOpen;\n const collapsedClass = isCompactCollapsed ? \"FreetextHighlight--collapsed\" : \"\";\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}${isCompactCollapsed ? \"collapsed\" : \"expanded\"}`;\n\n const handleTextClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isEditing) {\n setIsExpanded(true);\n setIsEditing(true);\n onEditStart?.();\n }\n };\n\n const handleTextBlur = () => {\n if (isEditing) {\n setIsEditing(false);\n onTextChange?.(text);\n onEditEnd?.();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setText(highlight.content?.text || \"\");\n setIsEditing(false);\n onEditEnd?.();\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n setIsEditing(false);\n onTextChange?.(text);\n onEditEnd?.();\n }\n };\n\n const containerStyle: CSSProperties = {\n backgroundColor,\n color,\n fontFamily,\n fontSize,\n ...style,\n };\n\n return (\n <div\n className={`FreetextHighlight ${highlightClass} ${editingClass} ${compactClass} ${collapsedClass}`}\n onContextMenu={onContextMenu}\n >\n <Rnd\n className=\"FreetextHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n }}\n onDragStart={() => {\n if (!isEditing) {\n onEditStart?.();\n }\n }}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: isCompactCollapsed ? compactSize : highlight.position.boundingRect.width || 150,\n height: isCompactCollapsed ? compactSize : highlight.position.boundingRect.height || 80,\n }}\n minWidth={isCompactCollapsed ? compactSize : 100}\n minHeight={isCompactCollapsed ? compactSize : 50}\n key={key}\n bounds={bounds}\n enableResizing={\n isCompactCollapsed\n ? false\n : {\n top: false,\n right: true,\n bottom: true,\n left: false,\n topRight: false,\n bottomRight: true,\n bottomLeft: false,\n topLeft: false,\n }\n }\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n }}\n onResizeStart={() => {\n if (!isEditing) {\n onEditStart?.();\n }\n }}\n cancel=\".FreetextHighlight__text, .FreetextHighlight__input, .FreetextHighlight__edit-button, .FreetextHighlight__style-button, .FreetextHighlight__style-panel, .FreetextHighlight__delete-button, .FreetextHighlight__collapse-button, .FreetextHighlight__compact-button\"\n >\n <div className=\"FreetextHighlight__container\" style={containerStyle}>\n {isCompactCollapsed ? (\n <button\n className=\"FreetextHighlight__compact-button\"\n type=\"button\"\n title={text || \"Open note\"}\n onClick={(event) => {\n event.stopPropagation();\n setIsExpanded(true);\n }}\n >\n {compactIcon || <DefaultCompactIcon />}\n </button>\n ) : (\n <>\n <div className=\"FreetextHighlight__toolbar\">\n <div className=\"FreetextHighlight__drag-handle\" title=\"Drag to move\">\n {dragIcon || <DefaultDragIcon />}\n </div>\n <button\n className=\"FreetextHighlight__edit-button\"\n onClick={handleTextClick}\n title=\"Edit text\"\n type=\"button\"\n >\n {editIcon || <DefaultEditIcon />}\n </button>\n <button\n className=\"FreetextHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change style\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n {compact && (\n <button\n className=\"FreetextHighlight__collapse-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(false);\n setIsStylePanelOpen(false);\n }}\n title=\"Collapse note\"\n type=\"button\"\n >\n <DefaultCollapseIcon />\n </button>\n )}\n {onDelete && (\n <button\n className=\"FreetextHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n {isStylePanelOpen && (\n <div\n className=\"FreetextHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"FreetextHighlight__style-row\">\n <label>Background</label>\n <div className=\"FreetextHighlight__color-options\">\n <div className=\"FreetextHighlight__color-presets\">\n {backgroundColorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`FreetextHighlight__color-preset ${c === \"transparent\" ? \"FreetextHighlight__color-preset--transparent\" : \"\"} ${backgroundColor === c ? \"active\" : \"\"}`}\n style={c !== \"transparent\" ? { backgroundColor: c } : undefined}\n onClick={() => onStyleChange?.({ backgroundColor: c })}\n title={c === \"transparent\" ? \"No background\" : c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={backgroundColor === \"transparent\" ? \"#ffffff\" : backgroundColor}\n onChange={(e) => {\n onStyleChange?.({ backgroundColor: e.target.value });\n }}\n />\n </div>\n </div>\n <div className=\"FreetextHighlight__style-row\">\n <label\n\n >Text Color</label>\n <div className=\"FreetextHighlight__color-options\">\n <div className=\"FreetextHighlight__color-presets\">\n {textColorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`FreetextHighlight__color-preset ${color === c ? \"active\" : \"\"}`}\n style={{ backgroundColor: c }}\n onClick={() => onStyleChange?.({ color: c })}\n title={c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={color}\n onChange={(e) => {\n onStyleChange?.({ color: e.target.value });\n }}\n />\n </div>\n </div>\n <div className=\"FreetextHighlight__style-row\">\n <label>Font Size</label>\n <select\n value={fontSize}\n onChange={(e) => {\n onStyleChange?.({ fontSize: e.target.value });\n }}\n >\n <option value=\"10px\">10px</option>\n <option value=\"12px\">12px</option>\n <option value=\"14px\">14px</option>\n <option value=\"16px\">16px</option>\n <option value=\"18px\">18px</option>\n <option value=\"20px\">20px</option>\n <option value=\"24px\">24px</option>\n </select>\n </div>\n <div className=\"FreetextHighlight__style-row\">\n <label>Font</label>\n <select\n value={fontFamily}\n onChange={(e) => {\n onStyleChange?.({ fontFamily: e.target.value });\n }}\n >\n <option value=\"inherit\">Default</option>\n <option value=\"Arial, sans-serif\">Arial</option>\n <option value=\"Georgia, serif\">Georgia</option>\n <option value=\"'Courier New', monospace\">Courier</option>\n <option value=\"'Times New Roman', serif\">Times</option>\n </select>\n </div>\n </div>\n )}\n <div className=\"FreetextHighlight__content\">\n {isEditing ? (\n <textarea\n ref={textareaRef}\n className=\"FreetextHighlight__input\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onBlur={handleTextBlur}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n />\n ) : (\n <div className=\"FreetextHighlight__text\">\n {text || \"New note\"}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, { CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { Rnd } from \"react-rnd\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\n\n/**\n * The props type for {@link ImageHighlight}.\n *\n * @category Component Properties\n */\nexport interface ImageHighlightProps {\n /**\n * The highlight to be rendered as an {@link ImageHighlight}.\n * The highlight.content.image should contain the image data URL.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Custom drag icon. Replaces the default 6-dot grid icon.\n */\n dragIcon?: ReactNode;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n}\n\n/**\n * Default drag icon - 6 dot grid pattern.\n */\nconst DefaultDragIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"6\" r=\"2\" />\n <circle cx=\"16\" cy=\"6\" r=\"2\" />\n <circle cx=\"8\" cy=\"12\" r=\"2\" />\n <circle cx=\"16\" cy=\"12\" r=\"2\" />\n <circle cx=\"8\" cy=\"18\" r=\"2\" />\n <circle cx=\"16\" cy=\"18\" r=\"2\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\n/**\n * Renders a draggable, resizable image/signature annotation.\n *\n * @category Component\n */\nexport const ImageHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n dragIcon,\n onDelete,\n deleteIcon,\n}: ImageHighlightProps) => {\n const highlightClass = isScrolledTo ? \"ImageHighlight--scrolledTo\" : \"\";\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n const imageUrl = highlight.content?.image;\n\n return (\n <div\n className={`ImageHighlight ${highlightClass}`}\n onContextMenu={onContextMenu}\n >\n <Rnd\n className=\"ImageHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={onEditStart}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 150,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={50}\n minHeight={50}\n key={key}\n bounds={bounds}\n lockAspectRatio={true}\n dragHandleClassName=\"ImageHighlight__drag-handle\"\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n style={style}\n >\n <div className=\"ImageHighlight__container\">\n <div className=\"ImageHighlight__toolbar\">\n <div className=\"ImageHighlight__drag-handle\" title=\"Drag to move\">\n {dragIcon || <DefaultDragIcon />}\n </div>\n {onDelete && (\n <button\n className=\"ImageHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n <div className=\"ImageHighlight__content\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt=\"Highlight\"\n className=\"ImageHighlight__image\"\n draggable={false}\n />\n ) : (\n <div className=\"ImageHighlight__placeholder\">No image</div>\n )}\n </div>\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, { useRef, useEffect, useCallback } from \"react\";\n\n/**\n * The props type for {@link SignaturePad}.\n *\n * @category Component Properties\n */\nexport interface SignaturePadProps {\n /**\n * Whether the signature pad modal is open.\n */\n isOpen: boolean;\n\n /**\n * Callback when signature is completed.\n *\n * @param dataUrl - The signature as a PNG data URL.\n */\n onComplete: (dataUrl: string) => void;\n\n /**\n * Callback when the modal is closed/cancelled.\n */\n onClose: () => void;\n\n /**\n * Canvas width in pixels.\n * @default 400\n */\n width?: number;\n\n /**\n * Canvas height in pixels.\n * @default 200\n */\n height?: number;\n}\n\n/**\n * A modal component with a canvas for drawing signatures.\n * Supports both mouse and touch input.\n *\n * @category Component\n */\nexport const SignaturePad = ({\n isOpen,\n onComplete,\n onClose,\n width = 400,\n height = 200,\n}: SignaturePadProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const isDrawingRef = useRef(false);\n const lastPosRef = useRef({ x: 0, y: 0 });\n\n // Initialize canvas context\n useEffect(() => {\n if (!isOpen || !canvasRef.current) return;\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Set up drawing style\n ctx.strokeStyle = \"#000000\";\n ctx.lineWidth = 2;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n // Clear canvas\n ctx.clearRect(0, 0, width, height);\n }, [isOpen, width, height]);\n\n const getPosition = useCallback(\n (e: MouseEvent | TouchEvent) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n\n const rect = canvas.getBoundingClientRect();\n let clientX: number;\n let clientY: number;\n\n if (\"touches\" in e) {\n clientX = e.touches[0].clientX;\n clientY = e.touches[0].clientY;\n } else {\n clientX = e.clientX;\n clientY = e.clientY;\n }\n\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n },\n []\n );\n\n const startDrawing = useCallback(\n (e: MouseEvent | TouchEvent) => {\n e.preventDefault();\n isDrawingRef.current = true;\n lastPosRef.current = getPosition(e);\n },\n [getPosition]\n );\n\n const draw = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (!isDrawingRef.current) return;\n e.preventDefault();\n\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n\n const currentPos = getPosition(e);\n\n ctx.beginPath();\n ctx.moveTo(lastPosRef.current.x, lastPosRef.current.y);\n ctx.lineTo(currentPos.x, currentPos.y);\n ctx.stroke();\n\n lastPosRef.current = currentPos;\n },\n [getPosition]\n );\n\n const stopDrawing = useCallback(() => {\n isDrawingRef.current = false;\n }, []);\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen) return;\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n // Mouse events\n const handleMouseDown = (e: MouseEvent) => startDrawing(e);\n const handleMouseMove = (e: MouseEvent) => draw(e);\n const handleMouseUp = () => stopDrawing();\n const handleMouseLeave = () => stopDrawing();\n\n // Touch events\n const handleTouchStart = (e: TouchEvent) => startDrawing(e);\n const handleTouchMove = (e: TouchEvent) => draw(e);\n const handleTouchEnd = () => stopDrawing();\n\n canvas.addEventListener(\"mousedown\", handleMouseDown);\n canvas.addEventListener(\"mousemove\", handleMouseMove);\n canvas.addEventListener(\"mouseup\", handleMouseUp);\n canvas.addEventListener(\"mouseleave\", handleMouseLeave);\n canvas.addEventListener(\"touchstart\", handleTouchStart, { passive: false });\n canvas.addEventListener(\"touchmove\", handleTouchMove, { passive: false });\n canvas.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n canvas.removeEventListener(\"mousedown\", handleMouseDown);\n canvas.removeEventListener(\"mousemove\", handleMouseMove);\n canvas.removeEventListener(\"mouseup\", handleMouseUp);\n canvas.removeEventListener(\"mouseleave\", handleMouseLeave);\n canvas.removeEventListener(\"touchstart\", handleTouchStart);\n canvas.removeEventListener(\"touchmove\", handleTouchMove);\n canvas.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [isOpen, startDrawing, draw, stopDrawing]);\n\n const handleClear = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx || !canvas) return;\n\n ctx.clearRect(0, 0, width, height);\n };\n\n const handleDone = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const dataUrl = canvas.toDataURL(\"image/png\");\n onComplete(dataUrl);\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n // Close if clicking the overlay background\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"SignaturePad__overlay\" onClick={handleOverlayClick}>\n <div className=\"SignaturePad__modal\">\n <h3 className=\"SignaturePad__title\">Draw your signature</h3>\n <canvas\n ref={canvasRef}\n className=\"SignaturePad__canvas\"\n width={width}\n height={height}\n />\n <div className=\"SignaturePad__buttons\">\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--clear\"\n onClick={handleClear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--cancel\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--done\"\n onClick={handleDone}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { CSSProperties, MouseEvent, ReactNode, useState, useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Rnd } from \"react-rnd\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { DrawingStroke, LTWHP, ViewportHighlight } from \"../types\";\n\n// Drawing style presets (same as toolbar)\nconst DRAWING_COLORS = [\"#000000\", \"#FF0000\", \"#0000FF\", \"#00FF00\", \"#FFFF00\"];\nconst STROKE_WIDTHS = [\n { label: \"Thin\", value: 1 },\n { label: \"Medium\", value: 3 },\n { label: \"Thick\", value: 5 },\n];\n\n/**\n * The props type for {@link DrawingHighlight}.\n *\n * @category Component Properties\n */\nexport interface DrawingHighlightProps {\n /**\n * The highlight to be rendered as a {@link DrawingHighlight}.\n * The highlight.content.image should contain the drawing as a PNG data URL.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Custom drag icon. Replaces the default 6-dot grid icon.\n */\n dragIcon?: ReactNode;\n\n /**\n * Callback when drawing style changes (color or stroke width).\n * The newImage is the re-rendered PNG data URL with updated styles.\n * The newStrokes contain the updated stroke data.\n */\n onStyleChange?(newImage: string, newStrokes: DrawingStroke[]): void;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n}\n\n/**\n * Default drag icon - 6 dot grid pattern.\n */\nconst DefaultDragIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"6\" r=\"2\" />\n <circle cx=\"16\" cy=\"6\" r=\"2\" />\n <circle cx=\"8\" cy=\"12\" r=\"2\" />\n <circle cx=\"16\" cy=\"12\" r=\"2\" />\n <circle cx=\"8\" cy=\"18\" r=\"2\" />\n <circle cx=\"16\" cy=\"18\" r=\"2\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\n/**\n * Re-render strokes to a canvas and return as PNG data URL.\n */\nconst renderStrokesToImage = (\n strokes: DrawingStroke[],\n width: number,\n height: number\n): string => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) return \"\";\n\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n stroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n });\n\n return canvas.toDataURL(\"image/png\");\n};\n\n/**\n * Renders a draggable, resizable freehand drawing annotation.\n * Drawings are stored as PNG images with transparent backgrounds.\n *\n * @category Component\n */\nexport const DrawingHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n dragIcon,\n onStyleChange,\n onDelete,\n deleteIcon,\n}: DrawingHighlightProps) => {\n const highlightClass = isScrolledTo ? \"DrawingHighlight--scrolledTo\" : \"\";\n const [showStyleControls, setShowStyleControls] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const styleControlsRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (containerRef.current) {\n setConfigLayer(findOrCreateHighlightConfigLayer(containerRef.current));\n }\n }, []);\n\n // Close style controls when clicking outside\n useEffect(() => {\n if (!showStyleControls) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (styleControlsRef.current && !styleControlsRef.current.contains(e.target as Node)) {\n setShowStyleControls(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [showStyleControls]);\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n const imageUrl = highlight.content?.image;\n const strokes = highlight.content?.strokes;\n\n // Apply new color to all strokes\n const handleColorChange = useCallback((newColor: string) => {\n if (!strokes || !onStyleChange) return;\n\n console.log(\"DrawingHighlight: Changing color to\", newColor);\n const newStrokes = strokes.map((stroke) => ({\n ...stroke,\n color: newColor,\n }));\n\n const newImage = renderStrokesToImage(\n newStrokes,\n highlight.position.boundingRect.width,\n highlight.position.boundingRect.height\n );\n\n onStyleChange(newImage, newStrokes);\n }, [strokes, onStyleChange, highlight.position.boundingRect.width, highlight.position.boundingRect.height]);\n\n // Apply new width to all strokes\n const handleWidthChange = useCallback((newWidth: number) => {\n if (!strokes || !onStyleChange) return;\n\n console.log(\"DrawingHighlight: Changing width to\", newWidth);\n const newStrokes = strokes.map((stroke) => ({\n ...stroke,\n width: newWidth,\n }));\n\n const newImage = renderStrokesToImage(\n newStrokes,\n highlight.position.boundingRect.width,\n highlight.position.boundingRect.height\n );\n\n onStyleChange(newImage, newStrokes);\n }, [strokes, onStyleChange, highlight.position.boundingRect.width, highlight.position.boundingRect.height]);\n\n // Get current color from first stroke (for showing active state)\n const currentColor = strokes?.[0]?.color || \"#000000\";\n const currentWidth = strokes?.[0]?.width || 3;\n\n return (\n <div\n className={`DrawingHighlight ${highlightClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer &&\n createPortal(\n <div\n className={`DrawingHighlight__toolbar DrawingHighlight__toolbar--floating ${isHovered || isScrolledTo || showStyleControls ? \"DrawingHighlight__toolbar--visible\" : \"\"}`}\n style={{\n left: highlight.position.boundingRect.left + 4,\n top: highlight.position.boundingRect.top + 4,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div className=\"DrawingHighlight__drag-handle\" title=\"Drag to move\">\n {dragIcon || <DefaultDragIcon />}\n </div>\n {strokes && strokes.length > 0 && onStyleChange && (\n <button\n type=\"button\"\n className=\"DrawingHighlight__style-button\"\n title=\"Edit style\"\n onClick={(e) => {\n e.stopPropagation();\n setShowStyleControls(!showStyleControls);\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/>\n </svg>\n </button>\n )}\n {onDelete && (\n <button\n className=\"DrawingHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n {showStyleControls && strokes && strokes.length > 0 && onStyleChange && (\n <div className=\"DrawingHighlight__style-controls\" ref={styleControlsRef}>\n <div className=\"DrawingHighlight__color-picker\">\n {DRAWING_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`DrawingHighlight__color-button ${currentColor === color ? 'active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={(e) => {\n e.stopPropagation();\n handleColorChange(color);\n }}\n title={`Color: ${color}`}\n />\n ))}\n </div>\n <div className=\"DrawingHighlight__width-picker\">\n {STROKE_WIDTHS.map((w) => (\n <button\n key={w.value}\n type=\"button\"\n className={`DrawingHighlight__width-button ${currentWidth === w.value ? 'active' : ''}`}\n onClick={(e) => {\n e.stopPropagation();\n handleWidthChange(w.value);\n }}\n title={w.label}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>,\n configLayer,\n )}\n <Rnd\n className=\"DrawingHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={onEditStart}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 150,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={30}\n minHeight={30}\n key={key}\n bounds={bounds}\n // No aspect ratio lock for drawings - allow free resizing\n lockAspectRatio={false}\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n style={style}\n >\n <div\n className=\"DrawingHighlight__container\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div className=\"DrawingHighlight__content\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt=\"Drawing\"\n className=\"DrawingHighlight__image\"\n draggable={false}\n />\n ) : (\n <div className=\"DrawingHighlight__placeholder\">No drawing</div>\n )}\n </div>\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Rnd } from \"react-rnd\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ShapeType, ViewportHighlight } from \"../types\";\n\n/**\n * Style options for shape highlight appearance.\n */\nexport interface ShapeStyle {\n strokeColor?: string;\n strokeWidth?: number;\n}\n\n/**\n * The props type for {@link ShapeHighlight}.\n *\n * @category Component Properties\n */\nexport interface ShapeHighlightProps {\n /**\n * The highlight to be rendered as a {@link ShapeHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * The type of shape to render.\n * @default \"rectangle\"\n */\n shapeType?: ShapeType;\n\n /**\n * Stroke color for the shape.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for the shape.\n * @default 2\n */\n strokeWidth?: number;\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: ShapeStyle): void;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom style icon. Replaces the default palette icon.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n */\n colorPresets?: string[];\n\n /**\n * For arrows: start point as percentage of bounding box (0-1).\n */\n startPoint?: { x: number; y: number };\n\n /**\n * For arrows: end point as percentage of bounding box (0-1).\n */\n endPoint?: { x: number; y: number };\n}\n\n// Default icons\nconst DefaultStyleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n);\n\n// Default color presets for shapes\nconst DEFAULT_COLOR_PRESETS = [\n \"#000000\", // Black\n \"#FF0000\", // Red\n \"#0000FF\", // Blue\n \"#00AA00\", // Green\n \"#FF6600\", // Orange\n];\n\n// Stroke width options\nconst STROKE_WIDTHS = [\n { label: \"Thin\", value: 1 },\n { label: \"Medium\", value: 2 },\n { label: \"Thick\", value: 4 },\n];\n\n/**\n * Renders a draggable, resizable shape annotation.\n * Supports rectangle, circle/ellipse, and arrow shapes.\n *\n * @category Component\n */\nexport const ShapeHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n shapeType = \"rectangle\",\n strokeColor = \"#000000\",\n strokeWidth = 2,\n onStyleChange,\n onDelete,\n styleIcon,\n deleteIcon,\n colorPresets = DEFAULT_COLOR_PRESETS,\n startPoint,\n endPoint,\n}: ShapeHighlightProps) => {\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (containerRef.current) {\n setConfigLayer(findOrCreateHighlightConfigLayer(containerRef.current));\n }\n }, []);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n stylePanelRef.current &&\n !stylePanelRef.current.contains(e.target as Node)\n ) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n const highlightClass = isScrolledTo ? \"ShapeHighlight--scrolledTo\" : \"\";\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n // Generate unique ID for SVG markers\n const markerId = `arrowhead-${highlight.id}`;\n\n // Render the shape SVG\n const renderShape = (width: number, height: number) => {\n switch (shapeType) {\n case \"rectangle\":\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <rect\n x={strokeWidth / 2}\n y={strokeWidth / 2}\n width={width - strokeWidth}\n height={height - strokeWidth}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n </svg>\n );\n case \"circle\":\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={width / 2}\n cy={height / 2}\n rx={width / 2 - strokeWidth / 2}\n ry={height / 2 - strokeWidth / 2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n </svg>\n );\n case \"arrow\": {\n // Use stored start/end points if available, otherwise default to left-to-right\n const x1 = startPoint ? startPoint.x * width : strokeWidth;\n const y1 = startPoint ? startPoint.y * height : height / 2;\n const x2 = endPoint ? endPoint.x * width : width - strokeWidth - 10;\n const y2 = endPoint ? endPoint.y * height : height / 2;\n\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <defs>\n <marker\n id={markerId}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n </defs>\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerEnd={`url(#${markerId})`}\n />\n </svg>\n );\n }\n default:\n return null;\n }\n };\n\n return (\n <div\n className={`ShapeHighlight ${highlightClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) &&\n createPortal(\n <div\n className=\"ShapeHighlight__toolbar-wrapper\"\n style={{\n position: \"absolute\",\n left: highlight.position.boundingRect.left,\n top: highlight.position.boundingRect.top - 28,\n paddingBottom: 12,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div\n className={`ShapeHighlight__toolbar ${isHovered || isScrolledTo || isStylePanelOpen ? \"ShapeHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <button\n className=\"ShapeHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change style\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n )}\n {onDelete && (\n <button\n className=\"ShapeHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Style Panel - inside wrapper */}\n {isStylePanelOpen && onStyleChange && (\n <div\n className=\"ShapeHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"ShapeHighlight__style-row\">\n <label>Color</label>\n <div className=\"ShapeHighlight__color-options\">\n <div className=\"ShapeHighlight__color-presets\">\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`ShapeHighlight__color-preset ${strokeColor === c ? \"active\" : \"\"}`}\n style={{ backgroundColor: c }}\n onClick={() => onStyleChange({ strokeColor: c })}\n title={c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => {\n onStyleChange({ strokeColor: e.target.value });\n }}\n />\n </div>\n </div>\n <div className=\"ShapeHighlight__style-row\">\n <label>Width</label>\n <div className=\"ShapeHighlight__width-options\">\n {STROKE_WIDTHS.map((w) => (\n <button\n key={w.value}\n type=\"button\"\n className={`ShapeHighlight__width-button ${strokeWidth === w.value ? \"active\" : \"\"}`}\n onClick={() => onStyleChange({ strokeWidth: w.value })}\n title={w.label}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>,\n configLayer,\n )}\n\n <Rnd\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className=\"ShapeHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={onEditStart}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 100,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={20}\n minHeight={20}\n key={key}\n bounds={bounds}\n lockAspectRatio={shapeType === \"circle\"}\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n style={style}\n >\n <div className=\"ShapeHighlight__container\">\n {renderShape(\n highlight.position.boundingRect.width || 100,\n highlight.position.boundingRect.height || 100\n )}\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, { ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { GlobalWorkerOptions, OnProgressParameters, getDocument, type PDFDocumentLoadingTask, type PDFDocumentProxy } from \"pdfjs-dist\";\nimport { DocumentInitParameters, TypedArray } from \"pdfjs-dist/types/src/display/api\";\n\nconst DEFAULT_BEFORE_LOAD = (progress: OnProgressParameters | null) => {\n const pct =\n progress && progress.total\n ? Math.min(100, Math.floor((progress.loaded / progress.total) * 100))\n : null;\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 12,\n height: \"100%\",\n color: \"currentColor\",\n opacity: 0.7,\n fontSize: 13,\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n border: \"3px solid currentColor\",\n borderTopColor: \"transparent\",\n borderRadius: \"50%\",\n animation: \"pdfloader-spin 0.8s linear infinite\",\n }}\n />\n <div>{pct !== null ? `Loading ${pct}%` : \"Loading…\"}</div>\n <style>{\"@keyframes pdfloader-spin{to{transform:rotate(360deg)}}\"}</style>\n </div>\n );\n};\n\nconst DEFAULT_ERROR_MESSAGE = (error: Error) => (\n <div style={{ color: \"black\" }}>{error.message}</div>\n);\n\nconst DEFAULT_ON_ERROR = (error: Error) => {\n throw new Error(`Error loading PDF document: ${error.message}!`);\n};\n\nconst DEFAULT_WORKER_SRC = new URL(\n \"pdfjs-dist/build/pdf.worker.min.mjs\",\n import.meta.url,\n).toString();\n\n// --- Document cache -------------------------------------------------------\n// Keeps loaded documents alive across remounts (StrictMode double-mount, tab\n// switches, re-opening the same URL) so they don't re-download/re-parse. The\n// loading task is shared, so concurrent mounts of the same URL fetch once.\n// Reference-counted: an entry is only evicted once nothing is using it AND the\n// cache is over budget.\nconst CACHE_MAX = 3;\nlet lruTick = 0;\n\ninterface CacheEntry {\n task: PDFDocumentLoadingTask;\n promise: Promise<PDFDocumentProxy>;\n refs: number;\n used: number;\n}\n\nconst docCache = new Map<string, CacheEntry>();\n\nconst evictIfNeeded = () => {\n if (docCache.size <= CACHE_MAX) return;\n let victimKey: string | undefined;\n let oldest = Infinity;\n for (const [key, entry] of docCache) {\n if (entry.refs === 0 && entry.used < oldest) {\n oldest = entry.used;\n victimKey = key;\n }\n }\n if (victimKey !== undefined) {\n const victim = docCache.get(victimKey)!;\n docCache.delete(victimKey);\n victim.task.destroy();\n }\n};\n\nconst cacheKeyOf = (\n document: string | URL | TypedArray | DocumentInitParameters,\n): string | null => {\n if (typeof document === \"string\") return document;\n if (document instanceof URL) return document.href;\n if (\n document &&\n typeof document === \"object\" &&\n !ArrayBuffer.isView(document) &&\n typeof (document as DocumentInitParameters).url === \"string\"\n ) {\n return (document as DocumentInitParameters).url as string;\n }\n // Raw bytes — content isn't identified by a stable key, so don't cache.\n return null;\n};\n\ninterface PerfOptions {\n disableAutoFetch?: boolean;\n disableStream?: boolean;\n rangeChunkSize?: number;\n withCredentials?: boolean;\n httpHeaders?: Record<string, string>;\n}\n\nconst stripUndefined = <T extends object>(obj: T): Partial<T> => {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj))\n if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n return out;\n};\n\nconst buildSource = (\n document: string | URL | TypedArray | DocumentInitParameters,\n perf: PerfOptions,\n) => {\n const cleaned = stripUndefined(perf);\n if (typeof document === \"string\" || document instanceof URL) {\n return { url: document, ...cleaned };\n }\n if (ArrayBuffer.isView(document)) {\n return document; // raw bytes: streaming options don't apply\n }\n // DocumentInitParameters — caller's explicit fields win over our defaults.\n return { ...cleaned, ...document };\n};\n\n/**\n * The props type for {@link PdfLoader}.\n *\n * @category Component Properties\n */\nexport interface PdfLoaderProps {\n /**\n * The document to be loaded by PDF.js.\n * If you need to pass HTTP headers, auth parameters,\n * or other pdf settings, do it through here.\n */\n document: string | URL | TypedArray | DocumentInitParameters;\n\n /**\n * Callback to render content before the PDF document is loaded. Receives the\n * PDF.js progress, or `null` before any progress is known (e.g. a cache hit).\n *\n * @param progress - PDF.js progress status, or null.\n * @returns - Component to be rendered in space of the PDF document while loading.\n */\n beforeLoad?(progress: OnProgressParameters | null): ReactNode;\n\n /**\n * Component to render in the case of any PDF loading errors.\n *\n * @param error - PDF loading error.\n * @returns - Component to be rendered in space of the PDF document.\n */\n errorMessage?(error: Error): ReactNode;\n\n /**\n * Child components to use/render the loaded PDF document.\n *\n * @param pdfDocument - The loaded PDF document.\n * @returns - Component to render once PDF document is loaded.\n */\n children(pdfDocument: PDFDocumentProxy): ReactNode;\n\n /**\n * Callback triggered whenever an error occurs.\n *\n * @param error - PDF Loading error triggering the event.\n * @returns - Component to be rendered in space of the PDF document.\n */\n onError?(error: Error): void;\n\n /**\n * Optional PDF.js worker source override. By default, PdfLoader resolves the\n * worker from the installed pdfjs-dist package so bundlers can emit it locally.\n */\n workerSrc?: string;\n\n /**\n * Only fetch the pages needed to render, instead of background-downloading the\n * whole file. Makes the first page appear fast for large PDFs served over an\n * API — provided the server supports HTTP range requests (`Accept-Ranges:\n * bytes`). Has no effect for servers without range support or for raw bytes.\n * @default true\n */\n disableAutoFetch?: boolean;\n\n /** Disable progressive streaming of the response. @default false */\n disableStream?: boolean;\n\n /** Size (bytes) of each range request when streaming. PDF.js default ~64KB. */\n rangeChunkSize?: number;\n\n /** Send credentials (cookies) with the document request. */\n withCredentials?: boolean;\n\n /** Extra HTTP headers for the document request (e.g. an auth token). */\n httpHeaders?: Record<string, string>;\n\n /**\n * Cache the loaded document so re-opening the same URL (or a StrictMode/\n * remount) reuses it instead of re-downloading. Only URL-based documents are\n * cached. Disable if the same URL can return different content.\n * @default true\n */\n enableCache?: boolean;\n}\n\n/**\n * A component for loading a PDF document and passing it to a child.\n *\n * @category Component\n */\nexport const PdfLoader = ({\n document,\n beforeLoad = DEFAULT_BEFORE_LOAD,\n errorMessage = DEFAULT_ERROR_MESSAGE,\n children,\n onError = DEFAULT_ON_ERROR,\n workerSrc = DEFAULT_WORKER_SRC,\n disableAutoFetch = true,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeaders,\n enableCache = true,\n}: PdfLoaderProps) => {\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [loadingProgress, setLoadingProgress] =\n useState<OnProgressParameters | null>(null);\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n const httpHeadersKey = httpHeaders ? JSON.stringify(httpHeaders) : \"\";\n\n useEffect(() => {\n GlobalWorkerOptions.workerSrc = workerSrc;\n let cancelled = false;\n setPdfDocument(null);\n setError(null);\n setLoadingProgress(null);\n\n const key = enableCache ? cacheKeyOf(document) : null;\n let entry: CacheEntry;\n const cached = key ? docCache.get(key) : undefined;\n\n if (cached) {\n // Reuse the in-flight or finished load — no new network request.\n console.log(\"[PdfLoader] cache hit\", key);\n entry = cached;\n entry.refs += 1;\n entry.used = ++lruTick;\n } else {\n console.log(\"[PdfLoader] loading\", key ?? \"(bytes)\", {\n disableAutoFetch,\n });\n const task = getDocument(\n buildSource(document, {\n disableAutoFetch,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeaders,\n }) as Parameters<typeof getDocument>[0],\n );\n task.onProgress = (progress: OnProgressParameters) => {\n if (!cancelled)\n setLoadingProgress(progress.loaded > progress.total ? null : progress);\n };\n entry = { task, promise: task.promise, refs: 1, used: ++lruTick };\n if (key) {\n docCache.set(key, entry);\n evictIfNeeded();\n }\n }\n\n entry.promise\n .then((proxy: PDFDocumentProxy) => {\n if (!cancelled) setPdfDocument(proxy);\n })\n .catch((err: Error) => {\n if (cancelled || err.message === \"Worker was destroyed\") return;\n setError(err);\n onErrorRef.current(err);\n })\n .finally(() => {\n if (!cancelled) setLoadingProgress(null);\n });\n\n return () => {\n cancelled = true;\n entry.refs -= 1;\n if (key && docCache.has(key)) {\n // Keep cached for reuse; only drop if over budget and unused.\n entry.used = ++lruTick;\n evictIfNeeded();\n } else {\n // Uncached (raw bytes / caching disabled) — release it.\n entry.task.destroy();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n document,\n workerSrc,\n disableAutoFetch,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeadersKey,\n enableCache,\n ]);\n\n if (error) return errorMessage(error);\n if (pdfDocument) return children(pdfDocument);\n return beforeLoad(loadingProgress);\n};\n","import type { PDFDocumentProxy, PageViewport } from \"pdfjs-dist\";\nimport type { Highlight, LTWHP, ScaledPosition } from \"../types\";\nimport getBoundingRect from \"./get-bounding-rect\";\nimport { viewportToScaled } from \"./coordinates\";\n\ntype PdfTextContentItem = {\n str: string;\n transform: number[];\n width: number;\n height: number;\n};\n\nexport type PdfTextItem = {\n text: string;\n index: number;\n pageNumber: number;\n rect: LTWHP;\n fontName?: string;\n columnIndex?: number;\n};\n\nexport type PdfTextColumn = {\n index: number;\n left: number;\n right: number;\n width: number;\n textItemIndexes: number[];\n};\n\nexport type PdfExtractedPage = {\n pageNumber: number;\n width: number;\n height: number;\n textItems: PdfTextItem[];\n columns?: PdfTextColumn[];\n};\n\nexport type PdfTextUnitType =\n | \"paragraph\"\n | \"title\"\n | \"heading\"\n | \"author\"\n | \"affiliation\"\n | \"footnote\"\n | \"reference\"\n | \"unknown\";\n\nexport type PdfTextUnit = {\n id: string;\n type: PdfTextUnitType;\n text: string;\n rawText: string;\n pageNumber: number;\n indexInPage: number;\n columnIndex?: number;\n position?: ScaledPosition;\n source?: {\n textItemIndexes: number[];\n };\n};\n\nexport type PdfSentenceSource = {\n startOffset: number;\n endOffset: number;\n textItemIndexes: number[];\n};\n\nexport type PdfSentence = {\n id: string;\n text: string;\n rawText: string;\n pageNumber: number;\n indexInPage: number;\n globalIndex: number;\n columnIndex?: number;\n position?: ScaledPosition;\n source?: PdfSentenceSource;\n};\n\nexport type PdfReadingOrder = \"auto\" | \"document\" | \"position\";\nexport type PdfColumnDetection = \"auto\" | \"none\";\n\nexport type ExtractSentencesOptions = {\n pages?: \"all\" | number[];\n includePositions?: boolean;\n includeSources?: boolean;\n normalize?: boolean;\n locale?: string;\n idPrefix?: string;\n includeTextUnitTypes?: PdfTextUnitType[];\n readingOrder?: PdfReadingOrder;\n columnDetection?: PdfColumnDetection;\n};\n\ntype ResolvedExtractSentencesOptions = Required<\n Omit<ExtractSentencesOptions, \"includeTextUnitTypes\">\n> & {\n includeTextUnitTypes: PdfTextUnitType[];\n};\n\ntype PageTextStream = {\n text: string;\n charItemIndexes: Array<number | null>;\n};\n\ntype SentenceRange = {\n text: string;\n start: number;\n end: number;\n};\n\nconst DEFAULT_OPTIONS: ResolvedExtractSentencesOptions = {\n pages: \"all\",\n includePositions: false,\n includeSources: false,\n normalize: true,\n locale: \"en\",\n idPrefix: \"\",\n includeTextUnitTypes: [\"paragraph\"],\n readingOrder: \"auto\",\n columnDetection: \"auto\",\n};\n\nconst isTextItem = (item: unknown): item is PdfTextContentItem => {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"str\" in item &&\n typeof (item as { str: unknown }).str === \"string\" &&\n \"transform\" in item &&\n Array.isArray((item as { transform: unknown }).transform)\n );\n};\n\nconst shouldInsertSpace = (previous: string, next: string) => {\n if (!previous || !next) return false;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return false;\n if (/^[,.;:!?)]/.test(next)) return false;\n if (/[([{]$/.test(previous)) return false;\n return true;\n};\n\nconst getLastNonWhitespace = (text: string) => {\n const match = text.match(/\\S(?=\\s*$)/);\n return match?.[0] ?? \"\";\n};\n\ntype PdfTextItemTextKind =\n | \"singleGlyph\"\n | \"wordLike\"\n | \"punctuation\"\n | \"space\"\n | \"other\";\n\nconst getTrimmedChars = (text: string) => Array.from(text.trim());\n\nconst getItemTextKind = (text: string): PdfTextItemTextKind => {\n if (!text.trim()) return \"space\";\n if (/^[,.;:!?)\\]}]+$/.test(text.trim())) return \"punctuation\";\n\n const chars = getTrimmedChars(text);\n\n if (chars.length === 1 && /[\\p{L}\\p{N}]/u.test(chars[0])) {\n return \"singleGlyph\";\n }\n\n if (/[\\p{L}\\p{N}]/u.test(text)) return \"wordLike\";\n\n return \"other\";\n};\n\nconst getMedianGlyphWidth = (textItems: PdfTextItem[]) => {\n const glyphWidths = textItems\n .map((item) => {\n const textLength = Math.max(getTrimmedChars(item.text).length, 1);\n return item.rect.width / textLength;\n })\n .filter((width) => Number.isFinite(width) && width > 0)\n .sort((a, b) => a - b);\n\n if (glyphWidths.length === 0) return 0;\n\n return glyphWidths[Math.floor(glyphWidths.length / 2)];\n};\n\nconst getHorizontalGap = (\n previousItem: PdfTextItem,\n nextItem: PdfTextItem,\n medianGlyphWidth: number,\n) => {\n const previousRight = previousItem.rect.left + previousItem.rect.width;\n const gap = nextItem.rect.left - previousRight;\n const zeroTolerance = Math.max(medianGlyphWidth * 0.08, 0.35);\n\n return Math.abs(gap) <= zeroTolerance ? 0 : gap;\n};\n\nconst shouldInsertSpaceBetweenItems = (\n previousItem: PdfTextItem | undefined,\n nextItem: PdfTextItem,\n currentText: string,\n averageHeight: number,\n medianGlyphWidth: number,\n) => {\n if (!previousItem || !currentText || !nextItem.text) return false;\n if (/\\s$/.test(currentText) || /^\\s/.test(nextItem.text)) return false;\n\n const previousChar = getLastNonWhitespace(currentText);\n const nextChar = Array.from(nextItem.text.trim())[0] ?? \"\";\n const previousKind = getItemTextKind(previousItem.text);\n const nextKind = getItemTextKind(nextItem.text);\n\n if (!nextChar) return false;\n if (nextKind === \"punctuation\" || /^[,.;:!?)]/.test(nextChar)) return false;\n if (/[([{]$/.test(previousChar)) return false;\n\n const gap = getHorizontalGap(previousItem, nextItem, medianGlyphWidth);\n\n if (gap < 0) return false;\n\n const glyphWidth = Math.max(\n medianGlyphWidth,\n averageHeight * 0.18,\n 1,\n );\n const singleGlyphPair = previousKind === \"singleGlyph\" && nextKind === \"singleGlyph\";\n\n if (singleGlyphPair) {\n return gap > Math.max(glyphWidth * 0.35, 1.0);\n }\n\n if (\n (previousKind === \"wordLike\" || previousKind === \"singleGlyph\") &&\n (nextKind === \"wordLike\" || nextKind === \"singleGlyph\")\n ) {\n return gap > Math.max(glyphWidth * 0.08, 0.35);\n }\n\n return shouldInsertSpace(currentText, nextItem.text);\n};\n\nconst appendTextItem = (\n currentText: string,\n item: PdfTextItem,\n previousItem: PdfTextItem | undefined,\n averageHeight: number,\n medianGlyphWidth: number,\n) => {\n return `${currentText}${\n shouldInsertSpaceBetweenItems(\n previousItem,\n item,\n currentText,\n averageHeight,\n medianGlyphWidth,\n )\n ? \" \"\n : \"\"\n }${item.text}`;\n};\n\nconst getAverageItemHeight = (textItems: PdfTextItem[]) => {\n const heights = textItems\n .map((item) => item.rect.height)\n .filter((height) => height > 0)\n .sort((a, b) => a - b);\n\n if (heights.length === 0) return 0;\n\n return heights[Math.floor(heights.length / 2)];\n};\n\nconst areTextItemsOnSameLine = (\n previous: PdfTextItem,\n next: PdfTextItem,\n averageHeight: number,\n) => {\n const previousMiddle = previous.rect.top + previous.rect.height / 2;\n const nextMiddle = next.rect.top + next.rect.height / 2;\n const tolerance = Math.max(averageHeight * 0.45, 2);\n\n return Math.abs(previousMiddle - nextMiddle) <= tolerance;\n};\n\nconst getTextItemRect = (\n item: PdfTextContentItem,\n viewport: PageViewport,\n pageNumber: number,\n): LTWHP => {\n const [, , , , x, y] = item.transform;\n const width = Math.abs(item.width ?? 0);\n const height = Math.abs(item.height ?? 0);\n\n const [x1, y1, x2, y2] = viewport.convertToViewportRectangle([\n x,\n y,\n x + width,\n y + height,\n ]);\n\n return {\n left: Math.min(x1, x2),\n top: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n pageNumber,\n };\n};\n\nconst resolvePageNumbers = (\n pdfDocument: PDFDocumentProxy,\n pages: ExtractSentencesOptions[\"pages\"],\n) => {\n if (pages === \"all\" || pages === undefined) {\n return Array.from({ length: pdfDocument.numPages }, (_, index) => index + 1);\n }\n\n return [...new Set(pages)]\n .filter((pageNumber) => pageNumber >= 1 && pageNumber <= pdfDocument.numPages)\n .sort((a, b) => a - b);\n};\n\nconst buildPageTextStream = (textItems: PdfTextItem[]): PageTextStream => {\n let text = \"\";\n const charItemIndexes: Array<number | null> = [];\n const averageHeight = getAverageItemHeight(textItems);\n const medianGlyphWidth = getMedianGlyphWidth(textItems);\n let previousItem: PdfTextItem | undefined;\n\n textItems.forEach((item) => {\n if (!item.text) return;\n\n if (\n shouldInsertSpaceBetweenItems(\n previousItem,\n item,\n text,\n averageHeight,\n medianGlyphWidth,\n )\n ) {\n text += \" \";\n charItemIndexes.push(null);\n }\n\n for (const char of item.text) {\n text += char;\n charItemIndexes.push(item.index);\n }\n\n previousItem = item;\n });\n\n return { text, charItemIndexes };\n};\n\nconst normalizePdfLigatures = (text: string) => {\n return text\n .replace(/ffi/g, \"ffi\")\n .replace(/ffl/g, \"ffl\")\n .replace(/fi/g, \"fi\")\n .replace(/fl/g, \"fl\")\n .replace(/ff/g, \"ff\");\n};\n\nconst cleanupPdfHyphenSpacing = (text: string) => {\n return text.replace(\n /\\b([\\p{L}\\p{N}]{2,})\\s+-\\s+([\\p{L}\\p{N}]{2,})\\b/gu,\n \"$1-$2\",\n );\n};\n\nexport const normalizePdfSentenceText = (text: string) => {\n return cleanupPdfHyphenSpacing(normalizePdfLigatures(text))\n .replace(/(\\p{L}+)-\\s+(\\p{L}+)/gu, \"$1-$2\")\n .replace(/\\[\\s*([^\\]]*?)\\s*\\]/g, (_, citation: string) => {\n const normalizedCitation = citation\n .replace(/\\s*,\\s*/g, \", \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return `[${normalizedCitation}]`;\n })\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nexport const splitPdfSentences = (\n text: string,\n locale: string = DEFAULT_OPTIONS.locale,\n): SentenceRange[] => {\n const segmenterConstructor = Intl.Segmenter;\n\n if (segmenterConstructor) {\n const segmenter = new segmenterConstructor(locale, {\n granularity: \"sentence\",\n });\n\n return Array.from(segmenter.segment(text))\n .map((segment) => ({\n text: segment.segment.trim(),\n start: segment.index + segment.segment.search(/\\S/),\n end: segment.index + segment.segment.trimEnd().length,\n }))\n .filter((sentence) => sentence.text.length > 0 && sentence.start >= 0);\n }\n\n const ranges: SentenceRange[] = [];\n let start = 0;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (!/[.!?]/.test(char)) continue;\n\n const nextText = text.slice(index + 1);\n const nextNonSpace = nextText.match(/\\S/);\n const nextChar = nextNonSpace?.[0] ?? \"\";\n const shouldSplit =\n nextChar === \"\" || /[A-Z([{\"']/.test(nextChar);\n\n if (!shouldSplit) continue;\n\n const rawSentence = text.slice(start, index + 1);\n const leadingWhitespace = rawSentence.search(/\\S/);\n const sentenceStart = start + Math.max(leadingWhitespace, 0);\n const sentenceText = rawSentence.trim();\n\n if (sentenceText) {\n ranges.push({\n text: sentenceText,\n start: sentenceStart,\n end: start + rawSentence.trimEnd().length,\n });\n }\n\n start = index + 1;\n }\n\n const finalRawSentence = text.slice(start);\n const leadingWhitespace = finalRawSentence.search(/\\S/);\n const finalText = finalRawSentence.trim();\n\n if (finalText) {\n ranges.push({\n text: finalText,\n start: start + Math.max(leadingWhitespace, 0),\n end: start + finalRawSentence.trimEnd().length,\n });\n }\n\n return ranges;\n};\n\nconst getSentenceTextItemIndexes = (\n charItemIndexes: Array<number | null>,\n start: number,\n end: number,\n) => {\n const indexes = new Set<number>();\n\n for (let index = start; index < end; index += 1) {\n const itemIndex = charItemIndexes[index];\n if (itemIndex !== null && itemIndex !== undefined) {\n indexes.add(itemIndex);\n }\n }\n\n return Array.from(indexes).sort((a, b) => a - b);\n};\n\nconst getScaledPosition = (\n textItems: PdfTextItem[],\n textItemIndexes: number[],\n page: PdfExtractedPage,\n): ScaledPosition | undefined => {\n const indexSet = new Set(textItemIndexes);\n const rects = textItems\n .filter((item) => indexSet.has(item.index))\n .map((item) => item.rect)\n .filter((rect) => rect.width > 0 && rect.height > 0);\n\n if (rects.length === 0) return undefined;\n\n const boundingRect = getBoundingRect(rects);\n\n return {\n boundingRect: viewportToScaled(boundingRect, page),\n rects: rects.map((rect) => viewportToScaled(rect, page)),\n };\n};\n\nconst getTextItemsPosition = (\n textItems: PdfTextItem[],\n textItemIndexes: number[],\n page: PdfExtractedPage,\n includePositions: boolean,\n) => {\n return includePositions\n ? getScaledPosition(textItems, textItemIndexes, page)\n : undefined;\n};\n\nconst getTextItemsBoundingRect = (textItems: PdfTextItem[]) => {\n const rects = textItems\n .map((item) => item.rect)\n .filter((rect) => rect.width > 0 && rect.height > 0);\n\n return rects.length > 0 ? getBoundingRect(rects) : undefined;\n};\n\nconst getOrderedTextItems = (\n textItems: PdfTextItem[],\n readingOrder: PdfReadingOrder,\n) => {\n if (readingOrder === \"document\") return [...textItems];\n\n const averageHeight = getAverageItemHeight(textItems);\n\n return [...textItems].sort((a, b) => {\n const topDelta = a.rect.top - b.rect.top;\n if (Math.abs(topDelta) > Math.max(averageHeight * 0.45, 2)) {\n return topDelta;\n }\n\n return a.rect.left - b.rect.left;\n });\n};\n\nconst groupTextItemsIntoLines = (textItems: PdfTextItem[]) => {\n const averageHeight = getAverageItemHeight(textItems);\n const sortedItems = getOrderedTextItems(textItems, \"position\");\n const lines: PdfTextItem[][] = [];\n\n sortedItems.forEach((item) => {\n const currentLine = lines[lines.length - 1];\n const previousItem = currentLine?.[currentLine.length - 1];\n\n if (\n currentLine &&\n previousItem &&\n areTextItemsOnSameLine(previousItem, item, averageHeight)\n ) {\n currentLine.push(item);\n currentLine.sort((a, b) => a.rect.left - b.rect.left);\n return;\n }\n\n lines.push([item]);\n });\n\n return lines;\n};\n\nconst isLikelyBodyTextItem = (item: PdfTextItem, page: PdfExtractedPage) => {\n const text = item.text.trim();\n if (!text) return false;\n if ((item.rect.top < page.height * 0.12 && page.pageNumber === 1) || item.rect.top > page.height * 0.88) {\n return false;\n }\n if (isLikelyFootnoteOrReference(text)) return false;\n return true;\n};\n\nconst getColumnRanges = (textItems: PdfTextItem[], page: PdfExtractedPage) => {\n if (textItems.length < 24) return undefined;\n\n const minLeft = Math.min(...textItems.map((item) => item.rect.left));\n const maxRight = Math.max(\n ...textItems.map((item) => item.rect.left + item.rect.width),\n );\n const pageSpan = maxRight - minLeft;\n const binCount = 80;\n const bins = Array.from({ length: binCount }, () => 0);\n\n textItems.forEach((item) => {\n const left = item.rect.left;\n const right = item.rect.left + item.rect.width;\n const startBin = Math.max(\n 0,\n Math.floor(((left - minLeft) / pageSpan) * binCount),\n );\n const endBin = Math.min(\n binCount - 1,\n Math.ceil(((right - minLeft) / pageSpan) * binCount),\n );\n\n for (let index = startBin; index <= endBin; index += 1) {\n bins[index] += 1;\n }\n });\n\n const centerStart = Math.floor(binCount * 0.35);\n const centerEnd = Math.ceil(binCount * 0.65);\n let bestGapStart = -1;\n let bestGapEnd = -1;\n let currentGapStart = -1;\n\n for (let index = centerStart; index <= centerEnd; index += 1) {\n if (bins[index] === 0) {\n if (currentGapStart === -1) currentGapStart = index;\n continue;\n }\n\n if (currentGapStart !== -1 && index - currentGapStart > bestGapEnd - bestGapStart) {\n bestGapStart = currentGapStart;\n bestGapEnd = index;\n }\n\n currentGapStart = -1;\n }\n\n if (\n currentGapStart !== -1 &&\n centerEnd + 1 - currentGapStart > bestGapEnd - bestGapStart\n ) {\n bestGapStart = currentGapStart;\n bestGapEnd = centerEnd + 1;\n }\n\n const gapBins = bestGapEnd - bestGapStart;\n const gapWidth = (gapBins / binCount) * pageSpan;\n const minGapWidth = Math.max(page.width * 0.035, 14);\n\n if (bestGapStart < 0 || gapWidth < minGapWidth) return undefined;\n\n const gapLeft = minLeft + (bestGapStart / binCount) * pageSpan;\n const gapRight = minLeft + (bestGapEnd / binCount) * pageSpan;\n const splitX = (gapLeft + gapRight) / 2;\n const leftItems = textItems.filter(\n (item) => item.rect.left + item.rect.width / 2 < splitX,\n );\n const rightItems = textItems.filter(\n (item) => item.rect.left + item.rect.width / 2 >= splitX,\n );\n\n if (leftItems.length < 10 || rightItems.length < 10) return undefined;\n\n const leftRange = {\n left: Math.min(...leftItems.map((item) => item.rect.left)),\n right: Math.max(...leftItems.map((item) => item.rect.left + item.rect.width)),\n };\n const rightRange = {\n left: Math.min(...rightItems.map((item) => item.rect.left)),\n right: Math.max(...rightItems.map((item) => item.rect.left + item.rect.width)),\n };\n const leftHeight = getAverageItemHeight(leftItems);\n const rightHeight = getAverageItemHeight(rightItems);\n\n if (\n leftHeight > 0 &&\n rightHeight > 0 &&\n Math.max(leftHeight, rightHeight) / Math.min(leftHeight, rightHeight) > 1.45\n ) {\n return undefined;\n }\n\n return [leftRange, rightRange];\n};\n\nconst assignColumnsToPage = (\n page: PdfExtractedPage,\n columnDetection: PdfColumnDetection,\n): PdfExtractedPage => {\n if (columnDetection === \"none\") {\n return {\n ...page,\n textItems: page.textItems.map((item) => ({ ...item, columnIndex: 0 })),\n columns: [\n {\n index: 0,\n left: 0,\n right: page.width,\n width: page.width,\n textItemIndexes: page.textItems.map((item) => item.index),\n },\n ],\n };\n }\n\n const bodyItems = page.textItems.filter((item) =>\n isLikelyBodyTextItem(item, page),\n );\n const ranges = getColumnRanges(bodyItems, page);\n\n if (!ranges) {\n return {\n ...page,\n textItems: page.textItems.map((item) => ({ ...item, columnIndex: 0 })),\n columns: [\n {\n index: 0,\n left: 0,\n right: page.width,\n width: page.width,\n textItemIndexes: page.textItems.map((item) => item.index),\n },\n ],\n };\n }\n\n const splitX = (ranges[0].right + ranges[1].left) / 2;\n const textItems = page.textItems.map((item) => {\n const centerX = item.rect.left + item.rect.width / 2;\n return {\n ...item,\n columnIndex: centerX < splitX ? 0 : 1,\n };\n });\n\n const columns = ranges.map((range, index) => ({\n index,\n left: range.left,\n right: range.right,\n width: range.right - range.left,\n textItemIndexes: textItems\n .filter((item) => item.columnIndex === index)\n .map((item) => item.index),\n }));\n\n return { ...page, textItems, columns };\n};\n\nconst isFullWidthBlock = (\n block: PdfTextItem[][],\n page: PdfExtractedPage,\n detectedColumnCount: number,\n) => {\n if (detectedColumnCount < 2) return false;\n\n const textItems = block.flat();\n const boundingRect = getTextItemsBoundingRect(textItems);\n if (!boundingRect) return false;\n\n return boundingRect.width > page.width * 0.72;\n};\n\nconst buildBlocksForItems = (\n textItems: PdfTextItem[],\n page: PdfExtractedPage,\n) => {\n const lines = groupTextItemsIntoLines(textItems);\n const averageHeight = getAverageItemHeight(textItems);\n const blocks: PdfTextItem[][][] = [];\n\n lines.forEach((line) => {\n const currentBlock = blocks[blocks.length - 1];\n const previousLine = currentBlock?.[currentBlock.length - 1];\n\n if (\n currentBlock &&\n previousLine &&\n !shouldStartNewBlock(previousLine, line, page, averageHeight)\n ) {\n currentBlock.push(line);\n return;\n }\n\n blocks.push([line]);\n });\n\n return blocks;\n};\n\nconst compareBlocksByPosition = (\n left: { block: PdfTextItem[][] },\n right: { block: PdfTextItem[][] },\n) => {\n const leftRect = getTextItemsBoundingRect(left.block.flat());\n const rightRect = getTextItemsBoundingRect(right.block.flat());\n\n return (leftRect?.top ?? 0) - (rightRect?.top ?? 0);\n};\n\nconst compareBlocksByColumnReadingOrder = (\n left: { block: PdfTextItem[][]; columnIndex?: number },\n right: { block: PdfTextItem[][]; columnIndex?: number },\n) => {\n const columnDelta = (left.columnIndex ?? 0) - (right.columnIndex ?? 0);\n if (columnDelta !== 0) return columnDelta;\n\n return compareBlocksByPosition(left, right);\n};\n\nconst buildTextUnit = ({\n block,\n columnIndex,\n indexInPage,\n includePositions,\n idPrefix,\n page,\n shouldNormalize,\n}: {\n block: PdfTextItem[][];\n columnIndex?: number;\n indexInPage: number;\n includePositions: boolean;\n idPrefix: string;\n page: PdfExtractedPage;\n shouldNormalize: boolean;\n}): PdfTextUnit => {\n const textItems = block.flat();\n const rawText = block.map(getLineText).join(\" \");\n const textItemIndexes = textItems.map((item) => item.index);\n const type = classifyTextUnit(rawText, textItemIndexes, page);\n const position = getTextItemsPosition(\n page.textItems,\n textItemIndexes,\n page,\n includePositions,\n );\n\n return {\n id: `${idPrefix}p${page.pageNumber}-u${indexInPage}`,\n type,\n text: shouldNormalize ? normalizePdfSentenceText(rawText) : rawText.trim(),\n rawText: rawText.trim(),\n pageNumber: page.pageNumber,\n indexInPage,\n ...(columnIndex !== undefined ? { columnIndex } : {}),\n ...(position ? { position } : {}),\n source: {\n textItemIndexes,\n },\n };\n};\n\nconst getLineText = (line: PdfTextItem[]) => {\n const averageHeight = getAverageItemHeight(line);\n const medianGlyphWidth = getMedianGlyphWidth(line);\n\n return line.reduce((text, item, index) => {\n return appendTextItem(\n text,\n item,\n line[index - 1],\n averageHeight,\n medianGlyphWidth,\n );\n }, \"\");\n};\n\nconst getLineRect = (line: PdfTextItem[]) => getBoundingRect(line.map((item) => item.rect));\n\nconst shouldStartNewBlock = (\n previousLine: PdfTextItem[],\n nextLine: PdfTextItem[],\n page: PdfExtractedPage,\n averageHeight: number,\n) => {\n const previousRect = getLineRect(previousLine);\n const nextRect = getLineRect(nextLine);\n const verticalGap = nextRect.top - (previousRect.top + previousRect.height);\n const leftDelta = Math.abs(nextRect.left - previousRect.left);\n const previousText = getLineText(previousLine).trim();\n const nextText = getLineText(nextLine).trim();\n\n if (verticalGap > Math.max(averageHeight * 1.15, 7)) return true;\n if (leftDelta > page.width * 0.18) return true;\n if (isLikelyStandaloneBlock(previousText) || isLikelyStandaloneBlock(nextText)) {\n return true;\n }\n\n return false;\n};\n\nconst isLikelyStandaloneBlock = (text: string) => {\n const normalizedText = normalizePdfSentenceText(text);\n if (!normalizedText) return false;\n if (isLikelySectionHeading(normalizedText)) return true;\n if (isLikelyFootnoteOrReference(normalizedText)) return true;\n return false;\n};\n\nconst isLikelySectionHeading = (text: string) => {\n if (text.length > 80) return false;\n if (/^\\d+(\\.\\d+)*\\.?\\s+[A-Z]/.test(text)) return true;\n\n const letters = text.replace(/[^A-Za-z]/g, \"\");\n if (letters.length < 3) return false;\n\n const uppercaseLetters = text.replace(/[^A-Z]/g, \"\");\n return uppercaseLetters.length / letters.length > 0.75;\n};\n\nconst isLikelyFootnoteOrReference = (text: string) => {\n return (\n /^\\d+\\s*https?:\\/\\//i.test(text) ||\n /^\\[\\d+\\]/.test(text) ||\n /https?:\\/\\/|doi\\.org|arxiv\\.org/i.test(text)\n );\n};\n\nconst isLikelyAuthor = (text: string) => {\n return (\n text.length <= 80 &&\n !/[.!?]$/.test(text) &&\n /^[A-Z][A-Za-z'.-]+(?:\\s+[A-Z][A-Za-z'.-]+){1,4}$/.test(text)\n );\n};\n\nconst isLikelyAffiliation = (text: string) => {\n return (\n text.length <= 160 &&\n /university|institute|department|school|college|faculty|laboratory|germany|usa|china|france|italy|spain|canada|japan|korea/i.test(\n text,\n )\n );\n};\n\nconst classifyTextUnit = (\n rawText: string,\n textItemIndexes: number[],\n page: PdfExtractedPage,\n) => {\n const text = normalizePdfSentenceText(rawText);\n const textItems = page.textItems.filter((item) =>\n textItemIndexes.includes(item.index),\n );\n const rects = textItems.map((item) => item.rect);\n const boundingRect = rects.length > 0 ? getBoundingRect(rects) : undefined;\n const averagePageHeight = getAverageItemHeight(page.textItems);\n const averageUnitHeight = getAverageItemHeight(textItems);\n const isTopOfFirstPage =\n page.pageNumber === 1 && (boundingRect?.top ?? page.height) < page.height * 0.2;\n const isBottomOfPage =\n (boundingRect?.top ?? 0) > page.height * 0.78;\n const isLargeText =\n averagePageHeight > 0 && averageUnitHeight > averagePageHeight * 1.25;\n const isCentered =\n boundingRect !== undefined &&\n Math.abs(boundingRect.left + boundingRect.width / 2 - page.width / 2) <\n page.width * 0.16;\n\n if (isLikelyFootnoteOrReference(text) || (isBottomOfPage && /^\\d+\\s/.test(text))) {\n return text.includes(\"://\") || /^\\d+\\s*https?:\\/\\//i.test(text)\n ? \"footnote\"\n : \"reference\";\n }\n\n if (isLikelySectionHeading(text)) return \"heading\";\n\n if (isTopOfFirstPage && isLargeText && isCentered) return \"title\";\n if (isTopOfFirstPage && isLikelyAuthor(text)) return \"author\";\n if (isTopOfFirstPage && isLikelyAffiliation(text)) return \"affiliation\";\n\n return \"paragraph\";\n};\n\nexport const extractTextUnitsFromPages = (\n pages: PdfExtractedPage[],\n options: Pick<\n ExtractSentencesOptions,\n \"includePositions\" | \"includeSources\" | \"normalize\" | \"idPrefix\" | \"readingOrder\" | \"columnDetection\"\n > = {},\n): PdfTextUnit[] => {\n const includePositions = options.includePositions ?? DEFAULT_OPTIONS.includePositions;\n const includeSources = options.includeSources ?? DEFAULT_OPTIONS.includeSources;\n const shouldNormalize = options.normalize ?? DEFAULT_OPTIONS.normalize;\n const idPrefix = options.idPrefix ?? DEFAULT_OPTIONS.idPrefix;\n const readingOrder = options.readingOrder ?? DEFAULT_OPTIONS.readingOrder;\n const columnDetection = options.columnDetection ?? DEFAULT_OPTIONS.columnDetection;\n const units: PdfTextUnit[] = [];\n\n pages.forEach((page) => {\n const pageWithColumns = assignColumnsToPage(page, columnDetection);\n const detectedColumnCount = pageWithColumns.columns?.length ?? 1;\n const columnIndexes =\n detectedColumnCount > 1 && readingOrder !== \"document\"\n ? pageWithColumns.columns?.map((column) => column.index) ?? [0]\n : [0];\n const blocks: Array<{ block: PdfTextItem[][]; columnIndex?: number }> = [];\n\n if (readingOrder === \"document\") {\n blocks.push(\n ...buildBlocksForItems(pageWithColumns.textItems, pageWithColumns).map(\n (block) => ({ block }),\n ),\n );\n } else {\n const allBlocks = columnIndexes.flatMap((columnIndex) =>\n buildBlocksForItems(\n pageWithColumns.textItems.filter(\n (item) => item.columnIndex === columnIndex,\n ),\n pageWithColumns,\n ).map((block) => ({ block, columnIndex })),\n );\n const fullWidthBlocks = allBlocks.filter(({ block }) =>\n isFullWidthBlock(block, pageWithColumns, detectedColumnCount),\n );\n const columnBlocks = allBlocks.filter(\n ({ block }) => !isFullWidthBlock(block, pageWithColumns, detectedColumnCount),\n );\n const topFullWidthBlocks = fullWidthBlocks.filter(({ block }) => {\n const rect = getTextItemsBoundingRect(block.flat());\n return (rect?.top ?? 0) < pageWithColumns.height * 0.3;\n });\n const bottomFullWidthBlocks = fullWidthBlocks.filter(({ block }) => {\n const rect = getTextItemsBoundingRect(block.flat());\n return (rect?.top ?? 0) >= pageWithColumns.height * 0.3;\n });\n\n blocks.push(\n ...topFullWidthBlocks.sort(compareBlocksByPosition),\n ...columnBlocks.sort(compareBlocksByColumnReadingOrder),\n ...bottomFullWidthBlocks.sort(compareBlocksByPosition),\n );\n }\n\n blocks.forEach(({ block, columnIndex }, indexInPage) => {\n units.push(\n buildTextUnit({\n block,\n columnIndex,\n indexInPage,\n includePositions,\n idPrefix,\n page: pageWithColumns,\n shouldNormalize,\n }),\n );\n });\n });\n\n if (!includeSources) {\n return units.map(({ source: _source, ...rest }) => rest);\n }\n return units;\n};\n\nexport const extractTextUnits = async (\n pdfDocument: PDFDocumentProxy,\n options: ExtractSentencesOptions = {},\n): Promise<PdfTextUnit[]> => {\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const pages = await extractPageTextItems(pdfDocument, {\n pages: resolvedOptions.pages,\n columnDetection: resolvedOptions.columnDetection,\n });\n\n return extractTextUnitsFromPages(pages, resolvedOptions);\n};\n\nexport const extractPageTextItems = async (\n pdfDocument: PDFDocumentProxy,\n options: Pick<ExtractSentencesOptions, \"pages\" | \"columnDetection\"> = {},\n): Promise<PdfExtractedPage[]> => {\n const pageNumbers = resolvePageNumbers(pdfDocument, options.pages);\n const columnDetection = options.columnDetection ?? DEFAULT_OPTIONS.columnDetection;\n const extractedPages: PdfExtractedPage[] = [];\n\n for (const pageNumber of pageNumbers) {\n const page = await pdfDocument.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 1 });\n const textContent = await page.getTextContent();\n\n const textItems: PdfTextItem[] = [];\n\n textContent.items.forEach((item, index) => {\n if (!isTextItem(item) || item.str.length === 0) return;\n\n textItems.push({\n text: item.str,\n index,\n pageNumber,\n rect: getTextItemRect(item, viewport, pageNumber),\n });\n });\n\n extractedPages.push(assignColumnsToPage({\n pageNumber,\n width: viewport.width,\n height: viewport.height,\n textItems,\n }, columnDetection));\n }\n\n return extractedPages;\n};\n\nexport const extractSentences = async (\n pdfDocument: PDFDocumentProxy,\n options: ExtractSentencesOptions = {},\n): Promise<PdfSentence[]> => {\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const pages = await extractPageTextItems(pdfDocument, {\n pages: resolvedOptions.pages,\n columnDetection: resolvedOptions.columnDetection,\n });\n // Always include sources internally — unit.source.textItemIndexes is needed below\n const textUnits = extractTextUnitsFromPages(pages, { ...resolvedOptions, includeSources: true });\n const sentences: PdfSentence[] = [];\n let globalIndex = 0;\n\n textUnits\n .filter((unit) => resolvedOptions.includeTextUnitTypes.includes(unit.type))\n .forEach((unit) => {\n const page = pages.find((candidatePage) => candidatePage.pageNumber === unit.pageNumber);\n if (!page) return;\n\n const pageTextItemsByIndex = new Map(\n page.textItems.map((item) => [item.index, item]),\n );\n const stream = buildPageTextStream(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n unit.source!.textItemIndexes\n .map((textItemIndex) => pageTextItemsByIndex.get(textItemIndex))\n .filter((item): item is PdfTextItem => item !== undefined),\n );\n if (!stream.text.trim()) return;\n\n const sentenceRanges = splitPdfSentences(\n stream.text,\n resolvedOptions.locale,\n );\n\n sentenceRanges.forEach((sentenceRange, indexInPage) => {\n const textItemIndexes = getSentenceTextItemIndexes(\n stream.charItemIndexes,\n sentenceRange.start,\n sentenceRange.end,\n );\n const position = resolvedOptions.includePositions\n ? getScaledPosition(page.textItems, textItemIndexes, page)\n : undefined;\n const id = `${resolvedOptions.idPrefix}p${page.pageNumber}-u${unit.indexInPage}-s${indexInPage}`;\n const rawText = sentenceRange.text;\n\n sentences.push({\n id,\n text: resolvedOptions.normalize\n ? normalizePdfSentenceText(rawText)\n : rawText,\n rawText,\n pageNumber: page.pageNumber,\n indexInPage,\n globalIndex,\n ...(unit.columnIndex !== undefined ? { columnIndex: unit.columnIndex } : {}),\n ...(position ? { position } : {}),\n ...(resolvedOptions.includeSources\n ? { source: { startOffset: sentenceRange.start, endOffset: sentenceRange.end, textItemIndexes } }\n : {}),\n });\n\n globalIndex += 1;\n });\n });\n\n return sentences;\n};\n\nexport const sentenceToHighlight = (\n sentence: PdfSentence,\n options: { id?: string } = {},\n): Highlight => {\n if (!sentence.position) {\n throw new Error(\n \"Cannot convert sentence to highlight because it has no position. Call extractSentences with includePositions: true.\",\n );\n }\n\n return {\n id: options.id ?? sentence.id,\n type: \"text\",\n content: { text: sentence.text },\n position: sentence.position,\n };\n};\n\n/** Strip ALL whitespace, lowercase, unify quotes — keeping a map from each\n * stripped-char index back to its index in the raw string. Matching on the\n * whitespace-free form makes line-wraps / inconsistent PDF spacing irrelevant. */\nconst stripWhitespaceWithMap = (\n raw: string,\n): { stripped: string; map: number[] } => {\n let stripped = \"\";\n const map: number[] = [];\n for (let i = 0; i < raw.length; i += 1) {\n const c = raw[i]!;\n if (/\\s/.test(c)) continue;\n let ch = c.toLowerCase();\n if (ch === \"‘\" || ch === \"’\") ch = \"'\";\n else if (ch === \"“\" || ch === \"”\") ch = '\"';\n stripped += ch;\n map.push(i);\n }\n return { stripped, map };\n};\n\n/** Levenshtein distance, bounded — returns `max + 1` as soon as it's exceeded. */\nconst boundedLevenshtein = (a: string, b: string, max: number): number => {\n const al = a.length;\n const bl = b.length;\n if (Math.abs(al - bl) > max) return max + 1;\n let prev = new Array<number>(bl + 1);\n let curr = new Array<number>(bl + 1);\n for (let j = 0; j <= bl; j++) prev[j] = j;\n for (let i = 1; i <= al; i++) {\n curr[0] = i;\n let rowMin = curr[0];\n for (let j = 1; j <= bl; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);\n if (curr[j] < rowMin) rowMin = curr[j];\n }\n if (rowMin > max) return max + 1;\n [prev, curr] = [curr, prev];\n }\n return prev[bl]!;\n};\n\n/** Best fuzzy window: slide a query-length window over the stripped page text,\n * anchoring on the query's first token to keep it cheap, and return the start\n * index of the lowest-distance window within tolerance (or -1). */\nconst fuzzyFind = (\n haystack: string,\n needle: string,\n maxDistance: number,\n): number => {\n const len = needle.length;\n if (len === 0) return -1;\n const anchor = needle.slice(0, Math.min(8, len));\n let best = -1;\n let bestDist = maxDistance + 1;\n let from = 0;\n // Probe near every occurrence of the anchor, plus a small slop window.\n while (true) {\n const at = haystack.indexOf(anchor, from);\n if (at === -1) break;\n for (let offset = -2; offset <= 2; offset++) {\n const start = at + offset;\n if (start < 0 || start + len > haystack.length) continue;\n const window = haystack.slice(start, start + len);\n const dist = boundedLevenshtein(needle, window, bestDist - 1);\n if (dist < bestDist) {\n bestDist = dist;\n best = start;\n if (dist === 0) return best;\n }\n }\n from = at + 1;\n }\n return bestDist <= maxDistance ? best : -1;\n};\n\n/**\n * The result of {@link getTextPosition}.\n *\n * @category Type\n */\nexport interface TextPositionMatch {\n /** Scaled position of the matched text, ready to use as a highlight position. */\n position: ScaledPosition;\n /** 1-indexed page the match was found on. */\n pageNumber: number;\n /** The exact document text that was matched. */\n matchedText: string;\n /** \"exact\" = whitespace-insensitive verbatim, \"fuzzy\" = approximate match. */\n confidence: \"exact\" | \"fuzzy\";\n}\n\ninterface RawTextItem {\n text: string;\n rect: LTWHP;\n}\n\n/** Build per-character rects for a raw [start,end) range over concatenated items,\n * splitting partial items proportionally and merging rects on the same line. */\nconst rectsForRange = (\n items: RawTextItem[],\n itemStarts: number[],\n start: number,\n end: number,\n pageNumber: number,\n): LTWHP[] => {\n const rects: LTWHP[] = [];\n for (let k = 0; k < items.length; k++) {\n const itemStart = itemStarts[k]!;\n const item = items[k]!;\n const len = item.text.length;\n if (len === 0) continue;\n const itemEnd = itemStart + len;\n const a = Math.max(start, itemStart);\n const b = Math.min(end, itemEnd);\n if (b <= a) continue;\n const { left, top, width, height } = item.rect;\n if (!(width > 0) || !(height > 0)) continue;\n const s = (a - itemStart) / len;\n const e = (b - itemStart) / len;\n rects.push({\n left: left + s * width,\n top,\n width: (e - s) * width,\n height,\n pageNumber,\n });\n }\n // Merge rects that sit on the same line and are horizontally contiguous.\n rects.sort((p, q) => p.top - q.top || p.left - q.left);\n const merged: LTWHP[] = [];\n for (const r of rects) {\n const last = merged[merged.length - 1];\n if (\n last &&\n Math.abs(last.top - r.top) < Math.max(2, r.height * 0.4) &&\n r.left - (last.left + last.width) < Math.max(4, r.height * 0.6)\n ) {\n const right = Math.max(last.left + last.width, r.left + r.width);\n last.left = Math.min(last.left, r.left);\n last.width = right - last.left;\n last.height = Math.max(last.height, r.height);\n } else {\n merged.push({ ...r });\n }\n }\n return merged;\n};\n\n/**\n * Locate a piece of text in the PDF and return its precise position — the rects\n * of the exact phrase (sub-item, per-line), not a whole sentence. Use it to turn\n * an external quote / citation into a highlight you can render or scroll to.\n *\n * Robust to PDF quirks: matching ignores whitespace (so line-wraps and spacing\n * differences don't matter) and falls back to bounded fuzzy matching for minor\n * differences (hyphenation, OCR, slight paraphrase). Returns the first match\n * (optionally restrict the page range), or null.\n *\n * @category Utility\n */\nexport const getTextPosition = async (\n pdfDocument: PDFDocumentProxy,\n query: string,\n options: { pages?: \"all\" | number[]; fuzzy?: boolean } = {},\n): Promise<TextPositionMatch | null> => {\n const { stripped: needle } = stripWhitespaceWithMap(query);\n if (!needle) return null;\n const allowFuzzy = options.fuzzy ?? true;\n const maxDistance = Math.max(2, Math.floor(needle.length * 0.15));\n\n const pages = await extractPageTextItems(pdfDocument, {\n pages: options.pages ?? \"all\",\n });\n\n for (const page of pages) {\n const items: RawTextItem[] = page.textItems\n .filter((it) => it.text)\n .map((it) => ({ text: it.text, rect: it.rect }));\n if (items.length === 0) continue;\n\n // Raw concatenation + per-item start offsets (no inserted separators).\n const itemStarts: number[] = [];\n let raw = \"\";\n for (const it of items) {\n itemStarts.push(raw.length);\n raw += it.text;\n }\n\n const { stripped, map } = stripWhitespaceWithMap(raw);\n let at = stripped.indexOf(needle);\n let confidence: \"exact\" | \"fuzzy\" = \"exact\";\n if (at === -1 && allowFuzzy) {\n at = fuzzyFind(stripped, needle, maxDistance);\n confidence = \"fuzzy\";\n }\n if (at === -1) continue;\n\n const rawStart = map[at]!;\n const rawEnd = map[Math.min(at + needle.length - 1, map.length - 1)]! + 1;\n const rects = rectsForRange(\n items,\n itemStarts,\n rawStart,\n rawEnd,\n page.pageNumber,\n );\n if (rects.length === 0) continue;\n\n const boundingRect = getBoundingRect(rects);\n return {\n position: {\n boundingRect: viewportToScaled(boundingRect, page),\n rects: rects.map((r) => viewportToScaled(r, page)),\n },\n pageNumber: page.pageNumber,\n matchedText: raw.slice(rawStart, rawEnd),\n confidence,\n };\n }\n\n return null;\n};\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { List, FileText, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { LeftPanelContext, LeftPanelUtils } from '../../contexts/LeftPanelContext';\nimport { useDocumentOutline } from '../../hooks/useDocumentOutline';\nimport { useThumbnails } from '../../hooks/useThumbnails';\nimport { usePageNavigation } from '../../hooks/usePageNavigation';\nimport { DocumentOutline, DocumentOutlineStyles, DocumentOutlineClassNames } from './DocumentOutline';\nimport { ThumbnailPanel } from './ThumbnailPanel';\nimport type { LeftPanelTab, ProcessedOutlineItem, ThumbnailData } from '../../types';\nimport { OutlineItemRenderProps, OutlineItemStyles, OutlineItemClassNames } from './OutlineItem';\n\ninterface PDFViewer {\n scrollPageIntoView: (params: { pageNumber: number }) => void;\n pagesCount: number;\n currentPageNumber?: number;\n}\n\ninterface PDFLinkService {\n goToDestination: (dest: unknown) => void;\n}\n\ninterface EventBus {\n on: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n off: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n}\n\n/** Theme configuration for LeftPanel styling */\nexport interface LeftPanelTheme {\n /** Background color of the panel */\n backgroundColor?: string;\n /** Border color */\n borderColor?: string;\n /** Active tab/item accent color */\n accentColor?: string;\n /** Text color */\n textColor?: string;\n /** Muted text color */\n mutedTextColor?: string;\n /** Hover background color */\n hoverBackgroundColor?: string;\n}\n\n/** Style configuration for tab buttons */\nexport interface TabStyles {\n /** Container styles for the tab bar */\n container?: React.CSSProperties;\n /** Tab button styles */\n tab?: React.CSSProperties;\n /** Tab button styles when active */\n tabActive?: React.CSSProperties;\n /** Tab icon styles */\n tabIcon?: React.CSSProperties;\n /** Tab text styles */\n tabText?: React.CSSProperties;\n}\n\n/** Class name configuration for tab buttons (Tailwind-friendly) */\nexport interface TabClassNames {\n /** Container class for the tab bar */\n container?: string;\n /** Tab button class */\n tab?: string;\n /** Tab button class when active */\n tabActive?: string;\n /** Tab icon class */\n tabIcon?: string;\n /** Tab text class */\n tabText?: string;\n}\n\n/** Style configuration for the footer */\nexport interface FooterStyles {\n /** Footer container styles */\n container?: React.CSSProperties;\n /** Footer text styles */\n text?: React.CSSProperties;\n}\n\n/** Class name configuration for the footer (Tailwind-friendly) */\nexport interface FooterClassNames {\n /** Footer container class */\n container?: string;\n /** Footer text class */\n text?: string;\n}\n\n/** Style configuration for the toggle button */\nexport interface ToggleButtonStyles {\n /** Button container styles */\n button?: React.CSSProperties;\n /** Button icon styles */\n icon?: React.CSSProperties;\n}\n\n/** Class name configuration for the toggle button (Tailwind-friendly) */\nexport interface ToggleButtonClassNames {\n /** Button container class */\n button?: string;\n /** Button icon class */\n icon?: string;\n}\n\nconst defaultTheme: LeftPanelTheme = {\n backgroundColor: '#ffffff',\n borderColor: '#e5e7eb',\n accentColor: '#3b82f6',\n textColor: '#374151',\n mutedTextColor: '#6b7280',\n hoverBackgroundColor: '#f9fafb',\n};\n\n/** Dark-mode preset, used when `mode=\"dark\"` (warm grays matching the\n * PdfHighlighter dark page palette). Any `theme` prop fields override it. */\nconst defaultDarkTheme: LeftPanelTheme = {\n backgroundColor: '#1f1d1b',\n borderColor: '#3a3733',\n accentColor: '#7aa2f7',\n textColor: '#eae6e0',\n mutedTextColor: '#a8a29a',\n hoverBackgroundColor: '#2a2724',\n};\n\nexport interface LeftPanelProps {\n /** PDF document from PdfLoader */\n pdfDocument: PDFDocumentProxy;\n /** PDF viewer instance */\n viewer?: PDFViewer | unknown | null;\n /** PDF link service for navigation */\n linkService?: PDFLinkService | unknown | null;\n /** Event bus for page change events */\n eventBus?: EventBus | unknown | null;\n /** Function to navigate to a page (from pdfHighlighterUtils.goToPage) */\n goToPage?: (pageNumber: number) => void;\n /** Whether panel is open */\n isOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /** Initial active tab */\n defaultTab?: LeftPanelTab;\n /** Which tabs to show */\n tabs?: LeftPanelTab[];\n /** Panel width when open */\n width?: number | string;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Custom outline item renderer */\n renderOutlineItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n /** Custom thumbnail renderer */\n renderThumbnail?: (\n pageNumber: number,\n thumbnail: ThumbnailData,\n isActive: boolean\n ) => React.ReactNode;\n /** Callback when page is selected */\n onPageSelect?: (pageNumber: number) => void;\n /** Thumbnail width */\n thumbnailWidth?: number;\n /** Children for custom content */\n children?: React.ReactNode;\n /** Color scheme. \"dark\" swaps in a dark default palette; `theme` overrides\n * individual colors on top of whichever preset is chosen. @default \"light\" */\n mode?: \"light\" | \"dark\";\n /** Theme customization (merged over the mode preset) */\n theme?: LeftPanelTheme;\n /** Show page count in footer */\n showFooter?: boolean;\n /** Show toggle button */\n showToggleButton?: boolean;\n /** Custom styles for tabs */\n tabStyles?: TabStyles;\n /** Custom class names for tabs (Tailwind-friendly) */\n tabClassNames?: TabClassNames;\n /** Custom styles for footer */\n footerStyles?: FooterStyles;\n /** Custom class names for footer (Tailwind-friendly) */\n footerClassNames?: FooterClassNames;\n /** Custom styles for toggle button */\n toggleButtonStyles?: ToggleButtonStyles;\n /** Custom class names for toggle button (Tailwind-friendly) */\n toggleButtonClassNames?: ToggleButtonClassNames;\n /** Custom styles for document outline */\n outlineStyles?: DocumentOutlineStyles;\n /** Custom class names for document outline (Tailwind-friendly) */\n outlineClassNames?: DocumentOutlineClassNames;\n /** Custom styles for outline items */\n outlineItemStyles?: OutlineItemStyles;\n /** Custom class names for outline items (Tailwind-friendly) */\n outlineItemClassNames?: OutlineItemClassNames;\n}\n\n/**\n * Left panel component with Outline and Thumbnails tabs.\n * Provides a customizable sidebar for PDF navigation with page thumbnails and document outline.\n */\nexport const LeftPanel: React.FC<LeftPanelProps> = ({\n pdfDocument,\n viewer = null,\n linkService = null,\n eventBus = null,\n goToPage: goToPageProp,\n isOpen: controlledIsOpen,\n onOpenChange,\n defaultTab = 'thumbnails',\n tabs = ['outline', 'thumbnails'],\n width = 260,\n className = '',\n style,\n renderOutlineItem,\n renderThumbnail,\n onPageSelect,\n thumbnailWidth = 180,\n children,\n mode = \"light\",\n theme: userTheme,\n showFooter = true,\n showToggleButton = true,\n tabStyles,\n tabClassNames,\n footerStyles,\n footerClassNames,\n toggleButtonStyles,\n toggleButtonClassNames,\n outlineStyles,\n outlineClassNames,\n outlineItemStyles,\n outlineItemClassNames,\n}) => {\n // Merge user theme over the mode preset (dark vs light defaults).\n const theme = useMemo(\n () => ({\n ...(mode === \"dark\" ? defaultDarkTheme : defaultTheme),\n ...userTheme,\n }),\n [mode, userTheme],\n );\n // Internal state for uncontrolled mode\n const [internalIsOpen, setInternalIsOpen] = useState(true);\n const [activeTab, setActiveTab] = useState<LeftPanelTab>(defaultTab);\n\n // Use controlled or uncontrolled open state\n const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n const setIsOpen = useCallback(\n (open: boolean) => {\n if (onOpenChange) {\n onOpenChange(open);\n } else {\n setInternalIsOpen(open);\n }\n },\n [onOpenChange]\n );\n\n // Initialize hooks - order matters: usePageNavigation before useDocumentOutline\n const { thumbnails, loadThumbnail, totalPages } = useThumbnails({\n pdfDocument,\n thumbnailWidth,\n });\n\n const { currentPage, goToPage: goToPageFromHook } = usePageNavigation({\n viewer,\n eventBus,\n });\n\n // Use ref to always get the latest goToPage function\n const goToPagePropRef = useRef(goToPageProp);\n\n // Sync ref with useEffect to ensure it's updated after render\n useEffect(() => {\n goToPagePropRef.current = goToPageProp;\n }, [goToPageProp]);\n\n // Handle page selection - use ref to always get latest goToPage\n const handlePageSelect = useCallback(\n (pageNumber: number) => {\n // Prefer the prop (from pdfHighlighterUtils) if available\n if (goToPagePropRef.current) {\n goToPagePropRef.current(pageNumber);\n } else {\n goToPageFromHook(pageNumber);\n }\n onPageSelect?.(pageNumber);\n },\n [goToPageFromHook, onPageSelect]\n );\n\n const {\n outline,\n isLoading: isOutlineLoading,\n hasOutline,\n navigateToItem,\n } = useDocumentOutline({\n pdfDocument,\n goToPage: handlePageSelect,\n });\n\n // Handle outline item navigation\n const handleOutlineNavigate = useCallback(\n (item: ProcessedOutlineItem) => {\n navigateToItem(item);\n onPageSelect?.(item.pageNumber);\n },\n [navigateToItem, onPageSelect]\n );\n\n // Context value\n const contextValue: LeftPanelUtils = useMemo(\n () => ({\n currentPage,\n totalPages,\n goToPage: handlePageSelect,\n goToOutlineItem: handleOutlineNavigate,\n pdfDocument,\n outline,\n hasOutline,\n isOutlineLoading,\n thumbnails,\n loadThumbnail,\n activeTab,\n setActiveTab,\n isOpen,\n setIsOpen,\n }),\n [\n currentPage,\n totalPages,\n handlePageSelect,\n handleOutlineNavigate,\n pdfDocument,\n outline,\n hasOutline,\n isOutlineLoading,\n thumbnails,\n loadThumbnail,\n activeTab,\n isOpen,\n setIsOpen,\n ]\n );\n\n const panelWidth = typeof width === 'number' ? `${width}px` : width;\n\n // CSS custom properties for theming\n const cssVars = {\n '--lp-bg': theme.backgroundColor,\n '--lp-border': theme.borderColor,\n '--lp-accent': theme.accentColor,\n '--lp-text': theme.textColor,\n '--lp-muted': theme.mutedTextColor,\n '--lp-hover': theme.hoverBackgroundColor,\n } as React.CSSProperties;\n\n return (\n <LeftPanelContext.Provider value={contextValue}>\n {/* Toggle button - placed outside panel for visibility when closed */}\n {showToggleButton && (\n <button\n className={toggleButtonClassNames?.button}\n onClick={() => setIsOpen(!isOpen)}\n style={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n left: isOpen ? `calc(${panelWidth} - 1px)` : '0',\n zIndex: 20,\n width: '24px',\n height: '48px',\n backgroundColor: theme.backgroundColor,\n border: `1px solid ${theme.borderColor}`,\n borderLeft: 'none',\n borderRadius: '0 6px 6px 0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '2px 0 8px rgba(0,0,0,0.08)',\n transition: 'left 0.2s ease-in-out, background-color 0.15s ease',\n ...toggleButtonStyles?.button,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.hoverBackgroundColor || '#f9fafb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = theme.backgroundColor || '#ffffff';\n }}\n aria-label={isOpen ? 'Close panel' : 'Open panel'}\n >\n {isOpen ? (\n <ChevronLeft className={toggleButtonClassNames?.icon} style={{ width: 14, height: 14, color: theme.mutedTextColor, ...toggleButtonStyles?.icon }} />\n ) : (\n <ChevronRight className={toggleButtonClassNames?.icon} style={{ width: 14, height: 14, color: theme.mutedTextColor, ...toggleButtonStyles?.icon }} />\n )}\n </button>\n )}\n\n <div\n className={`left-panel ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.backgroundColor,\n borderRight: `1px solid ${theme.borderColor}`,\n transition: 'width 0.2s ease-in-out, min-width 0.2s ease-in-out',\n position: 'relative',\n width: isOpen ? panelWidth : '0px',\n minWidth: isOpen ? panelWidth : '0px',\n overflow: 'hidden',\n ...cssVars,\n ...style,\n }}\n >\n\n {/* Panel content wrapper */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n overflow: 'hidden',\n width: panelWidth,\n minWidth: panelWidth,\n }}\n >\n {/* Tab headers */}\n {tabs.length > 1 && (\n <div\n className={tabClassNames?.container}\n style={{\n display: 'flex',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n ...tabStyles?.container,\n }}\n >\n {tabs.includes('outline') && (\n <button\n className={[tabClassNames?.tab, activeTab === 'outline' ? tabClassNames?.tabActive : ''].filter(Boolean).join(' ') || undefined}\n onClick={() => setActiveTab('outline')}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '12px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: activeTab === 'outline' ? theme.accentColor : theme.mutedTextColor,\n backgroundColor: activeTab === 'outline' ? `${theme.accentColor}08` : 'transparent',\n borderBottom: activeTab === 'outline' ? `2px solid ${theme.accentColor}` : '2px solid transparent',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n ...tabStyles?.tab,\n ...(activeTab === 'outline' ? tabStyles?.tabActive : {}),\n }}\n >\n <FileText className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={tabStyles?.tabText}>Outline</span>\n </button>\n )}\n {tabs.includes('thumbnails') && (\n <button\n className={[tabClassNames?.tab, activeTab === 'thumbnails' ? tabClassNames?.tabActive : ''].filter(Boolean).join(' ') || undefined}\n onClick={() => setActiveTab('thumbnails')}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '12px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: activeTab === 'thumbnails' ? theme.accentColor : theme.mutedTextColor,\n backgroundColor: activeTab === 'thumbnails' ? `${theme.accentColor}08` : 'transparent',\n borderBottom: activeTab === 'thumbnails' ? `2px solid ${theme.accentColor}` : '2px solid transparent',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n ...tabStyles?.tab,\n ...(activeTab === 'thumbnails' ? tabStyles?.tabActive : {}),\n }}\n >\n <List className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={tabStyles?.tabText}>Pages</span>\n </button>\n )}\n </div>\n )}\n\n {/* Single tab header */}\n {tabs.length === 1 && (\n <div\n className={tabClassNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n ...tabStyles?.container,\n }}\n >\n {tabs[0] === 'outline' ? (\n <>\n <FileText className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, color: theme.mutedTextColor, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={{ fontSize: '13px', fontWeight: 500, color: theme.textColor, ...tabStyles?.tabText }}>Outline</span>\n </>\n ) : (\n <>\n <List className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, color: theme.mutedTextColor, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={{ fontSize: '13px', fontWeight: 500, color: theme.textColor, ...tabStyles?.tabText }}>Pages</span>\n </>\n )}\n </div>\n )}\n\n {/* Tab content - scrollable area */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n }}\n >\n {activeTab === 'outline' && tabs.includes('outline') && (\n <DocumentOutline\n outline={outline}\n isLoading={isOutlineLoading}\n currentPage={currentPage}\n onNavigate={handleOutlineNavigate}\n renderItem={renderOutlineItem}\n styles={outlineStyles}\n classNames={outlineClassNames}\n itemStyles={outlineItemStyles}\n itemClassNames={outlineItemClassNames}\n />\n )}\n\n {activeTab === 'thumbnails' && tabs.includes('thumbnails') && (\n <ThumbnailPanel\n totalPages={totalPages}\n currentPage={currentPage}\n thumbnails={thumbnails}\n loadThumbnail={loadThumbnail}\n onPageSelect={handlePageSelect}\n renderThumbnail={renderThumbnail}\n />\n )}\n\n {children}\n </div>\n\n {/* Footer with page info */}\n {showFooter && (\n <div\n className={footerClassNames?.container}\n style={{\n flexShrink: 0,\n borderTop: `1px solid ${theme.borderColor}`,\n padding: '10px 16px',\n backgroundColor: theme.hoverBackgroundColor,\n ...footerStyles?.container,\n }}\n >\n <div\n className={footerClassNames?.text}\n style={{\n fontSize: '12px',\n color: theme.mutedTextColor,\n textAlign: 'center',\n fontWeight: 500,\n ...footerStyles?.text,\n }}\n >\n Page {currentPage} of {totalPages}\n </div>\n </div>\n )}\n </div>\n </div>\n </LeftPanelContext.Provider>\n );\n};\n","import { createContext, useContext } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ProcessedOutlineItem, LeftPanelTab, ThumbnailData } from '../types';\n\n/**\n * Utilities and state available within the LeftPanel context\n */\nexport interface LeftPanelUtils {\n // Navigation\n currentPage: number;\n totalPages: number;\n goToPage: (pageNumber: number) => void;\n goToOutlineItem: (item: ProcessedOutlineItem) => void;\n\n // Document info\n pdfDocument: PDFDocumentProxy | null;\n outline: ProcessedOutlineItem[] | null;\n hasOutline: boolean;\n isOutlineLoading: boolean;\n\n // Thumbnails\n thumbnails: Map<number, ThumbnailData>;\n loadThumbnail: (pageNumber: number) => Promise<void>;\n\n // Panel state\n activeTab: LeftPanelTab;\n setActiveTab: (tab: LeftPanelTab) => void;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n}\n\nexport const LeftPanelContext = createContext<LeftPanelUtils | undefined>(\n undefined\n);\n\n/**\n * Hook to access LeftPanel context utilities\n *\n * @throws Error if used outside of LeftPanel\n * @returns LeftPanel utilities\n */\nexport const useLeftPanelContext = (): LeftPanelUtils => {\n const context = useContext(LeftPanelContext);\n if (context === undefined) {\n throw new Error('useLeftPanelContext must be used within LeftPanel');\n }\n return context;\n};\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { OutlineItem, ProcessedOutlineItem } from '../types';\n\ninterface UseDocumentOutlineOptions {\n pdfDocument: PDFDocumentProxy;\n linkService?: { goToDestination: (dest: unknown) => void } | unknown | null;\n goToPage?: (pageNumber: number) => void;\n}\n\ninterface UseDocumentOutlineResult {\n outline: ProcessedOutlineItem[] | null;\n isLoading: boolean;\n error: Error | null;\n navigateToItem: (item: ProcessedOutlineItem) => void;\n flatOutline: ProcessedOutlineItem[];\n hasOutline: boolean;\n}\n\n/**\n * Helper to process outline items recursively and resolve destinations to page numbers\n */\nasync function processOutlineItems(\n pdfDocument: PDFDocumentProxy,\n items: OutlineItem[],\n level: number\n): Promise<ProcessedOutlineItem[]> {\n const processed: ProcessedOutlineItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let pageNumber = 1;\n\n // Resolve destination to page number\n if (item.dest) {\n try {\n const dest =\n typeof item.dest === 'string'\n ? await pdfDocument.getDestination(item.dest)\n : item.dest;\n\n if (dest && Array.isArray(dest) && dest[0]) {\n const pageIndex = await pdfDocument.getPageIndex(dest[0]);\n pageNumber = pageIndex + 1; // Convert to 1-indexed\n }\n } catch {\n // Keep default page 1 if resolution fails\n }\n }\n\n const children = item.items?.length\n ? await processOutlineItems(pdfDocument, item.items, level + 1)\n : [];\n\n processed.push({\n id: `outline-${level}-${i}`,\n title: item.title,\n pageNumber,\n dest: item.dest,\n level,\n bold: item.bold,\n italic: item.italic,\n children,\n });\n }\n\n return processed;\n}\n\n/**\n * Flatten outline tree into a single array for searching\n */\nfunction flattenOutline(items: ProcessedOutlineItem[]): ProcessedOutlineItem[] {\n const result: ProcessedOutlineItem[] = [];\n for (const item of items) {\n result.push(item);\n if (item.children.length) {\n result.push(...flattenOutline(item.children));\n }\n }\n return result;\n}\n\n/**\n * Hook to fetch and process PDF document outline (table of contents)\n *\n * @param options - Configuration options\n * @returns Outline data and navigation utilities\n */\nexport function useDocumentOutline(\n options: UseDocumentOutlineOptions\n): UseDocumentOutlineResult {\n const { pdfDocument, goToPage } = options;\n const [outline, setOutline] = useState<ProcessedOutlineItem[] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchOutline() {\n try {\n setIsLoading(true);\n setError(null);\n\n const rawOutline = await pdfDocument.getOutline();\n\n if (cancelled) return;\n\n if (!rawOutline || rawOutline.length === 0) {\n setOutline([]);\n return;\n }\n\n const processedOutline = await processOutlineItems(\n pdfDocument,\n rawOutline as OutlineItem[],\n 0\n );\n\n if (cancelled) return;\n\n setOutline(processedOutline);\n } catch (err) {\n if (cancelled) return;\n setError(err instanceof Error ? err : new Error('Failed to load outline'));\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchOutline();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDocument]);\n\n const navigateToItem = useCallback(\n (item: ProcessedOutlineItem) => {\n // Use goToPage with resolved pageNumber - reliable and works immediately\n if (goToPage && item.pageNumber) {\n goToPage(item.pageNumber);\n }\n },\n [goToPage]\n );\n\n const flatOutline = useMemo(() => {\n if (!outline) return [];\n return flattenOutline(outline);\n }, [outline]);\n\n const hasOutline = useMemo(() => {\n return outline !== null && outline.length > 0;\n }, [outline]);\n\n return { outline, isLoading, error, navigateToItem, flatOutline, hasOutline };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ThumbnailData } from '../types';\n\nexport interface UseThumbnailsOptions {\n pdfDocument: PDFDocumentProxy;\n /** Width of generated thumbnails in pixels @default 200 */\n thumbnailWidth?: number;\n /** Maximum number of thumbnails to cache @default 150 */\n cacheSize?: number;\n /** If true, preload all thumbnails on mount. Set to false for large PDFs @default false */\n preloadAll?: boolean;\n /** JPEG quality for thumbnail images (0-1) @default 0.8 */\n imageQuality?: number;\n}\n\nexport interface UseThumbnailsResult {\n getThumbnail: (pageNumber: number) => ThumbnailData;\n loadThumbnail: (pageNumber: number) => Promise<void>;\n preloadThumbnails: (pageNumbers: number[]) => void;\n clearCache: () => void;\n totalPages: number;\n thumbnails: Map<number, ThumbnailData>;\n}\n\n/**\n * Hook for generating and caching PDF page thumbnails.\n * Optimized for large documents with LRU caching and batched state updates.\n *\n * @param options - Configuration options\n * @returns Thumbnail utilities and data\n */\n// Maximum concurrent PDF.js render operations to prevent browser freeze\nconst MAX_CONCURRENT_RENDERS = 3;\n\nexport function useThumbnails(options: UseThumbnailsOptions): UseThumbnailsResult {\n const {\n pdfDocument,\n thumbnailWidth = 200,\n cacheSize = 150, // Increased from 50 for better scrolling experience\n preloadAll = false, // Changed to false - let virtualization control loading\n imageQuality = 0.8,\n } = options;\n\n const [thumbnails, setThumbnails] = useState<Map<number, ThumbnailData>>(\n new Map()\n );\n const loadingRef = useRef<Set<number>>(new Set());\n const loadedRef = useRef<Set<number>>(new Set());\n const cacheOrderRef = useRef<number[]>([]);\n\n // Render queue to limit concurrent operations\n const renderQueueRef = useRef<number[]>([]);\n const activeRendersRef = useRef<number>(0);\n const isProcessingRef = useRef<boolean>(false);\n\n // Store thumbnails in ref for stable getThumbnail callback\n const thumbnailsRef = useRef<Map<number, ThumbnailData>>(thumbnails);\n thumbnailsRef.current = thumbnails;\n\n // Batch state updates to reduce re-renders\n const pendingUpdatesRef = useRef<Map<number, ThumbnailData>>(new Map());\n const flushTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const totalPages = pdfDocument.numPages;\n\n // Flush pending updates to state\n const flushUpdates = useCallback(() => {\n if (pendingUpdatesRef.current.size === 0) return;\n\n setThumbnails((prev) => {\n const next = new Map(prev);\n pendingUpdatesRef.current.forEach((data, pageNumber) => {\n next.set(pageNumber, data);\n\n // Update cache order for loaded thumbnails\n if (data.dataUrl && !data.isLoading) {\n cacheOrderRef.current = cacheOrderRef.current.filter(p => p !== pageNumber);\n cacheOrderRef.current.push(pageNumber);\n\n // Evict oldest entries if cache is full\n while (cacheOrderRef.current.length > cacheSize) {\n const toEvict = cacheOrderRef.current.shift()!;\n next.delete(toEvict);\n loadedRef.current.delete(toEvict);\n }\n }\n });\n pendingUpdatesRef.current.clear();\n return next;\n });\n }, [cacheSize]);\n\n // Queue an update for batching\n const queueUpdate = useCallback((pageNumber: number, data: ThumbnailData) => {\n pendingUpdatesRef.current.set(pageNumber, data);\n\n if (!flushTimeoutRef.current) {\n flushTimeoutRef.current = setTimeout(() => {\n flushTimeoutRef.current = null;\n flushUpdates();\n }, 50); // Batch updates every 50ms\n }\n }, [flushUpdates]);\n\n // Internal function to actually render a thumbnail\n const renderThumbnail = useCallback(\n async (pageNumber: number) => {\n try {\n const page = await pdfDocument.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 1 });\n const scale = thumbnailWidth / viewport.width;\n const scaledViewport = page.getViewport({ scale });\n\n const canvas = document.createElement('canvas');\n canvas.width = scaledViewport.width;\n canvas.height = scaledViewport.height;\n const context = canvas.getContext('2d')!;\n\n await page.render({\n canvasContext: context,\n viewport: scaledViewport,\n }).promise;\n\n // Use JPEG for smaller file size (~50% smaller than PNG)\n const dataUrl = canvas.toDataURL('image/jpeg', imageQuality);\n\n // Free canvas memory immediately\n canvas.width = 0;\n canvas.height = 0;\n\n loadedRef.current.add(pageNumber);\n\n // Queue update for batching (reduces re-renders)\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl,\n isLoading: false,\n });\n } catch (error) {\n console.error(`Failed to load thumbnail for page ${pageNumber}:`, error);\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to load',\n });\n } finally {\n loadingRef.current.delete(pageNumber);\n }\n },\n [pdfDocument, thumbnailWidth, imageQuality, queueUpdate]\n );\n\n // Process render queue with concurrency limit\n const processQueue = useCallback(async () => {\n if (isProcessingRef.current) return;\n isProcessingRef.current = true;\n\n while (renderQueueRef.current.length > 0 && activeRendersRef.current < MAX_CONCURRENT_RENDERS) {\n const pageNumber = renderQueueRef.current.shift()!;\n activeRendersRef.current++;\n\n // Don't await - let multiple renders run concurrently up to the limit\n renderThumbnail(pageNumber).finally(() => {\n activeRendersRef.current--;\n // Recursively process more from queue\n if (renderQueueRef.current.length > 0) {\n isProcessingRef.current = false;\n processQueue();\n }\n });\n }\n\n isProcessingRef.current = false;\n }, [renderThumbnail]);\n\n // Public function to request a thumbnail load\n const loadThumbnail = useCallback(\n async (pageNumber: number) => {\n // Skip if already loading, loaded, or in queue\n if (loadingRef.current.has(pageNumber) || loadedRef.current.has(pageNumber)) {\n return;\n }\n\n // Skip if already in queue\n if (renderQueueRef.current.includes(pageNumber)) {\n return;\n }\n\n loadingRef.current.add(pageNumber);\n\n // Queue loading state for batching (reduces re-renders)\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl: null,\n isLoading: true,\n });\n\n // Add to queue and process\n renderQueueRef.current.push(pageNumber);\n processQueue();\n },\n [processQueue, queueUpdate]\n );\n\n // Stable getThumbnail using ref (doesn't change when thumbnails updates)\n const getThumbnail = useCallback(\n (pageNumber: number): ThumbnailData => {\n return (\n thumbnailsRef.current.get(pageNumber) || {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n }\n );\n },\n [] // No dependencies - always stable\n );\n\n const preloadThumbnails = useCallback(\n (pageNumbers: number[]) => {\n pageNumbers.forEach((pageNumber) => {\n loadThumbnail(pageNumber);\n });\n },\n [loadThumbnail]\n );\n\n const clearCache = useCallback(() => {\n setThumbnails(new Map());\n cacheOrderRef.current = [];\n loadingRef.current.clear();\n loadedRef.current.clear();\n }, []);\n\n // Preload all thumbnails on mount if enabled (not recommended for large PDFs)\n useEffect(() => {\n if (preloadAll && totalPages > 0) {\n const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1);\n pageNumbers.forEach((pageNumber) => {\n loadThumbnail(pageNumber);\n });\n }\n }, [preloadAll, totalPages, loadThumbnail]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n loadingRef.current.clear();\n // Clear any pending flush timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n };\n }, []);\n\n return {\n getThumbnail,\n loadThumbnail,\n preloadThumbnails,\n clearCache,\n totalPages,\n thumbnails,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\ninterface PDFViewer {\n scrollPageIntoView: (params: { pageNumber: number }) => void;\n pagesCount: number;\n currentPageNumber?: number;\n}\n\ninterface EventBus {\n on: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n off: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n}\n\ninterface UsePageNavigationOptions {\n viewer: PDFViewer | unknown | null;\n eventBus?: EventBus | unknown | null;\n}\n\ninterface UsePageNavigationResult {\n currentPage: number;\n totalPages: number;\n goToPage: (pageNumber: number) => void;\n}\n\n// Type guard for EventBus\nconst isEventBus = (obj: unknown): obj is EventBus => {\n return obj !== null && typeof obj === 'object' && 'on' in obj && 'off' in obj;\n};\n\n// Type guard for PDFViewer\nconst isViewer = (obj: unknown): obj is PDFViewer => {\n return obj !== null && typeof obj === 'object' && 'scrollPageIntoView' in obj;\n};\n\n/**\n * Hook for tracking current page and navigating to pages\n *\n * @param options - Configuration options\n * @returns Page navigation utilities\n */\nexport function usePageNavigation(\n options: UsePageNavigationOptions\n): UsePageNavigationResult {\n const { viewer, eventBus } = options;\n const [currentPage, setCurrentPage] = useState(1);\n\n // Store viewer ref for stable goToPage callback\n const viewerRef = useRef(viewer);\n viewerRef.current = viewer;\n\n // Subscribe to page changes when eventBus is available\n useEffect(() => {\n if (!eventBus || !isEventBus(eventBus)) {\n return;\n }\n\n const handlePageChange = (evt: { pageNumber: number }) => {\n setCurrentPage(evt.pageNumber);\n };\n\n eventBus.on('pagechanging', handlePageChange);\n\n return () => {\n eventBus.off('pagechanging', handlePageChange);\n };\n }, [eventBus]);\n\n // Reset currentPage to 1 when viewer changes (new PDF loaded)\n const prevViewerRef = useRef(viewer);\n useEffect(() => {\n if (viewer !== prevViewerRef.current) {\n setCurrentPage(1);\n prevViewerRef.current = viewer;\n }\n }, [viewer]);\n\n // Stable goToPage callback using ref\n const goToPage = useCallback(\n (pageNumber: number) => {\n const v = viewerRef.current;\n // Try viewer-based navigation first\n if (v && isViewer(v)) {\n const totalPages = v.pagesCount || 0;\n if (pageNumber >= 1 && pageNumber <= totalPages) {\n // Check if viewer container has valid offsetParent (required by PDF.js)\n const container = (v as { container?: HTMLElement }).container;\n if (container && container.offsetParent) {\n try {\n v.scrollPageIntoView({ pageNumber });\n return;\n } catch {\n // Fall through to DOM-based navigation\n }\n }\n }\n }\n\n // Fallback: DOM-based navigation\n // PDF.js renders pages with data-page-number attribute\n const pageElement = document.querySelector(\n `.page[data-page-number=\"${pageNumber}\"]`\n );\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n setCurrentPage(pageNumber);\n }\n },\n [] // No deps - uses refs\n );\n\n const totalPages = viewer && isViewer(viewer) ? viewer.pagesCount || 0 : 0;\n\n return {\n currentPage,\n totalPages,\n goToPage,\n };\n}\n","import React from 'react';\nimport { Loader2, FileQuestion } from 'lucide-react';\nimport { OutlineItem, OutlineItemRenderProps, OutlineItemStyles, OutlineItemClassNames } from './OutlineItem';\nimport type { ProcessedOutlineItem } from '../../types';\n\n/** Style configuration for DocumentOutline */\nexport interface DocumentOutlineStyles {\n /** Container styles */\n container?: React.CSSProperties;\n /** Loading state container styles */\n loadingContainer?: React.CSSProperties;\n /** Loading spinner styles */\n loadingSpinner?: React.CSSProperties;\n /** Loading text styles */\n loadingText?: React.CSSProperties;\n /** Empty state container styles */\n emptyContainer?: React.CSSProperties;\n /** Empty state icon container styles */\n emptyIconContainer?: React.CSSProperties;\n /** Empty state icon styles */\n emptyIcon?: React.CSSProperties;\n /** Empty state title styles */\n emptyTitle?: React.CSSProperties;\n /** Empty state description styles */\n emptyDescription?: React.CSSProperties;\n}\n\n/** Class name configuration for DocumentOutline (Tailwind-friendly) */\nexport interface DocumentOutlineClassNames {\n /** Container class */\n container?: string;\n /** Loading state container class */\n loadingContainer?: string;\n /** Loading spinner class */\n loadingSpinner?: string;\n /** Loading text class */\n loadingText?: string;\n /** Empty state container class */\n emptyContainer?: string;\n /** Empty state icon container class */\n emptyIconContainer?: string;\n /** Empty state icon class */\n emptyIcon?: string;\n /** Empty state title class */\n emptyTitle?: string;\n /** Empty state description class */\n emptyDescription?: string;\n}\n\nexport interface DocumentOutlineProps {\n /** Processed outline data */\n outline: ProcessedOutlineItem[] | null;\n /** Whether outline is still loading */\n isLoading?: boolean;\n /** Current page number for highlighting */\n currentPage?: number;\n /** Callback when outline item is clicked */\n onNavigate: (item: ProcessedOutlineItem) => void;\n /** Show expand/collapse icons */\n showExpandIcons?: boolean;\n /** Default expanded state for all items */\n defaultExpanded?: boolean;\n /** Maximum depth to render */\n maxDepth?: number;\n /** Custom class name */\n className?: string;\n /** Custom styles for the outline */\n styles?: DocumentOutlineStyles;\n /** Custom class names for the outline (Tailwind-friendly) */\n classNames?: DocumentOutlineClassNames;\n /** Custom styles for outline items */\n itemStyles?: OutlineItemStyles;\n /** Custom class names for outline items (Tailwind-friendly) */\n itemClassNames?: OutlineItemClassNames;\n /** Custom item renderer */\n renderItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Loading content */\n loadingContent?: React.ReactNode;\n}\n\n/**\n * Document outline (table of contents) component.\n * Displays a hierarchical, navigable table of contents for the PDF.\n */\nexport const DocumentOutline: React.FC<DocumentOutlineProps> = ({\n outline,\n isLoading = false,\n currentPage = 1,\n onNavigate,\n showExpandIcons = true,\n defaultExpanded = true,\n maxDepth = 10,\n className = '',\n styles,\n classNames,\n itemStyles,\n itemClassNames,\n renderItem,\n emptyContent,\n loadingContent,\n}) => {\n // Default styles\n const defaultLoadingContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 16px',\n };\n\n const defaultLoadingSpinnerStyle: React.CSSProperties = {\n width: 28,\n height: 28,\n color: 'var(--lp-muted, #94a3b8)',\n marginBottom: 12,\n animation: 'spin 1s linear infinite',\n };\n\n const defaultLoadingTextStyle: React.CSSProperties = {\n fontSize: 13,\n color: 'var(--lp-muted, #64748b)',\n };\n\n const defaultEmptyContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 20px',\n };\n\n const defaultEmptyIconContainerStyle: React.CSSProperties = {\n width: 56,\n height: 56,\n borderRadius: '50%',\n backgroundColor: 'var(--lp-hover, #f1f5f9)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 16,\n };\n\n const defaultEmptyIconStyle: React.CSSProperties = {\n width: 28,\n height: 28,\n color: 'var(--lp-muted, #94a3b8)',\n };\n\n const defaultEmptyTitleStyle: React.CSSProperties = {\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--lp-text, #475569)',\n marginBottom: 4,\n };\n\n const defaultEmptyDescriptionStyle: React.CSSProperties = {\n fontSize: 13,\n color: 'var(--lp-muted, #94a3b8)',\n textAlign: 'center',\n };\n\n const defaultContainerStyle: React.CSSProperties = {\n paddingTop: '8px',\n paddingBottom: '8px',\n };\n\n // Loading state\n if (isLoading) {\n return (\n <div\n className={[className, classNames?.loadingContainer].filter(Boolean).join(' ') || undefined}\n style={{ ...defaultLoadingContainerStyle, ...styles?.loadingContainer }}\n >\n {loadingContent || (\n <>\n <Loader2 className={classNames?.loadingSpinner} style={{ ...defaultLoadingSpinnerStyle, ...styles?.loadingSpinner }} />\n <p className={classNames?.loadingText} style={{ ...defaultLoadingTextStyle, ...styles?.loadingText }}>Loading outline...</p>\n </>\n )}\n </div>\n );\n }\n\n // Empty state\n if (!outline || outline.length === 0) {\n return (\n <div\n className={[className, classNames?.emptyContainer].filter(Boolean).join(' ') || undefined}\n style={{ ...defaultEmptyContainerStyle, ...styles?.emptyContainer }}\n >\n {emptyContent || (\n <>\n <div className={classNames?.emptyIconContainer} style={{ ...defaultEmptyIconContainerStyle, ...styles?.emptyIconContainer }}>\n <FileQuestion className={classNames?.emptyIcon} style={{ ...defaultEmptyIconStyle, ...styles?.emptyIcon }} />\n </div>\n <p className={classNames?.emptyTitle} style={{ ...defaultEmptyTitleStyle, ...styles?.emptyTitle }}>\n No outline available\n </p>\n <p className={classNames?.emptyDescription} style={{ ...defaultEmptyDescriptionStyle, ...styles?.emptyDescription }}>\n This document doesn't have a table of contents\n </p>\n </>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={['document-outline', className, classNames?.container].filter(Boolean).join(' ')}\n style={{ ...defaultContainerStyle, ...styles?.container }}\n >\n {outline.map((item) => (\n <OutlineItem\n key={item.id}\n item={item}\n currentPage={currentPage}\n onNavigate={onNavigate}\n defaultExpanded={defaultExpanded}\n showExpandIcons={showExpandIcons}\n maxDepth={maxDepth}\n styles={itemStyles}\n classNames={itemClassNames}\n renderItem={renderItem}\n />\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport type { ProcessedOutlineItem } from '../../types';\n\n/** Style configuration for outline items */\nexport interface OutlineItemStyles {\n /** Container styles for the item row */\n container?: React.CSSProperties;\n /** Container styles when item is hovered */\n containerHover?: React.CSSProperties;\n /** Container styles when item is active */\n containerActive?: React.CSSProperties;\n /** Expand/collapse button styles */\n expandButton?: React.CSSProperties;\n /** Expand/collapse icon styles */\n expandIcon?: React.CSSProperties;\n /** Active indicator dot styles */\n activeIndicator?: React.CSSProperties;\n /** Title text styles */\n title?: React.CSSProperties;\n /** Title text styles when active */\n titleActive?: React.CSSProperties;\n /** Page number styles */\n pageNumber?: React.CSSProperties;\n /** Page number styles when active */\n pageNumberActive?: React.CSSProperties;\n /** Children container styles */\n childrenContainer?: React.CSSProperties;\n}\n\n/** Class name configuration for outline items (Tailwind-friendly) */\nexport interface OutlineItemClassNames {\n /** Container class for the item row */\n container?: string;\n /** Container class when item is hovered */\n containerHover?: string;\n /** Container class when item is active */\n containerActive?: string;\n /** Expand/collapse button class */\n expandButton?: string;\n /** Expand/collapse icon class */\n expandIcon?: string;\n /** Active indicator dot class */\n activeIndicator?: string;\n /** Title text class */\n title?: string;\n /** Title text class when active */\n titleActive?: string;\n /** Page number class */\n pageNumber?: string;\n /** Page number class when active */\n pageNumberActive?: string;\n /** Children container class */\n childrenContainer?: string;\n}\n\nexport interface OutlineItemProps {\n item: ProcessedOutlineItem;\n currentPage: number;\n onNavigate: (item: ProcessedOutlineItem) => void;\n defaultExpanded?: boolean;\n showExpandIcons?: boolean;\n maxDepth?: number;\n /** Custom styles for the item */\n styles?: OutlineItemStyles;\n /** Custom class names for the item (Tailwind-friendly) */\n classNames?: OutlineItemClassNames;\n renderItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n}\n\nexport interface OutlineItemRenderProps {\n isExpanded: boolean;\n isActive: boolean;\n level: number;\n hasChildren: boolean;\n onToggle: () => void;\n onNavigate: () => void;\n}\n\n/**\n * Recursive outline item component with collapsible children.\n * Clean, modern design with visual hierarchy and smooth interactions.\n */\nexport const OutlineItem: React.FC<OutlineItemProps> = ({\n item,\n currentPage,\n onNavigate,\n defaultExpanded = true,\n showExpandIcons = true,\n maxDepth = 10,\n styles,\n classNames,\n renderItem,\n}) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [isHovered, setIsHovered] = useState(false);\n\n const hasChildren = item.children && item.children.length > 0;\n const isActive = currentPage === item.pageNumber;\n const canShowChildren = item.level < maxDepth;\n\n const handleToggle = () => {\n if (hasChildren) {\n setIsExpanded(!isExpanded);\n }\n };\n\n const handleNavigate = () => {\n onNavigate(item);\n };\n\n const renderProps: OutlineItemRenderProps = {\n isExpanded,\n isActive,\n level: item.level,\n hasChildren,\n onToggle: handleToggle,\n onNavigate: handleNavigate,\n };\n\n // Allow custom rendering\n if (renderItem) {\n return <>{renderItem(item, renderProps)}</>;\n }\n\n // Visual hierarchy based on level\n const indent = 12 + item.level * 16;\n\n // Default styles\n const defaultContainerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n paddingLeft: `${indent}px`,\n cursor: 'pointer',\n position: 'relative',\n transition: 'background-color 0.15s ease',\n backgroundColor: 'transparent',\n borderRadius: '4px',\n margin: '1px 4px',\n };\n\n const defaultExpandButtonStyle: React.CSSProperties = {\n padding: '2px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '3px',\n flexShrink: 0,\n transition: 'background-color 0.15s ease',\n };\n\n const defaultExpandIconStyle: React.CSSProperties = {\n width: 12,\n height: 12,\n color: 'var(--lp-muted, #64748b)',\n };\n\n const defaultActiveIndicatorStyle: React.CSSProperties = {\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: 'var(--lp-accent, #3b82f6)',\n flexShrink: 0,\n };\n\n const defaultTitleStyle: React.CSSProperties = {\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '13px',\n fontWeight: 400,\n fontStyle: item.italic ? 'italic' : 'normal',\n color: 'var(--lp-text, #475569)',\n lineHeight: 1.4,\n };\n\n const defaultTitleActiveStyle: React.CSSProperties = {\n fontWeight: 500,\n color: 'var(--lp-accent, #1e40af)',\n };\n\n const defaultPageNumberStyle: React.CSSProperties = {\n fontSize: '11px',\n color: 'var(--lp-muted, #94a3b8)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n minWidth: '20px',\n textAlign: 'right',\n };\n\n const defaultPageNumberActiveStyle: React.CSSProperties = {\n color: 'var(--lp-accent, #3b82f6)',\n };\n\n const defaultChildrenContainerStyle: React.CSSProperties = {\n position: 'relative',\n };\n\n // Merge styles\n const containerStyle: React.CSSProperties = {\n ...defaultContainerStyle,\n ...styles?.container,\n ...(isHovered && !isActive ? { backgroundColor: 'var(--lp-hover, #f8fafc)', ...styles?.containerHover } : {}),\n ...(isActive ? styles?.containerActive : {}),\n };\n\n const expandButtonStyle: React.CSSProperties = {\n ...defaultExpandButtonStyle,\n ...styles?.expandButton,\n };\n\n const expandIconStyle: React.CSSProperties = {\n ...defaultExpandIconStyle,\n ...styles?.expandIcon,\n };\n\n const activeIndicatorStyle: React.CSSProperties = {\n ...defaultActiveIndicatorStyle,\n ...styles?.activeIndicator,\n };\n\n const titleStyle: React.CSSProperties = {\n ...defaultTitleStyle,\n ...styles?.title,\n ...(isActive ? { ...defaultTitleActiveStyle, ...styles?.titleActive } : {}),\n };\n\n const pageNumberStyle: React.CSSProperties = {\n ...defaultPageNumberStyle,\n ...styles?.pageNumber,\n ...(isActive ? { ...defaultPageNumberActiveStyle, ...styles?.pageNumberActive } : {}),\n };\n\n const childrenContainerStyle: React.CSSProperties = {\n ...defaultChildrenContainerStyle,\n ...styles?.childrenContainer,\n };\n\n // Build class names\n const containerClassName = [\n classNames?.container,\n isHovered && !isActive ? classNames?.containerHover : '',\n isActive ? classNames?.containerActive : '',\n ].filter(Boolean).join(' ');\n\n const titleClassName = [\n classNames?.title,\n isActive ? classNames?.titleActive : '',\n ].filter(Boolean).join(' ');\n\n const pageNumberClassName = [\n classNames?.pageNumber,\n isActive ? classNames?.pageNumberActive : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div className=\"outline-item\">\n <div\n className={containerClassName || undefined}\n style={containerStyle}\n onClick={handleNavigate}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleNavigate();\n }\n }}\n >\n {/* Expand/collapse icon */}\n {showExpandIcons && hasChildren && canShowChildren ? (\n <button\n className={classNames?.expandButton}\n onClick={(e) => {\n e.stopPropagation();\n handleToggle();\n }}\n style={expandButtonStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lp-hover, #e5e7eb)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n {isExpanded ? (\n <ChevronDown className={classNames?.expandIcon} style={expandIconStyle} />\n ) : (\n <ChevronRight className={classNames?.expandIcon} style={expandIconStyle} />\n )}\n </button>\n ) : (\n <div style={{ width: 16, flexShrink: 0 }} />\n )}\n\n {/* Active indicator dot */}\n {isActive && (\n <div className={classNames?.activeIndicator} style={activeIndicatorStyle} />\n )}\n\n {/* Title */}\n <span className={titleClassName || undefined} style={titleStyle} title={item.title}>\n {item.title}\n </span>\n\n {/* Page number */}\n <span className={pageNumberClassName || undefined} style={pageNumberStyle}>\n {item.pageNumber}\n </span>\n </div>\n\n {/* Render children if expanded */}\n {hasChildren && isExpanded && canShowChildren && (\n <div className={classNames?.childrenContainer} style={childrenContainerStyle}>\n {item.children.map((child) => (\n <OutlineItem\n key={child.id}\n item={child}\n currentPage={currentPage}\n onNavigate={onNavigate}\n defaultExpanded={defaultExpanded}\n showExpandIcons={showExpandIcons}\n maxDepth={maxDepth}\n styles={styles}\n classNames={classNames}\n renderItem={renderItem}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useEffect } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { ThumbnailItem } from './ThumbnailItem';\nimport type { ThumbnailData } from '../../types';\n\nexport interface ThumbnailPanelProps {\n /** Total number of pages */\n totalPages: number;\n /** Current page number for highlighting */\n currentPage: number;\n /** Thumbnails map for reactive updates (when thumbnails load, this changes) */\n thumbnails: Map<number, ThumbnailData>;\n /** Function to load a thumbnail */\n loadThumbnail: (pageNumber: number) => Promise<void>;\n /** Callback when thumbnail is clicked */\n onPageSelect: (pageNumber: number) => void;\n /** Show page numbers under thumbnails */\n showPageNumbers?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom thumbnail renderer */\n renderThumbnail?: (\n pageNumber: number,\n thumbnail: ThumbnailData,\n isActive: boolean\n ) => React.ReactNode;\n /** Estimated height of each thumbnail item (including gap) */\n estimatedItemHeight?: number;\n /** Number of items to render outside visible area */\n overscan?: number;\n /** Gap between thumbnail items in pixels */\n gap?: number;\n}\n\n/**\n * Panel displaying page thumbnails with virtual scrolling.\n * Optimized for large PDFs (500+ pages) with only visible items rendered in DOM.\n */\nexport const ThumbnailPanel: React.FC<ThumbnailPanelProps> = ({\n totalPages,\n currentPage,\n thumbnails,\n loadThumbnail,\n onPageSelect,\n showPageNumbers = true,\n className = '',\n renderThumbnail,\n estimatedItemHeight = 300,\n overscan = 5,\n gap = 8,\n}) => {\n // Helper to get thumbnail data from map with fallback\n const getThumbnail = (pageNumber: number): ThumbnailData => {\n return thumbnails.get(pageNumber) || {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n };\n };\n\n const parentRef = useRef<HTMLDivElement>(null);\n\n // Virtual list for performance with large documents\n // Include gap in the item size calculation\n const virtualizer = useVirtualizer({\n count: totalPages,\n getScrollElement: () => parentRef.current,\n estimateSize: () => estimatedItemHeight + gap,\n overscan,\n });\n\n // Store scrollToIndex in a ref to avoid infinite loop\n // (useVirtualizer returns new object reference each render)\n const scrollToIndexRef = useRef(virtualizer.scrollToIndex);\n scrollToIndexRef.current = virtualizer.scrollToIndex;\n\n // Scroll to current page when it changes (e.g., from PDF viewer navigation)\n useEffect(() => {\n if (currentPage > 0 && currentPage <= totalPages) {\n scrollToIndexRef.current(currentPage - 1, { align: 'center' });\n }\n }, [currentPage, totalPages]);\n\n if (totalPages === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 16px',\n }}\n >\n <p style={{ fontSize: 13, color: 'var(--lp-muted, #9ca3af)' }}>No pages to display</p>\n </div>\n );\n }\n\n return (\n <div\n ref={parentRef}\n className={`thumbnail-panel ${className}`}\n style={{\n height: '100%',\n overflow: 'auto',\n padding: '12px',\n }}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const pageNumber = virtualItem.index + 1;\n const thumbnail = getThumbnail(pageNumber);\n const isActive = currentPage === pageNumber;\n\n return (\n <div\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size - gap}px`,\n transform: `translateY(${virtualItem.start}px)`,\n paddingBottom: `${gap}px`,\n }}\n >\n {renderThumbnail ? (\n <div\n onClick={() => onPageSelect(pageNumber)}\n style={{ cursor: 'pointer', height: '100%' }}\n >\n {renderThumbnail(pageNumber, thumbnail, isActive)}\n </div>\n ) : (\n <ThumbnailItem\n pageNumber={pageNumber}\n thumbnail={thumbnail}\n isActive={isActive}\n onLoad={loadThumbnail}\n onClick={onPageSelect}\n showPageNumber={showPageNumbers}\n />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Loader2, AlertCircle } from 'lucide-react';\nimport type { ThumbnailData } from '../../types';\n\nexport interface ThumbnailItemProps {\n pageNumber: number;\n thumbnail: ThumbnailData;\n isActive: boolean;\n onLoad: (pageNumber: number) => void;\n onClick: (pageNumber: number) => void;\n showPageNumber?: boolean;\n className?: string;\n}\n\n/**\n * Single thumbnail item with lazy loading via IntersectionObserver.\n * Clean, minimal design with smooth hover and active states.\n * Memoized to prevent unnecessary re-renders in virtualized lists.\n */\nexport const ThumbnailItem = React.memo<ThumbnailItemProps>(({\n pageNumber,\n thumbnail,\n isActive,\n onLoad,\n onClick,\n showPageNumber = true,\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const hasLoadedRef = useRef(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Lazy load thumbnail when visible\n useEffect(() => {\n const element = containerRef.current;\n if (!element || hasLoadedRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !hasLoadedRef.current) {\n hasLoadedRef.current = true;\n onLoad(pageNumber);\n observer.disconnect();\n }\n });\n },\n {\n rootMargin: '200px',\n threshold: 0.1,\n }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [pageNumber, onLoad]);\n\n const handleClick = () => {\n onClick(pageNumber);\n };\n\n // Dynamic styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '6px',\n cursor: 'pointer',\n borderRadius: '6px',\n transition: 'all 0.15s ease',\n backgroundColor: isActive ? 'rgba(59, 130, 246, 0.08)' : isHovered ? 'rgba(0, 0, 0, 0.03)' : 'transparent',\n border: isActive ? '2px solid #3b82f6' : '2px solid transparent',\n };\n\n // Image wrapper - width 90%, height auto with aspect ratio\n const imageContainerStyle: React.CSSProperties = {\n position: 'relative',\n width: '85%',\n aspectRatio: '8.5 / 11', // Standard page aspect ratio\n backgroundColor: 'var(--lp-bg, #ffffff)',\n borderRadius: '4px',\n overflow: 'hidden',\n boxShadow: isActive\n ? '0 4px 12px rgba(59, 130, 246, 0.25)'\n : isHovered\n ? '0 4px 12px rgba(0, 0, 0, 0.12)'\n : '0 1px 3px rgba(0, 0, 0, 0.08)',\n transition: 'box-shadow 0.15s ease',\n };\n\n const pageNumberStyle: React.CSSProperties = {\n marginTop: '6px',\n fontSize: '11px',\n fontWeight: 500,\n color: isActive ? 'var(--lp-accent, #3b82f6)' : 'var(--lp-muted, #6b7280)',\n transition: 'color 0.15s ease',\n };\n\n return (\n <div\n ref={containerRef}\n className={`thumbnail-item ${className}`}\n style={containerStyle}\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n aria-label={`Page ${pageNumber}${isActive ? ' (current)' : ''}`}\n aria-current={isActive ? 'page' : undefined}\n >\n {/* Thumbnail image container */}\n <div style={imageContainerStyle}>\n {/* Loading state */}\n {thumbnail.isLoading && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--lp-hover, #f9fafb)',\n }}\n >\n <Loader2\n style={{\n width: 24,\n height: 24,\n color: 'var(--lp-muted, #9ca3af)',\n animation: 'spin 1s linear infinite',\n }}\n />\n </div>\n )}\n\n {/* Error state */}\n {thumbnail.error && !thumbnail.isLoading && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#fef2f2',\n }}\n >\n <AlertCircle style={{ width: 20, height: 20, color: '#f87171', marginBottom: 4 }} />\n <span style={{ fontSize: 10, color: '#9ca3af' }}>Failed</span>\n </div>\n )}\n\n {/* Thumbnail image */}\n {thumbnail.dataUrl && !thumbnail.isLoading && (\n <img\n src={thumbnail.dataUrl}\n alt={`Page ${pageNumber}`}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n }}\n draggable={false}\n />\n )}\n\n {/* Placeholder when not yet loaded */}\n {!thumbnail.dataUrl && !thumbnail.isLoading && !thumbnail.error && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--lp-hover, #f9fafb)',\n }}\n >\n <span\n style={{\n fontSize: 24,\n fontWeight: 300,\n color: 'var(--lp-muted, #d1d5db)',\n }}\n >\n {pageNumber}\n </span>\n </div>\n )}\n </div>\n\n {/* Page number label */}\n {showPageNumber && (\n <div style={pageNumberStyle}>\n {pageNumber}\n </div>\n )}\n </div>\n );\n});\n","import {\n PdfHighlighter,\n PdfHighlighterProps,\n PdfHighlighterTheme,\n} from \"./components/PdfHighlighter\";\nimport {\n TextHighlight,\n TextHighlightProps,\n TextHighlightStyle,\n} from \"./components/TextHighlight\";\nimport {\n MonitoredHighlightContainer,\n MonitoredHighlightContainerProps,\n} from \"./components/MonitoredHighlightContainer\";\nimport {\n AreaHighlight,\n AreaHighlightProps,\n AreaHighlightStyle,\n} from \"./components/AreaHighlight\";\nimport {\n FreetextHighlight,\n FreetextHighlightProps,\n FreetextStyle,\n} from \"./components/FreetextHighlight\";\nimport {\n ImageHighlight,\n ImageHighlightProps,\n} from \"./components/ImageHighlight\";\nimport {\n SignaturePad,\n SignaturePadProps,\n} from \"./components/SignaturePad\";\nimport {\n DrawingCanvas,\n DrawingCanvasProps,\n} from \"./components/DrawingCanvas\";\nimport {\n DrawingHighlight,\n DrawingHighlightProps,\n} from \"./components/DrawingHighlight\";\nimport {\n ShapeCanvas,\n ShapeCanvasProps,\n} from \"./components/ShapeCanvas\";\nimport {\n ShapeHighlight,\n ShapeHighlightProps,\n ShapeStyle,\n} from \"./components/ShapeHighlight\";\nimport { PdfLoader, PdfLoaderProps } from \"./components/PdfLoader\";\nimport {\n HighlightContainerUtils,\n useHighlightContainerContext,\n} from \"./contexts/HighlightContext\";\nimport {\n viewportPositionToScaled,\n scaledPositionToViewport,\n} from \"./lib/coordinates\";\nimport type {\n ExportPdfOptions,\n ExportableHighlight,\n} from \"./lib/export-pdf\";\nimport {\n extractPageTextItems,\n extractSentences,\n extractTextUnits,\n getTextPosition,\n sentenceToHighlight,\n} from \"./lib/extract-sentences\";\nimport type {\n ExtractSentencesOptions,\n PdfColumnDetection,\n PdfExtractedPage,\n PdfReadingOrder,\n PdfSentence,\n PdfSentenceSource,\n TextPositionMatch,\n PdfTextColumn,\n PdfTextUnit,\n PdfTextUnitType,\n PdfTextItem,\n} from \"./lib/extract-sentences\";\n\nimport {\n PdfHighlighterUtils,\n PdfSearchOptions,\n usePdfHighlighterContext,\n} from \"./contexts/PdfHighlighterContext\";\n\n// Left Panel components\nimport {\n LeftPanel,\n LeftPanelProps,\n LeftPanelTheme,\n TabStyles,\n TabClassNames,\n FooterStyles,\n FooterClassNames,\n ToggleButtonStyles,\n ToggleButtonClassNames,\n} from \"./components/leftpanel/LeftPanel\";\nimport {\n DocumentOutline,\n DocumentOutlineProps,\n DocumentOutlineStyles,\n DocumentOutlineClassNames,\n} from \"./components/leftpanel/DocumentOutline\";\nimport {\n ThumbnailPanel,\n ThumbnailPanelProps,\n} from \"./components/leftpanel/ThumbnailPanel\";\nimport {\n ThumbnailItem,\n ThumbnailItemProps,\n} from \"./components/leftpanel/ThumbnailItem\";\nimport {\n OutlineItem,\n OutlineItemProps,\n OutlineItemRenderProps,\n OutlineItemStyles,\n OutlineItemClassNames,\n} from \"./components/leftpanel/OutlineItem\";\nimport {\n LeftPanelUtils,\n useLeftPanelContext,\n} from \"./contexts/LeftPanelContext\";\n\n// Left Panel hooks\nimport { useDocumentOutline } from \"./hooks/useDocumentOutline\";\nimport { useThumbnails } from \"./hooks/useThumbnails\";\nimport { usePageNavigation } from \"./hooks/usePageNavigation\";\n\nconst exportPdf: typeof import(\"./lib/export-pdf\").exportPdf = async (\n ...args\n) => {\n const { exportPdf } = await import(\"./lib/export-pdf\");\n return exportPdf(...args);\n};\n\nexport {\n PdfHighlighter,\n PdfLoader,\n TextHighlight,\n MonitoredHighlightContainer,\n AreaHighlight,\n FreetextHighlight,\n ImageHighlight,\n SignaturePad,\n DrawingCanvas,\n DrawingHighlight,\n ShapeCanvas,\n ShapeHighlight,\n useHighlightContainerContext,\n viewportPositionToScaled,\n scaledPositionToViewport,\n usePdfHighlighterContext,\n exportPdf,\n // Left Panel\n LeftPanel,\n DocumentOutline,\n ThumbnailPanel,\n ThumbnailItem,\n OutlineItem,\n useLeftPanelContext,\n useDocumentOutline,\n useThumbnails,\n usePageNavigation,\n extractPageTextItems,\n extractSentences,\n extractTextUnits,\n getTextPosition,\n sentenceToHighlight,\n};\n\nexport type {\n HighlightContainerUtils,\n PdfHighlighterUtils,\n PdfSearchOptions,\n PdfHighlighterProps,\n PdfHighlighterTheme,\n TextHighlightProps,\n TextHighlightStyle,\n MonitoredHighlightContainerProps,\n AreaHighlightProps,\n AreaHighlightStyle,\n FreetextHighlightProps,\n FreetextStyle,\n ImageHighlightProps,\n SignaturePadProps,\n DrawingCanvasProps,\n DrawingHighlightProps,\n ShapeCanvasProps,\n ShapeHighlightProps,\n ShapeStyle,\n PdfLoaderProps,\n ExportPdfOptions,\n ExportableHighlight,\n ExtractSentencesOptions,\n PdfColumnDetection,\n PdfExtractedPage,\n PdfReadingOrder,\n PdfSentence,\n PdfSentenceSource,\n TextPositionMatch,\n PdfTextColumn,\n PdfTextUnit,\n PdfTextUnitType,\n PdfTextItem,\n // Left Panel types\n LeftPanelProps,\n LeftPanelTheme,\n TabStyles,\n TabClassNames,\n FooterStyles,\n FooterClassNames,\n ToggleButtonStyles,\n ToggleButtonClassNames,\n DocumentOutlineProps,\n DocumentOutlineStyles,\n DocumentOutlineClassNames,\n ThumbnailPanelProps,\n ThumbnailItemProps,\n OutlineItemProps,\n OutlineItemRenderProps,\n OutlineItemStyles,\n OutlineItemClassNames,\n LeftPanelUtils,\n};\nexport * from \"./types\";\n"],"mappings":"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","names":["React","useEffect","useLayoutEffect","useRef","useState","pageNumber","X0","X1","Y0","Y1","document","React","createContext","useContext","React","React","useEffect","useRef","useState","getBoundingRect","useState","useRef","useEffect","event","React","React","useRef","useEffect","useCallback","useState","useRef","useState","useCallback","useEffect","React","React","useRef","useState","useState","useRef","React","DEFAULT_DARK_MODE_COLORS","useRef","useState","useLayoutEffect","useEffect","React","findPrevious","React","useState","useRef","useEffect","useLayoutEffect","rect","React","useState","useRef","useLayoutEffect","useEffect","React","useRef","React","useEffect","useRef","useRef","React","React","useState","useRef","useEffect","useLayoutEffect","createPortal","DefaultStyleIcon","React","DefaultDeleteIcon","DefaultCopyIcon","DefaultCopiedIcon","DEFAULT_COLOR_PRESETS","useState","useRef","useLayoutEffect","useEffect","createPortal","React","useState","useRef","useEffect","Rnd","React","DefaultStyleIcon","DefaultDeleteIcon","useState","useRef","useEffect","Rnd","React","Rnd","DefaultDragIcon","React","DefaultDeleteIcon","Rnd","React","useRef","useEffect","useCallback","React","useState","useCallback","useEffect","useLayoutEffect","useRef","createPortal","Rnd","DefaultDragIcon","React","DefaultDeleteIcon","useState","useRef","useLayoutEffect","useEffect","useCallback","createPortal","Rnd","React","useState","useRef","useEffect","useLayoutEffect","createPortal","Rnd","DefaultStyleIcon","React","DefaultDeleteIcon","DEFAULT_COLOR_PRESETS","STROKE_WIDTHS","useState","useRef","useLayoutEffect","useEffect","createPortal","Rnd","React","useEffect","useRef","useState","getDocument","document","leadingWhitespace","window","React","useState","useMemo","useCallback","useRef","useEffect","ChevronRight","createContext","useContext","useState","useEffect","useCallback","useMemo","useState","useCallback","useRef","useEffect","useState","useEffect","useCallback","useRef","totalPages","React","React","useState","React","React","useRef","useEffect","React","useEffect","useRef","useState","Loader2","useRef","useEffect","React","defaultDarkTheme","useMemo","useState","useCallback","useRef","useEffect","React","ChevronRight","exportPdf"]}
1
+ {"version":3,"sources":["../../src/contexts/PdfHighlighterContext.ts","../../src/lib/coordinates.ts","../../src/lib/dark-mode.ts","../../src/lib/recolor-context.ts","../../src/lib/get-bounding-rect.ts","../../src/lib/optimize-client-rects.ts","../../src/lib/get-client-rects.ts","../../src/lib/group-highlights-by-page.ts","../../src/lib/pdfjs-dom.ts","../../src/components/DrawingCanvas.tsx","../../src/contexts/HighlightContext.ts","../../src/lib/screenshot.ts","../../src/components/HighlightLayer.tsx","../../src/components/MouseSelection.tsx","../../src/components/ShapeCanvas.tsx","../../src/components/TipContainer.tsx","../../src/components/PdfHighlighter.tsx","../../src/lib/copy-highlight-content.ts","../../src/lib/highlight-config-layer.ts","../../src/components/TextHighlight.tsx","../../src/components/MouseMonitor.tsx","../../src/components/MonitoredHighlightContainer.tsx","../../src/components/AreaHighlight.tsx","../../src/components/FreetextHighlight.tsx","../../src/components/ImageHighlight.tsx","../../src/components/SignaturePad.tsx","../../src/components/DrawingHighlight.tsx","../../src/components/ShapeHighlight.tsx","../../src/components/PdfLoader.tsx","../../src/lib/extract-sentences.ts","../../src/contexts/LeftPanelContext.ts","../../src/hooks/useDocumentOutline.ts","../../src/hooks/useThumbnails.ts","../../src/hooks/usePageNavigation.ts","../../src/components/leftpanel/OutlineItem.tsx","../../src/components/leftpanel/DocumentOutline.tsx","../../src/components/leftpanel/ThumbnailItem.tsx","../../src/components/leftpanel/ThumbnailPanel.tsx","../../src/components/leftpanel/LeftPanel.tsx","../../src/index.ts"],"names":["pageNumber","X0","X1","Y0","Y1","document","useEffect","React","createContext","useContext","getBoundingRect","useState","useRef","event","useCallback","DEFAULT_DARK_MODE_COLORS","useLayoutEffect","findPrevious","rect","DefaultDeleteIcon","Trash2","DefaultCopyIcon","Copy","DefaultCopiedIcon","Check","ChevronDownIcon","ChevronDown","CheckIcon","DEFAULT_COLOR_PRESETS","COLOR_NAMES","memo","createPortal","DefaultStyleIcon","Palette","Rnd","Pencil","RotateCcw","RotateCw","STROKE_WIDTHS","getDocument","leadingWhitespace","window","useMemo","totalPages","Loader2","defaultDarkTheme","ChevronRight","exportPdf"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, useEffect } from \"react\";\nimport { GhostHighlight, Highlight, PdfSelection, Tip } from \"../types\";\nimport { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\n\n/**\n * Options for searching text in the PDF document.\n *\n * @category Type\n */\nexport type PdfSearchOptions = {\n /** If true, search is case-sensitive. */\n caseSensitive?: boolean;\n /** If true, only whole-word matches are returned. */\n entireWord?: boolean;\n /** If true, all matches are highlighted, not just the selected match. */\n highlightAll?: boolean;\n /** If true, diacritics must match exactly. */\n matchDiacritics?: boolean;\n};\n\n/**\n * A set of utilities for to control the behaviour of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport type PdfHighlighterUtils = {\n /**\n * Checks whether a selection is progress, a ghost highlight, or an edit.\n *\n * @returns - `true` if editing, ghost highlighting, or selecting.\n */\n isEditingOrHighlighting(): boolean;\n\n /**\n * Get currently selected area or text selection.\n *\n * @returns - current selection or `null` if no selection is being made.\n */\n getCurrentSelection(): PdfSelection | null;\n\n /**\n * Get the currently present ghost highlight.\n *\n * @return - currently present ghost highlight or `null` if non-existent.\n */\n getGhostHighlight(): GhostHighlight | null;\n\n /**\n * Cancel any ghost highlight.\n * The selected area will stay selected until the user clicks away.\n */\n removeGhostHighlight(): void;\n /**\n * If enabled, automatic tips/popups inside of a PdfHighlighter will be disabled.\n * Additional niceties will also be provided to prevent new highlights being made.\n */\n toggleEditInProgress(flag?: boolean): void;\n\n /**\n * Whether an AreaHighlight is being moved/resized, or a manual highlight edit has\n * been toggled.\n *\n * @returns - `true` if AreaHighlight is being edited or edit mode was set.\n */\n isEditInProgress(): boolean;\n\n /**\n * Whether a mouse selection or text selection is currently being performed.\n *\n * @returns - `true` if mouse selection or text selection is being performed.\n */\n isSelectionInProgress(): boolean;\n\n /**\n * Scroll to a highlight in this viewer.\n *\n * @param highlight - A highlight provided to the {@link PdfHighlighter} to\n * scroll to.\n */\n scrollToHighlight(highlight: Highlight): void;\n\n /**\n * Get a reference to the currently used instance of a PDF Viewer.\n *\n * @returns - The currently active PDF Viewer.\n */\n getViewer(): PDFViewer | null;\n\n /**\n * Get the currently active tip, if any.\n *\n * @returns - the currently active tip or `null` if inactive.\n */\n getTip(): Tip | null;\n\n /**\n * Set a tip to be displayed in the current PDF Viewer.\n *\n * @param tip - tip to be displayed, or `null` to hide any tip.\n */\n setTip(tip: Tip | null): void;\n\n /**\n * Callback to update any currently active tip's position. This will make sure\n * the tip is visible above/below its highlight.\n */\n updateTipPosition(): void;\n\n /**\n * Get the PDF link service instance for navigation.\n *\n * @returns - The currently active PDF link service or null.\n */\n getLinkService(): unknown | null;\n\n /**\n * Get the event bus instance for page events.\n *\n * @returns - The currently active event bus or null.\n */\n getEventBus(): unknown | null;\n\n /**\n * Navigate to a specific page number.\n *\n * @param pageNumber - 1-indexed page number to navigate to.\n */\n goToPage(pageNumber: number): void;\n\n /**\n * Search for text in the PDF document.\n *\n * @param query - Search text.\n * @param options - Search options.\n */\n search(query: string, options?: PdfSearchOptions): void;\n\n /**\n * Move to the next search result.\n */\n findNext(): void;\n\n /**\n * Move to the previous search result.\n */\n findPrevious(): void;\n\n /**\n * Clear active search highlights.\n */\n clearSearch(): void;\n\n /**\n * Marks a highlight as selected/deselected (its floating toolbar is open).\n * Counter-backed, so overlapping select/deselect from different highlights\n * resolves correctly. Used to suppress hover tips while a toolbar is shown.\n */\n setHighlightSelected(selected: boolean): void;\n\n /**\n * Whether any highlight is currently selected (toolbar showing).\n */\n isHighlightSelected(): boolean;\n};\n\nexport const PdfHighlighterContext = createContext<\n PdfHighlighterUtils | undefined\n>(undefined);\n\n/**\n * Custom hook for providing {@link PdfHighlighterUtils}. Must be used\n * within a child of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport const usePdfHighlighterContext = () => {\n const pdfHighlighterUtils = useContext(PdfHighlighterContext);\n\n if (pdfHighlighterUtils === undefined) {\n throw new Error(\n \"usePdfHighlighterContext must be used within PdfHighlighter!\",\n );\n }\n\n return pdfHighlighterUtils;\n};\n\n/**\n * Keeps hover tips out of the way while a highlight is selected: clears the\n * active tip immediately and marks the selection for its whole duration so\n * MonitoredHighlightContainer suppresses new hover tips until deselect —\n * the floating toolbar and the popup would otherwise fight for the same space\n * above the highlight. Safe outside PdfHighlighter (no-op).\n *\n * @category Context\n * @internal\n */\nexport const useClearTipWhileSelected = (isSelected: boolean) => {\n const pdfHighlighterUtils = useContext(PdfHighlighterContext);\n useEffect(() => {\n if (!isSelected || !pdfHighlighterUtils) return;\n pdfHighlighterUtils.setTip(null);\n pdfHighlighterUtils.setHighlightSelected(true);\n return () => pdfHighlighterUtils.setHighlightSelected(false);\n }, [isSelected, pdfHighlighterUtils]);\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport type { LTWHP, ViewportPosition, Scaled, ScaledPosition } from \"../types\";\nimport { PageViewport } from \"pdfjs-dist\";\n\ninterface WIDTH_HEIGHT {\n width: number;\n height: number;\n}\n\n/** @category Utilities */\nexport const viewportToScaled = (\n rect: LTWHP,\n { width, height }: WIDTH_HEIGHT,\n): Scaled => {\n return {\n x1: rect.left,\n y1: rect.top,\n\n x2: rect.left + rect.width,\n y2: rect.top + rect.height,\n\n width,\n height,\n\n pageNumber: rect.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const viewportPositionToScaled = (\n { boundingRect, rects }: ViewportPosition,\n viewer: PDFViewer,\n): ScaledPosition => {\n const pageNumber = boundingRect.pageNumber;\n const viewport = viewer.getPageView(pageNumber - 1).viewport; // Account for 1 indexing of PDF documents\n const scale = (obj: LTWHP) => viewportToScaled(obj, viewport);\n\n return {\n boundingRect: scale(boundingRect),\n rects: (rects || []).map(scale),\n };\n};\n\nconst pdfToViewport = (pdf: Scaled, viewport: PageViewport): LTWHP => {\n const [x1, y1, x2, y2] = viewport.convertToViewportRectangle([\n pdf.x1,\n pdf.y1,\n pdf.x2,\n pdf.y2,\n ]);\n\n return {\n left: Math.min(x1, x2),\n top: Math.min(y1, y2),\n\n width: Math.abs(x2 - x1),\n height: Math.abs(y1 - y2),\n\n pageNumber: pdf.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const scaledToViewport = (\n scaled: Scaled,\n viewport: PageViewport,\n usePdfCoordinates: boolean = false,\n): LTWHP => {\n const { width, height } = viewport;\n\n if (usePdfCoordinates) {\n return pdfToViewport(scaled, viewport);\n }\n\n if (scaled.x1 === undefined) {\n throw new Error(\"You are using old position format, please update\");\n }\n\n const x1 = (width * scaled.x1) / scaled.width;\n const y1 = (height * scaled.y1) / scaled.height;\n\n const x2 = (width * scaled.x2) / scaled.width;\n const y2 = (height * scaled.y2) / scaled.height;\n\n return {\n left: x1,\n top: y1,\n width: x2 - x1,\n height: y2 - y1,\n pageNumber: scaled.pageNumber,\n };\n};\n\n/** @category Utilities */\nexport const scaledPositionToViewport = (\n { boundingRect, rects, usePdfCoordinates }: ScaledPosition,\n viewer: PDFViewer,\n): ViewportPosition => {\n const pageNumber = boundingRect.pageNumber;\n const viewport = viewer.getPageView(pageNumber - 1).viewport; // Account for 1 indexing of PDF documents\n const scale = (obj: Scaled) =>\n scaledToViewport(obj, viewport, usePdfCoordinates);\n\n return {\n boundingRect: scale(boundingRect),\n rects: (rects || []).map(scale),\n };\n};\n","// Ported from @anaralabs/lector (lib/dark-mode.ts). Pure, self-contained.\n// Hue-preserving dark-mode recolor: flips perceived lightness onto a\n// background<->foreground ramp in OKLab while keeping hue/chroma, so red stays\n// red and blue links stay blue (unlike a CSS invert + hue-rotate).\n\nexport type ColorScheme = \"light\" | \"dark\";\n\nexport interface DarkModeColors {\n /** Replaces the white paper background. Any CSS hex/rgb color. */\n background?: string;\n /** Replaces black text and line art. Any CSS hex/rgb color. */\n foreground?: string;\n}\n\n/**\n * Maps a color from the original document to its dark-scheme equivalent.\n * Unparseable and fully-transparent colors are returned unchanged.\n */\nexport type RenderColorMap = (color: string) => string;\n\n// Darker warm gray (red >= green >= blue): easier on the eyes than a cool or\n// pure-black surface, and white paper maps onto it exactly.\nexport const DEFAULT_DARK_MODE_COLORS: Required<DarkModeColors> = {\n background: \"#141210\",\n foreground: \"#eae6e0\",\n};\n\ntype Rgba = [number, number, number, number];\ntype Lab = [number, number, number];\n\nconst NAMED_COLORS: Record<string, Rgba> = {\n white: [1, 1, 1, 1],\n black: [0, 0, 0, 1],\n transparent: [0, 0, 0, 0],\n};\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\nfunction parseColor(input: string): Rgba | null {\n const str = input.trim().toLowerCase();\n // hasOwn: a plain-object lookup would resolve \"constructor\"/\"__proto__\".\n const named = Object.hasOwn(NAMED_COLORS, str)\n ? NAMED_COLORS[str]\n : undefined;\n if (named) return named;\n\n if (str.startsWith(\"#\")) {\n const hex = str.slice(1);\n if (!/^[0-9a-f]{3,8}$/.test(hex)) return null;\n if (hex.length === 3 || hex.length === 4) {\n const r = Number.parseInt(hex[0]!, 16) / 15;\n const g = Number.parseInt(hex[1]!, 16) / 15;\n const b = Number.parseInt(hex[2]!, 16) / 15;\n const a = hex.length === 4 ? Number.parseInt(hex[3]!, 16) / 15 : 1;\n return [r, g, b, a];\n }\n if (hex.length === 6 || hex.length === 8) {\n const r = Number.parseInt(hex.slice(0, 2), 16) / 255;\n const g = Number.parseInt(hex.slice(2, 4), 16) / 255;\n const b = Number.parseInt(hex.slice(4, 6), 16) / 255;\n const a =\n hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n return null;\n }\n\n const fn = /^rgba?\\(([^)]+)\\)$/.exec(str);\n if (fn) {\n const parts = fn[1]!.split(/[,\\s/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const channel = (part: string) =>\n part.endsWith(\"%\")\n ? Number.parseFloat(part) / 100\n : Number.parseFloat(part) / 255;\n const alpha = (part: string) =>\n part.endsWith(\"%\")\n ? Number.parseFloat(part) / 100\n : Number.parseFloat(part);\n const r = channel(parts[0]!);\n const g = channel(parts[1]!);\n const b = channel(parts[2]!);\n const a = parts[3] !== undefined ? alpha(parts[3]) : 1;\n if (\n Number.isNaN(r) ||\n Number.isNaN(g) ||\n Number.isNaN(b) ||\n Number.isNaN(a)\n )\n return null;\n return [clamp01(r), clamp01(g), clamp01(b), clamp01(a)];\n }\n\n // Last resort for the rest of the CSS color grammar (named colors,\n // hsl()/oklch()/color-mix()/...): let the browser normalize it to a\n // hex/rgba serialization, then parse that.\n const normalized = normalizeCssColor(str);\n if (normalized !== null && normalized !== str) return parseColor(normalized);\n\n return null;\n}\n\nlet normalizeCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Normalizes any valid CSS color to its canvas fillStyle serialization\n * (\"#rrggbb\" or \"rgba(...)\"). Returns null for invalid colors (assigning\n * one leaves fillStyle unchanged, detected by priming with two different\n * values) and outside the DOM (SSR).\n */\nfunction normalizeCssColor(input: string): string | null {\n if (normalizeCtx === undefined) {\n normalizeCtx =\n typeof document === \"undefined\"\n ? null\n : document.createElement(\"canvas\").getContext(\"2d\", {\n willReadFrequently: true,\n });\n }\n const ctx = normalizeCtx;\n if (!ctx) return null;\n ctx.fillStyle = \"#000000\";\n ctx.fillStyle = input;\n const first = ctx.fillStyle;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillStyle = input;\n return first === ctx.fillStyle ? first : null;\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\n// sRGB <-> OKLab, reference implementation by Björn Ottosson (public domain).\nfunction rgbToOklab(r: number, g: number, b: number): Lab {\n const lr = srgbToLinear(r);\n const lg = srgbToLinear(g);\n const lb = srgbToLinear(b);\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\nfunction oklabToLinearRgb(L: number, a: number, b: number): Lab {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst GAMUT_EPSILON = 0.0005;\n\nfunction oklabToSrgbExact(L: number, a: number, b: number): Lab | null {\n const [lr, lg, lb] = oklabToLinearRgb(L, a, b);\n if (\n lr < -GAMUT_EPSILON ||\n lr > 1 + GAMUT_EPSILON ||\n lg < -GAMUT_EPSILON ||\n lg > 1 + GAMUT_EPSILON ||\n lb < -GAMUT_EPSILON ||\n lb > 1 + GAMUT_EPSILON\n ) {\n return null;\n }\n return [\n linearToSrgb(clamp01(lr)),\n linearToSrgb(clamp01(lg)),\n linearToSrgb(clamp01(lb)),\n ];\n}\n\n/** Reduce chroma until the color fits the sRGB gamut, then hard-clamp. */\nfunction oklabToSrgbGamutMapped(L: number, a: number, b: number): Lab {\n const exact = oklabToSrgbExact(L, a, b);\n if (exact) return exact;\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 12; i++) {\n const mid = (lo + hi) / 2;\n if (oklabToSrgbExact(L, a * mid, b * mid)) lo = mid;\n else hi = mid;\n }\n const [lr, lg, lb] = oklabToLinearRgb(L, a * lo, b * lo);\n return [\n linearToSrgb(clamp01(lr)),\n linearToSrgb(clamp01(lg)),\n linearToSrgb(clamp01(lb)),\n ];\n}\n\nfunction toHexByte(channel: number): string {\n return Math.round(clamp01(channel) * 255)\n .toString(16)\n .padStart(2, \"0\");\n}\n\nfunction toCssColor(r: number, g: number, b: number, a: number): string {\n const rgb = `#${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`;\n return a >= 1 ? rgb : `${rgb}${toHexByte(a)}`;\n}\n\n// Above this OKLab chroma a color fully keeps its own hue/chroma; below it,\n// it is progressively pulled onto the background<->foreground ramp so the\n// palette's tint applies to grays too.\nconst NEUTRAL_CHROMA_THRESHOLD = 0.04;\n\nconst COLOR_CACHE_MAX = 4096;\nconst mapInstances = new Map<string, RenderColorMap>();\n\n/**\n * Builds a memoized color map that flips perceived lightness onto the\n * background<->foreground ramp while preserving hue and chroma (OKLab).\n * Position on the ramp follows gamma-encoded BT.709 luma so saturated accents\n * move the way readers expect (red becomes pink, not cyan; blue links become\n * light blue). Neutrals land exactly on the ramp: white maps to `background`,\n * black to `foreground`, including the palette's tint.\n */\nexport function createDarkModeColorMap(colors?: DarkModeColors): RenderColorMap {\n const background = colors?.background ?? DEFAULT_DARK_MODE_COLORS.background;\n const foreground = colors?.foreground ?? DEFAULT_DARK_MODE_COLORS.foreground;\n const instanceKey = `${background}|${foreground}`;\n const existing = mapInstances.get(instanceKey);\n if (existing) {\n // LRU touch: keep palettes in active use away from the eviction end.\n mapInstances.delete(instanceKey);\n mapInstances.set(instanceKey, existing);\n return existing;\n }\n\n const bgRgba =\n parseColor(background) ?? parseColor(DEFAULT_DARK_MODE_COLORS.background)!;\n const fgRgba =\n parseColor(foreground) ?? parseColor(DEFAULT_DARK_MODE_COLORS.foreground)!;\n const bgLab = rgbToOklab(bgRgba[0], bgRgba[1], bgRgba[2]);\n const fgLab = rgbToOklab(fgRgba[0], fgRgba[1], fgRgba[2]);\n\n const cache = new Map<string, string>();\n // Exact poles: pure white/black must reproduce the palette strings verbatim\n // (no float round-tripping), so page backgrounds match CSS.\n const backgroundCss = toCssColor(bgRgba[0], bgRgba[1], bgRgba[2], 1);\n const foregroundCss = toCssColor(fgRgba[0], fgRgba[1], fgRgba[2], 1);\n const seedPoles = () => {\n for (const white of [\"#ffffff\", \"#fff\", \"white\"])\n cache.set(white, backgroundCss);\n for (const black of [\"#000000\", \"#000\", \"black\"])\n cache.set(black, foregroundCss);\n };\n seedPoles();\n\n const transform = (input: string): string => {\n const parsed = parseColor(input);\n if (!parsed || parsed[3] === 0) return input;\n const [r, g, b, alpha] = parsed;\n const [, labA, labB] = rgbToOklab(r, g, b);\n // Gamma-encoded BT.709 luma as ramp position: 0 = black, 1 = white.\n const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n const rampL = fgLab[0] + (bgLab[0] - fgLab[0]) * luma;\n const rampA = fgLab[1] + (bgLab[1] - fgLab[1]) * luma;\n const rampB = fgLab[2] + (bgLab[2] - fgLab[2]) * luma;\n const chroma = Math.hypot(labA, labB);\n const hueWeight = Math.min(1, chroma / NEUTRAL_CHROMA_THRESHOLD);\n const outA = rampA + (labA - rampA) * hueWeight;\n const outB = rampB + (labB - rampB) * hueWeight;\n const [sr, sg, sb] = oklabToSrgbGamutMapped(rampL, outA, outB);\n return toCssColor(sr, sg, sb, alpha);\n };\n\n const map: RenderColorMap = (input) => {\n const hit = cache.get(input);\n if (hit !== undefined) return hit;\n const out = transform(input);\n if (cache.size >= COLOR_CACHE_MAX) {\n cache.clear();\n seedPoles();\n }\n cache.set(input, out);\n return out;\n };\n\n // Evict the oldest palette instead of clearing: live components depend on\n // stable function identity per palette, and a wholesale clear would hand a\n // still-mounted consumer a new instance.\n if (mapInstances.size >= 16) {\n const oldest = mapInstances.keys().next().value;\n if (oldest !== undefined) mapInstances.delete(oldest);\n }\n mapInstances.set(instanceKey, map);\n return map;\n}\n","// Ported from @anaralabs/lector (lib/recolor-context.ts).\n// Recolors a 2D canvas context at draw time. Photos (drawImage) are left\n// untouched; only fills/strokes/gradients are mapped — so illustrations stay\n// recolored but real images keep their pixels.\n\nimport type { RenderColorMap } from \"./dark-mode\";\n\nconst RECOLOR_CLEANUP = Symbol(\"recolorCleanup\");\nconst RECOLOR_PAINTED = Symbol(\"recolorPainted\");\n\ntype RecolorableContext = CanvasRenderingContext2D & {\n [RECOLOR_CLEANUP]?: () => void;\n /** True once any draw on this context actually swapped a color. */\n [RECOLOR_PAINTED]?: boolean;\n};\n\ntype AnyFn = (this: CanvasRenderingContext2D, ...args: never[]) => unknown;\n\nconst FILL_METHODS = [\"fill\", \"fillRect\", \"fillText\"] as const;\nconst STROKE_METHODS = [\"stroke\", \"strokeRect\", \"strokeText\"] as const;\nconst GRADIENT_METHODS = [\n \"createLinearGradient\",\n \"createRadialGradient\",\n] as const;\n\n// NTSC weights — the same ones pdf.js's luminosity SVG filter uses.\nfunction ntscLuma(r: number, g: number, b: number): number {\n return 0.3 * r + 0.59 * g + 0.11 * b;\n}\n\nfunction parseHexLuma(color: string): number | null {\n if (!/^#[0-9a-f]{6}$/i.test(color)) return null;\n return ntscLuma(\n Number.parseInt(color.slice(1, 3), 16),\n Number.parseInt(color.slice(3, 5), 16),\n Number.parseInt(color.slice(5, 7), 16),\n );\n}\n\n/**\n * pdf.js composes a luminosity soft mask by drawing the mask canvas through a\n * luminosity SVG filter with `destination-in`: pixel luma BECOMES alpha. The\n * mask artwork was painted through the recolor map (white flipped to the dark\n * background and vice versa), so its luma — and therefore the mask's alpha —\n * would be inverted: visible content disappears, hidden content appears. This\n * produces a copy of the mask with the neutral luma ramp un-mapped for the\n * filter to consume.\n */\nfunction correctLuminosityMask(\n source: CanvasImageSource,\n mappedWhiteLuma: number,\n mappedBlackLuma: number,\n): HTMLCanvasElement | null {\n if (typeof document === \"undefined\") return null;\n if (\n !(\n typeof HTMLCanvasElement !== \"undefined\" &&\n source instanceof HTMLCanvasElement\n ) &&\n !(\n typeof OffscreenCanvas !== \"undefined\" &&\n source instanceof OffscreenCanvas\n )\n ) {\n return null;\n }\n const width = source.width;\n const height = source.height;\n if (!width || !height) return null;\n const span = mappedWhiteLuma - mappedBlackLuma;\n if (Math.abs(span) < 1) return null;\n\n const tmp = document.createElement(\"canvas\");\n tmp.width = width;\n tmp.height = height;\n const tmpCtx = tmp.getContext(\"2d\", { willReadFrequently: true });\n if (!tmpCtx) return null;\n tmpCtx.drawImage(source, 0, 0);\n let image: ImageData;\n try {\n image = tmpCtx.getImageData(0, 0, width, height);\n } catch {\n return null;\n }\n const data = image.data;\n for (let i = 0; i < data.length; i += 4) {\n const luma = ntscLuma(data[i]!, data[i + 1]!, data[i + 2]!);\n const t = (luma - mappedBlackLuma) / span;\n const gray = t <= 0 ? 0 : t >= 1 ? 255 : Math.round(t * 255);\n data[i] = data[i + 1] = data[i + 2] = gray;\n }\n tmpCtx.putImageData(image, 0, 0);\n return tmp;\n}\n\n/**\n * Recolors a 2D context at draw time: every fill/stroke whose style is a\n * string is painted with `map(style)` and the original style is restored right\n * after, so pdf.js readbacks always observe original-document colors and\n * nothing is ever mapped twice. Gradients are recolored per stop at creation.\n * `drawImage` and `putImageData` are deliberately untouched — photos keep\n * their pixels — with one exception: a drawImage that composes a luminosity\n * soft mask draws a luma-corrected copy so the recoloring doesn't invert the\n * mask's alpha.\n *\n * Returns a cleanup that restores the pristine context.\n */\nexport function applyContextRecolor(\n ctx: CanvasRenderingContext2D,\n map: RenderColorMap,\n): () => void {\n const target = ctx as RecolorableContext;\n // Re-wrapping replaces the previous map instead of stacking wrappers.\n target[RECOLOR_CLEANUP]?.();\n\n // Luma poles of the map's neutral ramp, in pixel space.\n const mappedWhiteLuma = parseHexLuma(map(\"#ffffff\"));\n const mappedBlackLuma = parseHexLuma(map(\"#000000\"));\n\n const withMaskCorrection = (original: AnyFn) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n if (\n mappedWhiteLuma !== null &&\n mappedBlackLuma !== null &&\n this.globalCompositeOperation === \"destination-in\" &&\n typeof this.filter === \"string\" &&\n this.filter.includes(\"luminosity\")\n ) {\n const source = args[0] as unknown as CanvasImageSource;\n const sourcePainted =\n ((typeof HTMLCanvasElement !== \"undefined\" &&\n source instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== \"undefined\" &&\n source instanceof OffscreenCanvas)) &&\n (source.getContext(\"2d\") as RecolorableContext | null)?.[\n RECOLOR_PAINTED\n ] === true;\n const corrected = sourcePainted\n ? correctLuminosityMask(source, mappedWhiteLuma, mappedBlackLuma)\n : null;\n if (corrected) {\n const next = [corrected, ...args.slice(1)] as never[];\n return original.apply(this, next);\n }\n }\n return original.apply(this, args);\n };\n\n const withMappedStyle = (\n original: AnyFn,\n styleProp: \"fillStyle\" | \"strokeStyle\",\n ) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n const style = this[styleProp];\n if (typeof style === \"string\") {\n const mapped = map(style);\n if (mapped !== style) {\n (this as RecolorableContext)[RECOLOR_PAINTED] = true;\n this[styleProp] = mapped;\n try {\n return original.apply(this, args);\n } finally {\n this[styleProp] = style;\n }\n }\n }\n return original.apply(this, args);\n };\n\n const withMappedStops = (original: AnyFn) =>\n function (this: CanvasRenderingContext2D, ...args: never[]): unknown {\n const gradient = original.apply(this, args) as CanvasGradient;\n const addColorStop = gradient.addColorStop.bind(gradient);\n const context = this as RecolorableContext;\n gradient.addColorStop = (offset: number, color: string) => {\n const mapped = map(color);\n if (mapped !== color) context[RECOLOR_PAINTED] = true;\n addColorStop(offset, mapped);\n };\n return gradient;\n };\n\n const record = target as unknown as Record<string, unknown>;\n for (const name of FILL_METHODS)\n record[name] = withMappedStyle(target[name] as AnyFn, \"fillStyle\");\n for (const name of STROKE_METHODS)\n record[name] = withMappedStyle(target[name] as AnyFn, \"strokeStyle\");\n for (const name of GRADIENT_METHODS)\n record[name] = withMappedStops(target[name] as AnyFn);\n record.drawImage = withMaskCorrection(target.drawImage as AnyFn);\n\n const cleanup = () => {\n // A later applyContextRecolor call already replaced these wrappers.\n if (target[RECOLOR_CLEANUP] !== cleanup) return;\n for (const name of [\n ...FILL_METHODS,\n ...STROKE_METHODS,\n ...GRADIENT_METHODS,\n \"drawImage\",\n ])\n delete record[name];\n delete target[RECOLOR_CLEANUP];\n delete target[RECOLOR_PAINTED];\n };\n target[RECOLOR_CLEANUP] = cleanup;\n return cleanup;\n}\n\n/**\n * Removes any recolor wrapper installed on the context. For long-lived\n * contexts about to render in the light scheme.\n */\nexport function removeContextRecolor(ctx: CanvasRenderingContext2D): void {\n (ctx as RecolorableContext)[RECOLOR_CLEANUP]?.();\n}\n","import type { LTWHP } from \"../types\";\n\nconst getBoundingRect = (clientRects: Array<LTWHP>): LTWHP => {\n const rects = Array.from(clientRects).map((rect) => {\n const { left, top, width, height, pageNumber } = rect;\n\n const X0 = left;\n const X1 = left + width;\n\n const Y0 = top;\n const Y1 = top + height;\n\n return { X0, X1, Y0, Y1, pageNumber };\n });\n\n let firstPageNumber = Number.MAX_SAFE_INTEGER;\n\n rects.forEach((rect) => {\n firstPageNumber = Math.min(\n firstPageNumber,\n rect.pageNumber ?? firstPageNumber,\n );\n });\n\n const rectsWithSizeOnFirstPage = rects.filter(\n (rect) =>\n (rect.X0 > 0 || rect.X1 > 0 || rect.Y0 > 0 || rect.Y1 > 0) &&\n rect.pageNumber === firstPageNumber,\n );\n\n const optimal = rectsWithSizeOnFirstPage.reduce((res, rect) => {\n return {\n X0: Math.min(res.X0, rect.X0),\n X1: Math.max(res.X1, rect.X1),\n\n Y0: Math.min(res.Y0, rect.Y0),\n Y1: Math.max(res.Y1, rect.Y1),\n\n pageNumber: firstPageNumber,\n };\n }, rectsWithSizeOnFirstPage[0]);\n\n const { X0, X1, Y0, Y1, pageNumber } = optimal;\n\n return {\n left: X0,\n top: Y0,\n width: X1 - X0,\n height: Y1 - Y0,\n pageNumber,\n };\n};\n\nexport default getBoundingRect;\n","import type { LTWHP } from \"../types.js\";\n\nconst sort = (rects: Array<LTWHP>) =>\n rects.sort((A, B) => {\n const top = (A.pageNumber || 0) * A.top - (B.pageNumber || 0) * B.top;\n\n if (top === 0) {\n return A.left - B.left;\n }\n\n return top;\n });\n\nconst overlaps = (A: LTWHP, B: LTWHP) =>\n A.pageNumber === B.pageNumber &&\n A.left <= B.left &&\n B.left <= A.left + A.width;\n\nconst sameLine = (A: LTWHP, B: LTWHP, yMargin = 5) =>\n A.pageNumber === B.pageNumber &&\n Math.abs(A.top - B.top) < yMargin &&\n Math.abs(A.height - B.height) < yMargin;\n\nconst inside = (A: LTWHP, B: LTWHP) =>\n A.pageNumber === B.pageNumber &&\n A.top > B.top &&\n A.left > B.left &&\n A.top + A.height < B.top + B.height &&\n A.left + A.width < B.left + B.width;\n\nconst nextTo = (A: LTWHP, B: LTWHP, xMargin = 10) => {\n const Aright = A.left + A.width;\n const Bright = B.left + B.width;\n\n return (\n A.pageNumber === B.pageNumber &&\n A.left <= B.left &&\n Aright <= Bright &&\n B.left - Aright <= xMargin\n );\n};\n\nconst extendWidth = (A: LTWHP, B: LTWHP) => {\n // extend width of A to cover B\n A.width = Math.max(B.width - A.left + B.left, A.width);\n};\n\nconst optimizeClientRects = (clientRects: Array<LTWHP>): Array<LTWHP> => {\n const rects = sort(clientRects);\n\n const toRemove = new Set();\n\n const firstPass = rects.filter((rect) => {\n return rects.every((otherRect) => {\n return !inside(rect, otherRect);\n });\n });\n\n let passCount = 0;\n\n while (passCount <= 2) {\n firstPass.forEach((A) => {\n firstPass.forEach((B) => {\n if (A === B || toRemove.has(A) || toRemove.has(B)) {\n return;\n }\n\n if (!sameLine(A, B)) {\n return;\n }\n\n if (overlaps(A, B)) {\n extendWidth(A, B);\n A.height = Math.max(A.height, B.height);\n\n toRemove.add(B);\n }\n\n if (nextTo(A, B)) {\n extendWidth(A, B);\n\n toRemove.add(B);\n }\n });\n });\n passCount += 1;\n }\n\n return firstPass.filter((rect) => !toRemove.has(rect));\n};\n\nexport default optimizeClientRects;\n","import type { LTWHP, Page } from \"../types\";\n\nimport optimizeClientRects from \"./optimize-client-rects\";\n\nconst isClientRectInsidePageRect = (clientRect: DOMRect, pageRect: DOMRect) => {\n if (clientRect.top < pageRect.top) {\n return false;\n }\n if (clientRect.bottom > pageRect.bottom) {\n return false;\n }\n if (clientRect.right > pageRect.right) {\n return false;\n }\n if (clientRect.left < pageRect.left) {\n return false;\n }\n\n return true;\n};\n\nconst getClientRects = (\n range: Range,\n pages: Page[],\n shouldOptimize: boolean = true,\n): Array<LTWHP> => {\n const clientRects = Array.from(range.getClientRects());\n\n const rects: LTWHP[] = [];\n\n for (const clientRect of clientRects) {\n for (const page of pages) {\n const pageRect = page.node.getBoundingClientRect();\n\n if (\n isClientRectInsidePageRect(clientRect, pageRect) &&\n clientRect.width > 0 &&\n clientRect.height > 0 &&\n clientRect.width < pageRect.width &&\n clientRect.left > pageRect.left &&\n clientRect.height < pageRect.height\n ) {\n const highlightedRect = {\n top: clientRect.top + page.node.scrollTop - pageRect.top,\n left: clientRect.left + page.node.scrollLeft - pageRect.left,\n width: clientRect.width,\n height: clientRect.height,\n pageNumber: page.number,\n } as LTWHP;\n\n rects.push(highlightedRect);\n }\n }\n }\n\n return shouldOptimize ? optimizeClientRects(rects) : rects;\n};\n\nexport default getClientRects;\n","import { GhostHighlight, Highlight } from \"../types\";\n\ntype GroupedHighlights = {\n [pageNumber: number]: Array<Highlight | GhostHighlight>;\n};\n\nconst groupHighlightsByPage = (\n highlights: Array<Highlight | GhostHighlight | null>,\n): GroupedHighlights =>\n highlights.reduce<GroupedHighlights>((acc, highlight) => {\n if (!highlight) {\n return acc;\n }\n // Deduplicated: a highlight whose rects all sit on the same page (the\n // overwhelming common case) previously produced one pageNumber entry per\n // rect plus one for boundingRect, all equal — pushing the SAME highlight\n // into that page's array that many times over and rendering it as that\n // many stacked, overlapping DOM copies.\n const pageNumbers = [\n ...new Set([\n highlight.position.boundingRect.pageNumber,\n ...highlight.position.rects.map((rect) => rect.pageNumber || 0),\n ]),\n ];\n\n pageNumbers.forEach((pageNumber) => {\n acc[pageNumber] ||= [];\n const pageSpecificHighlight = {\n ...highlight,\n position: {\n ...highlight.position,\n rects: highlight.position.rects.filter(\n (rect) => pageNumber === rect.pageNumber,\n ),\n },\n };\n acc[pageNumber].push(pageSpecificHighlight);\n });\n\n return acc;\n }, {});\n\nexport default groupHighlightsByPage;\n","import { Page } from \"../types\";\n\nexport const getDocument = (elm: any): Document =>\n (elm || {}).ownerDocument || document;\n\nexport const getWindow = (elm: any): typeof window =>\n (getDocument(elm) || {}).defaultView || window;\n\nexport const isHTMLElement = (elm: any) =>\n elm instanceof HTMLElement || elm instanceof getWindow(elm).HTMLElement;\n\nexport const isHTMLCanvasElement = (elm: any) =>\n elm instanceof HTMLCanvasElement ||\n elm instanceof getWindow(elm).HTMLCanvasElement;\n\nexport const asElement = (x: any): HTMLElement => x;\n\nexport const getPageFromElement = (target: HTMLElement): Page | null => {\n const node = asElement(target.closest(\".page\"));\n\n if (!node || !isHTMLElement(node)) {\n return null;\n }\n\n const number = Number(asElement(node).dataset.pageNumber);\n\n return { node, number } as Page;\n};\n\nexport const getPagesFromRange = (range: Range): Page[] => {\n const startParentElement = range.startContainer.parentElement;\n const endParentElement = range.endContainer.parentElement;\n\n if (!isHTMLElement(startParentElement) || !isHTMLElement(endParentElement)) {\n return [] as Page[];\n }\n\n const startPage = getPageFromElement(asElement(startParentElement));\n const endPage = getPageFromElement(asElement(endParentElement));\n\n if (!startPage?.number || !endPage?.number) {\n return [] as Page[];\n }\n\n if (startPage.number === endPage.number) {\n return [startPage] as Page[];\n }\n\n if (startPage.number === endPage.number - 1) {\n return [startPage, endPage] as Page[];\n }\n\n const pages: Page[] = [];\n\n let currentPageNumber = startPage.number;\n\n const document = startPage.node.ownerDocument;\n\n while (currentPageNumber <= endPage.number) {\n const currentPage = getPageFromElement(\n document.querySelector(\n `[data-page-number='${currentPageNumber}'`,\n ) as HTMLElement,\n );\n if (currentPage) {\n pages.push(currentPage);\n }\n currentPageNumber++;\n }\n\n return pages as Page[];\n};\n\nexport const findOrCreateContainerLayer = (\n container: HTMLElement,\n className: string,\n) => {\n const doc = getDocument(container);\n let layer = container.querySelector(`.${className}`);\n\n // To ensure predictable zIndexing, wait until the pdfjs element has children.\n if (!layer && container.children.length) {\n layer = doc.createElement(\"div\");\n layer.className = className;\n container.appendChild(layer);\n }\n\n return layer;\n};\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport { DrawingStroke, ScaledPosition, ViewportPosition } from \"../types\";\n\nimport type { PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\n/**\n * The props type for {@link DrawingCanvas}.\n *\n * @category Component Properties\n */\nexport interface DrawingCanvasProps {\n /**\n * Whether drawing mode is active.\n */\n isActive: boolean;\n\n /**\n * Stroke color for drawing.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for drawing.\n * @default 3\n */\n strokeWidth?: number;\n\n /**\n * The PDF viewer instance.\n */\n viewer: InstanceType<typeof TPDFViewer>;\n\n /**\n * Callback when drawing is complete.\n *\n * @param dataUrl - The drawing as a PNG data URL.\n * @param position - Scaled position of the drawing on the page.\n * @param strokes - The stroke data for later editing.\n */\n onComplete: (dataUrl: string, position: ScaledPosition, strokes: DrawingStroke[]) => void;\n\n /**\n * Callback when drawing is cancelled.\n */\n onCancel: () => void;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface Stroke {\n points: Point[];\n color: string;\n width: number;\n}\n\n/**\n * A transparent overlay canvas for freehand drawing on PDF pages.\n * Supports mouse and touch input.\n *\n * @category Component\n */\nexport const DrawingCanvas = ({\n isActive,\n strokeColor = \"#000000\",\n strokeWidth = 3,\n viewer,\n onComplete,\n onCancel,\n}: DrawingCanvasProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [strokes, setStrokes] = useState<Stroke[]>([]);\n const [currentStroke, setCurrentStroke] = useState<Stroke | null>(null);\n const isDrawingRef = useRef(false);\n const [pageNumber, setPageNumber] = useState<number | null>(null);\n const [pageElement, setPageElement] = useState<HTMLElement | null>(null);\n // Drawing commits when the user finishes (leaves drawing mode → this unmounts)\n // rather than via a Done button. `cancelledRef` marks an Escape-discard so the\n // unmount handler skips committing; `commitRef` always points at the latest\n // commit closure so the unmount cleanup sees the newest strokes.\n const cancelledRef = useRef(false);\n const commitRef = useRef<() => void>(() => {});\n\n // Find which page the user is drawing on\n const findPageFromPoint = useCallback(\n (clientX: number, clientY: number) => {\n if (!viewer) return null;\n\n for (let i = 0; i < viewer.pagesCount; i++) {\n const pageView = viewer.getPageView(i);\n if (!pageView?.div) continue;\n\n const rect = pageView.div.getBoundingClientRect();\n if (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n ) {\n return {\n pageNumber: i + 1,\n element: pageView.div as HTMLElement,\n rect,\n };\n }\n }\n return null;\n },\n [viewer]\n );\n\n // Redraw all strokes\n const redrawCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx || !canvas) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw all completed strokes with their own color/width\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n stroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n });\n\n // Draw current stroke with current color/width\n if (currentStroke && currentStroke.points.length >= 2) {\n ctx.strokeStyle = currentStroke.color;\n ctx.lineWidth = currentStroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(currentStroke.points[0].x, currentStroke.points[0].y);\n currentStroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n }\n }, [strokes, currentStroke]);\n\n // Redraw when strokes change\n useEffect(() => {\n redrawCanvas();\n }, [redrawCanvas]);\n\n // Handle mouse/touch down\n const handleStart = useCallback(\n (clientX: number, clientY: number) => {\n const pageInfo = findPageFromPoint(clientX, clientY);\n if (!pageInfo) return;\n\n console.log(\"DrawingCanvas: Started drawing on page\", pageInfo.pageNumber);\n\n // Set page context if not already set\n if (pageNumber === null) {\n setPageNumber(pageInfo.pageNumber);\n setPageElement(pageInfo.element);\n\n // Resize canvas to match page\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = pageInfo.rect.width;\n canvas.height = pageInfo.rect.height;\n canvas.style.left = `${pageInfo.rect.left}px`;\n canvas.style.top = `${pageInfo.rect.top}px`;\n }\n } else if (pageInfo.pageNumber !== pageNumber) {\n // User trying to draw on different page - ignore\n console.log(\"DrawingCanvas: Ignoring - different page\");\n return;\n }\n\n isDrawingRef.current = true;\n const pos = {\n x: clientX - pageInfo.rect.left,\n y: clientY - pageInfo.rect.top,\n };\n setCurrentStroke({ points: [pos], color: strokeColor, width: strokeWidth });\n },\n [pageNumber, findPageFromPoint, strokeColor, strokeWidth]\n );\n\n // Handle mouse/touch move\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDrawingRef.current || !pageElement) return;\n\n const rect = pageElement.getBoundingClientRect();\n const pos = {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n\n setCurrentStroke((prev) => {\n if (!prev) return null;\n return { ...prev, points: [...prev.points, pos] };\n });\n },\n [pageElement]\n );\n\n // Handle mouse/touch end\n const handleEnd = useCallback(() => {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n\n if (currentStroke && currentStroke.points.length >= 2) {\n setStrokes((prev) => [...prev, currentStroke]);\n }\n setCurrentStroke(null);\n }, [currentStroke]);\n\n // Mouse event handlers\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent) => {\n e.preventDefault();\n handleStart(e.clientX, e.clientY);\n },\n [handleStart]\n );\n\n const handleMouseMove = useCallback(\n (e: ReactMouseEvent) => {\n handleMove(e.clientX, e.clientY);\n },\n [handleMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Touch event handlers\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleStart(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleStart]\n );\n\n const handleTouchMove = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Handle keyboard events\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n console.log(\"DrawingCanvas: Cancelled via Escape\");\n cancelledRef.current = true;\n onCancel();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, onCancel]);\n\n // Commit the drawing as a highlight. Called on unmount (i.e. when the user\n // leaves drawing mode) rather than from a button — no-op when there's nothing\n // to save. Does NOT reset state: the component is unmounting anyway.\n const commitDrawing = () => {\n if (strokes.length === 0 || pageNumber === null || !pageElement || !viewer) {\n console.log(\"DrawingCanvas: No strokes to save\");\n return;\n }\n\n console.log(\"DrawingCanvas: Completing drawing with\", strokes.length, \"strokes\");\n\n // Calculate bounding box of all strokes\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n strokes.forEach((stroke) => {\n stroke.points.forEach((point) => {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n });\n });\n\n // Find max stroke width for padding\n const maxStrokeWidth = Math.max(...strokes.map(s => s.width));\n const padding = maxStrokeWidth * 2;\n minX = Math.max(0, minX - padding);\n minY = Math.max(0, minY - padding);\n maxX = maxX + padding;\n maxY = maxY + padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n // Create a new canvas with just the drawing (cropped to bounding box)\n const outputCanvas = document.createElement(\"canvas\");\n outputCanvas.width = width;\n outputCanvas.height = height;\n const outputCtx = outputCanvas.getContext(\"2d\");\n\n if (!outputCtx) {\n console.error(\"DrawingCanvas: Could not get output canvas context\");\n return;\n }\n\n // Draw all strokes offset by bounding box origin, using per-stroke color/width\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n outputCtx.strokeStyle = stroke.color;\n outputCtx.lineWidth = stroke.width;\n outputCtx.lineCap = \"round\";\n outputCtx.lineJoin = \"round\";\n\n outputCtx.beginPath();\n outputCtx.moveTo(stroke.points[0].x - minX, stroke.points[0].y - minY);\n stroke.points.slice(1).forEach((point) => {\n outputCtx.lineTo(point.x - minX, point.y - minY);\n });\n outputCtx.stroke();\n });\n\n const dataUrl = outputCanvas.toDataURL(\"image/png\");\n\n // Create viewport position\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: minX,\n top: minY,\n width: width,\n height: height,\n pageNumber: pageNumber,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n // Normalize strokes relative to bounding box for storage\n const normalizedStrokes: DrawingStroke[] = strokes.map((stroke) => ({\n ...stroke,\n points: stroke.points.map((point) => ({\n x: point.x - minX,\n y: point.y - minY,\n })),\n }));\n\n console.log(\"DrawingCanvas: Created drawing at position\", scaledPosition);\n onComplete(dataUrl, scaledPosition, normalizedStrokes);\n };\n\n // Keep commitRef pointed at the latest closure (which sees the current\n // strokes), so the unmount cleanup below commits the newest drawing.\n commitRef.current = commitDrawing;\n\n // Commit on unmount = \"finish\". Leaving drawing mode unmounts this component;\n // if it wasn't an Escape-cancel, save whatever was drawn. Colour and width are\n // adjusted afterwards on the highlight itself, so there's no pre-draw panel.\n useEffect(() => {\n return () => {\n if (!cancelledRef.current) commitRef.current();\n };\n }, []);\n\n if (!isActive) return null;\n\n return (\n <canvas\n ref={canvasRef}\n className=\"DrawingCanvas\"\n style={{\n width: pageElement ? pageElement.getBoundingClientRect().width : \"100%\",\n height: pageElement ? pageElement.getBoundingClientRect().height : \"100%\",\n position: \"fixed\",\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n />\n );\n};\n","import { createContext, useContext } from \"react\";\nimport {\n Highlight,\n HighlightBindings,\n LTWH,\n LTWHP,\n Scaled,\n ViewportHighlight,\n} from \"../types\";\n\n/**\n * A set of utilities for rendering highlights. Designed to be used within a\n * highlight container.\n *\n * @category Context\n */\nexport type HighlightContainerUtils<T extends Highlight = Highlight> = {\n /**\n * The highlight being rendered at this component.\n */\n highlight: ViewportHighlight<T>;\n\n /**\n * Convert a Viewport rectangle to a scaled rectangle. Can be used\n * for storing and updating area selection highlights, for example.\n *\n * @returns - Scaled/display agnostic rectangle.\n */\n viewportToScaled(rect: LTWHP): Scaled;\n\n /**\n * Capture a PNG data url of a viewport rectangle.\n *\n * @returns - PNG data url. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs\n */\n screenshot(position: LTWH): string;\n\n /**\n * Whether the highlight has been autoscrolled to.\n */\n isScrolledTo: boolean;\n\n /**\n * All the DOM refs for the highlights shared on the same page\n * as `highlight`\n */\n highlightBindings: HighlightBindings;\n};\n\nexport const HighlightContext = createContext<\n HighlightContainerUtils | undefined\n>(undefined);\n\n/**\n * Custom hook for providing {@link HighlightContainerUtils}. Must be used\n * within a child of {@link PdfHighlighter}.\n *\n * @category Context\n */\nexport const useHighlightContainerContext = <\n T extends Highlight = Highlight,\n>() => {\n const highlightContainerUtils = useContext(HighlightContext);\n\n if (highlightContainerUtils === undefined) {\n throw new Error(\n \"useHighlightContainerContext must be used within a child of PdfHighlighter!\",\n );\n }\n\n return highlightContainerUtils as HighlightContainerUtils<T>;\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport type { LTWH } from \"../types\";\nimport { isHTMLCanvasElement } from \"./pdfjs-dom\";\n\nconst getAreaAsPng = (canvas: HTMLCanvasElement, position: LTWH): string => {\n const { left, top, width, height } = position;\n\n const doc = canvas ? canvas.ownerDocument : null;\n // @TODO: cache this?\n const newCanvas = doc && doc.createElement(\"canvas\");\n\n if (!newCanvas || !isHTMLCanvasElement(newCanvas)) {\n return \"\";\n }\n\n newCanvas.width = width;\n newCanvas.height = height;\n\n const newCanvasContext = newCanvas.getContext(\"2d\");\n\n if (!newCanvasContext || !canvas) {\n return \"\";\n }\n\n const dpr: number = window.devicePixelRatio;\n\n newCanvasContext.drawImage(\n canvas,\n left * dpr,\n top * dpr,\n width * dpr,\n height * dpr,\n 0,\n 0,\n width,\n height,\n );\n\n return newCanvas.toDataURL(\"image/png\");\n};\n\nconst screenshot = (position: LTWH, pageNumber: number, viewer: PDFViewer) => {\n return getAreaAsPng(viewer.getPageView(pageNumber - 1).canvas, position);\n};\n\nexport default screenshot;\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport React, { ReactNode } from \"react\";\nimport {\n HighlightContainerUtils,\n HighlightContext,\n} from \"../contexts/HighlightContext\";\nimport { scaledPositionToViewport, viewportToScaled } from \"../lib/coordinates\";\nimport screenshot from \"../lib/screenshot\";\nimport {\n GhostHighlight,\n Highlight,\n HighlightBindings,\n LTWH,\n LTWHP,\n ViewportHighlight,\n} from \"../types\";\n\nconst EMPTY_ID = \"empty-id\";\n\n/**\n * The props type for {@link HighlightLayer}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface HighlightLayerProps {\n /**\n * Highlights and GhostHighlights organised by page number.\n */\n highlightsByPage: { [pageNumber: number]: Array<Highlight | GhostHighlight> };\n\n /**\n * The page number of the PDF document to highlight (1 indexed).\n */\n pageNumber: number;\n\n /**\n * ID of the highlight that the parent PDF Highlighter is trying to autoscroll to.\n */\n scrolledToHighlightId?: string | null;\n\n /**\n * The PDFViewer instance containing the HighlightLayer\n */\n viewer: PDFViewer;\n\n /**\n * Group of DOM refs for all the highlights on this layer.\n */\n highlightBindings: HighlightBindings;\n\n /**\n * The Highlight container that should be used to render highlights for this layer.\n * It will be given appropriate context for a single highlight, allowing it to render\n * a single {@link TextHighlight}, {@link AreaHighlight}, etc., in the correct place.\n */\n children: ReactNode;\n\n /**\n * Optional predicate for splitting highlights across multiple DOM layers.\n */\n shouldRenderHighlight?(highlight: Highlight | GhostHighlight): boolean;\n}\n\n/**\n * A component responsible for managing all the highlights and ghost highlights\n * for a single page of a PDF document. It does not render each highlight\n * but it provides context for a highlight container to do so.\n * Its rendering should be controlled by a {@link PdfHighlighter}.\n *\n * @category Component\n * @internal\n */\nexport const HighlightLayer = ({\n highlightsByPage,\n pageNumber,\n scrolledToHighlightId,\n viewer,\n highlightBindings,\n children,\n shouldRenderHighlight,\n}: HighlightLayerProps) => {\n const currentHighlights = (highlightsByPage[pageNumber] || []).filter(\n (highlight) => shouldRenderHighlight?.(highlight) ?? true,\n );\n\n return (\n <div>\n {currentHighlights.map((highlight, index) => {\n const viewportHighlight: ViewportHighlight = {\n ...highlight,\n id: \"id\" in highlight ? highlight.id : EMPTY_ID, // Give Empty ID to GhostHighlight\n position: scaledPositionToViewport(highlight.position, viewer),\n };\n\n const isScrolledTo = Boolean(\n scrolledToHighlightId === viewportHighlight.id,\n );\n\n const highlightUtils: HighlightContainerUtils = {\n highlight: viewportHighlight,\n viewportToScaled: (rect: LTWHP) => {\n const viewport = viewer.getPageView(\n (rect.pageNumber || pageNumber) - 1, // Convert to 0 index\n ).viewport;\n\n return viewportToScaled(rect, viewport);\n },\n screenshot: (boundingRect: LTWH) =>\n screenshot(boundingRect, pageNumber, viewer),\n isScrolledTo: isScrolledTo,\n highlightBindings,\n };\n\n return (\n <HighlightContext.Provider value={highlightUtils} key={index}>\n {children}\n </HighlightContext.Provider>\n );\n })}\n </div>\n );\n};\n","import React, { CSSProperties, useEffect, useRef, useState } from \"react\";\n\nimport { asElement, getPageFromElement, isHTMLElement } from \"../lib/pdfjs-dom\";\n\nimport { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport screenshot from \"../lib/screenshot\";\nimport type { LTWH, LTWHP, ScaledPosition, ViewportPosition } from \"../types\";\n\ntype Coords = {\n x: number;\n y: number;\n};\n\nconst getBoundingRect = (start: Coords, end: Coords): LTWH => {\n return {\n left: Math.min(end.x, start.x),\n top: Math.min(end.y, start.y),\n\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y),\n };\n};\n\nconst getContainerCoords = (\n container: HTMLElement,\n pageX: number,\n pageY: number,\n) => {\n const containerBoundingRect = container.getBoundingClientRect();\n return {\n x: pageX - containerBoundingRect.left + container.scrollLeft,\n y: pageY - containerBoundingRect.top + container.scrollTop - window.scrollY,\n };\n};\n\n/**\n * The props type for {@link MouseSelection}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface MouseSelectionProps {\n /**\n * The PDFViewer instance containing this MouseSelection.\n */\n viewer: PDFViewer;\n\n /**\n * Callback triggered whenever the user stops dragging their mouse and a valid\n * mouse selection is made. In general, this will only be called if a mouse\n * selection is rendered.\n *\n * @param viewportPosition - viewport position of the mouse selection.\n * @param scaledPosition - scaled position of the mouse selection.\n * @param image - PNG screenshot of the mouse selection.\n * @param resetSelection - Callback to reset the current selection.\n * @param event - Mouse event associated with ending the selection.\n */\n onSelection?(\n viewportPosition: ViewportPosition,\n scaledPosition: ScaledPosition,\n image: string,\n resetSelection: () => void,\n event: MouseEvent,\n ): void;\n\n /**\n * Callback triggered whenever the current mouse selection is reset.\n * This includes when dragging ends but the selection is invalid.\n */\n onReset?(): void;\n\n /**\n * Callback triggered whenever a new valid mouse selection begins.\n *\n * @param event - mouse event associated with the new selection.\n */\n onDragStart?(event: MouseEvent): void;\n\n /**\n * Condition to check before any mouse selection starts.\n *\n * @param event - mouse event associated with the new selection.\n * @returns - `True` if mouse selection should start.\n */\n enableAreaSelection(event: MouseEvent): boolean;\n\n /**\n * Callback whenever the mouse selection area changes.\n *\n * @param isVisible - Whether the mouse selection is rendered (i.e., non-zero area)\n */\n onChange?(isVisible: boolean): void;\n\n /**\n * Optional style props for the mouse selection rectangle.\n */\n style?: CSSProperties;\n}\n\n/**\n * A component that enables the creation of rectangular and interactive mouse\n * selections within a given container. NOTE: This does not disable selection in\n * whatever container the component is placed in. That must be handled through\n * the component's events.\n *\n * @category Component\n * @internal\n */\nexport const MouseSelection = ({\n viewer,\n onSelection,\n onReset,\n onDragStart,\n enableAreaSelection,\n onChange,\n style,\n}: MouseSelectionProps) => {\n const [start, setStart] = useState<Coords | null>(null);\n const [end, setEnd] = useState<Coords | null>(null);\n const [locked, setLocked] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n // Needed in order to grab the page info of a mouse selection\n const startTargetRef = useRef<HTMLElement | null>(null);\n\n const reset = () => {\n onReset && onReset();\n setStart(null);\n setEnd(null);\n setLocked(false);\n };\n\n // Register event listeners onChange\n useEffect(() => {\n onChange && onChange(Boolean(start && end));\n if (!rootRef.current) return;\n\n // Should be the PdfHighlighter\n const container = asElement(rootRef.current.parentElement);\n\n const handleMouseUp = (event: MouseEvent) => {\n if (!start || !end || !startTargetRef.current) return;\n\n const boundingRect = getBoundingRect(start, end);\n\n // Check if the bounding rectangle has a minimum width and height\n // to prevent recording selections with 0 area\n const shouldEnd = boundingRect.width >= 1 && boundingRect.height >= 1;\n\n if (!container.contains(asElement(event.target)) || !shouldEnd) {\n reset();\n return;\n }\n\n setLocked(true);\n\n const page = getPageFromElement(startTargetRef.current);\n if (!page) return;\n\n const pageBoundingRect: LTWHP = {\n ...boundingRect,\n top: boundingRect.top - page.node.offsetTop,\n left: boundingRect.left - page.node.offsetLeft,\n pageNumber: page.number,\n };\n\n const viewportPosition: ViewportPosition = {\n boundingRect: pageBoundingRect,\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n const image = screenshot(\n pageBoundingRect,\n pageBoundingRect.pageNumber,\n viewer,\n );\n\n onSelection &&\n onSelection(viewportPosition, scaledPosition, image, reset, event);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n if (!rootRef.current || !start || locked) return;\n setEnd(getContainerCoords(container, event.pageX, event.pageY));\n };\n\n const handleMouseDown = (event: MouseEvent) => {\n const shouldStart = (event: MouseEvent) =>\n enableAreaSelection(event) &&\n isHTMLElement(event.target) &&\n Boolean(asElement(event.target).closest(\".page\"));\n\n // If the user clicks anywhere outside a tip, reset the selection\n const shouldReset = (event: MouseEvent) =>\n start &&\n !asElement(event.target).closest(\".PdfHighlighter__tip-container\");\n\n if (!shouldStart(event)) {\n if (shouldReset(event)) reset();\n return;\n }\n\n startTargetRef.current = asElement(event.target);\n onDragStart && onDragStart(event);\n setStart(getContainerCoords(container, event.pageX, event.pageY));\n setEnd(null);\n setLocked(false);\n };\n\n /**\n * Although we register the event listeners on the PdfHighlighter component, we encapsulate\n * them in this separate component to enhance maintainability and prevent unnecessary\n * rerenders of the PdfHighlighter itself. While synthetic events on PdfHighlighter would\n * be preferable, we need to register \"mouseup\" on the entire document anyway. Therefore,\n * we can't avoid using useEffect. We must re-register all events on state changes, as\n * custom event listeners may otherwise receive stale state.\n */\n container.addEventListener(\"mousemove\", handleMouseMove);\n container.addEventListener(\"mousedown\", handleMouseDown);\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n container.removeEventListener(\"mousemove\", handleMouseMove);\n container.removeEventListener(\"mousedown\", handleMouseDown);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [start, end, enableAreaSelection]);\n\n return (\n <div className=\"MouseSelection-container\" ref={rootRef}>\n {start && end && (\n <div\n className=\"MouseSelection\"\n style={{ ...getBoundingRect(start, end), ...style }}\n />\n )}\n </div>\n );\n};\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { viewportPositionToScaled } from \"../lib/coordinates\";\nimport { ShapeType, ShapeData, ScaledPosition, ViewportPosition } from \"../types\";\n\nimport type { PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\n/**\n * The props type for {@link ShapeCanvas}.\n *\n * @category Component Properties\n */\nexport interface ShapeCanvasProps {\n /**\n * Whether shape mode is active.\n */\n isActive: boolean;\n\n /**\n * The type of shape to create.\n */\n shapeType: ShapeType;\n\n /**\n * Stroke color for the shape.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for the shape.\n * @default 2\n */\n strokeWidth?: number;\n\n /**\n * The PDF viewer instance.\n */\n viewer: InstanceType<typeof TPDFViewer>;\n\n /**\n * Callback when shape creation is complete.\n *\n * @param position - Scaled position of the shape on the page.\n * @param shape - The shape data.\n */\n onComplete: (position: ScaledPosition, shape: ShapeData) => void;\n\n /**\n * Callback when shape creation is cancelled.\n */\n onCancel: () => void;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * A transparent overlay for creating shape annotations on PDF pages.\n * Supports mouse and touch input with click-and-drag to define shape bounds.\n *\n * @category Component\n */\nexport const ShapeCanvas = ({\n isActive,\n shapeType,\n strokeColor = \"#000000\",\n strokeWidth = 2,\n viewer,\n onComplete,\n onCancel,\n}: ShapeCanvasProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [startPoint, setStartPoint] = useState<Point | null>(null);\n const [currentPoint, setCurrentPoint] = useState<Point | null>(null);\n const [pageNumber, setPageNumber] = useState<number | null>(null);\n const [pageRect, setPageRect] = useState<DOMRect | null>(null);\n const isDrawingRef = useRef(false);\n\n // Find which page the user is drawing on\n const findPageFromPoint = useCallback(\n (clientX: number, clientY: number) => {\n if (!viewer) return null;\n\n for (let i = 0; i < viewer.pagesCount; i++) {\n const pageView = viewer.getPageView(i);\n if (!pageView?.div) continue;\n\n const rect = pageView.div.getBoundingClientRect();\n if (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n ) {\n return {\n pageNumber: i + 1,\n element: pageView.div as HTMLElement,\n rect,\n };\n }\n }\n return null;\n },\n [viewer]\n );\n\n // Handle mouse/touch down\n const handleStart = useCallback(\n (clientX: number, clientY: number) => {\n const pageInfo = findPageFromPoint(clientX, clientY);\n if (!pageInfo) return;\n\n console.log(\"ShapeCanvas: Started drawing on page\", pageInfo.pageNumber);\n\n setPageNumber(pageInfo.pageNumber);\n setPageRect(pageInfo.rect);\n\n isDrawingRef.current = true;\n const pos = {\n x: clientX - pageInfo.rect.left,\n y: clientY - pageInfo.rect.top,\n };\n setStartPoint(pos);\n setCurrentPoint(pos);\n },\n [findPageFromPoint]\n );\n\n // Handle mouse/touch move\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDrawingRef.current || !pageRect) return;\n\n const pos = {\n x: clientX - pageRect.left,\n y: clientY - pageRect.top,\n };\n setCurrentPoint(pos);\n },\n [pageRect]\n );\n\n // Handle mouse/touch end\n const handleEnd = useCallback(() => {\n if (!isDrawingRef.current || !startPoint || !currentPoint || pageNumber === null || !viewer) {\n isDrawingRef.current = false;\n setStartPoint(null);\n setCurrentPoint(null);\n return;\n }\n\n isDrawingRef.current = false;\n\n // Calculate bounding box\n const minX = Math.min(startPoint.x, currentPoint.x);\n const minY = Math.min(startPoint.y, currentPoint.y);\n const maxX = Math.max(startPoint.x, currentPoint.x);\n const maxY = Math.max(startPoint.y, currentPoint.y);\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n // Minimum size check\n if (width < 10 || height < 10) {\n console.log(\"ShapeCanvas: Shape too small, ignoring\");\n setStartPoint(null);\n setCurrentPoint(null);\n return;\n }\n\n console.log(\"ShapeCanvas: Creating shape\", shapeType, \"at\", { minX, minY, width, height });\n\n // Create viewport position\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: minX,\n top: minY,\n width: width,\n height: height,\n pageNumber: pageNumber,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(viewportPosition, viewer);\n\n // For arrows, calculate start/end points as percentages within the bounding box\n let shapeData: ShapeData = {\n shapeType,\n strokeColor,\n strokeWidth,\n };\n\n if (shapeType === \"arrow\") {\n // Calculate start and end points relative to bounding box (0-1 range)\n shapeData.startPoint = {\n x: (startPoint.x - minX) / width,\n y: (startPoint.y - minY) / height,\n };\n shapeData.endPoint = {\n x: (currentPoint.x - minX) / width,\n y: (currentPoint.y - minY) / height,\n };\n console.log(\"ShapeCanvas: Arrow points\", shapeData.startPoint, \"->\", shapeData.endPoint);\n }\n\n console.log(\"ShapeCanvas: Created shape at position\", scaledPosition);\n onComplete(scaledPosition, shapeData);\n\n // Reset state\n setStartPoint(null);\n setCurrentPoint(null);\n setPageNumber(null);\n setPageRect(null);\n }, [startPoint, currentPoint, pageNumber, viewer, shapeType, strokeColor, strokeWidth, onComplete]);\n\n // Mouse event handlers\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent) => {\n e.preventDefault();\n handleStart(e.clientX, e.clientY);\n },\n [handleStart]\n );\n\n const handleMouseMove = useCallback(\n (e: ReactMouseEvent) => {\n handleMove(e.clientX, e.clientY);\n },\n [handleMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Touch event handlers\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleStart(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleStart]\n );\n\n const handleTouchMove = useCallback(\n (e: ReactTouchEvent) => {\n e.preventDefault();\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n },\n [handleMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Handle keyboard events\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n console.log(\"ShapeCanvas: Cancelled via Escape\");\n onCancel();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, onCancel]);\n\n // Render shape preview\n const renderShapePreview = () => {\n if (!startPoint || !currentPoint || !pageRect) return null;\n\n const minX = Math.min(startPoint.x, currentPoint.x);\n const minY = Math.min(startPoint.y, currentPoint.y);\n const width = Math.abs(currentPoint.x - startPoint.x);\n const height = Math.abs(currentPoint.y - startPoint.y);\n\n const svgStyle: React.CSSProperties = {\n position: \"fixed\",\n left: pageRect.left,\n top: pageRect.top,\n width: pageRect.width,\n height: pageRect.height,\n pointerEvents: \"none\",\n zIndex: 1001,\n };\n\n return (\n <svg style={svgStyle}>\n {shapeType === \"rectangle\" && (\n <rect\n x={minX}\n y={minY}\n width={width}\n height={height}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n )}\n {shapeType === \"circle\" && (\n <ellipse\n cx={minX + width / 2}\n cy={minY + height / 2}\n rx={width / 2}\n ry={height / 2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n )}\n {shapeType === \"arrow\" && (\n <>\n <defs>\n <marker\n id=\"shape-canvas-arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n </defs>\n <line\n x1={startPoint.x}\n y1={startPoint.y}\n x2={currentPoint.x}\n y2={currentPoint.y}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerEnd=\"url(#shape-canvas-arrowhead)\"\n />\n </>\n )}\n </svg>\n );\n };\n\n if (!isActive) return null;\n\n return (\n <>\n <div\n ref={containerRef}\n className=\"ShapeCanvas\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n />\n {renderShapePreview()}\n {/* No on-canvas control bar: a shape commits on mouse-release and Escape\n cancels (see the keydown handler), so the instruction/Cancel bar was\n redundant clutter over the page. */}\n </>\n );\n};\n","import { PDFViewer } from \"pdfjs-dist/types/web/pdf_viewer\";\nimport React, {\n MutableRefObject,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { usePdfHighlighterContext } from \"../contexts/PdfHighlighterContext\";\n\nconst clamp = (value: number, left: number, right: number) =>\n Math.min(Math.max(value, left), right);\n\nconst VERTICAL_PADDING = 5;\n\n/**\n * The props type for {@link TipContainer}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface TipContainerProps {\n /**\n * The PDFViewer instance containing the HighlightLayer\n */\n viewer: PDFViewer;\n\n /**\n * Reference to the callback to update the tip's position.This should be\n * managed by the PdfHighlighter.\n */\n updateTipPositionRef: MutableRefObject<() => void>;\n}\n\n/**\n * A component that manages rendering and placement of a tip around a highlight.\n * It does not automatically update the tip's position if it resizes.\n *\n * @category Component\n * @internal\n */\nexport const TipContainer = ({\n viewer,\n updateTipPositionRef,\n}: TipContainerProps) => {\n const [height, setHeight] = useState(0);\n const [width, setWidth] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const updatePosition = () => {\n if (!containerRef.current) return;\n const { offsetHeight, offsetWidth } = containerRef.current;\n setHeight(offsetHeight);\n setWidth(offsetWidth);\n };\n\n updateTipPositionRef.current = updatePosition;\n\n // useLayoutEffect ensures state is updated before re-render, preventing flickering\n useLayoutEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n const { getTip } = usePdfHighlighterContext();\n const currentTip = getTip();\n if (!currentTip) return null;\n\n // Destructuring current tip's position and content\n const { position, content } = currentTip;\n const { boundingRect } = position;\n const pageNumber = boundingRect.pageNumber;\n const pageNode = viewer.getPageView(pageNumber - 1).div; // Account for 1 indexing of pdf documents\n const pageBoundingClientRect = pageNode.getBoundingClientRect();\n const { left: pageLeft, width: pageWidth } = pageBoundingClientRect;\n\n // Calculate the position and dimensions of the tip container\n const scrollTop = viewer.container.scrollTop; // How much the viewer has been scrolled vertically\n const left = pageNode.offsetLeft + boundingRect.left + boundingRect.width / 2; // center tip over highlight\n const highlightTop = boundingRect.top + pageNode.offsetTop;\n const highlightBottom = highlightTop + boundingRect.height;\n\n // Determine whether the tip should be moved below the highlight\n const shouldMove = highlightTop - height - VERTICAL_PADDING < scrollTop; // Would the tip render beyond the top of the visible document?\n const top = shouldMove\n ? highlightBottom + VERTICAL_PADDING\n : highlightTop - height - VERTICAL_PADDING;\n\n // Ensure the tip stays within the left edge of the viewer and the right edge of the page\n const clampedLeft = clamp(left - width / 2, 0, pageLeft + pageWidth - width);\n\n return (\n <div\n className=\"PdfHighlighter__tip-container\"\n style={{\n top,\n left: clampedLeft,\n height: \"max-content\",\n width: \"max-content\",\n }}\n ref={containerRef}\n >\n {content}\n </div>\n );\n};\n","import { PDFDocumentProxy, PDFPageProxy } from \"pdfjs-dist\";\nimport React, {\n CSSProperties,\n PointerEventHandler,\n ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport {\n PdfHighlighterContext,\n PdfSearchOptions,\n PdfHighlighterUtils,\n} from \"../contexts/PdfHighlighterContext\";\nimport { scaledToViewport, viewportPositionToScaled } from \"../lib/coordinates\";\nimport { createDarkModeColorMap, type RenderColorMap } from \"../lib/dark-mode\";\nimport { applyContextRecolor } from \"../lib/recolor-context\";\nimport getBoundingRect from \"../lib/get-bounding-rect\";\nimport getClientRects from \"../lib/get-client-rects\";\nimport groupHighlightsByPage from \"../lib/group-highlights-by-page\";\nimport {\n asElement,\n getDocument,\n getPageFromElement,\n getPagesFromRange,\n getWindow,\n isHTMLElement,\n} from \"../lib/pdfjs-dom\";\nimport {\n Content,\n DrawingStroke,\n GhostHighlight,\n Highlight,\n HighlightBindings,\n PdfScaleValue,\n PdfSelection,\n ScaledPosition,\n ShapeData,\n ShapeType,\n Tip,\n ViewportPosition,\n} from \"../types\";\nimport { DrawingCanvas } from \"./DrawingCanvas\";\nimport { HighlightLayer } from \"./HighlightLayer\";\nimport { MouseSelection } from \"./MouseSelection\";\nimport { ShapeCanvas } from \"./ShapeCanvas\";\nimport { TipContainer } from \"./TipContainer\";\n\nimport type { EventBus as TEventBus, PDFFindController as TPDFFindController, PDFLinkService as TPDFLinkService, PDFViewer as TPDFViewer } from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\nlet EventBus: typeof TEventBus, PDFFindController: typeof TPDFFindController, PDFLinkService: typeof TPDFLinkService, PDFViewer: typeof TPDFViewer;\n\n(async () => {\n // Due to breaking changes in PDF.js 4.0.189. See issue #17228\n const pdfjs = await import(\"pdfjs-dist/web/pdf_viewer.mjs\");\n EventBus = pdfjs.EventBus;\n PDFFindController = pdfjs.PDFFindController;\n PDFLinkService = pdfjs.PDFLinkService;\n PDFViewer = pdfjs.PDFViewer;\n})();\n\n\nconst SCROLL_MARGIN = 10;\nconst DEFAULT_SCALE_VALUE = \"auto\";\n// Verso accent tint\nconst DEFAULT_TEXT_SELECTION_COLOR = \"rgba(216, 212, 250, 1)\";\n\n/**\n * Theme configuration for PdfHighlighter styling.\n * Controls the appearance of the PDF viewer including dark mode support.\n *\n * @category Type\n */\nexport interface PdfHighlighterTheme {\n /**\n * Theme mode. In dark mode, pages are recolored at draw time (hue-preserving,\n * photos kept) using {@link PdfHighlighterTheme.darkModeColors}.\n * @default \"light\"\n */\n mode?: \"light\" | \"dark\";\n\n /**\n * Background color of the viewer container.\n * @default \"#e5e5e5\" for light mode, \"#1e1e1e\" for dark mode\n */\n containerBackgroundColor?: string;\n\n /**\n * Scrollbar thumb color.\n * @default \"#9f9f9f\" for light mode, \"#6b6b6b\" for dark mode\n */\n scrollbarThumbColor?: string;\n\n /**\n * Scrollbar track color.\n * @default \"#d1d1d1\" for light mode, \"#2c2c2c\" for dark mode\n */\n scrollbarTrackColor?: string;\n\n /**\n * Inversion intensity for dark mode (0-1).\n * Lower values create softer dark backgrounds that are easier on the eyes.\n * - 1.0 = Pure black background (harsh)\n * - 0.9 = Dark gray ~#1a1a1a (recommended)\n * - 0.85 = Softer gray ~#262626 (very comfortable)\n * - 0.8 = Medium gray ~#333333 (maximum softness)\n * @default 0.9\n * @deprecated Dark mode now recolors at draw time (OKLab, hue-preserving,\n * photos untouched) instead of a CSS `invert()` filter. This value is\n * ignored. Use {@link PdfHighlighterTheme.darkModeColors} instead.\n */\n darkModeInvertIntensity?: number;\n\n /**\n * Dark-mode recolor palette. White paper maps to `background` and black\n * text/line-art to `foreground`, recolored per-color at draw time (OKLab\n * ramp) so hues are preserved and embedded photos keep their pixels.\n * Only used when `mode === \"dark\"`.\n * @default { background: \"#141210\", foreground: \"#eae6e0\" }\n */\n darkModeColors?: {\n /** Replaces the white paper background. */\n background: string;\n /** Replaces black text and line art. */\n foreground: string;\n };\n}\n\n// Warm gray (red >= green >= blue): easier on the eyes than pure black, and\n// white paper maps onto it exactly. Matches lector's default dark palette.\nconst DEFAULT_DARK_MODE_COLORS = {\n background: \"#141210\",\n foreground: \"#eae6e0\",\n};\n\n// Unmount a per-page React root, deferred so it never runs synchronously inside\n// a React render/commit (which React warns about). Tolerates double-unmount.\n// Also removes the container element itself once unmounted — leaving an\n// empty-but-still-attached div behind isn't harmful on its own, but under\n// React 18 StrictMode's dev-only mount→unmount→remount cycle, the deferred\n// unmount can still be pending when the remount's effect runs and creates a\n// *second* layer via ensurePersistentLayer (which only checks its own ref,\n// not the live DOM, for an existing binding) — leaving two populated,\n// perfectly-overlapping layers rendering the same highlights until the\n// microtask catches up. Removing the container guarantees it can't\n// contribute stray content even if straggling.\nconst unmountReactRoot = (binding?: { reactRoot: Root; container: Element } | null) => {\n if (!binding) return;\n const { reactRoot, container } = binding;\n queueMicrotask(() => {\n try {\n reactRoot.unmount();\n } catch {\n /* already unmounted */\n }\n container.remove();\n });\n};\n\nconst RECOLOR_PATCHED = Symbol(\"pdfRecolorPatched\");\n\n/**\n * Patches a loaded PDF document so every page renders through the dark-mode\n * recolor map (when one is active). PDF.js draws each page by calling\n * `page.render({ canvasContext })`; we wrap that context with\n * `applyContextRecolor` right before the real render and restore it after, so\n * text/vector art is recolored at draw time while photos (drawImage) keep\n * their pixels. The map is read live via `getMap()` so a palette/scheme toggle\n * only needs a re-render, not a re-patch. Idempotent per document and page.\n */\nconst patchPageRenderRecolor = (\n pdfDocument: PDFDocumentProxy,\n getMap: () => RenderColorMap | null,\n) => {\n const doc = pdfDocument as PDFDocumentProxy & { [RECOLOR_PATCHED]?: boolean };\n if (doc[RECOLOR_PATCHED]) return;\n doc[RECOLOR_PATCHED] = true;\n\n const origGetPage = doc.getPage.bind(doc);\n doc.getPage = (pageNumber: number) =>\n origGetPage(pageNumber).then((page) => {\n const p = page as PDFPageProxy & { [RECOLOR_PATCHED]?: boolean };\n if (p[RECOLOR_PATCHED]) return p;\n p[RECOLOR_PATCHED] = true;\n\n const origRender = p.render.bind(p);\n p.render = ((params: Parameters<typeof origRender>[0]) => {\n const map = getMap();\n const ctx = params?.canvasContext as\n | CanvasRenderingContext2D\n | undefined;\n if (map && ctx) {\n const cleanup = applyContextRecolor(ctx, map);\n const task = origRender(params);\n // Restore pristine context when the page settles (done OR cancelled),\n // so pdf.js readbacks and the next render observe original colors.\n task.promise.then(cleanup, cleanup);\n return task;\n }\n return origRender(params);\n }) as typeof p.render;\n return p;\n });\n};\n\n// Verso: warm paper chrome in light mode, warm near-black in dark.\nconst defaultLightTheme: Required<PdfHighlighterTheme> = {\n mode: \"light\",\n containerBackgroundColor: \"#efece5\",\n scrollbarThumbColor: \"#b7b3ab\",\n scrollbarTrackColor: \"transparent\",\n darkModeInvertIntensity: 0.9,\n darkModeColors: DEFAULT_DARK_MODE_COLORS,\n};\n\nconst defaultDarkTheme: Required<PdfHighlighterTheme> = {\n mode: \"dark\",\n containerBackgroundColor: \"#2a2724\", // Lighter than PDF page for contrast\n scrollbarThumbColor: \"#57544d\",\n scrollbarTrackColor: \"transparent\",\n darkModeInvertIntensity: 0.9,\n darkModeColors: DEFAULT_DARK_MODE_COLORS,\n};\n\n/**\n * Returns a stable per-page React-root layer, re-attaching the SAME element to\n * the current parent when PDF.js has re-rendered the page into a fresh layer.\n *\n * This is critical: PDF.js detaches our layer when it rebuilds a page's text\n * layer, but the element keeps its own children (React's content). Re-attaching\n * the same element — instead of creating a new one and a new root — means React\n * never finds its content \"removed\", which is what triggered the\n * `render(...): content was removed` warning under React 18's async commits.\n */\nconst ensurePersistentLayer = (\n bindings: { [page: number]: HighlightBindings },\n pageNumber: number,\n parent: HTMLElement,\n className: string,\n): HighlightBindings => {\n let binding = bindings[pageNumber];\n if (!binding) {\n // Defensive: under React 18 StrictMode's dev-only mount→unmount→remount\n // cycle, a *previous* instance's layer can still be attached (its\n // deferred unmount hasn't run yet) when this remount creates a fresh\n // `bindings` ref and sees no binding for this page. Sweep any stray\n // same-class siblings first so we never end up with two populated,\n // perfectly-overlapping layers rendering the same highlights.\n parent.querySelectorAll(`:scope > .${className}`).forEach((stray) => stray.remove());\n const doc = getDocument(parent);\n const layer = doc.createElement(\"div\");\n layer.className = className;\n parent.appendChild(layer);\n binding = {\n reactRoot: createRoot(layer),\n container: layer,\n textLayer: parent,\n };\n bindings[pageNumber] = binding;\n } else if (binding.container.parentNode !== parent) {\n // PDF.js replaced/cleared the parent — move our element (with its React\n // content) into the current one, keeping the same root valid.\n parent.appendChild(binding.container);\n binding.textLayer = parent;\n }\n return binding;\n};\n\n/**\n * Guard against CSS injection: color props are interpolated into a <style>\n * template literal, so a string like `red;}body{display:none}` would break out\n * of its rule. CSS.supports validates every legal CSS color grammar and rejects\n * anything containing `;`/`{`/`}` (those are never valid inside a color value).\n * Falls back to the provided default when invalid or when CSS.supports is\n * unavailable and the value isn't a simple hex/rgb/hsl form.\n */\nconst sanitizeCssColor = (value: string | undefined, fallback: string): string => {\n if (!value) return fallback;\n if (typeof CSS !== \"undefined\" && typeof CSS.supports === \"function\") {\n return CSS.supports(\"color\", value) ? value : fallback;\n }\n // Conservative fallback grammar (hex, rgb[a], hsl[a], simple names).\n return /^(#[0-9a-f]{3,8}|(rgb|hsl)a?\\([\\d.,%\\s/]+\\)|[a-z]{1,25})$/i.test(value)\n ? value\n : fallback;\n};\n\n// Highlight types whose default rendering needs a truly opaque background\n// (a photo, a signature/drawing stroke, a sticky note) rather than a\n// translucent color tint. These render in a layer OUTSIDE .textLayer, which\n// otherwise carries pdf.js's own mix-blend-mode: multiply — the very thing\n// Text/Area highlights want (it's what makes a yellow highlight still show\n// the black text underneath, like a real highlighter pen), but which makes\n// an \"opaque\" white background invisible (white is the neutral color under\n// multiply: white × page = page, unchanged) while darker content still\n// shows through, which is why a solid background alone doesn't fix it.\nconst needsOpaqueLayer = (highlight: Highlight | GhostHighlight) =>\n \"type\" in highlight &&\n (highlight.type === \"freetext\" ||\n highlight.type === \"image\" ||\n highlight.type === \"drawing\" ||\n highlight.type === \"shape\");\n\nconst disableTextSelection = (viewer: InstanceType<typeof PDFViewer>, flag: boolean) => {\n viewer.viewer?.classList.toggle(\"PdfHighlighter--disable-selection\", flag);\n};\n\n/**\n * The props type for {@link PdfHighlighter}.\n *\n * @category Component Properties\n */\nexport interface PdfHighlighterProps {\n /**\n * Array of all highlights to be organised and fed through to the child\n * highlight container.\n */\n highlights: Array<Highlight>;\n\n /**\n * Event is called only once whenever the user changes scroll after\n * the autoscroll function, scrollToHighlight, has been called.\n */\n onScrollAway?(): void;\n\n /**\n * What scale to render the PDF at inside the viewer.\n */\n pdfScaleValue?: PdfScaleValue;\n\n /**\n * Fired when the user changes zoom by pinch / ctrl+wheel gesture, with the new\n * numeric scale. Use it to keep an external zoom indicator / `pdfScaleValue`\n * state in sync.\n *\n * @param scale - The new numeric scale (e.g. 1.25).\n */\n onZoomChange?(scale: number): void;\n\n /**\n * Page to scroll to once the document first finishes loading (1-indexed).\n * Use for deep-linking (e.g. `?page=12`) or restoring a saved position.\n * Applied only on initial load, not on subsequent re-renders.\n */\n initialPage?: number;\n\n /**\n * Callback fired whenever the current (most visible) page changes, including\n * the initial page. Use to sync the page into a URL/localStorage.\n *\n * @param pageNumber - The new current page (1-indexed).\n */\n onPageChange?(pageNumber: number): void;\n\n /**\n * Callback triggered whenever a user finishes making a mouse selection or has\n * selected text.\n *\n * @param PdfSelection - Content and positioning of the selection. NOTE:\n * `makeGhostHighlight` will not work if the selection disappears.\n */\n onSelection?(PdfSelection: PdfSelection): void;\n\n /**\n * Callback triggered whenever a ghost (non-permanent) highlight is created.\n *\n * @param ghostHighlight - Ghost Highlight that has been created.\n */\n onCreateGhostHighlight?(ghostHighlight: GhostHighlight): void;\n\n /**\n * Callback triggered whenever a ghost (non-permanent) highlight is removed.\n *\n * @param ghostHighlight - Ghost Highlight that has been removed.\n */\n onRemoveGhostHighlight?(ghostHighlight: GhostHighlight): void;\n\n /**\n * Optional element that can be displayed as a tip whenever a user makes a\n * selection.\n */\n selectionTip?: ReactNode;\n\n /**\n * Condition to check before any mouse selection starts.\n *\n * @param event - mouse event associated with the new selection.\n * @returns - `True` if mouse selection should start.\n */\n enableAreaSelection?(event: MouseEvent): boolean;\n\n /**\n * When true, shows crosshair cursor indicating area selection mode is active.\n * Use this when area selection should be persistently enabled (not just on modifier key).\n */\n areaSelectionMode?: boolean;\n\n /**\n * Optional CSS styling for the rectangular mouse selection.\n */\n mouseSelectionStyle?: CSSProperties;\n\n /**\n * PDF document to view and overlay highlights.\n */\n pdfDocument: PDFDocumentProxy;\n\n /**\n * This should be a highlight container/renderer of some sorts. It will be\n * given appropriate context for a single highlight which it can then use to\n * render a TextHighlight, AreaHighlight, etc. in the correct place.\n */\n children: ReactNode;\n\n /**\n * Coloring for unhighlighted, selected text.\n */\n textSelectionColor?: string;\n\n /**\n * Creates a reference to the PdfHighlighterContext above the component.\n *\n * @param pdfHighlighterUtils - various useful tools with a PdfHighlighter.\n * See {@link PdfHighlighterContext} for more description.\n */\n utilsRef(pdfHighlighterUtils: PdfHighlighterUtils): void;\n\n /**\n * Style properties for the PdfHighlighter (scrollbar, background, etc.), NOT\n * the PDF.js viewer it encloses. If you want to edit the latter, use the\n * other style props like `textSelectionColor` or overwrite pdf_viewer.css\n */\n style?: CSSProperties;\n\n /**\n * Condition to check before freetext creation starts.\n *\n * @param event - mouse event associated with the click.\n * @returns - `True` if freetext creation should occur.\n */\n enableFreetextCreation?(event: MouseEvent): boolean;\n\n /**\n * Callback triggered when user clicks to create a freetext annotation.\n *\n * @param position - Scaled position where the click occurred.\n */\n onFreetextClick?(position: ScaledPosition): void;\n\n /**\n * Condition to check before image creation starts.\n *\n * @param event - mouse event associated with the click.\n * @returns - `True` if image creation should occur.\n */\n enableImageCreation?(event: MouseEvent): boolean;\n\n /**\n * Callback triggered when user clicks to create an image annotation.\n *\n * @param position - Scaled position where the click occurred.\n */\n onImageClick?(position: ScaledPosition): void;\n\n /**\n * Whether drawing mode is enabled.\n */\n enableDrawingMode?: boolean;\n\n /**\n * Callback triggered when a drawing is completed.\n *\n * @param dataUrl - The drawing as a PNG data URL.\n * @param position - Scaled position of the drawing on the page.\n * @param strokes - The stroke data for later editing.\n */\n onDrawingComplete?(dataUrl: string, position: ScaledPosition, strokes: DrawingStroke[]): void;\n\n /**\n * Callback triggered when drawing is cancelled.\n */\n onDrawingCancel?(): void;\n\n /**\n * Stroke color for drawing mode.\n * @default \"#000000\"\n */\n drawingStrokeColor?: string;\n\n /**\n * Stroke width for drawing mode.\n * @default 3\n */\n drawingStrokeWidth?: number;\n\n /**\n * The type of shape to create, or null if shape mode is not active.\n */\n enableShapeMode?: ShapeType | null;\n\n /**\n * Callback triggered when a shape is completed.\n *\n * @param position - Scaled position of the shape on the page.\n * @param shape - The shape data (type, color, width).\n */\n onShapeComplete?(position: ScaledPosition, shape: ShapeData): void;\n\n /**\n * Callback triggered when shape creation is cancelled.\n */\n onShapeCancel?(): void;\n\n /**\n * Stroke color for shape mode.\n * @default \"#000000\"\n */\n shapeStrokeColor?: string;\n\n /**\n * Stroke width for shape mode.\n * @default 2\n */\n shapeStrokeWidth?: number;\n\n /**\n * Theme configuration for the PDF viewer.\n * Controls container background color and PDF page color inversion for dark mode.\n *\n * @default { mode: \"light\" }\n */\n theme?: PdfHighlighterTheme;\n}\n\n/**\n * This is a large-scale PDF viewer component designed to facilitate\n * highlighting. It should be used as a child to a {@link PdfLoader} to ensure\n * proper document loading. This does not itself render any highlights, but\n * instead its child should be the container component for each individual\n * highlight. This component will be provided appropriate HighlightContext for\n * rendering.\n *\n * @category Component\n */\nexport const PdfHighlighter = ({\n highlights,\n onScrollAway,\n pdfScaleValue = DEFAULT_SCALE_VALUE,\n onZoomChange,\n initialPage,\n onPageChange,\n onSelection: onSelectionFinished,\n onCreateGhostHighlight,\n onRemoveGhostHighlight,\n selectionTip,\n enableAreaSelection,\n areaSelectionMode,\n mouseSelectionStyle,\n pdfDocument,\n children,\n textSelectionColor = DEFAULT_TEXT_SELECTION_COLOR,\n utilsRef,\n style,\n enableFreetextCreation,\n onFreetextClick,\n enableImageCreation,\n onImageClick,\n enableDrawingMode,\n onDrawingComplete,\n onDrawingCancel,\n drawingStrokeColor: drawingStrokeColorProp,\n drawingStrokeWidth = 3,\n enableShapeMode,\n onShapeComplete,\n onShapeCancel,\n shapeStrokeColor: shapeStrokeColorProp,\n shapeStrokeWidth = 2,\n theme: userTheme,\n}: PdfHighlighterProps) => {\n // Resolve theme with defaults based on mode\n const resolvedTheme = useMemo(() => {\n const mode = userTheme?.mode ?? \"light\";\n const defaults = mode === \"light\" ? defaultLightTheme : defaultDarkTheme;\n return { ...defaults, ...userTheme, mode };\n }, [userTheme]);\n\n // Draw-time recolor map (lector-ported). Dark mode only; null = render\n // document colors as-is. Photos are preserved (the wrapper skips drawImage),\n // unlike PDF.js `pageColors`. String key drives effect re-runs on a real\n // palette/mode change only.\n const recolorKey =\n resolvedTheme.mode === \"dark\"\n ? `${resolvedTheme.darkModeColors.background}|${resolvedTheme.darkModeColors.foreground}`\n : \"light\";\n const recolorMap = useMemo(\n () =>\n resolvedTheme.mode === \"dark\"\n ? createDarkModeColorMap(resolvedTheme.darkModeColors)\n : null,\n // recolorKey captures the palette + mode; map identity is stable per key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [recolorKey],\n );\n // The patched page.render reads the live map from this ref, so toggling the\n // palette never needs re-patching — only a re-render (setDocument).\n const recolorMapRef = useRef(recolorMap);\n recolorMapRef.current = recolorMap;\n\n // Default drawing/shape ink follows the scheme: white on a dark page, black on\n // light, so strokes stay visible. An explicit prop always wins.\n const defaultStrokeColor = resolvedTheme.mode === \"dark\" ? \"#ffffff\" : \"#000000\";\n const drawingStrokeColor = drawingStrokeColorProp ?? defaultStrokeColor;\n const shapeStrokeColor = shapeStrokeColorProp ?? defaultStrokeColor;\n\n // State\n const [tip, setTip] = useState<Tip | null>(null);\n const [isViewerReady, setIsViewerReady] = useState(false);\n\n // Refs\n const containerNodeRef = useRef<HTMLDivElement | null>(null);\n const highlightBindingsRef = useRef<{ [page: number]: HighlightBindings }>(\n {},\n );\n const noteBindingsRef = useRef<{ [page: number]: HighlightBindings }>({});\n const highlightsRef = useRef(highlights);\n const childrenRef = useRef(children);\n const ghostHighlightRef = useRef<GhostHighlight | null>(null);\n const selectionRef = useRef<PdfSelection | null>(null);\n const scrolledToHighlightIdRef = useRef<string | null>(null);\n const isAreaSelectionInProgressRef = useRef(false);\n const isEditInProgressRef = useRef(false);\n const updateTipPositionRef = useRef(() => { });\n\n const eventBusRef = useRef<InstanceType<typeof EventBus>>(new EventBus());\n const linkServiceRef = useRef<InstanceType<typeof PDFLinkService>>(\n new PDFLinkService({\n eventBus: eventBusRef.current,\n externalLinkTarget: 2,\n }),\n );\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const renderRetryTimeoutsRef = useRef<Array<ReturnType<typeof setTimeout>>>(\n [],\n );\n const resumeScrollAwayTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n // The \"is the auto-scroll-to-highlight animation still settling\" probe\n // listener — see resumeScrollAwayListenerAfterNavigation. Kept in a ref\n // (not a per-call local) purely so the unmount/effect-cleanup below can\n // always remove it, even if the component unmounts mid quiet-period.\n const settleScrollListenerRef = useRef<(() => void) | null>(null);\n const findControllerRef = useRef<InstanceType<typeof PDFFindController> | null>(null);\n const viewerRef = useRef<InstanceType<typeof PDFViewer> | null>(null);\n // Count of currently-selected highlights (toolbar open) — used to suppress\n // hover tips while any toolbar is showing.\n const selectedHighlightCountRef = useRef(0);\n // Last document the viewer ran setDocument for (to tell first load from a\n // toggle) and the last (document + recolor) key actually rendered. The key\n // dedupes StrictMode's double-invoke: without it, two overlapping async\n // setDocument calls make pdf.js append the page list twice (a 12-page doc\n // shows 24 pages).\n const prevDocRef = useRef<PDFDocumentProxy | null>(null);\n const lastRenderKeyRef = useRef<string | null>(null);\n\n highlightsRef.current = highlights;\n childrenRef.current = children;\n\n // Initialise PDF Viewer\n useLayoutEffect(() => {\n if (!containerNodeRef.current) return;\n\n // Dedupe StrictMode's double-invoke (and any identical re-run): the same\n // document + recolor key must not call setDocument twice, or pdf.js renders\n // the page list twice. recolorKey changes on a real palette/scheme toggle.\n const renderKey = `${(pdfDocument as { fingerprints?: unknown }).fingerprints ?? pdfDocument.numPages}::${recolorKey}`;\n if (lastRenderKeyRef.current === renderKey) {\n console.log(\"[PdfHighlighter] skip duplicate setDocument\", renderKey);\n return;\n }\n\n findControllerRef.current =\n findControllerRef.current ||\n new PDFFindController({\n eventBus: eventBusRef.current,\n linkService: linkServiceRef.current,\n });\n\n viewerRef.current =\n viewerRef.current ||\n new PDFViewer({\n container: containerNodeRef.current,\n eventBus: eventBusRef.current,\n findController: findControllerRef.current,\n textLayerMode: 2,\n removePageBorders: true,\n linkService: linkServiceRef.current,\n });\n\n // Draw-time dark-mode recolor: patch the document's page.render to wrap the\n // canvas context with the live map (idempotent). Toggling the palette only\n // re-runs this effect (recolorKey dep) → setDocument re-renders the pages →\n // the patched render picks up the new map from recolorMapRef.\n patchPageRenderRecolor(pdfDocument, () => recolorMapRef.current);\n\n // Toggle vs first load: same document object means this re-run is a\n // palette/scheme toggle, where setDocument would otherwise reset both the\n // scroll position (resetView -> top) and the zoom (handleScaleValue\n // re-applies the pdfScaleValue prop on pagesinit). Capture the live scroll\n // (as a fraction of the scrollable range, so it survives any height change)\n // and the live zoom, then restore both once the rebuilt pages re-init.\n const isToggle = prevDocRef.current === pdfDocument;\n prevDocRef.current = pdfDocument;\n\n let scrollFraction = 0;\n let savedScaleValue: string | number | undefined;\n if (isToggle && viewerRef.current.container) {\n const c = viewerRef.current.container;\n const range = c.scrollHeight - c.clientHeight;\n scrollFraction = range > 0 ? c.scrollTop / range : 0;\n // currentScaleValue is \"auto\"/\"page-width\"/... or a numeric zoom; keep\n // whichever it is so a responsive scale stays responsive and an explicit\n // zoom stays exact. Fall back to the computed numeric scale.\n savedScaleValue =\n viewerRef.current.currentScaleValue ?? viewerRef.current.currentScale;\n }\n\n console.log(\"[PdfHighlighter] recolor active?\", {\n mode: resolvedTheme.mode,\n hasMap: !!recolorMapRef.current,\n palette: resolvedTheme.darkModeColors,\n isToggle,\n scrollFraction,\n savedScaleValue,\n });\n\n if (isToggle) {\n const restoreView = () => {\n eventBusRef.current.off(\"pagesinit\", restoreView);\n // Restore zoom first (this fires after handleScaleValue's pagesinit\n // handler, so it wins), then the scroll fraction in an rAF once the\n // re-scaled layout has settled and the scrollable range is final.\n if (savedScaleValue != null && viewerRef.current) {\n viewerRef.current.currentScaleValue = String(savedScaleValue);\n }\n requestAnimationFrame(() => {\n const c = viewerRef.current?.container;\n if (!c) return;\n const range = c.scrollHeight - c.clientHeight;\n c.scrollTop = scrollFraction * Math.max(0, range);\n console.log(\"[PdfHighlighter] restored view after toggle\", {\n scrollFraction,\n scrollTop: c.scrollTop,\n scaleValue: viewerRef.current?.currentScaleValue,\n });\n });\n };\n eventBusRef.current.on(\"pagesinit\", restoreView);\n }\n\n lastRenderKeyRef.current = renderKey;\n viewerRef.current.setDocument(pdfDocument);\n linkServiceRef.current.setDocument(pdfDocument);\n linkServiceRef.current.setViewer(viewerRef.current);\n setIsViewerReady(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pdfDocument, recolorKey]);\n\n // Initialise viewer event listeners\n useLayoutEffect(() => {\n if (!containerNodeRef.current) return;\n\n // Re-apply the scale (\"auto\"/\"page-width\" must re-fit) on every\n // ResizeObserver firing, unconditionally — do NOT try to dedupe by\n // comparing to the last-seen container size. In some consumer layouts\n // (e.g. a sidebar/header still resolving) the container measures 0x0 at\n // every firing up through pagesinit, and no *subsequent* distinct\n // ResizeObserver notification ever arrives once it reaches its real size\n // (observed empirically — likely coalesced into the same batch as an\n // early measurement). A size-based dedupe here permanently missed the one\n // callback that would have corrected the scale, so PDF.js's internal\n // scale never changed from its premature value and — since it no-ops a\n // same-valued assignment — never queued a render: pages stayed blank\n // forever. This effect also re-runs on nearly every consumer render\n // (its deps include `highlights`/`selectionTip`/`onSelectionFinished`,\n // which are commonly fresh identities each render), recreating the\n // observer and firing its mandatory initial callback again — relied on\n // here as the retry mechanism until one lands after real layout. The\n // wasted-re-raster case this used to guard against (the rounded-value\n // round-trip after a wheel-zoom commit) is instead caught by the\n // scale-proximity tolerance check inside handleScaleValue itself, which\n // is unrelated to container size and doesn't have this failure mode.\n resizeObserverRef.current = new ResizeObserver(() => {\n handleScaleValueRef.current();\n });\n resizeObserverRef.current.observe(containerNodeRef.current);\n\n const doc = containerNodeRef.current.ownerDocument;\n\n // Page render events don't change highlight CONTENT — only the newly\n // (re)built page needs painting. A stale-only pass skips every up-to-date\n // page, so these per-page events stop re-rendering the whole document.\n const handlePageRendered = () => renderHighlightLayers(true);\n\n eventBusRef.current.on(\"textlayerrendered\", handlePageRendered);\n eventBusRef.current.on(\"pagerendered\", handlePageRendered);\n eventBusRef.current.on(\"pagesinit\", handleScaleValue);\n\n // Self-healing re-arm: this effect's deps include `highlights` and\n // `selectionTip`/`onSelectionFinished`, which are commonly fresh\n // identities on every consumer render — and a consumer re-renders on\n // essentially every scroll tick during a scrollToHighlight navigation\n // (e.g. an onPageChange callback updating state as pages are crossed).\n // Each such re-render tears down and rebuilds this WHOLE effect,\n // cancelling whatever settle-detection scrollToHighlight had in flight\n // with no recovery — the away-listener (old fixed-delay version or the\n // debounced one below) silently never gets armed, permanently stranding\n // the \"scrolled to\" ring. If a highlight is still marked current when\n // this effect (re-)runs, re-arm detection from scratch so it survives\n // any number of teardown/rebuild cycles mid-navigation.\n if (scrolledToHighlightIdRef.current) {\n resumeScrollAwayListenerAfterNavigation();\n }\n doc.addEventListener(\"keydown\", handleKeyDown);\n doc.addEventListener(\"copy\", handleCopy, true);\n\n scheduleRenderHighlightLayers();\n\n return () => {\n eventBusRef.current.off(\"pagesinit\", handleScaleValue);\n eventBusRef.current.off(\"pagerendered\", handlePageRendered);\n eventBusRef.current.off(\"textlayerrendered\", handlePageRendered);\n doc.removeEventListener(\"keydown\", handleKeyDown);\n doc.removeEventListener(\"copy\", handleCopy, true);\n resizeObserverRef.current?.disconnect();\n renderRetryTimeoutsRef.current.forEach(clearTimeout);\n renderRetryTimeoutsRef.current = [];\n if (resumeScrollAwayTimeoutRef.current) {\n clearTimeout(resumeScrollAwayTimeoutRef.current);\n resumeScrollAwayTimeoutRef.current = null;\n }\n if (settleScrollListenerRef.current) {\n viewerRef.current?.container.removeEventListener(\n \"scroll\",\n settleScrollListenerRef.current,\n );\n settleScrollListenerRef.current = null;\n }\n };\n }, [selectionTip, highlights, onSelectionFinished]);\n\n // Unmount every per-page highlight/note React root when the viewer unmounts —\n // these roots are mounted into PDF.js-owned DOM (outside React's tree) so they\n // are not torn down automatically and would otherwise leak.\n useEffect(() => {\n return () => {\n for (const binding of Object.values(highlightBindingsRef.current))\n unmountReactRoot(binding);\n for (const binding of Object.values(noteBindingsRef.current))\n unmountReactRoot(binding);\n };\n }, []);\n\n // Page tracking + deep-link / initial page. Registered after the listeners\n // effect so this `pagesinit` handler runs after handleScaleValue (scale set\n // before we scroll to the initial page). Refs keep the listeners stable so we\n // never resubscribe on prop changes.\n const onPageChangeRef = useRef(onPageChange);\n onPageChangeRef.current = onPageChange;\n const initialPageRef = useRef(initialPage);\n initialPageRef.current = initialPage;\n const initialPageAppliedRef = useRef(false);\n // While the initial page is being homed in, the viewer fires spurious\n // pagechanging events (1, target, 1, 2…) as scale/resize relayout settles.\n // This holds the target during that window so we (a) suppress URL writes that\n // would clobber the deep link and (b) re-assert the target until it sticks.\n const pendingInitialPageRef = useRef<number | null>(null);\n\n useEffect(() => {\n const eventBus = eventBusRef.current;\n\n const handlePageChanging = (evt: { pageNumber: number }) => {\n // Don't let the load-time bounce overwrite the deep-linked page.\n if (pendingInitialPageRef.current != null) return;\n onPageChangeRef.current?.(evt.pageNumber);\n };\n eventBus.on(\"pagechanging\", handlePageChanging);\n\n // First load only: home in on the requested initial page once pages exist.\n // Guarded so a dark-mode toggle (which also fires pagesinit) never re-jumps.\n const handlePagesInit = () => {\n if (initialPageAppliedRef.current) return;\n initialPageAppliedRef.current = true;\n const page = initialPageRef.current;\n console.log(\"[PdfHighlighter] pagesinit, initialPage =\", page);\n if (!page || page <= 1) return;\n\n pendingInitialPageRef.current = page;\n let tries = 0;\n let matches = 0;\n\n // Poll: scale/resize relayout keeps yanking the view back to the top for\n // a few hundred ms after load. Re-assert the target until the viewer\n // reports it as the current page for a few consecutive ticks, then\n // release and write the URL once. Bounded so we never spin forever.\n const tick = () => {\n const viewer = viewerRef.current;\n if (!viewer || pendingInitialPageRef.current == null) return;\n tries++;\n\n if (viewer.currentPageNumber === page) {\n matches++;\n } else {\n matches = 0;\n try {\n viewer.scrollPageIntoView({ pageNumber: page });\n } catch (e) {\n console.log(\"[PdfHighlighter] scrollPageIntoView threw\", e);\n }\n }\n\n if (matches >= 3) {\n pendingInitialPageRef.current = null;\n onPageChangeRef.current?.(page); // ensure URL = the resolved page\n console.log(\"[PdfHighlighter] initialPage settled at\", page);\n return;\n }\n if (tries > 40) {\n pendingInitialPageRef.current = null;\n console.log(\"[PdfHighlighter] initialPage gave up at\", page);\n return;\n }\n setTimeout(tick, 50);\n };\n setTimeout(tick, 0);\n };\n eventBus.on(\"pagesinit\", handlePagesInit);\n\n return () => {\n eventBus.off(\"pagechanging\", handlePageChanging);\n eventBus.off(\"pagesinit\", handlePagesInit);\n pendingInitialPageRef.current = null;\n };\n }, []);\n\n // Pinch-to-zoom: ctrl/⌘ + wheel (trackpad pinch) and two-finger touch. For\n // smoothness we DON'T re-rasterise per frame (that's janky). During the\n // gesture we only apply a GPU-composited CSS `transform: scale()` to the\n // .pdfViewer — buttery, anchored to the cursor / pinch centre via\n // transform-origin. When the gesture settles we commit ONCE: set the real\n // PDF.js scale (one crisp re-raster) and fix the scroll so the anchor stays\n // put. This is the lector approach adapted to PDFViewer.\n const onZoomChangeRef = useRef(onZoomChange);\n onZoomChangeRef.current = onZoomChange;\n\n useEffect(() => {\n const container = containerNodeRef.current;\n if (!container || !isViewerReady) return;\n\n const MIN_SCALE = 0.25;\n const MAX_SCALE = 10;\n // Ms of no wheel events before committing (one crisp re-raster). Mouse\n // wheel notches often arrive 150–250ms apart, so anything shorter makes\n // nearly EVERY notch commit — a full PDF.js re-raster per notch, which\n // reads as terrible zoom performance. 280ms coalesces a notch train into\n // one commit while trackpad pinches (dense event streams) are unaffected.\n const COMMIT_DELAY = 280;\n\n // Live gesture state. originX/Y are the anchor in CONTENT coords (fixed for\n // the whole gesture); anchorX/Y are the same point relative to the container.\n const g = {\n active: false,\n startScale: 1,\n startScrollLeft: 0,\n startScrollTop: 0,\n anchorX: 0,\n anchorY: 0,\n originX: 0,\n originY: 0,\n k: 1,\n raf: 0,\n commitTimer: 0 as number | ReturnType<typeof setTimeout>,\n };\n\n const pdfViewerEl = () =>\n container.querySelector(\".pdfViewer\") as HTMLElement | null;\n\n const clampK = (k: number) =>\n Math.min(\n MAX_SCALE / g.startScale,\n Math.max(MIN_SCALE / g.startScale, k),\n );\n\n const begin = (anchorX: number, anchorY: number) => {\n const viewer = viewerRef.current;\n const el = pdfViewerEl();\n if (!viewer || !el) return false;\n g.active = true;\n g.startScale = viewer.currentScale;\n g.startScrollLeft = container.scrollLeft;\n g.startScrollTop = container.scrollTop;\n g.anchorX = anchorX;\n g.anchorY = anchorY;\n g.originX = container.scrollLeft + anchorX;\n g.originY = container.scrollTop + anchorY;\n g.k = 1;\n // Scale about the anchor point (in the element's own coord space) so it\n // stays under the fingers; no layout/scroll change during the preview.\n el.style.transformOrigin = `${g.originX}px ${g.originY}px`;\n el.style.willChange = \"transform\";\n return true;\n };\n\n const previewRaf = () => {\n g.raf = 0;\n const el = pdfViewerEl();\n if (el) el.style.transform = `scale(${g.k})`;\n };\n const preview = () => {\n if (!g.raf) g.raf = requestAnimationFrame(previewRaf);\n };\n\n const commit = () => {\n if (!g.active) return;\n g.active = false;\n if (g.raf) {\n cancelAnimationFrame(g.raf);\n g.raf = 0;\n }\n const viewer = viewerRef.current;\n const el = pdfViewerEl();\n if (el) {\n el.style.transform = \"\";\n el.style.transformOrigin = \"\";\n el.style.willChange = \"\";\n }\n if (!viewer) return;\n const finalScale = Math.min(\n MAX_SCALE,\n Math.max(MIN_SCALE, g.startScale * g.k),\n );\n const ratio = finalScale / g.startScale;\n // No-op gesture (e.g. wheeling past the min/max clamp, or a pinch that\n // returned to 1×): the preview transform is already cleared above, so\n // skip the re-raster entirely — committing the SAME scale would still\n // re-render every visible page for zero visual change.\n if (Math.abs(ratio - 1) < 1e-3) return;\n // Re-raster once at the new scale, then anchor the scroll so the content\n // point under the gesture stays in place.\n viewer.currentScaleValue = String(finalScale);\n container.scrollLeft = g.originX * ratio - g.anchorX;\n container.scrollTop = g.originY * ratio - g.anchorY;\n // Notify the consumer on the NEXT task: their setState re-renders the\n // whole app, and doing that inside the commit frame piles React work on\n // top of PDF.js's relayout — a visibly longer hitch.\n setTimeout(() => onZoomChangeRef.current?.(finalScale), 0);\n console.log(\"[PdfHighlighter] pinch commit\", {\n from: g.startScale,\n to: finalScale,\n });\n };\n\n const scheduleCommit = () => {\n clearTimeout(g.commitTimer);\n g.commitTimer = setTimeout(commit, COMMIT_DELAY);\n };\n\n const handleWheel = (e: WheelEvent) => {\n if (!e.ctrlKey && !e.metaKey) return; // pinch / ctrl-scroll only\n e.preventDefault();\n if (!g.active) {\n // Anchor is fixed for the whole gesture, so the (layout-forcing)\n // getBoundingClientRect read only happens here — not on every notch.\n const rect = container.getBoundingClientRect();\n if (!begin(e.clientX - rect.left, e.clientY - rect.top)) return;\n }\n // Normalise deltaMode: Firefox mouse wheels report lines (~±3), not\n // pixels (~±100) — without this, zoom there barely moves per notch.\n const delta =\n e.deltaMode === 1 ? e.deltaY * 16 : e.deltaMode === 2 ? e.deltaY * 100 : e.deltaY;\n // Exponential: each notch is a constant ratio. Up = zoom in.\n g.k = clampK(g.k * Math.exp(-delta * 0.01));\n preview();\n scheduleCommit(); // wheel has no end event — commit after it stops\n };\n container.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n // Two-finger touch pinch via pointer events.\n const pointers = new Map<number, PointerEvent>();\n let startDist = 0;\n const spread = () => {\n const [a, b] = [...pointers.values()];\n return Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n };\n const onPointerDown = (e: PointerEvent) => {\n if (e.pointerType === \"touch\") pointers.set(e.pointerId, e);\n };\n const onPointerMove = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return;\n pointers.set(e.pointerId, e);\n if (pointers.size !== 2) return;\n e.preventDefault();\n const d = spread();\n const [a, b] = [...pointers.values()];\n const rect = container.getBoundingClientRect();\n const cx = (a.clientX + b.clientX) / 2 - rect.left;\n const cy = (a.clientY + b.clientY) / 2 - rect.top;\n if (!g.active) {\n startDist = d;\n if (!begin(cx, cy)) return;\n return;\n }\n g.k = clampK(d / startDist);\n preview();\n };\n const onPointerUp = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (pointers.size < 2 && g.active) {\n startDist = 0;\n commit(); // pinch ended — commit immediately\n }\n };\n container.addEventListener(\"pointerdown\", onPointerDown);\n container.addEventListener(\"pointermove\", onPointerMove, { passive: false });\n container.addEventListener(\"pointerup\", onPointerUp);\n container.addEventListener(\"pointercancel\", onPointerUp);\n\n return () => {\n container.removeEventListener(\"wheel\", handleWheel);\n container.removeEventListener(\"pointerdown\", onPointerDown);\n container.removeEventListener(\"pointermove\", onPointerMove);\n container.removeEventListener(\"pointerup\", onPointerUp);\n container.removeEventListener(\"pointercancel\", onPointerUp);\n clearTimeout(g.commitTimer);\n if (g.raf) cancelAnimationFrame(g.raf);\n const el = pdfViewerEl();\n if (el) {\n el.style.transform = \"\";\n el.style.transformOrigin = \"\";\n el.style.willChange = \"\";\n }\n };\n }, [isViewerReady]);\n\n // Event listeners\n const handleScroll = () => {\n onScrollAway && onScrollAway();\n scrolledToHighlightIdRef.current = null;\n renderHighlightLayers();\n };\n\n const handleMouseUp: PointerEventHandler = () => {\n const container = containerNodeRef.current;\n const selection = getWindow(container).getSelection();\n\n if (!container || !selection || selection.isCollapsed || !viewerRef.current)\n return;\n\n const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\n // Check the selected text is in the document, not the tip\n if (!range || !container.contains(range.commonAncestorContainer)) return;\n\n const pages = getPagesFromRange(range);\n if (!pages || pages.length === 0) return;\n\n const rects = getClientRects(range, pages);\n if (rects.length === 0) return;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: getBoundingRect(rects),\n rects,\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n const content: Content = {\n text: selection.toString().split(\"\\n\").join(\" \"), // Make all line breaks spaces\n };\n\n selectionRef.current = {\n content,\n type: \"text\",\n position: scaledPosition,\n makeGhostHighlight: () => {\n ghostHighlightRef.current = {\n content: content,\n type: \"text\",\n position: scaledPosition,\n };\n\n onCreateGhostHighlight &&\n onCreateGhostHighlight(ghostHighlightRef.current);\n clearTextSelection();\n renderHighlightLayers();\n return ghostHighlightRef.current;\n },\n };\n\n onSelectionFinished && onSelectionFinished(selectionRef.current);\n\n selectionTip &&\n setTip({ position: viewportPosition, content: selectionTip });\n };\n\n const handleMouseDown: PointerEventHandler = (event) => {\n if (\n !isHTMLElement(event.target) ||\n asElement(event.target).closest(\".PdfHighlighter__tip-container\") // Ignore selections on tip container\n ) {\n return;\n }\n\n // Check for freetext creation mode\n if (\n enableFreetextCreation?.(event.nativeEvent) &&\n onFreetextClick &&\n !isEditInProgressRef.current\n ) {\n const target = asElement(event.target);\n const page = getPageFromElement(target);\n\n if (page && viewerRef.current) {\n const pageRect = page.node.getBoundingClientRect();\n const clickX = event.clientX - pageRect.left;\n const clickY = event.clientY - pageRect.top;\n\n // Default size for new freetext note\n const defaultWidth = 150;\n const defaultHeight = 80;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: clickX,\n top: clickY,\n width: defaultWidth,\n height: defaultHeight,\n pageNumber: page.number,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n onFreetextClick(scaledPosition);\n return; // Don't proceed with normal mousedown handling\n }\n }\n\n // Check for image creation mode\n if (\n enableImageCreation?.(event.nativeEvent) &&\n onImageClick &&\n !isEditInProgressRef.current\n ) {\n const target = asElement(event.target);\n const page = getPageFromElement(target);\n\n if (page && viewerRef.current) {\n const pageRect = page.node.getBoundingClientRect();\n const clickX = event.clientX - pageRect.left;\n const clickY = event.clientY - pageRect.top;\n\n // Default size for new image\n const defaultWidth = 150;\n const defaultHeight = 100;\n\n const viewportPosition: ViewportPosition = {\n boundingRect: {\n left: clickX,\n top: clickY,\n width: defaultWidth,\n height: defaultHeight,\n pageNumber: page.number,\n },\n rects: [],\n };\n\n const scaledPosition = viewportPositionToScaled(\n viewportPosition,\n viewerRef.current,\n );\n\n onImageClick(scaledPosition);\n return; // Don't proceed with normal mousedown handling\n }\n }\n\n setTip(null);\n clearTextSelection(); // TODO: Check if clearing text selection only if not clicking on tip breaks anything.\n removeGhostHighlight();\n toggleEditInProgress(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.code === \"Escape\") {\n clearTextSelection();\n removeGhostHighlight();\n setTip(null);\n }\n };\n\n const handleCopy = (event: ClipboardEvent) => {\n const container = containerNodeRef.current;\n\n if (!container || !event.clipboardData) return;\n\n const target = event.target;\n const targetElement =\n target instanceof HTMLElement\n ? target\n : target instanceof Node\n ? target.parentElement\n : null;\n\n if (\n targetElement &&\n (targetElement.closest(\"input, textarea, [contenteditable='true']\") ||\n targetElement.closest(\".PdfHighlighter__tip-container\"))\n ) {\n return;\n }\n\n const selection = getWindow(container).getSelection();\n const range = selection?.rangeCount ? selection.getRangeAt(0) : null;\n\n if (\n !selection ||\n selection.isCollapsed ||\n !range ||\n !container.contains(range.commonAncestorContainer)\n ) {\n return;\n }\n\n const text =\n selectionRef.current?.content.text?.trim() ||\n selection.toString().split(\"\\n\").join(\" \").trim();\n\n if (!text) return;\n\n event.clipboardData.setData(\"text/plain\", text);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleScaleValue = () => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n // Skip when the viewer is already (within rounding noise) at the target\n // scale. Without this, every pinch/wheel commit paid for a SECOND full\n // re-raster: commit sets the exact scale (e.g. 1.5373), onZoomChange gives\n // the consumer a rounded value (1.54) back via the pdfScaleValue prop, and\n // re-applying that near-identical value re-rendered every visible page\n // again — and without scroll anchoring, so the view could also shift.\n const target = parseFloat(String(pdfScaleValue));\n if (\n !Number.isNaN(target) &&\n Math.abs(viewer.currentScale - target) / target < 0.005\n ) {\n return;\n }\n viewer.currentScaleValue = pdfScaleValue.toString();\n };\n const handleScaleValueRef = useRef(handleScaleValue);\n handleScaleValueRef.current = handleScaleValue;\n\n // Apply pdfScaleValue when the PROP changes (zoom buttons, external zoom\n // state). Previously this only worked by accident: consumers passing inline\n // props re-ran the listener effect every render, whose fresh\n // ResizeObserver.observe() fired an initial callback that re-applied the\n // prop. That accident also caused the double-raster above — the observer is\n // now guarded to real size changes, so the prop needs its own effect.\n useEffect(() => {\n handleScaleValueRef.current();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pdfScaleValue, isViewerReady]);\n\n // Render Highlight layers\n const renderHighlightLayer = (\n highlightBindings: HighlightBindings,\n pageNumber: number,\n highlightsByPage: ReturnType<typeof groupHighlightsByPage>,\n shouldRenderHighlight?: (highlight: Highlight | GhostHighlight) => boolean,\n ) => {\n if (!viewerRef.current) return;\n\n highlightBindings.reactRoot.render(\n <PdfHighlighterContext.Provider value={pdfHighlighterUtils}>\n <HighlightLayer\n highlightsByPage={highlightsByPage}\n pageNumber={pageNumber}\n scrolledToHighlightId={scrolledToHighlightIdRef.current}\n viewer={viewerRef.current}\n highlightBindings={highlightBindings}\n shouldRenderHighlight={shouldRenderHighlight}\n children={childrenRef.current}\n />\n </PdfHighlighterContext.Provider>,\n );\n };\n\n /**\n * Render pass version stamps. A full pass (content changed) bumps the version\n * and renders every ready page. Retry passes render ONLY pages that missed\n * the current version (their text layer appeared late), so the retry timers\n * cost near-zero instead of re-rendering the whole document each tick.\n */\n const renderVersionRef = useRef(0);\n const pageRenderedVersionRef = useRef<{ [page: number]: number }>({});\n\n const renderHighlightLayers = (onlyStalePages = false) => {\n if (!viewerRef.current) return;\n\n if (!onlyStalePages) renderVersionRef.current += 1;\n const version = renderVersionRef.current;\n\n // Group once per pass — this walks the full highlights array, and doing it\n // per page made a selection O(pages × highlights).\n const highlightsByPage = groupHighlightsByPage([\n ...highlightsRef.current,\n ghostHighlightRef.current,\n ]);\n\n for (let pageNumber = 1; pageNumber <= pdfDocument.numPages; pageNumber++) {\n const { textLayer } = viewerRef.current!.getPageView(pageNumber - 1) || {};\n if (!textLayer) continue; // Viewer hasn't rendered page yet\n\n const textLayerDiv = textLayer.div; // textLayer.div for version >=3.0 and textLayer.textLayerDiv otherwise.\n\n // Both layers live in the stable .page element — a sibling of the\n // volatile text layer, not a child of it. Nesting inside .textLayer\n // scopes our z-index to *its* local stacking context, which put\n // pdf.js's .annotationLayer (z-index 3, a .page-level sibling of\n // .textLayer at z-index 2) above our highlights globally, silently\n // swallowing clicks meant for them. As a .page-level sibling instead,\n // our z-index compares directly against .annotationLayer's, so clicks\n // land correctly again.\n const pageEl = textLayerDiv.closest(\".page\") as HTMLElement | null;\n if (!pageEl) continue;\n\n // A page whose text layer was rebuilt (zoom / unload+reload) must render\n // even in a stale-only pass: viewport coords changed with the new layer.\n const existingBinding = highlightBindingsRef.current[pageNumber];\n const layerRebuilt =\n !existingBinding || existingBinding.container.parentNode !== pageEl;\n\n if (\n onlyStalePages &&\n !layerRebuilt &&\n pageRenderedVersionRef.current[pageNumber] === version\n ) {\n continue; // Already reflects the current content at the current layout.\n }\n\n // Text/Area highlights get their own mix-blend-mode: multiply (set in\n // CSS on this layer) so a highlight's color tint still shows the black\n // text underneath, like a real highlighter pen, instead of covering\n // it — the same effect pdf.js's own .textLayer relies on multiply for,\n // just applied directly rather than via DOM nesting. Reuse + re-attach\n // the same element/root rather than recreating it, so PDF.js page\n // re-renders don't make React render into an emptied container.\n const highlightBindings = ensurePersistentLayer(\n highlightBindingsRef.current,\n pageNumber,\n pageEl,\n \"PdfHighlighter__highlight-layer\",\n );\n renderHighlightLayer(\n highlightBindings,\n pageNumber,\n highlightsByPage,\n (highlight) => !needsOpaqueLayer(highlight),\n );\n\n // The opaque-annotation layer (Freetext/Image/Drawing/Shape) — these\n // types need a truly opaque background (a photo, ink strokes, a\n // sticky note), so it uses mix-blend-mode: normal instead.\n {\n const noteBindings = ensurePersistentLayer(\n noteBindingsRef.current,\n pageNumber,\n pageEl,\n \"PdfHighlighter__note-layer\",\n );\n renderHighlightLayer(\n noteBindings,\n pageNumber,\n highlightsByPage,\n needsOpaqueLayer,\n );\n }\n pageRenderedVersionRef.current[pageNumber] = version;\n }\n };\n\n const scheduleRenderHighlightLayers = () => {\n renderHighlightLayers();\n\n // Catch pages whose text layer wasn't ready yet. Stale-only passes skip\n // every already-rendered page, so these timers are cheap checks now.\n renderRetryTimeoutsRef.current.forEach(clearTimeout);\n renderRetryTimeoutsRef.current = [50, 250, 1200].map((delay) =>\n setTimeout(() => renderHighlightLayers(true), delay),\n );\n };\n\n const resumeScrollAwayListenerAfterNavigation = () => {\n const container = viewerRef.current?.container;\n if (!container) return;\n\n if (resumeScrollAwayTimeoutRef.current) {\n clearTimeout(resumeScrollAwayTimeoutRef.current);\n resumeScrollAwayTimeoutRef.current = null;\n }\n if (settleScrollListenerRef.current) {\n container.removeEventListener(\"scroll\", settleScrollListenerRef.current);\n settleScrollListenerRef.current = null;\n }\n\n // scrollToHighlight's container.scrollTo({behavior:\"smooth\"}) has no\n // fixed duration — browsers scale it with scroll distance, so a highlight\n // far from the current view can still be mid-animation well past any\n // fixed guess. The previous code waited a flat 1200ms then armed a\n // ONE-TIME \"scroll\" listener as the away-detector; for a longer-than-1200ms\n // animation, that listener fired on a spurious tail-tick of the STILL-\n // RUNNING auto-scroll rather than a real user scroll, consumed itself\n // (`{once:true}`), and was never re-armed — permanently stranding the\n // \"scrolled to\" ring/highlight-list-sync until the next navigation\n // (nothing else ever clears scrolledToHighlightIdRef — see handleScroll).\n // Fix: don't guess a duration at all. Watch for genuine quiet — keep\n // pushing out a short timer on every scroll tick; only once ticks stop\n // for QUIET_MS do we consider the auto-scroll actually settled, and THEN\n // arm the real one-time away-listener for the next (genuine) scroll.\n const QUIET_MS = 150;\n const onSettleTick = () => {\n if (resumeScrollAwayTimeoutRef.current) {\n clearTimeout(resumeScrollAwayTimeoutRef.current);\n }\n resumeScrollAwayTimeoutRef.current = setTimeout(() => {\n container.removeEventListener(\"scroll\", onSettleTick);\n settleScrollListenerRef.current = null;\n container.addEventListener(\"scroll\", handleScroll, { once: true });\n resumeScrollAwayTimeoutRef.current = null;\n }, QUIET_MS);\n };\n\n settleScrollListenerRef.current = onSettleTick;\n container.addEventListener(\"scroll\", onSettleTick);\n // Seed the timer immediately too, in case the highlight was already in\n // view and scrollTo() produced no scroll events to trigger onSettleTick.\n onSettleTick();\n };\n\n // Utils\n const isEditingOrHighlighting = () => {\n return (\n Boolean(selectionRef.current) ||\n Boolean(ghostHighlightRef.current) ||\n isAreaSelectionInProgressRef.current ||\n isEditInProgressRef.current\n );\n };\n\n const toggleEditInProgress = (flag?: boolean) => {\n if (flag !== undefined) {\n isEditInProgressRef.current = flag;\n } else {\n isEditInProgressRef.current = !isEditInProgressRef.current;\n }\n\n // Disable text selection\n if (viewerRef.current)\n viewerRef.current.viewer?.classList.toggle(\n \"PdfHighlighter--disable-selection\",\n isEditInProgressRef.current,\n );\n };\n\n const removeGhostHighlight = () => {\n if (onRemoveGhostHighlight && ghostHighlightRef.current)\n onRemoveGhostHighlight(ghostHighlightRef.current);\n ghostHighlightRef.current = null;\n renderHighlightLayers();\n };\n\n const clearTextSelection = () => {\n selectionRef.current = null;\n\n const container = containerNodeRef.current;\n const selection = getWindow(container).getSelection();\n if (!container || !selection) return;\n selection.removeAllRanges();\n };\n\n const scrollToHighlight = (highlight: Highlight) => {\n const { boundingRect, usePdfCoordinates } = highlight.position;\n const pageNumber = boundingRect.pageNumber;\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n // Remove scroll listener in case user auto-scrolls in succession.\n viewer.container.removeEventListener(\"scroll\", handleScroll);\n\n const pageView = viewer.getPageView(pageNumber - 1);\n const container = viewer.container;\n\n if (pageView?.div && pageView.viewport) {\n // Compute the absolute scroll target ourselves so we can animate it\n // smoothly (pdf.js scrollPageIntoView jumps instantly). The page div\n // already has its final offset even before the page is rasterised, so\n // jumping across many pages still lands in the right place.\n const topInPage = scaledToViewport(\n boundingRect,\n pageView.viewport,\n usePdfCoordinates,\n ).top;\n const pageRect = pageView.div.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const target =\n container.scrollTop +\n (pageRect.top - containerRect.top) +\n topInPage -\n SCROLL_MARGIN;\n // Respect the OS \"reduce motion\" setting (JS smooth scroll ignores CSS).\n const prefersReducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n container.scrollTo({\n top: Math.max(0, target),\n behavior: prefersReducedMotion ? \"auto\" : \"smooth\",\n });\n } else {\n // Fallback: page view not available — let pdf.js handle it.\n viewer.scrollPageIntoView({ pageNumber });\n }\n\n scrolledToHighlightIdRef.current = highlight.id;\n scheduleRenderHighlightLayers();\n\n resumeScrollAwayListenerAfterNavigation();\n };\n\n const dispatchFind = (\n query: string,\n findPrevious: boolean,\n options: PdfSearchOptions = {},\n type?: \"again\" | \"highlightallchange\",\n ) => {\n eventBusRef.current.dispatch(\"find\", {\n source: findControllerRef.current || viewerRef.current,\n type,\n query,\n phraseSearch: true,\n caseSensitive: options.caseSensitive ?? false,\n entireWord: options.entireWord ?? false,\n highlightAll: options.highlightAll ?? true,\n findPrevious,\n matchDiacritics: options.matchDiacritics ?? false,\n });\n };\n\n const currentSearchRef = useRef<{\n query: string;\n options: PdfSearchOptions;\n }>({\n query: \"\",\n options: {},\n });\n\n const search = (query: string, options: PdfSearchOptions = {}) => {\n currentSearchRef.current = { query, options };\n\n if (!query.trim()) {\n clearSearch();\n return;\n }\n\n dispatchFind(query, false, options);\n };\n\n const findNext = () => {\n const { query, options } = currentSearchRef.current;\n if (!query.trim()) return;\n dispatchFind(query, false, options, \"again\");\n };\n\n const findPrevious = () => {\n const { query, options } = currentSearchRef.current;\n if (!query.trim()) return;\n dispatchFind(query, true, options, \"again\");\n };\n\n const clearSearch = () => {\n currentSearchRef.current = { query: \"\", options: {} };\n eventBusRef.current.dispatch(\"findbarclose\", {\n source: findControllerRef.current || viewerRef.current,\n });\n };\n\n const latestUtils: PdfHighlighterUtils = {\n isEditingOrHighlighting,\n setHighlightSelected: (selected: boolean) => {\n selectedHighlightCountRef.current = Math.max(\n 0,\n selectedHighlightCountRef.current + (selected ? 1 : -1),\n );\n },\n isHighlightSelected: () => selectedHighlightCountRef.current > 0,\n getCurrentSelection: () => selectionRef.current,\n getGhostHighlight: () => ghostHighlightRef.current,\n removeGhostHighlight,\n toggleEditInProgress,\n isEditInProgress: () => isEditInProgressRef.current,\n isSelectionInProgress: () =>\n Boolean(selectionRef.current) || isAreaSelectionInProgressRef.current,\n scrollToHighlight,\n getViewer: () => viewerRef.current,\n getTip: () => tip,\n setTip,\n updateTipPosition: updateTipPositionRef.current,\n getLinkService: () => linkServiceRef.current,\n getEventBus: () => eventBusRef.current,\n search,\n findNext,\n findPrevious,\n clearSearch,\n goToPage: (pageNumber: number) => {\n console.log('[PdfHighlighter] goToPage called with page:', pageNumber);\n const viewer = viewerRef.current;\n if (!viewer) {\n console.log('[PdfHighlighter] goToPage: viewer not available');\n return;\n }\n\n // Check if viewer container has a valid offsetParent (required by PDF.js)\n const container = viewer.container;\n console.log('[PdfHighlighter] goToPage: container:', !!container, 'offsetParent:', !!container?.offsetParent);\n if (container && container.offsetParent) {\n try {\n console.log('[PdfHighlighter] goToPage: using viewer.scrollPageIntoView');\n viewer.scrollPageIntoView({ pageNumber });\n return;\n } catch (e) {\n console.log('[PdfHighlighter] goToPage: scrollPageIntoView threw error:', e);\n // Fall through to DOM-based scrolling\n }\n }\n\n // Fallback: Use DOM-based scrolling when PDF.js scrollPageIntoView fails\n const pageElement = container?.querySelector(`.page[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n console.log('[PdfHighlighter] goToPage: DOM fallback, pageElement found:', !!pageElement);\n if (pageElement && container) {\n // PDF.js pages use position:absolute with inline style.top set to their position\n // Parse the inline style.top value to get the scroll target\n const styleTop = pageElement.style.top;\n const scrollTarget = styleTop ? parseInt(styleTop, 10) : 0;\n console.log('[PdfHighlighter] goToPage: style.top =', styleTop, 'scrollTarget =', scrollTarget);\n\n if (scrollTarget > 0) {\n container.scrollTo({\n top: scrollTarget,\n behavior: 'smooth'\n });\n } else {\n // Fallback: use getBoundingClientRect if style.top is not set\n const containerRect = container.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const scrollTop = container.scrollTop + (pageRect.top - containerRect.top);\n console.log('[PdfHighlighter] goToPage: using getBoundingClientRect, scrollTop =', scrollTop);\n container.scrollTo({\n top: scrollTop,\n behavior: 'smooth'\n });\n }\n } else {\n // Try document-wide search as last resort\n const docPageElement = document.querySelector(`.page[data-page-number=\"${pageNumber}\"]`) as HTMLElement | null;\n console.log('[PdfHighlighter] goToPage: document-wide search, found:', !!docPageElement);\n if (docPageElement) {\n // Parse inline style.top\n const styleTop = docPageElement.style.top;\n const scrollTarget = styleTop ? parseInt(styleTop, 10) : 0;\n const scrollContainer = docPageElement.closest('.pdfViewer')?.parentElement as HTMLElement | null;\n\n if (scrollContainer && scrollTarget > 0) {\n console.log('[PdfHighlighter] goToPage: document search, scrolling to style.top =', scrollTarget);\n scrollContainer.scrollTo({\n top: scrollTarget,\n behavior: 'smooth'\n });\n } else {\n // Last resort: use scrollIntoView\n console.log('[PdfHighlighter] goToPage: using scrollIntoView fallback');\n docPageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n }\n },\n };\n\n // The utils object above closes over fresh state every render, so its\n // identity changes constantly — passed straight into the per-page context\n // Providers (and utilsRef) that would defeat memoization and make consumers\n // treat every render as a change. Expose a STABLE facade instead: created\n // once, every method delegates to the latest implementation via a ref.\n const latestUtilsRef = useRef(latestUtils);\n latestUtilsRef.current = latestUtils;\n const stableUtilsRef = useRef<PdfHighlighterUtils | null>(null);\n if (!stableUtilsRef.current) {\n const facade = {} as Record<string, unknown>;\n for (const key of Object.keys(latestUtils) as (keyof PdfHighlighterUtils)[]) {\n facade[key] = (...args: unknown[]) =>\n (latestUtilsRef.current[key] as (...a: unknown[]) => unknown)(...args);\n }\n stableUtilsRef.current = facade as unknown as PdfHighlighterUtils;\n }\n const pdfHighlighterUtils = stableUtilsRef.current;\n\n // Only call utilsRef once when viewer is ready to prevent infinite re-render loop\n const utilsRefCalledRef = useRef(false);\n useEffect(() => {\n if (viewerRef.current && !utilsRefCalledRef.current) {\n utilsRefCalledRef.current = true;\n utilsRef(pdfHighlighterUtils);\n }\n }, [pdfHighlighterUtils, utilsRef]);\n\n // Check if freetext or image mode is active for cursor styling\n const isFreetextMode = enableFreetextCreation?.({} as MouseEvent) ?? false;\n const isImageMode = enableImageCreation?.({} as MouseEvent) ?? false;\n\n // Build class name based on active modes and theme\n let containerClassName = 'PdfHighlighter';\n if (resolvedTheme.mode === 'dark') containerClassName += ' PdfHighlighter--dark';\n if (isFreetextMode) containerClassName += ' PdfHighlighter--freetext-mode';\n if (isImageMode) containerClassName += ' PdfHighlighter--image-mode';\n if (enableDrawingMode) containerClassName += ' PdfHighlighter--drawing-mode';\n if (enableShapeMode) containerClassName += ' PdfHighlighter--shape-mode';\n if (areaSelectionMode) containerClassName += ' PdfHighlighter--area-mode';\n\n // Merge user style with theme background\n const containerStyle: CSSProperties = {\n ...style,\n backgroundColor: resolvedTheme.containerBackgroundColor,\n };\n\n return (\n <PdfHighlighterContext.Provider value={pdfHighlighterUtils}>\n <div\n ref={containerNodeRef}\n className={containerClassName}\n onPointerDown={handleMouseDown}\n onPointerUp={handleMouseUp}\n style={containerStyle}\n >\n <div className=\"pdfViewer\" />\n <style>\n {`\n .textLayer ::selection {\n background: ${sanitizeCssColor(textSelectionColor, DEFAULT_TEXT_SELECTION_COLOR)};\n }\n .PdfHighlighter::-webkit-scrollbar-thumb {\n background-color: ${sanitizeCssColor(resolvedTheme.scrollbarThumbColor, \"#9f9f9f\")};\n }\n .PdfHighlighter::-webkit-scrollbar-track,\n .PdfHighlighter::-webkit-scrollbar-track-piece {\n background-color: ${sanitizeCssColor(resolvedTheme.scrollbarTrackColor, \"#d1d1d1\")};\n }\n `}\n </style>\n {isViewerReady && (\n <TipContainer\n viewer={viewerRef.current!}\n updateTipPositionRef={updateTipPositionRef}\n />\n )}\n {isViewerReady && enableAreaSelection && (\n <MouseSelection\n viewer={viewerRef.current!}\n onChange={(isVisible) =>\n (isAreaSelectionInProgressRef.current = isVisible)\n }\n enableAreaSelection={enableAreaSelection}\n style={mouseSelectionStyle}\n onDragStart={() => disableTextSelection(viewerRef.current!, true)}\n onReset={() => {\n selectionRef.current = null;\n disableTextSelection(viewerRef.current!, false);\n }}\n onSelection={(\n viewportPosition,\n scaledPosition,\n image,\n resetSelection,\n ) => {\n selectionRef.current = {\n content: { image },\n type: \"area\",\n position: scaledPosition,\n makeGhostHighlight: () => {\n ghostHighlightRef.current = {\n position: scaledPosition,\n type: \"area\",\n content: { image },\n };\n onCreateGhostHighlight &&\n onCreateGhostHighlight(ghostHighlightRef.current);\n resetSelection();\n renderHighlightLayers();\n return ghostHighlightRef.current;\n },\n };\n\n onSelectionFinished && onSelectionFinished(selectionRef.current);\n selectionTip &&\n setTip({ position: viewportPosition, content: selectionTip });\n }}\n />\n )}\n {isViewerReady && enableDrawingMode && (\n <DrawingCanvas\n isActive={enableDrawingMode}\n strokeColor={drawingStrokeColor}\n strokeWidth={drawingStrokeWidth}\n viewer={viewerRef.current!}\n onComplete={(dataUrl, position, strokes) => {\n console.log(\"PdfHighlighter: Drawing complete\");\n onDrawingComplete?.(dataUrl, position, strokes);\n }}\n onCancel={() => {\n console.log(\"PdfHighlighter: Drawing cancelled\");\n onDrawingCancel?.();\n }}\n />\n )}\n {isViewerReady && enableShapeMode && (\n <ShapeCanvas\n isActive={!!enableShapeMode}\n shapeType={enableShapeMode}\n strokeColor={shapeStrokeColor}\n strokeWidth={shapeStrokeWidth}\n viewer={viewerRef.current!}\n onComplete={(position, shape) => {\n console.log(\"PdfHighlighter: Shape complete\", shape.shapeType);\n onShapeComplete?.(position, shape);\n }}\n onCancel={() => {\n console.log(\"PdfHighlighter: Shape cancelled\");\n onShapeCancel?.();\n }}\n />\n )}\n </div>\n </PdfHighlighterContext.Provider>\n );\n};\n","import type { LTWH } from \"../types\";\n\nconst intersects = (a: LTWH, b: LTWH) =>\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top;\n\nexport const copyTextToClipboard = async (text: string) => {\n if (!text) return;\n\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n};\n\nexport const extractTextFromHighlightRect = (\n anchor: HTMLElement,\n rect: LTWH,\n) => {\n const page = anchor.closest(\".page\") as HTMLElement | null;\n const textLayer = page?.querySelector(\".textLayer\");\n\n if (!page || !textLayer) return \"\";\n\n const pageRect = page.getBoundingClientRect();\n const targetRect: LTWH = {\n left: pageRect.left + rect.left,\n top: pageRect.top + rect.top,\n width: rect.width,\n height: rect.height,\n };\n\n const matches = Array.from(textLayer.querySelectorAll(\"span\"))\n .map((span) => {\n const spanRect = span.getBoundingClientRect();\n\n return {\n text: span.textContent || \"\",\n rect: {\n left: spanRect.left,\n top: spanRect.top,\n width: spanRect.width,\n height: spanRect.height,\n },\n };\n })\n .filter(({ text, rect }) => text.trim() && intersects(rect, targetRect))\n .sort((a, b) => {\n const lineDelta = a.rect.top - b.rect.top;\n return Math.abs(lineDelta) > 4 ? lineDelta : a.rect.left - b.rect.left;\n });\n\n return matches\n .map(({ text }) => text)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n};\n","import { getDocument } from \"./pdfjs-dom\";\n\nexport const findOrCreateHighlightConfigLayer = (anchor: HTMLElement) => {\n const pageLayer = anchor.closest(\".page\") as HTMLElement | null;\n\n if (!pageLayer) return null;\n\n const doc = getDocument(pageLayer);\n let layer = Array.from(pageLayer.children).find((child) =>\n child.classList.contains(\"PdfHighlighter__config-layer\"),\n ) as HTMLElement | undefined;\n\n if (!layer) {\n layer = doc.createElement(\"div\");\n layer.className = \"PdfHighlighter__config-layer\";\n pageLayer.appendChild(layer);\n }\n\n return layer;\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n memo,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Check,\n ChevronDown,\n Copy,\n Highlighter,\n Palette,\n Strikethrough,\n Trash2,\n Underline,\n} from \"lucide-react\";\n\nimport {\n copyTextToClipboard,\n extractTextFromHighlightRect,\n} from \"../lib/copy-highlight-content\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport type { ViewportHighlight } from \"../types\";\n\n/**\n * Style options for text highlight appearance.\n */\nexport interface TextHighlightStyle {\n highlightColor?: string;\n highlightStyle?: \"highlight\" | \"underline\" | \"strikethrough\";\n}\n\n/**\n * The props type for {@link TextHighlight}.\n *\n * @category Component Properties\n */\nexport interface TextHighlightProps {\n /**\n * Highlight to render over text.\n */\n highlight: ViewportHighlight;\n\n /**\n * Callback triggered whenever the user clicks on the part of a highlight.\n *\n * @param event - Mouse event associated with click.\n */\n onClick?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Callback triggered whenever the user enters the area of a text highlight.\n *\n * @param event - Mouse event associated with movement.\n */\n onMouseOver?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Callback triggered whenever the user leaves the area of a text highlight.\n *\n * @param event - Mouse event associated with movement.\n */\n onMouseOut?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Indicates whether the component is autoscrolled into view, affecting\n * default theming.\n */\n isScrolledTo: boolean;\n\n /**\n * Callback triggered whenever the user tries to open context menu on highlight.\n *\n * @param event - Mouse event associated with click.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Optional CSS styling applied to each TextHighlight part.\n */\n style?: CSSProperties;\n\n /**\n * Background/line color for the highlight.\n * Default: \"rgba(255, 226, 143, 1)\" (yellow)\n */\n highlightColor?: string;\n\n /**\n * Style mode for the highlight.\n * - \"highlight\": Solid background color (default)\n * - \"underline\": Line under the text\n * - \"strikethrough\": Line through the text\n */\n highlightStyle?: \"highlight\" | \"underline\" | \"strikethrough\";\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: TextHighlightStyle): void;\n\n /**\n * Text to copy for this highlight.\n */\n copyText?: string;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom style icon. Replaces the default palette icon.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n * Default: [\"rgba(255, 226, 143, 1)\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n colorPresets?: string[];\n\n /**\n * Extra buttons rendered in the same toolbar row, after the copy button.\n * Use this to add consumer-defined actions (e.g. a comment toggle) without\n * needing a second, separate popup.\n */\n extraButtons?: ReactNode;\n\n /**\n * Extra content rendered below the toolbar row, in the same slot as the\n * built-in style panel (e.g. a comment editor opened by an extraButtons\n * toggle).\n */\n extraPanel?: ReactNode;\n}\n\n// Default icons — lucide-react, so the toolbar matches the example app's\n// icon vocabulary instead of a separate hand-drawn set.\nconst DefaultStyleIcon = () => <Palette width={14} height={14} />;\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\nconst DefaultCopyIcon = () => <Copy width={14} height={14} />;\nconst DefaultCopiedIcon = () => <Check width={14} height={14} strokeWidth={2.5} />;\nconst ChevronDownIcon = () => <ChevronDown width={12} height={12} strokeWidth={2.5} />;\nconst CheckIcon = () => <Check width={14} height={14} strokeWidth={2.5} />;\n\n// Highlight style icons\nconst HighlightIcon = () => <Highlighter width={16} height={16} />;\nconst UnderlineIcon = () => <Underline width={16} height={16} />;\nconst StrikethroughIcon = () => <Strikethrough width={16} height={16} />;\n\n// Default color presets\nconst DEFAULT_COLOR_PRESETS = [\n \"rgba(255, 226, 143, 1)\", // Yellow (default)\n \"#ffcdd2\", // Light red\n \"#c8e6c9\", // Light green\n \"#bbdefb\", // Light blue\n \"#e1bee7\", // Light purple\n];\n\n// Display names for the default presets, used in the color dropdown. A\n// custom preset (not in this map) just falls back to showing its own value.\nconst COLOR_NAMES: Record<string, string> = {\n \"rgba(255, 226, 143, 1)\": \"Yellow\",\n \"#ffcdd2\": \"Red\",\n \"#c8e6c9\": \"Green\",\n \"#bbdefb\": \"Blue\",\n \"#e1bee7\": \"Purple\",\n};\n\n/**\n * A component for displaying a highlighted text area.\n *\n * @category Component\n */\nexport const TextHighlight = memo(({\n highlight,\n onClick,\n onMouseOver,\n onMouseOut,\n isScrolledTo,\n onContextMenu,\n style,\n highlightColor = \"rgba(255, 226, 143, 1)\",\n highlightStyle = \"highlight\",\n onStyleChange,\n onDelete,\n styleIcon,\n deleteIcon,\n copyText,\n colorPresets = DEFAULT_COLOR_PRESETS,\n extraButtons,\n extraPanel,\n}: TextHighlightProps) => {\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isColorMenuOpen, setIsColorMenuOpen] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const colorMenuRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const copyResetTimeoutRef = useRef<number | null>(null);\n\n // Deselect on click outside / Escape (selection interaction model).\n // The toolbar is portaled outside the root, so clicks inside it must\n // also count as \"inside\".\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n const insideRoot = containerRef.current?.contains(target);\n const insideToolbar = toolbarWrapperRef.current?.contains(target);\n if (!insideRoot && !insideToolbar) {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected]);\n\n // Resolve the config layer on EVERY commit (no deps): at first mount the\n // text layer may not be attached to its .page yet (pdf.js builds it async),\n // which left configLayer null forever with a run-once effect — no toolbar.\n // The identity check makes steady-state re-runs free, and a pdf.js page\n // rebuild (which relocates our layer) self-heals on the next commit.\n useLayoutEffect(() => {\n if (containerRef.current) {\n const layer = findOrCreateHighlightConfigLayer(containerRef.current);\n setConfigLayer((prev) => (prev === layer ? prev : layer));\n }\n });\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n stylePanelRef.current &&\n !stylePanelRef.current.contains(e.target as Node)\n ) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n // Close color menu when clicking outside\n useEffect(() => {\n if (!isColorMenuOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n colorMenuRef.current &&\n !colorMenuRef.current.contains(e.target as Node)\n ) {\n setIsColorMenuOpen(false);\n }\n };\n\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isColorMenuOpen]);\n\n const highlightClass = isScrolledTo ? \"TextHighlight--scrolledTo\" : \"\";\n const selectedClass = isSelected ? \"TextHighlight--selected\" : \"\";\n const { rects } = highlight.position;\n\n // Get the first rect to position the toolbar\n const firstRect = rects[0];\n\n // Not enough room above the box for the toolbar (e.g. the highlight sits\n // at the very top of the page) — flip it below instead of letting it\n // float up over whatever page content is above the box.\n const flipToolbar = !!firstRect && firstRect.top < 40;\n\n // Build style class based on highlight style\n const getPartStyleClass = () => {\n switch (highlightStyle) {\n case \"underline\":\n return \"TextHighlight__part--underline\";\n case \"strikethrough\":\n return \"TextHighlight__part--strikethrough\";\n default:\n return \"\";\n }\n };\n\n // Build inline style for each part\n const getPartStyle = (rect: typeof firstRect): CSSProperties => {\n const baseStyle: CSSProperties = { ...rect, ...style };\n\n if (highlightStyle === \"highlight\") {\n // --hl-fill-alpha (set to <100% in dark mode by PdfHighlighter.css) makes\n // the fill translucent so the light recolored text stays readable, while\n // the element stays fully opaque so the border ring isn't dimmed. Light\n // mode leaves the var unset → 100% → the original opaque color.\n baseStyle.backgroundColor = `color-mix(in srgb, ${highlightColor} var(--hl-fill-alpha, 100%), transparent)`;\n } else {\n // For underline and strikethrough, use the color for the line\n baseStyle.backgroundColor = \"transparent\";\n baseStyle.color = highlightColor;\n }\n\n return baseStyle;\n };\n\n const handleCopy = async (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const text =\n copyText ||\n highlight.content?.text ||\n (containerRef.current && firstRect\n ? extractTextFromHighlightRect(containerRef.current, firstRect)\n : \"\");\n\n await copyTextToClipboard(text);\n setIsCopied(true);\n\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n\n copyResetTimeoutRef.current = window.setTimeout(() => {\n setIsCopied(false);\n copyResetTimeoutRef.current = null;\n }, 1500);\n };\n\n return (\n <div\n className={`TextHighlight ${highlightClass} ${selectedClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) && firstRect &&\n createPortal(\n <div\n className=\"TextHighlight__toolbar-wrapper\"\n ref={toolbarWrapperRef}\n style={{\n position: \"absolute\",\n left: firstRect.left,\n top: firstRect.top,\n }}\n >\n <div\n className={`TextHighlight__toolbar ${flipToolbar ? \"TextHighlight__toolbar--below\" : \"\"} ${isSelected || isScrolledTo || isStylePanelOpen || isColorMenuOpen ? \"TextHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <>\n {/* Color as a dropdown (swatch + chevron) instead of a row of\n dots — gives each preset room for a name and a checkmark\n on the active one, and keeps the toolbar itself compact. */}\n <button\n type=\"button\"\n className=\"TextHighlight__color-trigger\"\n aria-label=\"Highlight color\"\n aria-expanded={isColorMenuOpen}\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(false);\n setIsColorMenuOpen((v) => !v);\n }}\n title=\"Highlight color\"\n >\n <span\n className=\"TextHighlight__color-trigger-dot\"\n style={{ backgroundColor: highlightColor }}\n />\n <ChevronDownIcon />\n </button>\n <div className=\"TextHighlight__toolbar-divider\" />\n </>\n )}\n {onStyleChange && (\n <button\n className=\"TextHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsColorMenuOpen(false);\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change style\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n )}\n <button\n className=\"TextHighlight__copy-button\"\n onClick={handleCopy}\n title={isCopied ? \"Copied\" : \"Copy text\"}\n type=\"button\"\n >\n {isCopied ? <DefaultCopiedIcon /> : <DefaultCopyIcon />}\n </button>\n {extraButtons}\n {onDelete && (\n <button\n className=\"TextHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Style Panel - inside wrapper */}\n {isStylePanelOpen && onStyleChange && (\n <div\n className=\"TextHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"TextHighlight__style-row\">\n <label>Style</label>\n <div className=\"TextHighlight__style-buttons\">\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"highlight\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"highlight\" })\n }\n title=\"Highlight\"\n >\n <HighlightIcon />\n </button>\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"underline\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"underline\" })\n }\n title=\"Underline\"\n >\n <UnderlineIcon />\n </button>\n <button\n type=\"button\"\n className={`TextHighlight__style-type-button ${highlightStyle === \"strikethrough\" ? \"active\" : \"\"}`}\n onClick={() =>\n onStyleChange({ highlightStyle: \"strikethrough\" })\n }\n title=\"Strikethrough\"\n >\n <StrikethroughIcon />\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Color dropdown - same slot as the style panel */}\n {isColorMenuOpen && onStyleChange && (\n <div\n className=\"TextHighlight__color-menu\"\n ref={colorMenuRef}\n onClick={(e) => e.stopPropagation()}\n >\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"TextHighlight__color-menu-item\"\n onClick={() => {\n onStyleChange({ highlightColor: c });\n setIsColorMenuOpen(false);\n }}\n >\n <span\n className=\"TextHighlight__color-menu-dot\"\n style={{ backgroundColor: c }}\n />\n <span className=\"TextHighlight__color-menu-label\">\n {COLOR_NAMES[c] || c}\n </span>\n {highlightColor === c && (\n <span className=\"TextHighlight__color-menu-check\">\n <CheckIcon />\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n\n {extraPanel}\n </div>,\n configLayer,\n )}\n\n <div\n className=\"TextHighlight__parts\"\n >\n {rects.map((rect, index) => (\n <div\n onMouseOver={onMouseOver}\n onMouseOut={onMouseOut}\n onClick={(event) => {\n // Single click selects (shows the toolbar); existing\n // click behavior (e.g. hover tips) is preserved.\n setIsSelected(true);\n onClick?.(event);\n }}\n key={index}\n style={getPartStyle(rect)}\n className={`TextHighlight__part ${getPartStyleClass()}`}\n />\n ))}\n </div>\n </div>\n );\n});\n\nTextHighlight.displayName = \"TextHighlight\";\n","import React, { ReactNode, useEffect, useRef } from \"react\";\n\n/**\n * The props type for {@link MouseMonitor}.\n *\n * @category Component Properties\n * @internal\n */\nexport interface MouseMonitorProps {\n /**\n * Callback triggered whenever the mouse moves not within the bounds of the\n * child component. This will keep triggering as long as the component is\n * rendered.\n */\n onMoveAway(): void;\n\n /**\n * X padding in pixels for the container to monitor mouse activity in.\n */\n paddingX: number;\n\n /**\n * Y padding in pixels for the container to monitor mouse activity in.\n */\n paddingY: number;\n\n /**\n * Component over which mouse activity is monitored.\n */\n children: ReactNode;\n}\n\n/**\n * A component that monitors mouse movements over a child and invisible padded area.\n *\n * @category Component\n * @internal\n */\nexport const MouseMonitor = ({\n onMoveAway,\n paddingX,\n paddingY,\n children,\n}: MouseMonitorProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = (event: MouseEvent) => {\n if (!containerRef.current) return;\n\n // If something inside (e.g. a comment textarea being edited) has focus,\n // never treat the mouse as \"away\". Content that grows/shrinks under an\n // active edit (long comment, expanding color row, etc.) reflows the\n // bounding box, and the cursor can end up outside it on the very next\n // mousemove despite the user never having moved away — that shouldn't\n // interrupt an in-progress edit.\n if (containerRef.current.contains(document.activeElement)) {\n return;\n }\n\n const { clientX, clientY } = event;\n const { left, top, width, height } =\n containerRef.current.getBoundingClientRect();\n\n const inBoundsX =\n clientX > left - paddingX && clientX < left + width + paddingX;\n const inBoundsY =\n clientY > top - paddingY && clientY < top + height + paddingY;\n\n if (!(inBoundsX && inBoundsY)) {\n onMoveAway();\n }\n };\n\n useEffect(() => {\n // TODO: Maybe optimise or throttle?\n document.addEventListener(\"mousemove\", onMouseMove);\n\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n };\n }, []);\n\n return <div ref={containerRef}>{children}</div>;\n};\n","import React, { ReactNode, useRef } from \"react\";\nimport { usePdfHighlighterContext } from \"../contexts/PdfHighlighterContext\";\nimport { Tip } from \"../types\";\nimport { MouseMonitor } from \"./MouseMonitor\";\n\n/**\n * The props type for {@link MonitoredHighlightContainer}.\n *\n * @category Component Properties\n */\nexport interface MonitoredHighlightContainerProps {\n /**\n * A callback triggered whenever the mouse hovers over a highlight.\n */\n onMouseEnter?(): void;\n\n /**\n * What tip to automatically display whenever a mouse hovers over a highlight.\n * The tip will persist even as the user puts their mouse over it and not the\n * highlight, but will disappear once it no longer hovers both.\n */\n highlightTip?: Tip;\n\n /**\n * A callback triggered whenever the mouse completely moves out from both the\n * highlight (children) and any highlightTip.\n */\n onMouseLeave?(): void;\n\n /**\n * Component to monitor mouse activity over. This should be a highlight within the {@link PdfHighlighter}.\n */\n children: ReactNode;\n}\n\n/**\n * A container for a highlight component that monitors whether a mouse is over a\n * highlight and over some secondary highlight tip. It will display the tip\n * whenever the mouse is over the highlight and it will hide the tip only when\n * the mouse has left the highlight AND the tip.\n *\n * @category Component\n */\nexport const MonitoredHighlightContainer = ({\n onMouseEnter,\n highlightTip,\n onMouseLeave,\n children,\n}: MonitoredHighlightContainerProps) => {\n const mouseInRef = useRef(false); // Whether the mouse is over the child (highlight)\n\n const { setTip, isEditingOrHighlighting, isHighlightSelected } =\n usePdfHighlighterContext();\n\n return (\n <div\n onMouseEnter={() => {\n mouseInRef.current = true;\n onMouseEnter && onMouseEnter();\n\n if (isEditingOrHighlighting()) return;\n // A selected highlight's toolbar owns the space above — no hover tip.\n if (isHighlightSelected()) return;\n\n if (highlightTip) {\n // MouseMonitor the highlightTip to prevent it from disappearing if the mouse is over it and not the highlight.\n const monitoredHighlightTip = (\n <MouseMonitor\n onMoveAway={() => {\n // The event will keep triggering if the mouse is not on the highlightTip,\n // but don't do anything if the mouse is over the highlight.\n if (mouseInRef.current) {\n return;\n }\n\n setTip(null);\n onMouseLeave && onMouseLeave();\n }}\n paddingX={60}\n paddingY={30}\n >\n {highlightTip.content}\n </MouseMonitor>\n );\n\n setTip({\n position: highlightTip.position,\n content: monitoredHighlightTip,\n });\n }\n }}\n onMouseLeave={() => {\n mouseInRef.current = false;\n\n // Trigger onMouseLeave if no highlightTip exists\n !highlightTip && onMouseLeave && onMouseLeave();\n }}\n >\n {children}\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n memo,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, Copy, Trash2 } from \"lucide-react\";\n\nimport {\n copyTextToClipboard,\n extractTextFromHighlightRect,\n} from \"../lib/copy-highlight-content\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport { Rnd } from \"react-rnd\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\n\n/**\n * Style options for area highlight appearance.\n */\nexport interface AreaHighlightStyle {\n highlightColor?: string;\n}\n\n/**\n * The props type for {@link AreaHighlight}.\n *\n * @category Component Properties\n */\nexport interface AreaHighlightProps {\n /**\n * The highlight to be rendered as an {@link AreaHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight area is either finished\n * being moved or resized.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view? By default, this will render the highlight red.\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area. This is useful for preventing the user\n * moving the highlight off the viewer/page. See [react-rnd docs](https://github.com/bokuweb/react-rnd).\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered whenever a context menu is opened on the highlight area.\n *\n * @param event - The mouse event associated with the context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called whenever the user tries to move or resize an {@link AreaHighlight}.\n */\n onEditStart?(): void;\n\n /**\n * Custom styling to be applied to the {@link AreaHighlight} component.\n */\n style?: CSSProperties;\n\n /**\n * Background color for the highlight.\n * Default: \"rgba(255, 226, 143, 1)\" (yellow)\n */\n highlightColor?: string;\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: AreaHighlightStyle): void;\n\n /**\n * Text to copy for this area highlight.\n */\n copyText?: string;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n * Default: [\"rgba(255, 226, 143, 1)\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n colorPresets?: string[];\n\n /**\n * Extra buttons rendered in the same toolbar row, after the copy button.\n * Use this to add consumer-defined actions (e.g. a comment toggle) without\n * needing a second, separate popup.\n */\n extraButtons?: ReactNode;\n\n /**\n * Extra content rendered below the toolbar row, in the same slot as the\n * built-in style panel (e.g. a comment editor opened by an extraButtons\n * toggle).\n */\n extraPanel?: ReactNode;\n}\n\n// Default icons — lucide-react, so the toolbar matches the example app's\n// icon vocabulary instead of a separate hand-drawn set.\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\nconst DefaultCopyIcon = () => <Copy width={14} height={14} />;\nconst DefaultCopiedIcon = () => <Check width={14} height={14} strokeWidth={2.5} />;\nconst ChevronDownIcon = () => <ChevronDown width={12} height={12} strokeWidth={2.5} />;\nconst CheckIcon = () => <Check width={14} height={14} strokeWidth={2.5} />;\n\n// Default color presets\nconst DEFAULT_COLOR_PRESETS = [\n \"rgba(255, 226, 143, 1)\", // Yellow (default)\n \"#ffcdd2\", // Light red\n \"#c8e6c9\", // Light green\n \"#bbdefb\", // Light blue\n \"#e1bee7\", // Light purple\n];\n\n// Display names for the default presets, used in the color dropdown. A\n// custom preset (not in this map) just falls back to showing its own value.\nconst COLOR_NAMES: Record<string, string> = {\n \"rgba(255, 226, 143, 1)\": \"Yellow\",\n \"#ffcdd2\": \"Red\",\n \"#c8e6c9\": \"Green\",\n \"#bbdefb\": \"Blue\",\n \"#e1bee7\": \"Purple\",\n};\n\n/**\n * Renders a resizeable and interactive rectangular area for a highlight.\n *\n * @category Component\n */\nexport const AreaHighlight = memo(({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n style,\n highlightColor = \"rgba(255, 226, 143, 1)\",\n onStyleChange,\n onDelete,\n deleteIcon,\n copyText,\n colorPresets = DEFAULT_COLOR_PRESETS,\n extraButtons,\n extraPanel,\n}: AreaHighlightProps) => {\n const [isColorMenuOpen, setIsColorMenuOpen] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const colorMenuRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const copyResetTimeoutRef = useRef<number | null>(null);\n\n // Deselect on click outside / Escape (selection interaction model).\n // The toolbar is portaled outside the root, so clicks inside it must\n // also count as \"inside\".\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n const insideRoot = containerRef.current?.contains(target);\n const insideToolbar = toolbarWrapperRef.current?.contains(target);\n if (!insideRoot && !insideToolbar) {\n setIsSelected(false);\n setIsColorMenuOpen(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsSelected(false);\n setIsColorMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected]);\n\n // Resolve on every commit — a run-once effect can catch the text layer\n // before pdf.js attaches it to .page, leaving configLayer null forever.\n useLayoutEffect(() => {\n if (containerRef.current) {\n const layer = findOrCreateHighlightConfigLayer(containerRef.current);\n setConfigLayer((prev) => (prev === layer ? prev : layer));\n }\n });\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n // Close color menu when clicking outside\n useEffect(() => {\n if (!isColorMenuOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n colorMenuRef.current &&\n !colorMenuRef.current.contains(e.target as Node)\n ) {\n setIsColorMenuOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isColorMenuOpen]);\n\n const highlightClass = isScrolledTo ? \"AreaHighlight--scrolledTo\" : \"\";\n const selectedClass = isSelected ? \"AreaHighlight--selected\" : \"\";\n\n // Not enough room above the box for the toolbar (e.g. the highlight sits\n // at the very top of the page) — flip it below instead of letting it\n // float up over whatever page content is above the box.\n const flipToolbar = highlight.position.boundingRect.top < 40;\n\n // Generate key based on position. This forces a remount (and a defaultpos update)\n // whenever highlight position changes (e.g., when updated, scale changes, etc.)\n // We don't use position as state because when updating Rnd this would happen and cause flickering:\n // User moves Rnd -> Rnd records new pos -> Rnd jumps back -> highlight updates -> Rnd re-renders at new pos\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n // Merge custom style with highlight color. --hl-fill-alpha (set <100% in dark\n // mode) keeps the fill translucent so underlying content stays visible while\n // the border ring stays crisp (no element opacity). Light mode = 100%.\n const mergedStyle: CSSProperties = {\n ...style,\n backgroundColor: `color-mix(in srgb, ${highlightColor} var(--hl-fill-alpha, 100%), transparent)`,\n };\n\n const handleCopy = async (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const text =\n copyText ||\n highlight.content?.text ||\n (containerRef.current\n ? extractTextFromHighlightRect(\n containerRef.current,\n highlight.position.boundingRect,\n )\n : \"\");\n\n await copyTextToClipboard(text);\n setIsCopied(true);\n\n if (copyResetTimeoutRef.current) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n\n copyResetTimeoutRef.current = window.setTimeout(() => {\n setIsCopied(false);\n copyResetTimeoutRef.current = null;\n }, 1500);\n };\n\n return (\n <div\n className={`AreaHighlight ${highlightClass} ${selectedClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) &&\n createPortal(\n <div\n className=\"AreaHighlight__toolbar-wrapper\"\n ref={toolbarWrapperRef}\n style={{\n position: \"absolute\",\n left: highlight.position.boundingRect.left,\n top: highlight.position.boundingRect.top,\n }}\n >\n <div\n className={`AreaHighlight__toolbar ${flipToolbar ? \"AreaHighlight__toolbar--below\" : \"\"} ${isSelected || isScrolledTo || isColorMenuOpen ? \"AreaHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <>\n {/* Color as a dropdown (swatch + chevron) instead of a row of\n dots — gives each preset room for a name and a checkmark\n on the active one, and keeps the toolbar itself compact. */}\n <button\n type=\"button\"\n className=\"AreaHighlight__color-trigger\"\n aria-label=\"Highlight color\"\n aria-expanded={isColorMenuOpen}\n onClick={(e) => {\n e.stopPropagation();\n setIsColorMenuOpen((v) => !v);\n }}\n title=\"Highlight color\"\n >\n <span\n className=\"AreaHighlight__color-trigger-dot\"\n style={{ backgroundColor: highlightColor }}\n />\n <ChevronDownIcon />\n </button>\n <div className=\"AreaHighlight__toolbar-divider\" />\n </>\n )}\n <button\n className=\"AreaHighlight__copy-button\"\n onClick={handleCopy}\n title={isCopied ? \"Copied\" : \"Copy text\"}\n type=\"button\"\n >\n {isCopied ? <DefaultCopiedIcon /> : <DefaultCopyIcon />}\n </button>\n {extraButtons}\n {onDelete && (\n <button\n className=\"AreaHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Color dropdown - inside wrapper */}\n {isColorMenuOpen && onStyleChange && (\n <div\n className=\"AreaHighlight__color-menu\"\n ref={colorMenuRef}\n onClick={(e) => e.stopPropagation()}\n >\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"AreaHighlight__color-menu-item\"\n onClick={() => {\n onStyleChange({ highlightColor: c });\n setIsColorMenuOpen(false);\n }}\n >\n <span\n className=\"AreaHighlight__color-menu-dot\"\n style={{ backgroundColor: c }}\n />\n <span className=\"AreaHighlight__color-menu-label\">\n {COLOR_NAMES[c] || c}\n </span>\n {highlightColor === c && (\n <span className=\"AreaHighlight__color-menu-check\">\n <CheckIcon />\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n\n {extraPanel}\n </div>,\n configLayer,\n )}\n\n <Rnd\n className=\"AreaHighlight__part\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n\n onChange && onChange(boundingRect);\n }}\n onResizeStop={(_mouseEvent, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber: getPageFromElement(ref)?.number || -1,\n };\n\n onChange && onChange(boundingRect);\n }}\n onDragStart={() => {\n setIsSelected(true);\n onEditStart?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width,\n height: highlight.position.boundingRect.height,\n }}\n key={key}\n bounds={bounds}\n // Prevevent any event clicks as clicking is already used for movement.\n // A click still selects the highlight (shows the toolbar).\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n setIsSelected(true);\n }}\n style={mergedStyle}\n />\n </div>\n );\n});\n\nAreaHighlight.displayName = \"AreaHighlight\";\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n} from \"react\";\nimport { Check, ChevronDown, Minimize2, Palette, Pencil, StickyNote, Trash2 } from \"lucide-react\";\nimport { Rnd } from \"react-rnd\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\nimport { useClearTipWhileSelected } from \"../contexts/PdfHighlighterContext\";\n\n/**\n * Style options for freetext highlight appearance.\n */\nexport interface FreetextStyle {\n color?: string;\n backgroundColor?: string;\n fontFamily?: string;\n fontSize?: string;\n}\n\n/**\n * The props type for {@link FreetextHighlight}.\n *\n * @category Component Properties\n */\nexport interface FreetextHighlightProps {\n /**\n * The highlight to be rendered as a {@link FreetextHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position changes (drag).\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * A callback triggered whenever the text content changes.\n *\n * @param text - The new text content.\n */\n onTextChange?(text: string): void;\n\n /**\n * A callback triggered whenever the style changes.\n *\n * @param style - The new style options.\n */\n onStyleChange?(style: FreetextStyle): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or text edit).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Text color.\n */\n color?: string;\n\n /**\n * Background color.\n */\n backgroundColor?: string;\n\n /**\n * Font family.\n */\n fontFamily?: string;\n\n /**\n * Font size (e.g., \"14px\").\n */\n fontSize?: string;\n\n /**\n * Custom drag icon. Receives default icon as child if not provided.\n */\n dragIcon?: ReactNode;\n\n /**\n * Custom edit icon. Receives default icon as child if not provided.\n */\n editIcon?: ReactNode;\n\n /**\n * Custom style/settings icon. Receives default icon as child if not provided.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom background color presets for the style panel.\n * Default: [\"#ffffc8\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"]\n */\n backgroundColorPresets?: string[];\n\n /**\n * Custom text color presets for the style panel.\n * Default: [\"#333333\", \"#d32f2f\", \"#1976d2\", \"#388e3c\", \"#7b1fa2\"]\n */\n textColorPresets?: string[];\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Render the note as a compact marker until opened.\n */\n compact?: boolean;\n\n /**\n * Size of the compact marker in pixels.\n */\n compactSize?: number;\n\n /**\n * Custom compact marker icon.\n */\n compactIcon?: ReactNode;\n}\n\n/**\n * Renders a draggable, editable freetext annotation.\n *\n * @category Component\n */\n// Default icons\n// (The dedicated drag handle was removed — the whole note body drags now.\n// The dragIcon prop is kept in the API for backward compatibility.)\n\n// Default icons — lucide-react, so the toolbar matches the example app's\n// icon vocabulary instead of a separate hand-drawn set.\nconst DefaultEditIcon = () => <Pencil width={14} height={14} />;\nconst DefaultStyleIcon = () => <Palette width={14} height={14} />;\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\nconst DefaultCompactIcon = () => <StickyNote width={16} height={16} />;\nconst DefaultCollapseIcon = () => <Minimize2 width={14} height={14} />;\nconst ChevronDownIcon = () => <ChevronDown width={12} height={12} strokeWidth={2.5} />;\nconst CheckIcon = () => <Check width={14} height={14} strokeWidth={2.5} />;\n\n// Default color presets\nconst DEFAULT_BACKGROUND_PRESETS = [\"transparent\", \"#ffffc8\", \"#ffcdd2\", \"#c8e6c9\", \"#bbdefb\", \"#e1bee7\"];\nconst DEFAULT_TEXT_PRESETS = [\"#333333\", \"#d32f2f\", \"#1976d2\", \"#388e3c\", \"#7b1fa2\"];\n\n// Display names for the default background presets, used in the color\n// dropdown. A custom preset (not in this map) just falls back to its value.\nconst BACKGROUND_COLOR_NAMES: Record<string, string> = {\n transparent: \"None\",\n \"#ffffc8\": \"Yellow\",\n \"#ffcdd2\": \"Red\",\n \"#c8e6c9\": \"Green\",\n \"#bbdefb\": \"Blue\",\n \"#e1bee7\": \"Purple\",\n};\n\nexport const FreetextHighlight = ({\n highlight,\n onChange,\n onTextChange,\n onStyleChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n color = \"#333333\",\n backgroundColor = \"#ffffc8\",\n fontFamily = \"inherit\",\n fontSize = \"14px\",\n dragIcon,\n editIcon,\n styleIcon,\n backgroundColorPresets = DEFAULT_BACKGROUND_PRESETS,\n textColorPresets = DEFAULT_TEXT_PRESETS,\n onDelete,\n deleteIcon,\n compact = false,\n compactSize = 32,\n compactIcon,\n}: FreetextHighlightProps) => {\n const [isEditing, setIsEditing] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n useClearTipWhileSelected(isSelected);\n const [isExpanded, setIsExpanded] = useState(!compact);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isColorMenuOpen, setIsColorMenuOpen] = useState(false);\n const [text, setText] = useState(highlight.content?.text || \"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const colorMenuRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Deselect on click outside / Escape (sticky-note interaction model).\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && !isEditing) {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected, isEditing]);\n\n // Sync text with highlight content when it changes externally\n useEffect(() => {\n setText(highlight.content?.text || \"\");\n }, [highlight.content?.text]);\n\n useEffect(() => {\n setIsExpanded(!compact);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n if (!compact) {\n setIsEditing(false);\n }\n }, [compact]);\n\n // Focus textarea when entering edit mode\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n }\n }, [isEditing]);\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (stylePanelRef.current && !stylePanelRef.current.contains(e.target as Node)) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n // Close color menu when clicking outside\n useEffect(() => {\n if (!isColorMenuOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (colorMenuRef.current && !colorMenuRef.current.contains(e.target as Node)) {\n setIsColorMenuOpen(false);\n }\n };\n\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isColorMenuOpen]);\n\n const highlightClass = isScrolledTo ? \"FreetextHighlight--scrolledTo\" : \"\";\n const editingClass = isEditing ? \"FreetextHighlight--editing\" : \"\";\n const selectedClass = isSelected ? \"FreetextHighlight--selected\" : \"\";\n const compactClass = compact ? \"FreetextHighlight--compact\" : \"\";\n const isCompactCollapsed = compact && !isExpanded && !isEditing && !isStylePanelOpen && !isColorMenuOpen;\n const collapsedClass = isCompactCollapsed ? \"FreetextHighlight--collapsed\" : \"\";\n\n // Not enough room above the box for the toolbar (e.g. the note sits at\n // the very top of the page) — flip it below instead of letting it float\n // up over whatever page content is above the box.\n const flipToolbar = highlight.position.boundingRect.top < 40;\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}${isCompactCollapsed ? \"collapsed\" : \"expanded\"}`;\n\n // Single click selects (shows the toolbar); double-click edits in place.\n const handleNoteClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isEditing) setIsSelected(true);\n };\n\n const enterEditMode = (e?: React.MouseEvent) => {\n e?.stopPropagation();\n if (!isEditing) {\n setIsExpanded(true);\n setIsSelected(true);\n setIsEditing(true);\n onEditStart?.();\n }\n };\n\n const handleTextBlur = () => {\n if (isEditing) {\n setIsEditing(false);\n onTextChange?.(text);\n onEditEnd?.();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setText(highlight.content?.text || \"\");\n setIsEditing(false);\n onEditEnd?.();\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n setIsEditing(false);\n onTextChange?.(text);\n onEditEnd?.();\n }\n };\n\n const containerStyle: CSSProperties = {\n backgroundColor,\n color,\n fontFamily,\n fontSize,\n ...style,\n };\n\n return (\n <div\n ref={rootRef}\n className={`FreetextHighlight ${highlightClass} ${editingClass} ${selectedClass} ${compactClass} ${collapsedClass}`}\n onContextMenu={onContextMenu}\n >\n <Rnd\n className=\"FreetextHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n }}\n onDragStart={() => {\n if (!isEditing) {\n setIsSelected(true);\n onEditStart?.();\n }\n }}\n disableDragging={isEditing}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: isCompactCollapsed ? compactSize : highlight.position.boundingRect.width || 150,\n height: isCompactCollapsed ? compactSize : highlight.position.boundingRect.height || 80,\n }}\n minWidth={isCompactCollapsed ? compactSize : 100}\n minHeight={isCompactCollapsed ? compactSize : 50}\n key={key}\n bounds={bounds}\n enableResizing={\n isCompactCollapsed\n ? false\n : {\n top: false,\n right: true,\n bottom: true,\n left: false,\n topRight: false,\n bottomRight: true,\n bottomLeft: false,\n topLeft: false,\n }\n }\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n }}\n onResizeStart={() => {\n if (!isEditing) {\n onEditStart?.();\n }\n }}\n // The whole note body drags (sticky-note model); only interactive\n // controls and the edit textarea are excluded.\n cancel=\".FreetextHighlight__input, .FreetextHighlight__toolbar, .FreetextHighlight__style-panel, .FreetextHighlight__color-menu, .FreetextHighlight__compact-button\"\n >\n <div\n className=\"FreetextHighlight__container\"\n style={containerStyle}\n onClick={handleNoteClick}\n onDoubleClick={enterEditMode}\n >\n {isCompactCollapsed ? (\n <button\n className=\"FreetextHighlight__compact-button\"\n type=\"button\"\n title={text || \"Open note\"}\n onClick={(event) => {\n event.stopPropagation();\n setIsExpanded(true);\n }}\n >\n {compactIcon || <DefaultCompactIcon />}\n </button>\n ) : (\n <>\n <div\n className={`FreetextHighlight__toolbar ${flipToolbar ? \"FreetextHighlight__toolbar--below\" : \"\"}`}\n >\n {/* Color as a dropdown (swatch + chevron) instead of a row of\n dots — gives each preset room for a name and a checkmark on\n the active one, and keeps the toolbar itself compact. */}\n <button\n type=\"button\"\n className=\"FreetextHighlight__color-trigger\"\n aria-label=\"Background color\"\n aria-expanded={isColorMenuOpen}\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(false);\n setIsColorMenuOpen((v) => !v);\n }}\n title=\"Background color\"\n >\n <span\n className=\"FreetextHighlight__color-trigger-dot\"\n style={{\n backgroundColor:\n backgroundColor === \"transparent\" ? undefined : backgroundColor,\n }}\n />\n <ChevronDownIcon />\n </button>\n <div className=\"FreetextHighlight__toolbar-divider\" />\n <button\n className=\"FreetextHighlight__edit-button\"\n onClick={enterEditMode}\n title=\"Edit text (or double-click the note)\"\n type=\"button\"\n >\n {editIcon || <DefaultEditIcon />}\n </button>\n <button\n className=\"FreetextHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsColorMenuOpen(false);\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Change style\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n {compact && (\n <button\n className=\"FreetextHighlight__collapse-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }}\n title=\"Collapse note\"\n type=\"button\"\n >\n <DefaultCollapseIcon />\n </button>\n )}\n {onDelete && (\n <button\n className=\"FreetextHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Color dropdown - own slot, same as the style panel */}\n {isColorMenuOpen && (\n <div\n className={`FreetextHighlight__color-menu ${flipToolbar ? \"FreetextHighlight__color-menu--below-toolbar\" : \"\"}`}\n ref={colorMenuRef}\n onClick={(e) => e.stopPropagation()}\n >\n {backgroundColorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"FreetextHighlight__color-menu-item\"\n onClick={() => {\n onStyleChange?.({ backgroundColor: c });\n setIsColorMenuOpen(false);\n }}\n >\n <span\n className={`FreetextHighlight__color-menu-dot ${c === \"transparent\" ? \"FreetextHighlight__color-menu-dot--transparent\" : \"\"}`}\n style={c !== \"transparent\" ? { backgroundColor: c } : undefined}\n />\n <span className=\"FreetextHighlight__color-menu-label\">\n {BACKGROUND_COLOR_NAMES[c] || c}\n </span>\n {backgroundColor === c && (\n <span className=\"FreetextHighlight__color-menu-check\">\n <CheckIcon />\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n\n {isStylePanelOpen && (\n <div\n className={`FreetextHighlight__style-panel ${flipToolbar ? \"FreetextHighlight__style-panel--below-toolbar\" : \"\"}`}\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"FreetextHighlight__style-row\">\n <label\n\n >Text Color</label>\n <div className=\"FreetextHighlight__color-options\">\n <div className=\"FreetextHighlight__color-presets\">\n {textColorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`FreetextHighlight__color-preset ${color === c ? \"active\" : \"\"}`}\n style={{ backgroundColor: c }}\n onClick={() => onStyleChange?.({ color: c })}\n title={c}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={color}\n onChange={(e) => {\n onStyleChange?.({ color: e.target.value });\n }}\n />\n </div>\n </div>\n <div className=\"FreetextHighlight__style-row\">\n <label>Font Size</label>\n <select\n value={fontSize}\n onChange={(e) => {\n onStyleChange?.({ fontSize: e.target.value });\n }}\n >\n <option value=\"10px\">10px</option>\n <option value=\"12px\">12px</option>\n <option value=\"14px\">14px</option>\n <option value=\"16px\">16px</option>\n <option value=\"18px\">18px</option>\n <option value=\"20px\">20px</option>\n <option value=\"24px\">24px</option>\n </select>\n </div>\n <div className=\"FreetextHighlight__style-row\">\n <label>Font</label>\n <select\n value={fontFamily}\n onChange={(e) => {\n onStyleChange?.({ fontFamily: e.target.value });\n }}\n >\n <option value=\"inherit\">Default</option>\n <option value=\"Arial, sans-serif\">Arial</option>\n <option value=\"Georgia, serif\">Georgia</option>\n <option value=\"'Courier New', monospace\">Courier</option>\n <option value=\"'Times New Roman', serif\">Times</option>\n </select>\n </div>\n </div>\n )}\n <div className=\"FreetextHighlight__content\">\n {isEditing ? (\n <textarea\n ref={textareaRef}\n className=\"FreetextHighlight__input\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onBlur={handleTextBlur}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n />\n ) : (\n <div className=\"FreetextHighlight__text\">\n {text || \"New note\"}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n} from \"react\";\nimport { RotateCcw, RotateCw, Trash2 } from \"lucide-react\";\nimport { Rnd } from \"react-rnd\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ViewportHighlight } from \"../types\";\nimport { useClearTipWhileSelected } from \"../contexts/PdfHighlighterContext\";\n\n/**\n * The props type for {@link ImageHighlight}.\n *\n * @category Component Properties\n */\nexport interface ImageHighlightProps {\n /**\n * The highlight to be rendered as an {@link ImageHighlight}.\n * The highlight.content.image should contain the image data URL.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Custom drag icon. Replaces the default 6-dot grid icon.\n */\n dragIcon?: ReactNode;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Callback triggered when the image is rotated 90°. Receives the\n * re-rendered PNG data URL (rotated, dimensions swapped to match).\n * Pair with `onChange` to persist the swapped bounding rect this\n * component already computes and passes to it.\n */\n onImageChange?(newImage: string): void;\n}\n\n// (The dedicated drag handle was removed — the whole image body drags now.\n// The dragIcon prop is kept in the API for backward compatibility.)\n\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\n\n/**\n * Rotate a raster image 90° by redrawing it onto a canvas with swapped\n * dimensions — bakes the rotation into new pixels (like DrawingHighlight\n * bakes stroke edits into a new PNG) instead of a CSS transform, so the\n * result behaves like any other stored image (crops, exports, etc. all\n * just work on it).\n */\nconst rotateImageDataUrl = (\n dataUrl: string,\n width: number,\n height: number,\n clockwise: boolean,\n): Promise<string> =>\n new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = height;\n canvas.height = width;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"Canvas 2D context unavailable\"));\n return;\n }\n ctx.translate(height / 2, width / 2);\n ctx.rotate(((clockwise ? 90 : -90) * Math.PI) / 180);\n ctx.drawImage(img, -width / 2, -height / 2, width, height);\n resolve(canvas.toDataURL(\"image/png\"));\n };\n img.onerror = () => reject(new Error(\"Failed to load image for rotation\"));\n img.src = dataUrl;\n });\n\n/**\n * Renders a draggable, resizable image/signature annotation.\n *\n * @category Component\n */\nexport const ImageHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n dragIcon,\n onDelete,\n deleteIcon,\n onImageChange,\n}: ImageHighlightProps) => {\n const [isSelected, setIsSelected] = useState(false);\n useClearTipWhileSelected(isSelected);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const highlightClass = isScrolledTo ? \"ImageHighlight--scrolledTo\" : \"\";\n const selectedClass = isSelected ? \"ImageHighlight--selected\" : \"\";\n\n // Deselect on click outside / Escape (selection interaction model).\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setIsSelected(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsSelected(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected]);\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n const imageUrl = highlight.content?.image;\n\n // Not enough room above the box for the toolbar (e.g. the image sits at\n // the very top of the page) — flip it below instead of letting it float\n // up over whatever page content is above the box.\n const flipToolbar = highlight.position.boundingRect.top < 40;\n\n // Rotate 90° at a time: re-render the raster with swapped dimensions and\n // swap the bounding rect to match, keeping the box centered in place.\n const handleRotate = async (clockwise: boolean) => {\n if (!imageUrl) return;\n const { width, height, left, top, pageNumber } =\n highlight.position.boundingRect;\n const newImage = await rotateImageDataUrl(imageUrl, width, height, clockwise);\n onImageChange?.(newImage);\n const centerX = left + width / 2;\n const centerY = top + height / 2;\n onChange?.({\n left: centerX - height / 2,\n top: centerY - width / 2,\n width: height,\n height: width,\n pageNumber,\n });\n };\n\n return (\n <div\n className={`ImageHighlight ${highlightClass} ${selectedClass}`}\n onContextMenu={onContextMenu}\n ref={rootRef}\n >\n <Rnd\n className=\"ImageHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={() => {\n setIsSelected(true);\n onEditStart?.();\n }}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 150,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={50}\n minHeight={50}\n key={key}\n bounds={bounds}\n lockAspectRatio={true}\n // The whole image body drags; only the toolbar controls are excluded.\n cancel=\".ImageHighlight__toolbar\"\n // A click still selects the highlight (shows the toolbar).\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n setIsSelected(true);\n }}\n style={style}\n >\n <div className=\"ImageHighlight__container\">\n {(onDelete || onImageChange) && (\n <div\n className={`ImageHighlight__toolbar ${flipToolbar ? \"ImageHighlight__toolbar--below\" : \"\"}`}\n >\n {onImageChange && imageUrl && (\n <>\n <button\n className=\"ImageHighlight__rotate-button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRotate(false);\n }}\n title=\"Rotate left\"\n type=\"button\"\n >\n <RotateCcw width={14} height={14} />\n </button>\n <button\n className=\"ImageHighlight__rotate-button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRotate(true);\n }}\n title=\"Rotate right\"\n type=\"button\"\n >\n <RotateCw width={14} height={14} />\n </button>\n <div className=\"ImageHighlight__toolbar-divider\" />\n </>\n )}\n {onDelete && (\n <button\n className=\"ImageHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n )}\n <div className=\"ImageHighlight__content\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt=\"Highlight\"\n className=\"ImageHighlight__image\"\n draggable={false}\n />\n ) : (\n <div className=\"ImageHighlight__placeholder\">No image</div>\n )}\n </div>\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, { useRef, useEffect, useCallback } from \"react\";\n\n/**\n * The props type for {@link SignaturePad}.\n *\n * @category Component Properties\n */\nexport interface SignaturePadProps {\n /**\n * Whether the signature pad modal is open.\n */\n isOpen: boolean;\n\n /**\n * Callback when signature is completed.\n *\n * @param dataUrl - The signature as a PNG data URL.\n */\n onComplete: (dataUrl: string) => void;\n\n /**\n * Callback when the modal is closed/cancelled.\n */\n onClose: () => void;\n\n /**\n * Canvas width in pixels.\n * @default 400\n */\n width?: number;\n\n /**\n * Canvas height in pixels.\n * @default 200\n */\n height?: number;\n}\n\n/**\n * A modal component with a canvas for drawing signatures.\n * Supports both mouse and touch input.\n *\n * @category Component\n */\nexport const SignaturePad = ({\n isOpen,\n onComplete,\n onClose,\n width = 400,\n height = 200,\n}: SignaturePadProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const isDrawingRef = useRef(false);\n const lastPosRef = useRef({ x: 0, y: 0 });\n\n // Initialize canvas context\n useEffect(() => {\n if (!isOpen || !canvasRef.current) return;\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Set up drawing style\n ctx.strokeStyle = \"#000000\";\n ctx.lineWidth = 2;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n // Clear canvas\n ctx.clearRect(0, 0, width, height);\n }, [isOpen, width, height]);\n\n const getPosition = useCallback(\n (e: MouseEvent | TouchEvent) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n\n const rect = canvas.getBoundingClientRect();\n let clientX: number;\n let clientY: number;\n\n if (\"touches\" in e) {\n clientX = e.touches[0].clientX;\n clientY = e.touches[0].clientY;\n } else {\n clientX = e.clientX;\n clientY = e.clientY;\n }\n\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n },\n []\n );\n\n const startDrawing = useCallback(\n (e: MouseEvent | TouchEvent) => {\n e.preventDefault();\n isDrawingRef.current = true;\n lastPosRef.current = getPosition(e);\n },\n [getPosition]\n );\n\n const draw = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (!isDrawingRef.current) return;\n e.preventDefault();\n\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n\n const currentPos = getPosition(e);\n\n ctx.beginPath();\n ctx.moveTo(lastPosRef.current.x, lastPosRef.current.y);\n ctx.lineTo(currentPos.x, currentPos.y);\n ctx.stroke();\n\n lastPosRef.current = currentPos;\n },\n [getPosition]\n );\n\n const stopDrawing = useCallback(() => {\n isDrawingRef.current = false;\n }, []);\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen) return;\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n // Mouse events\n const handleMouseDown = (e: MouseEvent) => startDrawing(e);\n const handleMouseMove = (e: MouseEvent) => draw(e);\n const handleMouseUp = () => stopDrawing();\n const handleMouseLeave = () => stopDrawing();\n\n // Touch events\n const handleTouchStart = (e: TouchEvent) => startDrawing(e);\n const handleTouchMove = (e: TouchEvent) => draw(e);\n const handleTouchEnd = () => stopDrawing();\n\n canvas.addEventListener(\"mousedown\", handleMouseDown);\n canvas.addEventListener(\"mousemove\", handleMouseMove);\n canvas.addEventListener(\"mouseup\", handleMouseUp);\n canvas.addEventListener(\"mouseleave\", handleMouseLeave);\n canvas.addEventListener(\"touchstart\", handleTouchStart, { passive: false });\n canvas.addEventListener(\"touchmove\", handleTouchMove, { passive: false });\n canvas.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n canvas.removeEventListener(\"mousedown\", handleMouseDown);\n canvas.removeEventListener(\"mousemove\", handleMouseMove);\n canvas.removeEventListener(\"mouseup\", handleMouseUp);\n canvas.removeEventListener(\"mouseleave\", handleMouseLeave);\n canvas.removeEventListener(\"touchstart\", handleTouchStart);\n canvas.removeEventListener(\"touchmove\", handleTouchMove);\n canvas.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [isOpen, startDrawing, draw, stopDrawing]);\n\n const handleClear = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx || !canvas) return;\n\n ctx.clearRect(0, 0, width, height);\n };\n\n const handleDone = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const dataUrl = canvas.toDataURL(\"image/png\");\n onComplete(dataUrl);\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n // Close if clicking the overlay background\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n // Close on Escape while open.\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"SignaturePad__overlay\" onClick={handleOverlayClick}>\n <div\n className=\"SignaturePad__modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"signaturepad-title\"\n >\n <div className=\"SignaturePad__header\">\n <div>\n <h3 id=\"signaturepad-title\" className=\"SignaturePad__title\">\n Add your signature\n </h3>\n <p className=\"SignaturePad__subtitle\">\n Draw with your mouse or finger\n </p>\n </div>\n <button\n type=\"button\"\n className=\"SignaturePad__close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"SignaturePad__canvas-wrap\">\n <canvas\n ref={canvasRef}\n className=\"SignaturePad__canvas\"\n width={width}\n height={height}\n />\n <div className=\"SignaturePad__baseline\" aria-hidden=\"true\">\n <span className=\"SignaturePad__baseline-x\">✕</span>\n </div>\n </div>\n\n <div className=\"SignaturePad__buttons\">\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--clear\"\n onClick={handleClear}\n >\n Clear\n </button>\n <div className=\"SignaturePad__buttons-right\">\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--cancel\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"SignaturePad__button SignaturePad__button--done\"\n onClick={handleDone}\n >\n Add signature\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React, { CSSProperties, MouseEvent, ReactNode, useState, useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, Pencil, RotateCcw, RotateCw, Trash2 } from \"lucide-react\";\nimport { Rnd } from \"react-rnd\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { DrawingStroke, LTWHP, ViewportHighlight } from \"../types\";\nimport { useClearTipWhileSelected } from \"../contexts/PdfHighlighterContext\";\n\n// Drawing style presets (same as toolbar)\nconst DRAWING_COLORS = [\"#000000\", \"#FF0000\", \"#0000FF\", \"#00FF00\", \"#FFFF00\"];\nconst STROKE_WIDTHS = [\n { label: \"Thin\", value: 1 },\n { label: \"Medium\", value: 3 },\n { label: \"Thick\", value: 5 },\n];\n\n// Display names for the stroke color presets, used in the color dropdown.\nconst COLOR_NAMES: Record<string, string> = {\n \"#000000\": \"Black\",\n \"#FF0000\": \"Red\",\n \"#0000FF\": \"Blue\",\n \"#00FF00\": \"Green\",\n \"#FFFF00\": \"Yellow\",\n};\n\n/**\n * The props type for {@link DrawingHighlight}.\n *\n * @category Component Properties\n */\nexport interface DrawingHighlightProps {\n /**\n * The highlight to be rendered as a {@link DrawingHighlight}.\n * The highlight.content.image should contain the drawing as a PNG data URL.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * Custom drag icon. Replaces the default 6-dot grid icon.\n */\n dragIcon?: ReactNode;\n\n /**\n * Callback when drawing style changes (color or stroke width).\n * The newImage is the re-rendered PNG data URL with updated styles.\n * The newStrokes contain the updated stroke data.\n */\n onStyleChange?(newImage: string, newStrokes: DrawingStroke[]): void;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n}\n\n// (The dedicated drag handle was removed — the whole drawing body drags now.\n// The dragIcon prop is kept in the API for backward compatibility.)\n\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\n\n/**\n * Re-render strokes to a canvas and return as PNG data URL.\n */\nconst renderStrokesToImage = (\n strokes: DrawingStroke[],\n width: number,\n height: number\n): string => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) return \"\";\n\n strokes.forEach((stroke) => {\n if (stroke.points.length < 2) return;\n\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n stroke.points.slice(1).forEach((point) => {\n ctx.lineTo(point.x, point.y);\n });\n ctx.stroke();\n });\n\n return canvas.toDataURL(\"image/png\");\n};\n\n/**\n * Renders a draggable, resizable freehand drawing annotation.\n * Drawings are stored as PNG images with transparent backgrounds.\n *\n * @category Component\n */\nexport const DrawingHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n dragIcon,\n onStyleChange,\n onDelete,\n deleteIcon,\n}: DrawingHighlightProps) => {\n const [showStyleControls, setShowStyleControls] = useState(false);\n const [isColorMenuOpen, setIsColorMenuOpen] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n useClearTipWhileSelected(isSelected);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const styleControlsRef = useRef<HTMLDivElement>(null);\n const colorMenuRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n\n const highlightClass = isScrolledTo ? \"DrawingHighlight--scrolledTo\" : \"\";\n const selectedClass = isSelected ? \"DrawingHighlight--selected\" : \"\";\n\n // Deselect on click outside / Escape (selection interaction model).\n // The toolbar is portaled outside the root, so clicks inside it must\n // also count as \"inside\".\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n const insideRoot = containerRef.current?.contains(target);\n const insideToolbar = toolbarWrapperRef.current?.contains(target);\n if (!insideRoot && !insideToolbar) {\n setIsSelected(false);\n setShowStyleControls(false);\n setIsColorMenuOpen(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsSelected(false);\n setShowStyleControls(false);\n setIsColorMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected]);\n\n // Resolve on every commit — a run-once effect can catch the text layer\n // before pdf.js attaches it to .page, leaving configLayer null forever.\n useLayoutEffect(() => {\n if (containerRef.current) {\n const layer = findOrCreateHighlightConfigLayer(containerRef.current);\n setConfigLayer((prev) => (prev === layer ? prev : layer));\n }\n });\n\n // Close style controls when clicking outside\n useEffect(() => {\n if (!showStyleControls) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (styleControlsRef.current && !styleControlsRef.current.contains(e.target as Node)) {\n setShowStyleControls(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [showStyleControls]);\n\n // Close color menu when clicking outside\n useEffect(() => {\n if (!isColorMenuOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (colorMenuRef.current && !colorMenuRef.current.contains(e.target as Node)) {\n setIsColorMenuOpen(false);\n }\n };\n\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isColorMenuOpen]);\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n const imageUrl = highlight.content?.image;\n const strokes = highlight.content?.strokes;\n\n // Apply new color to all strokes\n const handleColorChange = useCallback((newColor: string) => {\n if (!strokes || !onStyleChange) return;\n\n console.log(\"DrawingHighlight: Changing color to\", newColor);\n const newStrokes = strokes.map((stroke) => ({\n ...stroke,\n color: newColor,\n }));\n\n const newImage = renderStrokesToImage(\n newStrokes,\n highlight.position.boundingRect.width,\n highlight.position.boundingRect.height\n );\n\n onStyleChange(newImage, newStrokes);\n }, [strokes, onStyleChange, highlight.position.boundingRect.width, highlight.position.boundingRect.height]);\n\n // Apply new width to all strokes\n const handleWidthChange = useCallback((newWidth: number) => {\n if (!strokes || !onStyleChange) return;\n\n console.log(\"DrawingHighlight: Changing width to\", newWidth);\n const newStrokes = strokes.map((stroke) => ({\n ...stroke,\n width: newWidth,\n }));\n\n const newImage = renderStrokesToImage(\n newStrokes,\n highlight.position.boundingRect.width,\n highlight.position.boundingRect.height\n );\n\n onStyleChange(newImage, newStrokes);\n }, [strokes, onStyleChange, highlight.position.boundingRect.width, highlight.position.boundingRect.height]);\n\n // Get current color from first stroke (for showing active state)\n const currentColor = strokes?.[0]?.color || \"#000000\";\n const currentWidth = strokes?.[0]?.width || 3;\n\n // Rotate 90° at a time: rotate every stroke point around the canvas\n // center, re-render to a new canvas with swapped dimensions (same\n // bake-into-a-new-PNG approach as color/width changes), and swap the\n // bounding rect to match, keeping the box centered in place.\n const handleRotate = useCallback((clockwise: boolean) => {\n if (!strokes || !onStyleChange) return;\n\n const { width, height, left, top, pageNumber } =\n highlight.position.boundingRect;\n\n const newStrokes = strokes.map((stroke) => ({\n ...stroke,\n points: stroke.points.map((p) =>\n clockwise\n ? { x: height - p.y, y: p.x }\n : { x: p.y, y: width - p.x },\n ),\n }));\n\n const newImage = renderStrokesToImage(newStrokes, height, width);\n onStyleChange(newImage, newStrokes);\n\n const centerX = left + width / 2;\n const centerY = top + height / 2;\n onChange?.({\n left: centerX - height / 2,\n top: centerY - width / 2,\n width: height,\n height: width,\n pageNumber,\n });\n }, [strokes, onStyleChange, onChange, highlight.position.boundingRect]);\n\n // Not enough room above the box for the toolbar (e.g. the drawing sits at\n // the very top of the page) — flip it below instead of letting it float\n // up over whatever page content is above the box.\n const flipToolbar = highlight.position.boundingRect.top < 40;\n\n return (\n <div\n className={`DrawingHighlight ${highlightClass} ${selectedClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer &&\n createPortal(\n <div\n className=\"DrawingHighlight__toolbar-wrapper\"\n ref={toolbarWrapperRef}\n style={{\n position: \"absolute\",\n left: highlight.position.boundingRect.left,\n top: highlight.position.boundingRect.top,\n }}\n >\n <div\n className={`DrawingHighlight__toolbar DrawingHighlight__toolbar--floating ${flipToolbar ? \"DrawingHighlight__toolbar--below\" : \"\"} ${isSelected || isScrolledTo || showStyleControls ? \"DrawingHighlight__toolbar--visible\" : \"\"}`}\n >\n {strokes && strokes.length > 0 && onStyleChange && (\n <>\n {/* Color as a dropdown (swatch + chevron) instead of a row of\n dots — gives each preset room for a name and a checkmark\n on the active one, and keeps the toolbar itself compact. */}\n <button\n type=\"button\"\n className=\"DrawingHighlight__color-trigger\"\n aria-label=\"Stroke color\"\n aria-expanded={isColorMenuOpen}\n onClick={(e) => {\n e.stopPropagation();\n setShowStyleControls(false);\n setIsColorMenuOpen((v) => !v);\n }}\n title=\"Stroke color\"\n >\n <span\n className=\"DrawingHighlight__color-trigger-dot\"\n style={{ backgroundColor: currentColor }}\n />\n <ChevronDown width={12} height={12} strokeWidth={2.5} />\n </button>\n <div className=\"DrawingHighlight__toolbar-divider\" />\n </>\n )}\n {strokes && strokes.length > 0 && onStyleChange && (\n <button\n type=\"button\"\n className=\"DrawingHighlight__style-button\"\n title=\"Stroke width\"\n onClick={(e) => {\n e.stopPropagation();\n setIsColorMenuOpen(false);\n setShowStyleControls(!showStyleControls);\n }}\n >\n <Pencil width={14} height={14} />\n </button>\n )}\n {strokes && strokes.length > 0 && onStyleChange && (\n <>\n <button\n type=\"button\"\n className=\"DrawingHighlight__rotate-button\"\n title=\"Rotate left\"\n onClick={(e) => {\n e.stopPropagation();\n handleRotate(false);\n }}\n >\n <RotateCcw width={14} height={14} />\n </button>\n <button\n type=\"button\"\n className=\"DrawingHighlight__rotate-button\"\n title=\"Rotate right\"\n onClick={(e) => {\n e.stopPropagation();\n handleRotate(true);\n }}\n >\n <RotateCw width={14} height={14} />\n </button>\n </>\n )}\n {onDelete && (\n <button\n className=\"DrawingHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n {showStyleControls && strokes && strokes.length > 0 && onStyleChange && (\n <div className=\"DrawingHighlight__style-controls\" ref={styleControlsRef}>\n <div className=\"DrawingHighlight__width-picker\">\n {STROKE_WIDTHS.map((w) => (\n <button\n key={w.value}\n type=\"button\"\n className={`DrawingHighlight__width-button ${currentWidth === w.value ? 'active' : ''}`}\n onClick={(e) => {\n e.stopPropagation();\n handleWidthChange(w.value);\n }}\n title={w.label}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Color dropdown - same slot as the style controls */}\n {isColorMenuOpen && strokes && strokes.length > 0 && onStyleChange && (\n <div className=\"DrawingHighlight__color-menu\" ref={colorMenuRef}>\n {DRAWING_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className=\"DrawingHighlight__color-menu-item\"\n onClick={(e) => {\n e.stopPropagation();\n handleColorChange(color);\n setIsColorMenuOpen(false);\n }}\n >\n <span\n className=\"DrawingHighlight__color-menu-dot\"\n style={{ backgroundColor: color }}\n />\n <span className=\"DrawingHighlight__color-menu-label\">\n {COLOR_NAMES[color] || color}\n </span>\n {currentColor === color && (\n <span className=\"DrawingHighlight__color-menu-check\">\n <Check width={14} height={14} strokeWidth={2.5} />\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>,\n configLayer,\n )}\n <Rnd\n className=\"DrawingHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={() => {\n setIsSelected(true);\n onEditStart?.();\n }}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 150,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={30}\n minHeight={30}\n key={key}\n bounds={bounds}\n // No aspect ratio lock for drawings - allow free resizing\n lockAspectRatio={false}\n // A click still selects the highlight (shows the toolbar).\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n setIsSelected(true);\n }}\n style={style}\n >\n <div\n className=\"DrawingHighlight__container\"\n >\n <div className=\"DrawingHighlight__content\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt=\"Drawing\"\n className=\"DrawingHighlight__image\"\n draggable={false}\n />\n ) : (\n <div className=\"DrawingHighlight__placeholder\">No drawing</div>\n )}\n </div>\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, {\n CSSProperties,\n MouseEvent,\n ReactNode,\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, Palette, Trash2 } from \"lucide-react\";\nimport { Rnd } from \"react-rnd\";\nimport { findOrCreateHighlightConfigLayer } from \"../lib/highlight-config-layer\";\nimport { getPageFromElement } from \"../lib/pdfjs-dom\";\nimport type { LTWHP, ShapeType, ViewportHighlight } from \"../types\";\nimport { useClearTipWhileSelected } from \"../contexts/PdfHighlighterContext\";\n\n/**\n * Style options for shape highlight appearance.\n */\nexport interface ShapeStyle {\n strokeColor?: string;\n strokeWidth?: number;\n}\n\n/**\n * The props type for {@link ShapeHighlight}.\n *\n * @category Component Properties\n */\nexport interface ShapeHighlightProps {\n /**\n * The highlight to be rendered as a {@link ShapeHighlight}.\n */\n highlight: ViewportHighlight;\n\n /**\n * A callback triggered whenever the highlight position or size changes.\n *\n * @param rect - The updated highlight area.\n */\n onChange?(rect: LTWHP): void;\n\n /**\n * Has the highlight been auto-scrolled into view?\n */\n isScrolledTo?: boolean;\n\n /**\n * react-rnd bounds on the highlight area.\n */\n bounds?: string | Element;\n\n /**\n * A callback triggered on context menu.\n */\n onContextMenu?(event: MouseEvent<HTMLDivElement>): void;\n\n /**\n * Event called when editing begins (drag or resize).\n */\n onEditStart?(): void;\n\n /**\n * Event called when editing ends.\n */\n onEditEnd?(): void;\n\n /**\n * Custom styling for the container.\n */\n style?: CSSProperties;\n\n /**\n * The type of shape to render.\n * @default \"rectangle\"\n */\n shapeType?: ShapeType;\n\n /**\n * Stroke color for the shape.\n * @default \"#000000\"\n */\n strokeColor?: string;\n\n /**\n * Stroke width for the shape.\n * @default 2\n */\n strokeWidth?: number;\n\n /**\n * Callback triggered when the style changes.\n */\n onStyleChange?(style: ShapeStyle): void;\n\n /**\n * Callback triggered when the delete button is clicked.\n */\n onDelete?(): void;\n\n /**\n * Custom style icon. Replaces the default palette icon.\n */\n styleIcon?: ReactNode;\n\n /**\n * Custom delete icon. Replaces the default trash icon.\n */\n deleteIcon?: ReactNode;\n\n /**\n * Custom color presets for the style panel.\n */\n colorPresets?: string[];\n\n /**\n * For arrows: start point as percentage of bounding box (0-1).\n */\n startPoint?: { x: number; y: number };\n\n /**\n * For arrows: end point as percentage of bounding box (0-1).\n */\n endPoint?: { x: number; y: number };\n}\n\n// Default icons — lucide-react, so the toolbar matches the example app's\n// icon vocabulary instead of a separate hand-drawn set.\nconst DefaultStyleIcon = () => <Palette width={14} height={14} />;\nconst DefaultDeleteIcon = () => <Trash2 width={14} height={14} />;\n\n// Default color presets for shapes\nconst DEFAULT_COLOR_PRESETS = [\n \"#000000\", // Black\n \"#FF0000\", // Red\n \"#0000FF\", // Blue\n \"#00AA00\", // Green\n \"#FF6600\", // Orange\n];\n\n// Display names for the default presets, used in the color dropdown.\nconst COLOR_NAMES: Record<string, string> = {\n \"#000000\": \"Black\",\n \"#FF0000\": \"Red\",\n \"#0000FF\": \"Blue\",\n \"#00AA00\": \"Green\",\n \"#FF6600\": \"Orange\",\n};\n\n// Stroke width options\nconst STROKE_WIDTHS = [\n { label: \"Thin\", value: 1 },\n { label: \"Medium\", value: 2 },\n { label: \"Thick\", value: 4 },\n];\n\n/**\n * Renders a draggable, resizable shape annotation.\n * Supports rectangle, circle/ellipse, and arrow shapes.\n *\n * @category Component\n */\nexport const ShapeHighlight = ({\n highlight,\n onChange,\n isScrolledTo,\n bounds,\n onContextMenu,\n onEditStart,\n onEditEnd,\n style,\n shapeType = \"rectangle\",\n strokeColor = \"#000000\",\n strokeWidth = 2,\n onStyleChange,\n onDelete,\n styleIcon,\n deleteIcon,\n colorPresets = DEFAULT_COLOR_PRESETS,\n startPoint,\n endPoint,\n}: ShapeHighlightProps) => {\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [isColorMenuOpen, setIsColorMenuOpen] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n useClearTipWhileSelected(isSelected);\n const [configLayer, setConfigLayer] = useState<HTMLElement | null>(null);\n const stylePanelRef = useRef<HTMLDivElement>(null);\n const colorMenuRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n\n // Deselect on click outside / Escape (selection interaction model).\n // The toolbar is portaled outside the root, so clicks inside it must\n // also count as \"inside\".\n useEffect(() => {\n if (!isSelected) return;\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n const insideRoot = containerRef.current?.contains(target);\n const insideToolbar = toolbarWrapperRef.current?.contains(target);\n if (!insideRoot && !insideToolbar) {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n const handleKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsSelected(false);\n setIsStylePanelOpen(false);\n setIsColorMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [isSelected]);\n\n // Resolve on every commit — a run-once effect can catch the text layer\n // before pdf.js attaches it to .page, leaving configLayer null forever.\n useLayoutEffect(() => {\n if (containerRef.current) {\n const layer = findOrCreateHighlightConfigLayer(containerRef.current);\n setConfigLayer((prev) => (prev === layer ? prev : layer));\n }\n });\n\n // Close style panel when clicking outside\n useEffect(() => {\n if (!isStylePanelOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n stylePanelRef.current &&\n !stylePanelRef.current.contains(e.target as Node)\n ) {\n setIsStylePanelOpen(false);\n }\n };\n\n // Delay adding listener to avoid immediate close\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isStylePanelOpen]);\n\n // Close color menu when clicking outside\n useEffect(() => {\n if (!isColorMenuOpen) return;\n\n const handleClickOutside = (e: globalThis.MouseEvent) => {\n if (\n colorMenuRef.current &&\n !colorMenuRef.current.contains(e.target as Node)\n ) {\n setIsColorMenuOpen(false);\n }\n };\n\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isColorMenuOpen]);\n\n const highlightClass = isScrolledTo ? \"ShapeHighlight--scrolledTo\" : \"\";\n const selectedClass = isSelected ? \"ShapeHighlight--selected\" : \"\";\n\n // Generate key based on position for Rnd remount on position changes\n const key = `${highlight.position.boundingRect.width}${highlight.position.boundingRect.height}${highlight.position.boundingRect.left}${highlight.position.boundingRect.top}`;\n\n // Generate unique ID for SVG markers\n const markerId = `arrowhead-${highlight.id}`;\n\n // Render the shape SVG\n const renderShape = (width: number, height: number) => {\n switch (shapeType) {\n case \"rectangle\":\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <rect\n x={strokeWidth / 2}\n y={strokeWidth / 2}\n width={width - strokeWidth}\n height={height - strokeWidth}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n </svg>\n );\n case \"circle\":\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={width / 2}\n cy={height / 2}\n rx={width / 2 - strokeWidth / 2}\n ry={height / 2 - strokeWidth / 2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n </svg>\n );\n case \"arrow\": {\n // Use stored start/end points if available, otherwise default to left-to-right\n const x1 = startPoint ? startPoint.x * width : strokeWidth;\n const y1 = startPoint ? startPoint.y * height : height / 2;\n const x2 = endPoint ? endPoint.x * width : width - strokeWidth - 10;\n const y2 = endPoint ? endPoint.y * height : height / 2;\n\n return (\n <svg\n className=\"ShapeHighlight__svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n >\n <defs>\n <marker\n id={markerId}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n </defs>\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n markerEnd={`url(#${markerId})`}\n />\n </svg>\n );\n }\n default:\n return null;\n }\n };\n\n return (\n <div\n className={`ShapeHighlight ${highlightClass} ${selectedClass}`}\n onContextMenu={onContextMenu}\n ref={containerRef}\n >\n {configLayer && (onStyleChange || onDelete) &&\n createPortal(\n <div\n className=\"ShapeHighlight__toolbar-wrapper\"\n ref={toolbarWrapperRef}\n style={{\n position: \"absolute\",\n left: highlight.position.boundingRect.left,\n top: highlight.position.boundingRect.top,\n }}\n >\n <div\n className={`ShapeHighlight__toolbar ${isSelected || isScrolledTo || isStylePanelOpen || isColorMenuOpen ? \"ShapeHighlight__toolbar--visible\" : \"\"}`}\n >\n {onStyleChange && (\n <>\n {/* Color as a dropdown (swatch + chevron) instead of a row of\n dots — gives each preset room for a name and a checkmark\n on the active one, and keeps the toolbar itself compact. */}\n <button\n type=\"button\"\n className=\"ShapeHighlight__color-trigger\"\n aria-label=\"Stroke color\"\n aria-expanded={isColorMenuOpen}\n onClick={(e) => {\n e.stopPropagation();\n setIsStylePanelOpen(false);\n setIsColorMenuOpen((v) => !v);\n }}\n title=\"Stroke color\"\n >\n <span\n className=\"ShapeHighlight__color-trigger-dot\"\n style={{ backgroundColor: strokeColor }}\n />\n <ChevronDown width={12} height={12} strokeWidth={2.5} />\n </button>\n <div className=\"ShapeHighlight__toolbar-divider\" />\n </>\n )}\n {onStyleChange && (\n <button\n className=\"ShapeHighlight__style-button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsColorMenuOpen(false);\n setIsStylePanelOpen(!isStylePanelOpen);\n }}\n title=\"Stroke width\"\n type=\"button\"\n >\n {styleIcon || <DefaultStyleIcon />}\n </button>\n )}\n {onDelete && (\n <button\n className=\"ShapeHighlight__delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n title=\"Delete\"\n type=\"button\"\n >\n {deleteIcon || <DefaultDeleteIcon />}\n </button>\n )}\n </div>\n\n {/* Color dropdown - same slot as the style panel */}\n {isColorMenuOpen && onStyleChange && (\n <div\n className=\"ShapeHighlight__color-menu\"\n ref={colorMenuRef}\n onClick={(e) => e.stopPropagation()}\n >\n {colorPresets.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"ShapeHighlight__color-menu-item\"\n onClick={() => {\n onStyleChange({ strokeColor: c });\n setIsColorMenuOpen(false);\n }}\n >\n <span\n className=\"ShapeHighlight__color-menu-dot\"\n style={{ backgroundColor: c }}\n />\n <span className=\"ShapeHighlight__color-menu-label\">\n {COLOR_NAMES[c] || c}\n </span>\n {strokeColor === c && (\n <span className=\"ShapeHighlight__color-menu-check\">\n <Check width={14} height={14} strokeWidth={2.5} />\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n\n {/* Style Panel - inside wrapper */}\n {isStylePanelOpen && onStyleChange && (\n <div\n className=\"ShapeHighlight__style-panel\"\n ref={stylePanelRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"ShapeHighlight__style-row\">\n <label>Width</label>\n <div className=\"ShapeHighlight__width-options\">\n {STROKE_WIDTHS.map((w) => (\n <button\n key={w.value}\n type=\"button\"\n className={`ShapeHighlight__width-button ${strokeWidth === w.value ? \"active\" : \"\"}`}\n onClick={() => onStyleChange({ strokeWidth: w.value })}\n title={w.label}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>,\n configLayer,\n )}\n\n <Rnd\n className=\"ShapeHighlight__rnd\"\n onDragStop={(_, data) => {\n const boundingRect: LTWHP = {\n ...highlight.position.boundingRect,\n top: data.y,\n left: data.x,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onDragStart={() => {\n setIsSelected(true);\n onEditStart?.();\n }}\n onResizeStop={(_e, _direction, ref, _delta, position) => {\n const boundingRect: LTWHP = {\n top: position.y,\n left: position.x,\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n pageNumber:\n getPageFromElement(ref)?.number ||\n highlight.position.boundingRect.pageNumber,\n };\n onChange?.(boundingRect);\n onEditEnd?.();\n }}\n onResizeStart={onEditStart}\n default={{\n x: highlight.position.boundingRect.left,\n y: highlight.position.boundingRect.top,\n width: highlight.position.boundingRect.width || 100,\n height: highlight.position.boundingRect.height || 100,\n }}\n minWidth={20}\n minHeight={20}\n key={key}\n bounds={bounds}\n lockAspectRatio={shapeType === \"circle\"}\n // A click still selects the highlight (shows the toolbar).\n onClick={(event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n setIsSelected(true);\n }}\n style={style}\n >\n <div className=\"ShapeHighlight__container\">\n {renderShape(\n highlight.position.boundingRect.width || 100,\n highlight.position.boundingRect.height || 100\n )}\n </div>\n </Rnd>\n </div>\n );\n};\n","import React, { ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { GlobalWorkerOptions, OnProgressParameters, getDocument, type PDFDocumentLoadingTask, type PDFDocumentProxy } from \"pdfjs-dist\";\nimport { DocumentInitParameters, TypedArray } from \"pdfjs-dist/types/src/display/api\";\n\nconst DEFAULT_BEFORE_LOAD = (progress: OnProgressParameters | null) => {\n const pct =\n progress && progress.total\n ? Math.min(100, Math.floor((progress.loaded / progress.total) * 100))\n : null;\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 12,\n height: \"100%\",\n color: \"currentColor\",\n opacity: 0.7,\n fontSize: 13,\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n border: \"3px solid currentColor\",\n borderTopColor: \"transparent\",\n borderRadius: \"50%\",\n animation: \"pdfloader-spin 0.8s linear infinite\",\n }}\n />\n <div>{pct !== null ? `Loading ${pct}%` : \"Loading…\"}</div>\n <style>{\"@keyframes pdfloader-spin{to{transform:rotate(360deg)}}\"}</style>\n </div>\n );\n};\n\nconst DEFAULT_ERROR_MESSAGE = (error: Error) => (\n <div style={{ color: \"black\" }}>{error.message}</div>\n);\n\nconst DEFAULT_ON_ERROR = (error: Error) => {\n throw new Error(`Error loading PDF document: ${error.message}!`);\n};\n\nconst DEFAULT_WORKER_SRC = new URL(\n \"pdfjs-dist/build/pdf.worker.min.mjs\",\n import.meta.url,\n).toString();\n\n// --- Document cache -------------------------------------------------------\n// Keeps loaded documents alive across remounts (StrictMode double-mount, tab\n// switches, re-opening the same URL) so they don't re-download/re-parse. The\n// loading task is shared, so concurrent mounts of the same URL fetch once.\n// Reference-counted: an entry is only evicted once nothing is using it AND the\n// cache is over budget.\nconst CACHE_MAX = 3;\nlet lruTick = 0;\n\ninterface CacheEntry {\n task: PDFDocumentLoadingTask;\n promise: Promise<PDFDocumentProxy>;\n refs: number;\n used: number;\n}\n\nconst docCache = new Map<string, CacheEntry>();\n\nconst evictIfNeeded = () => {\n if (docCache.size <= CACHE_MAX) return;\n let victimKey: string | undefined;\n let oldest = Infinity;\n for (const [key, entry] of docCache) {\n if (entry.refs === 0 && entry.used < oldest) {\n oldest = entry.used;\n victimKey = key;\n }\n }\n if (victimKey !== undefined) {\n const victim = docCache.get(victimKey)!;\n docCache.delete(victimKey);\n victim.task.destroy();\n }\n};\n\nconst cacheKeyOf = (\n document: string | URL | TypedArray | DocumentInitParameters,\n): string | null => {\n if (typeof document === \"string\") return document;\n if (document instanceof URL) return document.href;\n if (\n document &&\n typeof document === \"object\" &&\n !ArrayBuffer.isView(document) &&\n typeof (document as DocumentInitParameters).url === \"string\"\n ) {\n return (document as DocumentInitParameters).url as string;\n }\n // Raw bytes — content isn't identified by a stable key, so don't cache.\n return null;\n};\n\ninterface PerfOptions {\n disableAutoFetch?: boolean;\n disableStream?: boolean;\n rangeChunkSize?: number;\n withCredentials?: boolean;\n httpHeaders?: Record<string, string>;\n}\n\nconst stripUndefined = <T extends object>(obj: T): Partial<T> => {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj))\n if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n return out;\n};\n\n// Security defaults: PDFs can embed JavaScript (form actions, annotations) that\n// pdf.js will otherwise evaluate. Viewers routinely load untrusted documents, so\n// scripting is off unless the consumer explicitly re-enables it through\n// DocumentInitParameters (their fields win over these defaults).\nconst SECURE_DEFAULTS = {\n enableScripting: false,\n isEvalSupported: false,\n};\n\nconst buildSource = (\n document: string | URL | TypedArray | DocumentInitParameters,\n perf: PerfOptions,\n) => {\n const cleaned = { ...SECURE_DEFAULTS, ...stripUndefined(perf) };\n if (typeof document === \"string\" || document instanceof URL) {\n return { url: document, ...cleaned };\n }\n if (ArrayBuffer.isView(document)) {\n // Raw bytes: streaming options don't apply, but scripting defaults do.\n return { ...SECURE_DEFAULTS, data: document };\n }\n // DocumentInitParameters — caller's explicit fields win over our defaults.\n return { ...cleaned, ...document };\n};\n\n/**\n * The props type for {@link PdfLoader}.\n *\n * @category Component Properties\n */\nexport interface PdfLoaderProps {\n /**\n * The document to be loaded by PDF.js.\n * If you need to pass HTTP headers, auth parameters,\n * or other pdf settings, do it through here.\n */\n document: string | URL | TypedArray | DocumentInitParameters;\n\n /**\n * Callback to render content before the PDF document is loaded. Receives the\n * PDF.js progress, or `null` before any progress is known (e.g. a cache hit).\n *\n * @param progress - PDF.js progress status, or null.\n * @returns - Component to be rendered in space of the PDF document while loading.\n */\n beforeLoad?(progress: OnProgressParameters | null): ReactNode;\n\n /**\n * Component to render in the case of any PDF loading errors.\n *\n * @param error - PDF loading error.\n * @returns - Component to be rendered in space of the PDF document.\n */\n errorMessage?(error: Error): ReactNode;\n\n /**\n * Child components to use/render the loaded PDF document.\n *\n * @param pdfDocument - The loaded PDF document.\n * @returns - Component to render once PDF document is loaded.\n */\n children(pdfDocument: PDFDocumentProxy): ReactNode;\n\n /**\n * Callback triggered whenever an error occurs.\n *\n * @param error - PDF Loading error triggering the event.\n * @returns - Component to be rendered in space of the PDF document.\n */\n onError?(error: Error): void;\n\n /**\n * Optional PDF.js worker source override. By default, PdfLoader resolves the\n * worker from the installed pdfjs-dist package so bundlers can emit it locally.\n */\n workerSrc?: string;\n\n /**\n * Only fetch the pages needed to render, instead of background-downloading the\n * whole file. Makes the first page appear fast for large PDFs served over an\n * API — provided the server supports HTTP range requests (`Accept-Ranges:\n * bytes`). Has no effect for servers without range support or for raw bytes.\n * @default true\n */\n disableAutoFetch?: boolean;\n\n /** Disable progressive streaming of the response. @default false */\n disableStream?: boolean;\n\n /** Size (bytes) of each range request when streaming. PDF.js default ~64KB. */\n rangeChunkSize?: number;\n\n /** Send credentials (cookies) with the document request. */\n withCredentials?: boolean;\n\n /** Extra HTTP headers for the document request (e.g. an auth token). */\n httpHeaders?: Record<string, string>;\n\n /**\n * Cache the loaded document so re-opening the same URL (or a StrictMode/\n * remount) reuses it instead of re-downloading. Only URL-based documents are\n * cached. Disable if the same URL can return different content.\n * @default true\n */\n enableCache?: boolean;\n}\n\n/**\n * A component for loading a PDF document and passing it to a child.\n *\n * @category Component\n */\nexport const PdfLoader = ({\n document,\n beforeLoad = DEFAULT_BEFORE_LOAD,\n errorMessage = DEFAULT_ERROR_MESSAGE,\n children,\n onError = DEFAULT_ON_ERROR,\n workerSrc = DEFAULT_WORKER_SRC,\n disableAutoFetch = true,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeaders,\n enableCache = true,\n}: PdfLoaderProps) => {\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [loadingProgress, setLoadingProgress] =\n useState<OnProgressParameters | null>(null);\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n const httpHeadersKey = httpHeaders ? JSON.stringify(httpHeaders) : \"\";\n\n useEffect(() => {\n GlobalWorkerOptions.workerSrc = workerSrc;\n let cancelled = false;\n setPdfDocument(null);\n setError(null);\n setLoadingProgress(null);\n\n const key = enableCache ? cacheKeyOf(document) : null;\n let entry: CacheEntry;\n const cached = key ? docCache.get(key) : undefined;\n\n if (cached) {\n // Reuse the in-flight or finished load — no new network request.\n console.log(\"[PdfLoader] cache hit\", key);\n entry = cached;\n entry.refs += 1;\n entry.used = ++lruTick;\n } else {\n console.log(\"[PdfLoader] loading\", key ?? \"(bytes)\", {\n disableAutoFetch,\n });\n const task = getDocument(\n buildSource(document, {\n disableAutoFetch,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeaders,\n }) as Parameters<typeof getDocument>[0],\n );\n task.onProgress = (progress: OnProgressParameters) => {\n if (!cancelled)\n setLoadingProgress(progress.loaded > progress.total ? null : progress);\n };\n entry = { task, promise: task.promise, refs: 1, used: ++lruTick };\n if (key) {\n docCache.set(key, entry);\n evictIfNeeded();\n }\n }\n\n entry.promise\n .then((proxy: PDFDocumentProxy) => {\n if (!cancelled) setPdfDocument(proxy);\n })\n .catch((err: Error) => {\n if (cancelled || err.message === \"Worker was destroyed\") return;\n setError(err);\n onErrorRef.current(err);\n })\n .finally(() => {\n if (!cancelled) setLoadingProgress(null);\n });\n\n return () => {\n cancelled = true;\n entry.refs -= 1;\n if (key && docCache.has(key)) {\n // Keep cached for reuse; only drop if over budget and unused.\n entry.used = ++lruTick;\n evictIfNeeded();\n } else {\n // Uncached (raw bytes / caching disabled) — release it.\n entry.task.destroy();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n document,\n workerSrc,\n disableAutoFetch,\n disableStream,\n rangeChunkSize,\n withCredentials,\n httpHeadersKey,\n enableCache,\n ]);\n\n if (error) return errorMessage(error);\n if (pdfDocument) return children(pdfDocument);\n return beforeLoad(loadingProgress);\n};\n","import type { PDFDocumentProxy, PageViewport } from \"pdfjs-dist\";\nimport type { Highlight, LTWHP, ScaledPosition } from \"../types\";\nimport getBoundingRect from \"./get-bounding-rect\";\nimport { viewportToScaled } from \"./coordinates\";\n\ntype PdfTextContentItem = {\n str: string;\n transform: number[];\n width: number;\n height: number;\n};\n\nexport type PdfTextItem = {\n text: string;\n index: number;\n pageNumber: number;\n rect: LTWHP;\n fontName?: string;\n columnIndex?: number;\n};\n\nexport type PdfTextColumn = {\n index: number;\n left: number;\n right: number;\n width: number;\n textItemIndexes: number[];\n};\n\nexport type PdfExtractedPage = {\n pageNumber: number;\n width: number;\n height: number;\n textItems: PdfTextItem[];\n columns?: PdfTextColumn[];\n};\n\nexport type PdfTextUnitType =\n | \"paragraph\"\n | \"title\"\n | \"heading\"\n | \"author\"\n | \"affiliation\"\n | \"footnote\"\n | \"reference\"\n | \"caption\"\n | \"figureLabel\"\n | \"unknown\";\n\nexport type PdfTextUnit = {\n id: string;\n type: PdfTextUnitType;\n text: string;\n rawText: string;\n pageNumber: number;\n indexInPage: number;\n columnIndex?: number;\n position?: ScaledPosition;\n source?: {\n textItemIndexes: number[];\n };\n};\n\nexport type PdfSentenceSource = {\n startOffset: number;\n endOffset: number;\n textItemIndexes: number[];\n};\n\nexport type PdfSentence = {\n id: string;\n text: string;\n rawText: string;\n pageNumber: number;\n indexInPage: number;\n globalIndex: number;\n columnIndex?: number;\n position?: ScaledPosition;\n source?: PdfSentenceSource;\n};\n\nexport type PdfReadingOrder = \"auto\" | \"document\" | \"position\";\nexport type PdfColumnDetection = \"auto\" | \"none\";\n\nexport type ExtractSentencesOptions = {\n pages?: \"all\" | number[];\n includePositions?: boolean;\n includeSources?: boolean;\n normalize?: boolean;\n locale?: string;\n idPrefix?: string;\n includeTextUnitTypes?: PdfTextUnitType[];\n readingOrder?: PdfReadingOrder;\n columnDetection?: PdfColumnDetection;\n};\n\ntype ResolvedExtractSentencesOptions = Required<\n Omit<ExtractSentencesOptions, \"includeTextUnitTypes\">\n> & {\n includeTextUnitTypes: PdfTextUnitType[];\n};\n\ntype PageTextStream = {\n text: string;\n charItemIndexes: Array<number | null>;\n};\n\ntype SentenceRange = {\n text: string;\n start: number;\n end: number;\n};\n\nconst DEFAULT_OPTIONS: ResolvedExtractSentencesOptions = {\n pages: \"all\",\n includePositions: false,\n includeSources: false,\n normalize: true,\n locale: \"en\",\n idPrefix: \"\",\n includeTextUnitTypes: [\"paragraph\"],\n readingOrder: \"auto\",\n columnDetection: \"auto\",\n};\n\nconst isTextItem = (item: unknown): item is PdfTextContentItem => {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"str\" in item &&\n typeof (item as { str: unknown }).str === \"string\" &&\n \"transform\" in item &&\n Array.isArray((item as { transform: unknown }).transform)\n );\n};\n\nconst shouldInsertSpace = (previous: string, next: string) => {\n if (!previous || !next) return false;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return false;\n if (/^[,.;:!?)]/.test(next)) return false;\n if (/[([{]$/.test(previous)) return false;\n return true;\n};\n\nconst getLastNonWhitespace = (text: string) => {\n const match = text.match(/\\S(?=\\s*$)/);\n return match?.[0] ?? \"\";\n};\n\ntype PdfTextItemTextKind =\n | \"singleGlyph\"\n | \"wordLike\"\n | \"punctuation\"\n | \"space\"\n | \"other\";\n\nconst getTrimmedChars = (text: string) => Array.from(text.trim());\n\nconst getItemTextKind = (text: string): PdfTextItemTextKind => {\n if (!text.trim()) return \"space\";\n if (/^[,.;:!?)\\]}]+$/.test(text.trim())) return \"punctuation\";\n\n const chars = getTrimmedChars(text);\n\n if (chars.length === 1 && /[\\p{L}\\p{N}]/u.test(chars[0])) {\n return \"singleGlyph\";\n }\n\n if (/[\\p{L}\\p{N}]/u.test(text)) return \"wordLike\";\n\n return \"other\";\n};\n\nconst getMedianGlyphWidth = (textItems: PdfTextItem[]) => {\n const glyphWidths = textItems\n .map((item) => {\n const textLength = Math.max(getTrimmedChars(item.text).length, 1);\n return item.rect.width / textLength;\n })\n .filter((width) => Number.isFinite(width) && width > 0)\n .sort((a, b) => a - b);\n\n if (glyphWidths.length === 0) return 0;\n\n return glyphWidths[Math.floor(glyphWidths.length / 2)];\n};\n\nconst getHorizontalGap = (\n previousItem: PdfTextItem,\n nextItem: PdfTextItem,\n medianGlyphWidth: number,\n) => {\n const previousRight = previousItem.rect.left + previousItem.rect.width;\n const gap = nextItem.rect.left - previousRight;\n const zeroTolerance = Math.max(medianGlyphWidth * 0.08, 0.35);\n\n return Math.abs(gap) <= zeroTolerance ? 0 : gap;\n};\n\nconst shouldInsertSpaceBetweenItems = (\n previousItem: PdfTextItem | undefined,\n nextItem: PdfTextItem,\n currentText: string,\n averageHeight: number,\n medianGlyphWidth: number,\n) => {\n if (!previousItem || !currentText || !nextItem.text) return false;\n if (/\\s$/.test(currentText) || /^\\s/.test(nextItem.text)) return false;\n\n const previousChar = getLastNonWhitespace(currentText);\n const nextChar = Array.from(nextItem.text.trim())[0] ?? \"\";\n const previousKind = getItemTextKind(previousItem.text);\n const nextKind = getItemTextKind(nextItem.text);\n\n if (!nextChar) return false;\n if (nextKind === \"punctuation\" || /^[,.;:!?)]/.test(nextChar)) return false;\n if (/[([{]$/.test(previousChar)) return false;\n\n const gap = getHorizontalGap(previousItem, nextItem, medianGlyphWidth);\n\n if (gap < 0) return false;\n\n const glyphWidth = Math.max(\n medianGlyphWidth,\n averageHeight * 0.18,\n 1,\n );\n const singleGlyphPair = previousKind === \"singleGlyph\" && nextKind === \"singleGlyph\";\n\n if (singleGlyphPair) {\n return gap > Math.max(glyphWidth * 0.35, 1.0);\n }\n\n if (\n (previousKind === \"wordLike\" || previousKind === \"singleGlyph\") &&\n (nextKind === \"wordLike\" || nextKind === \"singleGlyph\")\n ) {\n return gap > Math.max(glyphWidth * 0.08, 0.35);\n }\n\n return shouldInsertSpace(currentText, nextItem.text);\n};\n\nconst appendTextItem = (\n currentText: string,\n item: PdfTextItem,\n previousItem: PdfTextItem | undefined,\n averageHeight: number,\n medianGlyphWidth: number,\n) => {\n return `${currentText}${\n shouldInsertSpaceBetweenItems(\n previousItem,\n item,\n currentText,\n averageHeight,\n medianGlyphWidth,\n )\n ? \" \"\n : \"\"\n }${item.text}`;\n};\n\nconst getAverageItemHeight = (textItems: PdfTextItem[]) => {\n const heights = textItems\n .map((item) => item.rect.height)\n .filter((height) => height > 0)\n .sort((a, b) => a - b);\n\n if (heights.length === 0) return 0;\n\n return heights[Math.floor(heights.length / 2)];\n};\n\nconst areTextItemsOnSameLine = (\n previous: PdfTextItem,\n next: PdfTextItem,\n averageHeight: number,\n) => {\n const previousMiddle = previous.rect.top + previous.rect.height / 2;\n const nextMiddle = next.rect.top + next.rect.height / 2;\n const tolerance = Math.max(averageHeight * 0.45, 2);\n\n return Math.abs(previousMiddle - nextMiddle) <= tolerance;\n};\n\nconst getTextItemRect = (\n item: PdfTextContentItem,\n viewport: PageViewport,\n pageNumber: number,\n): LTWHP => {\n const [, , , , x, y] = item.transform;\n const width = Math.abs(item.width ?? 0);\n const height = Math.abs(item.height ?? 0);\n\n const [x1, y1, x2, y2] = viewport.convertToViewportRectangle([\n x,\n y,\n x + width,\n y + height,\n ]);\n\n return {\n left: Math.min(x1, x2),\n top: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n pageNumber,\n };\n};\n\nconst resolvePageNumbers = (\n pdfDocument: PDFDocumentProxy,\n pages: ExtractSentencesOptions[\"pages\"],\n) => {\n if (pages === \"all\" || pages === undefined) {\n return Array.from({ length: pdfDocument.numPages }, (_, index) => index + 1);\n }\n\n return [...new Set(pages)]\n .filter((pageNumber) => pageNumber >= 1 && pageNumber <= pdfDocument.numPages)\n .sort((a, b) => a - b);\n};\n\nconst buildPageTextStream = (textItems: PdfTextItem[]): PageTextStream => {\n let text = \"\";\n const charItemIndexes: Array<number | null> = [];\n const averageHeight = getAverageItemHeight(textItems);\n const medianGlyphWidth = getMedianGlyphWidth(textItems);\n let previousItem: PdfTextItem | undefined;\n\n textItems.forEach((item) => {\n if (!item.text) return;\n\n if (\n shouldInsertSpaceBetweenItems(\n previousItem,\n item,\n text,\n averageHeight,\n medianGlyphWidth,\n )\n ) {\n text += \" \";\n charItemIndexes.push(null);\n }\n\n for (const char of item.text) {\n text += char;\n charItemIndexes.push(item.index);\n }\n\n previousItem = item;\n });\n\n return { text, charItemIndexes };\n};\n\nconst normalizePdfLigatures = (text: string) => {\n return text\n .replace(/ffi/g, \"ffi\")\n .replace(/ffl/g, \"ffl\")\n .replace(/fi/g, \"fi\")\n .replace(/fl/g, \"fl\")\n .replace(/ff/g, \"ff\");\n};\n\nconst cleanupPdfHyphenSpacing = (text: string) => {\n return text.replace(\n /\\b([\\p{L}\\p{N}]{2,})\\s+-\\s+([\\p{L}\\p{N}]{2,})\\b/gu,\n \"$1-$2\",\n );\n};\n\nexport const normalizePdfSentenceText = (text: string) => {\n return cleanupPdfHyphenSpacing(normalizePdfLigatures(text))\n .replace(/(\\p{L}+)-\\s+(\\p{L}+)/gu, \"$1-$2\")\n .replace(/\\[\\s*([^\\]]*?)\\s*\\]/g, (_, citation: string) => {\n const normalizedCitation = citation\n .replace(/\\s*,\\s*/g, \", \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return `[${normalizedCitation}]`;\n })\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nexport const splitPdfSentences = (\n text: string,\n locale: string = DEFAULT_OPTIONS.locale,\n): SentenceRange[] => {\n const segmenterConstructor = Intl.Segmenter;\n\n if (segmenterConstructor) {\n const segmenter = new segmenterConstructor(locale, {\n granularity: \"sentence\",\n });\n\n return Array.from(segmenter.segment(text))\n .map((segment) => ({\n text: segment.segment.trim(),\n start: segment.index + segment.segment.search(/\\S/),\n end: segment.index + segment.segment.trimEnd().length,\n }))\n .filter((sentence) => sentence.text.length > 0 && sentence.start >= 0);\n }\n\n const ranges: SentenceRange[] = [];\n let start = 0;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (!/[.!?]/.test(char)) continue;\n\n const nextText = text.slice(index + 1);\n const nextNonSpace = nextText.match(/\\S/);\n const nextChar = nextNonSpace?.[0] ?? \"\";\n const shouldSplit =\n nextChar === \"\" || /[A-Z([{\"']/.test(nextChar);\n\n if (!shouldSplit) continue;\n\n const rawSentence = text.slice(start, index + 1);\n const leadingWhitespace = rawSentence.search(/\\S/);\n const sentenceStart = start + Math.max(leadingWhitespace, 0);\n const sentenceText = rawSentence.trim();\n\n if (sentenceText) {\n ranges.push({\n text: sentenceText,\n start: sentenceStart,\n end: start + rawSentence.trimEnd().length,\n });\n }\n\n start = index + 1;\n }\n\n const finalRawSentence = text.slice(start);\n const leadingWhitespace = finalRawSentence.search(/\\S/);\n const finalText = finalRawSentence.trim();\n\n if (finalText) {\n ranges.push({\n text: finalText,\n start: start + Math.max(leadingWhitespace, 0),\n end: start + finalRawSentence.trimEnd().length,\n });\n }\n\n return ranges;\n};\n\nconst getSentenceTextItemIndexes = (\n charItemIndexes: Array<number | null>,\n start: number,\n end: number,\n) => {\n const indexes = new Set<number>();\n\n for (let index = start; index < end; index += 1) {\n const itemIndex = charItemIndexes[index];\n if (itemIndex !== null && itemIndex !== undefined) {\n indexes.add(itemIndex);\n }\n }\n\n return Array.from(indexes).sort((a, b) => a - b);\n};\n\nconst getScaledPosition = (\n textItems: PdfTextItem[],\n textItemIndexes: number[],\n page: PdfExtractedPage,\n): ScaledPosition | undefined => {\n const indexSet = new Set(textItemIndexes);\n const rects = textItems\n .filter((item) => indexSet.has(item.index))\n .map((item) => item.rect)\n .filter((rect) => rect.width > 0 && rect.height > 0);\n\n if (rects.length === 0) return undefined;\n\n const boundingRect = getBoundingRect(rects);\n\n return {\n boundingRect: viewportToScaled(boundingRect, page),\n rects: rects.map((rect) => viewportToScaled(rect, page)),\n };\n};\n\nconst getTextItemsPosition = (\n textItems: PdfTextItem[],\n textItemIndexes: number[],\n page: PdfExtractedPage,\n includePositions: boolean,\n) => {\n return includePositions\n ? getScaledPosition(textItems, textItemIndexes, page)\n : undefined;\n};\n\nconst getTextItemsBoundingRect = (textItems: PdfTextItem[]) => {\n const rects = textItems\n .map((item) => item.rect)\n .filter((rect) => rect.width > 0 && rect.height > 0);\n\n return rects.length > 0 ? getBoundingRect(rects) : undefined;\n};\n\nconst getOrderedTextItems = (\n textItems: PdfTextItem[],\n readingOrder: PdfReadingOrder,\n) => {\n if (readingOrder === \"document\") return [...textItems];\n\n const averageHeight = getAverageItemHeight(textItems);\n\n return [...textItems].sort((a, b) => {\n const topDelta = a.rect.top - b.rect.top;\n if (Math.abs(topDelta) > Math.max(averageHeight * 0.45, 2)) {\n return topDelta;\n }\n\n return a.rect.left - b.rect.left;\n });\n};\n\nconst groupTextItemsIntoLines = (textItems: PdfTextItem[]) => {\n const averageHeight = getAverageItemHeight(textItems);\n const sortedItems = getOrderedTextItems(textItems, \"position\");\n const lines: PdfTextItem[][] = [];\n\n sortedItems.forEach((item) => {\n const currentLine = lines[lines.length - 1];\n const previousItem = currentLine?.[currentLine.length - 1];\n\n if (\n currentLine &&\n previousItem &&\n areTextItemsOnSameLine(previousItem, item, averageHeight)\n ) {\n currentLine.push(item);\n currentLine.sort((a, b) => a.rect.left - b.rect.left);\n return;\n }\n\n lines.push([item]);\n });\n\n return lines;\n};\n\nconst isLikelyBodyTextItem = (item: PdfTextItem, page: PdfExtractedPage) => {\n const text = item.text.trim();\n if (!text) return false;\n if ((item.rect.top < page.height * 0.12 && page.pageNumber === 1) || item.rect.top > page.height * 0.88) {\n return false;\n }\n if (isLikelyFootnoteOrReference(text)) return false;\n return true;\n};\n\nconst getColumnRanges = (textItems: PdfTextItem[], page: PdfExtractedPage) => {\n if (textItems.length < 24) return undefined;\n\n const minLeft = Math.min(...textItems.map((item) => item.rect.left));\n const maxRight = Math.max(\n ...textItems.map((item) => item.rect.left + item.rect.width),\n );\n const pageSpan = maxRight - minLeft;\n const binCount = 80;\n const bins = Array.from({ length: binCount }, () => 0);\n\n textItems.forEach((item) => {\n const left = item.rect.left;\n const right = item.rect.left + item.rect.width;\n const startBin = Math.max(\n 0,\n Math.floor(((left - minLeft) / pageSpan) * binCount),\n );\n const endBin = Math.min(\n binCount - 1,\n Math.ceil(((right - minLeft) / pageSpan) * binCount),\n );\n\n for (let index = startBin; index <= endBin; index += 1) {\n bins[index] += 1;\n }\n });\n\n const centerStart = Math.floor(binCount * 0.35);\n const centerEnd = Math.ceil(binCount * 0.65);\n let bestGapStart = -1;\n let bestGapEnd = -1;\n let currentGapStart = -1;\n\n for (let index = centerStart; index <= centerEnd; index += 1) {\n if (bins[index] === 0) {\n if (currentGapStart === -1) currentGapStart = index;\n continue;\n }\n\n if (currentGapStart !== -1 && index - currentGapStart > bestGapEnd - bestGapStart) {\n bestGapStart = currentGapStart;\n bestGapEnd = index;\n }\n\n currentGapStart = -1;\n }\n\n if (\n currentGapStart !== -1 &&\n centerEnd + 1 - currentGapStart > bestGapEnd - bestGapStart\n ) {\n bestGapStart = currentGapStart;\n bestGapEnd = centerEnd + 1;\n }\n\n const gapBins = bestGapEnd - bestGapStart;\n const gapWidth = (gapBins / binCount) * pageSpan;\n const minGapWidth = Math.max(page.width * 0.035, 14);\n\n if (bestGapStart < 0 || gapWidth < minGapWidth) return undefined;\n\n const gapLeft = minLeft + (bestGapStart / binCount) * pageSpan;\n const gapRight = minLeft + (bestGapEnd / binCount) * pageSpan;\n const splitX = (gapLeft + gapRight) / 2;\n const leftItems = textItems.filter(\n (item) => item.rect.left + item.rect.width / 2 < splitX,\n );\n const rightItems = textItems.filter(\n (item) => item.rect.left + item.rect.width / 2 >= splitX,\n );\n\n if (leftItems.length < 10 || rightItems.length < 10) return undefined;\n\n const leftRange = {\n left: Math.min(...leftItems.map((item) => item.rect.left)),\n right: Math.max(...leftItems.map((item) => item.rect.left + item.rect.width)),\n };\n const rightRange = {\n left: Math.min(...rightItems.map((item) => item.rect.left)),\n right: Math.max(...rightItems.map((item) => item.rect.left + item.rect.width)),\n };\n const leftHeight = getAverageItemHeight(leftItems);\n const rightHeight = getAverageItemHeight(rightItems);\n\n if (\n leftHeight > 0 &&\n rightHeight > 0 &&\n Math.max(leftHeight, rightHeight) / Math.min(leftHeight, rightHeight) > 1.45\n ) {\n return undefined;\n }\n\n return [leftRange, rightRange];\n};\n\nconst assignColumnsToPage = (\n page: PdfExtractedPage,\n columnDetection: PdfColumnDetection,\n): PdfExtractedPage => {\n if (columnDetection === \"none\") {\n return {\n ...page,\n textItems: page.textItems.map((item) => ({ ...item, columnIndex: 0 })),\n columns: [\n {\n index: 0,\n left: 0,\n right: page.width,\n width: page.width,\n textItemIndexes: page.textItems.map((item) => item.index),\n },\n ],\n };\n }\n\n const bodyItems = page.textItems.filter((item) =>\n isLikelyBodyTextItem(item, page),\n );\n const ranges = getColumnRanges(bodyItems, page);\n\n if (!ranges) {\n return {\n ...page,\n textItems: page.textItems.map((item) => ({ ...item, columnIndex: 0 })),\n columns: [\n {\n index: 0,\n left: 0,\n right: page.width,\n width: page.width,\n textItemIndexes: page.textItems.map((item) => item.index),\n },\n ],\n };\n }\n\n const splitX = (ranges[0].right + ranges[1].left) / 2;\n const textItems = page.textItems.map((item) => {\n const centerX = item.rect.left + item.rect.width / 2;\n return {\n ...item,\n columnIndex: centerX < splitX ? 0 : 1,\n };\n });\n\n const columns = ranges.map((range, index) => ({\n index,\n left: range.left,\n right: range.right,\n width: range.right - range.left,\n textItemIndexes: textItems\n .filter((item) => item.columnIndex === index)\n .map((item) => item.index),\n }));\n\n return { ...page, textItems, columns };\n};\n\nconst isFullWidthBlock = (\n block: PdfTextItem[][],\n page: PdfExtractedPage,\n detectedColumnCount: number,\n) => {\n if (detectedColumnCount < 2) return false;\n\n const textItems = block.flat();\n const boundingRect = getTextItemsBoundingRect(textItems);\n if (!boundingRect) return false;\n\n return boundingRect.width > page.width * 0.72;\n};\n\nconst buildBlocksForItems = (\n textItems: PdfTextItem[],\n page: PdfExtractedPage,\n) => {\n const lines = groupTextItemsIntoLines(textItems);\n const averageHeight = getAverageItemHeight(textItems);\n const blocks: PdfTextItem[][][] = [];\n\n lines.forEach((line) => {\n const currentBlock = blocks[blocks.length - 1];\n const previousLine = currentBlock?.[currentBlock.length - 1];\n\n if (\n currentBlock &&\n previousLine &&\n !shouldStartNewBlock(previousLine, line, page, averageHeight)\n ) {\n currentBlock.push(line);\n return;\n }\n\n blocks.push([line]);\n });\n\n return blocks;\n};\n\nconst compareBlocksByPosition = (\n left: { block: PdfTextItem[][] },\n right: { block: PdfTextItem[][] },\n) => {\n const leftRect = getTextItemsBoundingRect(left.block.flat());\n const rightRect = getTextItemsBoundingRect(right.block.flat());\n\n return (leftRect?.top ?? 0) - (rightRect?.top ?? 0);\n};\n\nconst compareBlocksByColumnReadingOrder = (\n left: { block: PdfTextItem[][]; columnIndex?: number },\n right: { block: PdfTextItem[][]; columnIndex?: number },\n) => {\n const columnDelta = (left.columnIndex ?? 0) - (right.columnIndex ?? 0);\n if (columnDelta !== 0) return columnDelta;\n\n return compareBlocksByPosition(left, right);\n};\n\nconst buildTextUnit = ({\n block,\n columnIndex,\n indexInPage,\n includePositions,\n idPrefix,\n page,\n shouldNormalize,\n}: {\n block: PdfTextItem[][];\n columnIndex?: number;\n indexInPage: number;\n includePositions: boolean;\n idPrefix: string;\n page: PdfExtractedPage;\n shouldNormalize: boolean;\n}): PdfTextUnit => {\n const textItems = block.flat();\n const rawText = block.map(getLineText).join(\" \");\n const textItemIndexes = textItems.map((item) => item.index);\n const type = classifyTextUnit(rawText, textItemIndexes, page);\n const position = getTextItemsPosition(\n page.textItems,\n textItemIndexes,\n page,\n includePositions,\n );\n\n return {\n id: `${idPrefix}p${page.pageNumber}-u${indexInPage}`,\n type,\n text: shouldNormalize ? normalizePdfSentenceText(rawText) : rawText.trim(),\n rawText: rawText.trim(),\n pageNumber: page.pageNumber,\n indexInPage,\n ...(columnIndex !== undefined ? { columnIndex } : {}),\n ...(position ? { position } : {}),\n source: {\n textItemIndexes,\n },\n };\n};\n\nconst getLineText = (line: PdfTextItem[]) => {\n const averageHeight = getAverageItemHeight(line);\n const medianGlyphWidth = getMedianGlyphWidth(line);\n\n return line.reduce((text, item, index) => {\n return appendTextItem(\n text,\n item,\n line[index - 1],\n averageHeight,\n medianGlyphWidth,\n );\n }, \"\");\n};\n\nconst getLineRect = (line: PdfTextItem[]) => getBoundingRect(line.map((item) => item.rect));\n\nconst shouldStartNewBlock = (\n previousLine: PdfTextItem[],\n nextLine: PdfTextItem[],\n page: PdfExtractedPage,\n averageHeight: number,\n) => {\n const previousRect = getLineRect(previousLine);\n const nextRect = getLineRect(nextLine);\n const verticalGap = nextRect.top - (previousRect.top + previousRect.height);\n const leftDelta = Math.abs(nextRect.left - previousRect.left);\n const previousText = getLineText(previousLine).trim();\n const nextText = getLineText(nextLine).trim();\n\n if (verticalGap > Math.max(averageHeight * 1.15, 7)) return true;\n if (leftDelta > page.width * 0.18) return true;\n if (isLikelyStandaloneBlock(previousText) || isLikelyStandaloneBlock(nextText)) {\n return true;\n }\n\n return false;\n};\n\nconst isLikelyStandaloneBlock = (text: string) => {\n const normalizedText = normalizePdfSentenceText(text);\n if (!normalizedText) return false;\n if (isLikelySectionHeading(normalizedText)) return true;\n if (isLikelyFootnoteOrReference(normalizedText)) return true;\n return false;\n};\n\nconst isLikelySectionHeading = (text: string) => {\n if (text.length > 80) return false;\n if (/^\\d+(\\.\\d+)*\\.?\\s+[A-Z]/.test(text)) return true;\n\n const letters = text.replace(/[^A-Za-z]/g, \"\");\n if (letters.length < 3) return false;\n\n const uppercaseLetters = text.replace(/[^A-Z]/g, \"\");\n return uppercaseLetters.length / letters.length > 0.75;\n};\n\nconst isLikelyFootnoteOrReference = (text: string) => {\n return (\n /^\\d+\\s*https?:\\/\\//i.test(text) ||\n /^\\[\\d+\\]/.test(text) ||\n /https?:\\/\\/|doi\\.org|arxiv\\.org/i.test(text)\n );\n};\n\nconst isLikelyAuthor = (text: string) => {\n return (\n text.length <= 80 &&\n !/[.!?]$/.test(text) &&\n /^[A-Z][A-Za-z'.-]+(?:\\s+[A-Z][A-Za-z'.-]+){1,4}$/.test(text)\n );\n};\n\nconst isLikelyAffiliation = (text: string) => {\n return (\n text.length <= 160 &&\n /university|institute|department|school|college|faculty|laboratory|germany|usa|china|france|italy|spain|canada|japan|korea/i.test(\n text,\n )\n );\n};\n\nconst classifyTextUnit = (\n rawText: string,\n textItemIndexes: number[],\n page: PdfExtractedPage,\n) => {\n const text = normalizePdfSentenceText(rawText);\n const textItems = page.textItems.filter((item) =>\n textItemIndexes.includes(item.index),\n );\n const rects = textItems.map((item) => item.rect);\n const boundingRect = rects.length > 0 ? getBoundingRect(rects) : undefined;\n const averagePageHeight = getAverageItemHeight(page.textItems);\n const averageUnitHeight = getAverageItemHeight(textItems);\n const isTopOfFirstPage =\n page.pageNumber === 1 && (boundingRect?.top ?? page.height) < page.height * 0.2;\n const isBottomOfPage =\n (boundingRect?.top ?? 0) > page.height * 0.78;\n const isLargeText =\n averagePageHeight > 0 && averageUnitHeight > averagePageHeight * 1.25;\n const isCentered =\n boundingRect !== undefined &&\n Math.abs(boundingRect.left + boundingRect.width / 2 - page.width / 2) <\n page.width * 0.16;\n\n if (isLikelyFootnoteOrReference(text) || (isBottomOfPage && /^\\d+\\s/.test(text))) {\n return text.includes(\"://\") || /^\\d+\\s*https?:\\/\\//i.test(text)\n ? \"footnote\"\n : \"reference\";\n }\n\n // Figure/table captions: the human-written summary of a graphic. Kept as\n // their own type so consumers (e.g. read-aloud) can speak the caption while\n // skipping the diagram's label fragments.\n if (/^(figure|fig\\.?|table|chart|diagram|listing|algorithm)\\s*\\d/i.test(text)) {\n return \"caption\";\n }\n\n if (isLikelySectionHeading(text)) return \"heading\";\n\n if (isTopOfFirstPage && isLargeText && isCentered) return \"title\";\n if (isTopOfFirstPage && isLikelyAuthor(text)) return \"author\";\n if (isTopOfFirstPage && isLikelyAffiliation(text)) return \"affiliation\";\n\n // Diagram/figure labels: short isolated fragments with no sentence-ending\n // punctuation (\"v1 router\", \"Compatibility adapter\", \"DB\"). Real paragraph\n // blocks group many lines and end with punctuation, so this rarely triggers\n // on prose — it keeps chart lettering out of the \"paragraph\" stream that\n // features like read-aloud consume.\n const wordCount = text.split(/\\s+/).filter(Boolean).length;\n if (wordCount <= 6 && text.length <= 60 && !/[.!?…:]\\s*$/.test(text)) {\n return \"figureLabel\";\n }\n\n return \"paragraph\";\n};\n\nexport const extractTextUnitsFromPages = (\n pages: PdfExtractedPage[],\n options: Pick<\n ExtractSentencesOptions,\n \"includePositions\" | \"includeSources\" | \"normalize\" | \"idPrefix\" | \"readingOrder\" | \"columnDetection\"\n > = {},\n): PdfTextUnit[] => {\n const includePositions = options.includePositions ?? DEFAULT_OPTIONS.includePositions;\n const includeSources = options.includeSources ?? DEFAULT_OPTIONS.includeSources;\n const shouldNormalize = options.normalize ?? DEFAULT_OPTIONS.normalize;\n const idPrefix = options.idPrefix ?? DEFAULT_OPTIONS.idPrefix;\n const readingOrder = options.readingOrder ?? DEFAULT_OPTIONS.readingOrder;\n const columnDetection = options.columnDetection ?? DEFAULT_OPTIONS.columnDetection;\n const units: PdfTextUnit[] = [];\n\n pages.forEach((page) => {\n const pageWithColumns = assignColumnsToPage(page, columnDetection);\n const detectedColumnCount = pageWithColumns.columns?.length ?? 1;\n const columnIndexes =\n detectedColumnCount > 1 && readingOrder !== \"document\"\n ? pageWithColumns.columns?.map((column) => column.index) ?? [0]\n : [0];\n const blocks: Array<{ block: PdfTextItem[][]; columnIndex?: number }> = [];\n\n if (readingOrder === \"document\") {\n blocks.push(\n ...buildBlocksForItems(pageWithColumns.textItems, pageWithColumns).map(\n (block) => ({ block }),\n ),\n );\n } else {\n const allBlocks = columnIndexes.flatMap((columnIndex) =>\n buildBlocksForItems(\n pageWithColumns.textItems.filter(\n (item) => item.columnIndex === columnIndex,\n ),\n pageWithColumns,\n ).map((block) => ({ block, columnIndex })),\n );\n const fullWidthBlocks = allBlocks.filter(({ block }) =>\n isFullWidthBlock(block, pageWithColumns, detectedColumnCount),\n );\n const columnBlocks = allBlocks.filter(\n ({ block }) => !isFullWidthBlock(block, pageWithColumns, detectedColumnCount),\n );\n const topFullWidthBlocks = fullWidthBlocks.filter(({ block }) => {\n const rect = getTextItemsBoundingRect(block.flat());\n return (rect?.top ?? 0) < pageWithColumns.height * 0.3;\n });\n const bottomFullWidthBlocks = fullWidthBlocks.filter(({ block }) => {\n const rect = getTextItemsBoundingRect(block.flat());\n return (rect?.top ?? 0) >= pageWithColumns.height * 0.3;\n });\n\n blocks.push(\n ...topFullWidthBlocks.sort(compareBlocksByPosition),\n ...columnBlocks.sort(compareBlocksByColumnReadingOrder),\n ...bottomFullWidthBlocks.sort(compareBlocksByPosition),\n );\n }\n\n blocks.forEach(({ block, columnIndex }, indexInPage) => {\n units.push(\n buildTextUnit({\n block,\n columnIndex,\n indexInPage,\n includePositions,\n idPrefix,\n page: pageWithColumns,\n shouldNormalize,\n }),\n );\n });\n });\n\n if (!includeSources) {\n return units.map(({ source: _source, ...rest }) => rest);\n }\n return units;\n};\n\nexport const extractTextUnits = async (\n pdfDocument: PDFDocumentProxy,\n options: ExtractSentencesOptions = {},\n): Promise<PdfTextUnit[]> => {\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const pages = await extractPageTextItems(pdfDocument, {\n pages: resolvedOptions.pages,\n columnDetection: resolvedOptions.columnDetection,\n });\n\n return extractTextUnitsFromPages(pages, resolvedOptions);\n};\n\n// Text extraction is expensive (getPage + getTextContent for every page) and\n// callers like getTextPosition / extractSentences run it repeatedly — e.g. one\n// citation lookup per query. Cache the resulting promise per document+options:\n// WeakMap keyed on the proxy means entries vanish with the document (no manual\n// invalidation), and caching the PROMISE dedupes concurrent calls too.\nconst pageTextItemsCache = new WeakMap<\n PDFDocumentProxy,\n Map<string, Promise<PdfExtractedPage[]>>\n>();\n\nconst pageTextItemsCacheKey = (\n options: Pick<ExtractSentencesOptions, \"pages\" | \"columnDetection\">,\n): string => {\n const pages =\n options.pages === undefined || options.pages === \"all\"\n ? \"all\"\n : options.pages.join(\",\");\n return `${pages}|${options.columnDetection ?? DEFAULT_OPTIONS.columnDetection}`;\n};\n\nexport const extractPageTextItems = (\n pdfDocument: PDFDocumentProxy,\n options: Pick<ExtractSentencesOptions, \"pages\" | \"columnDetection\"> = {},\n): Promise<PdfExtractedPage[]> => {\n let byOptions = pageTextItemsCache.get(pdfDocument);\n if (!byOptions) {\n byOptions = new Map();\n pageTextItemsCache.set(pdfDocument, byOptions);\n }\n const key = pageTextItemsCacheKey(options);\n const cached = byOptions.get(key);\n if (cached) return cached;\n\n const promise = extractPageTextItemsUncached(pdfDocument, options).catch(\n (error) => {\n // Don't cache failures — a transient error would poison every later call.\n byOptions!.delete(key);\n throw error;\n },\n );\n byOptions.set(key, promise);\n return promise;\n};\n\nconst extractPageTextItemsUncached = async (\n pdfDocument: PDFDocumentProxy,\n options: Pick<ExtractSentencesOptions, \"pages\" | \"columnDetection\"> = {},\n): Promise<PdfExtractedPage[]> => {\n const pageNumbers = resolvePageNumbers(pdfDocument, options.pages);\n const columnDetection = options.columnDetection ?? DEFAULT_OPTIONS.columnDetection;\n const extractedPages: PdfExtractedPage[] = [];\n\n for (const pageNumber of pageNumbers) {\n const page = await pdfDocument.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 1 });\n const textContent = await page.getTextContent();\n\n const textItems: PdfTextItem[] = [];\n\n textContent.items.forEach((item, index) => {\n if (!isTextItem(item) || item.str.length === 0) return;\n\n textItems.push({\n text: item.str,\n index,\n pageNumber,\n rect: getTextItemRect(item, viewport, pageNumber),\n });\n });\n\n extractedPages.push(assignColumnsToPage({\n pageNumber,\n width: viewport.width,\n height: viewport.height,\n textItems,\n }, columnDetection));\n }\n\n return extractedPages;\n};\n\nexport const extractSentences = async (\n pdfDocument: PDFDocumentProxy,\n options: ExtractSentencesOptions = {},\n): Promise<PdfSentence[]> => {\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const pages = await extractPageTextItems(pdfDocument, {\n pages: resolvedOptions.pages,\n columnDetection: resolvedOptions.columnDetection,\n });\n // Always include sources internally — unit.source.textItemIndexes is needed below\n const textUnits = extractTextUnitsFromPages(pages, { ...resolvedOptions, includeSources: true });\n const sentences: PdfSentence[] = [];\n let globalIndex = 0;\n\n textUnits\n .filter((unit) => resolvedOptions.includeTextUnitTypes.includes(unit.type))\n .forEach((unit) => {\n const page = pages.find((candidatePage) => candidatePage.pageNumber === unit.pageNumber);\n if (!page) return;\n\n const pageTextItemsByIndex = new Map(\n page.textItems.map((item) => [item.index, item]),\n );\n const stream = buildPageTextStream(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n unit.source!.textItemIndexes\n .map((textItemIndex) => pageTextItemsByIndex.get(textItemIndex))\n .filter((item): item is PdfTextItem => item !== undefined),\n );\n if (!stream.text.trim()) return;\n\n const sentenceRanges = splitPdfSentences(\n stream.text,\n resolvedOptions.locale,\n );\n\n sentenceRanges.forEach((sentenceRange, indexInPage) => {\n const textItemIndexes = getSentenceTextItemIndexes(\n stream.charItemIndexes,\n sentenceRange.start,\n sentenceRange.end,\n );\n const position = resolvedOptions.includePositions\n ? getScaledPosition(page.textItems, textItemIndexes, page)\n : undefined;\n const id = `${resolvedOptions.idPrefix}p${page.pageNumber}-u${unit.indexInPage}-s${indexInPage}`;\n const rawText = sentenceRange.text;\n\n sentences.push({\n id,\n text: resolvedOptions.normalize\n ? normalizePdfSentenceText(rawText)\n : rawText,\n rawText,\n pageNumber: page.pageNumber,\n indexInPage,\n globalIndex,\n ...(unit.columnIndex !== undefined ? { columnIndex: unit.columnIndex } : {}),\n ...(position ? { position } : {}),\n ...(resolvedOptions.includeSources\n ? { source: { startOffset: sentenceRange.start, endOffset: sentenceRange.end, textItemIndexes } }\n : {}),\n });\n\n globalIndex += 1;\n });\n });\n\n return sentences;\n};\n\nexport const sentenceToHighlight = (\n sentence: PdfSentence,\n options: { id?: string } = {},\n): Highlight => {\n if (!sentence.position) {\n throw new Error(\n \"Cannot convert sentence to highlight because it has no position. Call extractSentences with includePositions: true.\",\n );\n }\n\n return {\n id: options.id ?? sentence.id,\n type: \"text\",\n content: { text: sentence.text },\n position: sentence.position,\n };\n};\n\n/** Strip ALL whitespace, lowercase, unify quotes — keeping a map from each\n * stripped-char index back to its index in the raw string. Matching on the\n * whitespace-free form makes line-wraps / inconsistent PDF spacing irrelevant. */\nconst stripWhitespaceWithMap = (\n raw: string,\n): { stripped: string; map: number[] } => {\n let stripped = \"\";\n const map: number[] = [];\n for (let i = 0; i < raw.length; i += 1) {\n const c = raw[i]!;\n if (/\\s/.test(c)) continue;\n let ch = c.toLowerCase();\n if (ch === \"‘\" || ch === \"’\") ch = \"'\";\n else if (ch === \"“\" || ch === \"”\") ch = '\"';\n stripped += ch;\n map.push(i);\n }\n return { stripped, map };\n};\n\n/** Levenshtein distance, bounded — returns `max + 1` as soon as it's exceeded. */\nconst boundedLevenshtein = (a: string, b: string, max: number): number => {\n const al = a.length;\n const bl = b.length;\n if (Math.abs(al - bl) > max) return max + 1;\n let prev = new Array<number>(bl + 1);\n let curr = new Array<number>(bl + 1);\n for (let j = 0; j <= bl; j++) prev[j] = j;\n for (let i = 1; i <= al; i++) {\n curr[0] = i;\n let rowMin = curr[0];\n for (let j = 1; j <= bl; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);\n if (curr[j] < rowMin) rowMin = curr[j];\n }\n if (rowMin > max) return max + 1;\n [prev, curr] = [curr, prev];\n }\n return prev[bl]!;\n};\n\n/** Best fuzzy window: slide a query-length window over the stripped page text,\n * anchoring on the query's first token to keep it cheap, and return the start\n * index of the lowest-distance window within tolerance (or -1). */\nconst fuzzyFind = (\n haystack: string,\n needle: string,\n maxDistance: number,\n): number => {\n const len = needle.length;\n if (len === 0) return -1;\n const anchor = needle.slice(0, Math.min(8, len));\n let best = -1;\n let bestDist = maxDistance + 1;\n let from = 0;\n // Probe near every occurrence of the anchor, plus a small slop window.\n while (true) {\n const at = haystack.indexOf(anchor, from);\n if (at === -1) break;\n for (let offset = -2; offset <= 2; offset++) {\n const start = at + offset;\n if (start < 0 || start + len > haystack.length) continue;\n const window = haystack.slice(start, start + len);\n const dist = boundedLevenshtein(needle, window, bestDist - 1);\n if (dist < bestDist) {\n bestDist = dist;\n best = start;\n if (dist === 0) return best;\n }\n }\n from = at + 1;\n }\n return bestDist <= maxDistance ? best : -1;\n};\n\n/**\n * The result of {@link getTextPosition}.\n *\n * @category Type\n */\nexport interface TextPositionMatch {\n /** Scaled position of the matched text, ready to use as a highlight position. */\n position: ScaledPosition;\n /** 1-indexed page the match was found on. */\n pageNumber: number;\n /** The exact document text that was matched. */\n matchedText: string;\n /** \"exact\" = whitespace-insensitive verbatim, \"fuzzy\" = approximate match. */\n confidence: \"exact\" | \"fuzzy\";\n}\n\ninterface RawTextItem {\n text: string;\n rect: LTWHP;\n}\n\n/** Build per-character rects for a raw [start,end) range over concatenated items,\n * splitting partial items proportionally and merging rects on the same line. */\nconst rectsForRange = (\n items: RawTextItem[],\n itemStarts: number[],\n start: number,\n end: number,\n pageNumber: number,\n): LTWHP[] => {\n const rects: LTWHP[] = [];\n for (let k = 0; k < items.length; k++) {\n const itemStart = itemStarts[k]!;\n const item = items[k]!;\n const len = item.text.length;\n if (len === 0) continue;\n const itemEnd = itemStart + len;\n const a = Math.max(start, itemStart);\n const b = Math.min(end, itemEnd);\n if (b <= a) continue;\n const { left, top, width, height } = item.rect;\n if (!(width > 0) || !(height > 0)) continue;\n const s = (a - itemStart) / len;\n const e = (b - itemStart) / len;\n rects.push({\n left: left + s * width,\n top,\n width: (e - s) * width,\n height,\n pageNumber,\n });\n }\n // Merge rects that sit on the same line and are horizontally contiguous.\n rects.sort((p, q) => p.top - q.top || p.left - q.left);\n const merged: LTWHP[] = [];\n for (const r of rects) {\n const last = merged[merged.length - 1];\n if (\n last &&\n Math.abs(last.top - r.top) < Math.max(2, r.height * 0.4) &&\n r.left - (last.left + last.width) < Math.max(4, r.height * 0.6)\n ) {\n const right = Math.max(last.left + last.width, r.left + r.width);\n last.left = Math.min(last.left, r.left);\n last.width = right - last.left;\n last.height = Math.max(last.height, r.height);\n } else {\n merged.push({ ...r });\n }\n }\n return merged;\n};\n\n/**\n * Locate a piece of text in the PDF and return its precise position — the rects\n * of the exact phrase (sub-item, per-line), not a whole sentence. Use it to turn\n * an external quote / citation into a highlight you can render or scroll to.\n *\n * Robust to PDF quirks: matching ignores whitespace (so line-wraps and spacing\n * differences don't matter) and falls back to bounded fuzzy matching for minor\n * differences (hyphenation, OCR, slight paraphrase). Returns the first match\n * (optionally restrict the page range), or null.\n *\n * @category Utility\n */\nexport const getTextPosition = async (\n pdfDocument: PDFDocumentProxy,\n query: string,\n options: { pages?: \"all\" | number[]; fuzzy?: boolean } = {},\n): Promise<TextPositionMatch | null> => {\n const { stripped: needle } = stripWhitespaceWithMap(query);\n if (!needle) return null;\n const allowFuzzy = options.fuzzy ?? true;\n const maxDistance = Math.max(2, Math.floor(needle.length * 0.15));\n\n const pages = await extractPageTextItems(pdfDocument, {\n pages: options.pages ?? \"all\",\n });\n\n for (const page of pages) {\n const items: RawTextItem[] = page.textItems\n .filter((it) => it.text)\n .map((it) => ({ text: it.text, rect: it.rect }));\n if (items.length === 0) continue;\n\n // Raw concatenation + per-item start offsets (no inserted separators).\n const itemStarts: number[] = [];\n let raw = \"\";\n for (const it of items) {\n itemStarts.push(raw.length);\n raw += it.text;\n }\n\n const { stripped, map } = stripWhitespaceWithMap(raw);\n let at = stripped.indexOf(needle);\n let confidence: \"exact\" | \"fuzzy\" = \"exact\";\n if (at === -1 && allowFuzzy) {\n at = fuzzyFind(stripped, needle, maxDistance);\n confidence = \"fuzzy\";\n }\n if (at === -1) continue;\n\n const rawStart = map[at]!;\n const rawEnd = map[Math.min(at + needle.length - 1, map.length - 1)]! + 1;\n const rects = rectsForRange(\n items,\n itemStarts,\n rawStart,\n rawEnd,\n page.pageNumber,\n );\n if (rects.length === 0) continue;\n\n const boundingRect = getBoundingRect(rects);\n return {\n position: {\n boundingRect: viewportToScaled(boundingRect, page),\n rects: rects.map((r) => viewportToScaled(r, page)),\n },\n pageNumber: page.pageNumber,\n matchedText: raw.slice(rawStart, rawEnd),\n confidence,\n };\n }\n\n return null;\n};\n","import { createContext, useContext } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ProcessedOutlineItem, LeftPanelTab, ThumbnailData } from '../types';\n\n/**\n * Utilities and state available within the LeftPanel context\n */\nexport interface LeftPanelUtils {\n // Navigation\n currentPage: number;\n totalPages: number;\n goToPage: (pageNumber: number) => void;\n goToOutlineItem: (item: ProcessedOutlineItem) => void;\n\n // Document info\n pdfDocument: PDFDocumentProxy | null;\n outline: ProcessedOutlineItem[] | null;\n hasOutline: boolean;\n isOutlineLoading: boolean;\n\n // Thumbnails\n thumbnails: Map<number, ThumbnailData>;\n loadThumbnail: (pageNumber: number) => Promise<void>;\n\n // Panel state\n activeTab: LeftPanelTab;\n setActiveTab: (tab: LeftPanelTab) => void;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n}\n\nexport const LeftPanelContext = createContext<LeftPanelUtils | undefined>(\n undefined\n);\n\n/**\n * Hook to access LeftPanel context utilities\n *\n * @throws Error if used outside of LeftPanel\n * @returns LeftPanel utilities\n */\nexport const useLeftPanelContext = (): LeftPanelUtils => {\n const context = useContext(LeftPanelContext);\n if (context === undefined) {\n throw new Error('useLeftPanelContext must be used within LeftPanel');\n }\n return context;\n};\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { OutlineItem, ProcessedOutlineItem } from '../types';\n\ninterface UseDocumentOutlineOptions {\n pdfDocument: PDFDocumentProxy;\n linkService?: { goToDestination: (dest: unknown) => void } | unknown | null;\n goToPage?: (pageNumber: number) => void;\n}\n\ninterface UseDocumentOutlineResult {\n outline: ProcessedOutlineItem[] | null;\n isLoading: boolean;\n error: Error | null;\n navigateToItem: (item: ProcessedOutlineItem) => void;\n flatOutline: ProcessedOutlineItem[];\n hasOutline: boolean;\n}\n\n/**\n * Helper to process outline items recursively and resolve destinations to page numbers\n */\nasync function processOutlineItems(\n pdfDocument: PDFDocumentProxy,\n items: OutlineItem[],\n level: number\n): Promise<ProcessedOutlineItem[]> {\n const processed: ProcessedOutlineItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let pageNumber = 1;\n\n // Resolve destination to page number\n if (item.dest) {\n try {\n const dest =\n typeof item.dest === 'string'\n ? await pdfDocument.getDestination(item.dest)\n : item.dest;\n\n if (dest && Array.isArray(dest) && dest[0]) {\n const pageIndex = await pdfDocument.getPageIndex(dest[0]);\n pageNumber = pageIndex + 1; // Convert to 1-indexed\n }\n } catch {\n // Keep default page 1 if resolution fails\n }\n }\n\n const children = item.items?.length\n ? await processOutlineItems(pdfDocument, item.items, level + 1)\n : [];\n\n processed.push({\n id: `outline-${level}-${i}`,\n title: item.title,\n pageNumber,\n dest: item.dest,\n level,\n bold: item.bold,\n italic: item.italic,\n children,\n });\n }\n\n return processed;\n}\n\n/**\n * Flatten outline tree into a single array for searching\n */\nfunction flattenOutline(items: ProcessedOutlineItem[]): ProcessedOutlineItem[] {\n const result: ProcessedOutlineItem[] = [];\n for (const item of items) {\n result.push(item);\n if (item.children.length) {\n result.push(...flattenOutline(item.children));\n }\n }\n return result;\n}\n\n/**\n * Hook to fetch and process PDF document outline (table of contents)\n *\n * @param options - Configuration options\n * @returns Outline data and navigation utilities\n */\nexport function useDocumentOutline(\n options: UseDocumentOutlineOptions\n): UseDocumentOutlineResult {\n const { pdfDocument, goToPage } = options;\n const [outline, setOutline] = useState<ProcessedOutlineItem[] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchOutline() {\n try {\n setIsLoading(true);\n setError(null);\n\n const rawOutline = await pdfDocument.getOutline();\n\n if (cancelled) return;\n\n if (!rawOutline || rawOutline.length === 0) {\n setOutline([]);\n return;\n }\n\n const processedOutline = await processOutlineItems(\n pdfDocument,\n rawOutline as OutlineItem[],\n 0\n );\n\n if (cancelled) return;\n\n setOutline(processedOutline);\n } catch (err) {\n if (cancelled) return;\n setError(err instanceof Error ? err : new Error('Failed to load outline'));\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchOutline();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDocument]);\n\n const navigateToItem = useCallback(\n (item: ProcessedOutlineItem) => {\n // Use goToPage with resolved pageNumber - reliable and works immediately\n if (goToPage && item.pageNumber) {\n goToPage(item.pageNumber);\n }\n },\n [goToPage]\n );\n\n const flatOutline = useMemo(() => {\n if (!outline) return [];\n return flattenOutline(outline);\n }, [outline]);\n\n const hasOutline = useMemo(() => {\n return outline !== null && outline.length > 0;\n }, [outline]);\n\n return { outline, isLoading, error, navigateToItem, flatOutline, hasOutline };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { ThumbnailData } from '../types';\n\nexport interface UseThumbnailsOptions {\n pdfDocument: PDFDocumentProxy;\n /** Width of generated thumbnails in pixels @default 200 */\n thumbnailWidth?: number;\n /** Maximum number of thumbnails to cache @default 150 */\n cacheSize?: number;\n /** If true, preload all thumbnails on mount. Set to false for large PDFs @default false */\n preloadAll?: boolean;\n /** JPEG quality for thumbnail images (0-1) @default 0.8 */\n imageQuality?: number;\n}\n\nexport interface UseThumbnailsResult {\n getThumbnail: (pageNumber: number) => ThumbnailData;\n loadThumbnail: (pageNumber: number) => Promise<void>;\n preloadThumbnails: (pageNumbers: number[]) => void;\n clearCache: () => void;\n totalPages: number;\n thumbnails: Map<number, ThumbnailData>;\n}\n\n/**\n * Hook for generating and caching PDF page thumbnails.\n * Optimized for large documents with LRU caching and batched state updates.\n *\n * @param options - Configuration options\n * @returns Thumbnail utilities and data\n */\n// Maximum concurrent PDF.js render operations to prevent browser freeze\nconst MAX_CONCURRENT_RENDERS = 3;\n\nexport function useThumbnails(options: UseThumbnailsOptions): UseThumbnailsResult {\n const {\n pdfDocument,\n thumbnailWidth = 200,\n cacheSize = 150, // Increased from 50 for better scrolling experience\n preloadAll = false, // Changed to false - let virtualization control loading\n imageQuality = 0.8,\n } = options;\n\n const [thumbnails, setThumbnails] = useState<Map<number, ThumbnailData>>(\n new Map()\n );\n const loadingRef = useRef<Set<number>>(new Set());\n const loadedRef = useRef<Set<number>>(new Set());\n const cacheOrderRef = useRef<number[]>([]);\n\n // Render queue to limit concurrent operations\n const renderQueueRef = useRef<number[]>([]);\n const activeRendersRef = useRef<number>(0);\n const isProcessingRef = useRef<boolean>(false);\n\n // Store thumbnails in ref for stable getThumbnail callback\n const thumbnailsRef = useRef<Map<number, ThumbnailData>>(thumbnails);\n thumbnailsRef.current = thumbnails;\n\n // Batch state updates to reduce re-renders\n const pendingUpdatesRef = useRef<Map<number, ThumbnailData>>(new Map());\n const flushTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const totalPages = pdfDocument.numPages;\n\n // Flush pending updates to state\n const flushUpdates = useCallback(() => {\n if (pendingUpdatesRef.current.size === 0) return;\n\n setThumbnails((prev) => {\n const next = new Map(prev);\n pendingUpdatesRef.current.forEach((data, pageNumber) => {\n next.set(pageNumber, data);\n\n // Update cache order for loaded thumbnails\n if (data.dataUrl && !data.isLoading) {\n cacheOrderRef.current = cacheOrderRef.current.filter(p => p !== pageNumber);\n cacheOrderRef.current.push(pageNumber);\n\n // Evict oldest entries if cache is full\n while (cacheOrderRef.current.length > cacheSize) {\n const toEvict = cacheOrderRef.current.shift()!;\n next.delete(toEvict);\n loadedRef.current.delete(toEvict);\n }\n }\n });\n pendingUpdatesRef.current.clear();\n return next;\n });\n }, [cacheSize]);\n\n // Queue an update for batching\n const queueUpdate = useCallback((pageNumber: number, data: ThumbnailData) => {\n pendingUpdatesRef.current.set(pageNumber, data);\n\n if (!flushTimeoutRef.current) {\n flushTimeoutRef.current = setTimeout(() => {\n flushTimeoutRef.current = null;\n flushUpdates();\n }, 50); // Batch updates every 50ms\n }\n }, [flushUpdates]);\n\n // Internal function to actually render a thumbnail\n const renderThumbnail = useCallback(\n async (pageNumber: number) => {\n try {\n const page = await pdfDocument.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 1 });\n const scale = thumbnailWidth / viewport.width;\n const scaledViewport = page.getViewport({ scale });\n\n const canvas = document.createElement('canvas');\n canvas.width = scaledViewport.width;\n canvas.height = scaledViewport.height;\n const context = canvas.getContext('2d')!;\n\n await page.render({\n canvasContext: context,\n viewport: scaledViewport,\n }).promise;\n\n // Use JPEG for smaller file size (~50% smaller than PNG)\n const dataUrl = canvas.toDataURL('image/jpeg', imageQuality);\n\n // Free canvas memory immediately\n canvas.width = 0;\n canvas.height = 0;\n\n loadedRef.current.add(pageNumber);\n\n // Queue update for batching (reduces re-renders)\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl,\n isLoading: false,\n });\n } catch (error) {\n console.error(`Failed to load thumbnail for page ${pageNumber}:`, error);\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to load',\n });\n } finally {\n loadingRef.current.delete(pageNumber);\n }\n },\n [pdfDocument, thumbnailWidth, imageQuality, queueUpdate]\n );\n\n // Process render queue with concurrency limit\n const processQueue = useCallback(async () => {\n if (isProcessingRef.current) return;\n isProcessingRef.current = true;\n\n while (renderQueueRef.current.length > 0 && activeRendersRef.current < MAX_CONCURRENT_RENDERS) {\n const pageNumber = renderQueueRef.current.shift()!;\n activeRendersRef.current++;\n\n // Don't await - let multiple renders run concurrently up to the limit\n renderThumbnail(pageNumber).finally(() => {\n activeRendersRef.current--;\n // Recursively process more from queue\n if (renderQueueRef.current.length > 0) {\n isProcessingRef.current = false;\n processQueue();\n }\n });\n }\n\n isProcessingRef.current = false;\n }, [renderThumbnail]);\n\n // Public function to request a thumbnail load\n const loadThumbnail = useCallback(\n async (pageNumber: number) => {\n // Skip if already loading, loaded, or in queue\n if (loadingRef.current.has(pageNumber) || loadedRef.current.has(pageNumber)) {\n return;\n }\n\n // Skip if already in queue\n if (renderQueueRef.current.includes(pageNumber)) {\n return;\n }\n\n loadingRef.current.add(pageNumber);\n\n // Queue loading state for batching (reduces re-renders)\n queueUpdate(pageNumber, {\n pageNumber,\n dataUrl: null,\n isLoading: true,\n });\n\n // Add to queue and process\n renderQueueRef.current.push(pageNumber);\n processQueue();\n },\n [processQueue, queueUpdate]\n );\n\n // Stable getThumbnail using ref (doesn't change when thumbnails updates)\n const getThumbnail = useCallback(\n (pageNumber: number): ThumbnailData => {\n return (\n thumbnailsRef.current.get(pageNumber) || {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n }\n );\n },\n [] // No dependencies - always stable\n );\n\n const preloadThumbnails = useCallback(\n (pageNumbers: number[]) => {\n pageNumbers.forEach((pageNumber) => {\n loadThumbnail(pageNumber);\n });\n },\n [loadThumbnail]\n );\n\n const clearCache = useCallback(() => {\n setThumbnails(new Map());\n cacheOrderRef.current = [];\n loadingRef.current.clear();\n loadedRef.current.clear();\n }, []);\n\n // Preload all thumbnails on mount if enabled (not recommended for large PDFs)\n useEffect(() => {\n if (preloadAll && totalPages > 0) {\n const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1);\n pageNumbers.forEach((pageNumber) => {\n loadThumbnail(pageNumber);\n });\n }\n }, [preloadAll, totalPages, loadThumbnail]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n loadingRef.current.clear();\n // Clear any pending flush timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n };\n }, []);\n\n return {\n getThumbnail,\n loadThumbnail,\n preloadThumbnails,\n clearCache,\n totalPages,\n thumbnails,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\ninterface PDFViewer {\n scrollPageIntoView: (params: { pageNumber: number }) => void;\n pagesCount: number;\n currentPageNumber?: number;\n}\n\ninterface EventBus {\n on: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n off: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n}\n\ninterface UsePageNavigationOptions {\n viewer: PDFViewer | unknown | null;\n eventBus?: EventBus | unknown | null;\n}\n\ninterface UsePageNavigationResult {\n currentPage: number;\n totalPages: number;\n goToPage: (pageNumber: number) => void;\n}\n\n// Type guard for EventBus\nconst isEventBus = (obj: unknown): obj is EventBus => {\n return obj !== null && typeof obj === 'object' && 'on' in obj && 'off' in obj;\n};\n\n// Type guard for PDFViewer\nconst isViewer = (obj: unknown): obj is PDFViewer => {\n return obj !== null && typeof obj === 'object' && 'scrollPageIntoView' in obj;\n};\n\n/**\n * Hook for tracking current page and navigating to pages\n *\n * @param options - Configuration options\n * @returns Page navigation utilities\n */\nexport function usePageNavigation(\n options: UsePageNavigationOptions\n): UsePageNavigationResult {\n const { viewer, eventBus } = options;\n const [currentPage, setCurrentPage] = useState(1);\n\n // Store viewer ref for stable goToPage callback\n const viewerRef = useRef(viewer);\n viewerRef.current = viewer;\n\n // Subscribe to page changes when eventBus is available\n useEffect(() => {\n if (!eventBus || !isEventBus(eventBus)) {\n return;\n }\n\n const handlePageChange = (evt: { pageNumber: number }) => {\n setCurrentPage(evt.pageNumber);\n };\n\n eventBus.on('pagechanging', handlePageChange);\n\n return () => {\n eventBus.off('pagechanging', handlePageChange);\n };\n }, [eventBus]);\n\n // Reset currentPage to 1 when viewer changes (new PDF loaded)\n const prevViewerRef = useRef(viewer);\n useEffect(() => {\n if (viewer !== prevViewerRef.current) {\n setCurrentPage(1);\n prevViewerRef.current = viewer;\n }\n }, [viewer]);\n\n // Stable goToPage callback using ref\n const goToPage = useCallback(\n (pageNumber: number) => {\n const v = viewerRef.current;\n // Try viewer-based navigation first\n if (v && isViewer(v)) {\n const totalPages = v.pagesCount || 0;\n if (pageNumber >= 1 && pageNumber <= totalPages) {\n // Check if viewer container has valid offsetParent (required by PDF.js)\n const container = (v as { container?: HTMLElement }).container;\n if (container && container.offsetParent) {\n try {\n v.scrollPageIntoView({ pageNumber });\n return;\n } catch {\n // Fall through to DOM-based navigation\n }\n }\n }\n }\n\n // Fallback: DOM-based navigation\n // PDF.js renders pages with data-page-number attribute\n const pageElement = document.querySelector(\n `.page[data-page-number=\"${pageNumber}\"]`\n );\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n setCurrentPage(pageNumber);\n }\n },\n [] // No deps - uses refs\n );\n\n const totalPages = viewer && isViewer(viewer) ? viewer.pagesCount || 0 : 0;\n\n return {\n currentPage,\n totalPages,\n goToPage,\n };\n}\n","import React, { useState } from 'react';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport type { ProcessedOutlineItem } from '../../types';\n\n/** Style configuration for outline items */\nexport interface OutlineItemStyles {\n /** Container styles for the item row */\n container?: React.CSSProperties;\n /** Container styles when item is hovered */\n containerHover?: React.CSSProperties;\n /** Container styles when item is active */\n containerActive?: React.CSSProperties;\n /** Expand/collapse button styles */\n expandButton?: React.CSSProperties;\n /** Expand/collapse icon styles */\n expandIcon?: React.CSSProperties;\n /** Active indicator dot styles */\n activeIndicator?: React.CSSProperties;\n /** Title text styles */\n title?: React.CSSProperties;\n /** Title text styles when active */\n titleActive?: React.CSSProperties;\n /** Page number styles */\n pageNumber?: React.CSSProperties;\n /** Page number styles when active */\n pageNumberActive?: React.CSSProperties;\n /** Children container styles */\n childrenContainer?: React.CSSProperties;\n}\n\n/** Class name configuration for outline items (Tailwind-friendly) */\nexport interface OutlineItemClassNames {\n /** Container class for the item row */\n container?: string;\n /** Container class when item is hovered */\n containerHover?: string;\n /** Container class when item is active */\n containerActive?: string;\n /** Expand/collapse button class */\n expandButton?: string;\n /** Expand/collapse icon class */\n expandIcon?: string;\n /** Active indicator dot class */\n activeIndicator?: string;\n /** Title text class */\n title?: string;\n /** Title text class when active */\n titleActive?: string;\n /** Page number class */\n pageNumber?: string;\n /** Page number class when active */\n pageNumberActive?: string;\n /** Children container class */\n childrenContainer?: string;\n}\n\nexport interface OutlineItemProps {\n item: ProcessedOutlineItem;\n currentPage: number;\n onNavigate: (item: ProcessedOutlineItem) => void;\n defaultExpanded?: boolean;\n showExpandIcons?: boolean;\n maxDepth?: number;\n /** Custom styles for the item */\n styles?: OutlineItemStyles;\n /** Custom class names for the item (Tailwind-friendly) */\n classNames?: OutlineItemClassNames;\n renderItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n}\n\nexport interface OutlineItemRenderProps {\n isExpanded: boolean;\n isActive: boolean;\n level: number;\n hasChildren: boolean;\n onToggle: () => void;\n onNavigate: () => void;\n}\n\n/**\n * Recursive outline item component with collapsible children.\n * Clean, modern design with visual hierarchy and smooth interactions.\n */\nexport const OutlineItem: React.FC<OutlineItemProps> = ({\n item,\n currentPage,\n onNavigate,\n defaultExpanded = true,\n showExpandIcons = true,\n maxDepth = 10,\n styles,\n classNames,\n renderItem,\n}) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [isHovered, setIsHovered] = useState(false);\n\n const hasChildren = item.children && item.children.length > 0;\n const isActive = currentPage === item.pageNumber;\n const canShowChildren = item.level < maxDepth;\n\n const handleToggle = () => {\n if (hasChildren) {\n setIsExpanded(!isExpanded);\n }\n };\n\n const handleNavigate = () => {\n onNavigate(item);\n };\n\n const renderProps: OutlineItemRenderProps = {\n isExpanded,\n isActive,\n level: item.level,\n hasChildren,\n onToggle: handleToggle,\n onNavigate: handleNavigate,\n };\n\n // Allow custom rendering\n if (renderItem) {\n return <>{renderItem(item, renderProps)}</>;\n }\n\n // Visual hierarchy based on level\n const indent = 12 + item.level * 16;\n\n // Default styles\n const defaultContainerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n paddingLeft: `${indent}px`,\n cursor: 'pointer',\n position: 'relative',\n transition: 'background-color 0.15s ease',\n backgroundColor: 'transparent',\n borderRadius: '4px',\n margin: '1px 4px',\n };\n\n const defaultExpandButtonStyle: React.CSSProperties = {\n padding: '2px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '3px',\n flexShrink: 0,\n transition: 'background-color 0.15s ease',\n };\n\n const defaultExpandIconStyle: React.CSSProperties = {\n width: 12,\n height: 12,\n color: 'var(--lp-muted, #64748b)',\n };\n\n const defaultActiveIndicatorStyle: React.CSSProperties = {\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: 'var(--lp-accent, #3b82f6)',\n flexShrink: 0,\n };\n\n const defaultTitleStyle: React.CSSProperties = {\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '13px',\n fontWeight: 400,\n fontStyle: item.italic ? 'italic' : 'normal',\n color: 'var(--lp-text, #475569)',\n lineHeight: 1.4,\n };\n\n const defaultTitleActiveStyle: React.CSSProperties = {\n fontWeight: 500,\n color: 'var(--lp-accent, #1e40af)',\n };\n\n const defaultPageNumberStyle: React.CSSProperties = {\n fontSize: '11px',\n color: 'var(--lp-muted, #94a3b8)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n minWidth: '20px',\n textAlign: 'right',\n };\n\n const defaultPageNumberActiveStyle: React.CSSProperties = {\n color: 'var(--lp-accent, #3b82f6)',\n };\n\n const defaultChildrenContainerStyle: React.CSSProperties = {\n position: 'relative',\n };\n\n // Merge styles\n const containerStyle: React.CSSProperties = {\n ...defaultContainerStyle,\n ...styles?.container,\n ...(isHovered && !isActive ? { backgroundColor: 'var(--lp-hover, #f8fafc)', ...styles?.containerHover } : {}),\n ...(isActive ? styles?.containerActive : {}),\n };\n\n const expandButtonStyle: React.CSSProperties = {\n ...defaultExpandButtonStyle,\n ...styles?.expandButton,\n };\n\n const expandIconStyle: React.CSSProperties = {\n ...defaultExpandIconStyle,\n ...styles?.expandIcon,\n };\n\n const activeIndicatorStyle: React.CSSProperties = {\n ...defaultActiveIndicatorStyle,\n ...styles?.activeIndicator,\n };\n\n const titleStyle: React.CSSProperties = {\n ...defaultTitleStyle,\n ...styles?.title,\n ...(isActive ? { ...defaultTitleActiveStyle, ...styles?.titleActive } : {}),\n };\n\n const pageNumberStyle: React.CSSProperties = {\n ...defaultPageNumberStyle,\n ...styles?.pageNumber,\n ...(isActive ? { ...defaultPageNumberActiveStyle, ...styles?.pageNumberActive } : {}),\n };\n\n const childrenContainerStyle: React.CSSProperties = {\n ...defaultChildrenContainerStyle,\n ...styles?.childrenContainer,\n };\n\n // Build class names\n const containerClassName = [\n classNames?.container,\n isHovered && !isActive ? classNames?.containerHover : '',\n isActive ? classNames?.containerActive : '',\n ].filter(Boolean).join(' ');\n\n const titleClassName = [\n classNames?.title,\n isActive ? classNames?.titleActive : '',\n ].filter(Boolean).join(' ');\n\n const pageNumberClassName = [\n classNames?.pageNumber,\n isActive ? classNames?.pageNumberActive : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div className=\"outline-item\">\n <div\n className={containerClassName || undefined}\n style={containerStyle}\n onClick={handleNavigate}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleNavigate();\n }\n }}\n >\n {/* Expand/collapse icon */}\n {showExpandIcons && hasChildren && canShowChildren ? (\n <button\n className={classNames?.expandButton}\n onClick={(e) => {\n e.stopPropagation();\n handleToggle();\n }}\n style={expandButtonStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lp-hover, #e5e7eb)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n {isExpanded ? (\n <ChevronDown className={classNames?.expandIcon} style={expandIconStyle} />\n ) : (\n <ChevronRight className={classNames?.expandIcon} style={expandIconStyle} />\n )}\n </button>\n ) : (\n <div style={{ width: 16, flexShrink: 0 }} />\n )}\n\n {/* Active indicator dot */}\n {isActive && (\n <div className={classNames?.activeIndicator} style={activeIndicatorStyle} />\n )}\n\n {/* Title */}\n <span className={titleClassName || undefined} style={titleStyle} title={item.title}>\n {item.title}\n </span>\n\n {/* Page number */}\n <span className={pageNumberClassName || undefined} style={pageNumberStyle}>\n {item.pageNumber}\n </span>\n </div>\n\n {/* Render children if expanded */}\n {hasChildren && isExpanded && canShowChildren && (\n <div className={classNames?.childrenContainer} style={childrenContainerStyle}>\n {item.children.map((child) => (\n <OutlineItem\n key={child.id}\n item={child}\n currentPage={currentPage}\n onNavigate={onNavigate}\n defaultExpanded={defaultExpanded}\n showExpandIcons={showExpandIcons}\n maxDepth={maxDepth}\n styles={styles}\n classNames={classNames}\n renderItem={renderItem}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Loader2, FileQuestion } from 'lucide-react';\nimport { OutlineItem, OutlineItemRenderProps, OutlineItemStyles, OutlineItemClassNames } from './OutlineItem';\nimport type { ProcessedOutlineItem } from '../../types';\n\n/** Style configuration for DocumentOutline */\nexport interface DocumentOutlineStyles {\n /** Container styles */\n container?: React.CSSProperties;\n /** Loading state container styles */\n loadingContainer?: React.CSSProperties;\n /** Loading spinner styles */\n loadingSpinner?: React.CSSProperties;\n /** Loading text styles */\n loadingText?: React.CSSProperties;\n /** Empty state container styles */\n emptyContainer?: React.CSSProperties;\n /** Empty state icon container styles */\n emptyIconContainer?: React.CSSProperties;\n /** Empty state icon styles */\n emptyIcon?: React.CSSProperties;\n /** Empty state title styles */\n emptyTitle?: React.CSSProperties;\n /** Empty state description styles */\n emptyDescription?: React.CSSProperties;\n}\n\n/** Class name configuration for DocumentOutline (Tailwind-friendly) */\nexport interface DocumentOutlineClassNames {\n /** Container class */\n container?: string;\n /** Loading state container class */\n loadingContainer?: string;\n /** Loading spinner class */\n loadingSpinner?: string;\n /** Loading text class */\n loadingText?: string;\n /** Empty state container class */\n emptyContainer?: string;\n /** Empty state icon container class */\n emptyIconContainer?: string;\n /** Empty state icon class */\n emptyIcon?: string;\n /** Empty state title class */\n emptyTitle?: string;\n /** Empty state description class */\n emptyDescription?: string;\n}\n\nexport interface DocumentOutlineProps {\n /** Processed outline data */\n outline: ProcessedOutlineItem[] | null;\n /** Whether outline is still loading */\n isLoading?: boolean;\n /** Current page number for highlighting */\n currentPage?: number;\n /** Callback when outline item is clicked */\n onNavigate: (item: ProcessedOutlineItem) => void;\n /** Show expand/collapse icons */\n showExpandIcons?: boolean;\n /** Default expanded state for all items */\n defaultExpanded?: boolean;\n /** Maximum depth to render */\n maxDepth?: number;\n /** Custom class name */\n className?: string;\n /** Custom styles for the outline */\n styles?: DocumentOutlineStyles;\n /** Custom class names for the outline (Tailwind-friendly) */\n classNames?: DocumentOutlineClassNames;\n /** Custom styles for outline items */\n itemStyles?: OutlineItemStyles;\n /** Custom class names for outline items (Tailwind-friendly) */\n itemClassNames?: OutlineItemClassNames;\n /** Custom item renderer */\n renderItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Loading content */\n loadingContent?: React.ReactNode;\n}\n\n/**\n * Document outline (table of contents) component.\n * Displays a hierarchical, navigable table of contents for the PDF.\n */\nexport const DocumentOutline: React.FC<DocumentOutlineProps> = ({\n outline,\n isLoading = false,\n currentPage = 1,\n onNavigate,\n showExpandIcons = true,\n defaultExpanded = true,\n maxDepth = 10,\n className = '',\n styles,\n classNames,\n itemStyles,\n itemClassNames,\n renderItem,\n emptyContent,\n loadingContent,\n}) => {\n // Default styles\n const defaultLoadingContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 16px',\n };\n\n const defaultLoadingSpinnerStyle: React.CSSProperties = {\n width: 28,\n height: 28,\n color: 'var(--lp-muted, #94a3b8)',\n marginBottom: 12,\n animation: 'spin 1s linear infinite',\n };\n\n const defaultLoadingTextStyle: React.CSSProperties = {\n fontSize: 13,\n color: 'var(--lp-muted, #64748b)',\n };\n\n const defaultEmptyContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 20px',\n };\n\n const defaultEmptyIconContainerStyle: React.CSSProperties = {\n width: 56,\n height: 56,\n borderRadius: '50%',\n backgroundColor: 'var(--lp-hover, #f1f5f9)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 16,\n };\n\n const defaultEmptyIconStyle: React.CSSProperties = {\n width: 28,\n height: 28,\n color: 'var(--lp-muted, #94a3b8)',\n };\n\n const defaultEmptyTitleStyle: React.CSSProperties = {\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--lp-text, #475569)',\n marginBottom: 4,\n };\n\n const defaultEmptyDescriptionStyle: React.CSSProperties = {\n fontSize: 13,\n color: 'var(--lp-muted, #94a3b8)',\n textAlign: 'center',\n };\n\n const defaultContainerStyle: React.CSSProperties = {\n paddingTop: '8px',\n paddingBottom: '8px',\n };\n\n // Loading state\n if (isLoading) {\n return (\n <div\n className={[className, classNames?.loadingContainer].filter(Boolean).join(' ') || undefined}\n style={{ ...defaultLoadingContainerStyle, ...styles?.loadingContainer }}\n >\n {loadingContent || (\n <>\n <Loader2 className={classNames?.loadingSpinner} style={{ ...defaultLoadingSpinnerStyle, ...styles?.loadingSpinner }} />\n <p className={classNames?.loadingText} style={{ ...defaultLoadingTextStyle, ...styles?.loadingText }}>Loading outline...</p>\n </>\n )}\n </div>\n );\n }\n\n // Empty state\n if (!outline || outline.length === 0) {\n return (\n <div\n className={[className, classNames?.emptyContainer].filter(Boolean).join(' ') || undefined}\n style={{ ...defaultEmptyContainerStyle, ...styles?.emptyContainer }}\n >\n {emptyContent || (\n <>\n <div className={classNames?.emptyIconContainer} style={{ ...defaultEmptyIconContainerStyle, ...styles?.emptyIconContainer }}>\n <FileQuestion className={classNames?.emptyIcon} style={{ ...defaultEmptyIconStyle, ...styles?.emptyIcon }} />\n </div>\n <p className={classNames?.emptyTitle} style={{ ...defaultEmptyTitleStyle, ...styles?.emptyTitle }}>\n No outline available\n </p>\n <p className={classNames?.emptyDescription} style={{ ...defaultEmptyDescriptionStyle, ...styles?.emptyDescription }}>\n This document doesn't have a table of contents\n </p>\n </>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={['document-outline', className, classNames?.container].filter(Boolean).join(' ')}\n style={{ ...defaultContainerStyle, ...styles?.container }}\n >\n {outline.map((item) => (\n <OutlineItem\n key={item.id}\n item={item}\n currentPage={currentPage}\n onNavigate={onNavigate}\n defaultExpanded={defaultExpanded}\n showExpandIcons={showExpandIcons}\n maxDepth={maxDepth}\n styles={itemStyles}\n classNames={itemClassNames}\n renderItem={renderItem}\n />\n ))}\n </div>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Loader2, AlertCircle } from 'lucide-react';\nimport type { ThumbnailData } from '../../types';\n\nexport interface ThumbnailItemProps {\n pageNumber: number;\n thumbnail: ThumbnailData;\n isActive: boolean;\n onLoad: (pageNumber: number) => void;\n onClick: (pageNumber: number) => void;\n showPageNumber?: boolean;\n className?: string;\n}\n\n/**\n * Single thumbnail item with lazy loading via IntersectionObserver.\n * Clean, minimal design with smooth hover and active states.\n * Memoized to prevent unnecessary re-renders in virtualized lists.\n */\nexport const ThumbnailItem = React.memo<ThumbnailItemProps>(({\n pageNumber,\n thumbnail,\n isActive,\n onLoad,\n onClick,\n showPageNumber = true,\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const hasLoadedRef = useRef(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Lazy load thumbnail when visible\n useEffect(() => {\n const element = containerRef.current;\n if (!element || hasLoadedRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !hasLoadedRef.current) {\n hasLoadedRef.current = true;\n onLoad(pageNumber);\n observer.disconnect();\n }\n });\n },\n {\n rootMargin: '200px',\n threshold: 0.1,\n }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [pageNumber, onLoad]);\n\n const handleClick = () => {\n onClick(pageNumber);\n };\n\n // Dynamic styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '6px',\n cursor: 'pointer',\n borderRadius: '6px',\n transition: 'all 0.15s ease',\n backgroundColor: isActive ? 'rgba(59, 130, 246, 0.08)' : isHovered ? 'rgba(0, 0, 0, 0.03)' : 'transparent',\n border: isActive ? '2px solid #3b82f6' : '2px solid transparent',\n };\n\n // Image wrapper - width 90%, height auto with aspect ratio\n const imageContainerStyle: React.CSSProperties = {\n position: 'relative',\n width: '85%',\n aspectRatio: '8.5 / 11', // Standard page aspect ratio\n backgroundColor: 'var(--lp-bg, #ffffff)',\n borderRadius: '4px',\n overflow: 'hidden',\n boxShadow: isActive\n ? '0 4px 12px rgba(59, 130, 246, 0.25)'\n : isHovered\n ? '0 4px 12px rgba(0, 0, 0, 0.12)'\n : '0 1px 3px rgba(0, 0, 0, 0.08)',\n transition: 'box-shadow 0.15s ease',\n };\n\n const pageNumberStyle: React.CSSProperties = {\n marginTop: '6px',\n fontSize: '11px',\n fontWeight: 500,\n color: isActive ? 'var(--lp-accent, #3b82f6)' : 'var(--lp-muted, #6b7280)',\n transition: 'color 0.15s ease',\n };\n\n return (\n <div\n ref={containerRef}\n className={`thumbnail-item ${className}`}\n style={containerStyle}\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n aria-label={`Page ${pageNumber}${isActive ? ' (current)' : ''}`}\n aria-current={isActive ? 'page' : undefined}\n >\n {/* Thumbnail image container */}\n <div style={imageContainerStyle}>\n {/* Loading state */}\n {thumbnail.isLoading && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--lp-hover, #f9fafb)',\n }}\n >\n <Loader2\n style={{\n width: 24,\n height: 24,\n color: 'var(--lp-muted, #9ca3af)',\n animation: 'spin 1s linear infinite',\n }}\n />\n </div>\n )}\n\n {/* Error state */}\n {thumbnail.error && !thumbnail.isLoading && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#fef2f2',\n }}\n >\n <AlertCircle style={{ width: 20, height: 20, color: '#f87171', marginBottom: 4 }} />\n <span style={{ fontSize: 10, color: '#9ca3af' }}>Failed</span>\n </div>\n )}\n\n {/* Thumbnail image */}\n {thumbnail.dataUrl && !thumbnail.isLoading && (\n <img\n src={thumbnail.dataUrl}\n alt={`Page ${pageNumber}`}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n }}\n draggable={false}\n />\n )}\n\n {/* Placeholder when not yet loaded */}\n {!thumbnail.dataUrl && !thumbnail.isLoading && !thumbnail.error && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--lp-hover, #f9fafb)',\n }}\n >\n <span\n style={{\n fontSize: 24,\n fontWeight: 300,\n color: 'var(--lp-muted, #d1d5db)',\n }}\n >\n {pageNumber}\n </span>\n </div>\n )}\n </div>\n\n {/* Page number label */}\n {showPageNumber && (\n <div style={pageNumberStyle}>\n {pageNumber}\n </div>\n )}\n </div>\n );\n});\n","import React, { useRef, useEffect } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { ThumbnailItem } from './ThumbnailItem';\nimport type { ThumbnailData } from '../../types';\n\nexport interface ThumbnailPanelProps {\n /** Total number of pages */\n totalPages: number;\n /** Current page number for highlighting */\n currentPage: number;\n /** Thumbnails map for reactive updates (when thumbnails load, this changes) */\n thumbnails: Map<number, ThumbnailData>;\n /** Function to load a thumbnail */\n loadThumbnail: (pageNumber: number) => Promise<void>;\n /** Callback when thumbnail is clicked */\n onPageSelect: (pageNumber: number) => void;\n /** Show page numbers under thumbnails */\n showPageNumbers?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom thumbnail renderer */\n renderThumbnail?: (\n pageNumber: number,\n thumbnail: ThumbnailData,\n isActive: boolean\n ) => React.ReactNode;\n /** Estimated height of each thumbnail item (including gap) */\n estimatedItemHeight?: number;\n /** Number of items to render outside visible area */\n overscan?: number;\n /** Gap between thumbnail items in pixels */\n gap?: number;\n}\n\n/**\n * Panel displaying page thumbnails with virtual scrolling.\n * Optimized for large PDFs (500+ pages) with only visible items rendered in DOM.\n */\nexport const ThumbnailPanel: React.FC<ThumbnailPanelProps> = ({\n totalPages,\n currentPage,\n thumbnails,\n loadThumbnail,\n onPageSelect,\n showPageNumbers = true,\n className = '',\n renderThumbnail,\n estimatedItemHeight = 300,\n overscan = 5,\n gap = 8,\n}) => {\n // Helper to get thumbnail data from map with fallback\n const getThumbnail = (pageNumber: number): ThumbnailData => {\n return thumbnails.get(pageNumber) || {\n pageNumber,\n dataUrl: null,\n isLoading: false,\n };\n };\n\n const parentRef = useRef<HTMLDivElement>(null);\n\n // Virtual list for performance with large documents\n // Include gap in the item size calculation\n const virtualizer = useVirtualizer({\n count: totalPages,\n getScrollElement: () => parentRef.current,\n estimateSize: () => estimatedItemHeight + gap,\n overscan,\n });\n\n // Store scrollToIndex in a ref to avoid infinite loop\n // (useVirtualizer returns new object reference each render)\n const scrollToIndexRef = useRef(virtualizer.scrollToIndex);\n scrollToIndexRef.current = virtualizer.scrollToIndex;\n\n // Scroll to current page when it changes (e.g., from PDF viewer navigation)\n useEffect(() => {\n if (currentPage > 0 && currentPage <= totalPages) {\n scrollToIndexRef.current(currentPage - 1, { align: 'center' });\n }\n }, [currentPage, totalPages]);\n\n if (totalPages === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 16px',\n }}\n >\n <p style={{ fontSize: 13, color: 'var(--lp-muted, #9ca3af)' }}>No pages to display</p>\n </div>\n );\n }\n\n return (\n <div\n ref={parentRef}\n className={`thumbnail-panel ${className}`}\n style={{\n height: '100%',\n overflow: 'auto',\n padding: '12px',\n }}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const pageNumber = virtualItem.index + 1;\n const thumbnail = getThumbnail(pageNumber);\n const isActive = currentPage === pageNumber;\n\n return (\n <div\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size - gap}px`,\n transform: `translateY(${virtualItem.start}px)`,\n paddingBottom: `${gap}px`,\n }}\n >\n {renderThumbnail ? (\n <div\n onClick={() => onPageSelect(pageNumber)}\n style={{ cursor: 'pointer', height: '100%' }}\n >\n {renderThumbnail(pageNumber, thumbnail, isActive)}\n </div>\n ) : (\n <ThumbnailItem\n pageNumber={pageNumber}\n thumbnail={thumbnail}\n isActive={isActive}\n onLoad={loadThumbnail}\n onClick={onPageSelect}\n showPageNumber={showPageNumbers}\n />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { List, FileText, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { LeftPanelContext, LeftPanelUtils } from '../../contexts/LeftPanelContext';\nimport { useDocumentOutline } from '../../hooks/useDocumentOutline';\nimport { useThumbnails } from '../../hooks/useThumbnails';\nimport { usePageNavigation } from '../../hooks/usePageNavigation';\nimport { DocumentOutline, DocumentOutlineStyles, DocumentOutlineClassNames } from './DocumentOutline';\nimport { ThumbnailPanel } from './ThumbnailPanel';\nimport type { LeftPanelTab, ProcessedOutlineItem, ThumbnailData } from '../../types';\nimport { OutlineItemRenderProps, OutlineItemStyles, OutlineItemClassNames } from './OutlineItem';\n\ninterface PDFViewer {\n scrollPageIntoView: (params: { pageNumber: number }) => void;\n pagesCount: number;\n currentPageNumber?: number;\n}\n\ninterface PDFLinkService {\n goToDestination: (dest: unknown) => void;\n}\n\ninterface EventBus {\n on: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n off: (event: string, callback: (evt: { pageNumber: number }) => void) => void;\n}\n\n/** Theme configuration for LeftPanel styling */\nexport interface LeftPanelTheme {\n /** Background color of the panel */\n backgroundColor?: string;\n /** Border color */\n borderColor?: string;\n /** Active tab/item accent color */\n accentColor?: string;\n /** Text color */\n textColor?: string;\n /** Muted text color */\n mutedTextColor?: string;\n /** Hover background color */\n hoverBackgroundColor?: string;\n}\n\n/** Style configuration for tab buttons */\nexport interface TabStyles {\n /** Container styles for the tab bar */\n container?: React.CSSProperties;\n /** Tab button styles */\n tab?: React.CSSProperties;\n /** Tab button styles when active */\n tabActive?: React.CSSProperties;\n /** Tab icon styles */\n tabIcon?: React.CSSProperties;\n /** Tab text styles */\n tabText?: React.CSSProperties;\n}\n\n/** Class name configuration for tab buttons (Tailwind-friendly) */\nexport interface TabClassNames {\n /** Container class for the tab bar */\n container?: string;\n /** Tab button class */\n tab?: string;\n /** Tab button class when active */\n tabActive?: string;\n /** Tab icon class */\n tabIcon?: string;\n /** Tab text class */\n tabText?: string;\n}\n\n/** Style configuration for the footer */\nexport interface FooterStyles {\n /** Footer container styles */\n container?: React.CSSProperties;\n /** Footer text styles */\n text?: React.CSSProperties;\n}\n\n/** Class name configuration for the footer (Tailwind-friendly) */\nexport interface FooterClassNames {\n /** Footer container class */\n container?: string;\n /** Footer text class */\n text?: string;\n}\n\n/** Style configuration for the toggle button */\nexport interface ToggleButtonStyles {\n /** Button container styles */\n button?: React.CSSProperties;\n /** Button icon styles */\n icon?: React.CSSProperties;\n}\n\n/** Class name configuration for the toggle button (Tailwind-friendly) */\nexport interface ToggleButtonClassNames {\n /** Button container class */\n button?: string;\n /** Button icon class */\n icon?: string;\n}\n\n// Verso: warm neutrals + indigo accent.\nconst defaultTheme: LeftPanelTheme = {\n backgroundColor: '#ffffff',\n borderColor: '#e6e2da',\n accentColor: '#5b50e6',\n textColor: '#1c1b18',\n mutedTextColor: '#8b8880',\n hoverBackgroundColor: '#f4f2ee',\n};\n\n/** Dark-mode preset, used when `mode=\"dark\"` (warm grays matching the\n * PdfHighlighter dark page palette). Any `theme` prop fields override it. */\nconst defaultDarkTheme: LeftPanelTheme = {\n backgroundColor: '#211f1c',\n borderColor: '#3a3733',\n accentColor: '#7b71f0',\n textColor: '#eae6e0',\n mutedTextColor: '#8b8880',\n hoverBackgroundColor: '#2a2724',\n};\n\nexport interface LeftPanelProps {\n /** PDF document from PdfLoader */\n pdfDocument: PDFDocumentProxy;\n /** PDF viewer instance */\n viewer?: PDFViewer | unknown | null;\n /** PDF link service for navigation */\n linkService?: PDFLinkService | unknown | null;\n /** Event bus for page change events */\n eventBus?: EventBus | unknown | null;\n /** Function to navigate to a page (from pdfHighlighterUtils.goToPage) */\n goToPage?: (pageNumber: number) => void;\n /** Whether panel is open */\n isOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /** Initial active tab */\n defaultTab?: LeftPanelTab;\n /** Which tabs to show */\n tabs?: LeftPanelTab[];\n /** Panel width when open */\n width?: number | string;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Custom outline item renderer */\n renderOutlineItem?: (\n item: ProcessedOutlineItem,\n props: OutlineItemRenderProps\n ) => React.ReactNode;\n /** Custom thumbnail renderer */\n renderThumbnail?: (\n pageNumber: number,\n thumbnail: ThumbnailData,\n isActive: boolean\n ) => React.ReactNode;\n /** Callback when page is selected */\n onPageSelect?: (pageNumber: number) => void;\n /** Thumbnail width */\n thumbnailWidth?: number;\n /** Children for custom content */\n children?: React.ReactNode;\n /** Color scheme. \"dark\" swaps in a dark default palette; `theme` overrides\n * individual colors on top of whichever preset is chosen. @default \"light\" */\n mode?: \"light\" | \"dark\";\n /** Theme customization (merged over the mode preset) */\n theme?: LeftPanelTheme;\n /** Show page count in footer */\n showFooter?: boolean;\n /** Show toggle button */\n showToggleButton?: boolean;\n /** Custom styles for tabs */\n tabStyles?: TabStyles;\n /** Custom class names for tabs (Tailwind-friendly) */\n tabClassNames?: TabClassNames;\n /** Custom styles for footer */\n footerStyles?: FooterStyles;\n /** Custom class names for footer (Tailwind-friendly) */\n footerClassNames?: FooterClassNames;\n /** Custom styles for toggle button */\n toggleButtonStyles?: ToggleButtonStyles;\n /** Custom class names for toggle button (Tailwind-friendly) */\n toggleButtonClassNames?: ToggleButtonClassNames;\n /** Custom styles for document outline */\n outlineStyles?: DocumentOutlineStyles;\n /** Custom class names for document outline (Tailwind-friendly) */\n outlineClassNames?: DocumentOutlineClassNames;\n /** Custom styles for outline items */\n outlineItemStyles?: OutlineItemStyles;\n /** Custom class names for outline items (Tailwind-friendly) */\n outlineItemClassNames?: OutlineItemClassNames;\n}\n\n/**\n * Left panel component with Outline and Thumbnails tabs.\n * Provides a customizable sidebar for PDF navigation with page thumbnails and document outline.\n */\nexport const LeftPanel: React.FC<LeftPanelProps> = ({\n pdfDocument,\n viewer = null,\n linkService = null,\n eventBus = null,\n goToPage: goToPageProp,\n isOpen: controlledIsOpen,\n onOpenChange,\n defaultTab = 'thumbnails',\n tabs = ['outline', 'thumbnails'],\n width = 260,\n className = '',\n style,\n renderOutlineItem,\n renderThumbnail,\n onPageSelect,\n thumbnailWidth = 180,\n children,\n mode = \"light\",\n theme: userTheme,\n showFooter = true,\n showToggleButton = true,\n tabStyles,\n tabClassNames,\n footerStyles,\n footerClassNames,\n toggleButtonStyles,\n toggleButtonClassNames,\n outlineStyles,\n outlineClassNames,\n outlineItemStyles,\n outlineItemClassNames,\n}) => {\n // Merge user theme over the mode preset (dark vs light defaults).\n const theme = useMemo(\n () => ({\n ...(mode === \"dark\" ? defaultDarkTheme : defaultTheme),\n ...userTheme,\n }),\n [mode, userTheme],\n );\n // Internal state for uncontrolled mode\n const [internalIsOpen, setInternalIsOpen] = useState(true);\n const [activeTab, setActiveTab] = useState<LeftPanelTab>(defaultTab);\n\n // Use controlled or uncontrolled open state\n const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n const setIsOpen = useCallback(\n (open: boolean) => {\n if (onOpenChange) {\n onOpenChange(open);\n } else {\n setInternalIsOpen(open);\n }\n },\n [onOpenChange]\n );\n\n // Initialize hooks - order matters: usePageNavigation before useDocumentOutline\n const { thumbnails, loadThumbnail, totalPages } = useThumbnails({\n pdfDocument,\n thumbnailWidth,\n });\n\n const { currentPage, goToPage: goToPageFromHook } = usePageNavigation({\n viewer,\n eventBus,\n });\n\n // Use ref to always get the latest goToPage function\n const goToPagePropRef = useRef(goToPageProp);\n\n // Sync ref with useEffect to ensure it's updated after render\n useEffect(() => {\n goToPagePropRef.current = goToPageProp;\n }, [goToPageProp]);\n\n // Handle page selection - use ref to always get latest goToPage\n const handlePageSelect = useCallback(\n (pageNumber: number) => {\n // Prefer the prop (from pdfHighlighterUtils) if available\n if (goToPagePropRef.current) {\n goToPagePropRef.current(pageNumber);\n } else {\n goToPageFromHook(pageNumber);\n }\n onPageSelect?.(pageNumber);\n },\n [goToPageFromHook, onPageSelect]\n );\n\n const {\n outline,\n isLoading: isOutlineLoading,\n hasOutline,\n navigateToItem,\n } = useDocumentOutline({\n pdfDocument,\n goToPage: handlePageSelect,\n });\n\n // Handle outline item navigation\n const handleOutlineNavigate = useCallback(\n (item: ProcessedOutlineItem) => {\n navigateToItem(item);\n onPageSelect?.(item.pageNumber);\n },\n [navigateToItem, onPageSelect]\n );\n\n // Context value\n const contextValue: LeftPanelUtils = useMemo(\n () => ({\n currentPage,\n totalPages,\n goToPage: handlePageSelect,\n goToOutlineItem: handleOutlineNavigate,\n pdfDocument,\n outline,\n hasOutline,\n isOutlineLoading,\n thumbnails,\n loadThumbnail,\n activeTab,\n setActiveTab,\n isOpen,\n setIsOpen,\n }),\n [\n currentPage,\n totalPages,\n handlePageSelect,\n handleOutlineNavigate,\n pdfDocument,\n outline,\n hasOutline,\n isOutlineLoading,\n thumbnails,\n loadThumbnail,\n activeTab,\n isOpen,\n setIsOpen,\n ]\n );\n\n const panelWidth = typeof width === 'number' ? `${width}px` : width;\n\n // CSS custom properties for theming\n const cssVars = {\n '--lp-bg': theme.backgroundColor,\n '--lp-border': theme.borderColor,\n '--lp-accent': theme.accentColor,\n '--lp-text': theme.textColor,\n '--lp-muted': theme.mutedTextColor,\n '--lp-hover': theme.hoverBackgroundColor,\n } as React.CSSProperties;\n\n return (\n <LeftPanelContext.Provider value={contextValue}>\n {/* Toggle button - placed outside panel for visibility when closed */}\n {showToggleButton && (\n <button\n className={toggleButtonClassNames?.button}\n onClick={() => setIsOpen(!isOpen)}\n style={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n left: isOpen ? `calc(${panelWidth} - 1px)` : '0',\n zIndex: 20,\n width: '24px',\n height: '48px',\n backgroundColor: theme.backgroundColor,\n border: `1px solid ${theme.borderColor}`,\n borderLeft: 'none',\n borderRadius: '0 6px 6px 0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '2px 0 8px rgba(0,0,0,0.08)',\n transition: 'left 0.2s ease-in-out, background-color 0.15s ease',\n ...toggleButtonStyles?.button,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.hoverBackgroundColor || '#f9fafb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = theme.backgroundColor || '#ffffff';\n }}\n aria-label={isOpen ? 'Close panel' : 'Open panel'}\n >\n {isOpen ? (\n <ChevronLeft className={toggleButtonClassNames?.icon} style={{ width: 14, height: 14, color: theme.mutedTextColor, ...toggleButtonStyles?.icon }} />\n ) : (\n <ChevronRight className={toggleButtonClassNames?.icon} style={{ width: 14, height: 14, color: theme.mutedTextColor, ...toggleButtonStyles?.icon }} />\n )}\n </button>\n )}\n\n <div\n className={`left-panel ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.backgroundColor,\n borderRight: `1px solid ${theme.borderColor}`,\n transition: 'width 0.2s ease-in-out, min-width 0.2s ease-in-out',\n position: 'relative',\n width: isOpen ? panelWidth : '0px',\n minWidth: isOpen ? panelWidth : '0px',\n overflow: 'hidden',\n ...cssVars,\n ...style,\n }}\n >\n\n {/* Panel content wrapper */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n overflow: 'hidden',\n width: panelWidth,\n minWidth: panelWidth,\n }}\n >\n {/* Tab headers */}\n {tabs.length > 1 && (\n <div\n className={tabClassNames?.container}\n style={{\n display: 'flex',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n ...tabStyles?.container,\n }}\n >\n {tabs.includes('outline') && (\n <button\n className={[tabClassNames?.tab, activeTab === 'outline' ? tabClassNames?.tabActive : ''].filter(Boolean).join(' ') || undefined}\n onClick={() => setActiveTab('outline')}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '12px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: activeTab === 'outline' ? theme.accentColor : theme.mutedTextColor,\n backgroundColor: activeTab === 'outline' ? `${theme.accentColor}08` : 'transparent',\n borderBottom: activeTab === 'outline' ? `2px solid ${theme.accentColor}` : '2px solid transparent',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n ...tabStyles?.tab,\n ...(activeTab === 'outline' ? tabStyles?.tabActive : {}),\n }}\n >\n <FileText className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={tabStyles?.tabText}>Outline</span>\n </button>\n )}\n {tabs.includes('thumbnails') && (\n <button\n className={[tabClassNames?.tab, activeTab === 'thumbnails' ? tabClassNames?.tabActive : ''].filter(Boolean).join(' ') || undefined}\n onClick={() => setActiveTab('thumbnails')}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '12px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: activeTab === 'thumbnails' ? theme.accentColor : theme.mutedTextColor,\n backgroundColor: activeTab === 'thumbnails' ? `${theme.accentColor}08` : 'transparent',\n borderBottom: activeTab === 'thumbnails' ? `2px solid ${theme.accentColor}` : '2px solid transparent',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n ...tabStyles?.tab,\n ...(activeTab === 'thumbnails' ? tabStyles?.tabActive : {}),\n }}\n >\n <List className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={tabStyles?.tabText}>Pages</span>\n </button>\n )}\n </div>\n )}\n\n {/* Single tab header */}\n {tabs.length === 1 && (\n <div\n className={tabClassNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n ...tabStyles?.container,\n }}\n >\n {tabs[0] === 'outline' ? (\n <>\n <FileText className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, color: theme.mutedTextColor, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={{ fontSize: '13px', fontWeight: 500, color: theme.textColor, ...tabStyles?.tabText }}>Outline</span>\n </>\n ) : (\n <>\n <List className={tabClassNames?.tabIcon} style={{ width: 15, height: 15, color: theme.mutedTextColor, ...tabStyles?.tabIcon }} />\n <span className={tabClassNames?.tabText} style={{ fontSize: '13px', fontWeight: 500, color: theme.textColor, ...tabStyles?.tabText }}>Pages</span>\n </>\n )}\n </div>\n )}\n\n {/* Tab content - scrollable area */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n }}\n >\n {activeTab === 'outline' && tabs.includes('outline') && (\n <DocumentOutline\n outline={outline}\n isLoading={isOutlineLoading}\n currentPage={currentPage}\n onNavigate={handleOutlineNavigate}\n renderItem={renderOutlineItem}\n styles={outlineStyles}\n classNames={outlineClassNames}\n itemStyles={outlineItemStyles}\n itemClassNames={outlineItemClassNames}\n />\n )}\n\n {activeTab === 'thumbnails' && tabs.includes('thumbnails') && (\n <ThumbnailPanel\n totalPages={totalPages}\n currentPage={currentPage}\n thumbnails={thumbnails}\n loadThumbnail={loadThumbnail}\n onPageSelect={handlePageSelect}\n renderThumbnail={renderThumbnail}\n />\n )}\n\n {children}\n </div>\n\n {/* Footer with page info */}\n {showFooter && (\n <div\n className={footerClassNames?.container}\n style={{\n flexShrink: 0,\n borderTop: `1px solid ${theme.borderColor}`,\n padding: '10px 16px',\n backgroundColor: theme.hoverBackgroundColor,\n ...footerStyles?.container,\n }}\n >\n <div\n className={footerClassNames?.text}\n style={{\n fontSize: '12px',\n color: theme.mutedTextColor,\n textAlign: 'center',\n fontWeight: 500,\n ...footerStyles?.text,\n }}\n >\n Page {currentPage} of {totalPages}\n </div>\n </div>\n )}\n </div>\n </div>\n </LeftPanelContext.Provider>\n );\n};\n","import {\n PdfHighlighter,\n PdfHighlighterProps,\n PdfHighlighterTheme,\n} from \"./components/PdfHighlighter\";\nimport {\n TextHighlight,\n TextHighlightProps,\n TextHighlightStyle,\n} from \"./components/TextHighlight\";\nimport {\n MonitoredHighlightContainer,\n MonitoredHighlightContainerProps,\n} from \"./components/MonitoredHighlightContainer\";\nimport {\n AreaHighlight,\n AreaHighlightProps,\n AreaHighlightStyle,\n} from \"./components/AreaHighlight\";\nimport {\n FreetextHighlight,\n FreetextHighlightProps,\n FreetextStyle,\n} from \"./components/FreetextHighlight\";\nimport {\n ImageHighlight,\n ImageHighlightProps,\n} from \"./components/ImageHighlight\";\nimport {\n SignaturePad,\n SignaturePadProps,\n} from \"./components/SignaturePad\";\nimport {\n DrawingCanvas,\n DrawingCanvasProps,\n} from \"./components/DrawingCanvas\";\nimport {\n DrawingHighlight,\n DrawingHighlightProps,\n} from \"./components/DrawingHighlight\";\nimport {\n ShapeCanvas,\n ShapeCanvasProps,\n} from \"./components/ShapeCanvas\";\nimport {\n ShapeHighlight,\n ShapeHighlightProps,\n ShapeStyle,\n} from \"./components/ShapeHighlight\";\nimport { PdfLoader, PdfLoaderProps } from \"./components/PdfLoader\";\nimport {\n HighlightContainerUtils,\n useHighlightContainerContext,\n} from \"./contexts/HighlightContext\";\nimport {\n viewportPositionToScaled,\n scaledPositionToViewport,\n} from \"./lib/coordinates\";\nimport type {\n ExportPdfOptions,\n ExportableHighlight,\n} from \"./lib/export-pdf\";\nimport {\n extractPageTextItems,\n extractSentences,\n extractTextUnits,\n getTextPosition,\n sentenceToHighlight,\n} from \"./lib/extract-sentences\";\nimport type {\n ExtractSentencesOptions,\n PdfColumnDetection,\n PdfExtractedPage,\n PdfReadingOrder,\n PdfSentence,\n PdfSentenceSource,\n TextPositionMatch,\n PdfTextColumn,\n PdfTextUnit,\n PdfTextUnitType,\n PdfTextItem,\n} from \"./lib/extract-sentences\";\n\nimport {\n PdfHighlighterUtils,\n PdfSearchOptions,\n usePdfHighlighterContext,\n} from \"./contexts/PdfHighlighterContext\";\n\n// Left Panel components\nimport {\n LeftPanel,\n LeftPanelProps,\n LeftPanelTheme,\n TabStyles,\n TabClassNames,\n FooterStyles,\n FooterClassNames,\n ToggleButtonStyles,\n ToggleButtonClassNames,\n} from \"./components/leftpanel/LeftPanel\";\nimport {\n DocumentOutline,\n DocumentOutlineProps,\n DocumentOutlineStyles,\n DocumentOutlineClassNames,\n} from \"./components/leftpanel/DocumentOutline\";\nimport {\n ThumbnailPanel,\n ThumbnailPanelProps,\n} from \"./components/leftpanel/ThumbnailPanel\";\nimport {\n ThumbnailItem,\n ThumbnailItemProps,\n} from \"./components/leftpanel/ThumbnailItem\";\nimport {\n OutlineItem,\n OutlineItemProps,\n OutlineItemRenderProps,\n OutlineItemStyles,\n OutlineItemClassNames,\n} from \"./components/leftpanel/OutlineItem\";\nimport {\n LeftPanelUtils,\n useLeftPanelContext,\n} from \"./contexts/LeftPanelContext\";\n\n// Left Panel hooks\nimport { useDocumentOutline } from \"./hooks/useDocumentOutline\";\nimport { useThumbnails } from \"./hooks/useThumbnails\";\nimport { usePageNavigation } from \"./hooks/usePageNavigation\";\n\nconst exportPdf: typeof import(\"./lib/export-pdf\").exportPdf = async (\n ...args\n) => {\n const { exportPdf } = await import(\"./lib/export-pdf\");\n return exportPdf(...args);\n};\n\nexport {\n PdfHighlighter,\n PdfLoader,\n TextHighlight,\n MonitoredHighlightContainer,\n AreaHighlight,\n FreetextHighlight,\n ImageHighlight,\n SignaturePad,\n DrawingCanvas,\n DrawingHighlight,\n ShapeCanvas,\n ShapeHighlight,\n useHighlightContainerContext,\n viewportPositionToScaled,\n scaledPositionToViewport,\n usePdfHighlighterContext,\n exportPdf,\n // Left Panel\n LeftPanel,\n DocumentOutline,\n ThumbnailPanel,\n ThumbnailItem,\n OutlineItem,\n useLeftPanelContext,\n useDocumentOutline,\n useThumbnails,\n usePageNavigation,\n extractPageTextItems,\n extractSentences,\n extractTextUnits,\n getTextPosition,\n sentenceToHighlight,\n};\n\nexport type {\n HighlightContainerUtils,\n PdfHighlighterUtils,\n PdfSearchOptions,\n PdfHighlighterProps,\n PdfHighlighterTheme,\n TextHighlightProps,\n TextHighlightStyle,\n MonitoredHighlightContainerProps,\n AreaHighlightProps,\n AreaHighlightStyle,\n FreetextHighlightProps,\n FreetextStyle,\n ImageHighlightProps,\n SignaturePadProps,\n DrawingCanvasProps,\n DrawingHighlightProps,\n ShapeCanvasProps,\n ShapeHighlightProps,\n ShapeStyle,\n PdfLoaderProps,\n ExportPdfOptions,\n ExportableHighlight,\n ExtractSentencesOptions,\n PdfColumnDetection,\n PdfExtractedPage,\n PdfReadingOrder,\n PdfSentence,\n PdfSentenceSource,\n TextPositionMatch,\n PdfTextColumn,\n PdfTextUnit,\n PdfTextUnitType,\n PdfTextItem,\n // Left Panel types\n LeftPanelProps,\n LeftPanelTheme,\n TabStyles,\n TabClassNames,\n FooterStyles,\n FooterClassNames,\n ToggleButtonStyles,\n ToggleButtonClassNames,\n DocumentOutlineProps,\n DocumentOutlineStyles,\n DocumentOutlineClassNames,\n ThumbnailPanelProps,\n ThumbnailItemProps,\n OutlineItemProps,\n OutlineItemRenderProps,\n OutlineItemStyles,\n OutlineItemClassNames,\n LeftPanelUtils,\n};\nexport * from \"./types\";\n"]}