@docmentis/udoc-viewer 0.6.21 → 0.6.23

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.
Files changed (142) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/UDocClient.d.ts +22 -0
  3. package/dist/src/UDocClient.d.ts.map +1 -1
  4. package/dist/src/UDocClient.js +25 -1
  5. package/dist/src/UDocClient.js.map +1 -1
  6. package/dist/src/UDocViewer.d.ts +4 -3
  7. package/dist/src/UDocViewer.d.ts.map +1 -1
  8. package/dist/src/UDocViewer.js +50 -3
  9. package/dist/src/UDocViewer.js.map +1 -1
  10. package/dist/src/ui/viewer/actions.d.ts +34 -3
  11. package/dist/src/ui/viewer/actions.d.ts.map +1 -1
  12. package/dist/src/ui/viewer/annotation/ShapeRenderer.d.ts.map +1 -1
  13. package/dist/src/ui/viewer/annotation/ShapeRenderer.js +23 -16
  14. package/dist/src/ui/viewer/annotation/ShapeRenderer.js.map +1 -1
  15. package/dist/src/ui/viewer/annotation/index.d.ts +1 -1
  16. package/dist/src/ui/viewer/annotation/index.d.ts.map +1 -1
  17. package/dist/src/ui/viewer/annotation/index.js +1 -1
  18. package/dist/src/ui/viewer/annotation/index.js.map +1 -1
  19. package/dist/src/ui/viewer/annotation/render.d.ts.map +1 -1
  20. package/dist/src/ui/viewer/annotation/render.js +11 -4
  21. package/dist/src/ui/viewer/annotation/render.js.map +1 -1
  22. package/dist/src/ui/viewer/annotation/types.d.ts +9 -1
  23. package/dist/src/ui/viewer/annotation/types.d.ts.map +1 -1
  24. package/dist/src/ui/viewer/annotation/utils.d.ts +10 -1
  25. package/dist/src/ui/viewer/annotation/utils.d.ts.map +1 -1
  26. package/dist/src/ui/viewer/annotation/utils.js +114 -0
  27. package/dist/src/ui/viewer/annotation/utils.js.map +1 -1
  28. package/dist/src/ui/viewer/components/ColorSelect.d.ts +26 -0
  29. package/dist/src/ui/viewer/components/ColorSelect.d.ts.map +1 -0
  30. package/dist/src/ui/viewer/components/ColorSelect.js +120 -0
  31. package/dist/src/ui/viewer/components/ColorSelect.js.map +1 -0
  32. package/dist/src/ui/viewer/components/FloatingToolbar.js +12 -12
  33. package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -1
  34. package/dist/src/ui/viewer/components/NumberInput.d.ts +32 -0
  35. package/dist/src/ui/viewer/components/NumberInput.d.ts.map +1 -0
  36. package/dist/src/ui/viewer/components/NumberInput.js +101 -0
  37. package/dist/src/ui/viewer/components/NumberInput.js.map +1 -0
  38. package/dist/src/ui/viewer/components/Spread.d.ts +2 -2
  39. package/dist/src/ui/viewer/components/Spread.d.ts.map +1 -1
  40. package/dist/src/ui/viewer/components/Spread.js.map +1 -1
  41. package/dist/src/ui/viewer/components/SubToolbar.d.ts +10 -0
  42. package/dist/src/ui/viewer/components/SubToolbar.d.ts.map +1 -0
  43. package/dist/src/ui/viewer/components/SubToolbar.js +481 -0
  44. package/dist/src/ui/viewer/components/SubToolbar.js.map +1 -0
  45. package/dist/src/ui/viewer/components/Toolbar.d.ts.map +1 -1
  46. package/dist/src/ui/viewer/components/Toolbar.js +147 -4
  47. package/dist/src/ui/viewer/components/Toolbar.js.map +1 -1
  48. package/dist/src/ui/viewer/components/ViewModeMenu.js +3 -3
  49. package/dist/src/ui/viewer/components/ViewModeMenu.js.map +1 -1
  50. package/dist/src/ui/viewer/components/Viewport.d.ts.map +1 -1
  51. package/dist/src/ui/viewer/components/Viewport.js +40 -2
  52. package/dist/src/ui/viewer/components/Viewport.js.map +1 -1
  53. package/dist/src/ui/viewer/i18n/ar.d.ts.map +1 -1
  54. package/dist/src/ui/viewer/i18n/ar.js +40 -0
  55. package/dist/src/ui/viewer/i18n/ar.js.map +1 -1
  56. package/dist/src/ui/viewer/i18n/de.d.ts.map +1 -1
  57. package/dist/src/ui/viewer/i18n/de.js +40 -0
  58. package/dist/src/ui/viewer/i18n/de.js.map +1 -1
  59. package/dist/src/ui/viewer/i18n/en.d.ts.map +1 -1
  60. package/dist/src/ui/viewer/i18n/en.js +40 -0
  61. package/dist/src/ui/viewer/i18n/en.js.map +1 -1
  62. package/dist/src/ui/viewer/i18n/es.d.ts.map +1 -1
  63. package/dist/src/ui/viewer/i18n/es.js +40 -0
  64. package/dist/src/ui/viewer/i18n/es.js.map +1 -1
  65. package/dist/src/ui/viewer/i18n/fr.d.ts.map +1 -1
  66. package/dist/src/ui/viewer/i18n/fr.js +40 -0
  67. package/dist/src/ui/viewer/i18n/fr.js.map +1 -1
  68. package/dist/src/ui/viewer/i18n/ja.d.ts.map +1 -1
  69. package/dist/src/ui/viewer/i18n/ja.js +40 -0
  70. package/dist/src/ui/viewer/i18n/ja.js.map +1 -1
  71. package/dist/src/ui/viewer/i18n/ko.d.ts.map +1 -1
  72. package/dist/src/ui/viewer/i18n/ko.js +40 -0
  73. package/dist/src/ui/viewer/i18n/ko.js.map +1 -1
  74. package/dist/src/ui/viewer/i18n/pt-BR.d.ts.map +1 -1
  75. package/dist/src/ui/viewer/i18n/pt-BR.js +40 -0
  76. package/dist/src/ui/viewer/i18n/pt-BR.js.map +1 -1
  77. package/dist/src/ui/viewer/i18n/ru.d.ts.map +1 -1
  78. package/dist/src/ui/viewer/i18n/ru.js +40 -0
  79. package/dist/src/ui/viewer/i18n/ru.js.map +1 -1
  80. package/dist/src/ui/viewer/i18n/types.d.ts +35 -0
  81. package/dist/src/ui/viewer/i18n/types.d.ts.map +1 -1
  82. package/dist/src/ui/viewer/i18n/zh-CN.d.ts.map +1 -1
  83. package/dist/src/ui/viewer/i18n/zh-CN.js +40 -0
  84. package/dist/src/ui/viewer/i18n/zh-CN.js.map +1 -1
  85. package/dist/src/ui/viewer/i18n/zh-TW.d.ts.map +1 -1
  86. package/dist/src/ui/viewer/i18n/zh-TW.js +40 -0
  87. package/dist/src/ui/viewer/i18n/zh-TW.js.map +1 -1
  88. package/dist/src/ui/viewer/icons.d.ts +29 -0
  89. package/dist/src/ui/viewer/icons.d.ts.map +1 -1
  90. package/dist/src/ui/viewer/icons.js +42 -0
  91. package/dist/src/ui/viewer/icons.js.map +1 -1
  92. package/dist/src/ui/viewer/reducer.d.ts.map +1 -1
  93. package/dist/src/ui/viewer/reducer.js +109 -1
  94. package/dist/src/ui/viewer/reducer.js.map +1 -1
  95. package/dist/src/ui/viewer/search/search.d.ts +4 -4
  96. package/dist/src/ui/viewer/search/search.d.ts.map +1 -1
  97. package/dist/src/ui/viewer/search/search.js +1 -1
  98. package/dist/src/ui/viewer/search/search.js.map +1 -1
  99. package/dist/src/ui/viewer/shell.d.ts +2 -2
  100. package/dist/src/ui/viewer/shell.d.ts.map +1 -1
  101. package/dist/src/ui/viewer/shell.js +13 -2
  102. package/dist/src/ui/viewer/shell.js.map +1 -1
  103. package/dist/src/ui/viewer/state.d.ts +55 -2
  104. package/dist/src/ui/viewer/state.d.ts.map +1 -1
  105. package/dist/src/ui/viewer/state.js +30 -0
  106. package/dist/src/ui/viewer/state.js.map +1 -1
  107. package/dist/src/ui/viewer/styles-inline.d.ts +1 -1
  108. package/dist/src/ui/viewer/styles-inline.d.ts.map +1 -1
  109. package/dist/src/ui/viewer/styles-inline.js +875 -246
  110. package/dist/src/ui/viewer/styles-inline.js.map +1 -1
  111. package/dist/src/ui/viewer/text/render.d.ts +3 -3
  112. package/dist/src/ui/viewer/text/render.d.ts.map +1 -1
  113. package/dist/src/ui/viewer/text/render.js +2 -2
  114. package/dist/src/ui/viewer/text/render.js.map +1 -1
  115. package/dist/src/ui/viewer/tools/AnnotationDrawController.d.ts +21 -0
  116. package/dist/src/ui/viewer/tools/AnnotationDrawController.d.ts.map +1 -0
  117. package/dist/src/ui/viewer/tools/AnnotationDrawController.js +392 -0
  118. package/dist/src/ui/viewer/tools/AnnotationDrawController.js.map +1 -0
  119. package/dist/src/ui/viewer/tools/AnnotationSelectController.d.ts +22 -0
  120. package/dist/src/ui/viewer/tools/AnnotationSelectController.d.ts.map +1 -0
  121. package/dist/src/ui/viewer/tools/AnnotationSelectController.js +367 -0
  122. package/dist/src/ui/viewer/tools/AnnotationSelectController.js.map +1 -0
  123. package/dist/src/ui/viewer/tools/ViewToolController.d.ts +20 -0
  124. package/dist/src/ui/viewer/tools/ViewToolController.d.ts.map +1 -0
  125. package/dist/src/ui/viewer/tools/ViewToolController.js +194 -0
  126. package/dist/src/ui/viewer/tools/ViewToolController.js.map +1 -0
  127. package/dist/src/wasm/udoc.d.ts +399 -114
  128. package/dist/src/wasm/udoc.js +157 -81
  129. package/dist/src/wasm/udoc_bg.wasm +0 -0
  130. package/dist/src/wasm/udoc_bg.wasm.d.ts +8 -7
  131. package/dist/src/worker/WorkerClient.d.ts +17 -11
  132. package/dist/src/worker/WorkerClient.d.ts.map +1 -1
  133. package/dist/src/worker/WorkerClient.js +10 -2
  134. package/dist/src/worker/WorkerClient.js.map +1 -1
  135. package/dist/src/worker/index.d.ts +1 -1
  136. package/dist/src/worker/index.d.ts.map +1 -1
  137. package/dist/src/worker/worker-inline.js +1 -1
  138. package/dist/src/worker/worker.d.ts +26 -58
  139. package/dist/src/worker/worker.d.ts.map +1 -1
  140. package/dist/src/worker/worker.js +161 -80
  141. package/dist/src/worker/worker.js.map +1 -1
  142. package/package.json +1 -1
@@ -0,0 +1,367 @@
1
+ /**
2
+ * AnnotationSelectController — handles annotation selection, move, resize, and deletion.
3
+ *
4
+ * When the "select" sub-tool is active (in either annotate or markup tool sets):
5
+ * - Clicking an annotation selects it, showing a bounding box with resize handles.
6
+ * - Dragging the bounding box moves the annotation.
7
+ * - Dragging a resize handle resizes the annotation.
8
+ * - Pressing Delete/Backspace removes the selected annotation.
9
+ * - Clicking empty space deselects.
10
+ */
11
+ import { getPointsToPixels, isToolSet, ANNOTATION_FORMATS } from "../state";
12
+ import { offsetAnnotation, resizeAnnotation } from "../annotation/utils";
13
+ const SELECT_CURSOR_CLASS = "udoc-viewer--tool-select";
14
+ const MOVING_CLASS = "udoc-viewer--annotation-moving";
15
+ const RESIZING_CLASS = "udoc-viewer--annotation-resizing";
16
+ const BBOX_CLASS = "udoc-annotation-select-bbox";
17
+ const HANDLE_POSITIONS = ["nw", "n", "ne", "e", "se", "s", "sw", "w"];
18
+ const HANDLE_CURSORS = {
19
+ nw: "nwse-resize",
20
+ n: "ns-resize",
21
+ ne: "nesw-resize",
22
+ e: "ew-resize",
23
+ se: "nwse-resize",
24
+ s: "ns-resize",
25
+ sw: "nesw-resize",
26
+ w: "ew-resize",
27
+ };
28
+ export function createAnnotationSelectController(options) {
29
+ const { scrollArea, viewerRoot, store } = options;
30
+ let active = false;
31
+ let bboxEl = null;
32
+ let innerEl = null;
33
+ let isDragging = false;
34
+ let dragMode = "move";
35
+ let dragScale = 1;
36
+ let dragStartX = 0;
37
+ let dragStartY = 0;
38
+ let dragDx = 0;
39
+ let dragDy = 0;
40
+ let dragAnnotationPageIndex = -1;
41
+ let dragAnnotationIndex = -1;
42
+ /** Original bounds at drag start (for resize) */
43
+ let dragOriginalBounds = { x: 0, y: 0, width: 0, height: 0 };
44
+ /** Which handle is being dragged (for resize) */
45
+ let dragHandle = "se";
46
+ // =========================================================================
47
+ // Bounding box with handles
48
+ // =========================================================================
49
+ function removeBbox() {
50
+ if (bboxEl) {
51
+ bboxEl.remove();
52
+ bboxEl = null;
53
+ innerEl = null;
54
+ }
55
+ }
56
+ function updateSelectionVisual() {
57
+ removeBbox();
58
+ const state = store.getState();
59
+ const sel = state.selectedAnnotation;
60
+ if (!sel)
61
+ return;
62
+ const annotations = state.pageAnnotations.get(sel.pageIndex);
63
+ if (!annotations || sel.annotationIndex >= annotations.length)
64
+ return;
65
+ const annotation = annotations[sel.annotationIndex];
66
+ const bounds = annotation.bounds;
67
+ if (!bounds || (bounds.width === 0 && bounds.height === 0))
68
+ return;
69
+ const pageNum = sel.pageIndex + 1;
70
+ const slot = scrollArea.querySelector(`[data-page="${pageNum}"]`);
71
+ if (!slot)
72
+ return;
73
+ const annotationLayer = slot.querySelector(".udoc-spread__annotation-layer");
74
+ if (!annotationLayer)
75
+ return;
76
+ const pointsToPixels = getPointsToPixels(state.dpi);
77
+ const zoom = state.effectiveZoom ?? state.zoom;
78
+ const scale = pointsToPixels * zoom;
79
+ // Outer wrapper — copies annotation layer positioning
80
+ bboxEl = document.createElement("div");
81
+ bboxEl.className = BBOX_CLASS;
82
+ bboxEl.style.position = "absolute";
83
+ bboxEl.style.width = annotationLayer.style.width;
84
+ bboxEl.style.height = annotationLayer.style.height;
85
+ bboxEl.style.left = annotationLayer.style.left;
86
+ bboxEl.style.top = annotationLayer.style.top;
87
+ bboxEl.style.transform = annotationLayer.style.transform;
88
+ bboxEl.style.transformOrigin = "center";
89
+ // Inner — the actual bounding rectangle
90
+ innerEl = document.createElement("div");
91
+ innerEl.className = BBOX_CLASS + "__inner";
92
+ innerEl.style.position = "absolute";
93
+ innerEl.style.left = `${bounds.x * scale}px`;
94
+ innerEl.style.top = `${bounds.y * scale}px`;
95
+ innerEl.style.width = `${bounds.width * scale}px`;
96
+ innerEl.style.height = `${bounds.height * scale}px`;
97
+ // Resize handles
98
+ for (const pos of HANDLE_POSITIONS) {
99
+ const handle = document.createElement("div");
100
+ handle.className = `${BBOX_CLASS}__handle ${BBOX_CLASS}__handle--${pos}`;
101
+ handle.style.cursor = HANDLE_CURSORS[pos];
102
+ handle.dataset.handle = pos;
103
+ innerEl.appendChild(handle);
104
+ }
105
+ bboxEl.appendChild(innerEl);
106
+ slot.appendChild(bboxEl);
107
+ }
108
+ /** Update inner element position/size during drag preview. */
109
+ function updateInnerPreview(bounds, newBounds) {
110
+ if (!innerEl)
111
+ return;
112
+ innerEl.style.left = `${newBounds.x * dragScale}px`;
113
+ innerEl.style.top = `${newBounds.y * dragScale}px`;
114
+ innerEl.style.width = `${newBounds.width * dragScale}px`;
115
+ innerEl.style.height = `${newBounds.height * dragScale}px`;
116
+ }
117
+ // =========================================================================
118
+ // Resize bounds computation
119
+ // =========================================================================
120
+ /** Compute new bounds from dragging a resize handle. */
121
+ function computeResizedBounds(original, handle, dx, dy) {
122
+ let { x, y, width, height } = original;
123
+ // Adjust edges based on handle
124
+ if (handle.includes("w")) {
125
+ x += dx;
126
+ width -= dx;
127
+ }
128
+ if (handle.includes("e") || handle === "e") {
129
+ width += dx;
130
+ }
131
+ if (handle.includes("n") && handle !== "ne" && handle !== "nw") {
132
+ // "n" only
133
+ y += dy;
134
+ height -= dy;
135
+ }
136
+ if (handle === "nw" || handle === "n" || handle === "ne") {
137
+ y += dy;
138
+ height -= dy;
139
+ }
140
+ if (handle === "sw" || handle === "s" || handle === "se") {
141
+ height += dy;
142
+ }
143
+ // Enforce minimum size and flip if dragged past opposite edge
144
+ const MIN = 2;
145
+ if (width < MIN) {
146
+ x = x + width - MIN;
147
+ width = MIN;
148
+ }
149
+ if (height < MIN) {
150
+ y = y + height - MIN;
151
+ height = MIN;
152
+ }
153
+ return { x, y, width, height };
154
+ }
155
+ // =========================================================================
156
+ // Pointer events
157
+ // =========================================================================
158
+ function onPointerDown(e) {
159
+ if (e.button !== 0)
160
+ return;
161
+ const target = e.target;
162
+ // Check if clicking a resize handle
163
+ const handleEl = target.closest(`[data-handle]`);
164
+ if (handleEl && bboxEl?.contains(handleEl)) {
165
+ const sel = store.getState().selectedAnnotation;
166
+ if (sel) {
167
+ const slotEl = bboxEl.closest("[data-page]");
168
+ if (slotEl) {
169
+ startDrag(e, sel.pageIndex, sel.annotationIndex, "resize", handleEl.dataset.handle);
170
+ return;
171
+ }
172
+ }
173
+ }
174
+ // Check if clicking on an annotation
175
+ const annotationEl = target.closest("[data-annotation-index]");
176
+ if (annotationEl) {
177
+ const slotEl = annotationEl.closest("[data-page]");
178
+ if (!slotEl)
179
+ return;
180
+ const pageNum = parseInt(slotEl.dataset.page, 10);
181
+ if (isNaN(pageNum))
182
+ return;
183
+ const annotationIndex = parseInt(annotationEl.getAttribute("data-annotation-index"), 10);
184
+ if (isNaN(annotationIndex))
185
+ return;
186
+ const pageIndex = pageNum - 1;
187
+ const sel = store.getState().selectedAnnotation;
188
+ if (sel && sel.pageIndex === pageIndex && sel.annotationIndex === annotationIndex) {
189
+ startDrag(e, pageIndex, annotationIndex, "move");
190
+ return;
191
+ }
192
+ store.dispatch({ type: "SELECT_ANNOTATION", pageIndex, annotationIndex });
193
+ e.preventDefault();
194
+ e.stopPropagation();
195
+ return;
196
+ }
197
+ // Check if clicking on the bbox inner (for move)
198
+ if (innerEl && (target === innerEl || innerEl.contains(target))) {
199
+ const sel = store.getState().selectedAnnotation;
200
+ if (sel) {
201
+ startDrag(e, sel.pageIndex, sel.annotationIndex, "move");
202
+ return;
203
+ }
204
+ }
205
+ // Clicked outside — deselect
206
+ store.dispatch({ type: "DESELECT_ANNOTATION" });
207
+ }
208
+ function startDrag(e, pageIndex, annotationIndex, mode, handle) {
209
+ const state = store.getState();
210
+ const pointsToPixels = getPointsToPixels(state.dpi);
211
+ const zoom = state.effectiveZoom ?? state.zoom;
212
+ const annotations = state.pageAnnotations.get(pageIndex);
213
+ if (!annotations || annotationIndex >= annotations.length)
214
+ return;
215
+ isDragging = true;
216
+ dragMode = mode;
217
+ dragScale = pointsToPixels * zoom;
218
+ dragStartX = e.clientX;
219
+ dragStartY = e.clientY;
220
+ dragDx = 0;
221
+ dragDy = 0;
222
+ dragAnnotationPageIndex = pageIndex;
223
+ dragAnnotationIndex = annotationIndex;
224
+ dragOriginalBounds = { ...annotations[annotationIndex].bounds };
225
+ dragHandle = handle ?? "se";
226
+ viewerRoot.classList.add(mode === "move" ? MOVING_CLASS : RESIZING_CLASS);
227
+ if (mode === "resize") {
228
+ viewerRoot.style.cursor = HANDLE_CURSORS[dragHandle];
229
+ }
230
+ scrollArea.setPointerCapture(e.pointerId);
231
+ e.preventDefault();
232
+ e.stopPropagation();
233
+ }
234
+ function onPointerMove(e) {
235
+ if (!isDragging)
236
+ return;
237
+ const pxDx = e.clientX - dragStartX;
238
+ const pxDy = e.clientY - dragStartY;
239
+ dragDx = pxDx / dragScale;
240
+ dragDy = pxDy / dragScale;
241
+ if (dragMode === "move") {
242
+ if (innerEl) {
243
+ const b = dragOriginalBounds;
244
+ updateInnerPreview(b, { x: b.x + dragDx, y: b.y + dragDy, width: b.width, height: b.height });
245
+ }
246
+ }
247
+ else {
248
+ // Resize preview
249
+ const newBounds = computeResizedBounds(dragOriginalBounds, dragHandle, dragDx, dragDy);
250
+ updateInnerPreview(dragOriginalBounds, newBounds);
251
+ }
252
+ }
253
+ function onPointerUp(e) {
254
+ if (!isDragging)
255
+ return;
256
+ scrollArea.releasePointerCapture(e.pointerId);
257
+ viewerRoot.classList.remove(MOVING_CLASS);
258
+ viewerRoot.classList.remove(RESIZING_CLASS);
259
+ viewerRoot.style.cursor = "";
260
+ isDragging = false;
261
+ // Check for meaningful movement
262
+ if (Math.abs(dragDx) < 0.5 && Math.abs(dragDy) < 0.5) {
263
+ updateSelectionVisual();
264
+ return;
265
+ }
266
+ const state = store.getState();
267
+ const annotations = state.pageAnnotations.get(dragAnnotationPageIndex);
268
+ if (!annotations || dragAnnotationIndex >= annotations.length)
269
+ return;
270
+ const original = annotations[dragAnnotationIndex];
271
+ let updated;
272
+ if (dragMode === "move") {
273
+ updated = offsetAnnotation(original, dragDx, dragDy);
274
+ }
275
+ else {
276
+ const newBounds = computeResizedBounds(dragOriginalBounds, dragHandle, dragDx, dragDy);
277
+ updated = resizeAnnotation(original, newBounds);
278
+ }
279
+ store.dispatch({
280
+ type: "UPDATE_ANNOTATION",
281
+ pageIndex: dragAnnotationPageIndex,
282
+ annotationIndex: dragAnnotationIndex,
283
+ annotation: updated,
284
+ });
285
+ }
286
+ function onPointerCancel(e) {
287
+ if (!isDragging)
288
+ return;
289
+ scrollArea.releasePointerCapture(e.pointerId);
290
+ viewerRoot.classList.remove(MOVING_CLASS);
291
+ viewerRoot.classList.remove(RESIZING_CLASS);
292
+ viewerRoot.style.cursor = "";
293
+ isDragging = false;
294
+ updateSelectionVisual();
295
+ }
296
+ // =========================================================================
297
+ // Keyboard
298
+ // =========================================================================
299
+ function onKeyDown(e) {
300
+ if (e.key !== "Delete" && e.key !== "Backspace")
301
+ return;
302
+ const tag = e.target.tagName;
303
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT")
304
+ return;
305
+ const sel = store.getState().selectedAnnotation;
306
+ if (!sel)
307
+ return;
308
+ store.dispatch({ type: "REMOVE_ANNOTATION", pageIndex: sel.pageIndex, annotationIndex: sel.annotationIndex });
309
+ e.preventDefault();
310
+ }
311
+ // =========================================================================
312
+ // Activate / deactivate
313
+ // =========================================================================
314
+ function activate() {
315
+ if (active)
316
+ return;
317
+ active = true;
318
+ viewerRoot.classList.add(SELECT_CURSOR_CLASS);
319
+ scrollArea.addEventListener("pointerdown", onPointerDown);
320
+ scrollArea.addEventListener("pointermove", onPointerMove);
321
+ scrollArea.addEventListener("pointerup", onPointerUp);
322
+ scrollArea.addEventListener("pointercancel", onPointerCancel);
323
+ document.addEventListener("keydown", onKeyDown);
324
+ }
325
+ function deactivate() {
326
+ if (!active)
327
+ return;
328
+ active = false;
329
+ viewerRoot.classList.remove(SELECT_CURSOR_CLASS);
330
+ viewerRoot.classList.remove(MOVING_CLASS);
331
+ viewerRoot.classList.remove(RESIZING_CLASS);
332
+ viewerRoot.style.cursor = "";
333
+ scrollArea.removeEventListener("pointerdown", onPointerDown);
334
+ scrollArea.removeEventListener("pointermove", onPointerMove);
335
+ scrollArea.removeEventListener("pointerup", onPointerUp);
336
+ scrollArea.removeEventListener("pointercancel", onPointerCancel);
337
+ document.removeEventListener("keydown", onKeyDown);
338
+ removeBbox();
339
+ isDragging = false;
340
+ }
341
+ function isSelectMode(s) {
342
+ return (s.documentFormat !== null &&
343
+ ANNOTATION_FORMATS.has(s.documentFormat) &&
344
+ isToolSet(s.activeTool) &&
345
+ s.activeSubTool === "select");
346
+ }
347
+ const unsub = store.subscribeRender((_prev, next) => {
348
+ if (isSelectMode(next)) {
349
+ activate();
350
+ if (!isDragging) {
351
+ updateSelectionVisual();
352
+ }
353
+ }
354
+ else {
355
+ deactivate();
356
+ }
357
+ });
358
+ if (isSelectMode(store.getState())) {
359
+ activate();
360
+ }
361
+ function destroy() {
362
+ unsub();
363
+ deactivate();
364
+ }
365
+ return { destroy };
366
+ }
367
+ //# sourceMappingURL=AnnotationSelectController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnnotationSelectController.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/AnnotationSelectController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ViewToolController — handles pointer, hand (pan), and zoom tool interactions.
3
+ *
4
+ * Attaches to the viewport scroll area and manages cursor styles and
5
+ * mouse/pointer events based on the currently active tool.
6
+ */
7
+ import type { Store } from "../../framework/store";
8
+ import type { ViewerState } from "../state";
9
+ import type { Action } from "../actions";
10
+ export interface ViewToolControllerOptions {
11
+ /** The scroll container element (overflow: auto) */
12
+ scrollArea: HTMLElement;
13
+ /** The viewer root element (for applying cursor classes) */
14
+ viewerRoot: HTMLElement;
15
+ store: Store<ViewerState, Action>;
16
+ }
17
+ export declare function createViewToolController(options: ViewToolControllerOptions): {
18
+ destroy: () => void;
19
+ };
20
+ //# sourceMappingURL=ViewToolController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewToolController.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/ViewToolController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,yBAAyB;IACtC,oDAAoD;IACpD,UAAU,EAAE,WAAW,CAAC;IACxB,4DAA4D;IAC5D,UAAU,EAAE,WAAW,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;CACrC;AAWD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB;mBAoMnD,IAAI;EAU3B"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * ViewToolController — handles pointer, hand (pan), and zoom tool interactions.
3
+ *
4
+ * Attaches to the viewport scroll area and manages cursor styles and
5
+ * mouse/pointer events based on the currently active tool.
6
+ */
7
+ /** CSS class applied to viewer root for each tool cursor */
8
+ const CURSOR_CLASSES = {
9
+ pointer: "",
10
+ hand: "udoc-viewer--tool-hand",
11
+ zoom: "udoc-viewer--tool-zoom",
12
+ };
13
+ const HAND_GRABBING_CLASS = "udoc-viewer--tool-hand-grabbing";
14
+ export function createViewToolController(options) {
15
+ const { scrollArea, viewerRoot, store } = options;
16
+ let currentTool = "pointer";
17
+ let cleanupFn = null;
18
+ // --- Hand tool (drag to pan) ---
19
+ function attachHandTool() {
20
+ let isDragging = false;
21
+ let startX = 0;
22
+ let startY = 0;
23
+ let startScrollLeft = 0;
24
+ let startScrollTop = 0;
25
+ const onPointerDown = (e) => {
26
+ // Only primary button
27
+ if (e.button !== 0)
28
+ return;
29
+ // Don't interfere with interactive elements
30
+ const target = e.target;
31
+ if (target.closest("a, button, input, [role=button]"))
32
+ return;
33
+ isDragging = true;
34
+ startX = e.clientX;
35
+ startY = e.clientY;
36
+ startScrollLeft = scrollArea.scrollLeft;
37
+ startScrollTop = scrollArea.scrollTop;
38
+ viewerRoot.classList.add(HAND_GRABBING_CLASS);
39
+ scrollArea.setPointerCapture(e.pointerId);
40
+ e.preventDefault();
41
+ };
42
+ const onPointerMove = (e) => {
43
+ if (!isDragging)
44
+ return;
45
+ const dx = e.clientX - startX;
46
+ const dy = e.clientY - startY;
47
+ scrollArea.scrollLeft = startScrollLeft - dx;
48
+ scrollArea.scrollTop = startScrollTop - dy;
49
+ };
50
+ const onPointerUp = (e) => {
51
+ if (!isDragging)
52
+ return;
53
+ isDragging = false;
54
+ viewerRoot.classList.remove(HAND_GRABBING_CLASS);
55
+ scrollArea.releasePointerCapture(e.pointerId);
56
+ };
57
+ scrollArea.addEventListener("pointerdown", onPointerDown);
58
+ scrollArea.addEventListener("pointermove", onPointerMove);
59
+ scrollArea.addEventListener("pointerup", onPointerUp);
60
+ scrollArea.addEventListener("pointercancel", onPointerUp);
61
+ return () => {
62
+ scrollArea.removeEventListener("pointerdown", onPointerDown);
63
+ scrollArea.removeEventListener("pointermove", onPointerMove);
64
+ scrollArea.removeEventListener("pointerup", onPointerUp);
65
+ scrollArea.removeEventListener("pointercancel", onPointerUp);
66
+ viewerRoot.classList.remove(HAND_GRABBING_CLASS);
67
+ };
68
+ }
69
+ // --- Zoom tool (click to zoom in, alt+click to zoom out) ---
70
+ function attachZoomTool() {
71
+ const ZOOM_OUT_CLASS = "udoc-viewer--tool-zoom-out";
72
+ const updateZoomCursor = (e) => {
73
+ const out = e.altKey || e.shiftKey;
74
+ viewerRoot.classList.toggle(ZOOM_OUT_CLASS, out);
75
+ };
76
+ const onKeyDown = (e) => updateZoomCursor(e);
77
+ const onKeyUp = (e) => updateZoomCursor(e);
78
+ document.addEventListener("keydown", onKeyDown);
79
+ document.addEventListener("keyup", onKeyUp);
80
+ const onClick = (e) => {
81
+ // Don't interfere with interactive elements
82
+ const target = e.target;
83
+ if (target.closest("a, button, input, [role=button]"))
84
+ return;
85
+ const rect = scrollArea.getBoundingClientRect();
86
+ // Viewport-relative click position (0-1 range)
87
+ const viewX = (e.clientX - rect.left) / rect.width;
88
+ const viewY = (e.clientY - rect.top) / rect.height;
89
+ // Scroll position before zoom
90
+ const prevScrollLeft = scrollArea.scrollLeft;
91
+ const prevScrollTop = scrollArea.scrollTop;
92
+ const prevScrollWidth = scrollArea.scrollWidth;
93
+ const prevScrollHeight = scrollArea.scrollHeight;
94
+ // Alt/Shift+click = zoom out, normal click = zoom in
95
+ if (e.altKey || e.shiftKey) {
96
+ store.dispatch({ type: "ZOOM_OUT" });
97
+ }
98
+ else {
99
+ store.dispatch({ type: "ZOOM_IN" });
100
+ }
101
+ // After zoom dispatched, schedule scroll adjustment to keep click point stable.
102
+ // We use requestAnimationFrame because the layout needs to update first.
103
+ requestAnimationFrame(() => {
104
+ const newScrollWidth = scrollArea.scrollWidth;
105
+ const newScrollHeight = scrollArea.scrollHeight;
106
+ if (prevScrollWidth === 0 || prevScrollHeight === 0)
107
+ return;
108
+ const scaleX = newScrollWidth / prevScrollWidth;
109
+ const scaleY = newScrollHeight / prevScrollHeight;
110
+ // The point under the cursor in the old scroll space
111
+ const pointX = prevScrollLeft + viewX * rect.width;
112
+ const pointY = prevScrollTop + viewY * rect.height;
113
+ // Where that same point is in the new scroll space
114
+ const newPointX = pointX * scaleX;
115
+ const newPointY = pointY * scaleY;
116
+ // Adjust scroll so the point stays under the cursor
117
+ scrollArea.scrollLeft = newPointX - viewX * rect.width;
118
+ scrollArea.scrollTop = newPointY - viewY * rect.height;
119
+ });
120
+ };
121
+ scrollArea.addEventListener("click", onClick);
122
+ return () => {
123
+ scrollArea.removeEventListener("click", onClick);
124
+ document.removeEventListener("keydown", onKeyDown);
125
+ document.removeEventListener("keyup", onKeyUp);
126
+ viewerRoot.classList.remove(ZOOM_OUT_CLASS);
127
+ };
128
+ }
129
+ // --- Cursor and tool switching ---
130
+ function setCursorClass(tool) {
131
+ // Remove all tool cursor classes
132
+ for (const cls of Object.values(CURSOR_CLASSES)) {
133
+ if (cls)
134
+ viewerRoot.classList.remove(cls);
135
+ }
136
+ viewerRoot.classList.remove(HAND_GRABBING_CLASS);
137
+ // Add new one
138
+ const cls = CURSOR_CLASSES[tool];
139
+ if (cls)
140
+ viewerRoot.classList.add(cls);
141
+ }
142
+ function switchTool(tool) {
143
+ if (tool === currentTool)
144
+ return;
145
+ // Teardown previous tool
146
+ if (cleanupFn) {
147
+ cleanupFn();
148
+ cleanupFn = null;
149
+ }
150
+ currentTool = tool;
151
+ setCursorClass(tool);
152
+ // Setup new tool
153
+ switch (tool) {
154
+ case "hand":
155
+ cleanupFn = attachHandTool();
156
+ break;
157
+ case "zoom":
158
+ cleanupFn = attachZoomTool();
159
+ break;
160
+ // "pointer" — default behavior, no extra handlers needed
161
+ }
162
+ }
163
+ // Subscribe to tool state changes
164
+ let prevTool = store.getState().activeTool;
165
+ const unsub = store.subscribeRender((_prev, next) => {
166
+ const tool = next.activeTool;
167
+ if (tool !== prevTool) {
168
+ prevTool = tool;
169
+ // Only handle view tools; tool sets don't affect viewport interaction
170
+ if (tool === "pointer" || tool === "hand" || tool === "zoom") {
171
+ switchTool(tool);
172
+ }
173
+ else {
174
+ // For annotation/markup tool sets, revert to pointer behavior
175
+ switchTool("pointer");
176
+ }
177
+ }
178
+ });
179
+ // Apply initial state
180
+ const initial = store.getState().activeTool;
181
+ if (initial === "hand" || initial === "zoom") {
182
+ switchTool(initial);
183
+ }
184
+ function destroy() {
185
+ unsub();
186
+ if (cleanupFn) {
187
+ cleanupFn();
188
+ cleanupFn = null;
189
+ }
190
+ setCursorClass("pointer");
191
+ }
192
+ return { destroy };
193
+ }
194
+ //# sourceMappingURL=ViewToolController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewToolController.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/ViewToolController.ts"],"names":[],"mappings":"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"}