@papyrus-sdk/ui-react 0.2.11 → 0.2.14

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":["../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine, PageTheme } from \"@papyrus-sdk/types\";\n\ninterface TopbarProps {\n engine: DocumentEngine;\n showBrand?: boolean;\n brand?: React.ReactNode;\n title?: React.ReactNode;\n showSidebarLeftToggle?: boolean;\n showPageControls?: boolean;\n showZoomControls?: boolean;\n showPageThemeSelector?: boolean;\n showUIToggle?: boolean;\n showUpload?: boolean;\n showSearch?: boolean;\n}\n\nconst Topbar: React.FC<TopbarProps> = ({\n engine,\n showBrand = false,\n brand,\n title,\n showSidebarLeftToggle = true,\n showPageControls = true,\n showZoomControls = true,\n showPageThemeSelector = true,\n showUIToggle = true,\n showUpload = true,\n showSearch = true,\n}) => {\n const {\n currentPage,\n pageCount,\n zoom,\n uiTheme,\n pageTheme,\n setDocumentState,\n accentColor,\n toolDockOpen,\n toggleSidebarLeft,\n toggleSidebarRight,\n triggerScrollToPage,\n } = useViewerStore();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const zoomTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingZoomRef = useRef<number | null>(null);\n const [pageInput, setPageInput] = useState(currentPage.toString());\n const [showPageThemes, setShowPageThemes] = useState(false);\n const [showMobileMenu, setShowMobileMenu] = useState(false);\n const pageDigits = Math.max(2, String(pageCount || 1).length);\n const isDark = uiTheme === \"dark\";\n const canUseDOM = typeof document !== \"undefined\";\n const hasMobileMenu =\n showZoomControls || showPageThemeSelector || showUIToggle || showUpload;\n\n useEffect(() => {\n setPageInput(currentPage.toString());\n }, [currentPage]);\n\n useEffect(\n () => () => {\n if (zoomTimerRef.current) clearTimeout(zoomTimerRef.current);\n },\n []\n );\n\n useEffect(() => {\n if (!hasMobileMenu) setShowMobileMenu(false);\n }, [hasMobileMenu]);\n\n useEffect(() => {\n if (!showMobileMenu || !canUseDOM) return;\n const previousOverflow = document.body.style.overflow;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setShowMobileMenu(false);\n };\n\n document.body.style.overflow = \"hidden\";\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [showMobileMenu, canUseDOM]);\n\n const handleZoom = (delta: number) => {\n const baseZoom = pendingZoomRef.current ?? zoom;\n const nextZoom = Math.max(0.2, Math.min(5, baseZoom + delta));\n pendingZoomRef.current = nextZoom;\n if (zoomTimerRef.current) return;\n\n zoomTimerRef.current = setTimeout(() => {\n zoomTimerRef.current = null;\n const targetZoom = pendingZoomRef.current;\n pendingZoomRef.current = null;\n if (targetZoom == null) return;\n engine.setZoom(targetZoom);\n setDocumentState({ zoom: targetZoom });\n }, 80);\n };\n\n const handlePageChange = (page: number) => {\n if (pageCount <= 0) return;\n const nextPage = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));\n engine.goToPage(nextPage);\n setDocumentState({ currentPage: nextPage });\n triggerScrollToPage(nextPage - 1);\n };\n\n const handleFileUpload = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const file = event.target.files?.[0];\n event.target.value = \"\";\n if (!file) return;\n\n setDocumentState({ isLoaded: false });\n try {\n await engine.load(file);\n setDocumentState({\n isLoaded: true,\n pageCount: engine.getPageCount(),\n currentPage: 1,\n outline: await engine.getOutline(),\n });\n } catch (err) {\n console.error(\"Upload failed\", err);\n setDocumentState({ isLoaded: true });\n }\n };\n\n const toggleToolDock = () => {\n setDocumentState({ toolDockOpen: !toolDockOpen });\n };\n\n const themes: { id: PageTheme; name: string; color: string }[] = [\n { id: \"normal\", name: \"Original\", color: \"bg-white\" },\n { id: \"sepia\", name: \"Sépia\", color: \"bg-[#f4ecd8]\" },\n { id: \"dark\", name: \"Invertido\", color: \"bg-gray-800\" },\n { id: \"high-contrast\", name: \"Contraste\", color: \"bg-black\" },\n ];\n\n const mobileMenuOverlay =\n canUseDOM && hasMobileMenu && showMobileMenu\n ? createPortal(\n <div\n className=\"sm:hidden fixed inset-0 z-[200] bg-black/45\"\n onClick={(event) => {\n if (event.target === event.currentTarget)\n setShowMobileMenu(false);\n }}\n >\n <div\n className={`absolute inset-x-0 bottom-0 rounded-t-2xl border-x border-t p-4 pb-6 shadow-2xl ${\n isDark\n ? \"bg-[#181a1f] border-[#343a46] text-[#e6e9ef]\"\n : \"bg-white border-gray-200 text-gray-900\"\n }`}\n >\n <div className=\"mx-auto mb-4 h-1.5 w-10 rounded-full bg-gray-400/60\" />\n <div className=\"mb-4 flex items-center justify-between\">\n <span\n className={`text-sm font-semibold ${\n isDark ? \"text-gray-100\" : \"text-gray-800\"\n }`}\n >\n Ações rápidas\n </span>\n <button\n className={`p-2 rounded-md ${\n isDark\n ? \"text-[#d9deea] hover:bg-white/10\"\n : \"text-gray-700 hover:bg-gray-100\"\n }`}\n onClick={() => setShowMobileMenu(false)}\n aria-label=\"Fechar menu\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"space-y-3\">\n {showZoomControls && (\n <div\n className={`rounded-xl border p-3 ${\n isDark\n ? \"bg-[#20242d] border-[#3a4252] text-[#e6e9ef]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`mb-2 text-xs ${\n isDark ? \"text-[#b7c0d2]\" : \"text-gray-600\"\n }`}\n >\n Zoom\n </div>\n <div className=\"flex items-center justify-between gap-3\">\n <button\n onClick={() => handleZoom(-0.1)}\n className=\"p-2 rounded-md border\"\n style={{ color: accentColor, borderColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 12H4\"\n />\n </svg>\n </button>\n <span\n className={`text-sm font-semibold ${\n isDark ? \"text-[#e6e9ef]\" : \"text-gray-800\"\n }`}\n >\n {Math.round(zoom * 100)}%\n </span>\n <button\n onClick={() => handleZoom(0.1)}\n className=\"p-2 rounded-md border\"\n style={{ color: accentColor, borderColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {showPageThemeSelector && (\n <div\n className={`rounded-xl border p-3 ${\n isDark\n ? \"bg-[#20242d] border-[#3a4252] text-[#e6e9ef]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`mb-2 text-xs ${\n isDark ? \"text-[#b7c0d2]\" : \"text-gray-600\"\n }`}\n >\n Tema da página\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {themes.map((theme) => (\n <button\n key={theme.id}\n onClick={() => {\n setDocumentState({ pageTheme: theme.id });\n }}\n className={`rounded-lg border px-2 py-2 text-xs font-semibold ${\n pageTheme === theme.id\n ? \"text-white\"\n : isDark\n ? \"text-[#dbe1ed] border-[#49556a]\"\n : \"text-gray-700 border-gray-300\"\n }`}\n style={\n pageTheme === theme.id\n ? {\n backgroundColor: accentColor,\n borderColor: accentColor,\n }\n : undefined\n }\n >\n {theme.name}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {showUIToggle && (\n <button\n onClick={() => {\n setDocumentState({ uiTheme: isDark ? \"light\" : \"dark\" });\n }}\n className={`w-full rounded-xl border px-3 py-3 text-left text-sm font-medium flex items-center gap-2 ${\n isDark\n ? \"bg-[#20242d] border-[#3a4252] text-[#e6e9ef]\"\n : \"bg-gray-50 border-gray-200 text-gray-800\"\n }`}\n >\n <svg\n className=\"w-4 h-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n {isDark ? (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m8-9h1M3 12H2m15.364 6.364l.707.707M5.93 5.93l-.707-.707m12.141 0l-.707.707M5.93 18.07l-.707.707M12 17a5 5 0 100-10 5 5 0 000 10z\"\n />\n ) : (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n )}\n </svg>\n {isDark\n ? \"Mudar para tema claro\"\n : \"Mudar para tema escuro\"}\n </button>\n )}\n\n {showUpload && (\n <button\n onClick={() => {\n setShowMobileMenu(false);\n fileInputRef.current?.click();\n }}\n className=\"w-full rounded-xl px-3 py-3 text-left text-sm font-semibold text-white flex items-center gap-2\"\n style={{ backgroundColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n Upload de arquivo\n </button>\n )}\n </div>\n </div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-topbar papyrus-theme relative h-14 border-b flex items-center px-3 sm:px-4 z-50 transition-colors duration-200 ${\n isDark\n ? \"bg-[#1a1a1a] border-[#333] text-white\"\n : \"bg-white border-gray-200 text-gray-800\"\n }`}\n >\n <div className=\"flex items-center gap-2 min-w-0 z-10\">\n {showSidebarLeftToggle && (\n <button\n onClick={toggleSidebarLeft}\n className={`p-2 rounded-md ${\n isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\n }`}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </button>\n )}\n <button\n onClick={toggleToolDock}\n className={`p-2 rounded-md border transition-colors ${\n toolDockOpen\n ? isDark\n ? \"border-[#335ea8] bg-[#1b2f55] text-[#8fb6ff]\"\n : \"border-blue-300 bg-blue-50 text-blue-700\"\n : isDark\n ? \"border-[#444] bg-[#2a2a2a] hover:bg-[#333]\"\n : \"border-gray-300 bg-white hover:bg-gray-100\"\n }`}\n aria-label={toolDockOpen ? \"Fechar ferramentas\" : \"Abrir ferramentas\"}\n title={toolDockOpen ? \"Fechar ferramentas\" : \"Abrir ferramentas\"}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M16.862 3.487a2.25 2.25 0 013.182 3.182L8.22 18.492a4.5 4.5 0 01-1.897 1.12l-2.692.898.898-2.692a4.5 4.5 0 011.12-1.897L16.862 3.487z\"\n />\n </svg>\n </button>\n\n {showBrand &&\n (brand ?? (\n <span\n className=\"font-bold text-base tracking-tight\"\n style={{ color: accentColor }}\n >\n Papyrus\n <span className={isDark ? \"text-white\" : \"text-gray-900\"}>\n Core\n </span>\n </span>\n ))}\n\n {title && (\n <span\n className={`text-sm font-semibold truncate min-w-0 max-w-[35vw] sm:max-w-[260px] ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n title={typeof title === \"string\" ? title : undefined}\n >\n {title}\n </span>\n )}\n </div>\n\n {(showPageControls || showZoomControls) && (\n <div className=\"absolute left-1/2 -translate-x-1/2 flex items-center gap-3\">\n {showPageControls && (\n <div\n className={`papyrus-control flex items-center rounded-lg p-1 space-x-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <button\n onClick={() => handlePageChange(currentPage - 1)}\n className=\"p-1.5 rounded transition-all hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <input\n type=\"text\"\n className=\"papyrus-input text-center bg-transparent focus:outline-none font-bold text-sm shrink-0\"\n style={{ width: `${pageDigits + 1.75}ch` }}\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onKeyDown={(e) =>\n e.key === \"Enter\" && handlePageChange(parseInt(pageInput))\n }\n onBlur={() => handlePageChange(parseInt(pageInput))}\n />\n <span className=\"opacity-40 px-1\">/</span>\n <span className=\"opacity-80 text-sm\">\n {pageCount > 0 ? pageCount : \"—\"}\n </span>\n <button\n onClick={() => handlePageChange(currentPage + 1)}\n className=\"p-1.5 rounded transition-all hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {showZoomControls && (\n <div\n className={`papyrus-control hidden sm:flex items-center rounded-lg p-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <button\n onClick={() => handleZoom(-0.1)}\n className=\"p-1.5 rounded hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 12H4\"\n />\n </svg>\n </button>\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n onClick={() => handleZoom(0.1)}\n className=\"p-1.5 rounded hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n )}\n\n <div className=\"ml-auto flex items-center gap-2 sm:gap-3 z-10\">\n {showPageThemeSelector && (\n <div className=\"relative hidden sm:block\">\n <button\n onClick={() => setShowPageThemes(!showPageThemes)}\n className={`papyrus-control flex items-center space-x-2 px-3 py-1.5 rounded-md text-xs font-bold border transition-all ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`w-3 h-3 rounded-full border ${\n themes.find((t) => t.id === pageTheme)?.color\n }`}\n />\n <span>TEMA</span>\n </button>\n {showPageThemes && (\n <div\n className={`papyrus-popover absolute top-full right-0 mt-2 w-48 rounded-lg shadow-xl border p-2 z-[60] ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-white border-gray-200\"\n }`}\n >\n {themes.map((theme) => (\n <button\n key={theme.id}\n onClick={() => {\n setDocumentState({ pageTheme: theme.id });\n setShowPageThemes(false);\n }}\n className={`w-full flex items-center space-x-3 px-3 py-2 rounded-md text-sm ${\n pageTheme === theme.id\n ? \"text-white\"\n : isDark\n ? \"hover:bg-white/10 text-gray-300\"\n : \"hover:bg-gray-50 text-gray-700\"\n }`}\n style={\n pageTheme === theme.id\n ? { backgroundColor: accentColor }\n : undefined\n }\n >\n <div\n className={`w-3 h-3 rounded-full border ${theme.color}`}\n />\n <span>{theme.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {showUIToggle && (\n <button\n onClick={() =>\n setDocumentState({ uiTheme: isDark ? \"light\" : \"dark\" })\n }\n className={`hidden sm:inline-flex p-2 rounded-full ${\n isDark\n ? \"bg-yellow-500/10 text-yellow-500\"\n : \"bg-gray-100 text-gray-500\"\n }`}\n >\n {isDark ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z\" />\n </svg>\n )}\n </button>\n )}\n\n {showUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"hidden sm:inline-flex px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\n style={{ backgroundColor: accentColor }}\n >\n UPLOAD\n </button>\n )}\n\n {showSearch && (\n <button\n onClick={() => toggleSidebarRight(\"search\")}\n className={`inline-flex p-2 rounded-md ${\n isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\n }`}\n aria-label=\"Abrir busca\"\n title=\"Buscar\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n )}\n\n {hasMobileMenu && (\n <button\n onClick={() => setShowMobileMenu(true)}\n className={`sm:hidden p-2 rounded-md border ${\n isDark\n ? \"border-[#444] bg-[#2a2a2a] hover:bg-[#333]\"\n : \"border-gray-300 bg-white hover:bg-gray-100\"\n }`}\n aria-label=\"Abrir menu\"\n title=\"Mais opções\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 12h.01M12 12h.01M19 12h.01\"\n />\n </svg>\n </button>\n )}\n\n {showUpload && (\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\".pdf,.epub,.txt\"\n onChange={handleFileUpload}\n />\n )}\n </div>\n {mobileMenuOverlay}\n </div>\n );\n};\n\nexport default Topbar;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine, OutlineItem } from \"@papyrus-sdk/types\";\n\ninterface SidebarLeftProps {\n engine: DocumentEngine;\n}\n\nconst withAlpha = (hex: string, alpha: number) => {\n const normalized = hex.replace(\"#\", \"\").trim();\n const value =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n if (value.length !== 6) return hex;\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nconst Thumbnail: React.FC<{\n engine: DocumentEngine;\n pageIndex: number;\n active: boolean;\n isDark: boolean;\n accentColor: string;\n onClick: () => void;\n}> = ({ engine, pageIndex, active, isDark, accentColor, onClick }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const htmlRef = useRef<HTMLDivElement>(null);\n const accentSoft = withAlpha(accentColor, 0.12);\n const renderTargetType = engine.getRenderTargetType?.() ?? \"canvas\";\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const target = wrapperRef.current;\n if (!target) return;\n if (typeof IntersectionObserver === \"undefined\") {\n setIsVisible(true);\n return;\n }\n const root = target.closest(\".custom-scrollbar\");\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect();\n }\n });\n },\n { root: root ?? null, rootMargin: \"200px\" }\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (renderTargetType === \"element\" || !isVisible) return;\n const target = canvasRef.current;\n if (target) {\n engine.renderPage(pageIndex, target, 0.15).catch((err) => {\n console.error(\"[Papyrus] Thumbnail render failed:\", err);\n });\n }\n }, [engine, pageIndex, renderTargetType, isVisible]);\n\n return (\n <div\n ref={wrapperRef}\n onClick={onClick}\n className={`p-3 cursor-pointer transition-all rounded-lg border-2 ${\n active ? \"shadow-sm\" : \"border-transparent\"\n }`}\n style={\n active\n ? { borderColor: accentColor, backgroundColor: accentSoft }\n : undefined\n }\n >\n <div className=\"flex flex-col items-center\">\n <div\n className={`shadow-lg rounded overflow-hidden mb-2 border ${\n isDark ? \"border-[#333]\" : \"border-gray-200\"\n }`}\n >\n <canvas\n ref={canvasRef}\n className=\"max-w-full h-auto bg-white\"\n style={{\n display: renderTargetType === \"element\" ? \"none\" : \"block\",\n }}\n />\n <div\n ref={htmlRef}\n className=\"bg-white\"\n style={{\n width: 90,\n height: 120,\n display: renderTargetType === \"element\" ? \"block\" : \"none\",\n overflow: \"hidden\",\n }}\n >\n {renderTargetType === \"element\" && (\n <div className=\"w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500\">\n HTML\n </div>\n )}\n </div>\n </div>\n <span\n className={`text-[11px] font-bold ${\n active ? \"\" : isDark ? \"text-gray-500\" : \"text-gray-400\"\n }`}\n style={active ? { color: accentColor } : undefined}\n >\n {pageIndex + 1}\n </span>\n </div>\n </div>\n );\n};\n\nconst OutlineNode: React.FC<{\n item: OutlineItem;\n engine: DocumentEngine;\n isDark: boolean;\n accentColor: string;\n depth?: number;\n}> = ({ item, engine, isDark, accentColor, depth = 0 }) => {\n const { triggerScrollToPage, outlineSearchQuery } = useViewerStore();\n const [expanded, setExpanded] = useState(true);\n const accentSoft = withAlpha(accentColor, 0.2);\n\n const matchesSearch =\n outlineSearchQuery === \"\" ||\n item.title.toLowerCase().includes(outlineSearchQuery.toLowerCase());\n const hasMatchingChildren = item.children?.some((child) =>\n child.title.toLowerCase().includes(outlineSearchQuery.toLowerCase())\n );\n\n if (!matchesSearch && !hasMatchingChildren && outlineSearchQuery !== \"\")\n return null;\n\n const handleClick = () => {\n if (item.pageIndex >= 0) {\n engine.goToPage(item.pageIndex + 1);\n triggerScrollToPage(item.pageIndex);\n }\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={`flex items-center py-1.5 px-3 rounded-md transition-colors group ${\n item.pageIndex >= 0 ? \"cursor-pointer\" : \"cursor-default\"\n } ${isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"}`}\n style={{ paddingLeft: `${depth * 14 + 8}px` }}\n onClick={handleClick}\n >\n {item.children && item.children.length > 0 ? (\n <button\n className={`mr-1 text-gray-400 transition-transform p-1`}\n style={{\n color: accentColor,\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-5\" />\n )}\n <span\n className={`text-[13px] leading-tight font-medium truncate ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n style={\n matchesSearch && outlineSearchQuery\n ? { backgroundColor: accentSoft, color: accentColor }\n : undefined\n }\n >\n {item.title}\n </span>\n </div>\n {expanded && item.children && item.children.length > 0 && (\n <div className=\"flex flex-col\">\n {item.children.map((child, i) => (\n <OutlineNode\n key={i}\n item={child}\n engine={engine}\n isDark={isDark}\n accentColor={accentColor}\n depth={depth + 1}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst SidebarLeft: React.FC<SidebarLeftProps> = ({ engine }) => {\n const {\n pageCount,\n currentPage,\n setDocumentState,\n sidebarLeftOpen,\n uiTheme,\n triggerScrollToPage,\n sidebarLeftTab,\n setSidebarLeftTab,\n outline,\n outlineSearchQuery,\n setOutlineSearch,\n accentColor,\n } = useViewerStore();\n const isDark = uiTheme === \"dark\";\n\n if (!sidebarLeftOpen) return null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-left papyrus-theme absolute left-0 top-0 bottom-0 z-[120] w-[85vw] max-w-72 border-r flex flex-col h-full overflow-hidden transition-colors duration-200 ${\n isDark\n ? \"bg-[#2a2a2a] border-[#3a3a3a]\"\n : \"bg-[#fcfcfc] border-gray-200\"\n }`}\n >\n <div\n className={`p-4 border-b flex flex-col space-y-4 ${\n isDark ? \"border-[#3a3a3a]\" : \"border-gray-100\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <h3\n className={`text-sm font-bold uppercase tracking-widest ${\n isDark ? \"text-gray-100\" : \"text-gray-800\"\n }`}\n >\n {sidebarLeftTab === \"thumbnails\" ? \"Thumbnails\" : \"Sumário\"}\n </h3>\n <button\n onClick={() => setDocumentState({ sidebarLeftOpen: false })}\n className=\"text-gray-400 hover:text-gray-600\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n <div className=\"flex gap-1\">\n <button\n onClick={() => setSidebarLeftTab(\"thumbnails\")}\n className={`p-2 rounded-md ${\n sidebarLeftTab === \"thumbnails\"\n ? isDark\n ? \"bg-white/10 text-white\"\n : \"bg-white shadow-sm border border-gray-200\"\n : \"text-gray-400\"\n }`}\n style={\n sidebarLeftTab === \"thumbnails\" && !isDark\n ? { color: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2 2V6z\"\n />\n </svg>\n </button>\n <button\n onClick={() => setSidebarLeftTab(\"summary\")}\n className={`p-2 rounded-md ${\n sidebarLeftTab === \"summary\"\n ? isDark\n ? \"bg-white/10 text-white\"\n : \"bg-white shadow-sm border border-gray-200\"\n : \"text-gray-400\"\n }`}\n style={\n sidebarLeftTab === \"summary\" && !isDark\n ? { color: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h7\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scrollbar p-3\">\n {sidebarLeftTab === \"thumbnails\" ? (\n <div className=\"space-y-1\">\n {Array.from({ length: pageCount }).map((_, idx) => (\n <Thumbnail\n key={idx}\n engine={engine}\n pageIndex={idx}\n isDark={isDark}\n accentColor={accentColor}\n active={currentPage === idx + 1}\n onClick={() => {\n engine.goToPage(idx + 1);\n setDocumentState({ currentPage: idx + 1 });\n triggerScrollToPage(idx);\n }}\n />\n ))}\n </div>\n ) : (\n <div className=\"flex flex-col space-y-0.5\">\n {outline.map((item, i) => (\n <OutlineNode\n key={i}\n item={item}\n engine={engine}\n isDark={isDark}\n accentColor={accentColor}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\nexport default SidebarLeft;\n","import React, { useState } from \"react\";\nimport { useViewerStore, SearchService } from \"@papyrus-sdk/core\";\nimport { DocumentEngine } from \"@papyrus-sdk/types\";\n\ninterface SidebarRightProps {\n engine: DocumentEngine;\n}\n\nconst withAlpha = (hex: string, alpha: number) => {\n const normalized = hex.replace(\"#\", \"\").trim();\n const value =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n if (value.length !== 6) return hex;\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nconst SidebarRight: React.FC<SidebarRightProps> = ({ engine }) => {\n const {\n sidebarRightOpen,\n sidebarRightTab,\n toggleSidebarRight,\n searchResults,\n activeSearchIndex,\n uiTheme,\n setSearch,\n setDocumentState,\n triggerScrollToPage,\n annotations,\n accentColor,\n } = useViewerStore();\n\n const [query, setQuery] = useState(\"\");\n const [isSearching, setIsSearching] = useState(false);\n const searchService = new SearchService(engine);\n const isDark = uiTheme === \"dark\";\n const accentSoft = withAlpha(accentColor, 0.12);\n const resultsCount = searchResults.length;\n\n const handleSearch = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!query.trim()) {\n setSearch(\"\", []);\n return;\n }\n setIsSearching(true);\n const results = await searchService.search(query);\n setSearch(query, results);\n setIsSearching(false);\n };\n\n if (!sidebarRightOpen) return null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-right papyrus-theme absolute right-0 top-0 bottom-0 z-[120] w-[88vw] max-w-80 border-l flex flex-col h-full transition-colors duration-200 shadow-2xl ${\n isDark ? \"bg-[#1a1a1a] border-[#333]\" : \"bg-white border-gray-200\"\n }`}\n >\n <div\n className={`p-4 border-b flex items-center justify-between shrink-0 ${\n isDark ? \"border-[#333]\" : \"border-gray-100\"\n }`}\n >\n <div className=\"flex space-x-6\">\n <button\n onClick={() => toggleSidebarRight(\"search\")}\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${\n sidebarRightTab === \"search\" ? \"border-b-2\" : \"text-gray-400\"\n }`}\n style={\n sidebarRightTab === \"search\"\n ? { color: accentColor, borderColor: accentColor }\n : undefined\n }\n >\n Busca\n </button>\n <button\n onClick={() => toggleSidebarRight(\"annotations\")}\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${\n sidebarRightTab === \"annotations\" ? \"border-b-2\" : \"text-gray-400\"\n }`}\n style={\n sidebarRightTab === \"annotations\"\n ? { color: accentColor, borderColor: accentColor }\n : undefined\n }\n >\n Notas\n </button>\n </div>\n <button\n onClick={() => toggleSidebarRight()}\n className=\"papyrus-unstyled-button text-gray-400 hover:text-red-500 transition-colors\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 custom-scrollbar bg-opacity-50\">\n {sidebarRightTab === \"search\" ? (\n <div className=\"space-y-4\">\n <form onSubmit={handleSearch} className=\"relative mb-6\">\n <input\n type=\"text\"\n className={`papyrus-input w-full rounded-lg px-4 py-2.5 text-xs outline-none border transition-all shadow-inner font-medium ${\n isDark\n ? \"bg-[#2a2a2a] text-white border-[#444] focus:border-blue-500\"\n : \"bg-gray-100 border-gray-200 focus:bg-white focus:border-blue-400\"\n }`}\n placeholder=\"O que você procura?\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n {resultsCount > 0 && (\n <span className=\"absolute right-9 top-2.5 text-[10px] font-bold text-gray-400\">\n {resultsCount}\n </span>\n )}\n <button\n type=\"submit\"\n className=\"papyrus-unstyled-button absolute right-3 top-2.5 text-gray-400 transition-colors\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2.5}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n </form>\n\n {isSearching && (\n <div className=\"flex flex-col items-center justify-center py-12 space-y-3\">\n <div\n className=\"w-6 h-6 border-2 border-t-transparent rounded-full animate-spin\"\n style={{ borderColor: accentColor }}\n />\n <span className=\"text-[10px] font-bold text-gray-500 uppercase\">\n Varrendo documento...\n </span>\n </div>\n )}\n\n {!isSearching &&\n searchResults.map((res, idx) => (\n <div\n key={idx}\n onClick={() => {\n const page = res.pageIndex + 1;\n engine.goToPage(page);\n setDocumentState({\n activeSearchIndex: idx,\n currentPage: page,\n });\n triggerScrollToPage(res.pageIndex);\n }}\n className={`p-4 rounded-xl border-2 cursor-pointer transition-all group hover:scale-[1.02] ${\n idx === activeSearchIndex\n ? \"shadow-lg\"\n : isDark\n ? \"border-[#333] hover:border-[#555] bg-[#222]\"\n : \"border-gray-50 hover:border-gray-200 bg-gray-50/50 hover:bg-white\"\n }`}\n style={\n idx === activeSearchIndex\n ? {\n borderColor: accentColor,\n backgroundColor: accentSoft,\n }\n : undefined\n }\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span\n className={`text-[10px] font-black uppercase tracking-tighter ${\n idx === activeSearchIndex ? \"\" : \"text-gray-400\"\n }`}\n style={\n idx === activeSearchIndex\n ? { color: accentColor }\n : undefined\n }\n >\n PÁGINA {res.pageIndex + 1}\n </span>\n <svg\n className={`w-3 h-3 transition-transform ${\n idx === activeSearchIndex ? \"\" : \"text-gray-300\"\n }`}\n style={\n idx === activeSearchIndex\n ? { color: accentColor }\n : undefined\n }\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </div>\n <p\n className={`text-[11px] font-medium leading-relaxed italic ${\n isDark ? \"text-gray-400\" : \"text-gray-600\"\n }`}\n >\n ...{res.text}...\n </p>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"text-[9px] font-black text-gray-400 uppercase tracking-[0.2em] mb-6 flex items-center\">\n <span>WORKSET</span>\n <div className=\"flex-1 h-px bg-current ml-3 opacity-10\" />\n </div>\n {annotations.length === 0 ? (\n <div className=\"text-center py-20\">\n <div className=\"w-12 h-12 bg-gray-500/10 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg\n className=\"w-6 h-6 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </div>\n <p className=\"text-[10px] font-bold text-gray-400 uppercase tracking-widest\">\n Sem anotações\n </p>\n </div>\n ) : (\n annotations.map((ann) => (\n <div\n key={ann.id}\n className={`p-4 rounded-xl border group transition-all cursor-pointer ${\n isDark\n ? \"bg-[#222] border-[#333] hover:border-[#444]\"\n : \"bg-white border-gray-100 shadow-sm hover:shadow-md\"\n }`}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <div\n className=\"w-2.5 h-2.5 rounded-full\"\n style={{ backgroundColor: ann.color }}\n />\n <span\n className=\"text-[10px] font-black\"\n style={{ color: accentColor }}\n >\n P{ann.pageIndex + 1}\n </span>\n </div>\n <span className=\"text-[9px] text-gray-400 font-bold\">\n {new Date(ann.createdAt).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </span>\n </div>\n <p\n className={`text-[11px] font-bold uppercase tracking-tight ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n >\n {ann.type}\n </p>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\nexport default SidebarRight;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine } from \"@papyrus-sdk/types\";\nimport PageRenderer from \"./PageRenderer\";\n\ninterface ViewerProps {\n engine: DocumentEngine;\n}\nconst BASE_OVERSCAN = 6;\nconst MIN_ZOOM = 0.2;\nconst MAX_ZOOM = 5;\n\nconst Viewer: React.FC<ViewerProps> = ({ engine }) => {\n const {\n pageCount,\n currentPage,\n zoom,\n activeTool,\n uiTheme,\n scrollToPageSignal,\n setDocumentState,\n accentColor,\n annotationColor,\n setAnnotationColor,\n toolDockOpen,\n } = useViewerStore();\n const isDark = uiTheme === \"dark\";\n const viewerRef = useRef<HTMLDivElement>(null);\n const colorPickerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<Array<HTMLDivElement | null>>([]);\n const intersectionRatiosRef = useRef<Record<number, number>>({});\n const frameRef = useRef<number | null>(null);\n const jumpRef = useRef(false);\n const jumpTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pinchRef = useRef<{\n active: boolean;\n startDistance: number;\n startZoom: number;\n pendingZoom: number | null;\n rafId: number | null;\n }>({\n active: false,\n startDistance: 0,\n startZoom: 1,\n pendingZoom: null,\n rafId: null,\n });\n const [availableWidth, setAvailableWidth] = useState<number | null>(null);\n const [basePageSize, setBasePageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n const [pageSizes, setPageSizes] = useState<\n Record<number, { width: number; height: number }>\n >({});\n const [colorPickerOpen, setColorPickerOpen] = useState(false);\n const isCompact = availableWidth !== null && availableWidth < 820;\n const paddingY = isCompact ? \"py-10\" : \"py-16\";\n const toolDockPosition = isCompact ? \"bottom-4\" : \"bottom-8\";\n const colorPalette = [\n \"#fbbf24\",\n \"#f97316\",\n \"#ef4444\",\n \"#22c55e\",\n \"#06b6d4\",\n \"#3b82f6\",\n \"#8b5cf6\",\n \"#111827\",\n ];\n\n useEffect(() => {\n if (!colorPickerOpen) return;\n const handleClick = (event: MouseEvent) => {\n if (!colorPickerRef.current) return;\n if (!colorPickerRef.current.contains(event.target as Node)) {\n setColorPickerOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [colorPickerOpen]);\n\n useEffect(() => {\n if (!toolDockOpen && colorPickerOpen) setColorPickerOpen(false);\n }, [toolDockOpen, colorPickerOpen]);\n\n useEffect(\n () => () => {\n if (pinchRef.current.rafId != null) {\n cancelAnimationFrame(pinchRef.current.rafId);\n }\n },\n []\n );\n\n useEffect(() => {\n const element = viewerRef.current;\n if (!element) return;\n\n const updateWidth = () => {\n const nextWidth = element.clientWidth;\n if (nextWidth > 0) setAvailableWidth(nextWidth);\n };\n\n updateWidth();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", updateWidth);\n return () => window.removeEventListener(\"resize\", updateWidth);\n }\n\n const observer = new ResizeObserver(() => updateWidth());\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n let active = true;\n if (!pageCount) return;\n const loadBaseSize = async () => {\n try {\n const size = await engine.getPageDimensions(0);\n if (!active || !size.width || !size.height) return;\n setBasePageSize(size);\n } catch {\n // ignore\n }\n };\n loadBaseSize();\n return () => {\n active = false;\n };\n }, [engine, pageCount]);\n\n useEffect(() => {\n if (scrollToPageSignal == null) return;\n const root = viewerRef.current;\n const target = pageRefs.current[scrollToPageSignal];\n if (root) {\n setDocumentState({ currentPage: scrollToPageSignal + 1 });\n jumpRef.current = true;\n if (jumpTimerRef.current) clearTimeout(jumpTimerRef.current);\n\n const previousBehavior = root.style.scrollBehavior;\n root.style.scrollBehavior = \"auto\";\n\n let targetTop: number | null = null;\n if (target) {\n targetTop = target.offsetTop;\n } else if (basePageSize && availableWidth) {\n const fitScale = Math.min(\n 1,\n Math.max(0, availableWidth - 48) / basePageSize.width\n );\n const estimatedPageHeight = basePageSize.height * fitScale * zoom + 64;\n targetTop = Math.max(0, estimatedPageHeight * scrollToPageSignal);\n } else if (pageCount > 1) {\n const maxScroll = Math.max(0, root.scrollHeight - root.clientHeight);\n const ratio = scrollToPageSignal / Math.max(1, pageCount - 1);\n targetTop = Math.max(0, maxScroll * ratio);\n }\n\n if (targetTop != null) {\n root.scrollTop = Math.max(0, targetTop - 12);\n }\n\n requestAnimationFrame(() => {\n root.style.scrollBehavior = previousBehavior;\n });\n\n jumpTimerRef.current = setTimeout(() => {\n jumpRef.current = false;\n }, 250);\n }\n setDocumentState({ scrollToPageSignal: null });\n }, [\n scrollToPageSignal,\n setDocumentState,\n basePageSize,\n availableWidth,\n zoom,\n pageCount,\n ]);\n\n useEffect(() => {\n // Size cache must follow current zoom, otherwise virtual placeholders may jump.\n setPageSizes({});\n }, [zoom]);\n\n useEffect(() => {\n const root = viewerRef.current;\n if (!root) return;\n const flushCurrentPage = () => {\n if (jumpRef.current) return;\n const ratios = intersectionRatiosRef.current;\n const entries = Object.entries(ratios).filter(([, ratio]) => ratio > 0);\n if (!entries.length) return;\n const currentIndex = currentPage - 1;\n const currentRatio = ratios[currentIndex] ?? 0;\n const [bestIndexText, bestRatio] = entries.reduce((best, candidate) =>\n Number(candidate[1]) > Number(best[1]) ? candidate : best\n );\n const bestIndex = Number(bestIndexText);\n if (!Number.isFinite(bestIndex)) return;\n const bestPage = bestIndex + 1;\n // Hysteresis avoids page-number flicker when viewport is between two pages.\n const shouldSwitch =\n bestPage !== currentPage &&\n (currentRatio <= 0 ||\n bestRatio >= currentRatio + 0.1 ||\n bestRatio >= 0.75);\n if (shouldSwitch) setDocumentState({ currentPage: bestPage });\n };\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIndex = parseInt(\n entry.target.getAttribute(\"data-page-index\") || \"0\"\n );\n if (!Number.isFinite(pageIndex)) return;\n intersectionRatiosRef.current[pageIndex] = entry.isIntersecting\n ? entry.intersectionRatio\n : 0;\n });\n if (frameRef.current != null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n flushCurrentPage();\n });\n },\n { root, threshold: [0.25, 0.5, 0.75] }\n );\n\n const pageElements = root.querySelectorAll(\".page-container\");\n pageElements.forEach((el) => observer.observe(el));\n return () => {\n if (frameRef.current != null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n pageElements.forEach((el) => observer.unobserve(el));\n observer.disconnect();\n };\n }, [pageCount, setDocumentState, currentPage]);\n\n const virtualOverscan = zoom > 1.35 ? 4 : BASE_OVERSCAN;\n const virtualAnchor = currentPage - 1;\n const virtualStart = Math.max(0, virtualAnchor - virtualOverscan);\n const virtualEnd = Math.min(pageCount - 1, virtualAnchor + virtualOverscan);\n const fallbackSize = useMemo(() => {\n if (basePageSize && availableWidth) {\n const fitScale = Math.min(\n 1,\n Math.max(0, availableWidth - 48) / basePageSize.width\n );\n return {\n width: Math.round(basePageSize.width * fitScale * zoom),\n height: Math.round(basePageSize.height * fitScale * zoom),\n };\n }\n const base = availableWidth ? Math.max(680, availableWidth * 1.3) : 1100;\n return {\n width: Math.round((availableWidth ?? 860) - 48),\n height: Math.round(base * zoom),\n };\n }, [basePageSize, availableWidth, zoom]);\n const averagePageHeight = useMemo(() => {\n const heights = Object.values(pageSizes).map((size) => size.height);\n if (!heights.length)\n return availableWidth ? Math.max(680, availableWidth * 1.3) : 1100;\n return Math.round(heights.reduce((sum, h) => sum + h, 0) / heights.length);\n }, [pageSizes, availableWidth]);\n const pages = Array.from({ length: pageCount }).map((_, i) => i);\n const handlePageMeasured = (\n pageIndex: number,\n size: { width: number; height: number }\n ) => {\n setPageSizes((prev) => {\n const current = prev[pageIndex];\n if (\n current &&\n current.width === size.width &&\n current.height === size.height\n )\n return prev;\n return { ...prev, [pageIndex]: size };\n });\n };\n const tools = [\n { id: \"select\", name: \"Select\", icon: \"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5\" },\n {\n id: \"highlight\",\n name: \"Highlight\",\n icon: \"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\",\n },\n {\n id: \"underline\",\n name: \"Underline\",\n icon: \"M6 3v6a6 6 0 0012 0V3M4 21h16\",\n },\n {\n id: \"squiggly\",\n name: \"Squiggly\",\n icon: \"M3 17c2-4 4-4 6 0s4 4 6 0 4-4 6 0\",\n },\n { id: \"strikeout\", name: \"Strike\", icon: \"M4 12h16M8 6h8M8 18h8\" },\n { id: \"ink\", name: \"Freehand\", icon: \"M4 19c4-6 7-9 10-9 3 0 5 2 6 5\" },\n {\n id: \"comment\",\n name: \"Note\",\n icon: \"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\",\n },\n ];\n\n const getTouchDistance = (\n touchA: { clientX: number; clientY: number },\n touchB: { clientX: number; clientY: number }\n ) => {\n const dx = touchA.clientX - touchB.clientX;\n const dy = touchA.clientY - touchB.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n };\n\n const flushPinchZoom = () => {\n const nextZoom = pinchRef.current.pendingZoom;\n pinchRef.current.pendingZoom = null;\n pinchRef.current.rafId = null;\n if (nextZoom == null) return;\n engine.setZoom(nextZoom);\n setDocumentState({ zoom: nextZoom });\n };\n\n const handleTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n if (event.touches.length < 2) return;\n const touchA = event.touches[0];\n const touchB = event.touches[1];\n pinchRef.current.active = true;\n pinchRef.current.startDistance = getTouchDistance(touchA, touchB);\n pinchRef.current.startZoom = zoom;\n event.preventDefault();\n };\n\n const handleTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!pinchRef.current.active || event.touches.length < 2) return;\n const touchA = event.touches[0];\n const touchB = event.touches[1];\n const nextDistance = getTouchDistance(touchA, touchB);\n if (!pinchRef.current.startDistance) return;\n const scale = nextDistance / pinchRef.current.startDistance;\n const nextZoom = Math.max(\n MIN_ZOOM,\n Math.min(MAX_ZOOM, pinchRef.current.startZoom * scale)\n );\n pinchRef.current.pendingZoom = nextZoom;\n if (pinchRef.current.rafId == null) {\n pinchRef.current.rafId = requestAnimationFrame(flushPinchZoom);\n }\n event.preventDefault();\n };\n\n const handleTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {\n if (event.touches.length >= 2) return;\n pinchRef.current.active = false;\n pinchRef.current.startDistance = 0;\n pinchRef.current.startZoom = zoom;\n if (\n pinchRef.current.pendingZoom != null &&\n pinchRef.current.rafId == null\n ) {\n engine.setZoom(pinchRef.current.pendingZoom);\n setDocumentState({ zoom: pinchRef.current.pendingZoom });\n pinchRef.current.pendingZoom = null;\n }\n };\n\n return (\n <div\n ref={viewerRef}\n data-papyrus-theme={uiTheme}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={handleTouchEnd}\n className={`papyrus-viewer papyrus-theme min-w-0 w-full flex-1 overflow-y-scroll overflow-x-hidden flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${\n isDark ? \"bg-[#121212]\" : \"bg-[#e9ecef]\"\n }`}\n >\n <div className=\"flex flex-col items-center gap-6 w-full min-w-0\">\n {pages.map((idx) => (\n <div\n key={idx}\n ref={(element) => {\n pageRefs.current[idx] = element;\n }}\n data-page-index={idx}\n className=\"page-container\"\n >\n {idx >= virtualStart && idx <= virtualEnd ? (\n <PageRenderer\n engine={engine}\n pageIndex={idx}\n availableWidth={availableWidth ?? undefined}\n onMeasuredSize={handlePageMeasured}\n />\n ) : (\n <div\n className={`inline-block mb-10 shadow-2xl border ${\n isDark\n ? \"bg-[#0f0f0f] border-[#2b2b2b]\"\n : \"bg-white border-gray-200\"\n }`}\n style={{\n width: pageSizes[idx]?.width ?? fallbackSize.width,\n height:\n pageSizes[idx]?.height ??\n Math.max(fallbackSize.height, averagePageHeight),\n }}\n />\n )}\n </div>\n ))}\n </div>\n {toolDockOpen && (\n <div\n className={`papyrus-tool-dock sticky ${toolDockPosition} w-full flex justify-center pointer-events-none z-[70]`}\n >\n <div\n className={`pointer-events-auto shadow-2xl rounded-2xl p-2 flex items-center border z-[80] ${\n isDark\n ? \"bg-[#2a2a2a]/90 border-[#3a3a3a] backdrop-blur-xl\"\n : \"bg-white/95 border-gray-100 backdrop-blur-md\"\n }`}\n >\n {tools.map((tool) => (\n <button\n key={tool.id}\n title={tool.name}\n aria-label={tool.name}\n onClick={() => setDocumentState({ activeTool: tool.id as any })}\n className={`w-10 h-10 rounded-xl flex items-center justify-center transition-all ${\n activeTool === tool.id\n ? \"text-white shadow-lg\"\n : \"text-gray-400\"\n }`}\n style={\n activeTool === tool.id\n ? { backgroundColor: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={tool.icon}\n />\n </svg>\n </button>\n ))}\n <div className=\"w-px h-7 mx-2 bg-white/10\" />\n <div ref={colorPickerRef} className=\"relative\">\n <button\n title=\"Cor do marcador\"\n aria-label=\"Cor do marcador\"\n onClick={() => setColorPickerOpen((prev) => !prev)}\n className=\"w-9 h-9 rounded-full flex items-center justify-center border transition-all cursor-pointer relative\"\n style={{ borderColor: annotationColor }}\n >\n <span\n className=\"w-5 h-5 rounded-full\"\n style={{ backgroundColor: annotationColor }}\n />\n </button>\n {colorPickerOpen && (\n <div\n className={`absolute bottom-full left-1/2 -translate-x-1/2 mb-3 w-48 rounded-xl border p-3 shadow-2xl overflow-hidden ${\n isDark\n ? \"bg-[#1f1f1f] border-[#333]\"\n : \"bg-white border-gray-200\"\n }`}\n >\n <div className=\"grid grid-cols-4 gap-2 mb-3\">\n {colorPalette.map((color) => (\n <button\n key={color}\n onClick={() => {\n setAnnotationColor(color);\n setColorPickerOpen(false);\n }}\n className=\"w-7 h-7 rounded-full border transition-all\"\n style={{\n backgroundColor: color,\n borderColor:\n color === annotationColor ? \"#fff\" : \"transparent\",\n }}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2 w-full\">\n <span className=\"text-[10px] uppercase tracking-widest text-gray-400 shrink-0\">\n Hex\n </span>\n <input\n type=\"text\"\n value={annotationColor.toUpperCase()}\n onChange={(e) => {\n const next = e.target.value.trim();\n if (\n next.startsWith(\"#\") &&\n (next.length === 4 || next.length === 7)\n ) {\n setAnnotationColor(next);\n }\n }}\n className={`flex-1 min-w-0 w-full text-xs rounded-md px-2 py-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444] text-white\"\n : \"bg-gray-100 border-gray-200 text-gray-700\"\n }`}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\nexport default Viewer;\n","\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useViewerStore, papyrusEvents } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, Annotation, PapyrusEventType } from '@papyrus-sdk/types';\r\n\r\ninterface PageRendererProps {\n engine: DocumentEngine;\n pageIndex: number;\n availableWidth?: number;\n onMeasuredSize?: (pageIndex: number, size: { width: number; height: number }) => void;\n}\n\nconst PageRenderer: React.FC<PageRendererProps> = ({ engine, pageIndex, availableWidth, onMeasuredSize }) => {\n const containerRef = useRef<HTMLDivElement>(null);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const htmlLayerRef = useRef<HTMLDivElement>(null);\r\n const textLayerRef = useRef<HTMLDivElement>(null);\r\n \r\n const [loading, setLoading] = useState(true);\n const [pageSize, setPageSize] = useState<{ width: number; height: number } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\n const [currentRect, setCurrentRect] = useState({ x: 0, y: 0, w: 0, h: 0 });\n const [textLayerVersion, setTextLayerVersion] = useState(0);\n const [selectionMenu, setSelectionMenu] = useState<{\n rects: { x: number; y: number; width: number; height: number }[];\n rect: { x: number; y: number; width: number; height: number };\n text: string;\n anchor: { x: number; y: number };\n } | null>(null);\n const [isInkDrawing, setIsInkDrawing] = useState(false);\n const [inkPoints, setInkPoints] = useState<{ x: number; y: number }[]>([]);\n\r\n const { \n zoom, rotation, pageTheme, scrollToPageSignal, setDocumentState,\n annotations, addAnnotation, activeTool, removeAnnotation, \n selectedAnnotationId, setSelectedAnnotation, accentColor, annotationColor,\n searchQuery, searchResults, activeSearchIndex\n } = useViewerStore();\n const renderTargetType = engine.getRenderTargetType?.() ?? 'canvas';\n const isElementRender = renderTargetType === 'element';\n const textMarkupTools = new Set(['highlight', 'underline', 'squiggly', 'strikeout']);\n const canSelectText = activeTool === 'select' || textMarkupTools.has(activeTool);\n const hasSearchHits = useMemo(\n () => Boolean(searchQuery?.trim()) && searchResults.some((res) => res.pageIndex === pageIndex),\n [searchQuery, searchResults, pageIndex]\n );\n\r\n useEffect(() => {\r\n let active = true;\r\n const loadSize = async () => {\r\n try {\r\n const size = await engine.getPageDimensions(pageIndex);\r\n if (!active) return;\r\n if (size.width > 0 && size.height > 0) {\r\n setPageSize(size);\r\n }\r\n } catch {\r\n // Ignore size errors to avoid blocking rendering.\r\n }\r\n };\r\n loadSize();\r\n return () => { active = false; };\r\n }, [engine, pageIndex]);\r\n\r\n const fitScale = useMemo(() => {\r\n if (!availableWidth || !pageSize?.width) return 1;\r\n const targetWidth = Math.max(0, availableWidth - 48);\r\n if (!targetWidth) return 1;\r\n return Math.min(1, targetWidth / pageSize.width);\r\n }, [availableWidth, pageSize]);\r\n\r\n const displaySize = useMemo(() => {\n if (!pageSize) return null;\n const scale = zoom * fitScale;\n return {\n width: pageSize.width * scale,\n height: pageSize.height * scale,\n };\n }, [pageSize, zoom, fitScale]);\n\n useEffect(() => {\n if (!displaySize || !onMeasuredSize) return;\n onMeasuredSize(pageIndex, {\n width: Math.round(displaySize.width),\n height: Math.round(displaySize.height),\n });\n }, [displaySize, onMeasuredSize, pageIndex]);\n\r\n useEffect(() => {\n if (scrollToPageSignal === pageIndex) {\n setDocumentState({ scrollToPageSignal: null });\n }\n }, [scrollToPageSignal, pageIndex, setDocumentState]);\n\r\n useEffect(() => {\n let active = true;\n const render = async () => {\n const renderTarget = isElementRender ? htmlLayerRef.current : canvasRef.current;\n if (!renderTarget || !textLayerRef.current) return;\n setLoading(true);\n \n try {\n const RENDER_SCALE = 2.0;\n const canvasRenderScale = isElementRender ? 1.0 : RENDER_SCALE * fitScale;\n const textRenderScale = isElementRender ? 1.0 : fitScale;\n if (!isElementRender && canvasRef.current && displaySize) {\n // Apply CSS size before rendering to avoid temporary horizontal jumps.\n canvasRef.current.style.width = `${displaySize.width}px`;\n canvasRef.current.style.height = `${displaySize.height}px`;\n }\n \n // A UI solicita renderização passando o \"alvo\" (Canvas/Div).\n // Ela não sabe se o motor usa PDF.js ou se está gerando um bitmap.\n await engine.renderPage(pageIndex, renderTarget, canvasRenderScale);\n\n if (!isElementRender && !pageSize && canvasRef.current) {\n const denom = canvasRenderScale * Math.max(zoom, 0.01);\n if (denom > 0) {\n setPageSize({\n width: canvasRef.current.width / denom,\n height: canvasRef.current.height / denom,\n });\n }\r\n }\r\n\r\n if (!active || !textLayerRef.current) return;\n if (!isElementRender) {\n textLayerRef.current.innerHTML = '';\n await engine.renderTextLayer(pageIndex, textLayerRef.current, textRenderScale);\n }\n\n if (!active || !textLayerRef.current) return;\n if (!isElementRender && displaySize) {\n if (canvasRef.current) {\n canvasRef.current.style.width = `${displaySize.width}px`;\n canvasRef.current.style.height = `${displaySize.height}px`;\n }\n textLayerRef.current.style.width = `${displaySize.width}px`;\n textLayerRef.current.style.height = `${displaySize.height}px`;\n }\n setTextLayerVersion((v) => v + 1);\n\n } catch (err) {\n if (!active) return;\n console.error(\"[Papyrus] Falha na renderização:\", err);\n } finally {\n if (active) setLoading(false);\n }\n };\n\r\n render();\r\n return () => { active = false; };\r\n }, [engine, pageIndex, zoom, rotation, isElementRender, fitScale, displaySize, pageSize]);\n\n useEffect(() => {\n if (isElementRender) return;\n const layer = textLayerRef.current;\n if (!layer) return;\n const query = searchQuery?.trim().toLowerCase();\n const existingMarks = Array.from(layer.querySelectorAll('mark.papyrus-search-hit')) as HTMLElement[];\n existingMarks.forEach((mark) => {\n const parent = mark.parentNode;\n if (!parent) return;\n while (mark.firstChild) parent.insertBefore(mark.firstChild, mark);\n parent.removeChild(mark);\n parent.normalize();\n });\n if (!query || !hasSearchHits) return;\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(layer, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const text = node.nodeValue ?? '';\n if (!text.trim()) return NodeFilter.FILTER_REJECT;\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n while (walker.nextNode()) {\n nodes.push(walker.currentNode as Text);\n }\n nodes.forEach((textNode) => {\n const text = textNode.nodeValue ?? '';\n const lower = text.toLowerCase();\n if (!lower.includes(query)) return;\n const fragment = document.createDocumentFragment();\n let cursor = 0;\n let index = lower.indexOf(query, cursor);\n while (index !== -1) {\n if (index > cursor) {\n fragment.appendChild(document.createTextNode(text.slice(cursor, index)));\n }\n const mark = document.createElement('mark');\n mark.className = 'papyrus-search-hit';\n mark.textContent = text.slice(index, index + query.length);\n fragment.appendChild(mark);\n cursor = index + query.length;\n index = lower.indexOf(query, cursor);\n }\n if (cursor < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(cursor)));\n }\n const parent = textNode.parentNode;\n if (parent) parent.replaceChild(fragment, textNode);\n });\n }, [searchQuery, hasSearchHits, pageIndex, isElementRender, activeSearchIndex, textLayerVersion]);\n\r\n const handleMouseDown = (e: React.MouseEvent) => {\n setSelectionMenu(null);\n if (activeTool === 'ink') {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n setIsInkDrawing(true);\n setInkPoints([{ x, y }]);\n return;\n }\n if (canSelectText) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\r\n setIsDragging(true);\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n setStartPos({ x, y });\r\n setCurrentRect({ x, y, w: 0, h: 0 });\r\n };\r\n\r\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isInkDrawing) {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n setInkPoints((prev) => [...prev, { x, y }]);\n return;\n }\n if (!isDragging) return;\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n\r\n const currentX = e.clientX - rect.left;\r\n const currentY = e.clientY - rect.top;\r\n\r\n setCurrentRect({\r\n x: Math.min(startPos.x, currentX),\r\n y: Math.min(startPos.y, currentY),\r\n w: Math.abs(currentX - startPos.x),\r\n h: Math.abs(currentY - startPos.y)\r\n });\r\n };\r\n\r\n const handleMouseUp = (e: React.MouseEvent) => {\n if (isInkDrawing) {\n setIsInkDrawing(false);\n if (inkPoints.length > 1) {\n const xs = inkPoints.map((p) => p.x);\n const ys = inkPoints.map((p) => p.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n const width = Math.max(maxX - minX, 0.0005);\n const height = Math.max(maxY - minY, 0.0005);\n const path = inkPoints.map((p) => ({\n x: Math.max(0, Math.min(1, p.x)),\n y: Math.max(0, Math.min(1, p.y)),\n }));\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: 'ink',\n rect: { x: minX, y: minY, width, height },\n path,\n color: annotationColor,\n createdAt: Date.now(),\n });\n }\n setInkPoints([]);\n return;\n }\n\n const selection = window.getSelection();\n const selectionText = selection?.toString().trim() ?? '';\n if (selectionText && textLayerRef.current && containerRef.current && selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (textLayerRef.current.contains(range.commonAncestorContainer)) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects());\n const rects = clientRects\n .filter((r) => r.width > 1 && r.height > 1)\n .map((r) => {\n const x = (r.left - containerRect.left) / containerRect.width;\n const y = (r.top - containerRect.top) / containerRect.height;\n const width = r.width / containerRect.width;\n const height = r.height / containerRect.height;\n return {\n x: Math.max(0, Math.min(1, x)),\n y: Math.max(0, Math.min(1, y)),\n width: Math.max(0, Math.min(1, width)),\n height: Math.max(0, Math.min(1, height)),\n };\n });\n const uniqueRects = rects.filter((rect, index, list) => {\n const key = `${Math.round(rect.x * 10000)}-${Math.round(rect.y * 10000)}-${Math.round(rect.width * 10000)}-${Math.round(rect.height * 10000)}`;\n return list.findIndex((r) => `${Math.round(r.x * 10000)}-${Math.round(r.y * 10000)}-${Math.round(r.width * 10000)}-${Math.round(r.height * 10000)}` === key) === index;\n });\n const mergedRects = uniqueRects.reduce((acc: typeof uniqueRects, rect) => {\n const target = acc.find((r) => {\n const closeY = Math.abs(r.y - rect.y) < 0.002 && Math.abs(r.height - rect.height) < 0.002;\n const overlaps = rect.x <= r.x + r.width + 0.002 && rect.x + rect.width >= r.x - 0.002;\n return closeY && overlaps;\n });\n if (!target) {\n acc.push({ ...rect });\n return acc;\n }\n const left = Math.min(target.x, rect.x);\n const right = Math.max(target.x + target.width, rect.x + rect.width);\n target.x = left;\n target.width = right - left;\n return acc;\n }, []);\n if (mergedRects.length) {\n const xs = mergedRects.map((r) => r.x);\n const ys = mergedRects.map((r) => r.y);\n const xe = mergedRects.map((r) => r.x + r.width);\n const ye = mergedRects.map((r) => r.y + r.height);\n const rect = {\n x: Math.min(...xs),\n y: Math.min(...ys),\n width: Math.max(...xe) - Math.min(...xs),\n height: Math.max(...ye) - Math.min(...ys),\n };\n if (textMarkupTools.has(activeTool)) {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: activeTool as Annotation['type'],\n rect,\n rects: mergedRects,\n color: annotationColor,\n content: selectionText,\n createdAt: Date.now(),\n });\n selection.removeAllRanges();\n setSelectionMenu(null);\n return;\n }\n if (activeTool === 'select') {\n const anchorX = (rect.x + rect.width) * containerRect.width;\n const anchorY = rect.y * containerRect.height;\n setSelectionMenu({\n rects: mergedRects,\n rect,\n text: selectionText,\n anchor: {\n x: Math.max(12, Math.min(containerRect.width - 12, anchorX)),\n y: Math.max(12, anchorY - 32),\n },\n });\n }\n }\n }\n }\n\n if (isDragging) {\n setIsDragging(false);\n if (currentRect.w > 5 && currentRect.h > 5) {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect) {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: activeTool as any,\n rect: {\n x: currentRect.x / rect.width,\n y: currentRect.y / rect.height,\n width: currentRect.w / rect.width,\n height: currentRect.h / rect.height,\n },\n color: activeTool === 'highlight' ? annotationColor : accentColor,\n content: activeTool === 'text' || activeTool === 'comment' ? '' : undefined,\n createdAt: Date.now()\n });\n }\n }\n setCurrentRect({ x: 0, y: 0, w: 0, h: 0 });\n return;\n }\n\n if (activeTool === 'select') {\n const selectedText = selection?.toString().trim();\n if (selectedText) {\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, {\n text: selectedText,\n pageIndex: pageIndex\n });\n }\n }\n };\n\r\n const getPageFilter = () => {\r\n switch(pageTheme) {\r\n case 'sepia': return 'sepia(0.6) contrast(1.1) brightness(0.95)';\r\n case 'dark': return 'invert(0.9) hue-rotate(180deg) brightness(1.1)';\r\n case 'high-contrast': return 'contrast(2) grayscale(1)';\r\n default: return 'none';\r\n }\r\n };\r\n\r\n return (\r\n <div \r\n ref={containerRef}\r\n className={`relative inline-block shadow-2xl bg-white mb-10 transition-all ${canSelectText ? '' : 'no-select cursor-crosshair'}`}\n style={{ scrollMarginTop: '20px', minHeight: '100px' }}\r\n onMouseDown={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n >\r\n {loading && (\r\n <div className=\"absolute inset-0 bg-gray-50 flex items-center justify-center z-10 animate-pulse\">\r\n <span className=\"text-[10px] font-black text-gray-400 uppercase tracking-widest\">Sincronizando...</span>\r\n </div>\r\n )}\r\n \r\n <canvas\r\n ref={canvasRef}\r\n style={{ filter: getPageFilter(), display: isElementRender ? 'none' : 'block' }}\r\n className=\"block\"\r\n />\r\n <div\r\n ref={htmlLayerRef}\r\n className=\"block\"\r\n style={{ filter: getPageFilter(), display: isElementRender ? 'block' : 'none' }}\r\n />\r\n\r\n <div \n ref={textLayerRef} \n className=\"textLayer\"\n style={{\n pointerEvents: isElementRender ? 'none' : canSelectText ? 'auto' : 'none',\n display: isElementRender ? 'none' : 'block',\n }}\n />\n\n {isDragging && (\n <div \n className=\"absolute border-2 z-[40] pointer-events-none\"\n style={{\n borderColor: activeTool === 'highlight' ? annotationColor : accentColor,\n backgroundColor: activeTool === 'highlight' ? `${annotationColor}66` : `${accentColor}33`,\n mixBlendMode: activeTool === 'highlight' ? 'multiply' : undefined,\n left: currentRect.x,\n top: currentRect.y,\n width: currentRect.w,\n height: currentRect.h,\n }}\n />\n )}\n\n {isInkDrawing && inkPoints.length > 1 && (\n <svg\n className=\"absolute inset-0 pointer-events-none z-[45]\"\n viewBox=\"0 0 1 1\"\n preserveAspectRatio=\"none\"\n style={{ width: '100%', height: '100%' }}\n >\n <path\n d={inkPoints.map((p, idx) => `${idx === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ')}\n fill=\"none\"\n stroke={annotationColor}\n strokeWidth={0.008}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {selectionMenu && (\n <div\n className=\"absolute z-[60] flex items-center gap-1 rounded-full border px-2 py-1 shadow-xl bg-white/95 backdrop-blur-md text-gray-700\"\n style={{ left: selectionMenu.anchor.x, top: selectionMenu.anchor.y }}\n >\n {[\n { id: 'highlight', label: 'Marcar' },\n { id: 'underline', label: 'Sublinhar' },\n { id: 'squiggly', label: 'Onda' },\n { id: 'strikeout', label: 'Risco' },\n ].map((action) => (\n <button\n key={action.id}\n className=\"text-[10px] font-bold px-2 py-1 rounded-full hover:bg-gray-100\"\n onClick={() => {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: action.id as Annotation['type'],\n rect: selectionMenu.rect,\n rects: selectionMenu.rects,\n content: selectionMenu.text,\n color: annotationColor,\n createdAt: Date.now(),\n });\n window.getSelection()?.removeAllRanges();\n setSelectionMenu(null);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"absolute inset-0 pointer-events-none z-20\">\n {annotations.filter(a => a.pageIndex === pageIndex).map(ann => (\n <AnnotationItem \n key={ann.id} \r\n ann={ann} \r\n isSelected={selectedAnnotationId === ann.id}\r\n accentColor={accentColor}\r\n onDelete={() => removeAnnotation(ann.id)}\r\n onSelect={() => setSelectedAnnotation(ann.id)}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst AnnotationItem: React.FC<{ ann: Annotation; isSelected: boolean; accentColor: string; onDelete: () => void; onSelect: () => void }> = ({ ann, isSelected, accentColor, onDelete, onSelect }) => {\n const isText = ann.type === 'text' || ann.type === 'comment';\n const isHighlight = ann.type === 'highlight';\n const isMarkup = ann.type === 'highlight' || ann.type === 'underline' || ann.type === 'squiggly' || ann.type === 'strikeout';\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [ann.rect];\n const isInk = ann.type === 'ink' && ann.path && ann.path.length > 1;\n\n const renderMarkupRects = () => {\n if (!isMarkup) return null;\n return rects.map((r, idx) => {\n const left = ann.rect.width ? ((r.x - ann.rect.x) / ann.rect.width) * 100 : 0;\n const top = ann.rect.height ? ((r.y - ann.rect.y) / ann.rect.height) * 100 : 0;\n const width = ann.rect.width ? (r.width / ann.rect.width) * 100 : 100;\n const height = ann.rect.height ? (r.height / ann.rect.height) * 100 : 100;\n if (ann.type === 'highlight') {\n return (\n <div\n key={idx}\n className=\"absolute rounded-sm\"\n style={{\n left: `${left}%`,\n top: `${top}%`,\n width: `${width}%`,\n height: `${height}%`,\n backgroundColor: `${ann.color}88`,\n mixBlendMode: 'multiply',\n }}\n />\n );\n }\n\n const lineStyle: React.CSSProperties = {\n left: `${left}%`,\n width: `${width}%`,\n };\n\n if (ann.type === 'underline') {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height}% - 2px)`,\n height: '2px',\n backgroundColor: ann.color,\n }}\n />\n );\n }\n\n if (ann.type === 'strikeout') {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height * 0.5}% - 1px)`,\n height: '2px',\n backgroundColor: ann.color,\n }}\n />\n );\n }\n\n if (ann.type === 'squiggly') {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height}% - 4px)`,\n height: '4px',\n backgroundImage: `linear-gradient(135deg, transparent 75%, ${ann.color} 0), linear-gradient(225deg, transparent 75%, ${ann.color} 0)`,\n backgroundSize: '6px 6px',\n backgroundPosition: '0 0, 3px 3px',\n }}\n />\n );\n }\n return null;\n });\n };\n\n const renderInk = () => {\n if (!isInk || !ann.path) return null;\n const d = ann.path\n .map((p, idx) => `${idx === 0 ? 'M' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n return (\n <svg\n className=\"absolute inset-0\"\n viewBox={`${ann.rect.x} ${ann.rect.y} ${ann.rect.width} ${ann.rect.height}`}\n preserveAspectRatio=\"none\"\n >\n <path d={d} fill=\"none\" stroke={ann.color} strokeWidth={0.008} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n };\n\n return (\n <div \n className={`absolute pointer-events-auto transition-all ${isSelected ? 'shadow-xl z-30' : 'z-10'}`}\n style={{\n left: `${ann.rect.x * 100}%`,\n top: `${ann.rect.y * 100}%`,\n width: `${ann.rect.width * 100}%`,\n height: `${ann.rect.height * 100}%`,\n backgroundColor: !isMarkup && isHighlight ? `${ann.color}88` : 'transparent',\n mixBlendMode: !isMarkup && isHighlight ? 'multiply' : undefined,\n borderBottom: ann.type === 'strikeout' && !isMarkup ? `2px solid ${ann.color}` : 'none',\n outline: isSelected ? `2px solid ${accentColor}` : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\n >\n {renderMarkupRects()}\n {renderInk()}\n {isText && isSelected && (\n <div className=\"absolute top-full mt-2 w-64 bg-white shadow-2xl rounded-xl p-4 border border-gray-100 z-50\">\n <textarea \n className=\"w-full bg-transparent border-none focus:ring-0 p-0 text-gray-800 text-xs font-medium\" \n placeholder=\"Escreva sua nota...\" \n rows={3}\n defaultValue={ann.content || ''}\n autoFocus\n />\n </div>\n )}\n {isSelected && (\n <button \n onClick={(e) => { e.stopPropagation(); onDelete(); }}\n className=\"absolute -top-3 -right-3 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n )}\n </div>\n );\n};\n\r\nexport default PageRenderer;\r\n"],"mappings":"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","names":["useEffect","useRef","useState","useViewerStore","jsx","jsxs","useState","useViewerStore","jsx","jsxs","withAlpha","useEffect","useMemo","useRef","useState","useViewerStore","useEffect","useRef","useState","useViewerStore","jsx","jsxs","rect","x","y","jsx","jsxs","useViewerStore","useRef","useState","useEffect","useMemo"]}
1
+ {"version":3,"sources":["../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine, PageTheme } from \"@papyrus-sdk/types\";\n\ninterface TopbarProps {\n engine: DocumentEngine;\n showBrand?: boolean;\n brand?: React.ReactNode;\n title?: React.ReactNode;\n showSidebarLeftToggle?: boolean;\n showPageControls?: boolean;\n showZoomControls?: boolean;\n showPageThemeSelector?: boolean;\n showUIToggle?: boolean;\n showUpload?: boolean;\n showSearch?: boolean;\n}\n\nconst Topbar: React.FC<TopbarProps> = ({\n engine,\n showBrand = false,\n brand,\n title,\n showSidebarLeftToggle = true,\n showPageControls = true,\n showZoomControls = true,\n showPageThemeSelector = true,\n showUIToggle = true,\n showUpload = true,\n showSearch = true,\n}) => {\n const {\n currentPage,\n pageCount,\n zoom,\n uiTheme,\n pageTheme,\n setDocumentState,\n accentColor,\n toolDockOpen,\n toggleSidebarLeft,\n toggleSidebarRight,\n triggerScrollToPage,\n } = useViewerStore();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const zoomTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingZoomRef = useRef<number | null>(null);\n const [pageInput, setPageInput] = useState(currentPage.toString());\n const [showPageThemes, setShowPageThemes] = useState(false);\n const [showMobileMenu, setShowMobileMenu] = useState(false);\n const pageDigits = Math.max(2, String(pageCount || 1).length);\n const isDark = uiTheme === \"dark\";\n const canUseDOM = typeof document !== \"undefined\";\n const hasMobileMenu =\n showZoomControls || showPageThemeSelector || showUIToggle || showUpload;\n\n useEffect(() => {\n setPageInput(currentPage.toString());\n }, [currentPage]);\n\n useEffect(\n () => () => {\n if (zoomTimerRef.current) clearTimeout(zoomTimerRef.current);\n },\n []\n );\n\n useEffect(() => {\n if (!hasMobileMenu) setShowMobileMenu(false);\n }, [hasMobileMenu]);\n\n useEffect(() => {\n if (!showMobileMenu || !canUseDOM) return;\n const previousOverflow = document.body.style.overflow;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setShowMobileMenu(false);\n };\n\n document.body.style.overflow = \"hidden\";\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [showMobileMenu, canUseDOM]);\n\n const handleZoom = (delta: number) => {\n const baseZoom = pendingZoomRef.current ?? zoom;\n const nextZoom = Math.max(0.2, Math.min(5, baseZoom + delta));\n pendingZoomRef.current = nextZoom;\n if (zoomTimerRef.current) return;\n\n zoomTimerRef.current = setTimeout(() => {\n zoomTimerRef.current = null;\n const targetZoom = pendingZoomRef.current;\n pendingZoomRef.current = null;\n if (targetZoom == null) return;\n engine.setZoom(targetZoom);\n setDocumentState({ zoom: targetZoom });\n }, 80);\n };\n\n const handlePageChange = (page: number) => {\n if (pageCount <= 0) return;\n const nextPage = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));\n engine.goToPage(nextPage);\n triggerScrollToPage(nextPage - 1);\n };\n\n const handleFileUpload = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const file = event.target.files?.[0];\n event.target.value = \"\";\n if (!file) return;\n\n setDocumentState({ isLoaded: false });\n try {\n await engine.load(file);\n setDocumentState({\n isLoaded: true,\n pageCount: engine.getPageCount(),\n currentPage: 1,\n outline: await engine.getOutline(),\n });\n } catch (err) {\n console.error(\"Upload failed\", err);\n setDocumentState({ isLoaded: true });\n }\n };\n\n const toggleToolDock = () => {\n setDocumentState({ toolDockOpen: !toolDockOpen });\n };\n\n const themes: { id: PageTheme; name: string; color: string }[] = [\n { id: \"normal\", name: \"Original\", color: \"bg-white\" },\n { id: \"sepia\", name: \"Sépia\", color: \"bg-[#f4ecd8]\" },\n { id: \"dark\", name: \"Invertido\", color: \"bg-gray-800\" },\n { id: \"high-contrast\", name: \"Contraste\", color: \"bg-black\" },\n ];\n\n const mobileMenuOverlay =\n canUseDOM && hasMobileMenu && showMobileMenu\n ? createPortal(\n <div\n className=\"sm:hidden fixed inset-0 z-[200] bg-black/45\"\n onClick={(event) => {\n if (event.target === event.currentTarget)\n setShowMobileMenu(false);\n }}\n >\n <div\n className={`absolute inset-x-0 bottom-0 rounded-t-2xl border-x border-t p-4 pb-6 shadow-2xl ${\n isDark\n ? \"bg-[#1a1a1a] border-[#333] text-white\"\n : \"bg-white border-gray-200 text-gray-900\"\n }`}\n >\n <div className=\"mx-auto mb-4 h-1.5 w-10 rounded-full bg-gray-400/60\" />\n <div className=\"mb-4 flex items-center justify-between\">\n <span\n className={`text-sm font-semibold ${\n isDark ? \"text-gray-100\" : \"text-gray-800\"\n }`}\n >\n Ações rápidas\n </span>\n <button\n className={`p-2 rounded-md ${\n isDark\n ? \"text-gray-200 hover:bg-white/10\"\n : \"text-gray-700 hover:bg-gray-100\"\n }`}\n onClick={() => setShowMobileMenu(false)}\n aria-label=\"Fechar menu\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"space-y-3\">\n {showZoomControls && (\n <div\n className={`rounded-xl border p-3 ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444] text-gray-100\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`mb-2 text-xs ${\n isDark ? \"text-gray-300\" : \"text-gray-600\"\n }`}\n >\n Zoom\n </div>\n <div className=\"flex items-center justify-between gap-3\">\n <button\n onClick={() => handleZoom(-0.1)}\n className=\"p-2 rounded-md border\"\n style={{ color: accentColor, borderColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 12H4\"\n />\n </svg>\n </button>\n <span\n className={`text-sm font-semibold ${\n isDark ? \"text-gray-100\" : \"text-gray-800\"\n }`}\n >\n {Math.round(zoom * 100)}%\n </span>\n <button\n onClick={() => handleZoom(0.1)}\n className=\"p-2 rounded-md border\"\n style={{ color: accentColor, borderColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {showPageThemeSelector && (\n <div\n className={`rounded-xl border p-3 ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444] text-gray-100\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`mb-2 text-xs ${\n isDark ? \"text-gray-300\" : \"text-gray-600\"\n }`}\n >\n Tema da página\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {themes.map((theme) => (\n <button\n key={theme.id}\n onClick={() => {\n setDocumentState({ pageTheme: theme.id });\n }}\n className={`rounded-lg border px-2 py-2 text-xs font-semibold ${\n pageTheme === theme.id\n ? \"text-white\"\n : isDark\n ? \"text-gray-300 border-[#444]\"\n : \"text-gray-700 border-gray-300\"\n }`}\n style={\n pageTheme === theme.id\n ? {\n backgroundColor: accentColor,\n borderColor: accentColor,\n }\n : undefined\n }\n >\n {theme.name}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {showUIToggle && (\n <button\n onClick={() => {\n setDocumentState({ uiTheme: isDark ? \"light\" : \"dark\" });\n }}\n className={`w-full rounded-xl border px-3 py-3 text-left text-sm font-medium flex items-center gap-2 ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444] text-gray-100\"\n : \"bg-gray-50 border-gray-200 text-gray-800\"\n }`}\n >\n <svg\n className=\"w-4 h-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n {isDark ? (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m8-9h1M3 12H2m15.364 6.364l.707.707M5.93 5.93l-.707-.707m12.141 0l-.707.707M5.93 18.07l-.707.707M12 17a5 5 0 100-10 5 5 0 000 10z\"\n />\n ) : (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n )}\n </svg>\n {isDark\n ? \"Mudar para tema claro\"\n : \"Mudar para tema escuro\"}\n </button>\n )}\n\n {showUpload && (\n <button\n onClick={() => {\n setShowMobileMenu(false);\n fileInputRef.current?.click();\n }}\n className=\"w-full rounded-xl px-3 py-3 text-left text-sm font-semibold text-white flex items-center gap-2\"\n style={{ backgroundColor: accentColor }}\n >\n <svg\n className=\"w-4 h-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n Upload de arquivo\n </button>\n )}\n </div>\n </div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-topbar papyrus-theme relative h-14 border-b flex items-center px-3 sm:px-4 z-50 transition-colors duration-200 ${\n isDark\n ? \"bg-[#1a1a1a] border-[#333] text-white\"\n : \"bg-white border-gray-200 text-gray-800\"\n }`}\n >\n <div className=\"flex items-center gap-2 min-w-0 z-10\">\n {showSidebarLeftToggle && (\n <button\n onClick={toggleSidebarLeft}\n className={`p-2 rounded-md ${\n isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\n }`}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </button>\n )}\n <button\n onClick={toggleToolDock}\n className={`p-2 rounded-md border transition-colors ${\n toolDockOpen\n ? isDark\n ? \"border-[#335ea8] bg-[#1b2f55] text-[#8fb6ff]\"\n : \"border-blue-300 bg-blue-50 text-blue-700\"\n : isDark\n ? \"border-[#444] bg-[#2a2a2a] hover:bg-[#333]\"\n : \"border-gray-300 bg-white hover:bg-gray-100\"\n }`}\n aria-label={toolDockOpen ? \"Fechar ferramentas\" : \"Abrir ferramentas\"}\n title={toolDockOpen ? \"Fechar ferramentas\" : \"Abrir ferramentas\"}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M16.862 3.487a2.25 2.25 0 013.182 3.182L8.22 18.492a4.5 4.5 0 01-1.897 1.12l-2.692.898.898-2.692a4.5 4.5 0 011.12-1.897L16.862 3.487z\"\n />\n </svg>\n </button>\n\n {showBrand &&\n (brand ?? (\n <span\n className=\"font-bold text-base tracking-tight\"\n style={{ color: accentColor }}\n >\n Papyrus\n <span className={isDark ? \"text-white\" : \"text-gray-900\"}>\n Core\n </span>\n </span>\n ))}\n\n {title && (\n <span\n className={`hidden sm:inline text-sm font-semibold truncate min-w-0 max-w-[35vw] sm:max-w-[260px] ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n title={typeof title === \"string\" ? title : undefined}\n >\n {title}\n </span>\n )}\n </div>\n\n {(showPageControls || showZoomControls) && (\n <div className=\"absolute left-1/2 -translate-x-1/2 flex items-center gap-3\">\n {showPageControls && (\n <div\n className={`papyrus-control flex items-center rounded-lg p-1 space-x-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <button\n onClick={() => handlePageChange(currentPage - 1)}\n className=\"p-1.5 rounded transition-all hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <input\n type=\"text\"\n className=\"papyrus-input text-center bg-transparent focus:outline-none font-bold text-sm shrink-0\"\n style={{ width: `${pageDigits + 1.75}ch` }}\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onKeyDown={(e) =>\n e.key === \"Enter\" && handlePageChange(parseInt(pageInput))\n }\n onBlur={() => handlePageChange(parseInt(pageInput))}\n />\n <span className=\"opacity-40 px-1\">/</span>\n <span className=\"opacity-80 text-sm\">\n {pageCount > 0 ? pageCount : \"—\"}\n </span>\n <button\n onClick={() => handlePageChange(currentPage + 1)}\n className=\"p-1.5 rounded transition-all hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {showZoomControls && (\n <div\n className={`papyrus-control hidden sm:flex items-center rounded-lg p-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <button\n onClick={() => handleZoom(-0.1)}\n className=\"p-1.5 rounded hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 12H4\"\n />\n </svg>\n </button>\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n onClick={() => handleZoom(0.1)}\n className=\"p-1.5 rounded hover:brightness-110\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n )}\n\n <div className=\"ml-auto flex items-center gap-2 sm:gap-3 z-10\">\n {showPageThemeSelector && (\n <div className=\"relative hidden sm:block\">\n <button\n onClick={() => setShowPageThemes(!showPageThemes)}\n className={`papyrus-control flex items-center space-x-2 px-3 py-1.5 rounded-md text-xs font-bold border transition-all ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-gray-50 border-gray-200\"\n }`}\n >\n <div\n className={`w-3 h-3 rounded-full border ${\n themes.find((t) => t.id === pageTheme)?.color\n }`}\n />\n <span>TEMA</span>\n </button>\n {showPageThemes && (\n <div\n className={`papyrus-popover absolute top-full right-0 mt-2 w-48 rounded-lg shadow-xl border p-2 z-[60] ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444]\"\n : \"bg-white border-gray-200\"\n }`}\n >\n {themes.map((theme) => (\n <button\n key={theme.id}\n onClick={() => {\n setDocumentState({ pageTheme: theme.id });\n setShowPageThemes(false);\n }}\n className={`w-full flex items-center space-x-3 px-3 py-2 rounded-md text-sm ${\n pageTheme === theme.id\n ? \"text-white\"\n : isDark\n ? \"hover:bg-white/10 text-gray-300\"\n : \"hover:bg-gray-50 text-gray-700\"\n }`}\n style={\n pageTheme === theme.id\n ? { backgroundColor: accentColor }\n : undefined\n }\n >\n <div\n className={`w-3 h-3 rounded-full border ${theme.color}`}\n />\n <span>{theme.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {showUIToggle && (\n <button\n onClick={() =>\n setDocumentState({ uiTheme: isDark ? \"light\" : \"dark\" })\n }\n className={`hidden sm:inline-flex p-2 rounded-full ${\n isDark\n ? \"bg-yellow-500/10 text-yellow-500\"\n : \"bg-gray-100 text-gray-500\"\n }`}\n >\n {isDark ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z\" />\n </svg>\n )}\n </button>\n )}\n\n {showUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"hidden sm:inline-flex px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\n style={{ backgroundColor: accentColor }}\n >\n UPLOAD\n </button>\n )}\n\n {showSearch && (\n <button\n onClick={() => toggleSidebarRight(\"search\")}\n className={`inline-flex p-2 rounded-md ${\n isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\n }`}\n aria-label=\"Abrir busca\"\n title=\"Buscar\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n )}\n\n {hasMobileMenu && (\n <button\n onClick={() => setShowMobileMenu(true)}\n className={`sm:hidden p-2 rounded-md border ${\n isDark\n ? \"border-[#444] bg-[#2a2a2a] hover:bg-[#333]\"\n : \"border-gray-300 bg-white hover:bg-gray-100\"\n }`}\n aria-label=\"Abrir menu\"\n title=\"Mais opções\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 12h.01M12 12h.01M19 12h.01\"\n />\n </svg>\n </button>\n )}\n\n {showUpload && (\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\".pdf,.epub,.txt\"\n onChange={handleFileUpload}\n />\n )}\n </div>\n {mobileMenuOverlay}\n </div>\n );\n};\n\nexport default Topbar;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine, OutlineItem } from \"@papyrus-sdk/types\";\n\ninterface SidebarLeftProps {\n engine: DocumentEngine;\n}\n\nconst withAlpha = (hex: string, alpha: number) => {\n const normalized = hex.replace(\"#\", \"\").trim();\n const value =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n if (value.length !== 6) return hex;\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nconst Thumbnail: React.FC<{\n engine: DocumentEngine;\n pageIndex: number;\n active: boolean;\n isDark: boolean;\n accentColor: string;\n onClick: () => void;\n}> = ({ engine, pageIndex, active, isDark, accentColor, onClick }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const htmlRef = useRef<HTMLDivElement>(null);\n const accentSoft = withAlpha(accentColor, 0.12);\n const renderTargetType = engine.getRenderTargetType?.() ?? \"canvas\";\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const target = wrapperRef.current;\n if (!target) return;\n if (typeof IntersectionObserver === \"undefined\") {\n setIsVisible(true);\n return;\n }\n const root = target.closest(\".custom-scrollbar\");\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect();\n }\n });\n },\n { root: root ?? null, rootMargin: \"200px\" }\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (renderTargetType === \"element\" || !isVisible) return;\n const target = canvasRef.current;\n if (target) {\n engine.renderPage(pageIndex, target, 0.15).catch((err) => {\n console.error(\"[Papyrus] Thumbnail render failed:\", err);\n });\n }\n }, [engine, pageIndex, renderTargetType, isVisible]);\n\n return (\n <div\n ref={wrapperRef}\n onClick={onClick}\n className={`p-3 cursor-pointer transition-all rounded-lg border-2 ${\n active ? \"shadow-sm\" : \"border-transparent\"\n }`}\n style={\n active\n ? { borderColor: accentColor, backgroundColor: accentSoft }\n : undefined\n }\n >\n <div className=\"flex flex-col items-center\">\n <div\n className={`shadow-lg rounded overflow-hidden mb-2 border ${\n isDark ? \"border-[#333]\" : \"border-gray-200\"\n }`}\n >\n <canvas\n ref={canvasRef}\n className=\"max-w-full h-auto bg-white\"\n style={{\n display: renderTargetType === \"element\" ? \"none\" : \"block\",\n }}\n />\n <div\n ref={htmlRef}\n className=\"bg-white\"\n style={{\n width: 90,\n height: 120,\n display: renderTargetType === \"element\" ? \"block\" : \"none\",\n overflow: \"hidden\",\n }}\n >\n {renderTargetType === \"element\" && (\n <div className=\"w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500\">\n HTML\n </div>\n )}\n </div>\n </div>\n <span\n className={`text-[11px] font-bold ${\n active ? \"\" : isDark ? \"text-gray-500\" : \"text-gray-400\"\n }`}\n style={active ? { color: accentColor } : undefined}\n >\n {pageIndex + 1}\n </span>\n </div>\n </div>\n );\n};\n\nconst OutlineNode: React.FC<{\n item: OutlineItem;\n engine: DocumentEngine;\n isDark: boolean;\n accentColor: string;\n depth?: number;\n}> = ({ item, engine, isDark, accentColor, depth = 0 }) => {\n const { triggerScrollToPage, outlineSearchQuery } = useViewerStore();\n const [expanded, setExpanded] = useState(true);\n const accentSoft = withAlpha(accentColor, 0.2);\n\n const matchesSearch =\n outlineSearchQuery === \"\" ||\n item.title.toLowerCase().includes(outlineSearchQuery.toLowerCase());\n const hasMatchingChildren = item.children?.some((child) =>\n child.title.toLowerCase().includes(outlineSearchQuery.toLowerCase())\n );\n\n if (!matchesSearch && !hasMatchingChildren && outlineSearchQuery !== \"\")\n return null;\n\n const handleClick = () => {\n if (item.pageIndex >= 0) {\n engine.goToPage(item.pageIndex + 1);\n triggerScrollToPage(item.pageIndex);\n }\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={`flex items-center py-1.5 px-3 rounded-md transition-colors group ${\n item.pageIndex >= 0 ? \"cursor-pointer\" : \"cursor-default\"\n } ${isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"}`}\n style={{ paddingLeft: `${depth * 14 + 8}px` }}\n onClick={handleClick}\n >\n {item.children && item.children.length > 0 ? (\n <button\n className={`mr-1 text-gray-400 transition-transform p-1`}\n style={{\n color: accentColor,\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-5\" />\n )}\n <span\n className={`text-[13px] leading-tight font-medium truncate ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n style={\n matchesSearch && outlineSearchQuery\n ? { backgroundColor: accentSoft, color: accentColor }\n : undefined\n }\n >\n {item.title}\n </span>\n </div>\n {expanded && item.children && item.children.length > 0 && (\n <div className=\"flex flex-col\">\n {item.children.map((child, i) => (\n <OutlineNode\n key={i}\n item={child}\n engine={engine}\n isDark={isDark}\n accentColor={accentColor}\n depth={depth + 1}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst SidebarLeft: React.FC<SidebarLeftProps> = ({ engine }) => {\n const {\n pageCount,\n currentPage,\n setDocumentState,\n sidebarLeftOpen,\n uiTheme,\n triggerScrollToPage,\n sidebarLeftTab,\n setSidebarLeftTab,\n outline,\n outlineSearchQuery,\n setOutlineSearch,\n accentColor,\n } = useViewerStore();\n const isDark = uiTheme === \"dark\";\n\n if (!sidebarLeftOpen) return null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-left papyrus-theme absolute left-0 top-0 bottom-0 z-[120] w-[85vw] max-w-72 border-r flex flex-col h-full overflow-hidden transition-colors duration-200 ${\n isDark\n ? \"bg-[#2a2a2a] border-[#3a3a3a]\"\n : \"bg-[#fcfcfc] border-gray-200\"\n }`}\n >\n <div\n className={`p-4 border-b flex flex-col space-y-4 ${\n isDark ? \"border-[#3a3a3a]\" : \"border-gray-100\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <h3\n className={`text-sm font-bold uppercase tracking-widest ${\n isDark ? \"text-gray-100\" : \"text-gray-800\"\n }`}\n >\n {sidebarLeftTab === \"thumbnails\" ? \"Thumbnails\" : \"Sumário\"}\n </h3>\n <button\n onClick={() => setDocumentState({ sidebarLeftOpen: false })}\n className=\"text-gray-400 hover:text-gray-600\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n <div className=\"flex gap-1\">\n <button\n onClick={() => setSidebarLeftTab(\"thumbnails\")}\n className={`p-2 rounded-md ${\n sidebarLeftTab === \"thumbnails\"\n ? isDark\n ? \"bg-white/10 text-white\"\n : \"bg-white shadow-sm border border-gray-200\"\n : \"text-gray-400\"\n }`}\n style={\n sidebarLeftTab === \"thumbnails\" && !isDark\n ? { color: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2 2V6z\"\n />\n </svg>\n </button>\n <button\n onClick={() => setSidebarLeftTab(\"summary\")}\n className={`p-2 rounded-md ${\n sidebarLeftTab === \"summary\"\n ? isDark\n ? \"bg-white/10 text-white\"\n : \"bg-white shadow-sm border border-gray-200\"\n : \"text-gray-400\"\n }`}\n style={\n sidebarLeftTab === \"summary\" && !isDark\n ? { color: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h7\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scrollbar p-3\">\n {sidebarLeftTab === \"thumbnails\" ? (\n <div className=\"space-y-1\">\n {Array.from({ length: pageCount }).map((_, idx) => (\n <Thumbnail\n key={idx}\n engine={engine}\n pageIndex={idx}\n isDark={isDark}\n accentColor={accentColor}\n active={currentPage === idx + 1}\n onClick={() => {\n engine.goToPage(idx + 1);\n triggerScrollToPage(idx);\n }}\n />\n ))}\n </div>\n ) : (\n <div className=\"flex flex-col space-y-0.5\">\n {outline.map((item, i) => (\n <OutlineNode\n key={i}\n item={item}\n engine={engine}\n isDark={isDark}\n accentColor={accentColor}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\nexport default SidebarLeft;\n","import React, { useState } from \"react\";\nimport { useViewerStore, SearchService } from \"@papyrus-sdk/core\";\nimport { DocumentEngine } from \"@papyrus-sdk/types\";\n\ninterface SidebarRightProps {\n engine: DocumentEngine;\n}\n\nconst withAlpha = (hex: string, alpha: number) => {\n const normalized = hex.replace(\"#\", \"\").trim();\n const value =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n if (value.length !== 6) return hex;\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nconst SidebarRight: React.FC<SidebarRightProps> = ({ engine }) => {\n const {\n sidebarRightOpen,\n sidebarRightTab,\n toggleSidebarRight,\n searchResults,\n activeSearchIndex,\n uiTheme,\n setSearch,\n setDocumentState,\n triggerScrollToPage,\n annotations,\n accentColor,\n } = useViewerStore();\n\n const [query, setQuery] = useState(\"\");\n const [isSearching, setIsSearching] = useState(false);\n const searchService = new SearchService(engine);\n const isDark = uiTheme === \"dark\";\n const accentSoft = withAlpha(accentColor, 0.12);\n const resultsCount = searchResults.length;\n\n const handleSearch = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!query.trim()) {\n setSearch(\"\", []);\n return;\n }\n setIsSearching(true);\n const results = await searchService.search(query);\n setSearch(query, results);\n setIsSearching(false);\n };\n\n if (!sidebarRightOpen) return null;\n\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-right papyrus-theme absolute right-0 top-0 bottom-0 z-[120] w-[88vw] max-w-80 border-l flex flex-col h-full transition-colors duration-200 shadow-2xl ${\n isDark ? \"bg-[#1a1a1a] border-[#333]\" : \"bg-white border-gray-200\"\n }`}\n >\n <div\n className={`p-4 border-b flex items-center justify-between shrink-0 ${\n isDark ? \"border-[#333]\" : \"border-gray-100\"\n }`}\n >\n <div className=\"flex space-x-6\">\n <button\n onClick={() => toggleSidebarRight(\"search\")}\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${\n sidebarRightTab === \"search\" ? \"border-b-2\" : \"text-gray-400\"\n }`}\n style={\n sidebarRightTab === \"search\"\n ? { color: accentColor, borderColor: accentColor }\n : undefined\n }\n >\n Busca\n </button>\n <button\n onClick={() => toggleSidebarRight(\"annotations\")}\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${\n sidebarRightTab === \"annotations\" ? \"border-b-2\" : \"text-gray-400\"\n }`}\n style={\n sidebarRightTab === \"annotations\"\n ? { color: accentColor, borderColor: accentColor }\n : undefined\n }\n >\n Notas\n </button>\n </div>\n <button\n onClick={() => toggleSidebarRight()}\n className=\"papyrus-unstyled-button text-gray-400 hover:text-red-500 transition-colors\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 custom-scrollbar bg-opacity-50\">\n {sidebarRightTab === \"search\" ? (\n <div className=\"space-y-4\">\n <form onSubmit={handleSearch} className=\"relative mb-6\">\n <input\n type=\"text\"\n className={`papyrus-input w-full rounded-lg px-4 py-2.5 text-xs outline-none border transition-all shadow-inner font-medium ${\n isDark\n ? \"bg-[#2a2a2a] text-white border-[#444] focus:border-blue-500\"\n : \"bg-gray-100 border-gray-200 focus:bg-white focus:border-blue-400\"\n }`}\n placeholder=\"O que você procura?\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n {resultsCount > 0 && (\n <span className=\"absolute right-9 top-2.5 text-[10px] font-bold text-gray-400\">\n {resultsCount}\n </span>\n )}\n <button\n type=\"submit\"\n className=\"papyrus-unstyled-button absolute right-3 top-2.5 text-gray-400 transition-colors\"\n style={{ color: accentColor }}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2.5}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n </form>\n\n {isSearching && (\n <div className=\"flex flex-col items-center justify-center py-12 space-y-3\">\n <div\n className=\"w-6 h-6 border-2 border-t-transparent rounded-full animate-spin\"\n style={{ borderColor: accentColor }}\n />\n <span className=\"text-[10px] font-bold text-gray-500 uppercase\">\n Varrendo documento...\n </span>\n </div>\n )}\n\n {!isSearching &&\n searchResults.map((res, idx) => (\n <div\n key={idx}\n onClick={() => {\n const page = res.pageIndex + 1;\n engine.goToPage(page);\n setDocumentState({\n activeSearchIndex: idx,\n currentPage: page,\n });\n triggerScrollToPage(res.pageIndex);\n }}\n className={`p-4 rounded-xl border-2 cursor-pointer transition-all group hover:scale-[1.02] ${\n idx === activeSearchIndex\n ? \"shadow-lg\"\n : isDark\n ? \"border-[#333] hover:border-[#555] bg-[#222]\"\n : \"border-gray-50 hover:border-gray-200 bg-gray-50/50 hover:bg-white\"\n }`}\n style={\n idx === activeSearchIndex\n ? {\n borderColor: accentColor,\n backgroundColor: accentSoft,\n }\n : undefined\n }\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span\n className={`text-[10px] font-black uppercase tracking-tighter ${\n idx === activeSearchIndex ? \"\" : \"text-gray-400\"\n }`}\n style={\n idx === activeSearchIndex\n ? { color: accentColor }\n : undefined\n }\n >\n PÁGINA {res.pageIndex + 1}\n </span>\n <svg\n className={`w-3 h-3 transition-transform ${\n idx === activeSearchIndex ? \"\" : \"text-gray-300\"\n }`}\n style={\n idx === activeSearchIndex\n ? { color: accentColor }\n : undefined\n }\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </div>\n <p\n className={`text-[11px] font-medium leading-relaxed italic ${\n isDark ? \"text-gray-400\" : \"text-gray-600\"\n }`}\n >\n ...{res.text}...\n </p>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"text-[9px] font-black text-gray-400 uppercase tracking-[0.2em] mb-6 flex items-center\">\n <span>WORKSET</span>\n <div className=\"flex-1 h-px bg-current ml-3 opacity-10\" />\n </div>\n {annotations.length === 0 ? (\n <div className=\"text-center py-20\">\n <div className=\"w-12 h-12 bg-gray-500/10 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg\n className=\"w-6 h-6 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </div>\n <p className=\"text-[10px] font-bold text-gray-400 uppercase tracking-widest\">\n Sem anotações\n </p>\n </div>\n ) : (\n annotations.map((ann) => (\n <div\n key={ann.id}\n className={`p-4 rounded-xl border group transition-all cursor-pointer ${\n isDark\n ? \"bg-[#222] border-[#333] hover:border-[#444]\"\n : \"bg-white border-gray-100 shadow-sm hover:shadow-md\"\n }`}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <div\n className=\"w-2.5 h-2.5 rounded-full\"\n style={{ backgroundColor: ann.color }}\n />\n <span\n className=\"text-[10px] font-black\"\n style={{ color: accentColor }}\n >\n P{ann.pageIndex + 1}\n </span>\n </div>\n <span className=\"text-[9px] text-gray-400 font-bold\">\n {new Date(ann.createdAt).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </span>\n </div>\n <p\n className={`text-[11px] font-bold uppercase tracking-tight ${\n isDark ? \"text-gray-200\" : \"text-gray-700\"\n }`}\n >\n {ann.type}\n </p>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\nexport default SidebarRight;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useViewerStore } from \"@papyrus-sdk/core\";\nimport { DocumentEngine } from \"@papyrus-sdk/types\";\nimport PageRenderer from \"./PageRenderer\";\n\ninterface ViewerProps {\n engine: DocumentEngine;\n}\nconst BASE_OVERSCAN = 6;\nconst MIN_ZOOM = 0.2;\nconst MAX_ZOOM = 5;\n\nconst Viewer: React.FC<ViewerProps> = ({ engine }) => {\n const {\n pageCount,\n currentPage,\n zoom,\n activeTool,\n uiTheme,\n scrollToPageSignal,\n setDocumentState,\n accentColor,\n annotationColor,\n setAnnotationColor,\n toolDockOpen,\n } = useViewerStore();\n const isDark = uiTheme === \"dark\";\n const viewerRef = useRef<HTMLDivElement>(null);\n const colorPickerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<Array<HTMLDivElement | null>>([]);\n const intersectionRatiosRef = useRef<Record<number, number>>({});\n const frameRef = useRef<number | null>(null);\n const jumpRef = useRef(false);\n const jumpTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pinchRef = useRef<{\n active: boolean;\n startDistance: number;\n startZoom: number;\n pendingZoom: number | null;\n rafId: number | null;\n }>({\n active: false,\n startDistance: 0,\n startZoom: 1,\n pendingZoom: null,\n rafId: null,\n });\n const [availableWidth, setAvailableWidth] = useState<number | null>(null);\n const [basePageSize, setBasePageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n const [pageSizes, setPageSizes] = useState<\n Record<number, { width: number; height: number }>\n >({});\n const [colorPickerOpen, setColorPickerOpen] = useState(false);\n const isCompact = availableWidth !== null && availableWidth < 820;\n const paddingY = isCompact ? \"py-10\" : \"py-16\";\n const toolDockPosition = isCompact ? \"bottom-4\" : \"bottom-8\";\n const colorPalette = [\n \"#fbbf24\",\n \"#f97316\",\n \"#ef4444\",\n \"#22c55e\",\n \"#06b6d4\",\n \"#3b82f6\",\n \"#8b5cf6\",\n \"#111827\",\n ];\n\n useEffect(() => {\n if (!colorPickerOpen) return;\n const handleClick = (event: MouseEvent) => {\n if (!colorPickerRef.current) return;\n if (!colorPickerRef.current.contains(event.target as Node)) {\n setColorPickerOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [colorPickerOpen]);\n\n useEffect(() => {\n if (!toolDockOpen && colorPickerOpen) setColorPickerOpen(false);\n }, [toolDockOpen, colorPickerOpen]);\n\n useEffect(\n () => () => {\n if (pinchRef.current.rafId != null) {\n cancelAnimationFrame(pinchRef.current.rafId);\n }\n },\n []\n );\n\n useEffect(() => {\n const element = viewerRef.current;\n if (!element) return;\n\n const updateWidth = () => {\n const nextWidth = element.clientWidth;\n if (nextWidth > 0) setAvailableWidth(nextWidth);\n };\n\n updateWidth();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", updateWidth);\n return () => window.removeEventListener(\"resize\", updateWidth);\n }\n\n const observer = new ResizeObserver(() => updateWidth());\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n let active = true;\n if (!pageCount) return;\n const loadBaseSize = async () => {\n try {\n const size = await engine.getPageDimensions(0);\n if (!active || !size.width || !size.height) return;\n setBasePageSize(size);\n } catch {\n // ignore\n }\n };\n loadBaseSize();\n return () => {\n active = false;\n };\n }, [engine, pageCount]);\n\n useEffect(() => {\n if (scrollToPageSignal == null) return;\n const root = viewerRef.current;\n const target = pageRefs.current[scrollToPageSignal];\n if (root) {\n setDocumentState({ currentPage: scrollToPageSignal + 1 });\n jumpRef.current = true;\n if (jumpTimerRef.current) clearTimeout(jumpTimerRef.current);\n\n const previousBehavior = root.style.scrollBehavior;\n root.style.scrollBehavior = \"auto\";\n\n let targetTop: number | null = null;\n if (target) {\n targetTop = target.offsetTop;\n } else if (basePageSize && availableWidth) {\n const fitScale = Math.min(\n 1,\n Math.max(0, availableWidth - 48) / basePageSize.width\n );\n const estimatedPageHeight = basePageSize.height * fitScale * zoom + 64;\n targetTop = Math.max(0, estimatedPageHeight * scrollToPageSignal);\n } else if (pageCount > 1) {\n const maxScroll = Math.max(0, root.scrollHeight - root.clientHeight);\n const ratio = scrollToPageSignal / Math.max(1, pageCount - 1);\n targetTop = Math.max(0, maxScroll * ratio);\n }\n\n if (targetTop != null) {\n root.scrollTop = Math.max(0, targetTop - 12);\n }\n\n requestAnimationFrame(() => {\n root.style.scrollBehavior = previousBehavior;\n });\n\n jumpTimerRef.current = setTimeout(() => {\n jumpRef.current = false;\n }, 250);\n }\n setDocumentState({ scrollToPageSignal: null });\n }, [\n scrollToPageSignal,\n setDocumentState,\n basePageSize,\n availableWidth,\n zoom,\n pageCount,\n ]);\n\n useEffect(() => {\n // Size cache must follow current zoom, otherwise virtual placeholders may jump.\n setPageSizes({});\n }, [zoom]);\n\n useEffect(() => {\n const root = viewerRef.current;\n if (!root) return;\n const flushCurrentPage = () => {\n if (jumpRef.current) return;\n const ratios = intersectionRatiosRef.current;\n const entries = Object.entries(ratios).filter(([, ratio]) => ratio > 0);\n if (!entries.length) return;\n const currentIndex = currentPage - 1;\n const currentRatio = ratios[currentIndex] ?? 0;\n const [bestIndexText, bestRatio] = entries.reduce((best, candidate) =>\n Number(candidate[1]) > Number(best[1]) ? candidate : best\n );\n const bestIndex = Number(bestIndexText);\n if (!Number.isFinite(bestIndex)) return;\n const bestPage = bestIndex + 1;\n // Hysteresis avoids page-number flicker when viewport is between two pages.\n const shouldSwitch =\n bestPage !== currentPage &&\n (currentRatio <= 0 ||\n bestRatio >= currentRatio + 0.1 ||\n bestRatio >= 0.75);\n if (shouldSwitch) setDocumentState({ currentPage: bestPage });\n };\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIndex = parseInt(\n entry.target.getAttribute(\"data-page-index\") || \"0\"\n );\n if (!Number.isFinite(pageIndex)) return;\n intersectionRatiosRef.current[pageIndex] = entry.isIntersecting\n ? entry.intersectionRatio\n : 0;\n });\n if (frameRef.current != null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n flushCurrentPage();\n });\n },\n { root, threshold: [0.25, 0.5, 0.75] }\n );\n\n const pageElements = root.querySelectorAll(\".page-container\");\n pageElements.forEach((el) => observer.observe(el));\n return () => {\n if (frameRef.current != null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n pageElements.forEach((el) => observer.unobserve(el));\n observer.disconnect();\n };\n }, [pageCount, setDocumentState, currentPage]);\n\n const virtualOverscan = zoom > 1.35 ? 4 : BASE_OVERSCAN;\n const virtualAnchor = currentPage - 1;\n const virtualStart = Math.max(0, virtualAnchor - virtualOverscan);\n const virtualEnd = Math.min(pageCount - 1, virtualAnchor + virtualOverscan);\n const fallbackSize = useMemo(() => {\n if (basePageSize && availableWidth) {\n const fitScale = Math.min(\n 1,\n Math.max(0, availableWidth - 48) / basePageSize.width\n );\n return {\n width: Math.round(basePageSize.width * fitScale * zoom),\n height: Math.round(basePageSize.height * fitScale * zoom),\n };\n }\n const base = availableWidth ? Math.max(680, availableWidth * 1.3) : 1100;\n return {\n width: Math.round((availableWidth ?? 860) - 48),\n height: Math.round(base * zoom),\n };\n }, [basePageSize, availableWidth, zoom]);\n const averagePageHeight = useMemo(() => {\n const heights = Object.values(pageSizes).map((size) => size.height);\n if (!heights.length)\n return availableWidth ? Math.max(680, availableWidth * 1.3) : 1100;\n return Math.round(heights.reduce((sum, h) => sum + h, 0) / heights.length);\n }, [pageSizes, availableWidth]);\n const pages = Array.from({ length: pageCount }).map((_, i) => i);\n const handlePageMeasured = (\n pageIndex: number,\n size: { width: number; height: number }\n ) => {\n setPageSizes((prev) => {\n const current = prev[pageIndex];\n if (\n current &&\n current.width === size.width &&\n current.height === size.height\n )\n return prev;\n return { ...prev, [pageIndex]: size };\n });\n };\n const tools = [\n { id: \"select\", name: \"Select\", icon: \"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5\" },\n {\n id: \"highlight\",\n name: \"Highlight\",\n icon: \"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\",\n },\n {\n id: \"underline\",\n name: \"Underline\",\n icon: \"M6 3v6a6 6 0 0012 0V3M4 21h16\",\n },\n {\n id: \"squiggly\",\n name: \"Squiggly\",\n icon: \"M3 17c2-4 4-4 6 0s4 4 6 0 4-4 6 0\",\n },\n { id: \"strikeout\", name: \"Strike\", icon: \"M4 12h16M8 6h8M8 18h8\" },\n { id: \"ink\", name: \"Freehand\", icon: \"M4 19c4-6 7-9 10-9 3 0 5 2 6 5\" },\n {\n id: \"comment\",\n name: \"Note\",\n icon: \"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\",\n },\n ];\n\n const getTouchDistance = (\n touchA: { clientX: number; clientY: number },\n touchB: { clientX: number; clientY: number }\n ) => {\n const dx = touchA.clientX - touchB.clientX;\n const dy = touchA.clientY - touchB.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n };\n\n const flushPinchZoom = () => {\n const nextZoom = pinchRef.current.pendingZoom;\n pinchRef.current.pendingZoom = null;\n pinchRef.current.rafId = null;\n if (nextZoom == null) return;\n engine.setZoom(nextZoom);\n setDocumentState({ zoom: nextZoom });\n };\n\n const handleTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n if (event.touches.length < 2) return;\n const touchA = event.touches[0];\n const touchB = event.touches[1];\n pinchRef.current.active = true;\n pinchRef.current.startDistance = getTouchDistance(touchA, touchB);\n pinchRef.current.startZoom = zoom;\n event.preventDefault();\n };\n\n const handleTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!pinchRef.current.active || event.touches.length < 2) return;\n const touchA = event.touches[0];\n const touchB = event.touches[1];\n const nextDistance = getTouchDistance(touchA, touchB);\n if (!pinchRef.current.startDistance) return;\n const scale = nextDistance / pinchRef.current.startDistance;\n const nextZoom = Math.max(\n MIN_ZOOM,\n Math.min(MAX_ZOOM, pinchRef.current.startZoom * scale)\n );\n pinchRef.current.pendingZoom = nextZoom;\n if (pinchRef.current.rafId == null) {\n pinchRef.current.rafId = requestAnimationFrame(flushPinchZoom);\n }\n event.preventDefault();\n };\n\n const handleTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {\n if (event.touches.length >= 2) return;\n pinchRef.current.active = false;\n pinchRef.current.startDistance = 0;\n pinchRef.current.startZoom = zoom;\n if (\n pinchRef.current.pendingZoom != null &&\n pinchRef.current.rafId == null\n ) {\n engine.setZoom(pinchRef.current.pendingZoom);\n setDocumentState({ zoom: pinchRef.current.pendingZoom });\n pinchRef.current.pendingZoom = null;\n }\n };\n\n return (\n <div\n ref={viewerRef}\n data-papyrus-theme={uiTheme}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={handleTouchEnd}\n className={`papyrus-viewer papyrus-theme min-w-0 w-full flex-1 overflow-y-scroll overflow-x-hidden flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${\n isDark ? \"bg-[#121212]\" : \"bg-[#e9ecef]\"\n }`}\n >\n <div className=\"flex flex-col items-center gap-6 w-full min-w-0\">\n {pages.map((idx) => (\n <div\n key={idx}\n ref={(element) => {\n pageRefs.current[idx] = element;\n }}\n data-page-index={idx}\n className=\"page-container\"\n >\n {idx >= virtualStart && idx <= virtualEnd ? (\n <PageRenderer\n engine={engine}\n pageIndex={idx}\n availableWidth={availableWidth ?? undefined}\n onMeasuredSize={handlePageMeasured}\n />\n ) : (\n <div\n className={`inline-block mb-10 shadow-2xl border ${\n isDark\n ? \"bg-[#0f0f0f] border-[#2b2b2b]\"\n : \"bg-white border-gray-200\"\n }`}\n style={{\n width: pageSizes[idx]?.width ?? fallbackSize.width,\n height:\n pageSizes[idx]?.height ??\n Math.max(fallbackSize.height, averagePageHeight),\n }}\n />\n )}\n </div>\n ))}\n </div>\n {toolDockOpen && (\n <div\n className={`papyrus-tool-dock sticky ${toolDockPosition} w-full flex justify-center pointer-events-none z-[70]`}\n >\n <div\n className={`pointer-events-auto shadow-2xl rounded-2xl p-2 flex items-center border z-[80] ${\n isDark\n ? \"bg-[#2a2a2a]/90 border-[#3a3a3a] backdrop-blur-xl\"\n : \"bg-white/95 border-gray-100 backdrop-blur-md\"\n }`}\n >\n {tools.map((tool) => (\n <button\n key={tool.id}\n title={tool.name}\n aria-label={tool.name}\n onClick={() => setDocumentState({ activeTool: tool.id as any })}\n className={`w-10 h-10 rounded-xl flex items-center justify-center transition-all ${\n activeTool === tool.id\n ? \"text-white shadow-lg\"\n : \"text-gray-400\"\n }`}\n style={\n activeTool === tool.id\n ? { backgroundColor: accentColor }\n : undefined\n }\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={tool.icon}\n />\n </svg>\n </button>\n ))}\n <div className=\"w-px h-7 mx-2 bg-white/10\" />\n <div ref={colorPickerRef} className=\"relative\">\n <button\n title=\"Cor do marcador\"\n aria-label=\"Cor do marcador\"\n onClick={() => setColorPickerOpen((prev) => !prev)}\n className=\"w-9 h-9 rounded-full flex items-center justify-center border transition-all cursor-pointer relative\"\n style={{ borderColor: annotationColor }}\n >\n <span\n className=\"w-5 h-5 rounded-full\"\n style={{ backgroundColor: annotationColor }}\n />\n </button>\n {colorPickerOpen && (\n <div\n className={`absolute bottom-full left-1/2 -translate-x-1/2 mb-3 w-48 rounded-xl border p-3 shadow-2xl overflow-hidden ${\n isDark\n ? \"bg-[#1f1f1f] border-[#333]\"\n : \"bg-white border-gray-200\"\n }`}\n >\n <div className=\"grid grid-cols-4 gap-2 mb-3\">\n {colorPalette.map((color) => (\n <button\n key={color}\n onClick={() => {\n setAnnotationColor(color);\n setColorPickerOpen(false);\n }}\n className=\"w-7 h-7 rounded-full border transition-all\"\n style={{\n backgroundColor: color,\n borderColor:\n color === annotationColor ? \"#fff\" : \"transparent\",\n }}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2 w-full\">\n <span className=\"text-[10px] uppercase tracking-widest text-gray-400 shrink-0\">\n Hex\n </span>\n <input\n type=\"text\"\n value={annotationColor.toUpperCase()}\n onChange={(e) => {\n const next = e.target.value.trim();\n if (\n next.startsWith(\"#\") &&\n (next.length === 4 || next.length === 7)\n ) {\n setAnnotationColor(next);\n }\n }}\n className={`flex-1 min-w-0 w-full text-xs rounded-md px-2 py-1 border ${\n isDark\n ? \"bg-[#2a2a2a] border-[#444] text-white\"\n : \"bg-gray-100 border-gray-200 text-gray-700\"\n }`}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\nexport default Viewer;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useViewerStore, papyrusEvents } from \"@papyrus-sdk/core\";\nimport {\n DocumentEngine,\n Annotation,\n PapyrusEventType,\n} from \"@papyrus-sdk/types\";\n\ninterface PageRendererProps {\n engine: DocumentEngine;\n pageIndex: number;\n availableWidth?: number;\n onMeasuredSize?: (\n pageIndex: number,\n size: { width: number; height: number }\n ) => void;\n}\n\nconst PageRenderer: React.FC<PageRendererProps> = ({\n engine,\n pageIndex,\n availableWidth,\n onMeasuredSize,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const htmlLayerRef = useRef<HTMLDivElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n\n const [loading, setLoading] = useState(true);\n const [pageSize, setPageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\n const [currentRect, setCurrentRect] = useState({ x: 0, y: 0, w: 0, h: 0 });\n const [textLayerVersion, setTextLayerVersion] = useState(0);\n const [selectionMenu, setSelectionMenu] = useState<{\n rects: { x: number; y: number; width: number; height: number }[];\n rect: { x: number; y: number; width: number; height: number };\n text: string;\n anchor: { x: number; y: number };\n } | null>(null);\n const [isInkDrawing, setIsInkDrawing] = useState(false);\n const [inkPoints, setInkPoints] = useState<{ x: number; y: number }[]>([]);\n\n const {\n zoom,\n rotation,\n pageTheme,\n scrollToPageSignal,\n setDocumentState,\n annotations,\n addAnnotation,\n activeTool,\n removeAnnotation,\n selectedAnnotationId,\n setSelectedAnnotation,\n accentColor,\n annotationColor,\n searchQuery,\n searchResults,\n activeSearchIndex,\n } = useViewerStore();\n const renderTargetType = engine.getRenderTargetType?.() ?? \"canvas\";\n const isElementRender = renderTargetType === \"element\";\n const textMarkupTools = new Set([\n \"highlight\",\n \"underline\",\n \"squiggly\",\n \"strikeout\",\n ]);\n const canSelectText =\n activeTool === \"select\" || textMarkupTools.has(activeTool);\n const hasSearchHits = useMemo(\n () =>\n Boolean(searchQuery?.trim()) &&\n searchResults.some((res) => res.pageIndex === pageIndex),\n [searchQuery, searchResults, pageIndex]\n );\n\n useEffect(() => {\n let active = true;\n const loadSize = async () => {\n try {\n const size = await engine.getPageDimensions(pageIndex);\n if (!active) return;\n if (size.width > 0 && size.height > 0) {\n setPageSize(size);\n }\n } catch {\n // Ignore size errors to avoid blocking rendering.\n }\n };\n loadSize();\n return () => {\n active = false;\n };\n }, [engine, pageIndex]);\n\n const fitScale = useMemo(() => {\n if (!availableWidth || !pageSize?.width) return 1;\n const targetWidth = Math.max(0, availableWidth - 48);\n if (!targetWidth) return 1;\n return Math.min(1, targetWidth / pageSize.width);\n }, [availableWidth, pageSize]);\n\n const displaySize = useMemo(() => {\n if (!pageSize) return null;\n const scale = zoom * fitScale;\n return {\n width: pageSize.width * scale,\n height: pageSize.height * scale,\n };\n }, [pageSize, zoom, fitScale]);\n\n useEffect(() => {\n if (!displaySize || !onMeasuredSize) return;\n onMeasuredSize(pageIndex, {\n width: Math.round(displaySize.width),\n height: Math.round(displaySize.height),\n });\n }, [displaySize, onMeasuredSize, pageIndex]);\n\n useEffect(() => {\n if (scrollToPageSignal === pageIndex) {\n setDocumentState({ scrollToPageSignal: null });\n }\n }, [scrollToPageSignal, pageIndex, setDocumentState]);\n\n useEffect(() => {\n let active = true;\n const render = async () => {\n const renderTarget = isElementRender\n ? htmlLayerRef.current\n : canvasRef.current;\n if (!renderTarget || !textLayerRef.current) return;\n setLoading(true);\n\n try {\n const RENDER_SCALE = 2.0;\n const canvasRenderScale = isElementRender\n ? 1.0\n : RENDER_SCALE * fitScale;\n const textRenderScale = isElementRender ? 1.0 : fitScale;\n if (!isElementRender && canvasRef.current && displaySize) {\n // Apply CSS size before rendering to avoid temporary horizontal jumps.\n canvasRef.current.style.width = `${displaySize.width}px`;\n canvasRef.current.style.height = `${displaySize.height}px`;\n }\n\n // A UI solicita renderização passando o \"alvo\" (Canvas/Div).\n // Ela não sabe se o motor usa PDF.js ou se está gerando um bitmap.\n await engine.renderPage(pageIndex, renderTarget, canvasRenderScale);\n\n if (!isElementRender && !pageSize && canvasRef.current) {\n const denom = canvasRenderScale * Math.max(zoom, 0.01);\n if (denom > 0) {\n setPageSize({\n width: canvasRef.current.width / denom,\n height: canvasRef.current.height / denom,\n });\n }\n }\n\n if (!active || !textLayerRef.current) return;\n if (!isElementRender) {\n textLayerRef.current.innerHTML = \"\";\n await engine.renderTextLayer(\n pageIndex,\n textLayerRef.current,\n textRenderScale\n );\n }\n\n if (!active || !textLayerRef.current) return;\n if (!isElementRender && displaySize) {\n if (canvasRef.current) {\n canvasRef.current.style.width = `${displaySize.width}px`;\n canvasRef.current.style.height = `${displaySize.height}px`;\n }\n textLayerRef.current.style.width = `${displaySize.width}px`;\n textLayerRef.current.style.height = `${displaySize.height}px`;\n }\n setTextLayerVersion((v) => v + 1);\n } catch (err) {\n if (!active) return;\n console.error(\"[Papyrus] Falha na renderização:\", err);\n } finally {\n if (active) setLoading(false);\n }\n };\n\n render();\n return () => {\n active = false;\n };\n }, [\n engine,\n pageIndex,\n zoom,\n rotation,\n isElementRender,\n fitScale,\n displaySize,\n pageSize,\n ]);\n\n useEffect(() => {\n if (isElementRender) return;\n const layer = textLayerRef.current;\n if (!layer) return;\n const query = searchQuery?.trim().toLowerCase();\n const existingMarks = Array.from(\n layer.querySelectorAll(\"mark.papyrus-search-hit\")\n ) as HTMLElement[];\n existingMarks.forEach((mark) => {\n const parent = mark.parentNode;\n if (!parent) return;\n while (mark.firstChild) parent.insertBefore(mark.firstChild, mark);\n parent.removeChild(mark);\n parent.normalize();\n });\n if (!query || !hasSearchHits) return;\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(layer, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const text = node.nodeValue ?? \"\";\n if (!text.trim()) return NodeFilter.FILTER_REJECT;\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n while (walker.nextNode()) {\n nodes.push(walker.currentNode as Text);\n }\n nodes.forEach((textNode) => {\n const text = textNode.nodeValue ?? \"\";\n const lower = text.toLowerCase();\n if (!lower.includes(query)) return;\n const fragment = document.createDocumentFragment();\n let cursor = 0;\n let index = lower.indexOf(query, cursor);\n while (index !== -1) {\n if (index > cursor) {\n fragment.appendChild(\n document.createTextNode(text.slice(cursor, index))\n );\n }\n const mark = document.createElement(\"mark\");\n mark.className = \"papyrus-search-hit\";\n mark.textContent = text.slice(index, index + query.length);\n fragment.appendChild(mark);\n cursor = index + query.length;\n index = lower.indexOf(query, cursor);\n }\n if (cursor < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(cursor)));\n }\n const parent = textNode.parentNode;\n if (parent) parent.replaceChild(fragment, textNode);\n });\n }, [\n searchQuery,\n hasSearchHits,\n pageIndex,\n isElementRender,\n activeSearchIndex,\n textLayerVersion,\n ]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n setSelectionMenu(null);\n if (activeTool === \"ink\") {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n setIsInkDrawing(true);\n setInkPoints([{ x, y }]);\n return;\n }\n if (canSelectText) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n setIsDragging(true);\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setStartPos({ x, y });\n setCurrentRect({ x, y, w: 0, h: 0 });\n };\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isInkDrawing) {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n setInkPoints((prev) => [...prev, { x, y }]);\n return;\n }\n if (!isDragging) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const currentX = e.clientX - rect.left;\n const currentY = e.clientY - rect.top;\n\n setCurrentRect({\n x: Math.min(startPos.x, currentX),\n y: Math.min(startPos.y, currentY),\n w: Math.abs(currentX - startPos.x),\n h: Math.abs(currentY - startPos.y),\n });\n };\n\n const handleMouseUp = (e: React.MouseEvent) => {\n if (isInkDrawing) {\n setIsInkDrawing(false);\n if (inkPoints.length > 1) {\n const xs = inkPoints.map((p) => p.x);\n const ys = inkPoints.map((p) => p.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n const width = Math.max(maxX - minX, 0.0005);\n const height = Math.max(maxY - minY, 0.0005);\n const path = inkPoints.map((p) => ({\n x: Math.max(0, Math.min(1, p.x)),\n y: Math.max(0, Math.min(1, p.y)),\n }));\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: \"ink\",\n rect: { x: minX, y: minY, width, height },\n path,\n color: annotationColor,\n createdAt: Date.now(),\n });\n }\n setInkPoints([]);\n return;\n }\n\n const selection = window.getSelection();\n const selectionText = selection?.toString().trim() ?? \"\";\n if (\n selectionText &&\n textLayerRef.current &&\n containerRef.current &&\n selection &&\n selection.rangeCount > 0\n ) {\n const range = selection.getRangeAt(0);\n if (textLayerRef.current.contains(range.commonAncestorContainer)) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects());\n const rects = clientRects\n .filter((r) => r.width > 1 && r.height > 1)\n .map((r) => {\n const x = (r.left - containerRect.left) / containerRect.width;\n const y = (r.top - containerRect.top) / containerRect.height;\n const width = r.width / containerRect.width;\n const height = r.height / containerRect.height;\n return {\n x: Math.max(0, Math.min(1, x)),\n y: Math.max(0, Math.min(1, y)),\n width: Math.max(0, Math.min(1, width)),\n height: Math.max(0, Math.min(1, height)),\n };\n });\n const uniqueRects = rects.filter((rect, index, list) => {\n const key = `${Math.round(rect.x * 10000)}-${Math.round(\n rect.y * 10000\n )}-${Math.round(rect.width * 10000)}-${Math.round(\n rect.height * 10000\n )}`;\n return (\n list.findIndex(\n (r) =>\n `${Math.round(r.x * 10000)}-${Math.round(\n r.y * 10000\n )}-${Math.round(r.width * 10000)}-${Math.round(\n r.height * 10000\n )}` === key\n ) === index\n );\n });\n const mergedRects = uniqueRects.reduce(\n (acc: typeof uniqueRects, rect) => {\n const target = acc.find((r) => {\n const closeY =\n Math.abs(r.y - rect.y) < 0.002 &&\n Math.abs(r.height - rect.height) < 0.002;\n const overlaps =\n rect.x <= r.x + r.width + 0.002 &&\n rect.x + rect.width >= r.x - 0.002;\n return closeY && overlaps;\n });\n if (!target) {\n acc.push({ ...rect });\n return acc;\n }\n const left = Math.min(target.x, rect.x);\n const right = Math.max(\n target.x + target.width,\n rect.x + rect.width\n );\n target.x = left;\n target.width = right - left;\n return acc;\n },\n []\n );\n if (mergedRects.length) {\n const xs = mergedRects.map((r) => r.x);\n const ys = mergedRects.map((r) => r.y);\n const xe = mergedRects.map((r) => r.x + r.width);\n const ye = mergedRects.map((r) => r.y + r.height);\n const rect = {\n x: Math.min(...xs),\n y: Math.min(...ys),\n width: Math.max(...xe) - Math.min(...xs),\n height: Math.max(...ye) - Math.min(...ys),\n };\n if (textMarkupTools.has(activeTool)) {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: activeTool as Annotation[\"type\"],\n rect,\n rects: mergedRects,\n color: annotationColor,\n content: selectionText,\n createdAt: Date.now(),\n });\n selection.removeAllRanges();\n setSelectionMenu(null);\n return;\n }\n if (activeTool === \"select\") {\n const anchorX = (rect.x + rect.width) * containerRect.width;\n const anchorY = rect.y * containerRect.height;\n setSelectionMenu({\n rects: mergedRects,\n rect,\n text: selectionText,\n anchor: {\n x: Math.max(12, Math.min(containerRect.width - 12, anchorX)),\n y: Math.max(12, anchorY - 32),\n },\n });\n }\n }\n }\n }\n\n if (isDragging) {\n setIsDragging(false);\n if (currentRect.w > 5 && currentRect.h > 5) {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect) {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: activeTool as any,\n rect: {\n x: currentRect.x / rect.width,\n y: currentRect.y / rect.height,\n width: currentRect.w / rect.width,\n height: currentRect.h / rect.height,\n },\n color: activeTool === \"highlight\" ? annotationColor : accentColor,\n content:\n activeTool === \"text\" || activeTool === \"comment\"\n ? \"\"\n : undefined,\n createdAt: Date.now(),\n });\n }\n }\n setCurrentRect({ x: 0, y: 0, w: 0, h: 0 });\n return;\n }\n\n if (activeTool === \"select\") {\n const selectedText = selection?.toString().trim();\n if (selectedText) {\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, {\n text: selectedText,\n pageIndex: pageIndex,\n });\n }\n }\n };\n\n const getPageFilter = () => {\n switch (pageTheme) {\n case \"sepia\":\n return \"sepia(0.6) contrast(1.1) brightness(0.95)\";\n case \"dark\":\n return \"invert(0.9) hue-rotate(180deg) brightness(1.1)\";\n case \"high-contrast\":\n return \"contrast(2) grayscale(1)\";\n default:\n return \"none\";\n }\n };\n\n return (\n <div\n ref={containerRef}\n className={`relative inline-block shadow-2xl bg-white mb-10 ${\n canSelectText ? \"\" : \"no-select cursor-crosshair\"\n }`}\n style={{ scrollMarginTop: \"20px\", minHeight: \"100px\" }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n >\n {loading && (\n <div className=\"absolute inset-0 bg-gray-50 flex items-center justify-center z-10 animate-pulse\">\n <span className=\"text-[10px] font-black text-gray-400 uppercase tracking-widest\">\n Sincronizando...\n </span>\n </div>\n )}\n\n <canvas\n ref={canvasRef}\n style={{\n filter: getPageFilter(),\n display: isElementRender ? \"none\" : \"block\",\n }}\n className=\"block\"\n />\n <div\n ref={htmlLayerRef}\n className=\"block\"\n style={{\n filter: getPageFilter(),\n display: isElementRender ? \"block\" : \"none\",\n }}\n />\n\n <div\n ref={textLayerRef}\n className=\"textLayer\"\n style={{\n pointerEvents: isElementRender\n ? \"none\"\n : canSelectText\n ? \"auto\"\n : \"none\",\n display: isElementRender ? \"none\" : \"block\",\n }}\n />\n\n {isDragging && (\n <div\n className=\"absolute border-2 z-[40] pointer-events-none\"\n style={{\n borderColor:\n activeTool === \"highlight\" ? annotationColor : accentColor,\n backgroundColor:\n activeTool === \"highlight\"\n ? `${annotationColor}66`\n : `${accentColor}33`,\n mixBlendMode: activeTool === \"highlight\" ? \"multiply\" : undefined,\n left: currentRect.x,\n top: currentRect.y,\n width: currentRect.w,\n height: currentRect.h,\n }}\n />\n )}\n\n {isInkDrawing && inkPoints.length > 1 && (\n <svg\n className=\"absolute inset-0 pointer-events-none z-[45]\"\n viewBox=\"0 0 1 1\"\n preserveAspectRatio=\"none\"\n style={{ width: \"100%\", height: \"100%\" }}\n >\n <path\n d={inkPoints\n .map((p, idx) => `${idx === 0 ? \"M\" : \"L\"} ${p.x} ${p.y}`)\n .join(\" \")}\n fill=\"none\"\n stroke={annotationColor}\n strokeWidth={0.008}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {selectionMenu && (\n <div\n className=\"absolute z-[60] flex items-center gap-1 rounded-full border px-2 py-1 shadow-xl bg-white/95 backdrop-blur-md text-gray-700\"\n style={{ left: selectionMenu.anchor.x, top: selectionMenu.anchor.y }}\n >\n {[\n { id: \"highlight\", label: \"Marcar\" },\n { id: \"underline\", label: \"Sublinhar\" },\n { id: \"squiggly\", label: \"Onda\" },\n { id: \"strikeout\", label: \"Risco\" },\n ].map((action) => (\n <button\n key={action.id}\n className=\"text-[10px] font-bold px-2 py-1 rounded-full hover:bg-gray-100\"\n onClick={() => {\n addAnnotation({\n id: Math.random().toString(36).substr(2, 9),\n pageIndex,\n type: action.id as Annotation[\"type\"],\n rect: selectionMenu.rect,\n rects: selectionMenu.rects,\n content: selectionMenu.text,\n color: annotationColor,\n createdAt: Date.now(),\n });\n window.getSelection()?.removeAllRanges();\n setSelectionMenu(null);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"absolute inset-0 pointer-events-none z-20\">\n {annotations\n .filter((a) => a.pageIndex === pageIndex)\n .map((ann) => (\n <AnnotationItem\n key={ann.id}\n ann={ann}\n isSelected={selectedAnnotationId === ann.id}\n accentColor={accentColor}\n onDelete={() => removeAnnotation(ann.id)}\n onSelect={() => setSelectedAnnotation(ann.id)}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst AnnotationItem: React.FC<{\n ann: Annotation;\n isSelected: boolean;\n accentColor: string;\n onDelete: () => void;\n onSelect: () => void;\n}> = ({ ann, isSelected, accentColor, onDelete, onSelect }) => {\n const isText = ann.type === \"text\" || ann.type === \"comment\";\n const isHighlight = ann.type === \"highlight\";\n const isMarkup =\n ann.type === \"highlight\" ||\n ann.type === \"underline\" ||\n ann.type === \"squiggly\" ||\n ann.type === \"strikeout\";\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [ann.rect];\n const isInk = ann.type === \"ink\" && ann.path && ann.path.length > 1;\n\n const renderMarkupRects = () => {\n if (!isMarkup) return null;\n return rects.map((r, idx) => {\n const left = ann.rect.width\n ? ((r.x - ann.rect.x) / ann.rect.width) * 100\n : 0;\n const top = ann.rect.height\n ? ((r.y - ann.rect.y) / ann.rect.height) * 100\n : 0;\n const width = ann.rect.width ? (r.width / ann.rect.width) * 100 : 100;\n const height = ann.rect.height ? (r.height / ann.rect.height) * 100 : 100;\n if (ann.type === \"highlight\") {\n return (\n <div\n key={idx}\n className=\"absolute rounded-sm\"\n style={{\n left: `${left}%`,\n top: `${top}%`,\n width: `${width}%`,\n height: `${height}%`,\n backgroundColor: `${ann.color}88`,\n mixBlendMode: \"multiply\",\n }}\n />\n );\n }\n\n const lineStyle: React.CSSProperties = {\n left: `${left}%`,\n width: `${width}%`,\n };\n\n if (ann.type === \"underline\") {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height}% - 2px)`,\n height: \"2px\",\n backgroundColor: ann.color,\n }}\n />\n );\n }\n\n if (ann.type === \"strikeout\") {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height * 0.5}% - 1px)`,\n height: \"2px\",\n backgroundColor: ann.color,\n }}\n />\n );\n }\n\n if (ann.type === \"squiggly\") {\n return (\n <div\n key={idx}\n className=\"absolute\"\n style={{\n ...lineStyle,\n top: `calc(${top}% + ${height}% - 4px)`,\n height: \"4px\",\n backgroundImage: `linear-gradient(135deg, transparent 75%, ${ann.color} 0), linear-gradient(225deg, transparent 75%, ${ann.color} 0)`,\n backgroundSize: \"6px 6px\",\n backgroundPosition: \"0 0, 3px 3px\",\n }}\n />\n );\n }\n return null;\n });\n };\n\n const renderInk = () => {\n if (!isInk || !ann.path) return null;\n const d = ann.path\n .map((p, idx) => `${idx === 0 ? \"M\" : \"L\"} ${p.x} ${p.y}`)\n .join(\" \");\n return (\n <svg\n className=\"absolute inset-0\"\n viewBox={`${ann.rect.x} ${ann.rect.y} ${ann.rect.width} ${ann.rect.height}`}\n preserveAspectRatio=\"none\"\n >\n <path\n d={d}\n fill=\"none\"\n stroke={ann.color}\n strokeWidth={0.008}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n };\n\n return (\n <div\n className={`absolute pointer-events-auto transition-all ${\n isSelected ? \"shadow-xl z-30\" : \"z-10\"\n }`}\n style={{\n left: `${ann.rect.x * 100}%`,\n top: `${ann.rect.y * 100}%`,\n width: `${ann.rect.width * 100}%`,\n height: `${ann.rect.height * 100}%`,\n backgroundColor:\n !isMarkup && isHighlight ? `${ann.color}88` : \"transparent\",\n mixBlendMode: !isMarkup && isHighlight ? \"multiply\" : undefined,\n borderBottom:\n ann.type === \"strikeout\" && !isMarkup\n ? `2px solid ${ann.color}`\n : \"none\",\n outline: isSelected ? `2px solid ${accentColor}` : undefined,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect();\n }}\n >\n {renderMarkupRects()}\n {renderInk()}\n {isText && isSelected && (\n <div className=\"absolute top-full mt-2 w-64 bg-white shadow-2xl rounded-xl p-4 border border-gray-100 z-50\">\n <textarea\n className=\"w-full bg-transparent border-none focus:ring-0 p-0 text-gray-800 text-xs font-medium\"\n placeholder=\"Escreva sua nota...\"\n rows={3}\n defaultValue={ann.content || \"\"}\n autoFocus\n />\n </div>\n )}\n {isSelected && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className=\"absolute -top-3 -right-3 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n};\n\nexport default PageRenderer;\n"],"mappings":"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","names":["useEffect","useRef","useState","useViewerStore","jsx","jsxs","useState","useViewerStore","jsx","jsxs","withAlpha","useEffect","useMemo","useRef","useState","useViewerStore","useEffect","useRef","useState","useViewerStore","jsx","jsxs","rect","x","y","jsx","jsxs","useViewerStore","useRef","useState","useEffect","useMemo"]}