Changeset d9f60f4 in Klonkt for src/assets/js/mod/read.js


Ignore:
Timestamp:
08/20/2026 11:12:07 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
3ccca13
Parents:
96a99bf
Message:

Reader: only snap forward, and give posts twice the top margin

Top margin doubled (2rem -> 4rem on .read-post, with .read-anker's
scroll-margin-top kept in lockstep so the separator line still lands
exactly on the top edge after a snap — that line is the whole point).

Snapping now obeys one rule: only while scrolling DOWN, only to a point
still AHEAD, only within the catch zone. A post you already scrolled
into is never pulled back. Fixes a real bug on the way: the catch zone
was compared as the string '55%' against a number, so the forward
fallback never fired — it is a computed number now. Direction comes
from remembering the last non-zero velocity, because lenis' own
direction is already zero by the time the debounced snap fires.

Co-Authored-By: Claude Fable 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/read.js

    r96a99bf rd9f60f4  
    413413  // kandidaat beoordeelt: zonder deze omleiding houdt de zone vooruit op bij de
    414414  // helft van de afstand tussen twee berichten, hoe groot je de drempel ook zet.
     415  //
     416  // DE REGEL, in Robins woorden (21-8): "enkel bij downscrollen, aan de
     417  // onderkant van elke post, snappen naar de lijn tussen de posts" -- en geen
     418  // snap op een bericht dat al voorbij is gescrold. Drie voorwaarden dus:
     419  //   1. de laatste echte beweging ging omlaag,
     420  //   2. het doel ligt VOOR je (een punt achter je slaan we over),
     421  //   3. het ligt binnen de vangzone -- die begint rond de voet van het bericht.
     422  // Het doel zelf blijft de bovenkant van het volgende bericht: dat IS de lijn
     423  // ertussen, en dat is het essentiële.
     424  //
     425  // DE ZONE IS EEN GETAL, geen '55%'. Die string kwam ongewijzigd uit de opties
     426  // en werd hier met een getal vergeleken -- altijd onwaar, dus deze terugval
     427  // heeft nooit gewerkt en alleen het doel dat lenis zelf koos kwam erdoor.
     428  const vangZone = () => 0.55 * window.innerHeight;
     429  // Lenis' eigen `direction` is het teken van de snelheid, en die is bij het
     430  // afvuren van de (gedebouncede) snap alweer nul. Daarom onthouden we de
     431  // laatste richting die er echt was.
     432  let laatsteRichtingOmlaag = true;
     433  lenis.on('scroll', () => {
     434    if (Math.abs(lenis.velocity) > 0.05) laatsteRichtingOmlaag = lenis.velocity > 0;
     435  });
    415436  const echtGaNaar = snap.goTo.bind(snap);
    416437  snap.goTo = (index) => {
     438    if (!laatsteRichtingOmlaag) return;   // omhoog: nooit vangen
    417439    const punten = snap.computeSnaps();   // zelfde volgorde als goTo intern gebruikt
    418440    const nu = lenis.scroll;
    419     const doel = punten[index];
    420     if (doel && doel.value > nu + 2) { echtGaNaar(index); return; }
    421441    let vooruit = -1;
    422442    punten.forEach((punt, i) => {
    423443      if (punt.value > nu + 2 && (vooruit < 0 || punt.value < punten[vooruit].value)) vooruit = i;
    424444    });
    425     if (vooruit < 0) return;
    426     if (punten[vooruit].value - nu <= snap.distanceThreshold) echtGaNaar(vooruit);
     445    if (vooruit < 0) return;              // niets meer voor je: vrij uitscrollen
     446    if (punten[vooruit].value - nu <= vangZone()) echtGaNaar(vooruit);
    427447  };
    428448  // Native snappen uit: twee mechanismen op dezelfde scroller vechten.
Note: See TracChangeset for help on using the changeset viewer.