@papyrus-sdk/ui-react 0.1.0 → 0.1.2
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 +21 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +142 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +144 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Papyrus UI React
|
|
2
|
+
|
|
3
|
+
React components for Papyrus web viewers.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @papyrus-sdk/ui-react
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { Viewer } from '@papyrus-sdk/ui-react';
|
|
15
|
+
import { PDFJSEngine } from '@papyrus-sdk/engine-pdfjs';
|
|
16
|
+
|
|
17
|
+
const engine = new PDFJSEngine();
|
|
18
|
+
await engine.load({ type: 'pdf', source: { uri: 'https://example.com/book.pdf' } });
|
|
19
|
+
|
|
20
|
+
<Viewer engine={engine} />
|
|
21
|
+
```
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -57,6 +57,7 @@ var Topbar = ({ engine }) => {
|
|
|
57
57
|
setDocumentState({ zoom: newZoom });
|
|
58
58
|
};
|
|
59
59
|
const handlePageChange = (page) => {
|
|
60
|
+
if (pageCount <= 0) return;
|
|
60
61
|
const p = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));
|
|
61
62
|
engine.goToPage(p);
|
|
62
63
|
setDocumentState({ currentPage: p });
|
|
@@ -91,7 +92,7 @@ var Topbar = ({ engine }) => {
|
|
|
91
92
|
}
|
|
92
93
|
),
|
|
93
94
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "opacity-40 px-1", children: "/" }),
|
|
94
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "opacity-80 text-sm", children: pageCount }),
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "opacity-80 text-sm", children: pageCount > 0 ? pageCount : "\u2014" }),
|
|
95
96
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => handlePageChange(currentPage + 1), className: "p-1.5 rounded transition-all hover:brightness-110", style: { color: accentColor }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }) })
|
|
96
97
|
] }),
|
|
97
98
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: `flex items-center rounded-lg p-1 border ${isDark ? "bg-[#2a2a2a] border-[#444]" : "bg-gray-50 border-gray-200"}`, children: [
|
|
@@ -143,7 +144,7 @@ var Topbar = ({ engine }) => {
|
|
|
143
144
|
children: "UPLOAD"
|
|
144
145
|
}
|
|
145
146
|
),
|
|
146
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "file", ref: fileInputRef, className: "hidden", accept: ".pdf", onChange: async (e) => {
|
|
147
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "file", ref: fileInputRef, className: "hidden", accept: ".pdf,.epub,.txt", onChange: async (e) => {
|
|
147
148
|
const file = e.target.files?.[0];
|
|
148
149
|
if (file) {
|
|
149
150
|
setDocumentState({ isLoaded: false });
|
|
@@ -172,12 +173,18 @@ var withAlpha = (hex, alpha) => {
|
|
|
172
173
|
};
|
|
173
174
|
var Thumbnail = ({ engine, pageIndex, active, isDark, accentColor, onClick }) => {
|
|
174
175
|
const canvasRef = (0, import_react2.useRef)(null);
|
|
176
|
+
const htmlRef = (0, import_react2.useRef)(null);
|
|
175
177
|
const accentSoft = withAlpha(accentColor, 0.12);
|
|
178
|
+
const renderTargetType = engine.getRenderTargetType?.() ?? "canvas";
|
|
176
179
|
(0, import_react2.useEffect)(() => {
|
|
177
|
-
if (
|
|
178
|
-
|
|
180
|
+
if (renderTargetType === "element") return;
|
|
181
|
+
const target = canvasRef.current;
|
|
182
|
+
if (target) {
|
|
183
|
+
engine.renderPage(pageIndex, target, 0.15).catch((err) => {
|
|
184
|
+
console.error("[Papyrus] Thumbnail render failed:", err);
|
|
185
|
+
});
|
|
179
186
|
}
|
|
180
|
-
}, [engine, pageIndex]);
|
|
187
|
+
}, [engine, pageIndex, renderTargetType]);
|
|
181
188
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
182
189
|
"div",
|
|
183
190
|
{
|
|
@@ -185,7 +192,30 @@ var Thumbnail = ({ engine, pageIndex, active, isDark, accentColor, onClick }) =>
|
|
|
185
192
|
className: `p-3 cursor-pointer transition-all rounded-lg border-2 ${active ? "shadow-sm" : "border-transparent"}`,
|
|
186
193
|
style: active ? { borderColor: accentColor, backgroundColor: accentSoft } : void 0,
|
|
187
194
|
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col items-center", children: [
|
|
188
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.
|
|
195
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `shadow-lg rounded overflow-hidden mb-2 border ${isDark ? "border-[#333]" : "border-gray-200"}`, children: [
|
|
196
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
197
|
+
"canvas",
|
|
198
|
+
{
|
|
199
|
+
ref: canvasRef,
|
|
200
|
+
className: "max-w-full h-auto bg-white",
|
|
201
|
+
style: { display: renderTargetType === "element" ? "none" : "block" }
|
|
202
|
+
}
|
|
203
|
+
),
|
|
204
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
205
|
+
"div",
|
|
206
|
+
{
|
|
207
|
+
ref: htmlRef,
|
|
208
|
+
className: "bg-white",
|
|
209
|
+
style: {
|
|
210
|
+
width: 90,
|
|
211
|
+
height: 120,
|
|
212
|
+
display: renderTargetType === "element" ? "block" : "none",
|
|
213
|
+
overflow: "hidden"
|
|
214
|
+
},
|
|
215
|
+
children: renderTargetType === "element" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500", children: "HTML" })
|
|
216
|
+
}
|
|
217
|
+
)
|
|
218
|
+
] }),
|
|
189
219
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[11px] font-bold ${active ? "" : isDark ? "text-gray-500" : "text-gray-400"}`, style: active ? { color: accentColor } : void 0, children: pageIndex + 1 })
|
|
190
220
|
] })
|
|
191
221
|
}
|
|
@@ -455,11 +485,13 @@ var import_react4 = require("react");
|
|
|
455
485
|
var import_core4 = require("@papyrus-sdk/core");
|
|
456
486
|
var import_types = require("@papyrus-sdk/types");
|
|
457
487
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
458
|
-
var PageRenderer = ({ engine, pageIndex }) => {
|
|
488
|
+
var PageRenderer = ({ engine, pageIndex, availableWidth }) => {
|
|
459
489
|
const containerRef = (0, import_react4.useRef)(null);
|
|
460
490
|
const canvasRef = (0, import_react4.useRef)(null);
|
|
491
|
+
const htmlLayerRef = (0, import_react4.useRef)(null);
|
|
461
492
|
const textLayerRef = (0, import_react4.useRef)(null);
|
|
462
493
|
const [loading, setLoading] = (0, import_react4.useState)(true);
|
|
494
|
+
const [pageSize, setPageSize] = (0, import_react4.useState)(null);
|
|
463
495
|
const [isDragging, setIsDragging] = (0, import_react4.useState)(false);
|
|
464
496
|
const [startPos, setStartPos] = (0, import_react4.useState)({ x: 0, y: 0 });
|
|
465
497
|
const [currentRect, setCurrentRect] = (0, import_react4.useState)({ x: 0, y: 0, w: 0, h: 0 });
|
|
@@ -477,6 +509,39 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
477
509
|
setSelectedAnnotation,
|
|
478
510
|
accentColor
|
|
479
511
|
} = (0, import_core4.useViewerStore)();
|
|
512
|
+
const renderTargetType = engine.getRenderTargetType?.() ?? "canvas";
|
|
513
|
+
const isElementRender = renderTargetType === "element";
|
|
514
|
+
(0, import_react4.useEffect)(() => {
|
|
515
|
+
let active = true;
|
|
516
|
+
const loadSize = async () => {
|
|
517
|
+
try {
|
|
518
|
+
const size = await engine.getPageDimensions(pageIndex);
|
|
519
|
+
if (!active) return;
|
|
520
|
+
if (size.width > 0 && size.height > 0) {
|
|
521
|
+
setPageSize(size);
|
|
522
|
+
}
|
|
523
|
+
} catch {
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
loadSize();
|
|
527
|
+
return () => {
|
|
528
|
+
active = false;
|
|
529
|
+
};
|
|
530
|
+
}, [engine, pageIndex]);
|
|
531
|
+
const fitScale = (0, import_react4.useMemo)(() => {
|
|
532
|
+
if (!availableWidth || !pageSize?.width) return 1;
|
|
533
|
+
const targetWidth = Math.max(0, availableWidth - 48);
|
|
534
|
+
if (!targetWidth) return 1;
|
|
535
|
+
return Math.min(1, targetWidth / pageSize.width);
|
|
536
|
+
}, [availableWidth, pageSize]);
|
|
537
|
+
const displaySize = (0, import_react4.useMemo)(() => {
|
|
538
|
+
if (!pageSize) return null;
|
|
539
|
+
const scale = zoom * fitScale;
|
|
540
|
+
return {
|
|
541
|
+
width: pageSize.width * scale,
|
|
542
|
+
height: pageSize.height * scale
|
|
543
|
+
};
|
|
544
|
+
}, [pageSize, zoom, fitScale]);
|
|
480
545
|
(0, import_react4.useEffect)(() => {
|
|
481
546
|
if (scrollToPageSignal === pageIndex && containerRef.current) {
|
|
482
547
|
containerRef.current.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
@@ -486,13 +551,35 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
486
551
|
(0, import_react4.useEffect)(() => {
|
|
487
552
|
let active = true;
|
|
488
553
|
const render = async () => {
|
|
489
|
-
|
|
554
|
+
const renderTarget = isElementRender ? htmlLayerRef.current : canvasRef.current;
|
|
555
|
+
if (!renderTarget || !textLayerRef.current) return;
|
|
490
556
|
setLoading(true);
|
|
491
557
|
try {
|
|
492
558
|
const RENDER_SCALE = 2;
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
559
|
+
const renderScale = isElementRender ? 1 : RENDER_SCALE * fitScale;
|
|
560
|
+
await engine.renderPage(pageIndex, renderTarget, renderScale);
|
|
561
|
+
if (!isElementRender && !pageSize && canvasRef.current) {
|
|
562
|
+
const denom = renderScale * Math.max(zoom, 0.01);
|
|
563
|
+
if (denom > 0) {
|
|
564
|
+
setPageSize({
|
|
565
|
+
width: canvasRef.current.width / denom,
|
|
566
|
+
height: canvasRef.current.height / denom
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
if (!active || !textLayerRef.current) return;
|
|
571
|
+
if (!isElementRender) {
|
|
572
|
+
textLayerRef.current.innerHTML = "";
|
|
573
|
+
await engine.renderTextLayer(pageIndex, textLayerRef.current, renderScale);
|
|
574
|
+
}
|
|
575
|
+
if (!isElementRender && displaySize) {
|
|
576
|
+
if (canvasRef.current) {
|
|
577
|
+
canvasRef.current.style.width = `${displaySize.width}px`;
|
|
578
|
+
canvasRef.current.style.height = `${displaySize.height}px`;
|
|
579
|
+
}
|
|
580
|
+
textLayerRef.current.style.width = `${displaySize.width}px`;
|
|
581
|
+
textLayerRef.current.style.height = `${displaySize.height}px`;
|
|
582
|
+
}
|
|
496
583
|
} catch (err) {
|
|
497
584
|
console.error("[Papyrus] Falha na renderiza\xE7\xE3o:", err);
|
|
498
585
|
} finally {
|
|
@@ -503,7 +590,7 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
503
590
|
return () => {
|
|
504
591
|
active = false;
|
|
505
592
|
};
|
|
506
|
-
}, [engine, pageIndex, zoom, rotation]);
|
|
593
|
+
}, [engine, pageIndex, zoom, rotation, isElementRender, fitScale, displaySize, pageSize]);
|
|
507
594
|
const handleMouseDown = (e) => {
|
|
508
595
|
if (activeTool === "select") return;
|
|
509
596
|
const rect = containerRef.current?.getBoundingClientRect();
|
|
@@ -586,13 +673,31 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
586
673
|
onMouseUp: handleMouseUp,
|
|
587
674
|
children: [
|
|
588
675
|
loading && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "absolute inset-0 bg-gray-50 flex items-center justify-center z-10 animate-pulse", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-[10px] font-black text-gray-400 uppercase tracking-widest", children: "Sincronizando..." }) }),
|
|
589
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
676
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
677
|
+
"canvas",
|
|
678
|
+
{
|
|
679
|
+
ref: canvasRef,
|
|
680
|
+
style: { filter: getPageFilter(), display: isElementRender ? "none" : "block" },
|
|
681
|
+
className: "block"
|
|
682
|
+
}
|
|
683
|
+
),
|
|
684
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
685
|
+
"div",
|
|
686
|
+
{
|
|
687
|
+
ref: htmlLayerRef,
|
|
688
|
+
className: "block",
|
|
689
|
+
style: { filter: getPageFilter(), display: isElementRender ? "block" : "none" }
|
|
690
|
+
}
|
|
691
|
+
),
|
|
590
692
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
591
693
|
"div",
|
|
592
694
|
{
|
|
593
695
|
ref: textLayerRef,
|
|
594
696
|
className: "textLayer",
|
|
595
|
-
style: {
|
|
697
|
+
style: {
|
|
698
|
+
pointerEvents: isElementRender ? "none" : activeTool === "select" ? "auto" : "none",
|
|
699
|
+
display: isElementRender ? "none" : "block"
|
|
700
|
+
}
|
|
596
701
|
}
|
|
597
702
|
),
|
|
598
703
|
isDragging && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
@@ -677,6 +782,26 @@ var Viewer = ({ engine }) => {
|
|
|
677
782
|
const { viewMode, pageCount, currentPage, activeTool, uiTheme, setDocumentState, accentColor } = (0, import_core5.useViewerStore)();
|
|
678
783
|
const isDark = uiTheme === "dark";
|
|
679
784
|
const viewerRef = (0, import_react5.useRef)(null);
|
|
785
|
+
const [availableWidth, setAvailableWidth] = (0, import_react5.useState)(null);
|
|
786
|
+
const isCompact = availableWidth !== null && availableWidth < 820;
|
|
787
|
+
const paddingY = isCompact ? "py-10" : "py-16";
|
|
788
|
+
const toolDockPosition = isCompact ? "bottom-6" : "bottom-10";
|
|
789
|
+
(0, import_react5.useEffect)(() => {
|
|
790
|
+
const element = viewerRef.current;
|
|
791
|
+
if (!element) return;
|
|
792
|
+
const updateWidth = () => {
|
|
793
|
+
const nextWidth = element.clientWidth;
|
|
794
|
+
if (nextWidth > 0) setAvailableWidth(nextWidth);
|
|
795
|
+
};
|
|
796
|
+
updateWidth();
|
|
797
|
+
if (typeof ResizeObserver === "undefined") {
|
|
798
|
+
window.addEventListener("resize", updateWidth);
|
|
799
|
+
return () => window.removeEventListener("resize", updateWidth);
|
|
800
|
+
}
|
|
801
|
+
const observer = new ResizeObserver(() => updateWidth());
|
|
802
|
+
observer.observe(element);
|
|
803
|
+
return () => observer.disconnect();
|
|
804
|
+
}, []);
|
|
680
805
|
(0, import_react5.useEffect)(() => {
|
|
681
806
|
const observer = new IntersectionObserver((entries) => {
|
|
682
807
|
entries.forEach((entry) => {
|
|
@@ -700,9 +825,9 @@ var Viewer = ({ engine }) => {
|
|
|
700
825
|
{ id: "strikeout", name: "Strike", icon: "M13 10V3L4 14h7v7l9-11h-7z" },
|
|
701
826
|
{ 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" }
|
|
702
827
|
];
|
|
703
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { ref: viewerRef, className: `flex-1 overflow-auto flex flex-col items-center
|
|
704
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex flex-col items-center gap-6 w-full", children: pages.map((idx) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { "data-page-index": idx, className: "page-container", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageRenderer_default, { engine, pageIndex: idx }) }, idx)) }),
|
|
705
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `fixed
|
|
828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { ref: viewerRef, className: `flex-1 overflow-auto flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${isDark ? "bg-[#121212]" : "bg-[#e9ecef]"}`, children: [
|
|
829
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex flex-col items-center gap-6 w-full", children: pages.map((idx) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { "data-page-index": idx, className: "page-container", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageRenderer_default, { engine, pageIndex: idx, availableWidth: availableWidth ?? void 0 }) }, idx)) }),
|
|
830
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("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"}`, children: tools.map((tool) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
706
831
|
"button",
|
|
707
832
|
{
|
|
708
833
|
onClick: () => setDocumentState({ activeTool: tool.id }),
|
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';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, PageTheme } from '@papyrus-sdk/types';\r\n\r\ninterface TopbarProps { engine: DocumentEngine; }\r\n\r\nconst Topbar: React.FC<TopbarProps> = ({ engine }) => {\r\n const { \r\n currentPage, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\r\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\r\n } = useViewerStore();\r\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 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={`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'}`}>\r\n <div className=\"flex items-center space-x-3\">\r\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\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 18h16\" /></svg>\r\n </button>\r\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\r\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-4\">\r\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'}`}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M15 19l-7-7 7-7\" /></svg>\r\n </button>\r\n <input \r\n type=\"text\" \r\n className=\"w-10 text-center bg-transparent focus:outline-none font-bold text-sm\" \r\n value={pageInput} \r\n onChange={(e) => setPageInput(e.target.value)} \r\n onKeyDown={(e) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\r\n onBlur={() => handlePageChange(parseInt(pageInput))} \r\n />\r\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount}</span>\r\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <div className={`flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\r\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M20 12H4\" /></svg>\r\n </button>\r\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\r\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M12 4v16m8-8H4\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-3\">\r\n {/* Page Theme Dropdown */}\r\n <div className=\"relative\">\r\n <button \r\n onClick={() => setShowPageThemes(!showPageThemes)}\r\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'}`}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\r\n <span>TEMA</span>\r\n </button>\r\n {showPageThemes && (\r\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'}`}>\r\n {themes.map(t => (\r\n <button \r\n key={t.id}\r\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\r\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'}`}\r\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\r\n <span>{t.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\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'}`}>\r\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>}\r\n </button>\r\n <button\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\r\n style={{ backgroundColor: accentColor }}\r\n >\r\n UPLOAD\r\n </button>\r\n <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf\" onChange={async (e) => {\r\n const file = e.target.files?.[0];\r\n if (file) {\r\n setDocumentState({ isLoaded: false });\r\n await engine.load(file);\r\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\r\n }\r\n }} />\r\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>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default Topbar;\r\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 accentSoft = withAlpha(accentColor, 0.12);\r\n\r\n useEffect(() => {\r\n if (canvasRef.current) {\r\n engine.renderPage(pageIndex, canvasRef.current, 0.15);\r\n }\r\n }, [engine, pageIndex]);\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 ref={canvasRef} className=\"max-w-full h-auto bg-white\" />\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={`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'}`}>\r\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={`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'}`}>\r\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 } 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\r\n useEffect(() => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\r\n if (pageIndex + 1 !== currentPage) setDocumentState({ currentPage: pageIndex + 1 });\r\n }\r\n });\r\n }, { root: viewerRef.current, threshold: 0.5 });\r\n\r\n const pageElements = viewerRef.current?.querySelectorAll('.page-container');\r\n pageElements?.forEach((el) => observer.observe(el));\r\n return () => { pageElements?.forEach((el) => observer.unobserve(el)); observer.disconnect(); };\r\n }, [pageCount, setDocumentState, currentPage]);\r\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={`flex-1 overflow-auto flex flex-col items-center py-16 relative custom-scrollbar scroll-smooth ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}>\r\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} />\r\n </div>\r\n ))}\r\n </div>\r\n <div className={`fixed bottom-10 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, 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 { engine: DocumentEngine; pageIndex: number; }\r\n\r\nconst PageRenderer: React.FC<PageRendererProps> = ({ engine, pageIndex }) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const textLayerRef = useRef<HTMLDivElement>(null);\r\n \r\n const [loading, setLoading] = useState(true);\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\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(() => {\r\n let active = true;\r\n const render = async () => {\r\n if (!canvasRef.current || !textLayerRef.current) return;\r\n setLoading(true);\r\n \r\n try {\r\n const RENDER_SCALE = 2.0; \r\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, canvasRef.current, RENDER_SCALE);\r\n\r\n textLayerRef.current.innerHTML = '';\r\n await engine.renderTextLayer(pageIndex, textLayerRef.current, RENDER_SCALE);\r\n\r\n } catch (err) {\r\n console.error(\"[Papyrus] Falha na renderização:\", err);\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\n\r\n render();\r\n return () => { active = false; };\r\n }, [engine, pageIndex, zoom, rotation]);\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 ref={canvasRef} style={{ filter: getPageFilter() }} className=\"block\" />\r\n\r\n <div \r\n ref={textLayerRef} \r\n className=\"textLayer\"\r\n style={{ pointerEvents: activeTool === 'select' ? 'auto' : 'none' }}\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';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, PageTheme } from '@papyrus-sdk/types';\r\n\r\ninterface TopbarProps { engine: DocumentEngine; }\r\n\r\nconst Topbar: React.FC<TopbarProps> = ({ engine }) => {\r\n const { \r\n currentPage, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\r\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\r\n } = useViewerStore();\r\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={`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'}`}>\r\n <div className=\"flex items-center space-x-3\">\r\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\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 18h16\" /></svg>\r\n </button>\r\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\r\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-4\">\r\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'}`}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M15 19l-7-7 7-7\" /></svg>\r\n </button>\r\n <input \r\n type=\"text\" \r\n className=\"w-10 text-center bg-transparent focus:outline-none font-bold text-sm\" \r\n value={pageInput} \r\n onChange={(e) => setPageInput(e.target.value)} \r\n onKeyDown={(e) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\r\n onBlur={() => handlePageChange(parseInt(pageInput))} \r\n />\r\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount > 0 ? pageCount : '—'}</span>\r\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <div className={`flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\r\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M20 12H4\" /></svg>\r\n </button>\r\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\r\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M12 4v16m8-8H4\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-3\">\r\n {/* Page Theme Dropdown */}\r\n <div className=\"relative\">\r\n <button \r\n onClick={() => setShowPageThemes(!showPageThemes)}\r\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'}`}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\r\n <span>TEMA</span>\r\n </button>\r\n {showPageThemes && (\r\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'}`}>\r\n {themes.map(t => (\r\n <button \r\n key={t.id}\r\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\r\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'}`}\r\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\r\n <span>{t.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\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'}`}>\r\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>}\r\n </button>\r\n <button\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\r\n style={{ backgroundColor: accentColor }}\r\n >\r\n UPLOAD\r\n </button>\r\n <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf,.epub,.txt\" onChange={async (e) => {\r\n const file = e.target.files?.[0];\r\n if (file) {\r\n setDocumentState({ isLoaded: false });\r\n await engine.load(file);\r\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\r\n }\r\n }} />\r\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>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default Topbar;\r\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={`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'}`}>\r\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={`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'}`}>\r\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(() => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\r\n if (pageIndex + 1 !== currentPage) setDocumentState({ currentPage: pageIndex + 1 });\r\n }\r\n });\r\n }, { root: viewerRef.current, threshold: 0.5 });\r\n\r\n const pageElements = viewerRef.current?.querySelectorAll('.page-container');\r\n pageElements?.forEach((el) => observer.observe(el));\r\n return () => { pageElements?.forEach((el) => observer.unobserve(el)); observer.disconnect(); };\r\n }, [pageCount, setDocumentState, currentPage]);\r\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={`flex-1 overflow-auto flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}>\r\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(() => {\r\n let active = true;\r\n const render = async () => {\r\n const renderTarget = isElementRender ? htmlLayerRef.current : canvasRef.current;\r\n if (!renderTarget || !textLayerRef.current) return;\r\n setLoading(true);\r\n \r\n try {\r\n const RENDER_SCALE = 2.0; \r\n const renderScale = isElementRender ? 1.0 : RENDER_SCALE * fitScale; \r\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;\r\n if (!isElementRender) {\r\n textLayerRef.current.innerHTML = '';\r\n await engine.renderTextLayer(pageIndex, textLayerRef.current, renderScale);\r\n }\r\n\r\n if (!isElementRender && displaySize) {\r\n if (canvasRef.current) {\r\n canvasRef.current.style.width = `${displaySize.width}px`;\r\n canvasRef.current.style.height = `${displaySize.height}px`;\r\n }\r\n textLayerRef.current.style.width = `${displaySize.width}px`;\r\n textLayerRef.current.style.height = `${displaySize.height}px`;\r\n }\r\n\r\n } catch (err) {\r\n console.error(\"[Papyrus] Falha na renderização:\", err);\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -28,6 +28,7 @@ var Topbar = ({ engine }) => {
|
|
|
28
28
|
setDocumentState({ zoom: newZoom });
|
|
29
29
|
};
|
|
30
30
|
const handlePageChange = (page) => {
|
|
31
|
+
if (pageCount <= 0) return;
|
|
31
32
|
const p = Math.max(1, Math.min(pageCount, isNaN(page) ? 1 : page));
|
|
32
33
|
engine.goToPage(p);
|
|
33
34
|
setDocumentState({ currentPage: p });
|
|
@@ -62,7 +63,7 @@ var Topbar = ({ engine }) => {
|
|
|
62
63
|
}
|
|
63
64
|
),
|
|
64
65
|
/* @__PURE__ */ jsx("span", { className: "opacity-40 px-1", children: "/" }),
|
|
65
|
-
/* @__PURE__ */ jsx("span", { className: "opacity-80 text-sm", children: pageCount }),
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: "opacity-80 text-sm", children: pageCount > 0 ? pageCount : "\u2014" }),
|
|
66
67
|
/* @__PURE__ */ jsx("button", { onClick: () => handlePageChange(currentPage + 1), className: "p-1.5 rounded transition-all hover:brightness-110", style: { color: accentColor }, children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }) })
|
|
67
68
|
] }),
|
|
68
69
|
/* @__PURE__ */ jsxs("div", { className: `flex items-center rounded-lg p-1 border ${isDark ? "bg-[#2a2a2a] border-[#444]" : "bg-gray-50 border-gray-200"}`, children: [
|
|
@@ -114,7 +115,7 @@ var Topbar = ({ engine }) => {
|
|
|
114
115
|
children: "UPLOAD"
|
|
115
116
|
}
|
|
116
117
|
),
|
|
117
|
-
/* @__PURE__ */ jsx("input", { type: "file", ref: fileInputRef, className: "hidden", accept: ".pdf", onChange: async (e) => {
|
|
118
|
+
/* @__PURE__ */ jsx("input", { type: "file", ref: fileInputRef, className: "hidden", accept: ".pdf,.epub,.txt", onChange: async (e) => {
|
|
118
119
|
const file = e.target.files?.[0];
|
|
119
120
|
if (file) {
|
|
120
121
|
setDocumentState({ isLoaded: false });
|
|
@@ -143,12 +144,18 @@ var withAlpha = (hex, alpha) => {
|
|
|
143
144
|
};
|
|
144
145
|
var Thumbnail = ({ engine, pageIndex, active, isDark, accentColor, onClick }) => {
|
|
145
146
|
const canvasRef = useRef2(null);
|
|
147
|
+
const htmlRef = useRef2(null);
|
|
146
148
|
const accentSoft = withAlpha(accentColor, 0.12);
|
|
149
|
+
const renderTargetType = engine.getRenderTargetType?.() ?? "canvas";
|
|
147
150
|
useEffect2(() => {
|
|
148
|
-
if (
|
|
149
|
-
|
|
151
|
+
if (renderTargetType === "element") return;
|
|
152
|
+
const target = canvasRef.current;
|
|
153
|
+
if (target) {
|
|
154
|
+
engine.renderPage(pageIndex, target, 0.15).catch((err) => {
|
|
155
|
+
console.error("[Papyrus] Thumbnail render failed:", err);
|
|
156
|
+
});
|
|
150
157
|
}
|
|
151
|
-
}, [engine, pageIndex]);
|
|
158
|
+
}, [engine, pageIndex, renderTargetType]);
|
|
152
159
|
return /* @__PURE__ */ jsx2(
|
|
153
160
|
"div",
|
|
154
161
|
{
|
|
@@ -156,7 +163,30 @@ var Thumbnail = ({ engine, pageIndex, active, isDark, accentColor, onClick }) =>
|
|
|
156
163
|
className: `p-3 cursor-pointer transition-all rounded-lg border-2 ${active ? "shadow-sm" : "border-transparent"}`,
|
|
157
164
|
style: active ? { borderColor: accentColor, backgroundColor: accentSoft } : void 0,
|
|
158
165
|
children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-center", children: [
|
|
159
|
-
/* @__PURE__ */
|
|
166
|
+
/* @__PURE__ */ jsxs2("div", { className: `shadow-lg rounded overflow-hidden mb-2 border ${isDark ? "border-[#333]" : "border-gray-200"}`, children: [
|
|
167
|
+
/* @__PURE__ */ jsx2(
|
|
168
|
+
"canvas",
|
|
169
|
+
{
|
|
170
|
+
ref: canvasRef,
|
|
171
|
+
className: "max-w-full h-auto bg-white",
|
|
172
|
+
style: { display: renderTargetType === "element" ? "none" : "block" }
|
|
173
|
+
}
|
|
174
|
+
),
|
|
175
|
+
/* @__PURE__ */ jsx2(
|
|
176
|
+
"div",
|
|
177
|
+
{
|
|
178
|
+
ref: htmlRef,
|
|
179
|
+
className: "bg-white",
|
|
180
|
+
style: {
|
|
181
|
+
width: 90,
|
|
182
|
+
height: 120,
|
|
183
|
+
display: renderTargetType === "element" ? "block" : "none",
|
|
184
|
+
overflow: "hidden"
|
|
185
|
+
},
|
|
186
|
+
children: renderTargetType === "element" && /* @__PURE__ */ jsx2("div", { className: "w-full h-full flex items-center justify-center text-[10px] font-semibold text-gray-500", children: "HTML" })
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
] }),
|
|
160
190
|
/* @__PURE__ */ jsx2("span", { className: `text-[11px] font-bold ${active ? "" : isDark ? "text-gray-500" : "text-gray-400"}`, style: active ? { color: accentColor } : void 0, children: pageIndex + 1 })
|
|
161
191
|
] })
|
|
162
192
|
}
|
|
@@ -418,19 +448,21 @@ var SidebarRight = ({ engine }) => {
|
|
|
418
448
|
var SidebarRight_default = SidebarRight;
|
|
419
449
|
|
|
420
450
|
// components/Viewer.tsx
|
|
421
|
-
import { useEffect as useEffect4, useRef as useRef4 } from "react";
|
|
451
|
+
import { useEffect as useEffect4, useRef as useRef4, useState as useState5 } from "react";
|
|
422
452
|
import { useViewerStore as useViewerStore5 } from "@papyrus-sdk/core";
|
|
423
453
|
|
|
424
454
|
// components/PageRenderer.tsx
|
|
425
|
-
import { useEffect as useEffect3, useRef as useRef3, useState as useState4 } from "react";
|
|
455
|
+
import { useEffect as useEffect3, useMemo, useRef as useRef3, useState as useState4 } from "react";
|
|
426
456
|
import { useViewerStore as useViewerStore4, papyrusEvents } from "@papyrus-sdk/core";
|
|
427
457
|
import { PapyrusEventType } from "@papyrus-sdk/types";
|
|
428
458
|
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
429
|
-
var PageRenderer = ({ engine, pageIndex }) => {
|
|
459
|
+
var PageRenderer = ({ engine, pageIndex, availableWidth }) => {
|
|
430
460
|
const containerRef = useRef3(null);
|
|
431
461
|
const canvasRef = useRef3(null);
|
|
462
|
+
const htmlLayerRef = useRef3(null);
|
|
432
463
|
const textLayerRef = useRef3(null);
|
|
433
464
|
const [loading, setLoading] = useState4(true);
|
|
465
|
+
const [pageSize, setPageSize] = useState4(null);
|
|
434
466
|
const [isDragging, setIsDragging] = useState4(false);
|
|
435
467
|
const [startPos, setStartPos] = useState4({ x: 0, y: 0 });
|
|
436
468
|
const [currentRect, setCurrentRect] = useState4({ x: 0, y: 0, w: 0, h: 0 });
|
|
@@ -448,6 +480,39 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
448
480
|
setSelectedAnnotation,
|
|
449
481
|
accentColor
|
|
450
482
|
} = useViewerStore4();
|
|
483
|
+
const renderTargetType = engine.getRenderTargetType?.() ?? "canvas";
|
|
484
|
+
const isElementRender = renderTargetType === "element";
|
|
485
|
+
useEffect3(() => {
|
|
486
|
+
let active = true;
|
|
487
|
+
const loadSize = async () => {
|
|
488
|
+
try {
|
|
489
|
+
const size = await engine.getPageDimensions(pageIndex);
|
|
490
|
+
if (!active) return;
|
|
491
|
+
if (size.width > 0 && size.height > 0) {
|
|
492
|
+
setPageSize(size);
|
|
493
|
+
}
|
|
494
|
+
} catch {
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
loadSize();
|
|
498
|
+
return () => {
|
|
499
|
+
active = false;
|
|
500
|
+
};
|
|
501
|
+
}, [engine, pageIndex]);
|
|
502
|
+
const fitScale = useMemo(() => {
|
|
503
|
+
if (!availableWidth || !pageSize?.width) return 1;
|
|
504
|
+
const targetWidth = Math.max(0, availableWidth - 48);
|
|
505
|
+
if (!targetWidth) return 1;
|
|
506
|
+
return Math.min(1, targetWidth / pageSize.width);
|
|
507
|
+
}, [availableWidth, pageSize]);
|
|
508
|
+
const displaySize = useMemo(() => {
|
|
509
|
+
if (!pageSize) return null;
|
|
510
|
+
const scale = zoom * fitScale;
|
|
511
|
+
return {
|
|
512
|
+
width: pageSize.width * scale,
|
|
513
|
+
height: pageSize.height * scale
|
|
514
|
+
};
|
|
515
|
+
}, [pageSize, zoom, fitScale]);
|
|
451
516
|
useEffect3(() => {
|
|
452
517
|
if (scrollToPageSignal === pageIndex && containerRef.current) {
|
|
453
518
|
containerRef.current.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
@@ -457,13 +522,35 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
457
522
|
useEffect3(() => {
|
|
458
523
|
let active = true;
|
|
459
524
|
const render = async () => {
|
|
460
|
-
|
|
525
|
+
const renderTarget = isElementRender ? htmlLayerRef.current : canvasRef.current;
|
|
526
|
+
if (!renderTarget || !textLayerRef.current) return;
|
|
461
527
|
setLoading(true);
|
|
462
528
|
try {
|
|
463
529
|
const RENDER_SCALE = 2;
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
530
|
+
const renderScale = isElementRender ? 1 : RENDER_SCALE * fitScale;
|
|
531
|
+
await engine.renderPage(pageIndex, renderTarget, renderScale);
|
|
532
|
+
if (!isElementRender && !pageSize && canvasRef.current) {
|
|
533
|
+
const denom = renderScale * Math.max(zoom, 0.01);
|
|
534
|
+
if (denom > 0) {
|
|
535
|
+
setPageSize({
|
|
536
|
+
width: canvasRef.current.width / denom,
|
|
537
|
+
height: canvasRef.current.height / denom
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
if (!active || !textLayerRef.current) return;
|
|
542
|
+
if (!isElementRender) {
|
|
543
|
+
textLayerRef.current.innerHTML = "";
|
|
544
|
+
await engine.renderTextLayer(pageIndex, textLayerRef.current, renderScale);
|
|
545
|
+
}
|
|
546
|
+
if (!isElementRender && displaySize) {
|
|
547
|
+
if (canvasRef.current) {
|
|
548
|
+
canvasRef.current.style.width = `${displaySize.width}px`;
|
|
549
|
+
canvasRef.current.style.height = `${displaySize.height}px`;
|
|
550
|
+
}
|
|
551
|
+
textLayerRef.current.style.width = `${displaySize.width}px`;
|
|
552
|
+
textLayerRef.current.style.height = `${displaySize.height}px`;
|
|
553
|
+
}
|
|
467
554
|
} catch (err) {
|
|
468
555
|
console.error("[Papyrus] Falha na renderiza\xE7\xE3o:", err);
|
|
469
556
|
} finally {
|
|
@@ -474,7 +561,7 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
474
561
|
return () => {
|
|
475
562
|
active = false;
|
|
476
563
|
};
|
|
477
|
-
}, [engine, pageIndex, zoom, rotation]);
|
|
564
|
+
}, [engine, pageIndex, zoom, rotation, isElementRender, fitScale, displaySize, pageSize]);
|
|
478
565
|
const handleMouseDown = (e) => {
|
|
479
566
|
if (activeTool === "select") return;
|
|
480
567
|
const rect = containerRef.current?.getBoundingClientRect();
|
|
@@ -557,13 +644,31 @@ var PageRenderer = ({ engine, pageIndex }) => {
|
|
|
557
644
|
onMouseUp: handleMouseUp,
|
|
558
645
|
children: [
|
|
559
646
|
loading && /* @__PURE__ */ jsx4("div", { className: "absolute inset-0 bg-gray-50 flex items-center justify-center z-10 animate-pulse", children: /* @__PURE__ */ jsx4("span", { className: "text-[10px] font-black text-gray-400 uppercase tracking-widest", children: "Sincronizando..." }) }),
|
|
560
|
-
/* @__PURE__ */ jsx4(
|
|
647
|
+
/* @__PURE__ */ jsx4(
|
|
648
|
+
"canvas",
|
|
649
|
+
{
|
|
650
|
+
ref: canvasRef,
|
|
651
|
+
style: { filter: getPageFilter(), display: isElementRender ? "none" : "block" },
|
|
652
|
+
className: "block"
|
|
653
|
+
}
|
|
654
|
+
),
|
|
655
|
+
/* @__PURE__ */ jsx4(
|
|
656
|
+
"div",
|
|
657
|
+
{
|
|
658
|
+
ref: htmlLayerRef,
|
|
659
|
+
className: "block",
|
|
660
|
+
style: { filter: getPageFilter(), display: isElementRender ? "block" : "none" }
|
|
661
|
+
}
|
|
662
|
+
),
|
|
561
663
|
/* @__PURE__ */ jsx4(
|
|
562
664
|
"div",
|
|
563
665
|
{
|
|
564
666
|
ref: textLayerRef,
|
|
565
667
|
className: "textLayer",
|
|
566
|
-
style: {
|
|
668
|
+
style: {
|
|
669
|
+
pointerEvents: isElementRender ? "none" : activeTool === "select" ? "auto" : "none",
|
|
670
|
+
display: isElementRender ? "none" : "block"
|
|
671
|
+
}
|
|
567
672
|
}
|
|
568
673
|
),
|
|
569
674
|
isDragging && /* @__PURE__ */ jsx4(
|
|
@@ -648,6 +753,26 @@ var Viewer = ({ engine }) => {
|
|
|
648
753
|
const { viewMode, pageCount, currentPage, activeTool, uiTheme, setDocumentState, accentColor } = useViewerStore5();
|
|
649
754
|
const isDark = uiTheme === "dark";
|
|
650
755
|
const viewerRef = useRef4(null);
|
|
756
|
+
const [availableWidth, setAvailableWidth] = useState5(null);
|
|
757
|
+
const isCompact = availableWidth !== null && availableWidth < 820;
|
|
758
|
+
const paddingY = isCompact ? "py-10" : "py-16";
|
|
759
|
+
const toolDockPosition = isCompact ? "bottom-6" : "bottom-10";
|
|
760
|
+
useEffect4(() => {
|
|
761
|
+
const element = viewerRef.current;
|
|
762
|
+
if (!element) return;
|
|
763
|
+
const updateWidth = () => {
|
|
764
|
+
const nextWidth = element.clientWidth;
|
|
765
|
+
if (nextWidth > 0) setAvailableWidth(nextWidth);
|
|
766
|
+
};
|
|
767
|
+
updateWidth();
|
|
768
|
+
if (typeof ResizeObserver === "undefined") {
|
|
769
|
+
window.addEventListener("resize", updateWidth);
|
|
770
|
+
return () => window.removeEventListener("resize", updateWidth);
|
|
771
|
+
}
|
|
772
|
+
const observer = new ResizeObserver(() => updateWidth());
|
|
773
|
+
observer.observe(element);
|
|
774
|
+
return () => observer.disconnect();
|
|
775
|
+
}, []);
|
|
651
776
|
useEffect4(() => {
|
|
652
777
|
const observer = new IntersectionObserver((entries) => {
|
|
653
778
|
entries.forEach((entry) => {
|
|
@@ -671,9 +796,9 @@ var Viewer = ({ engine }) => {
|
|
|
671
796
|
{ id: "strikeout", name: "Strike", icon: "M13 10V3L4 14h7v7l9-11h-7z" },
|
|
672
797
|
{ 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" }
|
|
673
798
|
];
|
|
674
|
-
return /* @__PURE__ */ jsxs5("div", { ref: viewerRef, className: `flex-1 overflow-auto flex flex-col items-center
|
|
675
|
-
/* @__PURE__ */ jsx5("div", { className: "flex flex-col items-center gap-6 w-full", children: pages.map((idx) => /* @__PURE__ */ jsx5("div", { "data-page-index": idx, className: "page-container", children: /* @__PURE__ */ jsx5(PageRenderer_default, { engine, pageIndex: idx }) }, idx)) }),
|
|
676
|
-
/* @__PURE__ */ jsx5("div", { className: `fixed
|
|
799
|
+
return /* @__PURE__ */ jsxs5("div", { ref: viewerRef, className: `flex-1 overflow-auto flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${isDark ? "bg-[#121212]" : "bg-[#e9ecef]"}`, children: [
|
|
800
|
+
/* @__PURE__ */ jsx5("div", { className: "flex flex-col items-center gap-6 w-full", children: pages.map((idx) => /* @__PURE__ */ jsx5("div", { "data-page-index": idx, className: "page-container", children: /* @__PURE__ */ jsx5(PageRenderer_default, { engine, pageIndex: idx, availableWidth: availableWidth ?? void 0 }) }, idx)) }),
|
|
801
|
+
/* @__PURE__ */ jsx5("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"}`, children: tools.map((tool) => /* @__PURE__ */ jsx5(
|
|
677
802
|
"button",
|
|
678
803
|
{
|
|
679
804
|
onClick: () => setDocumentState({ activeTool: tool.id }),
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["\r\nimport React, { useRef, useState, useEffect } from 'react';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, PageTheme } from '@papyrus-sdk/types';\r\n\r\ninterface TopbarProps { engine: DocumentEngine; }\r\n\r\nconst Topbar: React.FC<TopbarProps> = ({ engine }) => {\r\n const { \r\n currentPage, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\r\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\r\n } = useViewerStore();\r\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 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={`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'}`}>\r\n <div className=\"flex items-center space-x-3\">\r\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\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 18h16\" /></svg>\r\n </button>\r\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\r\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-4\">\r\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'}`}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M15 19l-7-7 7-7\" /></svg>\r\n </button>\r\n <input \r\n type=\"text\" \r\n className=\"w-10 text-center bg-transparent focus:outline-none font-bold text-sm\" \r\n value={pageInput} \r\n onChange={(e) => setPageInput(e.target.value)} \r\n onKeyDown={(e) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\r\n onBlur={() => handlePageChange(parseInt(pageInput))} \r\n />\r\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount}</span>\r\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <div className={`flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\r\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M20 12H4\" /></svg>\r\n </button>\r\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\r\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M12 4v16m8-8H4\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-3\">\r\n {/* Page Theme Dropdown */}\r\n <div className=\"relative\">\r\n <button \r\n onClick={() => setShowPageThemes(!showPageThemes)}\r\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'}`}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\r\n <span>TEMA</span>\r\n </button>\r\n {showPageThemes && (\r\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'}`}>\r\n {themes.map(t => (\r\n <button \r\n key={t.id}\r\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\r\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'}`}\r\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\r\n <span>{t.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\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'}`}>\r\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>}\r\n </button>\r\n <button\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\r\n style={{ backgroundColor: accentColor }}\r\n >\r\n UPLOAD\r\n </button>\r\n <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf\" onChange={async (e) => {\r\n const file = e.target.files?.[0];\r\n if (file) {\r\n setDocumentState({ isLoaded: false });\r\n await engine.load(file);\r\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\r\n }\r\n }} />\r\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>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default Topbar;\r\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 accentSoft = withAlpha(accentColor, 0.12);\r\n\r\n useEffect(() => {\r\n if (canvasRef.current) {\r\n engine.renderPage(pageIndex, canvasRef.current, 0.15);\r\n }\r\n }, [engine, pageIndex]);\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 ref={canvasRef} className=\"max-w-full h-auto bg-white\" />\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={`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'}`}>\r\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={`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'}`}>\r\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 } 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\r\n useEffect(() => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\r\n if (pageIndex + 1 !== currentPage) setDocumentState({ currentPage: pageIndex + 1 });\r\n }\r\n });\r\n }, { root: viewerRef.current, threshold: 0.5 });\r\n\r\n const pageElements = viewerRef.current?.querySelectorAll('.page-container');\r\n pageElements?.forEach((el) => observer.observe(el));\r\n return () => { pageElements?.forEach((el) => observer.unobserve(el)); observer.disconnect(); };\r\n }, [pageCount, setDocumentState, currentPage]);\r\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={`flex-1 overflow-auto flex flex-col items-center py-16 relative custom-scrollbar scroll-smooth ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}>\r\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} />\r\n </div>\r\n ))}\r\n </div>\r\n <div className={`fixed bottom-10 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, 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 { engine: DocumentEngine; pageIndex: number; }\r\n\r\nconst PageRenderer: React.FC<PageRendererProps> = ({ engine, pageIndex }) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const textLayerRef = useRef<HTMLDivElement>(null);\r\n \r\n const [loading, setLoading] = useState(true);\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\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(() => {\r\n let active = true;\r\n const render = async () => {\r\n if (!canvasRef.current || !textLayerRef.current) return;\r\n setLoading(true);\r\n \r\n try {\r\n const RENDER_SCALE = 2.0; \r\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, canvasRef.current, RENDER_SCALE);\r\n\r\n textLayerRef.current.innerHTML = '';\r\n await engine.renderTextLayer(pageIndex, textLayerRef.current, RENDER_SCALE);\r\n\r\n } catch (err) {\r\n console.error(\"[Papyrus] Falha na renderização:\", err);\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\n\r\n render();\r\n return () => { active = false; };\r\n }, [engine, pageIndex, zoom, rotation]);\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 ref={canvasRef} style={{ filter: getPageFilter() }} className=\"block\" />\r\n\r\n <div \r\n ref={textLayerRef} \r\n className=\"textLayer\"\r\n style={{ pointerEvents: activeTool === 'select' ? 'auto' : 'none' }}\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":["useEffect","useRef","useState","useViewerStore","jsx","jsxs","useState","useViewerStore","jsx","jsxs","withAlpha","useEffect","useRef","useViewerStore","useEffect","useRef","useState","useViewerStore","jsx","jsxs","jsx","jsxs","useViewerStore","useRef","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../components/Topbar.tsx","../components/SidebarLeft.tsx","../components/SidebarRight.tsx","../components/Viewer.tsx","../components/PageRenderer.tsx"],"sourcesContent":["\r\nimport React, { useRef, useState, useEffect } from 'react';\r\nimport { useViewerStore } from '@papyrus-sdk/core';\r\nimport { DocumentEngine, PageTheme } from '@papyrus-sdk/types';\r\n\r\ninterface TopbarProps { engine: DocumentEngine; }\r\n\r\nconst Topbar: React.FC<TopbarProps> = ({ engine }) => {\r\n const { \r\n currentPage, pageCount, zoom, uiTheme, pageTheme, setDocumentState, accentColor,\r\n toggleSidebarLeft, toggleSidebarRight, triggerScrollToPage\r\n } = useViewerStore();\r\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={`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'}`}>\r\n <div className=\"flex items-center space-x-3\">\r\n <button onClick={toggleSidebarLeft} className={`p-2 rounded-md ${isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100'}`}>\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 18h16\" /></svg>\r\n </button>\r\n <span className=\"font-bold text-lg tracking-tight\" style={{ color: accentColor }}>\r\n Papyrus<span className={isDark ? 'text-white' : 'text-gray-900'}>Core</span>\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-4\">\r\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'}`}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M15 19l-7-7 7-7\" /></svg>\r\n </button>\r\n <input \r\n type=\"text\" \r\n className=\"w-10 text-center bg-transparent focus:outline-none font-bold text-sm\" \r\n value={pageInput} \r\n onChange={(e) => setPageInput(e.target.value)} \r\n onKeyDown={(e) => e.key === 'Enter' && handlePageChange(parseInt(pageInput))}\r\n onBlur={() => handlePageChange(parseInt(pageInput))} \r\n />\r\n <span className=\"opacity-40 px-1\">/</span><span className=\"opacity-80 text-sm\">{pageCount > 0 ? pageCount : '—'}</span>\r\n <button onClick={() => handlePageChange(currentPage + 1)} className=\"p-1.5 rounded transition-all hover:brightness-110\" 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} d=\"M9 5l7 7-7 7\" /></svg>\r\n </button>\r\n </div>\r\n\r\n <div className={`flex items-center rounded-lg p-1 border ${isDark ? 'bg-[#2a2a2a] border-[#444]' : 'bg-gray-50 border-gray-200'}`}>\r\n <button onClick={() => handleZoom(-0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M20 12H4\" /></svg>\r\n </button>\r\n <span className=\"px-3 text-xs font-bold min-w-[50px] text-center\">{Math.round(zoom * 100)}%</span>\r\n <button onClick={() => handleZoom(0.1)} className=\"p-1.5 rounded hover:brightness-110\" 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} d=\"M12 4v16m8-8H4\" /></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center space-x-3\">\r\n {/* Page Theme Dropdown */}\r\n <div className=\"relative\">\r\n <button \r\n onClick={() => setShowPageThemes(!showPageThemes)}\r\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'}`}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${themes.find(t => t.id === pageTheme)?.color}`} />\r\n <span>TEMA</span>\r\n </button>\r\n {showPageThemes && (\r\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'}`}>\r\n {themes.map(t => (\r\n <button \r\n key={t.id}\r\n onClick={() => { setDocumentState({ pageTheme: t.id }); setShowPageThemes(false); }}\r\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'}`}\r\n style={pageTheme === t.id ? { backgroundColor: accentColor } : undefined}\r\n >\r\n <div className={`w-3 h-3 rounded-full border ${t.color}`} />\r\n <span>{t.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\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'}`}>\r\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>}\r\n </button>\r\n <button\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"px-4 py-1.5 text-white rounded-md text-sm font-bold shadow-md active:scale-95\"\r\n style={{ backgroundColor: accentColor }}\r\n >\r\n UPLOAD\r\n </button>\r\n <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\".pdf,.epub,.txt\" onChange={async (e) => {\r\n const file = e.target.files?.[0];\r\n if (file) {\r\n setDocumentState({ isLoaded: false });\r\n await engine.load(file);\r\n setDocumentState({ isLoaded: true, pageCount: engine.getPageCount(), currentPage: 1, outline: await engine.getOutline() });\r\n }\r\n }} />\r\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>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default Topbar;\r\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={`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'}`}>\r\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={`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'}`}>\r\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(() => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const pageIndex = parseInt(entry.target.getAttribute('data-page-index') || '0');\r\n if (pageIndex + 1 !== currentPage) setDocumentState({ currentPage: pageIndex + 1 });\r\n }\r\n });\r\n }, { root: viewerRef.current, threshold: 0.5 });\r\n\r\n const pageElements = viewerRef.current?.querySelectorAll('.page-container');\r\n pageElements?.forEach((el) => observer.observe(el));\r\n return () => { pageElements?.forEach((el) => observer.unobserve(el)); observer.disconnect(); };\r\n }, [pageCount, setDocumentState, currentPage]);\r\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={`flex-1 overflow-auto flex flex-col items-center ${paddingY} relative custom-scrollbar scroll-smooth ${isDark ? 'bg-[#121212]' : 'bg-[#e9ecef]'}`}>\r\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(() => {\r\n let active = true;\r\n const render = async () => {\r\n const renderTarget = isElementRender ? htmlLayerRef.current : canvasRef.current;\r\n if (!renderTarget || !textLayerRef.current) return;\r\n setLoading(true);\r\n \r\n try {\r\n const RENDER_SCALE = 2.0; \r\n const renderScale = isElementRender ? 1.0 : RENDER_SCALE * fitScale; \r\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;\r\n if (!isElementRender) {\r\n textLayerRef.current.innerHTML = '';\r\n await engine.renderTextLayer(pageIndex, textLayerRef.current, renderScale);\r\n }\r\n\r\n if (!isElementRender && displaySize) {\r\n if (canvasRef.current) {\r\n canvasRef.current.style.width = `${displaySize.width}px`;\r\n canvasRef.current.style.height = `${displaySize.height}px`;\r\n }\r\n textLayerRef.current.style.width = `${displaySize.width}px`;\r\n textLayerRef.current.style.height = `${displaySize.height}px`;\r\n }\r\n\r\n } catch (err) {\r\n console.error(\"[Papyrus] Falha na renderização:\", err);\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\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":["useEffect","useRef","useState","useViewerStore","jsx","jsxs","useState","useViewerStore","jsx","jsxs","withAlpha","useEffect","useRef","useState","useViewerStore","useEffect","useRef","useState","useViewerStore","jsx","jsxs","jsx","jsxs","useViewerStore","useRef","useState","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@papyrus-sdk/ui-react",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"main": "dist/index.
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
10
|
"import": "./dist/index.mjs",
|
|
11
|
-
"require": "./dist/index.
|
|
11
|
+
"require": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"access": "public"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@papyrus-sdk/core": "0.1.
|
|
22
|
-
"@papyrus-sdk/types": "0.1.
|
|
21
|
+
"@papyrus-sdk/core": "0.1.3",
|
|
22
|
+
"@papyrus-sdk/types": "0.1.3"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"react": ">=18.2.0 <20"
|