@monime/pdfio 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewer.d.ts +1 -1
- package/dist/PdfViewer.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/Icons.tsx","../src/lib/PdfViewer.tsx"],"sourcesContent":["type IconProps = {\n size?: number;\n className?: string;\n};\n\nconst Icon = ({\n size = 24,\n className,\n children,\n}: IconProps & { children: React.ReactNode }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n {children}\n </svg>\n);\n\nexport const Icons = {\n ChevronLeft: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n ),\n ChevronRight: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m9 18 6-6-6-6\" />\n </Icon>\n ),\n ZoomIn: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\" />\n <line x1=\"11\" x2=\"11\" y1=\"8\" y2=\"14\" />\n <line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\" />\n </Icon>\n ),\n ZoomOut: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\" />\n <line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\" />\n </Icon>\n ),\n Maximize: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n </Icon>\n ),\n Minimize: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\n </Icon>\n ),\n ArrowLeftRight: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3 4 7l4 4\" />\n <path d=\"M4 7h16\" />\n <path d=\"m16 21 4-4-4-4\" />\n <path d=\"M20 17H4\" />\n </Icon>\n ),\n ArrowUpDown: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </Icon>\n ),\n Loader2: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </Icon>\n ),\n AlertTriangle: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </Icon>\n ),\n FileText: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </Icon>\n ),\n};\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport type { PDFDocumentProxy, RenderTask } from \"pdfjs-dist\";\nimport { Icons } from \"./Icons\";\n\nconst MIN_SCALE = 0.25;\nconst MAX_SCALE = 4;\nconst ZOOM_STEP = 0.25;\nconst PAGE_GAP = 16; // px between pages\nconst PRESETS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4];\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(max, Math.max(min, v));\n}\n\nexport interface WatermarkConfig {\n text: string;\n /** CSS color string — default: \"rgba(0,0,0,0.12)\" */\n color?: string;\n /** Font size in px at scale=1 — default: 28 */\n fontSize?: number;\n /** Rotation angle in degrees — default: -35 */\n angle?: number;\n /** Horizontal gap between repeated labels in px — default: 80 */\n gap?: number;\n /** Font family — default: \"sans-serif\" */\n fontFamily?: string;\n /** Font weight — default: \"600\" */\n fontWeight?: string;\n}\n\nexport interface PDFViewerProps {\n src?: string | ArrayBuffer | URL;\n /** Pass a string for a quick watermark, or a WatermarkConfig for full control. */\n watermark?: string | WatermarkConfig;\n}\n\ntype PageSize = { width: number; height: number };\n\nfunction WatermarkOverlay({\n config,\n width,\n height,\n}: {\n config: WatermarkConfig;\n width: number;\n height: number;\n}) {\n const {\n text,\n color = \"rgba(0,0,0,0.12)\",\n fontSize = 28,\n angle = -35,\n gap = 80,\n fontFamily = \"sans-serif\",\n fontWeight = \"600\",\n } = config;\n\n // Estimate text width so tiles don't overlap horizontally.\n const estimatedTextWidth = text.length * fontSize * 0.55;\n const tileW = estimatedTextWidth + gap;\n const tileH = fontSize * 3;\n // Unique id per text so multiple viewers on the same page don't clash.\n const patternId = `wm-${text.replace(/\\W/g, \"\").slice(0, 12)}-${Math.round(fontSize)}`;\n\n return (\n <svg\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width,\n height,\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n width={width}\n height={height}\n >\n <defs>\n <pattern\n id={patternId}\n x=\"0\"\n y=\"0\"\n width={tileW}\n height={tileH}\n patternUnits=\"userSpaceOnUse\"\n patternTransform={`rotate(${angle}, ${width / 2}, ${height / 2})`}\n >\n <text\n x={tileW / 2}\n y={tileH / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n fontWeight={fontWeight}\n letterSpacing=\"0.05em\"\n >\n {text}\n </text>\n </pattern>\n </defs>\n <rect width={width} height={height} fill={`url(#${patternId})`} />\n </svg>\n );\n}\n\nexport function PDFViewer({ src, watermark }: PDFViewerProps) {\n // ── Refs ────────────────────────────────────────────────────────────────────\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const pageInputRef = useRef<HTMLInputElement>(null);\n const pdfRef = useRef<PDFDocumentProxy | null>(null);\n const pageWrapperRefs = useRef(new Map<number, HTMLDivElement>());\n const canvasRefs = useRef(new Map<number, HTMLCanvasElement>());\n const renderTasksRef = useRef(new Map<number, RenderTask>());\n\n // ── State ───────────────────────────────────────────────────────────────────\n const [numPages, setNumPages] = useState(0);\n const [pageSizes, setPageSizes] = useState<PageSize[]>([]);\n const [currentPage, setCurrentPage] = useState(1);\n const [scale, setScale] = useState(1.0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isEditingPage, setIsEditingPage] = useState(false);\n const [pageInput, setPageInput] = useState(\"\");\n\n // ── Load document + collect page sizes ─────────────────────────────────────\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n if (src === undefined) {\n setLoading(false);\n setError(null);\n setNumPages(0);\n setPageSizes([]);\n setCurrentPage(1);\n return;\n }\n\n setLoading(true);\n setError(null);\n setNumPages(0);\n setPageSizes([]);\n setCurrentPage(1);\n\n try {\n const { GlobalWorkerOptions, getDocument } = await import(\"pdfjs-dist\");\n GlobalWorkerOptions.workerSrc = new URL(\n \"pdfjs-dist/build/pdf.worker.min.mjs\",\n import.meta.url,\n ).toString();\n\n const loadTask = getDocument(src);\n const pdf = await loadTask.promise;\n if (cancelled) {\n void pdf.destroy();\n return;\n }\n\n void pdfRef.current?.destroy();\n pdfRef.current = pdf;\n\n // Collect natural sizes at scale=1 for all pages\n const sizes: PageSize[] = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n if (cancelled) return;\n const p = await pdf.getPage(i);\n const vp = p.getViewport({ scale: 1 });\n sizes.push({ width: vp.width, height: vp.height });\n }\n if (cancelled) return;\n\n setNumPages(pdf.numPages);\n setPageSizes(sizes);\n } catch (e) {\n if (!cancelled)\n setError(e instanceof Error ? e.message : \"Failed to load PDF.\");\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n void load();\n return () => {\n cancelled = true;\n };\n }, [src]);\n\n // ── Render all pages whenever pageSizes or scale changes ───────────────────\n\n useEffect(() => {\n const pdf = pdfRef.current;\n if (!pdf || pageSizes.length === 0) return;\n\n let cancelled = false;\n\n async function renderAll() {\n for (let pageNum = 1; pageNum <= pageSizes.length; pageNum++) {\n if (cancelled) return;\n\n const canvas = canvasRefs.current.get(pageNum);\n if (!canvas) continue;\n\n renderTasksRef.current.get(pageNum)?.cancel();\n\n try {\n const pdfPage = await pdf!.getPage(pageNum);\n if (cancelled) return;\n\n const viewport = pdfPage.getViewport({ scale });\n const dpr = window.devicePixelRatio || 1;\n\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) continue;\n\n const task = pdfPage.render({\n canvas,\n canvasContext: ctx,\n viewport,\n transform: dpr !== 1 ? [dpr, 0, 0, dpr, 0, 0] : undefined,\n });\n renderTasksRef.current.set(pageNum, task);\n await task.promise;\n } catch {\n // cancelled render — ignore\n }\n }\n }\n\n void renderAll();\n\n return () => {\n cancelled = true;\n renderTasksRef.current.forEach((t) => t.cancel());\n renderTasksRef.current.clear();\n };\n }, [pageSizes, scale]);\n\n // ── Scroll listener — track current page ──────────────────────────────────\n\n useEffect(() => {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n\n function update() {\n const mid = container!.scrollTop + container!.clientHeight / 2;\n let found = 1;\n for (let i = 1; i <= pageSizes.length; i++) {\n const el = pageWrapperRefs.current.get(i);\n if (!el) continue;\n if (el.offsetTop <= mid) found = i;\n else break;\n }\n setCurrentPage(found);\n }\n\n update(); // set on mount\n container.addEventListener(\"scroll\", update, { passive: true });\n return () => container.removeEventListener(\"scroll\", update);\n }, [pageSizes.length]);\n\n // ── Fullscreen ──────────────────────────────────────────────────────────────\n\n useEffect(() => {\n function onChange() {\n setIsFullscreen(!!document.fullscreenElement);\n }\n document.addEventListener(\"fullscreenchange\", onChange);\n return () => document.removeEventListener(\"fullscreenchange\", onChange);\n }, []);\n\n // ── Ref callbacks ───────────────────────────────────────────────────────────\n\n const setPageWrapper = useCallback(\n (pageNum: number) => (el: HTMLDivElement | null) => {\n if (el) pageWrapperRefs.current.set(pageNum, el);\n else pageWrapperRefs.current.delete(pageNum);\n },\n [],\n );\n\n const setCanvas = useCallback(\n (pageNum: number) => (el: HTMLCanvasElement | null) => {\n if (el) canvasRefs.current.set(pageNum, el);\n else canvasRefs.current.delete(pageNum);\n },\n [],\n );\n\n // ── Actions ─────────────────────────────────────────────────────────────────\n\n const scrollToPage = useCallback(\n (n: number) => {\n const p = clamp(n, 1, numPages);\n const target = pageWrapperRefs.current.get(p);\n const container = scrollRef.current;\n if (!target || !container) return;\n container.scrollTop = target.offsetTop - PAGE_GAP;\n },\n [numPages],\n );\n\n const zoomTo = useCallback(\n (s: number) => setScale(clamp(s, MIN_SCALE, MAX_SCALE)),\n [],\n );\n\n function fitToWidth() {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n const available = container.clientWidth - PAGE_GAP * 2;\n zoomTo(available / pageSizes[0].width);\n }\n\n function fitToHeight() {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n const available = container.clientHeight - PAGE_GAP * 2;\n zoomTo(available / pageSizes[0].height);\n }\n\n function toggleFullscreen() {\n if (isFullscreen) document.exitFullscreen();\n else containerRef.current?.requestFullscreen();\n }\n\n function startEditingPage() {\n setPageInput(String(currentPage));\n setIsEditingPage(true);\n setTimeout(() => pageInputRef.current?.select(), 0);\n }\n\n function commitPageEdit() {\n const n = parseInt(pageInput, 10);\n if (!isNaN(n)) scrollToPage(n);\n setIsEditingPage(false);\n }\n\n function handlePageKey(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\") commitPageEdit();\n else if (e.key === \"Escape\") setIsEditingPage(false);\n }\n\n const canPrev = currentPage > 1;\n const canNext = currentPage < numPages;\n\n // Normalise the watermark prop into a config object (or undefined).\n const watermarkConfig: WatermarkConfig | undefined =\n watermark === undefined\n ? undefined\n : typeof watermark === \"string\"\n ? { text: watermark }\n : watermark;\n\n // ── Render ──────────────────────────────────────────────────────────────────\n\n return (\n <div\n ref={containerRef}\n className=\"flex h-full flex-col bg-white text-neutral-800 border border-gray-200\"\n >\n {/* ── Toolbar ──────────────────────────────────────────────────────── */}\n <div className=\"flex shrink-0 items-center gap-1 border-b border-neutral-200 bg-white px-3 py-2 shadow-sm\">\n {/* Prev page */}\n <button\n type=\"button\"\n onClick={() => scrollToPage(currentPage - 1)}\n disabled={!canPrev}\n title=\"Previous page\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ChevronLeft size={18} />\n </button>\n\n {/* Page indicator / jump input */}\n {isEditingPage ? (\n <input\n ref={pageInputRef}\n type=\"number\"\n min={1}\n max={numPages}\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onBlur={commitPageEdit}\n onKeyDown={handlePageKey}\n className=\"w-14 rounded-md border border-neutral-300 bg-white px-2 py-0.5 text-center text-sm outline-none focus:border-blue-500\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={numPages > 0 ? startEditingPage : undefined}\n disabled={numPages === 0}\n title=\"Click to jump to page\"\n className=\"flex items-center gap-1 rounded-md px-2 py-0.5 text-sm transition hover:bg-neutral-100 disabled:opacity-40\"\n >\n <span className=\"font-medium tabular-nums\">\n {numPages > 0 ? currentPage : \"—\"}\n </span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"tabular-nums text-neutral-500\">\n {numPages > 0 ? numPages : \"—\"}\n </span>\n </button>\n )}\n\n {/* Next page */}\n <button\n type=\"button\"\n onClick={() => scrollToPage(currentPage + 1)}\n disabled={!canNext}\n title=\"Next page\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ChevronRight size={18} />\n </button>\n\n <div className=\"mx-2 h-5 w-px bg-neutral-200\" />\n\n {/* Zoom out */}\n <button\n type=\"button\"\n onClick={() => zoomTo(scale - ZOOM_STEP)}\n disabled={scale <= MIN_SCALE}\n title=\"Zoom out\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ZoomOut size={16} />\n </button>\n\n {/* Zoom preset dropdown — always shows current value */}\n <select\n value={scale}\n onChange={(e) => zoomTo(parseFloat(e.target.value))}\n title=\"Zoom level\"\n className=\"w-[5.5rem] rounded-md border border-neutral-300 bg-white px-1.5 py-0.5 text-xs text-neutral-700 outline-none focus:border-blue-500\"\n >\n {!PRESETS.some((p) => Math.abs(p - scale) < 0.001) && (\n <option value={scale}>{Math.round(scale * 100)}%</option>\n )}\n {PRESETS.map((v) => (\n <option key={v} value={v}>\n {Math.round(v * 100)}%\n </option>\n ))}\n </select>\n\n {/* Zoom in */}\n <button\n type=\"button\"\n onClick={() => zoomTo(scale + ZOOM_STEP)}\n disabled={scale >= MAX_SCALE}\n title=\"Zoom in\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ZoomIn size={16} />\n </button>\n\n <div className=\"mx-1 h-5 w-px bg-neutral-200\" />\n\n {/* Fit to width */}\n <button\n type=\"button\"\n onClick={fitToWidth}\n disabled={pageSizes.length === 0}\n title=\"Fit to width\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ArrowLeftRight size={15} />\n </button>\n\n {/* Fit to height */}\n <button\n type=\"button\"\n onClick={fitToHeight}\n disabled={pageSizes.length === 0}\n title=\"Fit to height\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ArrowUpDown size={15} />\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Fullscreen */}\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n title={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100\"\n >\n {isFullscreen ? (\n <Icons.Minimize size={16} />\n ) : (\n <Icons.Maximize size={16} />\n )}\n </button>\n </div>\n\n {/* ── Scroll area ──────────────────────────────────────────────────── */}\n <div\n ref={scrollRef}\n className=\"flex-1 overflow-y-auto overflow-x-auto bg-white\"\n >\n {/* Loading */}\n {loading && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 text-neutral-400\">\n <Icons.Loader2 size={32} className=\"animate-spin\" />\n <span className=\"text-sm\">Loading document…</span>\n </div>\n </div>\n )}\n\n {/* Error */}\n {!loading && error && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 rounded-xl border border-red-200 bg-red-50 px-8 py-10 text-red-600\">\n <Icons.AlertTriangle size={32} />\n <p className=\"max-w-xs text-center text-sm\">{error}</p>\n </div>\n </div>\n )}\n\n {/* Empty */}\n {!loading && !error && numPages === 0 && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 text-neutral-300\">\n <Icons.FileText size={48} />\n <span className=\"text-sm\">No document loaded</span>\n </div>\n </div>\n )}\n\n {/* Pages */}\n {!loading && !error && pageSizes.length > 0 && (\n <div\n className=\"flex flex-col items-center py-4\"\n style={{ gap: PAGE_GAP }}\n >\n {pageSizes.map((size, idx) => {\n const pageNum = idx + 1;\n return (\n <div\n key={pageNum}\n ref={setPageWrapper(pageNum)}\n data-page={pageNum}\n className=\"relative flex-shrink-0\"\n style={{\n width: Math.floor(size.width * scale),\n height: Math.floor(size.height * scale),\n }}\n >\n <canvas\n ref={setCanvas(pageNum)}\n className=\"block shadow-md ring-1 ring-black/10\"\n />\n {watermarkConfig && (\n <WatermarkOverlay\n config={{\n ...watermarkConfig,\n fontSize: (watermarkConfig.fontSize ?? 28) * scale,\n gap: (watermarkConfig.gap ?? 80) * scale,\n }}\n width={Math.floor(size.width * scale)}\n height={Math.floor(size.height * scale)}\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/Icons.tsx","../src/lib/PdfViewer.tsx"],"sourcesContent":["type IconProps = {\n size?: number;\n className?: string;\n};\n\nconst Icon = ({\n size = 24,\n className,\n children,\n}: IconProps & { children: React.ReactNode }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n {children}\n </svg>\n);\n\nexport const Icons = {\n ChevronLeft: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n ),\n ChevronRight: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m9 18 6-6-6-6\" />\n </Icon>\n ),\n ZoomIn: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\" />\n <line x1=\"11\" x2=\"11\" y1=\"8\" y2=\"14\" />\n <line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\" />\n </Icon>\n ),\n ZoomOut: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\" />\n <line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\" />\n </Icon>\n ),\n Maximize: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n </Icon>\n ),\n Minimize: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\n </Icon>\n ),\n ArrowLeftRight: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M8 3 4 7l4 4\" />\n <path d=\"M4 7h16\" />\n <path d=\"m16 21 4-4-4-4\" />\n <path d=\"M20 17H4\" />\n </Icon>\n ),\n ArrowUpDown: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </Icon>\n ),\n Loader2: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </Icon>\n ),\n AlertTriangle: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </Icon>\n ),\n FileText: ({ size = 24, className }: IconProps) => (\n <Icon size={size} className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </Icon>\n ),\n};\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport type { PDFDocumentProxy, RenderTask } from \"pdfjs-dist\";\nimport { Icons } from \"./Icons\";\n\nconst MIN_SCALE = 0.25;\nconst MAX_SCALE = 4;\nconst ZOOM_STEP = 0.25;\nconst PAGE_GAP = 16; // px between pages\nconst PRESETS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4];\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(max, Math.max(min, v));\n}\n\nexport interface WatermarkConfig {\n text: string;\n /** CSS color string — default: \"rgba(0,0,0,0.12)\" */\n color?: string;\n /** Font size in px at scale=1 — default: 28 */\n fontSize?: number;\n /** Rotation angle in degrees — default: -35 */\n angle?: number;\n /** Horizontal gap between repeated labels in px — default: 80 */\n gap?: number;\n /** Font family — default: \"sans-serif\" */\n fontFamily?: string;\n /** Font weight — default: \"600\" */\n fontWeight?: string;\n}\n\nexport interface PDFViewerProps {\n src?: string | ArrayBuffer | URL | Blob | File;\n /** Pass a string for a quick watermark, or a WatermarkConfig for full control. */\n watermark?: string | WatermarkConfig;\n}\n\ntype PageSize = { width: number; height: number };\n\nfunction WatermarkOverlay({\n config,\n width,\n height,\n}: {\n config: WatermarkConfig;\n width: number;\n height: number;\n}) {\n const {\n text,\n color = \"rgba(0,0,0,0.12)\",\n fontSize = 28,\n angle = -35,\n gap = 80,\n fontFamily = \"sans-serif\",\n fontWeight = \"600\",\n } = config;\n\n // Estimate text width so tiles don't overlap horizontally.\n const estimatedTextWidth = text.length * fontSize * 0.55;\n const tileW = estimatedTextWidth + gap;\n const tileH = fontSize * 3;\n // Unique id per text so multiple viewers on the same page don't clash.\n const patternId = `wm-${text.replace(/\\W/g, \"\").slice(0, 12)}-${Math.round(fontSize)}`;\n\n return (\n <svg\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width,\n height,\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n width={width}\n height={height}\n >\n <defs>\n <pattern\n id={patternId}\n x=\"0\"\n y=\"0\"\n width={tileW}\n height={tileH}\n patternUnits=\"userSpaceOnUse\"\n patternTransform={`rotate(${angle}, ${width / 2}, ${height / 2})`}\n >\n <text\n x={tileW / 2}\n y={tileH / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n fontWeight={fontWeight}\n letterSpacing=\"0.05em\"\n >\n {text}\n </text>\n </pattern>\n </defs>\n <rect width={width} height={height} fill={`url(#${patternId})`} />\n </svg>\n );\n}\n\nexport function PDFViewer({ src, watermark }: PDFViewerProps) {\n // ── Refs ────────────────────────────────────────────────────────────────────\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const pageInputRef = useRef<HTMLInputElement>(null);\n const pdfRef = useRef<PDFDocumentProxy | null>(null);\n const pageWrapperRefs = useRef(new Map<number, HTMLDivElement>());\n const canvasRefs = useRef(new Map<number, HTMLCanvasElement>());\n const renderTasksRef = useRef(new Map<number, RenderTask>());\n\n // ── State ───────────────────────────────────────────────────────────────────\n const [numPages, setNumPages] = useState(0);\n const [pageSizes, setPageSizes] = useState<PageSize[]>([]);\n const [currentPage, setCurrentPage] = useState(1);\n const [scale, setScale] = useState(1.0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isEditingPage, setIsEditingPage] = useState(false);\n const [pageInput, setPageInput] = useState(\"\");\n\n // ── Load document + collect page sizes ─────────────────────────────────────\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n if (src === undefined) {\n setLoading(false);\n setError(null);\n setNumPages(0);\n setPageSizes([]);\n setCurrentPage(1);\n return;\n }\n\n setLoading(true);\n setError(null);\n setNumPages(0);\n setPageSizes([]);\n setCurrentPage(1);\n\n try {\n const { GlobalWorkerOptions, getDocument } = await import(\"pdfjs-dist\");\n GlobalWorkerOptions.workerSrc = new URL(\n \"pdfjs-dist/build/pdf.worker.min.mjs\",\n import.meta.url,\n ).toString();\n\n if (src instanceof Blob || src instanceof File) {\n src = URL.createObjectURL(src);\n }\n\n const loadTask = getDocument(src);\n const pdf = await loadTask.promise;\n if (cancelled) {\n void pdf.destroy();\n return;\n }\n\n void pdfRef.current?.destroy();\n pdfRef.current = pdf;\n\n // Collect natural sizes at scale=1 for all pages\n const sizes: PageSize[] = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n if (cancelled) return;\n const p = await pdf.getPage(i);\n const vp = p.getViewport({ scale: 1 });\n sizes.push({ width: vp.width, height: vp.height });\n }\n if (cancelled) return;\n\n setNumPages(pdf.numPages);\n setPageSizes(sizes);\n } catch (e) {\n if (!cancelled)\n setError(e instanceof Error ? e.message : \"Failed to load PDF.\");\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n void load();\n return () => {\n cancelled = true;\n };\n }, [src]);\n\n // ── Render all pages whenever pageSizes or scale changes ───────────────────\n\n useEffect(() => {\n const pdf = pdfRef.current;\n if (!pdf || pageSizes.length === 0) return;\n\n let cancelled = false;\n\n async function renderAll() {\n for (let pageNum = 1; pageNum <= pageSizes.length; pageNum++) {\n if (cancelled) return;\n\n const canvas = canvasRefs.current.get(pageNum);\n if (!canvas) continue;\n\n renderTasksRef.current.get(pageNum)?.cancel();\n\n try {\n const pdfPage = await pdf!.getPage(pageNum);\n if (cancelled) return;\n\n const viewport = pdfPage.getViewport({ scale });\n const dpr = window.devicePixelRatio || 1;\n\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) continue;\n\n const task = pdfPage.render({\n canvas,\n canvasContext: ctx,\n viewport,\n transform: dpr !== 1 ? [dpr, 0, 0, dpr, 0, 0] : undefined,\n });\n renderTasksRef.current.set(pageNum, task);\n await task.promise;\n } catch {\n // cancelled render — ignore\n }\n }\n }\n\n void renderAll();\n\n return () => {\n cancelled = true;\n renderTasksRef.current.forEach((t) => t.cancel());\n renderTasksRef.current.clear();\n };\n }, [pageSizes, scale]);\n\n // ── Scroll listener — track current page ──────────────────────────────────\n\n useEffect(() => {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n\n function update() {\n const mid = container!.scrollTop + container!.clientHeight / 2;\n let found = 1;\n for (let i = 1; i <= pageSizes.length; i++) {\n const el = pageWrapperRefs.current.get(i);\n if (!el) continue;\n if (el.offsetTop <= mid) found = i;\n else break;\n }\n setCurrentPage(found);\n }\n\n update(); // set on mount\n container.addEventListener(\"scroll\", update, { passive: true });\n return () => container.removeEventListener(\"scroll\", update);\n }, [pageSizes.length]);\n\n // ── Fullscreen ──────────────────────────────────────────────────────────────\n\n useEffect(() => {\n function onChange() {\n setIsFullscreen(!!document.fullscreenElement);\n }\n document.addEventListener(\"fullscreenchange\", onChange);\n return () => document.removeEventListener(\"fullscreenchange\", onChange);\n }, []);\n\n // ── Ref callbacks ───────────────────────────────────────────────────────────\n\n const setPageWrapper = useCallback(\n (pageNum: number) => (el: HTMLDivElement | null) => {\n if (el) pageWrapperRefs.current.set(pageNum, el);\n else pageWrapperRefs.current.delete(pageNum);\n },\n [],\n );\n\n const setCanvas = useCallback(\n (pageNum: number) => (el: HTMLCanvasElement | null) => {\n if (el) canvasRefs.current.set(pageNum, el);\n else canvasRefs.current.delete(pageNum);\n },\n [],\n );\n\n // ── Actions ─────────────────────────────────────────────────────────────────\n\n const scrollToPage = useCallback(\n (n: number) => {\n const p = clamp(n, 1, numPages);\n const target = pageWrapperRefs.current.get(p);\n const container = scrollRef.current;\n if (!target || !container) return;\n container.scrollTop = target.offsetTop - PAGE_GAP;\n },\n [numPages],\n );\n\n const zoomTo = useCallback(\n (s: number) => setScale(clamp(s, MIN_SCALE, MAX_SCALE)),\n [],\n );\n\n function fitToWidth() {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n const available = container.clientWidth - PAGE_GAP * 2;\n zoomTo(available / pageSizes[0].width);\n }\n\n function fitToHeight() {\n const container = scrollRef.current;\n if (!container || pageSizes.length === 0) return;\n const available = container.clientHeight - PAGE_GAP * 2;\n zoomTo(available / pageSizes[0].height);\n }\n\n function toggleFullscreen() {\n if (isFullscreen) document.exitFullscreen();\n else containerRef.current?.requestFullscreen();\n }\n\n function startEditingPage() {\n setPageInput(String(currentPage));\n setIsEditingPage(true);\n setTimeout(() => pageInputRef.current?.select(), 0);\n }\n\n function commitPageEdit() {\n const n = parseInt(pageInput, 10);\n if (!isNaN(n)) scrollToPage(n);\n setIsEditingPage(false);\n }\n\n function handlePageKey(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\") commitPageEdit();\n else if (e.key === \"Escape\") setIsEditingPage(false);\n }\n\n const canPrev = currentPage > 1;\n const canNext = currentPage < numPages;\n\n // Normalise the watermark prop into a config object (or undefined).\n const watermarkConfig: WatermarkConfig | undefined =\n watermark === undefined\n ? undefined\n : typeof watermark === \"string\"\n ? { text: watermark }\n : watermark;\n\n // ── Render ──────────────────────────────────────────────────────────────────\n\n return (\n <div\n ref={containerRef}\n className=\"flex h-full flex-col bg-white text-neutral-800 border border-gray-200\"\n >\n {/* ── Toolbar ──────────────────────────────────────────────────────── */}\n <div className=\"flex shrink-0 items-center gap-1 border-b border-neutral-200 bg-white px-3 py-2 shadow-sm\">\n {/* Prev page */}\n <button\n type=\"button\"\n onClick={() => scrollToPage(currentPage - 1)}\n disabled={!canPrev}\n title=\"Previous page\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ChevronLeft size={18} />\n </button>\n\n {/* Page indicator / jump input */}\n {isEditingPage ? (\n <input\n ref={pageInputRef}\n type=\"number\"\n min={1}\n max={numPages}\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onBlur={commitPageEdit}\n onKeyDown={handlePageKey}\n className=\"w-14 rounded-md border border-neutral-300 bg-white px-2 py-0.5 text-center text-sm outline-none focus:border-blue-500\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={numPages > 0 ? startEditingPage : undefined}\n disabled={numPages === 0}\n title=\"Click to jump to page\"\n className=\"flex items-center gap-1 rounded-md px-2 py-0.5 text-sm transition hover:bg-neutral-100 disabled:opacity-40\"\n >\n <span className=\"font-medium tabular-nums\">\n {numPages > 0 ? currentPage : \"—\"}\n </span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"tabular-nums text-neutral-500\">\n {numPages > 0 ? numPages : \"—\"}\n </span>\n </button>\n )}\n\n {/* Next page */}\n <button\n type=\"button\"\n onClick={() => scrollToPage(currentPage + 1)}\n disabled={!canNext}\n title=\"Next page\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ChevronRight size={18} />\n </button>\n\n <div className=\"mx-2 h-5 w-px bg-neutral-200\" />\n\n {/* Zoom out */}\n <button\n type=\"button\"\n onClick={() => zoomTo(scale - ZOOM_STEP)}\n disabled={scale <= MIN_SCALE}\n title=\"Zoom out\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ZoomOut size={16} />\n </button>\n\n {/* Zoom preset dropdown — always shows current value */}\n <select\n value={scale}\n onChange={(e) => zoomTo(parseFloat(e.target.value))}\n title=\"Zoom level\"\n className=\"w-[5.5rem] rounded-md border border-neutral-300 bg-white px-1.5 py-0.5 text-xs text-neutral-700 outline-none focus:border-blue-500\"\n >\n {!PRESETS.some((p) => Math.abs(p - scale) < 0.001) && (\n <option value={scale}>{Math.round(scale * 100)}%</option>\n )}\n {PRESETS.map((v) => (\n <option key={v} value={v}>\n {Math.round(v * 100)}%\n </option>\n ))}\n </select>\n\n {/* Zoom in */}\n <button\n type=\"button\"\n onClick={() => zoomTo(scale + ZOOM_STEP)}\n disabled={scale >= MAX_SCALE}\n title=\"Zoom in\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ZoomIn size={16} />\n </button>\n\n <div className=\"mx-1 h-5 w-px bg-neutral-200\" />\n\n {/* Fit to width */}\n <button\n type=\"button\"\n onClick={fitToWidth}\n disabled={pageSizes.length === 0}\n title=\"Fit to width\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ArrowLeftRight size={15} />\n </button>\n\n {/* Fit to height */}\n <button\n type=\"button\"\n onClick={fitToHeight}\n disabled={pageSizes.length === 0}\n title=\"Fit to height\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100 disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <Icons.ArrowUpDown size={15} />\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Fullscreen */}\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n title={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className=\"flex h-8 w-8 items-center justify-center rounded-md transition hover:bg-neutral-100\"\n >\n {isFullscreen ? (\n <Icons.Minimize size={16} />\n ) : (\n <Icons.Maximize size={16} />\n )}\n </button>\n </div>\n\n {/* ── Scroll area ──────────────────────────────────────────────────── */}\n <div\n ref={scrollRef}\n className=\"flex-1 overflow-y-auto overflow-x-auto bg-white\"\n >\n {/* Loading */}\n {loading && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 text-neutral-400\">\n <Icons.Loader2 size={32} className=\"animate-spin\" />\n <span className=\"text-sm\">Loading document…</span>\n </div>\n </div>\n )}\n\n {/* Error */}\n {!loading && error && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 rounded-xl border border-red-200 bg-red-50 px-8 py-10 text-red-600\">\n <Icons.AlertTriangle size={32} />\n <p className=\"max-w-xs text-center text-sm\">{error}</p>\n </div>\n </div>\n )}\n\n {/* Empty */}\n {!loading && !error && numPages === 0 && (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-3 text-neutral-300\">\n <Icons.FileText size={48} />\n <span className=\"text-sm\">No document loaded</span>\n </div>\n </div>\n )}\n\n {/* Pages */}\n {!loading && !error && pageSizes.length > 0 && (\n <div\n className=\"flex flex-col items-center py-4\"\n style={{ gap: PAGE_GAP }}\n >\n {pageSizes.map((size, idx) => {\n const pageNum = idx + 1;\n return (\n <div\n key={pageNum}\n ref={setPageWrapper(pageNum)}\n data-page={pageNum}\n className=\"relative flex-shrink-0\"\n style={{\n width: Math.floor(size.width * scale),\n height: Math.floor(size.height * scale),\n }}\n >\n <canvas\n ref={setCanvas(pageNum)}\n className=\"block shadow-md ring-1 ring-black/10\"\n />\n {watermarkConfig && (\n <WatermarkOverlay\n config={{\n ...watermarkConfig,\n fontSize: (watermarkConfig.fontSize ?? 28) * scale,\n gap: (watermarkConfig.gap ?? 80) * scale,\n }}\n width={Math.floor(size.width * scale)}\n height={Math.floor(size.height * scale)}\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|