@docmentis/udoc-viewer 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wasm/udoc_bg.wasm +0 -0
- package/dist/worker/WorkerClient.js +1 -1
- package/package.json +11 -3
- package/dist/WorkerClient.d.ts +0 -36
- package/dist/WorkerClient.d.ts.map +0 -1
- package/dist/WorkerClient.js +0 -121
- package/dist/WorkerClient.js.map +0 -1
- package/dist/annotation/AnnotationLayer.d.ts +0 -166
- package/dist/annotation/AnnotationLayer.d.ts.map +0 -1
- package/dist/annotation/AnnotationLayer.js +0 -1090
- package/dist/annotation/AnnotationLayer.js.map +0 -1
- package/dist/annotation/index.d.ts +0 -6
- package/dist/annotation/index.d.ts.map +0 -1
- package/dist/annotation/index.js +0 -6
- package/dist/annotation/index.js.map +0 -1
- package/dist/components/FloatingBar.d.ts +0 -102
- package/dist/components/FloatingBar.d.ts.map +0 -1
- package/dist/components/FloatingBar.js +0 -513
- package/dist/components/FloatingBar.js.map +0 -1
- package/dist/components/Header.d.ts +0 -46
- package/dist/components/Header.d.ts.map +0 -1
- package/dist/components/Header.js +0 -93
- package/dist/components/Header.js.map +0 -1
- package/dist/components/index.d.ts +0 -6
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -4
- package/dist/components/index.js.map +0 -1
- package/dist/components/panels/CommentsPanel.d.ts +0 -33
- package/dist/components/panels/CommentsPanel.d.ts.map +0 -1
- package/dist/components/panels/CommentsPanel.js +0 -176
- package/dist/components/panels/CommentsPanel.js.map +0 -1
- package/dist/components/panels/OutlinePanel.d.ts +0 -30
- package/dist/components/panels/OutlinePanel.d.ts.map +0 -1
- package/dist/components/panels/OutlinePanel.js +0 -144
- package/dist/components/panels/OutlinePanel.js.map +0 -1
- package/dist/components/panels/ThumbnailsPanel.d.ts +0 -51
- package/dist/components/panels/ThumbnailsPanel.d.ts.map +0 -1
- package/dist/components/panels/ThumbnailsPanel.js +0 -160
- package/dist/components/panels/ThumbnailsPanel.js.map +0 -1
- package/dist/components/panels/index.d.ts +0 -7
- package/dist/components/panels/index.d.ts.map +0 -1
- package/dist/components/panels/index.js +0 -4
- package/dist/components/panels/index.js.map +0 -1
- package/dist/constants.d.ts +0 -25
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -46
- package/dist/constants.js.map +0 -1
- package/dist/core/NavigationController.d.ts +0 -54
- package/dist/core/NavigationController.d.ts.map +0 -1
- package/dist/core/NavigationController.js +0 -145
- package/dist/core/NavigationController.js.map +0 -1
- package/dist/core/PerfTimer.d.ts +0 -12
- package/dist/core/PerfTimer.d.ts.map +0 -1
- package/dist/core/PerfTimer.js +0 -32
- package/dist/core/PerfTimer.js.map +0 -1
- package/dist/core/ViewerState.d.ts +0 -108
- package/dist/core/ViewerState.d.ts.map +0 -1
- package/dist/core/ViewerState.js +0 -179
- package/dist/core/ViewerState.js.map +0 -1
- package/dist/core/constants.d.ts +0 -24
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -42
- package/dist/core/constants.js.map +0 -1
- package/dist/core/index.d.ts +0 -8
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -11
- package/dist/core/index.js.map +0 -1
- package/dist/core/types.d.ts +0 -573
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -1
- package/dist/icons/icons.d.ts +0 -41
- package/dist/icons/icons.d.ts.map +0 -1
- package/dist/icons/icons.js +0 -51
- package/dist/icons/icons.js.map +0 -1
- package/dist/icons/index.d.ts +0 -3
- package/dist/icons/index.d.ts.map +0 -1
- package/dist/icons/index.js +0 -2
- package/dist/icons/index.js.map +0 -1
- package/dist/layout/BandManager.d.ts +0 -87
- package/dist/layout/BandManager.d.ts.map +0 -1
- package/dist/layout/BandManager.js +0 -185
- package/dist/layout/BandManager.js.map +0 -1
- package/dist/layout/LayoutCalculator.d.ts +0 -42
- package/dist/layout/LayoutCalculator.d.ts.map +0 -1
- package/dist/layout/LayoutCalculator.js +0 -180
- package/dist/layout/LayoutCalculator.js.map +0 -1
- package/dist/layout/LayoutState.d.ts +0 -46
- package/dist/layout/LayoutState.d.ts.map +0 -1
- package/dist/layout/LayoutState.js +0 -109
- package/dist/layout/LayoutState.js.map +0 -1
- package/dist/layout/TransitionCoordinator.d.ts +0 -11
- package/dist/layout/TransitionCoordinator.d.ts.map +0 -1
- package/dist/layout/TransitionCoordinator.js +0 -22
- package/dist/layout/TransitionCoordinator.js.map +0 -1
- package/dist/layout/index.d.ts +0 -7
- package/dist/layout/index.d.ts.map +0 -1
- package/dist/layout/index.js +0 -4
- package/dist/layout/index.js.map +0 -1
- package/dist/rendering/BandManager.d.ts +0 -87
- package/dist/rendering/BandManager.d.ts.map +0 -1
- package/dist/rendering/BandManager.js +0 -185
- package/dist/rendering/BandManager.js.map +0 -1
- package/dist/rendering/PageCache.d.ts +0 -75
- package/dist/rendering/PageCache.d.ts.map +0 -1
- package/dist/rendering/PageCache.js +0 -122
- package/dist/rendering/PageCache.js.map +0 -1
- package/dist/rendering/RenderQueue.d.ts +0 -75
- package/dist/rendering/RenderQueue.d.ts.map +0 -1
- package/dist/rendering/RenderQueue.js +0 -105
- package/dist/rendering/RenderQueue.js.map +0 -1
- package/dist/rendering/ThumbnailQueue.d.ts +0 -57
- package/dist/rendering/ThumbnailQueue.d.ts.map +0 -1
- package/dist/rendering/ThumbnailQueue.js +0 -85
- package/dist/rendering/ThumbnailQueue.js.map +0 -1
- package/dist/rendering/index.d.ts +0 -13
- package/dist/rendering/index.d.ts.map +0 -1
- package/dist/rendering/index.js +0 -10
- package/dist/rendering/index.js.map +0 -1
- package/dist/rendering/types.d.ts +0 -72
- package/dist/rendering/types.d.ts.map +0 -1
- package/dist/rendering/types.js +0 -5
- package/dist/rendering/types.js.map +0 -1
- package/dist/styles/index.d.ts +0 -6
- package/dist/styles/index.d.ts.map +0 -1
- package/dist/styles/index.js +0 -1221
- package/dist/styles/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/ui/Component.d.ts +0 -127
- package/dist/ui/Component.d.ts.map +0 -1
- package/dist/ui/Component.js +0 -201
- package/dist/ui/Component.js.map +0 -1
- package/dist/ui/annotation/AnnotationLayer.d.ts +0 -90
- package/dist/ui/annotation/AnnotationLayer.d.ts.map +0 -1
- package/dist/ui/annotation/AnnotationLayer.js +0 -322
- package/dist/ui/annotation/AnnotationLayer.js.map +0 -1
- package/dist/ui/annotation/LinkRenderer.d.ts +0 -32
- package/dist/ui/annotation/LinkRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/LinkRenderer.js +0 -74
- package/dist/ui/annotation/LinkRenderer.js.map +0 -1
- package/dist/ui/annotation/MarkupRenderer.d.ts +0 -40
- package/dist/ui/annotation/MarkupRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/MarkupRenderer.js +0 -154
- package/dist/ui/annotation/MarkupRenderer.js.map +0 -1
- package/dist/ui/annotation/ShapeRenderer.d.ts +0 -46
- package/dist/ui/annotation/ShapeRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/ShapeRenderer.js +0 -376
- package/dist/ui/annotation/ShapeRenderer.js.map +0 -1
- package/dist/ui/annotation/TextRenderer.d.ts +0 -36
- package/dist/ui/annotation/TextRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/TextRenderer.js +0 -199
- package/dist/ui/annotation/TextRenderer.js.map +0 -1
- package/dist/ui/annotation/index.d.ts +0 -17
- package/dist/ui/annotation/index.d.ts.map +0 -1
- package/dist/ui/annotation/index.js +0 -13
- package/dist/ui/annotation/index.js.map +0 -1
- package/dist/ui/annotation/utils.d.ts +0 -40
- package/dist/ui/annotation/utils.d.ts.map +0 -1
- package/dist/ui/annotation/utils.js +0 -62
- package/dist/ui/annotation/utils.js.map +0 -1
- package/dist/ui/components/CommentsContent.d.ts +0 -35
- package/dist/ui/components/CommentsContent.d.ts.map +0 -1
- package/dist/ui/components/CommentsContent.js +0 -203
- package/dist/ui/components/CommentsContent.js.map +0 -1
- package/dist/ui/components/FloatingBar.d.ts +0 -55
- package/dist/ui/components/FloatingBar.d.ts.map +0 -1
- package/dist/ui/components/FloatingBar.js +0 -585
- package/dist/ui/components/FloatingBar.js.map +0 -1
- package/dist/ui/components/Header.d.ts +0 -29
- package/dist/ui/components/Header.d.ts.map +0 -1
- package/dist/ui/components/Header.js +0 -127
- package/dist/ui/components/Header.js.map +0 -1
- package/dist/ui/components/LeftPanel.d.ts +0 -54
- package/dist/ui/components/LeftPanel.d.ts.map +0 -1
- package/dist/ui/components/LeftPanel.js +0 -202
- package/dist/ui/components/LeftPanel.js.map +0 -1
- package/dist/ui/components/OutlineContent.d.ts +0 -34
- package/dist/ui/components/OutlineContent.d.ts.map +0 -1
- package/dist/ui/components/OutlineContent.js +0 -147
- package/dist/ui/components/OutlineContent.js.map +0 -1
- package/dist/ui/components/RightPanel.d.ts +0 -52
- package/dist/ui/components/RightPanel.d.ts.map +0 -1
- package/dist/ui/components/RightPanel.js +0 -142
- package/dist/ui/components/RightPanel.js.map +0 -1
- package/dist/ui/components/Viewport.d.ts +0 -70
- package/dist/ui/components/Viewport.d.ts.map +0 -1
- package/dist/ui/components/Viewport.js +0 -173
- package/dist/ui/components/Viewport.js.map +0 -1
- package/dist/ui/components/index.d.ts +0 -11
- package/dist/ui/components/index.d.ts.map +0 -1
- package/dist/ui/components/index.js +0 -10
- package/dist/ui/components/index.js.map +0 -1
- package/dist/ui/icons/icons.d.ts +0 -43
- package/dist/ui/icons/icons.d.ts.map +0 -1
- package/dist/ui/icons/icons.js +0 -46
- package/dist/ui/icons/icons.js.map +0 -1
- package/dist/ui/icons/index.d.ts +0 -11
- package/dist/ui/icons/index.d.ts.map +0 -1
- package/dist/ui/icons/index.js +0 -18
- package/dist/ui/icons/index.js.map +0 -1
- package/dist/ui/index.d.ts +0 -7
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js +0 -9
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/styles/base.css.d.ts +0 -5
- package/dist/ui/styles/base.css.d.ts.map +0 -1
- package/dist/ui/styles/base.css.js +0 -49
- package/dist/ui/styles/base.css.js.map +0 -1
- package/dist/ui/styles/floating-bar.css.d.ts +0 -5
- package/dist/ui/styles/floating-bar.css.d.ts.map +0 -1
- package/dist/ui/styles/floating-bar.css.js +0 -417
- package/dist/ui/styles/floating-bar.css.js.map +0 -1
- package/dist/ui/styles/header.css.d.ts +0 -5
- package/dist/ui/styles/header.css.d.ts.map +0 -1
- package/dist/ui/styles/header.css.js +0 -49
- package/dist/ui/styles/header.css.js.map +0 -1
- package/dist/ui/styles/index.d.ts +0 -21
- package/dist/ui/styles/index.d.ts.map +0 -1
- package/dist/ui/styles/index.js +0 -48
- package/dist/ui/styles/index.js.map +0 -1
- package/dist/ui/styles/panels.css.d.ts +0 -5
- package/dist/ui/styles/panels.css.d.ts.map +0 -1
- package/dist/ui/styles/panels.css.js +0 -446
- package/dist/ui/styles/panels.css.js.map +0 -1
- package/dist/ui/styles/responsive.css.d.ts +0 -5
- package/dist/ui/styles/responsive.css.d.ts.map +0 -1
- package/dist/ui/styles/responsive.css.js +0 -201
- package/dist/ui/styles/responsive.css.js.map +0 -1
- package/dist/ui/styles/variables.css.d.ts +0 -6
- package/dist/ui/styles/variables.css.d.ts.map +0 -1
- package/dist/ui/styles/variables.css.js +0 -75
- package/dist/ui/styles/variables.css.js.map +0 -1
- package/dist/ui/styles/viewport.css.d.ts +0 -5
- package/dist/ui/styles/viewport.css.d.ts.map +0 -1
- package/dist/ui/styles/viewport.css.js +0 -87
- package/dist/ui/styles/viewport.css.js.map +0 -1
- package/dist/view/LayoutCalculator.d.ts +0 -42
- package/dist/view/LayoutCalculator.d.ts.map +0 -1
- package/dist/view/LayoutCalculator.js +0 -180
- package/dist/view/LayoutCalculator.js.map +0 -1
- package/dist/view/TransitionCoordinator.d.ts +0 -11
- package/dist/view/TransitionCoordinator.d.ts.map +0 -1
- package/dist/view/TransitionCoordinator.js +0 -22
- package/dist/view/TransitionCoordinator.js.map +0 -1
- package/dist/view/ViewState.d.ts +0 -46
- package/dist/view/ViewState.d.ts.map +0 -1
- package/dist/view/ViewState.js +0 -109
- package/dist/view/ViewState.js.map +0 -1
- package/dist/view/index.d.ts +0 -7
- package/dist/view/index.d.ts.map +0 -1
- package/dist/view/index.js +0 -4
- package/dist/view/index.js.map +0 -1
- package/dist/worker/types.d.ts +0 -81
- package/dist/worker/types.d.ts.map +0 -1
- package/dist/worker/types.js +0 -6
- package/dist/worker/types.js.map +0 -1
- package/dist/worker.d.ts +0 -2
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -205
- package/dist/worker.js.map +0 -1
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
import { MarkupRenderer } from './MarkupRenderer';
|
|
2
|
-
import { LinkRenderer } from './LinkRenderer';
|
|
3
|
-
import { ShapeRenderer } from './ShapeRenderer';
|
|
4
|
-
import { TextRenderer } from './TextRenderer';
|
|
5
|
-
/**
|
|
6
|
-
* Manages annotation rendering and interaction for a document viewer.
|
|
7
|
-
*/
|
|
8
|
-
export class AnnotationLayer {
|
|
9
|
-
/** Annotations indexed by page index */
|
|
10
|
-
pageAnnotations = new Map();
|
|
11
|
-
/** Overlay elements indexed by page index */
|
|
12
|
-
overlays = new Map();
|
|
13
|
-
/** Current zoom level */
|
|
14
|
-
zoom = 1;
|
|
15
|
-
/** Currently active popup element */
|
|
16
|
-
activePopup = null;
|
|
17
|
-
/** Bound handler for clicking outside popup */
|
|
18
|
-
boundHandleDocumentClick = null;
|
|
19
|
-
/** Bound handler for escape key */
|
|
20
|
-
boundHandleEscapeKey = null;
|
|
21
|
-
// Specialized renderers
|
|
22
|
-
markupRenderer;
|
|
23
|
-
linkRenderer;
|
|
24
|
-
shapeRenderer;
|
|
25
|
-
textRenderer;
|
|
26
|
-
constructor() {
|
|
27
|
-
// Initialize renderers with default zoom
|
|
28
|
-
const showPopup = this.showPopup.bind(this);
|
|
29
|
-
this.markupRenderer = new MarkupRenderer(this.zoom, showPopup);
|
|
30
|
-
this.linkRenderer = new LinkRenderer(this.zoom);
|
|
31
|
-
this.shapeRenderer = new ShapeRenderer(this.zoom);
|
|
32
|
-
this.textRenderer = new TextRenderer(this.zoom, showPopup);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Set the callback for internal link navigation.
|
|
36
|
-
*/
|
|
37
|
-
setNavigateCallback(callback) {
|
|
38
|
-
this.linkRenderer.setNavigateCallback(callback);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Set the callback for external URI links.
|
|
42
|
-
*/
|
|
43
|
-
setOpenUriCallback(callback) {
|
|
44
|
-
this.linkRenderer.setOpenUriCallback(callback);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Set annotations for a specific page.
|
|
48
|
-
*/
|
|
49
|
-
setPageAnnotations(pageIndex, annotations) {
|
|
50
|
-
this.pageAnnotations.set(pageIndex, annotations);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Get annotations for a specific page.
|
|
54
|
-
*/
|
|
55
|
-
getPageAnnotations(pageIndex) {
|
|
56
|
-
return this.pageAnnotations.get(pageIndex) ?? [];
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get all annotations with metadata, grouped by page.
|
|
60
|
-
* Returns only annotations that have metadata (comments).
|
|
61
|
-
*/
|
|
62
|
-
getAllAnnotationsWithMetadata() {
|
|
63
|
-
const result = new Map();
|
|
64
|
-
for (const [pageIndex, annotations] of this.pageAnnotations) {
|
|
65
|
-
const withMetadata = annotations.filter(a => a.metadata);
|
|
66
|
-
if (withMetadata.length > 0) {
|
|
67
|
-
result.set(pageIndex, withMetadata);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Clear all annotations and overlays.
|
|
74
|
-
*/
|
|
75
|
-
clear() {
|
|
76
|
-
this.hidePopup();
|
|
77
|
-
this.pageAnnotations.clear();
|
|
78
|
-
for (const overlay of this.overlays.values()) {
|
|
79
|
-
overlay.remove();
|
|
80
|
-
}
|
|
81
|
-
this.overlays.clear();
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Set the current zoom level.
|
|
85
|
-
*/
|
|
86
|
-
setZoom(zoom) {
|
|
87
|
-
this.zoom = zoom;
|
|
88
|
-
this.markupRenderer.setZoom(zoom);
|
|
89
|
-
this.linkRenderer.setZoom(zoom);
|
|
90
|
-
this.shapeRenderer.setZoom(zoom);
|
|
91
|
-
this.textRenderer.setZoom(zoom);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Show a popup for an annotation.
|
|
95
|
-
* @param anchorElement The element to anchor the popup to
|
|
96
|
-
* @param metadata The annotation metadata to display
|
|
97
|
-
* @param color The annotation color for styling
|
|
98
|
-
*/
|
|
99
|
-
showPopup(anchorElement, metadata, color) {
|
|
100
|
-
// Hide any existing popup first
|
|
101
|
-
this.hidePopup();
|
|
102
|
-
// Create popup container
|
|
103
|
-
const popup = document.createElement('div');
|
|
104
|
-
popup.className = 'udoc-annotation-popup';
|
|
105
|
-
popup.style.cssText = `
|
|
106
|
-
position: absolute;
|
|
107
|
-
background: white;
|
|
108
|
-
border: 1px solid ${color};
|
|
109
|
-
border-radius: 4px;
|
|
110
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
111
|
-
max-width: 300px;
|
|
112
|
-
min-width: 150px;
|
|
113
|
-
font-size: 13px;
|
|
114
|
-
line-height: 1.4;
|
|
115
|
-
color: #333;
|
|
116
|
-
z-index: 1000;
|
|
117
|
-
pointer-events: auto;
|
|
118
|
-
overflow: hidden;
|
|
119
|
-
`;
|
|
120
|
-
// Create header section - show author if exists, otherwise fallback to subject
|
|
121
|
-
const headerText = metadata.author || metadata.subject;
|
|
122
|
-
if (headerText) {
|
|
123
|
-
const header = document.createElement('div');
|
|
124
|
-
header.style.cssText = `
|
|
125
|
-
background: ${color};
|
|
126
|
-
padding: 6px 10px;
|
|
127
|
-
color: white;
|
|
128
|
-
font-weight: 500;
|
|
129
|
-
font-size: 12px;
|
|
130
|
-
text-shadow: 0 1px 1px rgba(0,0,0,0.2);
|
|
131
|
-
`;
|
|
132
|
-
header.textContent = headerText;
|
|
133
|
-
popup.appendChild(header);
|
|
134
|
-
}
|
|
135
|
-
// Create body section (contents) if exists
|
|
136
|
-
if (metadata.contents) {
|
|
137
|
-
const body = document.createElement('div');
|
|
138
|
-
body.style.cssText = `
|
|
139
|
-
padding: 8px 10px;
|
|
140
|
-
word-wrap: break-word;
|
|
141
|
-
white-space: pre-wrap;
|
|
142
|
-
`;
|
|
143
|
-
body.textContent = metadata.contents;
|
|
144
|
-
popup.appendChild(body);
|
|
145
|
-
}
|
|
146
|
-
// Position the popup relative to the anchor element
|
|
147
|
-
const anchorRect = anchorElement.getBoundingClientRect();
|
|
148
|
-
const overlay = anchorElement.closest('.udoc-annotation-overlay');
|
|
149
|
-
if (!overlay)
|
|
150
|
-
return;
|
|
151
|
-
const overlayRect = overlay.getBoundingClientRect();
|
|
152
|
-
// Position popup below and to the right of the icon
|
|
153
|
-
const popupX = anchorRect.left - overlayRect.left + anchorRect.width + 4;
|
|
154
|
-
const popupY = anchorRect.top - overlayRect.top;
|
|
155
|
-
popup.style.left = `${popupX}px`;
|
|
156
|
-
popup.style.top = `${popupY}px`;
|
|
157
|
-
overlay.appendChild(popup);
|
|
158
|
-
this.activePopup = popup;
|
|
159
|
-
// Adjust position if popup goes off-screen
|
|
160
|
-
requestAnimationFrame(() => {
|
|
161
|
-
const popupRect = popup.getBoundingClientRect();
|
|
162
|
-
const viewportWidth = window.innerWidth;
|
|
163
|
-
const viewportHeight = window.innerHeight;
|
|
164
|
-
// If popup extends beyond right edge, position to the left of the icon
|
|
165
|
-
if (popupRect.right > viewportWidth - 10) {
|
|
166
|
-
const newX = anchorRect.left - overlayRect.left - popupRect.width - 4;
|
|
167
|
-
popup.style.left = `${Math.max(0, newX)}px`;
|
|
168
|
-
}
|
|
169
|
-
// If popup extends beyond bottom edge, adjust upward
|
|
170
|
-
if (popupRect.bottom > viewportHeight - 10) {
|
|
171
|
-
const newY = popupY - (popupRect.bottom - viewportHeight) - 10;
|
|
172
|
-
popup.style.top = `${Math.max(0, newY)}px`;
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
// Set up event handlers for closing
|
|
176
|
-
this.boundHandleDocumentClick = (e) => {
|
|
177
|
-
if (!popup.contains(e.target) && !anchorElement.contains(e.target)) {
|
|
178
|
-
this.hidePopup();
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
this.boundHandleEscapeKey = (e) => {
|
|
182
|
-
if (e.key === 'Escape') {
|
|
183
|
-
this.hidePopup();
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
// Delay adding click listener to avoid immediate close
|
|
187
|
-
setTimeout(() => {
|
|
188
|
-
document.addEventListener('click', this.boundHandleDocumentClick);
|
|
189
|
-
}, 0);
|
|
190
|
-
document.addEventListener('keydown', this.boundHandleEscapeKey);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Hide the currently active popup.
|
|
194
|
-
*/
|
|
195
|
-
hidePopup() {
|
|
196
|
-
if (this.activePopup) {
|
|
197
|
-
this.activePopup.remove();
|
|
198
|
-
this.activePopup = null;
|
|
199
|
-
}
|
|
200
|
-
if (this.boundHandleDocumentClick) {
|
|
201
|
-
document.removeEventListener('click', this.boundHandleDocumentClick);
|
|
202
|
-
this.boundHandleDocumentClick = null;
|
|
203
|
-
}
|
|
204
|
-
if (this.boundHandleEscapeKey) {
|
|
205
|
-
document.removeEventListener('keydown', this.boundHandleEscapeKey);
|
|
206
|
-
this.boundHandleEscapeKey = null;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Create or get an annotation overlay for a slot element.
|
|
211
|
-
* The overlay is positioned absolutely within the slot.
|
|
212
|
-
*
|
|
213
|
-
* @param slotEl The slot element to attach the overlay to
|
|
214
|
-
* @param pageIndex The page index for this slot
|
|
215
|
-
* @returns The overlay element
|
|
216
|
-
*/
|
|
217
|
-
getOrCreateOverlay(slotEl, pageIndex) {
|
|
218
|
-
let overlay = this.overlays.get(pageIndex);
|
|
219
|
-
if (overlay && overlay.parentElement === slotEl) {
|
|
220
|
-
return overlay;
|
|
221
|
-
}
|
|
222
|
-
// Create new overlay
|
|
223
|
-
overlay = document.createElement('div');
|
|
224
|
-
overlay.className = 'udoc-annotation-overlay';
|
|
225
|
-
overlay.style.cssText = `
|
|
226
|
-
position: absolute;
|
|
227
|
-
top: 0;
|
|
228
|
-
left: 0;
|
|
229
|
-
width: 100%;
|
|
230
|
-
height: 100%;
|
|
231
|
-
pointer-events: none;
|
|
232
|
-
`;
|
|
233
|
-
slotEl.appendChild(overlay);
|
|
234
|
-
this.overlays.set(pageIndex, overlay);
|
|
235
|
-
return overlay;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Render annotations for a specific page into its slot overlay.
|
|
239
|
-
*
|
|
240
|
-
* @param slotEl The slot element containing the page
|
|
241
|
-
* @param pageIndex The page index
|
|
242
|
-
*/
|
|
243
|
-
renderPageAnnotations(slotEl, pageIndex) {
|
|
244
|
-
const annotations = this.pageAnnotations.get(pageIndex);
|
|
245
|
-
if (!annotations || annotations.length === 0) {
|
|
246
|
-
// Remove overlay if no annotations
|
|
247
|
-
const existing = this.overlays.get(pageIndex);
|
|
248
|
-
if (existing) {
|
|
249
|
-
existing.remove();
|
|
250
|
-
this.overlays.delete(pageIndex);
|
|
251
|
-
}
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
const overlay = this.getOrCreateOverlay(slotEl, pageIndex);
|
|
255
|
-
overlay.innerHTML = '';
|
|
256
|
-
for (const annotation of annotations) {
|
|
257
|
-
if (!annotation.bounds)
|
|
258
|
-
continue;
|
|
259
|
-
this.renderAnnotation(overlay, annotation);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Render a single annotation using the appropriate renderer.
|
|
264
|
-
*/
|
|
265
|
-
renderAnnotation(overlay, annotation) {
|
|
266
|
-
switch (annotation.type) {
|
|
267
|
-
// Link annotations
|
|
268
|
-
case 'link':
|
|
269
|
-
this.linkRenderer.render(overlay, annotation);
|
|
270
|
-
break;
|
|
271
|
-
// Markup annotations (text highlighting)
|
|
272
|
-
case 'highlight':
|
|
273
|
-
this.markupRenderer.renderHighlight(overlay, annotation);
|
|
274
|
-
break;
|
|
275
|
-
case 'underline':
|
|
276
|
-
this.markupRenderer.renderUnderline(overlay, annotation);
|
|
277
|
-
break;
|
|
278
|
-
case 'strikeOut':
|
|
279
|
-
this.markupRenderer.renderStrikeOut(overlay, annotation);
|
|
280
|
-
break;
|
|
281
|
-
case 'squiggly':
|
|
282
|
-
this.markupRenderer.renderSquiggly(overlay, annotation);
|
|
283
|
-
break;
|
|
284
|
-
// Text annotations
|
|
285
|
-
case 'text':
|
|
286
|
-
this.textRenderer.renderText(overlay, annotation);
|
|
287
|
-
break;
|
|
288
|
-
case 'freeText':
|
|
289
|
-
this.textRenderer.renderFreeText(overlay, annotation);
|
|
290
|
-
break;
|
|
291
|
-
case 'stamp':
|
|
292
|
-
this.textRenderer.renderStamp(overlay, annotation);
|
|
293
|
-
break;
|
|
294
|
-
case 'caret':
|
|
295
|
-
this.textRenderer.renderCaret(overlay, annotation);
|
|
296
|
-
break;
|
|
297
|
-
// Shape annotations
|
|
298
|
-
case 'line':
|
|
299
|
-
this.shapeRenderer.renderLine(overlay, annotation);
|
|
300
|
-
break;
|
|
301
|
-
case 'square':
|
|
302
|
-
this.shapeRenderer.renderSquare(overlay, annotation);
|
|
303
|
-
break;
|
|
304
|
-
case 'circle':
|
|
305
|
-
this.shapeRenderer.renderCircle(overlay, annotation);
|
|
306
|
-
break;
|
|
307
|
-
case 'polygon':
|
|
308
|
-
this.shapeRenderer.renderPolygon(overlay, annotation);
|
|
309
|
-
break;
|
|
310
|
-
case 'polyLine':
|
|
311
|
-
this.shapeRenderer.renderPolyLine(overlay, annotation);
|
|
312
|
-
break;
|
|
313
|
-
case 'ink':
|
|
314
|
-
this.shapeRenderer.renderInk(overlay, annotation);
|
|
315
|
-
break;
|
|
316
|
-
case 'redact':
|
|
317
|
-
this.shapeRenderer.renderRedact(overlay, annotation);
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
//# sourceMappingURL=AnnotationLayer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotationLayer.js","sourceRoot":"","sources":["../../../src/ui/annotation/AnnotationLayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Renderer for link annotations.
|
|
3
|
-
*/
|
|
4
|
-
import type { Annotation, Destination } from '../../core/types';
|
|
5
|
-
/**
|
|
6
|
-
* Callback types for link actions.
|
|
7
|
-
*/
|
|
8
|
-
export type NavigateCallback = (destination: Destination) => void;
|
|
9
|
-
export type OpenUriCallback = (uri: string) => void;
|
|
10
|
-
/**
|
|
11
|
-
* Renders link annotations as clickable overlays.
|
|
12
|
-
*/
|
|
13
|
-
export declare class LinkRenderer {
|
|
14
|
-
private zoom;
|
|
15
|
-
private onNavigate?;
|
|
16
|
-
private onOpenUri?;
|
|
17
|
-
constructor(zoom: number, onNavigate?: NavigateCallback, onOpenUri?: OpenUriCallback);
|
|
18
|
-
setZoom(zoom: number): void;
|
|
19
|
-
setNavigateCallback(callback: NavigateCallback): void;
|
|
20
|
-
setOpenUriCallback(callback: OpenUriCallback): void;
|
|
21
|
-
/**
|
|
22
|
-
* Render a link annotation as a clickable box.
|
|
23
|
-
*/
|
|
24
|
-
render(overlay: HTMLDivElement, annotation: Annotation & {
|
|
25
|
-
type: 'link';
|
|
26
|
-
}): void;
|
|
27
|
-
/**
|
|
28
|
-
* Handle a link action (navigation or URI).
|
|
29
|
-
*/
|
|
30
|
-
private handleLinkAction;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=LinkRenderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LinkRenderer.d.ts","sourceRoot":"","sources":["../../../src/ui/annotation/LinkRenderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAG5E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpD;;GAEG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAkB;gBAGhC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,gBAAgB,EAC7B,SAAS,CAAC,EAAE,eAAe;IAO/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrD,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA4BhF;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAkB3B"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { scaleBounds } from './utils';
|
|
2
|
-
/**
|
|
3
|
-
* Renders link annotations as clickable overlays.
|
|
4
|
-
*/
|
|
5
|
-
export class LinkRenderer {
|
|
6
|
-
zoom;
|
|
7
|
-
onNavigate;
|
|
8
|
-
onOpenUri;
|
|
9
|
-
constructor(zoom, onNavigate, onOpenUri) {
|
|
10
|
-
this.zoom = zoom;
|
|
11
|
-
this.onNavigate = onNavigate;
|
|
12
|
-
this.onOpenUri = onOpenUri;
|
|
13
|
-
}
|
|
14
|
-
setZoom(zoom) {
|
|
15
|
-
this.zoom = zoom;
|
|
16
|
-
}
|
|
17
|
-
setNavigateCallback(callback) {
|
|
18
|
-
this.onNavigate = callback;
|
|
19
|
-
}
|
|
20
|
-
setOpenUriCallback(callback) {
|
|
21
|
-
this.onOpenUri = callback;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Render a link annotation as a clickable box.
|
|
25
|
-
*/
|
|
26
|
-
render(overlay, annotation) {
|
|
27
|
-
if (!annotation.bounds)
|
|
28
|
-
return;
|
|
29
|
-
const scaled = scaleBounds(annotation.bounds, this.zoom);
|
|
30
|
-
const box = document.createElement('div');
|
|
31
|
-
box.className = 'udoc-annotation-box udoc-annotation-link';
|
|
32
|
-
box.style.cssText = `
|
|
33
|
-
position: absolute;
|
|
34
|
-
left: ${scaled.x}px;
|
|
35
|
-
top: ${scaled.y}px;
|
|
36
|
-
width: ${scaled.width}px;
|
|
37
|
-
height: ${scaled.height}px;
|
|
38
|
-
pointer-events: auto;
|
|
39
|
-
cursor: pointer;
|
|
40
|
-
`;
|
|
41
|
-
box.addEventListener('click', (e) => {
|
|
42
|
-
e.preventDefault();
|
|
43
|
-
e.stopPropagation();
|
|
44
|
-
if (annotation.action) {
|
|
45
|
-
this.handleLinkAction(annotation.action);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
overlay.appendChild(box);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Handle a link action (navigation or URI).
|
|
52
|
-
*/
|
|
53
|
-
handleLinkAction(action) {
|
|
54
|
-
if (action.actionType === 'goTo') {
|
|
55
|
-
if (this.onNavigate) {
|
|
56
|
-
this.onNavigate(action.destination);
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else if (action.actionType === 'uri') {
|
|
61
|
-
if (this.onOpenUri) {
|
|
62
|
-
this.onOpenUri(action.uri);
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
// Default behavior: open in new tab
|
|
67
|
-
window.open(action.uri, '_blank', 'noopener,noreferrer');
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=LinkRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LinkRenderer.js","sourceRoot":"","sources":["../../../src/ui/annotation/LinkRenderer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC;;GAEG;AACH,MAAM,OAAO,YAAY;IACb,IAAI,CAAS;IACb,UAAU,CAAoB;IAC9B,SAAS,CAAmB;IAEpC,YACI,IAAY,EACZ,UAA6B,EAC7B,SAA2B;QAE3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,mBAAmB,CAAC,QAA0B;QAC1C,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAED,kBAAkB,CAAC,QAAyB;QACxC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAuB,EAAE,UAAyC;QACrE,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO;QAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,SAAS,GAAG,0CAA0C,CAAC;QAC3D,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG;;oBAER,MAAM,CAAC,CAAC;mBACT,MAAM,CAAC,CAAC;qBACN,MAAM,CAAC,KAAK;sBACX,MAAM,CAAC,MAAM;;;SAG1B,CAAC;QAEF,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAChC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,MAAkB;QACvC,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACJ,oCAAoC;gBACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Renderer for text markup annotations: highlight, underline, strikeout, squiggly.
|
|
3
|
-
*/
|
|
4
|
-
import type { HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, SquigglyAnnotation, MarkupMetadata } from '../../core/types';
|
|
5
|
-
export type MarkupAnnotation = HighlightAnnotation | UnderlineAnnotation | StrikeOutAnnotation | SquigglyAnnotation;
|
|
6
|
-
/**
|
|
7
|
-
* Callback type for showing popup with annotation metadata.
|
|
8
|
-
*/
|
|
9
|
-
export type ShowPopupCallback = (anchor: HTMLElement, metadata: MarkupMetadata, color: string) => void;
|
|
10
|
-
/**
|
|
11
|
-
* Renders text markup annotations (highlight, underline, strikeout, squiggly).
|
|
12
|
-
*/
|
|
13
|
-
export declare class MarkupRenderer {
|
|
14
|
-
private zoom;
|
|
15
|
-
private onShowPopup?;
|
|
16
|
-
constructor(zoom: number, onShowPopup?: ShowPopupCallback);
|
|
17
|
-
setZoom(zoom: number): void;
|
|
18
|
-
setShowPopupCallback(callback: ShowPopupCallback): void;
|
|
19
|
-
/**
|
|
20
|
-
* Render a highlight annotation as a colored overlay.
|
|
21
|
-
*/
|
|
22
|
-
renderHighlight(overlay: HTMLDivElement, annotation: HighlightAnnotation): void;
|
|
23
|
-
/**
|
|
24
|
-
* Render an underline annotation as lines along the bottom of text.
|
|
25
|
-
*/
|
|
26
|
-
renderUnderline(overlay: HTMLDivElement, annotation: UnderlineAnnotation): void;
|
|
27
|
-
/**
|
|
28
|
-
* Render a strikeout annotation as lines through the middle of text.
|
|
29
|
-
*/
|
|
30
|
-
renderStrikeOut(overlay: HTMLDivElement, annotation: StrikeOutAnnotation): void;
|
|
31
|
-
/**
|
|
32
|
-
* Render a squiggly annotation as wavy lines under text.
|
|
33
|
-
*/
|
|
34
|
-
renderSquiggly(overlay: HTMLDivElement, annotation: SquigglyAnnotation): void;
|
|
35
|
-
/**
|
|
36
|
-
* Add a clickable overlay for text markup annotations when metadata exists.
|
|
37
|
-
*/
|
|
38
|
-
private addTextMarkupClickHandler;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=MarkupRenderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkupRenderer.d.ts","sourceRoot":"","sources":["../../../src/ui/annotation/MarkupRenderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACR,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACjB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,gBAAgB,GACtB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,CAAC;AAEzB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC5B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,KACZ,IAAI,CAAC;AAEV;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAC,CAAoB;gBAE5B,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,iBAAiB;IAKzD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI;IAqB/E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI;IAwB/E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI;IA2B/E;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI;IA8C7E;;OAEG;IACH,OAAO,CAAC,yBAAyB;CA8BpC"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { colorToRgb, scaleQuadPoints, createSvgOverlay, scaleBounds } from './utils';
|
|
2
|
-
/**
|
|
3
|
-
* Renders text markup annotations (highlight, underline, strikeout, squiggly).
|
|
4
|
-
*/
|
|
5
|
-
export class MarkupRenderer {
|
|
6
|
-
zoom;
|
|
7
|
-
onShowPopup;
|
|
8
|
-
constructor(zoom, onShowPopup) {
|
|
9
|
-
this.zoom = zoom;
|
|
10
|
-
this.onShowPopup = onShowPopup;
|
|
11
|
-
}
|
|
12
|
-
setZoom(zoom) {
|
|
13
|
-
this.zoom = zoom;
|
|
14
|
-
}
|
|
15
|
-
setShowPopupCallback(callback) {
|
|
16
|
-
this.onShowPopup = callback;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Render a highlight annotation as a colored overlay.
|
|
20
|
-
*/
|
|
21
|
-
renderHighlight(overlay, annotation) {
|
|
22
|
-
const svg = createSvgOverlay();
|
|
23
|
-
const color = colorToRgb(annotation.color, 'rgb(255, 255, 0)'); // Default yellow
|
|
24
|
-
const opacity = annotation.opacity ?? 0.4;
|
|
25
|
-
for (const quad of annotation.quads) {
|
|
26
|
-
const scaledPoints = scaleQuadPoints(quad.points, this.zoom);
|
|
27
|
-
const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
|
|
28
|
-
polygon.setAttribute('points', scaledPoints.map((p) => `${p.x},${p.y}`).join(' '));
|
|
29
|
-
polygon.setAttribute('fill', color);
|
|
30
|
-
polygon.setAttribute('fill-opacity', String(opacity));
|
|
31
|
-
polygon.setAttribute('style', 'mix-blend-mode: multiply;');
|
|
32
|
-
svg.appendChild(polygon);
|
|
33
|
-
}
|
|
34
|
-
overlay.appendChild(svg);
|
|
35
|
-
// Add clickable overlay when metadata exists
|
|
36
|
-
this.addTextMarkupClickHandler(overlay, annotation, color);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Render an underline annotation as lines along the bottom of text.
|
|
40
|
-
*/
|
|
41
|
-
renderUnderline(overlay, annotation) {
|
|
42
|
-
const svg = createSvgOverlay();
|
|
43
|
-
const color = colorToRgb(annotation.color, 'rgb(0, 128, 0)'); // Default green
|
|
44
|
-
const strokeWidth = Math.max(1, 1 * this.zoom);
|
|
45
|
-
for (const quad of annotation.quads) {
|
|
46
|
-
const scaledPoints = scaleQuadPoints(quad.points, this.zoom);
|
|
47
|
-
// Draw line along bottom edge (from bottom-left to bottom-right)
|
|
48
|
-
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
|
|
49
|
-
line.setAttribute('x1', String(scaledPoints[0].x));
|
|
50
|
-
line.setAttribute('y1', String(scaledPoints[0].y));
|
|
51
|
-
line.setAttribute('x2', String(scaledPoints[1].x));
|
|
52
|
-
line.setAttribute('y2', String(scaledPoints[1].y));
|
|
53
|
-
line.setAttribute('stroke', color);
|
|
54
|
-
line.setAttribute('stroke-width', String(strokeWidth));
|
|
55
|
-
svg.appendChild(line);
|
|
56
|
-
}
|
|
57
|
-
overlay.appendChild(svg);
|
|
58
|
-
// Add clickable overlay when metadata exists
|
|
59
|
-
this.addTextMarkupClickHandler(overlay, annotation, color);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Render a strikeout annotation as lines through the middle of text.
|
|
63
|
-
*/
|
|
64
|
-
renderStrikeOut(overlay, annotation) {
|
|
65
|
-
const svg = createSvgOverlay();
|
|
66
|
-
const color = colorToRgb(annotation.color, 'rgb(255, 0, 0)'); // Default red
|
|
67
|
-
const strokeWidth = Math.max(1, 1 * this.zoom);
|
|
68
|
-
for (const quad of annotation.quads) {
|
|
69
|
-
const scaledPoints = scaleQuadPoints(quad.points, this.zoom);
|
|
70
|
-
// Calculate middle Y between top and bottom
|
|
71
|
-
const midLeftY = (scaledPoints[0].y + scaledPoints[3].y) / 2;
|
|
72
|
-
const midRightY = (scaledPoints[1].y + scaledPoints[2].y) / 2;
|
|
73
|
-
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
|
|
74
|
-
line.setAttribute('x1', String(scaledPoints[0].x));
|
|
75
|
-
line.setAttribute('y1', String(midLeftY));
|
|
76
|
-
line.setAttribute('x2', String(scaledPoints[1].x));
|
|
77
|
-
line.setAttribute('y2', String(midRightY));
|
|
78
|
-
line.setAttribute('stroke', color);
|
|
79
|
-
line.setAttribute('stroke-width', String(strokeWidth));
|
|
80
|
-
svg.appendChild(line);
|
|
81
|
-
}
|
|
82
|
-
overlay.appendChild(svg);
|
|
83
|
-
// Add clickable overlay when metadata exists
|
|
84
|
-
this.addTextMarkupClickHandler(overlay, annotation, color);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Render a squiggly annotation as wavy lines under text.
|
|
88
|
-
*/
|
|
89
|
-
renderSquiggly(overlay, annotation) {
|
|
90
|
-
const svg = createSvgOverlay();
|
|
91
|
-
const color = colorToRgb(annotation.color, 'rgb(255, 0, 0)'); // Default red
|
|
92
|
-
const strokeWidth = Math.max(1, 1 * this.zoom);
|
|
93
|
-
const wavelength = 4 * this.zoom;
|
|
94
|
-
const amplitude = 2 * this.zoom;
|
|
95
|
-
for (const quad of annotation.quads) {
|
|
96
|
-
const scaledPoints = scaleQuadPoints(quad.points, this.zoom);
|
|
97
|
-
const startX = scaledPoints[0].x;
|
|
98
|
-
const endX = scaledPoints[1].x;
|
|
99
|
-
const startY = scaledPoints[0].y;
|
|
100
|
-
const endY = scaledPoints[1].y;
|
|
101
|
-
// Generate wavy path
|
|
102
|
-
let path = `M ${startX} ${startY}`;
|
|
103
|
-
const totalLength = Math.sqrt((endX - startX) ** 2 + (endY - startY) ** 2);
|
|
104
|
-
const steps = Math.ceil(totalLength / wavelength);
|
|
105
|
-
for (let i = 0; i < steps; i++) {
|
|
106
|
-
const t1 = (i + 0.5) / steps;
|
|
107
|
-
const t2 = (i + 1) / steps;
|
|
108
|
-
const midX = startX + (endX - startX) * t1;
|
|
109
|
-
const midY = startY + (endY - startY) * t1;
|
|
110
|
-
const nextX = startX + (endX - startX) * t2;
|
|
111
|
-
const nextY = startY + (endY - startY) * t2;
|
|
112
|
-
// Alternate up and down
|
|
113
|
-
const direction = i % 2 === 0 ? -1 : 1;
|
|
114
|
-
path += ` Q ${midX} ${midY + amplitude * direction}, ${nextX} ${nextY}`;
|
|
115
|
-
}
|
|
116
|
-
const pathEl = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
117
|
-
pathEl.setAttribute('d', path);
|
|
118
|
-
pathEl.setAttribute('stroke', color);
|
|
119
|
-
pathEl.setAttribute('stroke-width', String(strokeWidth));
|
|
120
|
-
pathEl.setAttribute('fill', 'none');
|
|
121
|
-
svg.appendChild(pathEl);
|
|
122
|
-
}
|
|
123
|
-
overlay.appendChild(svg);
|
|
124
|
-
// Add clickable overlay when metadata exists
|
|
125
|
-
this.addTextMarkupClickHandler(overlay, annotation, color);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add a clickable overlay for text markup annotations when metadata exists.
|
|
129
|
-
*/
|
|
130
|
-
addTextMarkupClickHandler(overlay, annotation, color) {
|
|
131
|
-
if (!annotation.metadata || !this.onShowPopup)
|
|
132
|
-
return;
|
|
133
|
-
const scaled = scaleBounds(annotation.bounds, this.zoom);
|
|
134
|
-
const clickArea = document.createElement('div');
|
|
135
|
-
clickArea.className = 'udoc-annotation-click-area';
|
|
136
|
-
clickArea.style.cssText = `
|
|
137
|
-
position: absolute;
|
|
138
|
-
left: ${scaled.x}px;
|
|
139
|
-
top: ${scaled.y}px;
|
|
140
|
-
width: ${scaled.width}px;
|
|
141
|
-
height: ${scaled.height}px;
|
|
142
|
-
pointer-events: auto;
|
|
143
|
-
cursor: pointer;
|
|
144
|
-
`;
|
|
145
|
-
const showPopup = this.onShowPopup;
|
|
146
|
-
const metadata = annotation.metadata;
|
|
147
|
-
clickArea.addEventListener('click', (e) => {
|
|
148
|
-
e.stopPropagation();
|
|
149
|
-
showPopup(clickArea, metadata, color);
|
|
150
|
-
});
|
|
151
|
-
overlay.appendChild(clickArea);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=MarkupRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkupRenderer.js","sourceRoot":"","sources":["../../../src/ui/annotation/MarkupRenderer.ts"],"names":[],"mappings":"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"}
|