- Timestamp:
- 08/24/2026 09:02:23 AM (2 weeks ago)
- Branches:
- main
- Children:
- d7d2ede
- Parents:
- cd7d7d8
- Location:
- src
- Files:
-
- 3 edited
-
assets/css/style.css (modified) (1 diff)
-
assets/js/mod/read.js (modified) (4 diffs)
-
views/shell.ejs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/assets/css/style.css
rcd7d7d8 r9a22776 2548 2548 2rem naar 4rem, dus deze ook. */ 2549 2549 scroll-margin-top: 4rem; 2550 /* NOOIT OVER EEN GRENS HEEN VLIEGEN. Dit is de regel van 24-8 -- "ook al2551 zou het target voorbijgescrolld worden, alsnog op het target landen" --2552 maar dan als eigenschap in plaats van als JavaScript: de browser mag een2553 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 deze2556 eigenschap is toen nooit geprobeerd: hij stond op `normal`, en dan ook2557 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 waar2560 Lenis het overneemt) verandert deze regel niets: er valt dan niets te2561 stoppen. Hij telt alleen mee tijdens de proef, zie nativeSnap() in2562 mod/read.js. */2563 scroll-snap-stop: always;2564 2550 } 2565 2551 /* HET LAATSTE BERICHT SNAPT OOK (Robin, 20-8). Dat kon eerst niet: zijn -
src/assets/js/mod/read.js
rcd7d7d8 r9a22776 252 252 const RUST_MS = 120; 253 253 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 zich258 * aan `scroll-snap-stop: always`? Die eigenschap zegt dat een uitloop nooit259 * over een snappunt heen mag vliegen -- en dat is woord voor woord Robins regel260 * ("ook al zou het target voorbijgescrolld worden, alsnog op het target261 * landen"), maar dan uitgevoerd door het toestel met zijn eigen momentumcurve262 * 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. De265 * eigenschap is toen nooit geprobeerd: hij stond op `normal`, en dan ook nog op266 * .read-post -- een element dat door scroll-snap-align:none helemaal geen267 * 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 vier271 * 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 staan275 * zolang het tabblad open is, want een htmx-navigatie gooit de queryreeks weg276 * en dan zou de proef na een klik voorbij zijn.277 */278 function 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 weg286 }287 }288 289 254 let bezig = false; // loopt er een gebaar of een uitloop? 290 255 let ooitGescrold = false; // snappen begint UIT, zie zetSnappen() … … 340 305 // zijn snap heeft zijn scroll-gebeurtenissen nodig om te kunnen timen. 341 306 if (lenis || !(OP_DESKTOP.matches || OP_TOUCH.matches)) return; 342 // Staat de proef aan, dan blijft Lenis van de telefoon af en doet de browser343 // het snappen zelf. Desktop merkt hier niets van: daar is OP_TOUCH onwaar.344 if (OP_TOUCH.matches && nativeSnap()) return;345 307 const [L, S] = await Promise.all([ 346 308 import(`/assets/vendor/lenis.mjs?v=${VENDOR_V}`), … … 581 543 // eerste gebaar naar beneden zet hem aan. 582 544 const el = document.documentElement; 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'; 545 const wil = aan ? '' : 'none'; 590 546 if (el.style.scrollSnapType !== wil) el.style.scrollSnapType = wil; 591 547 } … … 643 599 document.querySelectorAll('[data-lenis-prevent].read-post') 644 600 .forEach((a) => a.removeAttribute('data-lenis-prevent')); 645 646 // DE VLAG WORDT HIER GELEZEN, op elke pagina en in elke weergave, en niet pas647 // in startLenis(). Anders zit er een val in: land je in Grid, dan draait648 // startLenis() helemaal niet, wordt ?nativesnap=1 nergens opgeschreven, en is649 // de queryreeks weg zodra je op Lezen tikt. De proef gaat dan stilzwijgend650 // niet door en je beoordeelt Lenis terwijl je denkt dat je de browser651 // beoordeelt. Gemeten op dev: weergave 'grid', vlag null.652 // Dit mag boven de terugval hieronder staan omdat de module op elke pagina653 // draait (data-js is "chrome read tape"), ook waar geen leesstroom is.654 nativeSnap();655 601 656 602 const s = document.getElementById('read-stream'); -
src/views/shell.ejs
rcd7d7d8 r9a22776 222 222 223 223 <!-- v9 stylesheet (full palette system) --> 224 <link rel="stylesheet" href="/assets/css/style.css?v=1 09">224 <link rel="stylesheet" href="/assets/css/style.css?v=110"> 225 225 <script> 226 226 /* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in … … 505 505 // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig 506 506 // bumpen kost een bugfix die nooit aankomt. 507 var MOD_V = 6 1;507 var MOD_V = 62; 508 508 509 509 // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)