Changeset fbacddc in Klonkt


Ignore:
Timestamp:
08/24/2026 07:21:48 AM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
b4af6f3
Parents:
5e72413
Message:

Lezen: de snap op touch beoordeelde de loslaatplek, niet de landing

Op mobiel snapte er helemaal niets meer, terwijl desktop goed staat. De
oorzaak is meetbaar in de vendor-bron: lenis geeft 'virtual-scroll' door met
de RUWE vingerdelta voordat hij de uitloop uitrekent, en lenis-snap negeert
elke touchmove en beoordeelt dus een keer per gebaar, op touchend, met
scroll + rawDelta -- de plek waar je vinger losliet. De uitloop draagt daarna
nog honderden pixels verder (exponent 2.2), dus de beslissing viel op een
positie die de scroll meteen verlaat. Op desktop klopt dezelfde som wel:
wieldelta's zijn klein en de smoothWheel-uitloop is kort.

Op touch gaat de module-trigger er nu af en beoordelen we zelf tegen
lenis.targetScroll -- synchroon gezet bij touchend, en het exacte
landingspunt van de uitloop. Zelfde regels als op desktop: alleen omlaag,
alleen punten voorbij het loslaatpunt, vangzone 12%. Landt de uitloop net
voorbij een bovenkant, dan is het stukje terug naar die lijn de gevraagde
snap; punten achter het loslaatpunt blijven uitgesloten, dus een lang bericht
in scrollen trekt nog steeds niet terug.

MOD_V naar 56. Onderweg stond hij even op 51 terwijl 55 al uitgeserveerd was;
een verlaagde cache-buster serveert oudere modules aan wie al geweest is, dus
altijd alleen omhoog.

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

Location:
src
Files:
2 edited

Legend:

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

    r5e72413 rfbacddc  
    448448    if (punten[vooruit].value - nu <= vangZone()) echtGaNaar(vooruit);
    449449  };
     450
     451  // OP TOUCH DOET DE MODULE-EIGEN TRIGGER HET NIET, en dat is meetbaar in de
     452  // vendor-bron, geen vermoeden. Drie feiten op een rij:
     453  //
     454  //   1. lenis geeft 'virtual-scroll' door met de RUWE vingerdelta, VOOR hij
     455  //      de uitloop uitrekent (teken * |snelheid|^touchInertiaExponent).
     456  //   2. lenis-snap negeert elke touchmove en beoordeelt dus EEN keer per
     457  //      gebaar, op touchend, met `scroll + rawDelta` -- de plek waar je
     458  //      vinger LOSLIET.
     459  //   3. de uitloop draagt daarna nog honderden pixels verder.
     460  //
     461  // De snapbeslissing valt dus op een positie die de scroll meteen verlaat.
     462  // Op desktop klopt dezelfde som wel: wieldelta's zijn klein en de
     463  // smoothWheel-uitloop is kort, dus voorspelling en landing liggen bijeen.
     464  // Vandaar: op touch de module-trigger eraf en zelf beoordelen tegen
     465  // lenis.targetScroll -- die wordt synchroon bij touchend gezet en IS het
     466  // exacte landingspunt van de uitloop.
     467  if (OP_TOUCH.matches) {
     468    lenis.off('virtual-scroll', snap.onSnapDebounced);
     469    let raakTimer = null;
     470    let vertrek = 0;   // scrollpositie bij loslaten: punten daarachter zijn
     471                       // de bovenkant van het HUIDIGE bericht, nooit grijpen
     472    lenis.on('virtual-scroll', (e) => {
     473      const soort = e.event && e.event.type;
     474      if (soort === 'touchstart' || soort === 'touchmove') { clearTimeout(raakTimer); return; }
     475      if (soort !== 'touchend') return;
     476      vertrek = lenis.scroll;
     477      clearTimeout(raakTimer);
     478      raakTimer = setTimeout(() => {
     479        if (!laatsteRichtingOmlaag) return;
     480        const doel = lenis.targetScroll;   // de echte landing, niet de raakdelta
     481        const punten = snap.computeSnaps();
     482        let best = -1;
     483        punten.forEach((punt, i) => {
     484          if (punt.value <= vertrek + 2) return;
     485          if (Math.abs(doel - punt.value) > vangZone()) return;
     486          if (best < 0 || Math.abs(doel - punt.value) < Math.abs(doel - punten[best].value)) best = i;
     487        });
     488        // Landt de uitloop net VOORBIJ een bovenkant, dan is een klein stukje
     489        // terug naar die lijn precies de gevraagde snap -- geen terugtrekking,
     490        // want punten achter het loslaatpunt zijn hierboven al uitgesloten.
     491        if (best >= 0) echtGaNaar(best);
     492      }, 150);
     493    });
     494  }
     495
    450496  // Native snappen uit: twee mechanismen op dezelfde scroller vechten.
    451497  document.documentElement.style.scrollSnapType = 'none';
  • src/views/shell.ejs

    r5e72413 rfbacddc  
    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 = 55;
     507  var MOD_V = 56;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.