@papyrus-sdk/ui-react 0.2.7 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/base.css +92 -38
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +909 -274
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +907 -272
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["\nexport { default as Topbar } from './components/Topbar';\nexport { default as SidebarLeft } from './components/SidebarLeft';\nexport { default as SidebarRight } from './components/SidebarRight';\nexport { default as Viewer } from './components/Viewer';\nexport { default as PageRenderer } from './components/PageRenderer';\n","\r\nimport React, { useRef, useState, useEffect } from 'react';\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 = true,\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, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\n } = useViewerStore();\n\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const [pageInput, setPageInput] = useState(currentPage.toString());\r\n const [showPageThemes, setShowPageThemes] = useState(false);\r\n const isDark = uiTheme === 'dark';\r\n\r\n useEffect(() => { setPageInput(currentPage.toString()); }, [currentPage]);\r\n\r\n const handleZoom = (delta: number) => {\r\n const newZoom = Math.max(0.2, Math.min(5, zoom + delta));\r\n engine.setZoom(newZoom);\r\n setDocumentState({ zoom: newZoom });\r\n };\r\n\r\n const handlePageChange = (page: number) => {\r\n if (pageCount <= 0) return;\r\n const p = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));\r\n engine.goToPage(p);\r\n setDocumentState({ currentPage: p });\r\n triggerScrollToPage(p - 1);\r\n };\r\n\r\n const themes: { id: PageTheme; name: string; color: string }[] = [\r\n { id: 'normal', name: 'Original', color: 'bg-white' },\r\n { id: 'sepia', name: 'Sépia', color: 'bg-[#f4ecd8]' },\r\n { id: 'dark', name: 'Invertido', color: 'bg-gray-800' },\r\n { id: 'high-contrast', name: 'Contraste', color: 'bg-black' },\r\n ];\r\n\r\n return (\r\n <div className={`papyrus-topbar h-14 border-b flex items-center justify-between px-4 z-50 transition-colors duration-200 ${isDark ? 'bg-[#1a1a1a] border-[#333] text-white' : 'bg-white border-gray-200 text-gray-800'}`}>\n <div className=\"flex items-center space-x-3\">\n {showSidebarLeftToggle && (\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" /></svg>\n </button>\n )}\n {showBrand && (brand ?? (\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\n </span>\n ))}\n {title && (\n <span className={`text-sm font-semibold truncate max-w-[220px] ${isDark ? 'text-gray-200' : 'text-gray-700'}`} title={typeof title === 'string' ? title : undefined}>\n {title}\n </span>\n )}\n </div>\n\n {(showPageControls || showZoomControls) && (\n <div className=\"flex items-center space-x-4\">\n {showPageControls && (\n <div className={`flex items-center rounded-lg p-1 space-x-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" /></svg>\n </button>\n <input \n type=\"text\" \n className=\"w-10 text-center bg-transparent focus:outline-none font-bold text-sm\" \n value={pageInput} \n onChange={(e) => setPageInput(e.target.value)} \n onKeyDown={(e) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\n onBlur={() => handlePageChange(parseInt(pageInput))} \n />\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount > 0 ? pageCount : '—'}</span>\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" /></svg>\n </button>\n </div>\n )}\n\n {showZoomControls && (\n <div className={`flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" /></svg>\n </button>\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" /></svg>\n </button>\n </div>\n )}\n </div>\n )}\n\n <div className=\"flex items-center space-x-3\">\n {/* Page Theme Dropdown */}\n {showPageThemeSelector && (\n <div className=\"relative\">\n <button \n onClick={() => setShowPageThemes(!showPageThemes)}\n className={`flex items-center space-x-2 px-3 py-1.5 rounded-md text-xs font-bold border transition-all ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}\n >\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\n <span>TEMA</span>\n </button>\n {showPageThemes && (\n <div className={`absolute top-full right-0 mt-2 w-48 rounded-lg shadow-xl border p-2 z-[60] ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-white border-gray-200'}`}>\n {themes.map(t => (\n <button \n key={t.id}\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\n className={`w-full flex items-center space-x-3 px-3 py-2 rounded-md text-sm ${pageTheme === t.id ? 'text-white' : isDark ? 'hover:bg-white/10 text-gray-300' : 'hover:bg-gray-50 text-gray-700'}`}\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\n >\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\n <span>{t.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {showUIToggle && (\n <button onClick={() => setDocumentState({ uiTheme: isDark ? 'light' : 'dark' })} className={`p-2 rounded-full ${isDark ? 'bg-yellow-500/10 text-yellow-500' : 'bg-gray-100 text-gray-500'}`}>\n {isDark ? <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><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\" /></svg> : <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z\" /></svg>}\n </button>\n )}\n\n {showUpload && (\n <>\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"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 <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf,.epub,.txt\" onChange={async (e) => {\n const file = e.target.files?.[0];\n if (file) {\n setDocumentState({ isLoaded: false });\n await engine.load(file);\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\n }\n }} />\n </>\n )}\n\n {showSearch && (\n <button onClick={() => toggleSidebarRight('search')} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}><svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" /></svg></button>\n )}\n </div>\n </div>\n );\n};\nexport default Topbar;\n","\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, OutlineItem } from '@papyrus-sdk/types';\r\n\r\ninterface SidebarLeftProps {\r\n engine: DocumentEngine;\r\n}\r\n\r\nconst withAlpha = (hex: string, alpha: number) => {\r\n const normalized = hex.replace('#', '').trim();\r\n const value =\r\n normalized.length === 3\r\n ? normalized\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : normalized;\r\n if (value.length !== 6) return hex;\r\n const r = parseInt(value.slice(0, 2), 16);\r\n const g = parseInt(value.slice(2, 4), 16);\r\n const b = parseInt(value.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n};\r\n\r\nconst Thumbnail: React.FC<{ engine: DocumentEngine; pageIndex: number; active: boolean; isDark: boolean; accentColor: string; onClick: () => void }> = ({ engine, pageIndex, active, isDark, accentColor, onClick }) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const htmlRef = useRef<HTMLDivElement>(null);\r\n const accentSoft = withAlpha(accentColor, 0.12);\r\n const renderTargetType = engine.getRenderTargetType?.() ?? 'canvas';\r\n\r\n useEffect(() => {\r\n if (renderTargetType === 'element') return;\r\n const target = canvasRef.current;\r\n if (target) {\r\n engine.renderPage(pageIndex, target, 0.15).catch((err) => {\r\n console.error('[Papyrus] Thumbnail render failed:', err);\r\n });\r\n }\r\n }, [engine, pageIndex, renderTargetType]);\r\n\r\n return (\r\n <div \r\n onClick={onClick}\r\n className={`p-3 cursor-pointer transition-all rounded-lg border-2 ${active ? 'shadow-sm' : 'border-transparent'}`}\r\n style={active ? { borderColor: accentColor, backgroundColor: accentSoft } : undefined}\r\n >\r\n <div className=\"flex flex-col items-center\">\r\n <div className={`shadow-lg rounded overflow-hidden mb-2 border ${isDark ? 'border-[#333]' : 'border-gray-200'}`}>\r\n <canvas\r\n ref={canvasRef}\r\n className=\"max-w-full h-auto bg-white\"\r\n style={{ display: renderTargetType === 'element' ? 'none' : 'block' }}\r\n />\r\n <div\r\n ref={htmlRef}\r\n className=\"bg-white\"\r\n style={{\r\n width: 90,\r\n height: 120,\r\n display: renderTargetType === 'element' ? 'block' : 'none',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {renderTargetType === 'element' && (\r\n <div className=\"w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500\">\r\n HTML\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <span className={`text-[11px] font-bold ${active ? '' : isDark ? 'text-gray-500' : 'text-gray-400'}`} style={active ? { color: accentColor } : undefined}>{pageIndex + 1}</span>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst OutlineNode: React.FC<{ item: OutlineItem; engine: DocumentEngine; isDark: boolean; accentColor: string; depth?: number }> = ({ item, engine, isDark, accentColor, depth = 0 }) => {\r\n const { triggerScrollToPage, outlineSearchQuery } = useViewerStore();\r\n const [expanded, setExpanded] = useState(true);\r\n const accentSoft = withAlpha(accentColor, 0.2);\r\n\r\n const matchesSearch = outlineSearchQuery === '' || item.title.toLowerCase().includes(outlineSearchQuery.toLowerCase());\r\n const hasMatchingChildren = item.children?.some(child => child.title.toLowerCase().includes(outlineSearchQuery.toLowerCase()));\r\n\r\n if (!matchesSearch && !hasMatchingChildren && outlineSearchQuery !== '') return null;\r\n\r\n const handleClick = () => {\r\n if (item.pageIndex >= 0) {\r\n engine.goToPage(item.pageIndex + 1);\r\n triggerScrollToPage(item.pageIndex);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n <div \r\n className={`flex items-center py-1.5 px-3 rounded-md transition-colors group ${item.pageIndex >= 0 ? 'cursor-pointer' : 'cursor-default'} ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}\r\n style={{ paddingLeft: `${depth * 14 + 8}px` }}\r\n onClick={handleClick}\r\n >\r\n {item.children && item.children.length > 0 ? (\r\n <button \r\n className={`mr-1 text-gray-400 transition-transform p-1`}\r\n style={{ color: accentColor, transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\r\n onClick={(e) => { e.stopPropagation(); setExpanded(!expanded); }}\r\n >\r\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n ) : <div className=\"w-5\" />}\r\n <span\r\n className={`text-[13px] leading-tight font-medium truncate ${isDark ? 'text-gray-200' : 'text-gray-700'}`}\r\n style={matchesSearch && outlineSearchQuery ? { backgroundColor: accentSoft, color: accentColor } : undefined}\r\n >\r\n {item.title}\r\n </span>\r\n </div>\r\n {expanded && item.children && item.children.length > 0 && (\r\n <div className=\"flex flex-col\">\r\n {item.children.map((child, i) => (\r\n <OutlineNode key={i} item={child} engine={engine} isDark={isDark} accentColor={accentColor} depth={depth + 1} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst SidebarLeft: React.FC<SidebarLeftProps> = ({ engine }) => {\r\n const { \r\n pageCount, currentPage, setDocumentState, sidebarLeftOpen, uiTheme, \r\n triggerScrollToPage, sidebarLeftTab, setSidebarLeftTab, outline,\r\n outlineSearchQuery, setOutlineSearch, accentColor\r\n } = useViewerStore();\r\n const isDark = uiTheme === 'dark';\r\n\r\n if (!sidebarLeftOpen) return null;\r\n\r\n return (\r\n <div className={`papyrus-sidebar-left w-72 border-r flex flex-col h-full shrink-0 overflow-hidden transition-colors duration-200 ${isDark ? 'bg-[#2a2a2a] border-[#3a3a3a]' : 'bg-[#fcfcfc] border-gray-200'}`}>\n <div className={`p-4 border-b flex flex-col space-y-4 ${isDark ? 'border-[#3a3a3a]' : 'border-gray-100'}`}>\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className={`text-sm font-bold uppercase tracking-widest ${isDark ? 'text-gray-100' : 'text-gray-800'}`}>\r\n {sidebarLeftTab === 'thumbnails' ? 'Thumbnails' : 'Sumário'}\r\n </h3>\r\n <button onClick={() => setDocumentState({ sidebarLeftOpen: false })} className=\"text-gray-400 hover:text-gray-600\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" /></svg>\r\n </button>\r\n </div>\r\n <div className=\"flex gap-1\">\r\n <button\r\n onClick={() => setSidebarLeftTab('thumbnails')}\r\n className={`p-2 rounded-md ${sidebarLeftTab === 'thumbnails' ? (isDark ? 'bg-white/10 text-white' : 'bg-white shadow-sm border border-gray-200') : 'text-gray-400'}`}\r\n style={sidebarLeftTab === 'thumbnails' && !isDark ? { color: accentColor } : undefined}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2 2V6z\" /></svg>\r\n </button>\r\n <button\r\n onClick={() => setSidebarLeftTab('summary')}\r\n className={`p-2 rounded-md ${sidebarLeftTab === 'summary' ? (isDark ? 'bg-white/10 text-white' : 'bg-white shadow-sm border border-gray-200') : 'text-gray-400'}`}\r\n style={sidebarLeftTab === 'summary' && !isDark ? { color: accentColor } : undefined}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div className=\"flex-1 overflow-y-auto custom-scrollbar p-3\">\r\n {sidebarLeftTab === 'thumbnails' ? (\r\n <div className=\"space-y-1\">\r\n {Array.from({ length: pageCount }).map((_, idx) => (\r\n <Thumbnail key={idx} engine={engine} pageIndex={idx} isDark={isDark} accentColor={accentColor} active={currentPage === idx + 1} onClick={() => { engine.goToPage(idx + 1); setDocumentState({ currentPage: idx + 1 }); triggerScrollToPage(idx); }} />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col space-y-0.5\">\r\n {outline.map((item, i) => (<OutlineNode key={i} item={item} engine={engine} isDark={isDark} accentColor={accentColor} />))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default SidebarLeft;\r\n","\r\nimport React, { useState } from 'react';\r\nimport { useViewerStore, SearchService } from '@papyrus-sdk/core';\r\nimport { DocumentEngine } from '@papyrus-sdk/types';\r\n\r\ninterface SidebarRightProps { engine: DocumentEngine; }\r\n\r\nconst withAlpha = (hex: string, alpha: number) => {\r\n const normalized = hex.replace('#', '').trim();\r\n const value =\r\n normalized.length === 3\r\n ? normalized\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : normalized;\r\n if (value.length !== 6) return hex;\r\n const r = parseInt(value.slice(0, 2), 16);\r\n const g = parseInt(value.slice(2, 4), 16);\r\n const b = parseInt(value.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n};\r\n\r\nconst SidebarRight: React.FC<SidebarRightProps> = ({ engine }) => {\r\n const { \r\n sidebarRightOpen, sidebarRightTab, toggleSidebarRight, searchResults, activeSearchIndex,\r\n uiTheme, setSearch, setDocumentState, triggerScrollToPage, annotations, accentColor\r\n } = useViewerStore();\r\n\r\n const [query, setQuery] = useState('');\r\n const [isSearching, setIsSearching] = useState(false);\r\n const searchService = new SearchService(engine);\r\n const isDark = uiTheme === 'dark';\r\n const accentSoft = withAlpha(accentColor, 0.12);\r\n\r\n const handleSearch = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!query.trim()) { setSearch('', []); return; }\r\n setIsSearching(true);\r\n const results = await searchService.search(query);\r\n setSearch(query, results);\r\n setIsSearching(false);\r\n };\r\n\r\n if (!sidebarRightOpen) return null;\r\n\r\n return (\r\n <div className={`papyrus-sidebar-right w-80 border-l flex flex-col h-full shrink-0 transition-colors duration-200 shadow-2xl z-40 ${isDark ? 'bg-[#1a1a1a] border-[#333]' : 'bg-white border-gray-200'}`}>\n <div className={`p-4 border-b flex items-center justify-between shrink-0 ${isDark ? 'border-[#333]' : 'border-gray-100'}`}>\r\n <div className=\"flex space-x-6\">\r\n <button\r\n onClick={() => toggleSidebarRight('search')}\r\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${sidebarRightTab === 'search' ? 'border-b-2' : 'text-gray-400'}`}\r\n style={sidebarRightTab === 'search' ? { color: accentColor, borderColor: accentColor } : undefined}\r\n >\r\n Busca\r\n </button>\r\n <button\r\n onClick={() => toggleSidebarRight('annotations')}\r\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${sidebarRightTab === 'annotations' ? 'border-b-2' : 'text-gray-400'}`}\r\n style={sidebarRightTab === 'annotations' ? { color: accentColor, borderColor: accentColor } : undefined}\r\n >\r\n Notas\r\n </button>\r\n </div>\r\n <button onClick={() => toggleSidebarRight()} className=\"text-gray-400 hover:text-red-500 transition-colors\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto p-4 custom-scrollbar bg-opacity-50\">\r\n {sidebarRightTab === 'search' ? (\r\n <div className=\"space-y-4\">\r\n <form onSubmit={handleSearch} className=\"relative mb-6\">\r\n <input \r\n type=\"text\" \r\n className={`w-full rounded-lg px-4 py-2.5 text-xs outline-none border transition-all shadow-inner font-medium ${isDark ? 'bg-[#2a2a2a] text-white border-[#444] focus:border-blue-500' : 'bg-gray-100 border-gray-200 focus:bg-white focus:border-blue-400'}`} \r\n placeholder=\"O que você procura?\" \r\n value={query} \r\n onChange={(e) => setQuery(e.target.value)} \r\n />\r\n <button type=\"submit\" className=\"absolute right-3 top-2.5 text-gray-400 transition-colors\" style={{ color: accentColor }}>\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" /></svg>\r\n </button>\r\n </form>\r\n\r\n {isSearching && (\r\n <div className=\"flex flex-col items-center justify-center py-12 space-y-3\">\r\n <div className=\"w-6 h-6 border-2 border-t-transparent rounded-full animate-spin\" style={{ borderColor: accentColor }} />\r\n <span className=\"text-[10px] font-bold text-gray-500 uppercase\">Varrendo documento...</span>\r\n </div>\r\n )}\r\n\r\n {!isSearching && searchResults.map((res, idx) => (\r\n <div \r\n key={idx} \r\n onClick={() => { setDocumentState({ activeSearchIndex: idx }); triggerScrollToPage(res.pageIndex); }} \r\n className={`p-4 rounded-xl border-2 cursor-pointer transition-all group hover:scale-[1.02] ${idx === activeSearchIndex ? 'shadow-lg' : isDark ? 'border-[#333] hover:border-[#555] bg-[#222]' : 'border-gray-50 hover:border-gray-200 bg-gray-50/50 hover:bg-white'}`}\r\n style={idx === activeSearchIndex ? { borderColor: accentColor, backgroundColor: accentSoft } : undefined}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span\r\n className={`text-[10px] font-black uppercase tracking-tighter ${idx === activeSearchIndex ? '' : 'text-gray-400'}`}\r\n style={idx === activeSearchIndex ? { color: accentColor } : undefined}\r\n >\r\n PÁGINA {res.pageIndex + 1}\r\n </span>\r\n <svg\r\n className={`w-3 h-3 transition-transform ${idx === activeSearchIndex ? '' : 'text-gray-300'}`}\r\n style={idx === activeSearchIndex ? { color: accentColor } : undefined}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </div>\r\n <p className={`text-[11px] font-medium leading-relaxed italic ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>...{res.text}...</p>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n <div className=\"text-[9px] font-black text-gray-400 uppercase tracking-[0.2em] mb-6 flex items-center\">\r\n <span>WORKSET</span>\r\n <div className=\"flex-1 h-px bg-current ml-3 opacity-10\" />\r\n </div>\r\n {annotations.length === 0 ? (\r\n <div className=\"text-center py-20\">\r\n <div className=\"w-12 h-12 bg-gray-500/10 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <svg className=\"w-6 h-6 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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\" /></svg>\r\n </div>\r\n <p className=\"text-[10px] font-bold text-gray-400 uppercase tracking-widest\">Sem anotações</p>\r\n </div>\r\n ) : (\r\n annotations.map(ann => (\r\n <div key={ann.id} className={`p-4 rounded-xl border group transition-all cursor-pointer ${isDark ? 'bg-[#222] border-[#333] hover:border-[#444]' : 'bg-white border-gray-100 shadow-sm hover:shadow-md'}`}>\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"w-2.5 h-2.5 rounded-full\" style={{ backgroundColor: ann.color }} />\r\n <span className=\"text-[10px] font-black\" style={{ color: accentColor }}>P{ann.pageIndex + 1}</span>\r\n </div>\r\n <span className=\"text-[9px] text-gray-400 font-bold\">{new Date(ann.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>\r\n </div>\r\n <p className={`text-[11px] font-bold uppercase tracking-tight ${isDark ? 'text-gray-200' : 'text-gray-700'}`}>{ann.type}</p>\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default SidebarRight;\r\n","\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine } from '@papyrus-sdk/types';\r\nimport PageRenderer from './PageRenderer';\r\n\r\ninterface ViewerProps { engine: DocumentEngine; }\r\n\r\nconst Viewer: React.FC<ViewerProps> = ({ engine }) => {\r\n const { viewMode, pageCount, currentPage, activeTool, uiTheme, setDocumentState, accentColor } = useViewerStore();\r\n const isDark = uiTheme === 'dark';\r\n const viewerRef = useRef<HTMLDivElement>(null);\r\n const [availableWidth, setAvailableWidth] = useState<number | null>(null);\r\n const isCompact = availableWidth !== null && availableWidth < 820;\r\n const paddingY = isCompact ? 'py-10' : 'py-16';\r\n const toolDockPosition = isCompact ? 'bottom-6' : 'bottom-10';\r\n\r\n useEffect(() => {\r\n const element = viewerRef.current;\r\n if (!element) return;\r\n\r\n const updateWidth = () => {\r\n const nextWidth = element.clientWidth;\r\n if (nextWidth > 0) setAvailableWidth(nextWidth);\r\n };\r\n\r\n updateWidth();\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n window.addEventListener('resize', updateWidth);\r\n return () => window.removeEventListener('resize', updateWidth);\r\n }\r\n\r\n const observer = new ResizeObserver(() => updateWidth());\r\n observer.observe(element);\r\n return () => observer.disconnect();\r\n }, []);\r\n\r\n useEffect(() => {\n const root = viewerRef.current;\n if (!root) return;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\n if (pageIndex + 1 !== currentPage) setDocumentState({ currentPage: pageIndex + 1 });\n }\n });\n }, { root, threshold: 0.5 });\n\n const pageElements = root.querySelectorAll('.page-container');\n pageElements.forEach((el) => observer.observe(el));\n return () => {\n pageElements.forEach((el) => observer.unobserve(el));\n observer.disconnect();\n };\n }, [pageCount, setDocumentState, currentPage]);\n\r\n const pages = Array.from({ length: pageCount }).map((_, i) => i);\r\n const tools = [\r\n { id: 'select', name: 'Select', icon: 'M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5' },\r\n { id: 'highlight', name: 'Marker', 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' },\r\n { id: 'strikeout', name: 'Strike', icon: 'M13 10V3L4 14h7v7l9-11h-7z' },\r\n { id: 'comment', name: 'Note', 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' },\r\n ];\r\n\r\n return (\r\n <div ref={viewerRef} className={`papyrus-viewer flex-1 overflow-auto flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}>\n <div className=\"flex flex-col items-center gap-6 w-full\">\r\n {pages.map(idx => (\r\n <div key={idx} data-page-index={idx} className=\"page-container\">\r\n <PageRenderer engine={engine} pageIndex={idx} availableWidth={availableWidth ?? undefined} />\r\n </div>\r\n ))}\r\n </div>\r\n <div className={`fixed ${toolDockPosition} left-1/2 -translate-x-1/2 shadow-2xl rounded-2xl p-2 flex border z-50 ${isDark ? 'bg-[#2a2a2a]/90 border-[#3a3a3a] backdrop-blur-xl' : 'bg-white/95 border-gray-100 backdrop-blur-md'}`}>\r\n {tools.map(tool => (\r\n <button\r\n key={tool.id}\r\n onClick={() => setDocumentState({ activeTool: tool.id as any })}\r\n className={`w-10 h-10 rounded-xl flex items-center justify-center transition-all ${activeTool === tool.id ? 'text-white shadow-lg' : 'text-gray-400'}`}\r\n style={activeTool === tool.id ? { backgroundColor: accentColor } : undefined}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d={tool.icon} /></svg>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default Viewer;\r\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 {\r\n engine: DocumentEngine;\r\n pageIndex: number;\r\n availableWidth?: number;\r\n}\r\n\r\nconst PageRenderer: React.FC<PageRendererProps> = ({ engine, pageIndex, availableWidth }) => {\r\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);\r\n const [pageSize, setPageSize] = useState<{ width: number; height: number } | null>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\r\n const [currentRect, setCurrentRect] = useState({ x: 0, y: 0, w: 0, h: 0 });\r\n\r\n const { \r\n zoom, rotation, pageTheme, scrollToPageSignal, setDocumentState,\r\n annotations, addAnnotation, activeTool, removeAnnotation, \r\n selectedAnnotationId, setSelectedAnnotation, accentColor\r\n } = useViewerStore();\r\n const renderTargetType = engine.getRenderTargetType?.() ?? 'canvas';\r\n const isElementRender = renderTargetType === 'element';\r\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(() => {\r\n if (!pageSize) return null;\r\n const scale = zoom * fitScale;\r\n return {\r\n width: pageSize.width * scale,\r\n height: pageSize.height * scale,\r\n };\r\n }, [pageSize, zoom, fitScale]);\r\n\r\n useEffect(() => {\r\n if (scrollToPageSignal === pageIndex && containerRef.current) {\r\n containerRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n setDocumentState({ scrollToPageSignal: null });\r\n }\r\n }, [scrollToPageSignal, pageIndex, setDocumentState]);\r\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 renderScale = isElementRender ? 1.0 : RENDER_SCALE * fitScale; \n \r\n // A UI solicita renderização passando o \"alvo\" (Canvas/Div).\r\n // Ela não sabe se o motor usa PDF.js ou se está gerando um bitmap.\r\n await engine.renderPage(pageIndex, renderTarget, renderScale);\r\n\r\n if (!isElementRender && !pageSize && canvasRef.current) {\r\n const denom = renderScale * Math.max(zoom, 0.01);\r\n if (denom > 0) {\r\n setPageSize({\r\n width: canvasRef.current.width / denom,\r\n height: canvasRef.current.height / denom,\r\n });\r\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, renderScale);\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\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]);\r\n\r\n const handleMouseDown = (e: React.MouseEvent) => {\r\n if (activeTool === 'select') return;\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\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) => {\r\n if (!isDragging) return;\r\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) => {\r\n if (isDragging) {\r\n setIsDragging(false);\r\n if (currentRect.w > 5 && currentRect.h > 5) {\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n addAnnotation({\r\n id: Math.random().toString(36).substr(2, 9),\r\n pageIndex,\r\n type: activeTool as any,\r\n rect: {\r\n x: currentRect.x / rect.width,\r\n y: currentRect.y / rect.height,\r\n width: currentRect.w / rect.width,\r\n height: currentRect.h / rect.height,\r\n },\r\n color: activeTool === 'highlight' ? '#fbbf24' : activeTool === 'strikeout' ? '#ef4444' : accentColor,\r\n content: activeTool === 'text' || activeTool === 'comment' ? '' : undefined,\r\n createdAt: Date.now()\r\n });\r\n }\r\n }\r\n setCurrentRect({ x: 0, y: 0, w: 0, h: 0 });\r\n return;\r\n }\r\n\r\n if (activeTool === 'select') {\r\n const selection = window.getSelection();\r\n const selectedText = selection?.toString().trim();\r\n if (selectedText) {\r\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, {\r\n text: selectedText,\r\n pageIndex: pageIndex\r\n });\r\n }\r\n }\r\n };\r\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 ${activeTool !== 'select' ? 'no-select cursor-crosshair' : ''}`}\r\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 \r\n ref={textLayerRef} \r\n className=\"textLayer\"\r\n style={{\r\n pointerEvents: isElementRender ? 'none' : activeTool === 'select' ? 'auto' : 'none',\r\n display: isElementRender ? 'none' : 'block',\r\n }}\r\n />\r\n\r\n {isDragging && (\r\n <div \r\n className=\"absolute border-2 z-[40] pointer-events-none\"\r\n style={{\r\n borderColor: accentColor,\r\n backgroundColor: `${accentColor}33`,\r\n left: currentRect.x,\r\n top: currentRect.y,\r\n width: currentRect.w,\r\n height: currentRect.h,\r\n }}\r\n />\r\n )}\r\n\r\n <div className=\"absolute inset-0 pointer-events-none z-20\">\r\n {annotations.filter(a => a.pageIndex === pageIndex).map(ann => (\r\n <AnnotationItem \r\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 }) => {\r\n const isText = ann.type === 'text' || ann.type === 'comment';\r\n return (\r\n <div \r\n className={`absolute pointer-events-auto transition-all ${isSelected ? 'shadow-xl z-30' : 'z-10'}`}\r\n style={{\r\n left: `${ann.rect.x * 100}%`,\r\n top: `${ann.rect.y * 100}%`,\r\n width: `${ann.rect.width * 100}%`,\r\n height: `${ann.rect.height * 100}%`,\r\n backgroundColor: ann.type === 'highlight' ? `${ann.color}77` : 'transparent',\r\n borderBottom: ann.type === 'strikeout' ? `2px solid ${ann.color}` : 'none',\r\n outline: isSelected ? `2px solid ${accentColor}` : undefined,\r\n }}\r\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\r\n >\r\n {isText && isSelected && (\r\n <div className=\"absolute top-full mt-2 w-64 bg-white shadow-2xl rounded-xl p-4 border border-gray-100 z-50\">\r\n <textarea \r\n className=\"w-full bg-transparent border-none focus:ring-0 p-0 text-gray-800 text-xs font-medium\" \r\n placeholder=\"Escreva sua nota...\" \r\n rows={3}\r\n defaultValue={ann.content || ''}\r\n autoFocus\r\n />\r\n </div>\r\n )}\r\n {isSelected && (\r\n <button \r\n onClick={(e) => { e.stopPropagation(); onDelete(); }}\r\n className=\"absolute -top-3 -right-3 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600\"\r\n >\r\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>\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PageRenderer;\r\n"],"mappings":"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","names":["import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","withAlpha","import_react","import_core","import_react","import_core","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["\nexport { default as Topbar } from './components/Topbar';\nexport { default as SidebarLeft } from './components/SidebarLeft';\nexport { default as SidebarRight } from './components/SidebarRight';\nexport { default as Viewer } from './components/Viewer';\nexport { default as PageRenderer } from './components/PageRenderer';\n","\r\nimport React, { useRef, useState, useEffect } from 'react';\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 = true,\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, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\n } = useViewerStore();\n\r\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 pageDigits = Math.max(2, String(pageCount || 1).length);\n const [showPageThemes, setShowPageThemes] = useState(false);\n const isDark = uiTheme === 'dark';\n\n useEffect(() => { setPageInput(currentPage.toString()); }, [currentPage]);\n useEffect(() => () => {\n if (zoomTimerRef.current) clearTimeout(zoomTimerRef.current);\n }, []);\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 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\r\n const handlePageChange = (page: number) => {\r\n if (pageCount <= 0) return;\r\n const p = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));\r\n engine.goToPage(p);\r\n setDocumentState({ currentPage: p });\r\n triggerScrollToPage(p - 1);\r\n };\r\n\r\n const themes: { id: PageTheme; name: string; color: string }[] = [\r\n { id: 'normal', name: 'Original', color: 'bg-white' },\r\n { id: 'sepia', name: 'Sépia', color: 'bg-[#f4ecd8]' },\r\n { id: 'dark', name: 'Invertido', color: 'bg-gray-800' },\r\n { id: 'high-contrast', name: 'Contraste', color: 'bg-black' },\r\n ];\r\n\r\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-topbar papyrus-theme h-14 border-b flex items-center justify-between px-4 z-50 transition-colors duration-200 ${isDark ? 'bg-[#1a1a1a] border-[#333] text-white' : 'bg-white border-gray-200 text-gray-800'}`}\n >\n <div className=\"flex items-center space-x-3\">\n {showSidebarLeftToggle && (\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" /></svg>\n </button>\n )}\n {showBrand && (brand ?? (\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\n </span>\n ))}\n {title && (\n <span className={`text-sm font-semibold truncate max-w-[220px] ${isDark ? 'text-gray-200' : 'text-gray-700'}`} title={typeof title === 'string' ? title : undefined}>\n {title}\n </span>\n )}\n </div>\n\n {(showPageControls || showZoomControls) && (\n <div className=\"flex items-center space-x-4\">\n {showPageControls && (\n <div className={`papyrus-control flex items-center rounded-lg p-1 space-x-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" /></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) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\n onBlur={() => handlePageChange(parseInt(pageInput))} \n />\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount > 0 ? pageCount : '—'}</span>\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" /></svg>\n </button>\n </div>\n )}\n\n {showZoomControls && (\n <div className={`papyrus-control flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" /></svg>\n </button>\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" /></svg>\n </button>\n </div>\n )}\n </div>\n )}\n\n <div className=\"flex items-center space-x-3\">\n {/* Page Theme Dropdown */}\n {showPageThemeSelector && (\n <div className=\"relative\">\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 ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}\n >\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\n <span>TEMA</span>\n </button>\n {showPageThemes && (\n <div className={`papyrus-popover absolute top-full right-0 mt-2 w-48 rounded-lg shadow-xl border p-2 z-[60] ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-white border-gray-200'}`}>\n {themes.map(t => (\n <button \n key={t.id}\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\n className={`w-full flex items-center space-x-3 px-3 py-2 rounded-md text-sm ${pageTheme === t.id ? 'text-white' : isDark ? 'hover:bg-white/10 text-gray-300' : 'hover:bg-gray-50 text-gray-700'}`}\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\n >\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\n <span>{t.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {showUIToggle && (\n <button onClick={() => setDocumentState({ uiTheme: isDark ? 'light' : 'dark' })} className={`p-2 rounded-full ${isDark ? 'bg-yellow-500/10 text-yellow-500' : 'bg-gray-100 text-gray-500'}`}>\n {isDark ? <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><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\" /></svg> : <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z\" /></svg>}\n </button>\n )}\n\n {showUpload && (\n <>\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"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 <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf,.epub,.txt\" onChange={async (e) => {\n const file = e.target.files?.[0];\n if (file) {\n setDocumentState({ isLoaded: false });\n await engine.load(file);\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\n }\n }} />\n </>\n )}\n\n {showSearch && (\n <button onClick={() => toggleSidebarRight('search')} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}><svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" /></svg></button>\n )}\n </div>\n </div>\n );\n};\nexport default Topbar;\n","\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, OutlineItem } from '@papyrus-sdk/types';\r\n\r\ninterface SidebarLeftProps {\r\n engine: DocumentEngine;\r\n}\r\n\r\nconst withAlpha = (hex: string, alpha: number) => {\r\n const normalized = hex.replace('#', '').trim();\r\n const value =\r\n normalized.length === 3\r\n ? normalized\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : normalized;\r\n if (value.length !== 6) return hex;\r\n const r = parseInt(value.slice(0, 2), 16);\r\n const g = parseInt(value.slice(2, 4), 16);\r\n const b = parseInt(value.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n};\r\n\r\nconst Thumbnail: React.FC<{ engine: DocumentEngine; pageIndex: number; active: boolean; isDark: boolean; accentColor: string; onClick: () => void }> = ({ 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((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect();\n }\n });\n }, { root: root ?? null, rootMargin: '200px' });\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 ${active ? 'shadow-sm' : 'border-transparent'}`}\n style={active ? { borderColor: accentColor, backgroundColor: accentSoft } : undefined}\n >\n <div className=\"flex flex-col items-center\">\r\n <div className={`shadow-lg rounded overflow-hidden mb-2 border ${isDark ? 'border-[#333]' : 'border-gray-200'}`}>\r\n <canvas\r\n ref={canvasRef}\r\n className=\"max-w-full h-auto bg-white\"\r\n style={{ display: renderTargetType === 'element' ? 'none' : 'block' }}\r\n />\r\n <div\r\n ref={htmlRef}\r\n className=\"bg-white\"\r\n style={{\r\n width: 90,\r\n height: 120,\r\n display: renderTargetType === 'element' ? 'block' : 'none',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {renderTargetType === 'element' && (\r\n <div className=\"w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500\">\r\n HTML\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <span className={`text-[11px] font-bold ${active ? '' : isDark ? 'text-gray-500' : 'text-gray-400'}`} style={active ? { color: accentColor } : undefined}>{pageIndex + 1}</span>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst OutlineNode: React.FC<{ item: OutlineItem; engine: DocumentEngine; isDark: boolean; accentColor: string; depth?: number }> = ({ item, engine, isDark, accentColor, depth = 0 }) => {\r\n const { triggerScrollToPage, outlineSearchQuery } = useViewerStore();\r\n const [expanded, setExpanded] = useState(true);\r\n const accentSoft = withAlpha(accentColor, 0.2);\r\n\r\n const matchesSearch = outlineSearchQuery === '' || item.title.toLowerCase().includes(outlineSearchQuery.toLowerCase());\r\n const hasMatchingChildren = item.children?.some(child => child.title.toLowerCase().includes(outlineSearchQuery.toLowerCase()));\r\n\r\n if (!matchesSearch && !hasMatchingChildren && outlineSearchQuery !== '') return null;\r\n\r\n const handleClick = () => {\r\n if (item.pageIndex >= 0) {\r\n engine.goToPage(item.pageIndex + 1);\r\n triggerScrollToPage(item.pageIndex);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n <div \r\n className={`flex items-center py-1.5 px-3 rounded-md transition-colors group ${item.pageIndex >= 0 ? 'cursor-pointer' : 'cursor-default'} ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}\r\n style={{ paddingLeft: `${depth * 14 + 8}px` }}\r\n onClick={handleClick}\r\n >\r\n {item.children && item.children.length > 0 ? (\r\n <button \r\n className={`mr-1 text-gray-400 transition-transform p-1`}\r\n style={{ color: accentColor, transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\r\n onClick={(e) => { e.stopPropagation(); setExpanded(!expanded); }}\r\n >\r\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n ) : <div className=\"w-5\" />}\r\n <span\r\n className={`text-[13px] leading-tight font-medium truncate ${isDark ? 'text-gray-200' : 'text-gray-700'}`}\r\n style={matchesSearch && outlineSearchQuery ? { backgroundColor: accentSoft, color: accentColor } : undefined}\r\n >\r\n {item.title}\r\n </span>\r\n </div>\r\n {expanded && item.children && item.children.length > 0 && (\r\n <div className=\"flex flex-col\">\r\n {item.children.map((child, i) => (\r\n <OutlineNode key={i} item={child} engine={engine} isDark={isDark} accentColor={accentColor} depth={depth + 1} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst SidebarLeft: React.FC<SidebarLeftProps> = ({ engine }) => {\r\n const { \r\n pageCount, currentPage, setDocumentState, sidebarLeftOpen, uiTheme, \r\n triggerScrollToPage, sidebarLeftTab, setSidebarLeftTab, outline,\r\n outlineSearchQuery, setOutlineSearch, accentColor\r\n } = useViewerStore();\r\n const isDark = uiTheme === 'dark';\r\n\r\n if (!sidebarLeftOpen) return null;\r\n\r\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-left papyrus-theme w-72 border-r flex flex-col h-full shrink-0 overflow-hidden transition-colors duration-200 ${isDark ? 'bg-[#2a2a2a] border-[#3a3a3a]' : 'bg-[#fcfcfc] border-gray-200'}`}\n >\n <div className={`p-4 border-b flex flex-col space-y-4 ${isDark ? 'border-[#3a3a3a]' : 'border-gray-100'}`}>\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className={`text-sm font-bold uppercase tracking-widest ${isDark ? 'text-gray-100' : 'text-gray-800'}`}>\r\n {sidebarLeftTab === 'thumbnails' ? 'Thumbnails' : 'Sumário'}\r\n </h3>\r\n <button onClick={() => setDocumentState({ sidebarLeftOpen: false })} className=\"text-gray-400 hover:text-gray-600\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" /></svg>\r\n </button>\r\n </div>\r\n <div className=\"flex gap-1\">\r\n <button\r\n onClick={() => setSidebarLeftTab('thumbnails')}\r\n className={`p-2 rounded-md ${sidebarLeftTab === 'thumbnails' ? (isDark ? 'bg-white/10 text-white' : 'bg-white shadow-sm border border-gray-200') : 'text-gray-400'}`}\r\n style={sidebarLeftTab === 'thumbnails' && !isDark ? { color: accentColor } : undefined}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2 2V6z\" /></svg>\r\n </button>\r\n <button\r\n onClick={() => setSidebarLeftTab('summary')}\r\n className={`p-2 rounded-md ${sidebarLeftTab === 'summary' ? (isDark ? 'bg-white/10 text-white' : 'bg-white shadow-sm border border-gray-200') : 'text-gray-400'}`}\r\n style={sidebarLeftTab === 'summary' && !isDark ? { color: accentColor } : undefined}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div className=\"flex-1 overflow-y-auto custom-scrollbar p-3\">\r\n {sidebarLeftTab === 'thumbnails' ? (\r\n <div className=\"space-y-1\">\r\n {Array.from({ length: pageCount }).map((_, idx) => (\r\n <Thumbnail key={idx} engine={engine} pageIndex={idx} isDark={isDark} accentColor={accentColor} active={currentPage === idx + 1} onClick={() => { engine.goToPage(idx + 1); setDocumentState({ currentPage: idx + 1 }); triggerScrollToPage(idx); }} />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col space-y-0.5\">\r\n {outline.map((item, i) => (<OutlineNode key={i} item={item} engine={engine} isDark={isDark} accentColor={accentColor} />))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default SidebarLeft;\r\n","\r\nimport React, { useState } from 'react';\r\nimport { useViewerStore, SearchService } from '@papyrus-sdk/core';\r\nimport { DocumentEngine } from '@papyrus-sdk/types';\r\n\r\ninterface SidebarRightProps { engine: DocumentEngine; }\r\n\r\nconst withAlpha = (hex: string, alpha: number) => {\r\n const normalized = hex.replace('#', '').trim();\r\n const value =\r\n normalized.length === 3\r\n ? normalized\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : normalized;\r\n if (value.length !== 6) return hex;\r\n const r = parseInt(value.slice(0, 2), 16);\r\n const g = parseInt(value.slice(2, 4), 16);\r\n const b = parseInt(value.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n};\r\n\r\nconst SidebarRight: React.FC<SidebarRightProps> = ({ engine }) => {\r\n const { \n sidebarRightOpen, sidebarRightTab, toggleSidebarRight, searchResults, activeSearchIndex,\n uiTheme, setSearch, setDocumentState, triggerScrollToPage, annotations, accentColor\n } = useViewerStore();\n\r\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\r\n const handleSearch = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!query.trim()) { setSearch('', []); return; }\r\n setIsSearching(true);\r\n const results = await searchService.search(query);\r\n setSearch(query, results);\r\n setIsSearching(false);\r\n };\r\n\r\n if (!sidebarRightOpen) return null;\r\n\r\n return (\n <div\n data-papyrus-theme={uiTheme}\n className={`papyrus-sidebar-right papyrus-theme w-80 border-l flex flex-col h-full shrink-0 transition-colors duration-200 shadow-2xl z-40 ${isDark ? 'bg-[#1a1a1a] border-[#333]' : 'bg-white border-gray-200'}`}\n >\n <div className={`p-4 border-b flex items-center justify-between shrink-0 ${isDark ? 'border-[#333]' : 'border-gray-100'}`}>\r\n <div className=\"flex space-x-6\">\r\n <button\r\n onClick={() => toggleSidebarRight('search')}\r\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${sidebarRightTab === 'search' ? 'border-b-2' : 'text-gray-400'}`}\r\n style={sidebarRightTab === 'search' ? { color: accentColor, borderColor: accentColor } : undefined}\r\n >\r\n Busca\r\n </button>\r\n <button\r\n onClick={() => toggleSidebarRight('annotations')}\r\n className={`text-[10px] font-black uppercase tracking-widest pb-1 transition-all ${sidebarRightTab === 'annotations' ? 'border-b-2' : 'text-gray-400'}`}\r\n style={sidebarRightTab === 'annotations' ? { color: accentColor, borderColor: accentColor } : undefined}\r\n >\r\n Notas\r\n </button>\r\n </div>\r\n <button onClick={() => toggleSidebarRight()} className=\"papyrus-unstyled-button text-gray-400 hover:text-red-500 transition-colors\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto p-4 custom-scrollbar bg-opacity-50\">\r\n {sidebarRightTab === 'search' ? (\r\n <div className=\"space-y-4\">\r\n <form onSubmit={handleSearch} className=\"relative mb-6\">\r\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 ${isDark ? 'bg-[#2a2a2a] text-white border-[#444] focus:border-blue-500' : 'bg-gray-100 border-gray-200 focus:bg-white focus:border-blue-400'}`} \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 type=\"submit\" className=\"papyrus-unstyled-button absolute right-3 top-2.5 text-gray-400 transition-colors\" style={{ color: accentColor }}>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" /></svg>\n </button>\n </form>\n\r\n {isSearching && (\r\n <div className=\"flex flex-col items-center justify-center py-12 space-y-3\">\r\n <div className=\"w-6 h-6 border-2 border-t-transparent rounded-full animate-spin\" style={{ borderColor: accentColor }} />\r\n <span className=\"text-[10px] font-bold text-gray-500 uppercase\">Varrendo documento...</span>\r\n </div>\r\n )}\r\n\r\n {!isSearching && searchResults.map((res, idx) => (\r\n <div \n key={idx} \n onClick={() => {\n const page = res.pageIndex + 1;\n engine.goToPage(page);\n setDocumentState({ activeSearchIndex: idx, currentPage: page });\n triggerScrollToPage(res.pageIndex);\n }} \n className={`p-4 rounded-xl border-2 cursor-pointer transition-all group hover:scale-[1.02] ${idx === activeSearchIndex ? 'shadow-lg' : isDark ? 'border-[#333] hover:border-[#555] bg-[#222]' : 'border-gray-50 hover:border-gray-200 bg-gray-50/50 hover:bg-white'}`}\n style={idx === activeSearchIndex ? { borderColor: accentColor, backgroundColor: accentSoft } : undefined}\n >\n <div className=\"flex items-center justify-between mb-2\">\r\n <span\r\n className={`text-[10px] font-black uppercase tracking-tighter ${idx === activeSearchIndex ? '' : 'text-gray-400'}`}\r\n style={idx === activeSearchIndex ? { color: accentColor } : undefined}\r\n >\r\n PÁGINA {res.pageIndex + 1}\r\n </span>\r\n <svg\r\n className={`w-3 h-3 transition-transform ${idx === activeSearchIndex ? '' : 'text-gray-300'}`}\r\n style={idx === activeSearchIndex ? { color: accentColor } : undefined}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </div>\r\n <p className={`text-[11px] font-medium leading-relaxed italic ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>...{res.text}...</p>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n <div className=\"text-[9px] font-black text-gray-400 uppercase tracking-[0.2em] mb-6 flex items-center\">\r\n <span>WORKSET</span>\r\n <div className=\"flex-1 h-px bg-current ml-3 opacity-10\" />\r\n </div>\r\n {annotations.length === 0 ? (\r\n <div className=\"text-center py-20\">\r\n <div className=\"w-12 h-12 bg-gray-500/10 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <svg className=\"w-6 h-6 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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\" /></svg>\r\n </div>\r\n <p className=\"text-[10px] font-bold text-gray-400 uppercase tracking-widest\">Sem anotações</p>\r\n </div>\r\n ) : (\r\n annotations.map(ann => (\r\n <div key={ann.id} className={`p-4 rounded-xl border group transition-all cursor-pointer ${isDark ? 'bg-[#222] border-[#333] hover:border-[#444]' : 'bg-white border-gray-100 shadow-sm hover:shadow-md'}`}>\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"w-2.5 h-2.5 rounded-full\" style={{ backgroundColor: ann.color }} />\r\n <span className=\"text-[10px] font-black\" style={{ color: accentColor }}>P{ann.pageIndex + 1}</span>\r\n </div>\r\n <span className=\"text-[9px] text-gray-400 font-bold\">{new Date(ann.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>\r\n </div>\r\n <p className={`text-[11px] font-bold uppercase tracking-tight ${isDark ? 'text-gray-200' : 'text-gray-700'}`}>{ann.type}</p>\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default SidebarRight;\r\n","\r\nimport 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 { engine: DocumentEngine; }\nconst BASE_OVERSCAN = 6;\n\nconst Viewer: React.FC<ViewerProps> = ({ engine }) => {\n const { pageCount, currentPage, zoom, activeTool, uiTheme, scrollToPageSignal, setDocumentState, accentColor, annotationColor, setAnnotationColor } = 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 [availableWidth, setAvailableWidth] = useState<number | null>(null);\n const [basePageSize, setBasePageSize] = useState<{ width: number; height: number } | null>(null);\n const [pageSizes, setPageSizes] = useState<Record<number, { width: number; height: number }>>({});\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 = ['#fbbf24', '#f97316', '#ef4444', '#22c55e', '#06b6d4', '#3b82f6', '#8b5cf6', '#111827'];\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\r\n useEffect(() => {\n const element = viewerRef.current;\n if (!element) return;\n\r\n const updateWidth = () => {\r\n const nextWidth = element.clientWidth;\r\n if (nextWidth > 0) setAvailableWidth(nextWidth);\r\n };\r\n\r\n updateWidth();\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n window.addEventListener('resize', updateWidth);\r\n return () => window.removeEventListener('resize', updateWidth);\r\n }\r\n\r\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 () => { active = false; };\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(1, Math.max(0, availableWidth - 48) / basePageSize.width);\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 }, [scrollToPageSignal, setDocumentState, basePageSize, availableWidth, zoom, pageCount]);\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 );\n if (shouldSwitch) setDocumentState({ currentPage: bestPage });\n };\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\n if (!Number.isFinite(pageIndex)) return;\n intersectionRatiosRef.current[pageIndex] = entry.isIntersecting ? entry.intersectionRatio : 0;\n });\n if (frameRef.current != null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n flushCurrentPage();\n });\n }, { root, threshold: [0.25, 0.5, 0.75] });\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(1, Math.max(0, availableWidth - 48) / basePageSize.width);\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) 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 = (pageIndex: number, size: { width: number; height: number }) => {\n setPageSizes((prev) => {\n const current = prev[pageIndex];\n if (current && current.width === size.width && current.height === size.height) 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 { id: 'highlight', name: 'Highlight', 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 { id: 'underline', name: 'Underline', icon: 'M6 3v6a6 6 0 0012 0V3M4 21h16' },\n { id: 'squiggly', name: 'Squiggly', icon: 'M3 17c2-4 4-4 6 0s4 4 6 0 4-4 6 0' },\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 { id: 'comment', name: 'Note', 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\r\n return (\n <div\n ref={viewerRef}\n data-papyrus-theme={uiTheme}\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 ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}\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) => { pageRefs.current[idx] = element; }}\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 ${isDark ? 'bg-[#0f0f0f] border-[#2b2b2b]' : 'bg-white border-gray-200'}`}\n style={{\n width: pageSizes[idx]?.width ?? fallbackSize.width,\n height: pageSizes[idx]?.height ?? Math.max(fallbackSize.height, averagePageHeight),\n }}\n />\n )}\n </div>\n ))}\n </div>\n <div className={`papyrus-tool-dock sticky ${toolDockPosition} w-full flex justify-center pointer-events-none z-[70]`}>\n <div className={`pointer-events-auto shadow-2xl rounded-2xl p-2 flex items-center border z-[80] ${isDark ? 'bg-[#2a2a2a]/90 border-[#3a3a3a] backdrop-blur-xl' : 'bg-white/95 border-gray-100 backdrop-blur-md'}`}>\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 ${activeTool === tool.id ? 'text-white shadow-lg' : 'text-gray-400'}`}\n style={activeTool === tool.id ? { backgroundColor: accentColor } : undefined}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d={tool.icon} /></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 className=\"w-5 h-5 rounded-full\" style={{ backgroundColor: annotationColor }} />\n </button>\n {colorPickerOpen && (\n <div className={`absolute bottom-full left-1/2 -translate-x-1/2 mb-3 w-48 rounded-xl border p-3 shadow-2xl overflow-hidden ${isDark ? 'bg-[#1f1f1f] border-[#333]' : 'bg-white border-gray-200'}`}>\n <div className=\"grid grid-cols-4 gap-2 mb-3\">\n {colorPalette.map((color) => (\n <button\n key={color}\n onClick={() => { setAnnotationColor(color); setColorPickerOpen(false); }}\n className=\"w-7 h-7 rounded-full border transition-all\"\n style={{ backgroundColor: color, borderColor: color === annotationColor ? '#fff' : 'transparent' }}\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\">Hex</span>\n <input\n type=\"text\"\n value={annotationColor.toUpperCase()}\n onChange={(e) => {\n const next = e.target.value.trim();\n if (next.startsWith('#') && (next.length === 4 || next.length === 7)) {\n setAnnotationColor(next);\n }\n }}\n className={`flex-1 min-w-0 w-full text-xs rounded-md px-2 py-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444] text-white' : 'bg-gray-100 border-gray-200 text-gray-700'}`}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\r\n );\r\n};\r\nexport default Viewer;\r\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":["import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","withAlpha","import_react","import_core","import_react","import_core","import_jsx_runtime","rect","x","y","import_jsx_runtime"]}
|