diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index 3b4d275..7ad5f6d 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -44,18 +44,23 @@ const zoomSteps = [0.5, 0.75, 1, 1.25, 1.5, 2, 3] /** * Stufenweite für **stufenloses** Zoomen: Finger und Mausrad gehen in - * Zehnteln, nicht auf der Leiter der Knöpfe. + * Zwanzigsteln, nicht auf der Leiter der Knöpfe. * * Der Unterschied ist gewollt. Ein Klick soll etwas bewegen – von 100 auf - * 110 % zu springen wäre ein Knopf, den man fünfmal drückt. Eine Geste + * 105 % zu springen wäre ein Knopf, den man zehnmal drückt. Eine Geste * dagegen ist ein Regler: Dort sind Viertelsprünge zu grob, man schießt über * die Größe hinaus, die man eigentlich wollte. * * Multiplikativ statt in festen Prozentpunkten, weil Zoomen relativ ist: Von - * 50 auf 60 % ist ein Fünftel mehr, von 300 auf 310 % ein Dreißigstel. Zehn + * 50 auf 55 % ist ein Zehntel mehr, von 300 auf 305 % ein Sechzigstel. Fünf * Prozent *vom aktuellen Wert* fühlen sich überall gleich an. + * + * **Achtung beim Ablesen:** Die angezeigte Zahl springt deshalb nicht um + * feste fünf Punkte. Bei 65 % sind fünf Prozent gut drei Punkte, bei 200 % + * sind es zehn. Erst 1,1 war zu grob (gemessen bei 65 % ein Sprung von sieben + * Punkten, kurz darauf von elf). */ -const zoomFactor = 1.1 +const zoomFactor = 1.05 const minScale = 0.25 const maxScale = 4 @@ -710,12 +715,15 @@ export default function PdfViewer({ url, fileId, searchTerm }: Props) { * einem Finger bleibt erlaubt), und dieser Zuhörer setzt an ihre Stelle * unsere Stufen. * - * **In Zehnteln, nicht stufenlos.** Jede Zwischengröße hieße, alle - * sichtbaren Seiten neu zu zeichnen – auf einem Telefon Dutzende Male - * während einer einzigen Geste. Der Zoom rastet deshalb auf Zehntel des - * aktuellen Werts, sobald der Fingerabstand um acht Prozent gewachsen oder - * um sieben geschrumpft ist. Danach zählt der neue Abstand als Anfang, eine - * lange Geste geht also über mehrere Stufen weiter. + * **In Zwanzigsteln, nicht stufenlos.** Der Zoom rastet auf fünf Prozent + * des aktuellen Werts, sobald der Fingerabstand um ebenso viel gewachsen + * oder geschrumpft ist. Danach zählt der neue Abstand als Anfang, eine + * lange Geste geht also über viele Stufen weiter. + * + * Dass daraus keine Ruckelei wird, liegt nicht an dieser Stelle: Die + * Zeichenschleife bricht eine laufende Darstellung ab, sobald sich der + * Maßstab ändert. Von zwanzig Stufen einer Geste wird also nur die letzte + * fertig gemalt. * * Die Leiter der Knöpfe (0,5 / 0,75 / 1 / …) wäre hier zu grob: Ein * Viertelsprung schießt über die Größe hinaus, die man mit den Fingern @@ -742,7 +750,10 @@ export default function PdfViewer({ url, fileId, searchTerm }: Props) { e.preventDefault() const now = distance(e.touches) const ratio = now / base - const dir: 1 | -1 | 0 = ratio > 1.08 ? 1 : ratio < 0.93 ? -1 : 0 + // Die Schwelle folgt der Stufenweite: Wandern die Finger um eine + // Stufe auseinander, gibt es eine Stufe. Bliebe sie größer, ließe sich + // die feinere Weite gar nicht mehr treffen. + const dir: 1 | -1 | 0 = ratio > 1.04 ? 1 : ratio < 0.96 ? -1 : 0 if (!dir) return pinchBase.current = now const root2 = scrollRef.current