Changeset d9f60f4 in Klonkt


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@…>

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/style.css

    r96a99bf rd9f60f4  
    25102510    margin: 0 auto;
    25112511    /* De onderrand loopt achter de vaste tabbalk door; deze padding houdt de
    2512        TEKST erboven. */
    2513     padding: 2rem 1.2rem 4rem;
     2512       TEKST erboven. De BOVENmarge is verdubbeld (Robin, 21-8: 2rem -> 4rem):
     2513       na een snap staat de scheidingslijn op de bovenrand, en de tekst
     2514       daaronder krijgt meer lucht. MOET GELIJK BLIJVEN aan scroll-margin-top
     2515       op .read-anker hieronder -- lopen die uit elkaar, dan landt de lijn niet
     2516       meer precies op de bovenrand. */
     2517    padding: 4rem 1.2rem 4rem;
    25142518    box-sizing: border-box;
    25152519}
     
    25362540    height: 0;
    25372541    scroll-snap-align: start;
    2538     /* Het anker staat BINNEN de padding van het artikel, dus 2rem onder de
    2539        streep. Zonder deze correctie landt de snap 32px te laag en staat de
    2540        scheidingslijn net boven beeld -- gemeten: 733 waar 700 hoort.
     2542    /* Het anker staat BINNEN de padding van het artikel, dus een padding-top
     2543       onder de streep. Zonder deze correctie landt de snap net zoveel te laag
     2544       en staat de scheidingslijn boven beeld -- gemeten: 733 waar 700 hoort.
    25412545       scroll-margin verschuift alleen het SNAPPUNT en niet de opmaak, dus het
    25422546       anker blijft waar het staat en de uitlijning klopt met de lijn.
    2543        Blijft in de pas met de padding-top van .read-post hierboven. */
    2544     scroll-margin-top: 2rem;
     2547       GELIJK aan de padding-top van .read-post hierboven; die ging 21-8 van
     2548       2rem naar 4rem, dus deze ook. */
     2549    scroll-margin-top: 4rem;
    25452550}
    25462551/* HET LAATSTE BERICHT SNAPT OOK (Robin, 21-8). Dat kon eerst niet: zijn
  • 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.
  • src/views/shell.ejs

    r96a99bf rd9f60f4  
    222222
    223223<!-- v9 stylesheet (full palette system) -->
    224 <link rel="stylesheet" href="/assets/css/style.css?v=104">
     224<link rel="stylesheet" href="/assets/css/style.css?v=105">
    225225<script>
    226226/* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
     
    505505  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    506506  // bumpen kost een bugfix die nooit aankomt.
    507   var MOD_V = 47;
     507  var MOD_V = 48;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.