Changeset e46ebaa in Klonkt for src/views/shell.ejs


Ignore:
Timestamp:
08/20/2026 12:54:30 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
48481cd
Parents:
598f090
Message:

Lezen: snappen dat je laat lezen, en geen lege schermen meer

Barts meldingen van 20 augustus, in een stuk of zes rondes bijgesteld. De
uitkomst is korter dan de weg ernaartoe, en die weg is het waard om vast te
leggen omdat ik er twee keer overheen ben geschoten.

SNAPPEN. De regel is nu in drie zinnen te zeggen:

omhoog scrollen nooit snappen -- je zoekt iets terug en bepaalt zelf

waar je stopt

omlaag, ver weg vrij scrollen
omlaag, laatste
150px van een
bericht vangt, en je landt op de bovenkant van het volgende

Er is geen top-zone: de bovenkant van het bericht waar je IN zit is geen
doelwit meer. Dat was de oorspronkelijke klacht -- je las een paar regels
verder en proximity trok je terug naar de bovenrand, waardoor het leek of
het scrollen vastliep. De grens die wel vangt is de onderkant van je huidige
bericht, en dat is hetzelfde punt als de bovenkant van het volgende.

Onderweg twee doodlopende wegen, allebei door Robin gecorrigeerd:

  • Eerst zette ik de snap UIT voor berichten langer dan het scherm. Op een telefoon is bijna elk bericht net iets langer dan de viewport, dus daar verdween het snappen overal: op 812px hoog kregen berichten van 1009 en zelfs 839 al geen snap meer.
  • Toen probeerde ik de vangzone aan de VOET van het bericht te hangen ("ben je de reacties voorbij"). Bij een kort bericht staat die voet middenin de lege ruimte die min-height maakte, dus de zone begon op een willekeurige plek. Gelukkig ving Robin dat voordat het uitgerold stond.

Het moest dus een getal in pixels zijn, en 150 is dat getal.

GEEN LEGE SCHERMEN MEER. min-height:100svh rekte elk bericht op tot een vol
scherm. Bij een kort bericht gaf dat een halve pagina leegte onder "Replies
and reactions" -- je keek naar niets en moest doorscrollen om te ontdekken
dat er nog iets kwam. Weg dus: berichten hebben hun eigen hoogte (gemeten:
360/1009/839/250 waar het eerst 888/888/888/888 was) en de stroom is gewoon
bericht na bericht. Het snappen hangt aan scroll-snap-align en niet aan die
hoogte, dus dat werkt onveranderd.

VLOEIEND: scroll-behavior:smooth, want zonder dat springt een snap er in een
frame naartoe en voelt het als een hik. Uit bij prefers-reduced-motion.

TERUG NAAR BOVEN, rechtsonder, in twee stappen: eerst naar het begin van DIT
bericht, daarna pas naar de kop van de pagina. Die knop is de enige die naar
een bovenkant mag springen, en hij heeft het snappen daar niet voor nodig --
scrollIntoView stuurt zelf. Nagemeten, juist omdat omhoog-snappen uit staat:
1706 -> 1206, exact de bovenkant.

COVERS nemen de volle kolombreedte met de verhouding intact. De ronde ervoor
haalde het opblazen eruit maar liet kleine afbeeldingen op ware grootte
staan, en dat was als postzegel in een brede kolom te klein.

DE CIRKEL. Lezen blijft daar dood (berichten van anderen), maar een tijdlijn
werkt er juist bij uitstek. Die dwong ik eerst af zodra de site geen
Lezen-site was, en dan kon je in de cirkel geen Grid meer kiezen. Nu is Grid
de landing en staat Tijdlijn ernaast: bij feed_alt_view=timeline altijd, bij
auto op desktop. De cirkel krijgt zijn eigen geheugen terug, met een eigen
sleutel zodat een keuze daar je thuisweergave niet aanraakt.

style.css naar v77 en MOD_V naar 13.

Suite 1165/1165.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/shell.ejs

    r598f090 re46ebaa  
    222222
    223223<!-- v9 stylesheet (full palette system) -->
    224 <link rel="stylesheet" href="/assets/css/style.css?v=72">
     224<link rel="stylesheet" href="/assets/css/style.css?v=77">
    225225<script>
    226226/* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
     
    345345</head>
    346346
    347 <body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-js="chrome<%= (typeof pageJs !== 'undefined' && pageJs) ? ' ' + pageJs : '' %>" data-feed-view="<%- _e(safeSite.feed_view_default === 'grid' ? 'grid' : 'reader') %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>">
     347<body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-js="chrome<%= (typeof pageJs !== 'undefined' && pageJs) ? ' ' + pageJs : '' %>" data-feed-view="<%- _e(safeSite.feed_view_default === 'grid' ? 'grid' : (["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader")) %>" data-feed-alt="<%- _e(["timeline","auto"].indexOf(safeSite.feed_alt_view) >= 0 ? safeSite.feed_alt_view : "reader") %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>">
    348348
    349349<% if (typeof isViewer !== 'undefined' && isViewer) { %>
     
    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 = 4;
     507  var MOD_V = 13;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
     
    559559  // 'pcms-feed-view' en wordt hier nergens geschreven, zodat je thuiskomt in de
    560560  // weergave die je achterliet.
     561  var CIRKEL_SLEUTEL = 'pcms-cirkel-view';
    561562  function opCirkel() { return body.classList.contains('on-cirkel'); }
    562563
     
    565566    try {
    566567      if (opCirkel()) {
    567         body.dataset.feedView = 'grid';   // de enige mogelijkheid daar
     568        // Lezen kan hier niet -- dat zijn berichten van ANDEREN, van hun servers,
     569        // en "het hele stuk" hebben wij niet in handen. De knop staat er wel maar
     570        // dood. Een TIJDLIJN kan hier juist bij uitstek: dat is de natuurlijke
     571        // vorm van een cirkel.
     572        //
     573        // Beschikbaar, niet verplicht. Dit dwong eerst 'timeline' af zodra de
     574        // site geen Lezen-site was, en dan kon je in de cirkel geen Grid meer
     575        // kiezen. Nu is Grid de landing en is Tijdlijn een keuze ernaast.
     576        var altC = body.dataset.feedAlt || 'reader';
     577        var tijdlijnHier = altC === 'timeline'
     578          || (altC === 'auto' && window.matchMedia('(min-width: 768px)').matches);
     579        var magC = tijdlijnHier ? ['grid', 'timeline'] : ['grid'];
     580        // Een EIGEN geheugen, en niet dat van solo. Twee redenen: hier kun je
     581        // alleen uit Grid en Tijdlijn kiezen, dus een solo-keuze 'reader' zegt
     582        // hier niets; en andersom mag een tuimeling hier je thuisweergave niet
     583        // veranderen -- dan kom je thuis in iets anders dan je achterliet.
     584        // (Dit geheugen stond er eerder al, verdween toen de cirkel nog maar een
     585        // mogelijkheid had, en is nu weer nodig omdat Tijdlijn een echte keuze is.)
     586        var vC = null;
     587        try { vC = localStorage.getItem(CIRKEL_SLEUTEL); } catch (e) { /* geen opslag */ }
     588        body.dataset.feedView = magC.indexOf(vC) >= 0 ? vC : 'grid';
    568589        return;
    569590      }
    570591      var v = localStorage.getItem('pcms-feed-view');
    571       // 'timeline' bestaat niet meer als keuze, maar staat nog in de localStorage
    572       // van iedereen die hier eerder was. Zonder deze vertaling zou zo iemand een
    573       // weergave houden die nergens meer een knop heeft: de pil helemaal grijs, en
    574       // een feed die niet is wat hij koos. Lezen is waar Tijdlijn in opging.
    575       if (v === 'timeline') v = 'reader';
    576       if (v === 'grid' || v === 'reader') body.dataset.feedView = v;
     592      // 'timeline' is sinds 20-8 weer een geldige keuze, maar alleen op een site
     593      // die hem AANBIEDT. Wie de tijdlijn koos op de ene site en daarna een
     594      // Lezen-site bezoekt, moet daar niet op een weergave landen die er geen
     595      // knop heeft: dan staat de pil grijs en is de feed niet wat hij koos.
     596      // Vandaar de toets tegen wat deze site biedt, in plaats van een vaste
     597      // vertaling naar 'reader'.
     598      var alt = body.dataset.feedAlt || 'reader';
     599      var mag = alt === 'auto' ? ['grid', 'reader', 'timeline'] : ['grid', alt];
     600      if (mag.indexOf(v) >= 0) body.dataset.feedView = v;
    577601    } catch (e) { /* geen opslag: de server-standaard blijft staan */ }
    578602  }
     
    647671      // veranderen: die moet je terugvinden zoals je hem achterliet.
    648672      try {
    649         if (!opCirkel()) localStorage.setItem('pcms-feed-view', view);
     673        // De cirkel heeft zijn eigen geheugen, zodat een keuze daar je
     674        // thuisweergave niet aanraakt en andersom.
     675        if (opCirkel()) localStorage.setItem(CIRKEL_SLEUTEL, view);
     676        else localStorage.setItem('pcms-feed-view', view);
    650677      } catch(_) {}
    651678      syncAria();
Note: See TracChangeset for help on using the changeset viewer.