@docmentis/udoc-viewer 0.6.25 → 0.6.27
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 +9 -0
- package/dist/package.json +1 -1
- package/dist/src/UDocClient.d.ts +9 -2
- package/dist/src/UDocClient.d.ts.map +1 -1
- package/dist/src/UDocClient.js +6 -5
- package/dist/src/UDocClient.js.map +1 -1
- package/dist/src/UDocViewer.d.ts +12 -2
- package/dist/src/UDocViewer.d.ts.map +1 -1
- package/dist/src/UDocViewer.js +21 -3
- 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/ui/viewer/actions.d.ts +8 -1
- package/dist/src/ui/viewer/actions.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/FloatingToolbar.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/FloatingToolbar.js +46 -0
- package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/Spread.d.ts +9 -0
- package/dist/src/ui/viewer/components/Spread.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Spread.js +94 -9
- package/dist/src/ui/viewer/components/Spread.js.map +1 -1
- package/dist/src/ui/viewer/components/SubToolbar.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/SubToolbar.js +9 -1
- package/dist/src/ui/viewer/components/SubToolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/ViewModeMenu.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/ViewModeMenu.js +18 -6
- 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 +141 -42
- package/dist/src/ui/viewer/components/Viewport.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.js +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -0
- package/dist/src/ui/viewer/i18n/ru.js.map +1 -1
- package/dist/src/ui/viewer/i18n/types.d.ts +3 -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 +3 -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 +3 -0
- package/dist/src/ui/viewer/i18n/zh-TW.js.map +1 -1
- package/dist/src/ui/viewer/icons.d.ts +2 -0
- package/dist/src/ui/viewer/icons.d.ts.map +1 -1
- package/dist/src/ui/viewer/icons.js +5 -0
- package/dist/src/ui/viewer/icons.js.map +1 -1
- package/dist/src/ui/viewer/layout/spreadLayout.d.ts +73 -0
- package/dist/src/ui/viewer/layout/spreadLayout.d.ts.map +1 -1
- package/dist/src/ui/viewer/layout/spreadLayout.js +230 -0
- package/dist/src/ui/viewer/layout/spreadLayout.js.map +1 -1
- package/dist/src/ui/viewer/reducer.d.ts.map +1 -1
- package/dist/src/ui/viewer/reducer.js +35 -2
- package/dist/src/ui/viewer/reducer.js.map +1 -1
- package/dist/src/ui/viewer/shell.d.ts +1 -1
- package/dist/src/ui/viewer/shell.d.ts.map +1 -1
- package/dist/src/ui/viewer/shell.js +4 -4
- package/dist/src/ui/viewer/shell.js.map +1 -1
- package/dist/src/ui/viewer/state.d.ts +16 -0
- package/dist/src/ui/viewer/state.d.ts.map +1 -1
- package/dist/src/ui/viewer/state.js +12 -2
- 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 +85 -0
- package/dist/src/ui/viewer/styles-inline.js.map +1 -1
- package/dist/src/ui/viewer/tools/AnnotationDrawController.d.ts.map +1 -1
- package/dist/src/ui/viewer/tools/AnnotationDrawController.js +13 -5
- package/dist/src/ui/viewer/tools/AnnotationDrawController.js.map +1 -1
- package/dist/src/ui/viewer/tools/ViewToolController.d.ts.map +1 -1
- package/dist/src/ui/viewer/tools/ViewToolController.js +11 -26
- package/dist/src/ui/viewer/tools/ViewToolController.js.map +1 -1
- package/dist/src/ui/viewer/transition-gl.d.ts +25 -0
- package/dist/src/ui/viewer/transition-gl.d.ts.map +1 -0
- package/dist/src/ui/viewer/transition-gl.js +823 -0
- package/dist/src/ui/viewer/transition-gl.js.map +1 -0
- package/dist/src/ui/viewer/transition.d.ts.map +1 -1
- package/dist/src/ui/viewer/transition.js +9 -0
- package/dist/src/ui/viewer/transition.js.map +1 -1
- package/dist/src/wasm/udoc.d.ts +117 -89
- package/dist/src/wasm/udoc.js +6 -6
- package/dist/src/wasm/udoc_bg.wasm +0 -0
- package/dist/src/wasm/udoc_bg.wasm.d.ts +3 -3
- package/dist/src/worker/WorkerClient.d.ts +14 -0
- package/dist/src/worker/WorkerClient.d.ts.map +1 -1
- package/dist/src/worker/WorkerClient.js.map +1 -1
- package/dist/src/worker/worker-inline.js +1 -1
- package/dist/src/worker/worker.js +6 -6
- package/package.json +1 -1
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { subscribeSelector } from "../../framework/selectors";
|
|
2
2
|
import { on } from "../../framework/events";
|
|
3
|
-
import { ICON_VIEW_MODE, ICON_SCROLL_SPREAD, ICON_SCROLL_CONTINUOUS, ICON_LAYOUT_SINGLE, ICON_LAYOUT_DOUBLE, ICON_LAYOUT_DOUBLE_ODD_RIGHT, ICON_LAYOUT_DOUBLE_ODD_LEFT, ICON_ROTATE_0, ICON_ROTATE_90, ICON_ROTATE_180, ICON_ROTATE_270, ICON_SPACING_ALL, ICON_SPACING_NONE, ICON_SPACING_SPREAD, ICON_SPACING_PAGE, } from "../icons";
|
|
3
|
+
import { ICON_VIEW_MODE, ICON_VIEW_PAGED, ICON_VIEW_CONTINUOUS, ICON_SCROLL_SPREAD, ICON_SCROLL_CONTINUOUS, ICON_LAYOUT_SINGLE, ICON_LAYOUT_DOUBLE, ICON_LAYOUT_DOUBLE_ODD_RIGHT, ICON_LAYOUT_DOUBLE_ODD_LEFT, ICON_ROTATE_0, ICON_ROTATE_90, ICON_ROTATE_180, ICON_ROTATE_270, ICON_SPACING_ALL, ICON_SPACING_NONE, ICON_SPACING_SPREAD, ICON_SPACING_PAGE, } from "../icons";
|
|
4
4
|
function sliceEqual(a, b) {
|
|
5
|
-
return (a.
|
|
5
|
+
return (a.viewMode === b.viewMode &&
|
|
6
|
+
a.scrollMode === b.scrollMode &&
|
|
6
7
|
a.layoutMode === b.layoutMode &&
|
|
7
8
|
a.pageRotation === b.pageRotation &&
|
|
8
9
|
a.spacingMode === b.spacingMode);
|
|
9
10
|
}
|
|
11
|
+
const VIEW_MODE_OPTIONS = [
|
|
12
|
+
{ value: "paged", icon: ICON_VIEW_PAGED, label: "viewMode.paged" },
|
|
13
|
+
{ value: "continuous", icon: ICON_VIEW_CONTINUOUS, label: "viewMode.continuousView" },
|
|
14
|
+
];
|
|
10
15
|
const SCROLL_OPTIONS = [
|
|
11
16
|
{ value: "spread", icon: ICON_SCROLL_SPREAD, label: "viewMode.spread" },
|
|
12
17
|
{ value: "continuous", icon: ICON_SCROLL_CONTINUOUS, label: "viewMode.continuous" },
|
|
@@ -103,22 +108,28 @@ export function createViewModeMenu() {
|
|
|
103
108
|
dropdownListeners = [];
|
|
104
109
|
// Clear existing content
|
|
105
110
|
dropdown.innerHTML = "";
|
|
111
|
+
const isPaged = slice.viewMode === "paged";
|
|
112
|
+
// View mode section (paged vs continuous)
|
|
113
|
+
dropdown.appendChild(createSection(i18nRef.t("viewMode.view"), VIEW_MODE_OPTIONS, slice.viewMode, (mode) => {
|
|
114
|
+
storeRef?.dispatch({ type: "SET_VIEW_MODE", mode });
|
|
115
|
+
}));
|
|
116
|
+
const disabledInContinuous = !isPaged ? { disabled: true, allowNoSelection: true } : {};
|
|
106
117
|
// Scroll mode section
|
|
107
118
|
dropdown.appendChild(createSection(i18nRef.t("viewMode.scroll"), SCROLL_OPTIONS, slice.scrollMode, (mode) => {
|
|
108
119
|
storeRef?.dispatch({ type: "SET_SCROLL_MODE", mode });
|
|
109
|
-
}));
|
|
120
|
+
}, disabledInContinuous));
|
|
110
121
|
// Layout mode section
|
|
111
122
|
dropdown.appendChild(createSection(i18nRef.t("viewMode.layout"), LAYOUT_OPTIONS, slice.layoutMode, (mode) => {
|
|
112
123
|
storeRef?.dispatch({ type: "SET_LAYOUT_MODE", mode });
|
|
113
|
-
}));
|
|
124
|
+
}, disabledInContinuous));
|
|
114
125
|
// Page rotation section
|
|
115
126
|
dropdown.appendChild(createSection(i18nRef.t("viewMode.rotation"), ROTATION_OPTIONS, slice.pageRotation, (rotation) => {
|
|
116
127
|
storeRef?.dispatch({ type: "SET_PAGE_ROTATION", rotation });
|
|
117
|
-
}));
|
|
128
|
+
}, disabledInContinuous));
|
|
118
129
|
// Spacing section
|
|
119
130
|
dropdown.appendChild(createSection(i18nRef.t("viewMode.spacing"), SPACING_OPTIONS, slice.spacingMode, (mode) => {
|
|
120
131
|
storeRef?.dispatch({ type: "SET_SPACING_MODE", mode });
|
|
121
|
-
}));
|
|
132
|
+
}, disabledInContinuous));
|
|
122
133
|
}
|
|
123
134
|
function toggleDropdown() {
|
|
124
135
|
isOpen = !isOpen;
|
|
@@ -185,6 +196,7 @@ export function createViewModeMenu() {
|
|
|
185
196
|
}
|
|
186
197
|
function selectSlice(state) {
|
|
187
198
|
return {
|
|
199
|
+
viewMode: state.viewMode,
|
|
188
200
|
scrollMode: state.scrollMode,
|
|
189
201
|
layoutMode: state.layoutMode,
|
|
190
202
|
pageRotation: state.pageRotation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewModeMenu.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/ViewModeMenu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAI5C,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,EAC3B,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GACpB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ViewModeMenu.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/ViewModeMenu.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAEH,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAEH,KAAK,WAAW,EAUnB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA6a7C,wBAAgB,cAAc,CAAC,eAAe,UAAO;;oBA8P1B,WAAW,SAAS,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,YAAY,SAAS,IAAI,KAAG,IAAI;mBA8jCvF,IAAI;EA4B3B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { subscribeSelector } from "../../framework/selectors";
|
|
2
2
|
import { getPointsToPixels, } from "../state";
|
|
3
3
|
import { showAnnotationPopup, closeAnnotationPopup } from "../annotation";
|
|
4
|
-
import { calculateSpreads, calculateSpreadLayouts, findSpreadForPage, findVisibleSpreadRange, getSpreadPrimaryPage, getSpreadDimensions, } from "../layout/spreadLayout";
|
|
4
|
+
import { calculateSpreads, calculateSpreadLayouts, calculateContinuousLayout, findSpreadForPage, findVisibleSpreadRange, getSpreadPrimaryPage, getSpreadDimensions, } from "../layout/spreadLayout";
|
|
5
5
|
import { createSpread } from "./Spread";
|
|
6
6
|
import { createFloatingToolbar } from "./FloatingToolbar";
|
|
7
7
|
import { on } from "../../framework/events";
|
|
@@ -15,6 +15,7 @@ function viewportSliceEqual(a, b) {
|
|
|
15
15
|
a.page === b.page &&
|
|
16
16
|
a.pageCount === b.pageCount &&
|
|
17
17
|
a.pageInfos === b.pageInfos &&
|
|
18
|
+
a.viewMode === b.viewMode &&
|
|
18
19
|
a.scrollMode === b.scrollMode &&
|
|
19
20
|
a.layoutMode === b.layoutMode &&
|
|
20
21
|
a.zoomMode === b.zoomMode &&
|
|
@@ -28,7 +29,8 @@ function viewportSliceEqual(a, b) {
|
|
|
28
29
|
a.highlightedAnnotation === b.highlightedAnnotation &&
|
|
29
30
|
a.pageText === b.pageText &&
|
|
30
31
|
a.searchMatches === b.searchMatches &&
|
|
31
|
-
a.searchActiveIndex === b.searchActiveIndex
|
|
32
|
+
a.searchActiveIndex === b.searchActiveIndex &&
|
|
33
|
+
a.zoomAnchor === b.zoomAnchor);
|
|
32
34
|
}
|
|
33
35
|
let cachedScrollbarSize = null;
|
|
34
36
|
/** Number of spreads to render above/below viewport for smooth scrolling */
|
|
@@ -217,6 +219,17 @@ function computeScale(slice, metrics, spreads, scrollbarVisible) {
|
|
|
217
219
|
function buildLayout(slice, metrics, scrollbarVisible) {
|
|
218
220
|
const spreads = calculateSpreads(slice.pageCount, slice.layoutMode);
|
|
219
221
|
const scale = computeScale(slice, metrics, spreads, scrollbarVisible);
|
|
222
|
+
if (slice.viewMode === "continuous") {
|
|
223
|
+
const contLayout = calculateContinuousLayout(spreads, slice.pageInfos, scale, slice.dpi, slice.pageRotation);
|
|
224
|
+
return {
|
|
225
|
+
spreads,
|
|
226
|
+
layouts: contLayout.layouts,
|
|
227
|
+
contentWidth: contLayout.contentWidth,
|
|
228
|
+
contentHeight: contLayout.contentHeight,
|
|
229
|
+
scale,
|
|
230
|
+
continuousLayout: contLayout,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
220
233
|
const layout = calculateSpreadLayouts(spreads, slice.pageInfos, scale, slice.pageSpacing, slice.spreadSpacing, slice.dpi, slice.pageRotation);
|
|
221
234
|
return {
|
|
222
235
|
spreads,
|
|
@@ -224,6 +237,7 @@ function buildLayout(slice, metrics, scrollbarVisible) {
|
|
|
224
237
|
contentWidth: layout.contentWidth,
|
|
225
238
|
contentHeight: layout.contentHeight,
|
|
226
239
|
scale,
|
|
240
|
+
continuousLayout: null,
|
|
227
241
|
};
|
|
228
242
|
}
|
|
229
243
|
function computeViewportUpdate(prevSlice, nextSlice, prevMetrics, nextMetrics) {
|
|
@@ -232,6 +246,7 @@ function computeViewportUpdate(prevSlice, nextSlice, prevMetrics, nextMetrics) {
|
|
|
232
246
|
nextSlice.docId !== prevSlice.docId ||
|
|
233
247
|
nextSlice.pageCount !== prevSlice.pageCount ||
|
|
234
248
|
nextSlice.pageInfos !== prevSlice.pageInfos ||
|
|
249
|
+
nextSlice.viewMode !== prevSlice.viewMode ||
|
|
235
250
|
nextSlice.scrollMode !== prevSlice.scrollMode ||
|
|
236
251
|
nextSlice.layoutMode !== prevSlice.layoutMode ||
|
|
237
252
|
nextSlice.zoomMode !== prevSlice.zoomMode ||
|
|
@@ -246,6 +261,7 @@ function computeViewportUpdate(prevSlice, nextSlice, prevMetrics, nextMetrics) {
|
|
|
246
261
|
nextSlice.docId !== prevSlice.docId ||
|
|
247
262
|
nextSlice.pageCount !== prevSlice.pageCount ||
|
|
248
263
|
nextSlice.pageInfos !== prevSlice.pageInfos ||
|
|
264
|
+
nextSlice.viewMode !== prevSlice.viewMode ||
|
|
249
265
|
nextSlice.layoutMode !== prevSlice.layoutMode;
|
|
250
266
|
const shouldClearSpreads = layoutChanged && spreadsChanged;
|
|
251
267
|
// Scroll to page on document change or zoom mode change (explicit user actions)
|
|
@@ -703,9 +719,11 @@ export function createViewport(showAttribution = true) {
|
|
|
703
719
|
});
|
|
704
720
|
}
|
|
705
721
|
function applyState(slice) {
|
|
706
|
-
|
|
707
|
-
scrollArea.style.
|
|
708
|
-
|
|
722
|
+
const sidePadding = slice.viewMode === "continuous" ? 0 : slice.pageSpacing;
|
|
723
|
+
scrollArea.style.paddingLeft = `${sidePadding}px`;
|
|
724
|
+
scrollArea.style.paddingRight = `${sidePadding}px`;
|
|
725
|
+
el.classList.toggle("udoc-viewport--seamless", slice.spacingMode === "none" || slice.viewMode === "continuous");
|
|
726
|
+
el.classList.toggle("udoc-viewport--continuous", slice.viewMode === "continuous");
|
|
709
727
|
const metrics = readViewportMetrics(scrollArea, container);
|
|
710
728
|
const hasDoc = !!slice.docId && slice.pageCount > 0 && slice.pageInfos.length > 0;
|
|
711
729
|
if (!hasDoc || metrics.innerWidth <= 0 || metrics.innerHeight <= 0) {
|
|
@@ -737,50 +755,64 @@ export function createViewport(showAttribution = true) {
|
|
|
737
755
|
syncEffectiveZoom(slice, layoutState);
|
|
738
756
|
if (slice.scrollMode === "continuous") {
|
|
739
757
|
applyContinuousLayout(metrics, layoutState);
|
|
740
|
-
if (
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
758
|
+
if (!slice.zoomAnchor) {
|
|
759
|
+
if (plan.shouldScrollToPage) {
|
|
760
|
+
scrollToPage(slice.page, metrics);
|
|
761
|
+
}
|
|
762
|
+
else if (plan.shouldRestorePosition && viewportTopPosition) {
|
|
763
|
+
restoreViewportPosition(viewportTopPosition, metrics, layoutState);
|
|
764
|
+
}
|
|
745
765
|
}
|
|
746
766
|
updateVisibleSpreads(slice, metrics, layoutState);
|
|
747
767
|
}
|
|
748
768
|
else {
|
|
749
769
|
applySingleLayout(slice, metrics, layoutState);
|
|
750
|
-
if (
|
|
751
|
-
|
|
752
|
-
scrollArea.scrollLeft = 0;
|
|
753
|
-
lastOverflowX = null;
|
|
754
|
-
lastOverflowY = null;
|
|
755
|
-
}
|
|
756
|
-
else if (plan.shouldRestorePosition && viewportTopPosition) {
|
|
757
|
-
// In spread mode, restore position by showing the correct page
|
|
758
|
-
const targetPage = viewportTopPosition.page;
|
|
759
|
-
if (slice.page !== targetPage && storeRef) {
|
|
760
|
-
storeRef.dispatch({ type: "SET_PAGE", page: targetPage });
|
|
761
|
-
}
|
|
762
|
-
// Reset scroll and try to restore position within the spread if it's scrollable
|
|
763
|
-
scrollArea.scrollLeft = 0;
|
|
764
|
-
const spreadIndex = findSpreadForPage(layoutState.spreads, targetPage);
|
|
765
|
-
const layout = layoutState.layouts[spreadIndex];
|
|
766
|
-
if (layout && layout.height > metrics.innerHeight && !viewportTopPosition.inSpacing) {
|
|
767
|
-
// Spread is larger than viewport and we have a content offset
|
|
768
|
-
// Calculate scroll position to show the same relative position
|
|
769
|
-
const spreadTopInContainer = getCenteredOffset(containerSize.height, layout.height);
|
|
770
|
-
const offsetPixels = viewportTopPosition.offset * layout.height;
|
|
771
|
-
scrollArea.scrollTop = Math.max(0, spreadTopInContainer + offsetPixels);
|
|
772
|
-
}
|
|
773
|
-
else {
|
|
770
|
+
if (!slice.zoomAnchor) {
|
|
771
|
+
if (plan.shouldScrollToPage) {
|
|
774
772
|
scrollArea.scrollTop = 0;
|
|
773
|
+
scrollArea.scrollLeft = 0;
|
|
774
|
+
lastOverflowX = null;
|
|
775
|
+
lastOverflowY = null;
|
|
776
|
+
}
|
|
777
|
+
else if (plan.shouldRestorePosition && viewportTopPosition) {
|
|
778
|
+
// In spread mode, restore position by showing the correct page
|
|
779
|
+
const targetPage = viewportTopPosition.page;
|
|
780
|
+
if (slice.page !== targetPage && storeRef) {
|
|
781
|
+
storeRef.dispatch({ type: "SET_PAGE", page: targetPage });
|
|
782
|
+
}
|
|
783
|
+
// Reset scroll and try to restore position within the spread if it's scrollable
|
|
784
|
+
scrollArea.scrollLeft = 0;
|
|
785
|
+
const spreadIndex = findSpreadForPage(layoutState.spreads, targetPage);
|
|
786
|
+
const layout = layoutState.layouts[spreadIndex];
|
|
787
|
+
if (layout && layout.height > metrics.innerHeight && !viewportTopPosition.inSpacing) {
|
|
788
|
+
// Spread is larger than viewport and we have a content offset
|
|
789
|
+
// Calculate scroll position to show the same relative position
|
|
790
|
+
const spreadTopInContainer = getCenteredOffset(containerSize.height, layout.height);
|
|
791
|
+
const offsetPixels = viewportTopPosition.offset * layout.height;
|
|
792
|
+
scrollArea.scrollTop = Math.max(0, spreadTopInContainer + offsetPixels);
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
scrollArea.scrollTop = 0;
|
|
796
|
+
}
|
|
797
|
+
lastOverflowX = null;
|
|
798
|
+
lastOverflowY = null;
|
|
775
799
|
}
|
|
776
|
-
lastOverflowX = null;
|
|
777
|
-
lastOverflowY = null;
|
|
778
800
|
}
|
|
779
801
|
showSingleSpread(slice, metrics, layoutState);
|
|
780
802
|
}
|
|
781
803
|
updateOverflow(slice, metrics);
|
|
804
|
+
// Apply zoom anchor AFTER overflow is resolved, so that setting
|
|
805
|
+
// overflow to "hidden" (when content shrinks on zoom-out) doesn't
|
|
806
|
+
// reset the scroll position we're about to set.
|
|
807
|
+
if (slice.zoomAnchor) {
|
|
808
|
+
applyZoomAnchor(slice.zoomAnchor, metrics);
|
|
809
|
+
}
|
|
782
810
|
// Update tracked viewport position after layout is applied
|
|
783
811
|
updateViewportTopPosition(slice, layoutState);
|
|
812
|
+
// Clear zoom anchor after it has been consumed
|
|
813
|
+
if (slice.zoomAnchor && storeRef) {
|
|
814
|
+
storeRef.dispatch({ type: "CLEAR_ZOOM_ANCHOR" });
|
|
815
|
+
}
|
|
784
816
|
lastSlice = slice;
|
|
785
817
|
}
|
|
786
818
|
function updateOverflow(_slice, _metrics) {
|
|
@@ -946,6 +978,27 @@ export function createViewport(showAttribution = true) {
|
|
|
946
978
|
const maxScrollTop = Math.max(0, containerSize.height - metrics.innerHeight);
|
|
947
979
|
scrollArea.scrollTop = clamp(targetScrollTop, 0, maxScrollTop);
|
|
948
980
|
}
|
|
981
|
+
/**
|
|
982
|
+
* Adjusts scroll position after a zoom-tool click so that the clicked
|
|
983
|
+
* point in the document stays under the cursor.
|
|
984
|
+
*/
|
|
985
|
+
function applyZoomAnchor(anchor, metrics) {
|
|
986
|
+
const newScrollWidth = scrollArea.scrollWidth;
|
|
987
|
+
const newScrollHeight = scrollArea.scrollHeight;
|
|
988
|
+
if (anchor.scrollWidth === 0 || anchor.scrollHeight === 0)
|
|
989
|
+
return;
|
|
990
|
+
const scaleX = newScrollWidth / anchor.scrollWidth;
|
|
991
|
+
const scaleY = newScrollHeight / anchor.scrollHeight;
|
|
992
|
+
// The point under the cursor in the old scroll coordinate space
|
|
993
|
+
const pointX = anchor.scrollLeft + anchor.viewX * metrics.innerWidth;
|
|
994
|
+
const pointY = anchor.scrollTop + anchor.viewY * metrics.innerHeight;
|
|
995
|
+
// Where that same point is in the new scroll coordinate space
|
|
996
|
+
const newPointX = pointX * scaleX;
|
|
997
|
+
const newPointY = pointY * scaleY;
|
|
998
|
+
// Adjust scroll so the point stays under the cursor
|
|
999
|
+
scrollArea.scrollLeft = newPointX - anchor.viewX * metrics.innerWidth;
|
|
1000
|
+
scrollArea.scrollTop = newPointY - anchor.viewY * metrics.innerHeight;
|
|
1001
|
+
}
|
|
949
1002
|
function updateVisibleSpreads(slice, metrics, state) {
|
|
950
1003
|
if (!workerClient || !slice.docId)
|
|
951
1004
|
return;
|
|
@@ -954,12 +1007,20 @@ export function createViewport(showAttribution = true) {
|
|
|
954
1007
|
const scrollTop = scrollArea.scrollTop;
|
|
955
1008
|
const visibleRange = findVisibleSpreadRange(state.layouts, scrollTop, metrics.innerHeight, RENDER_BUFFER);
|
|
956
1009
|
const rangeChanged = visibleRange.start !== lastVisibleRange.start || visibleRange.end !== lastVisibleRange.end;
|
|
1010
|
+
const isContinuousView = slice.viewMode === "continuous";
|
|
1011
|
+
const contLayout = state.continuousLayout;
|
|
1012
|
+
const cropMode = isContinuousView
|
|
1013
|
+
? contLayout?.isGridLayout
|
|
1014
|
+
? "full"
|
|
1015
|
+
: "vertical"
|
|
1016
|
+
: "none";
|
|
957
1017
|
const layoutOptions = {
|
|
958
1018
|
pageInfos: slice.pageInfos,
|
|
959
1019
|
scale: state.scale,
|
|
960
1020
|
dpi: slice.dpi,
|
|
961
1021
|
rotation: slice.pageRotation,
|
|
962
1022
|
pageSpacing: slice.pageSpacing,
|
|
1023
|
+
cropMode,
|
|
963
1024
|
};
|
|
964
1025
|
if (layoutDirty || rangeChanged) {
|
|
965
1026
|
for (const [index, spread] of spreadComponents) {
|
|
@@ -986,16 +1047,52 @@ export function createViewport(showAttribution = true) {
|
|
|
986
1047
|
}
|
|
987
1048
|
spreadComp.updateLayout(layoutOptions);
|
|
988
1049
|
// Set spread position and dimensions from layout.
|
|
989
|
-
// Layout values are pre-snapped with cumulative consistency.
|
|
990
|
-
// Use left:0 + right:0 instead of explicit width so the spread
|
|
991
|
-
// fills the container via CSS (responds to resize without JS lag).
|
|
992
1050
|
const spreadEl = spreadComp.getElement();
|
|
993
1051
|
spreadEl.style.position = "absolute";
|
|
994
1052
|
spreadEl.style.top = `${layout.top}px`;
|
|
995
1053
|
spreadEl.style.height = `${layout.height}px`;
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
1054
|
+
if (isContinuousView && contLayout?.isGridLayout) {
|
|
1055
|
+
// Grid continuous (XLSX): position using left offset from row layout
|
|
1056
|
+
const pageIndex = layout.slots[0] ? layout.slots[0] - 1 : i;
|
|
1057
|
+
const rowLayout = contLayout.rowLayouts.find((r) => r.pages.some((p) => p.pageIndex === pageIndex));
|
|
1058
|
+
const pageDef = rowLayout?.pages.find((p) => p.pageIndex === pageIndex);
|
|
1059
|
+
if (pageDef) {
|
|
1060
|
+
spreadEl.style.left = `${pageDef.left}px`;
|
|
1061
|
+
spreadEl.style.width = `${pageDef.width}px`;
|
|
1062
|
+
spreadEl.style.right = "";
|
|
1063
|
+
}
|
|
1064
|
+
else {
|
|
1065
|
+
spreadEl.style.left = "0px";
|
|
1066
|
+
spreadEl.style.right = "0px";
|
|
1067
|
+
spreadEl.style.width = "";
|
|
1068
|
+
}
|
|
1069
|
+
// No centering in grid mode — content is flush to left
|
|
1070
|
+
spreadEl.style.justifyContent = "flex-start";
|
|
1071
|
+
// Mark last-col / last-row for stitch line hiding
|
|
1072
|
+
const isLastCol = pageDef ? pageDef.col === contLayout.columnWidths.length - 1 : false;
|
|
1073
|
+
const isLastRow = rowLayout
|
|
1074
|
+
? rowLayout.row === contLayout.rowLayouts[contLayout.rowLayouts.length - 1].row
|
|
1075
|
+
: false;
|
|
1076
|
+
spreadEl.classList.toggle("udoc-spread--last-col", isLastCol);
|
|
1077
|
+
spreadEl.classList.toggle("udoc-spread--last-row", isLastRow);
|
|
1078
|
+
}
|
|
1079
|
+
else if (isContinuousView) {
|
|
1080
|
+
// Linear continuous: center, single column = always last col
|
|
1081
|
+
spreadEl.style.left = "0px";
|
|
1082
|
+
spreadEl.style.right = "0px";
|
|
1083
|
+
spreadEl.style.width = "";
|
|
1084
|
+
spreadEl.style.justifyContent = "";
|
|
1085
|
+
spreadEl.classList.add("udoc-spread--last-col");
|
|
1086
|
+
spreadEl.classList.toggle("udoc-spread--last-row", i === state.layouts.length - 1);
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
// Paged mode
|
|
1090
|
+
spreadEl.style.left = "0px";
|
|
1091
|
+
spreadEl.style.right = "0px";
|
|
1092
|
+
spreadEl.style.width = "";
|
|
1093
|
+
spreadEl.style.justifyContent = "";
|
|
1094
|
+
spreadEl.classList.remove("udoc-spread--last-col", "udoc-spread--last-row");
|
|
1095
|
+
}
|
|
999
1096
|
spreadEl.style.transform = "none";
|
|
1000
1097
|
// Skip render during resize animation (renders debounced separately)
|
|
1001
1098
|
if (!rendersPaused) {
|
|
@@ -1450,6 +1547,7 @@ function selectViewport(state) {
|
|
|
1450
1547
|
page: state.page,
|
|
1451
1548
|
pageCount: state.pageCount,
|
|
1452
1549
|
pageInfos: state.pageInfos,
|
|
1550
|
+
viewMode: state.viewMode,
|
|
1453
1551
|
scrollMode: state.scrollMode,
|
|
1454
1552
|
layoutMode: state.layoutMode,
|
|
1455
1553
|
zoomMode: state.zoomMode,
|
|
@@ -1464,6 +1562,7 @@ function selectViewport(state) {
|
|
|
1464
1562
|
pageText: state.pageText,
|
|
1465
1563
|
searchMatches: state.searchMatches,
|
|
1466
1564
|
searchActiveIndex: state.searchActiveIndex,
|
|
1565
|
+
zoomAnchor: state.zoomAnchor,
|
|
1467
1566
|
};
|
|
1468
1567
|
}
|
|
1469
1568
|
//# sourceMappingURL=Viewport.js.map
|