From 43b5199bff06d0e4f4ffe598c8f96f8e54b73326 Mon Sep 17 00:00:00 2001 From: ZXY101 Date: Sat, 23 Sep 2023 09:07:35 +0200 Subject: [PATCH] Mobile bounds test --- .../components/Settings/ReaderToggles.svelte | 3 +- src/lib/panzoom/util.ts | 57 +++++++++++++++++++ src/lib/settings/index.ts | 2 + 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/lib/components/Settings/ReaderToggles.svelte b/src/lib/components/Settings/ReaderToggles.svelte index df2d22a..d725620 100644 --- a/src/lib/components/Settings/ReaderToggles.svelte +++ b/src/lib/components/Settings/ReaderToggles.svelte @@ -10,7 +10,8 @@ { key: 'textBoxBorders', text: 'Text box borders', value: $settings.textBoxBorders }, { key: 'displayOCR', text: 'OCR enabled', value: $settings.displayOCR }, { key: 'boldFont', text: 'Bold font', value: $settings.boldFont }, - { key: 'pageNum', text: 'Show page number', value: $settings.pageNum } + { key: 'pageNum', text: 'Show page number', value: $settings.pageNum }, + { key: 'mobile', text: 'Mobile', value: $settings.mobile } ] as { key: SettingsKey; text: string; value: any }[]; diff --git a/src/lib/panzoom/util.ts b/src/lib/panzoom/util.ts index a7bb822..225088d 100644 --- a/src/lib/panzoom/util.ts +++ b/src/lib/panzoom/util.ts @@ -38,6 +38,10 @@ export function initPanzoom(node: HTMLElement) { }); panzoomStore.set(pz); + + + pz.on('pan', () => keepInBounds()) + pz.on('zoom', () => keepInBounds()) } type PanX = 'left' | 'center' | 'right'; @@ -135,3 +139,56 @@ export function zoomDefault() { return; } } + +export function keepInBounds() { + if (!pz || !container) { + return + } + + const { mobile } = get(settings) + + if (!mobile) { + return + } + + const transform = pz.getTransform(); + + const { x, y, scale } = transform; + const { innerWidth, innerHeight } = window + + const width = container.offsetWidth * scale; + const height = container.offsetHeight * scale; + + const marginX = innerWidth * 0.01; + const marginY = innerHeight * 0.01; + + let minX = innerWidth - width - marginX; + let maxX = marginX; + let minY = innerHeight - height - marginY; + let maxY = marginY; + + if (width + 2 * marginX <= innerWidth) { + minX = marginX; + maxX = innerWidth - width - marginX; + } + + if (height + 2 * marginY <= innerHeight) { + minY = marginY; + maxY = innerHeight - height - marginY; + } + + if (x < minX) { + transform.x = minX; + + } + if (x > maxX) { + transform.x = maxX; + } + + if (y < minY) { + transform.y = minY; + } + if (y > maxY) { + transform.y = maxY; + } +} \ No newline at end of file diff --git a/src/lib/settings/index.ts b/src/lib/settings/index.ts index d1d21bf..89d581a 100644 --- a/src/lib/settings/index.ts +++ b/src/lib/settings/index.ts @@ -34,6 +34,7 @@ export type Settings = { boldFont: boolean; pageNum: boolean; hasCover: boolean; + mobile: boolean; backgroundColor: string; fontSize: FontSize; zoomDefault: ZoomModes; @@ -63,6 +64,7 @@ const defaultSettings: Settings = { textBoxBorders: false, boldFont: false, pageNum: true, + mobile: false, backgroundColor: '#0d0d0f', fontSize: 'auto', zoomDefault: 'zoomFitToScreen',