@docmentis/udoc-viewer 0.6.20 → 0.6.22
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 +23 -1
- package/dist/package.json +1 -1
- package/dist/src/UDocClient.d.ts +33 -0
- package/dist/src/UDocClient.d.ts.map +1 -1
- package/dist/src/UDocClient.js +25 -1
- package/dist/src/UDocClient.js.map +1 -1
- package/dist/src/UDocViewer.d.ts +35 -6
- package/dist/src/UDocViewer.d.ts.map +1 -1
- package/dist/src/UDocViewer.js +63 -9
- package/dist/src/UDocViewer.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/ui/viewer/actions.d.ts +25 -2
- package/dist/src/ui/viewer/actions.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/FloatingToolbar.js +12 -12
- package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/SubToolbar.d.ts +10 -0
- package/dist/src/ui/viewer/components/SubToolbar.d.ts.map +1 -0
- package/dist/src/ui/viewer/components/SubToolbar.js +203 -0
- package/dist/src/ui/viewer/components/SubToolbar.js.map +1 -0
- package/dist/src/ui/viewer/components/Toolbar.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Toolbar.js +144 -4
- package/dist/src/ui/viewer/components/Toolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/ViewModeMenu.js +3 -3
- package/dist/src/ui/viewer/components/ViewModeMenu.js.map +1 -1
- package/dist/src/ui/viewer/components/Viewport.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Viewport.js +53 -4
- package/dist/src/ui/viewer/components/Viewport.js.map +1 -1
- package/dist/src/ui/viewer/effects.d.ts.map +1 -1
- package/dist/src/ui/viewer/effects.js +4 -1
- package/dist/src/ui/viewer/effects.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.js +25 -0
- package/dist/src/ui/viewer/i18n/ar.js.map +1 -1
- package/dist/src/ui/viewer/i18n/de.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/de.js +25 -0
- package/dist/src/ui/viewer/i18n/de.js.map +1 -1
- package/dist/src/ui/viewer/i18n/en.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/en.js +25 -0
- package/dist/src/ui/viewer/i18n/en.js.map +1 -1
- package/dist/src/ui/viewer/i18n/es.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/es.js +25 -0
- package/dist/src/ui/viewer/i18n/es.js.map +1 -1
- package/dist/src/ui/viewer/i18n/fr.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/fr.js +25 -0
- package/dist/src/ui/viewer/i18n/fr.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ja.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ja.js +25 -0
- package/dist/src/ui/viewer/i18n/ja.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ko.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ko.js +25 -0
- package/dist/src/ui/viewer/i18n/ko.js.map +1 -1
- package/dist/src/ui/viewer/i18n/pt-BR.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/pt-BR.js +25 -0
- package/dist/src/ui/viewer/i18n/pt-BR.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ru.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ru.js +25 -0
- package/dist/src/ui/viewer/i18n/ru.js.map +1 -1
- package/dist/src/ui/viewer/i18n/types.d.ts +21 -0
- package/dist/src/ui/viewer/i18n/types.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-CN.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-CN.js +25 -0
- package/dist/src/ui/viewer/i18n/zh-CN.js.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-TW.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-TW.js +25 -0
- package/dist/src/ui/viewer/i18n/zh-TW.js.map +1 -1
- package/dist/src/ui/viewer/icons.d.ts +16 -0
- package/dist/src/ui/viewer/icons.d.ts.map +1 -1
- package/dist/src/ui/viewer/icons.js +20 -0
- package/dist/src/ui/viewer/icons.js.map +1 -1
- package/dist/src/ui/viewer/navigation.d.ts +11 -0
- package/dist/src/ui/viewer/navigation.d.ts.map +1 -1
- package/dist/src/ui/viewer/navigation.js.map +1 -1
- package/dist/src/ui/viewer/reducer.d.ts.map +1 -1
- package/dist/src/ui/viewer/reducer.js +74 -4
- package/dist/src/ui/viewer/reducer.js.map +1 -1
- package/dist/src/ui/viewer/search/search.d.ts.map +1 -1
- package/dist/src/ui/viewer/search/search.js +6 -2
- package/dist/src/ui/viewer/search/search.js.map +1 -1
- package/dist/src/ui/viewer/shell.d.ts.map +1 -1
- package/dist/src/ui/viewer/shell.js +13 -2
- package/dist/src/ui/viewer/shell.js.map +1 -1
- package/dist/src/ui/viewer/state.d.ts +43 -1
- package/dist/src/ui/viewer/state.d.ts.map +1 -1
- package/dist/src/ui/viewer/state.js +24 -0
- package/dist/src/ui/viewer/state.js.map +1 -1
- package/dist/src/ui/viewer/styles-inline.d.ts +1 -1
- package/dist/src/ui/viewer/styles-inline.d.ts.map +1 -1
- package/dist/src/ui/viewer/styles-inline.js +343 -148
- package/dist/src/ui/viewer/styles-inline.js.map +1 -1
- package/dist/src/ui/viewer/tools/ViewToolController.d.ts +20 -0
- package/dist/src/ui/viewer/tools/ViewToolController.d.ts.map +1 -0
- package/dist/src/ui/viewer/tools/ViewToolController.js +194 -0
- package/dist/src/ui/viewer/tools/ViewToolController.js.map +1 -0
- package/dist/src/wasm/udoc.d.ts +3 -3
- package/dist/src/wasm/udoc.js +10 -10
- package/dist/src/wasm/udoc_bg.wasm +0 -0
- package/dist/src/wasm/udoc_bg.wasm.d.ts +3 -3
- package/dist/src/worker/worker-inline.js +1 -1
- package/dist/src/worker/worker.js +9 -9
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles-inline.js","sourceRoot":"","sources":["../../../../src/ui/viewer/styles-inline.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"styles-inline.js","sourceRoot":"","sources":["../../../../src/ui/viewer/styles-inline.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0yF3B,CAAC"}
|
|
@@ -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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"}
|
package/dist/src/wasm/udoc.d.ts
CHANGED
|
@@ -783,9 +783,9 @@ export interface InitOutput {
|
|
|
783
783
|
readonly wasm_set_visibility_group_visible: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
784
784
|
readonly wasm_setup_telemetry: (a: number, b: number, c: number) => void;
|
|
785
785
|
readonly wasm_viewer_preferences: (a: number, b: number, c: number, d: number) => void;
|
|
786
|
-
readonly
|
|
787
|
-
readonly
|
|
788
|
-
readonly
|
|
786
|
+
readonly __wasm_bindgen_func_elem_2700: (a: number, b: number, c: number) => void;
|
|
787
|
+
readonly __wasm_bindgen_func_elem_2684: (a: number, b: number) => void;
|
|
788
|
+
readonly __wasm_bindgen_func_elem_20725: (a: number, b: number, c: number, d: number) => void;
|
|
789
789
|
readonly __wbindgen_export: (a: number, b: number) => number;
|
|
790
790
|
readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
|
|
791
791
|
readonly __wbindgen_export3: (a: number) => void;
|
package/dist/src/wasm/udoc.js
CHANGED
|
@@ -259,12 +259,12 @@ if (!('encodeInto' in cachedTextEncoder)) {
|
|
|
259
259
|
|
|
260
260
|
let WASM_VECTOR_LEN = 0;
|
|
261
261
|
|
|
262
|
-
function
|
|
263
|
-
wasm.
|
|
262
|
+
function __wasm_bindgen_func_elem_2700(arg0, arg1, arg2) {
|
|
263
|
+
wasm.__wasm_bindgen_func_elem_2700(arg0, arg1, addHeapObject(arg2));
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
-
function
|
|
267
|
-
wasm.
|
|
266
|
+
function __wasm_bindgen_func_elem_20725(arg0, arg1, arg2, arg3) {
|
|
267
|
+
wasm.__wasm_bindgen_func_elem_20725(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
|
|
268
268
|
}
|
|
269
269
|
|
|
270
270
|
const __wbindgen_enum_GpuBufferBindingType = ["uniform", "storage", "read-only-storage"];
|
|
@@ -1990,7 +1990,7 @@ function __wbg_get_imports() {
|
|
|
1990
1990
|
const a = state0.a;
|
|
1991
1991
|
state0.a = 0;
|
|
1992
1992
|
try {
|
|
1993
|
-
return
|
|
1993
|
+
return __wasm_bindgen_func_elem_20725(a, state0.b, arg0, arg1);
|
|
1994
1994
|
} finally {
|
|
1995
1995
|
state0.a = a;
|
|
1996
1996
|
}
|
|
@@ -2470,16 +2470,16 @@ function __wbg_get_imports() {
|
|
|
2470
2470
|
const ret = arg0;
|
|
2471
2471
|
return addHeapObject(ret);
|
|
2472
2472
|
};
|
|
2473
|
+
imports.wbg.__wbindgen_cast_9d97beea3493d3db = function(arg0, arg1) {
|
|
2474
|
+
// Cast intrinsic for `Closure(Closure { dtor_idx: 212, function: Function { arguments: [Externref], shim_idx: 213, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
|
2475
|
+
const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_2684, __wasm_bindgen_func_elem_2700);
|
|
2476
|
+
return addHeapObject(ret);
|
|
2477
|
+
};
|
|
2473
2478
|
imports.wbg.__wbindgen_cast_cb9088102bce6b30 = function(arg0, arg1) {
|
|
2474
2479
|
// Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref("Uint8Array")`.
|
|
2475
2480
|
const ret = getArrayU8FromWasm0(arg0, arg1);
|
|
2476
2481
|
return addHeapObject(ret);
|
|
2477
2482
|
};
|
|
2478
|
-
imports.wbg.__wbindgen_cast_d5be308fce034eae = function(arg0, arg1) {
|
|
2479
|
-
// Cast intrinsic for `Closure(Closure { dtor_idx: 210, function: Function { arguments: [Externref], shim_idx: 211, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
|
2480
|
-
const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_2693, __wasm_bindgen_func_elem_2709);
|
|
2481
|
-
return addHeapObject(ret);
|
|
2482
|
-
};
|
|
2483
2483
|
imports.wbg.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {
|
|
2484
2484
|
// Cast intrinsic for `F64 -> Externref`.
|
|
2485
2485
|
const ret = arg0;
|
|
Binary file
|
|
@@ -48,9 +48,9 @@ export const wasm_set_license: (a: number, b: number, c: number, d: number) => v
|
|
|
48
48
|
export const wasm_set_visibility_group_visible: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
49
49
|
export const wasm_setup_telemetry: (a: number, b: number, c: number) => void;
|
|
50
50
|
export const wasm_viewer_preferences: (a: number, b: number, c: number, d: number) => void;
|
|
51
|
-
export const
|
|
52
|
-
export const
|
|
53
|
-
export const
|
|
51
|
+
export const __wasm_bindgen_func_elem_2700: (a: number, b: number, c: number) => void;
|
|
52
|
+
export const __wasm_bindgen_func_elem_2684: (a: number, b: number) => void;
|
|
53
|
+
export const __wasm_bindgen_func_elem_20725: (a: number, b: number, c: number, d: number) => void;
|
|
54
54
|
export const __wbindgen_export: (a: number, b: number) => number;
|
|
55
55
|
export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
|
|
56
56
|
export const __wbindgen_export3: (a: number) => void;
|