Changeset aaa700e in Klonkt for src


Ignore:
Timestamp:
08/24/2026 08:29:13 AM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
a1882e5
Parents:
7b03c35
Message:

Lezen op mobiel: proef met het native snappen, achter een vlag

De vraag die deze proef beantwoordt is er precies een: houdt de browser zich
aan scroll-snap-stop: always? Die eigenschap zegt dat een uitloop nooit over
een snappunt heen mag vliegen, en dat is woord voor woord de regel van 24-8
(voorbijgescrolld of niet, je landt op het target) maar dan uitgevoerd door
het toestel met zijn eigen momentumcurve.

Dat overvliegen was destijds de reden om Lenis op mobiel erbij te halen, en
de eigenschap is toen nooit geprobeerd: hij stond op normal, en dan ook nog
op .read-post, een element dat door scroll-snap-align:none helemaal geen
snappunt is. Het ankertje dat het snappunt WEL is had hem niet.

Achter ?nativesnap=1 (en =0 om terug te gaan), onthouden in sessionStorage
omdat een htmx-navigatie de queryreeks weggooit. Staat de vlag aan, dan
blijft Lenis van de telefoon af en snapt de browser zelf. Standaard verandert
er dus niets, voor niemand, en de Lenis-kant blijft heel tot de proef gewonnen
is.

Een detail dat anders stil zou blijven staan: zetSnappen() zette het snappen
"aan" door de inline stijl leeg te maken, oftewel terugvallen op de
stylesheet. Die zet het op mobiel juist uit. Zonder Lenis zou het snappen
daarmee nooit aangaan; nu staat er expliciet 'y proximity'. Op desktop is dat
exact wat de stylesheet daar al geeft.

MOD_V 60 en style.css v=109, want beide bestanden wijzigen.

Location:
src
Files:
3 edited

Legend:

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

    r7b03c35 raaa700e  
    25482548       2rem naar 4rem, dus deze ook. */
    25492549    scroll-margin-top: 4rem;
     2550    /* NOOIT OVER EEN GRENS HEEN VLIEGEN. Dit is de regel van 24-8 -- "ook al
     2551       zou het target voorbijgescrolld worden, alsnog op het target landen" --
     2552       maar dan als eigenschap in plaats van als JavaScript: de browser mag een
     2553       uitloop niet over dit snappunt heen laten gaan, hoe hard je ook veegt.
     2554       Een veeg komt daarmee altijd precies EEN bericht verder, nooit twee.
     2555       Dat overvliegen was de reden om Lenis op mobiel erbij te halen, en deze
     2556       eigenschap is toen nooit geprobeerd: hij stond op `normal`, en dan ook
     2557       nog op .read-post hierboven -- een element dat door scroll-snap-align:
     2558       none helemaal geen snappunt is, dus daar deed hij sowieso niets.
     2559       Zonder native snappen (de gewone stand op mobiel, en op desktop waar
     2560       Lenis het overneemt) verandert deze regel niets: er valt dan niets te
     2561       stoppen. Hij telt alleen mee tijdens de proef, zie nativeSnap() in
     2562       mod/read.js. */
     2563    scroll-snap-stop: always;
    25502564}
    25512565/* HET LAATSTE BERICHT SNAPT OOK (Robin, 20-8). Dat kon eerst niet: zijn
  • src/assets/js/mod/read.js

    r7b03c35 raaa700e  
    252252const RUST_MS = 120;
    253253
     254/**
     255 * DE PROEF: op mobiel het NATIVE snappen terug (24-8).
     256 *
     257 * De vraag die deze vlag beantwoordt is er precies een: houdt de browser zich
     258 * aan `scroll-snap-stop: always`? Die eigenschap zegt dat een uitloop nooit
     259 * over een snappunt heen mag vliegen -- en dat is woord voor woord Robins regel
     260 * ("ook al zou het target voorbijgescrolld worden, alsnog op het target
     261 * landen"), maar dan uitgevoerd door het toestel met zijn eigen momentumcurve
     262 * in plaats van door onze nabootsing ervan in JavaScript.
     263 *
     264 * Dat overvliegen was destijds de reden om Lenis er op mobiel bij te halen. De
     265 * eigenschap is toen nooit geprobeerd: hij stond op `normal`, en dan ook nog op
     266 * .read-post -- een element dat door scroll-snap-align:none helemaal geen
     267 * snappunt is. Het ankertje dat het snappunt WEL is had hem niet.
     268 *
     269 * ACHTER EEN VLAG, want de Lenis-kant blijft staan tot deze proef gewonnen is.
     270 * Wint hij, dan kan Lenis van de telefoon af en verdwijnen daarmee ook de vier
     271 * routes waarlangs de native scroll het gebaar nu soms overneemt. Verliest hij,
     272 * dan hebben we dat geweten voordat er iets weg was.
     273 *
     274 * ?nativesnap=1 zet hem aan, ?nativesnap=0 weer uit. De keuze blijft staan
     275 * zolang het tabblad open is, want een htmx-navigatie gooit de queryreeks weg
     276 * en dan zou de proef na een klik voorbij zijn.
     277 */
     278function nativeSnap() {
     279  try {
     280    const q = new URLSearchParams(location.search).get('nativesnap');
     281    if (q === '1') sessionStorage.setItem('klonkt:native-snap', '1');
     282    if (q === '0') sessionStorage.removeItem('klonkt:native-snap');
     283    return sessionStorage.getItem('klonkt:native-snap') === '1';
     284  } catch (e) {
     285    return false;   // privémodus zonder opslag: gewoon de gewone weg
     286  }
     287}
     288
    254289let bezig = false;          // loopt er een gebaar of een uitloop?
    255290let ooitGescrold = false;   // snappen begint UIT, zie zetSnappen()
     
    305340  // zijn snap heeft zijn scroll-gebeurtenissen nodig om te kunnen timen.
    306341  if (lenis || !(OP_DESKTOP.matches || OP_TOUCH.matches)) return;
     342  // Staat de proef aan, dan blijft Lenis van de telefoon af en doet de browser
     343  // het snappen zelf. Desktop merkt hier niets van: daar is OP_TOUCH onwaar.
     344  if (OP_TOUCH.matches && nativeSnap()) return;
    307345  const [L, S] = await Promise.all([
    308346    import(`/assets/vendor/lenis.mjs?v=${VENDOR_V}`),
     
    543581  // eerste gebaar naar beneden zet hem aan.
    544582  const el = document.documentElement;
    545   const wil = aan ? '' : 'none';
     583  // EXPLICIET 'y proximity', geen lege waarde. Leeg betekent "val terug op de
     584  // stylesheet", en die zet het snappen op mobiel juist UIT (de mediaquery bij
     585  // .read-post, want twee snapsystemen op dezelfde scroller vechten). Zolang
     586  // Lenis daar draaide klopte dat; zonder Lenis zou het snappen dan nooit meer
     587  // aangaan en zou de proef niets kunnen bewijzen.
     588  // Op desktop verandert er niets: dit is exact wat de stylesheet daar geeft.
     589  const wil = aan ? 'y proximity' : 'none';
    546590  if (el.style.scrollSnapType !== wil) el.style.scrollSnapType = wil;
    547591}
  • src/views/shell.ejs

    r7b03c35 raaa700e  
    222222
    223223<!-- v9 stylesheet (full palette system) -->
    224 <link rel="stylesheet" href="/assets/css/style.css?v=108">
     224<link rel="stylesheet" href="/assets/css/style.css?v=109">
    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 = 59;
     507  var MOD_V = 60;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.