Changeset b67edbd in Klonkt


Ignore:
Timestamp:
08/18/2026 06:47:58 PM (3 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
7421147
Parents:
9622f20
git-author:
Bart <bart@…> (08/18/2026 12:19:20 AM)
git-committer:
Bart <bart@…> (08/18/2026 06:47:58 PM)
Message:

Leesweergave: /read, en fragmenten in de richting van de scroll

De vorige opzet sprong naar het andere uiteinde van de scroll en schoof het
bericht daarna "vloeiend" in beeld -- de truc van PrutCMS, en een die je voelt.
Nu groeit de stroom gewoon: een schildwacht boven en onder het laatste bericht
haalt het volgende of vorige fragment op en zet het erbij. Bij invoegen BOVEN
wordt de ingevoegde hoogte gemeten en met scrollBy gecompenseerd, anders
verspringt de tekst onder je duim.

De grens tussen berichten is CSS, geen JavaScript: scroll-snap-type: y proximity
op de stroom, scroll-snap-align: start per bericht. Proximity en niet mandatory,
want binnen een lang bericht moet je vrij kunnen scrollen.

En het heet read, niet lees: een pad is geen plek voor een Nederlandse
werkwoordsvorm.

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

Location:
src
Files:
3 added
2 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/posts.js

    r9622f20 rb67edbd  
    149149  'authorize_interaction', 'fediverse', 'news', 'following', 'notifications', 'blocking',
    150150  'paid', 'push', 'guardian',
    151   // De meeslepende tijdlijn (Barts idee, naar bartoverkamp.nl). Gereserveerd
     151  // De meeslepende leesweergave. Gereserveerd
    152152  // omdat een bericht met deze slug de route anders zou overschaduwen.
    153   'lees',
     153  'read',
    154154]);
    155155
     
    264264//
    265265// ?partial=1 levert alleen het artikel, want dat is wat de schildwacht inruilt.
    266 router.get('/lees/:slug?', (req, res, next) => {
     266router.get('/read/:slug?', (req, res, next) => {
    267267  const site = res.locals.site;
    268268  if (!site) return next();
    269269
    270   // Zonder slug: het nieuwste bericht, zodat /lees een ingang is en niet een
     270  // Zonder slug: het nieuwste bericht, zodat /read een ingang is en niet een
    271271  // fout. Gepind eerst, net als op de voorpagina.
    272272  const post = req.params.slug
     
    291291    post, entry, newerPost, olderPost,
    292292    pageTitle: post.title || site.title,
    293     // on-lees zet de chrome weg; de mini-topnav blijft (chrome.ejs, _headerless).
    294     bodyClass: 'on-lees on-special',
     293    // on-read zet de chrome weg; de mini-topnav blijft (chrome.ejs, _headerless).
     294    bodyClass: 'on-read on-special',
     295    pageJs: 'read',
    295296  };
    296297  if (req.query.partial === '1' || req.headers['hx-request'] === 'true') {
    297     return renderPage(req, res, 'partials/lees-article', model);
     298    return renderPage(req, res, 'partials/read-article', model);
    298299  }
    299300  recordPageview(site.id, req);
    300   return renderPage(req, res, 'pages/lees', model);
     301  return renderPage(req, res, 'pages/read', model);
    301302});
    302303
  • src/services/i18n.js

    r9622f20 rb67edbd  
    891891    'fgate.title': 'Alleen voor vrienden',
    892892    'fgate.sub': 'Dit is exclusief voor ingelogde vrienden. Log in om het te bekijken.',
    893     'fgate.login': 'Inloggen / aanmelden', 'lees.exit': 'Terug naar de site', 'lees.exit_label': 'Uit het leesscherm',
     893    'fgate.login': 'Inloggen / aanmelden', 'read.exit': 'Terug naar de site', 'read.exit_label': 'Uit het leesscherm',
    894894    'lbio.empty': 'Nog geen links ingesteld.',
    895895    'lbio.back_to_site': 'naar de site',
     
    18971897    'fgate.title': 'Friends only',
    18981898    'fgate.sub': 'This is exclusive to logged-in friends. Log in to view it.',
    1899     'fgate.login': 'Log in / sign up', 'lees.exit': 'Back to the site', 'lees.exit_label': 'Leave reading view',
     1899    'fgate.login': 'Log in / sign up', 'read.exit': 'Back to the site', 'read.exit_label': 'Leave reading view',
    19001900    'lbio.empty': 'No links set up yet.',
    19011901    'lbio.back_to_site': 'back to the site',
     
    29032903    'fgate.title': 'Nur für Freunde',
    29042904    'fgate.sub': 'Dies ist exklusiv für eingeloggte Freunde. Melde dich an, um es anzusehen.',
    2905     'fgate.login': 'Anmelden / Registrieren', 'lees.exit': 'Zurück zur Seite', 'lees.exit_label': 'Lesemodus verlassen',
     2905    'fgate.login': 'Anmelden / Registrieren', 'read.exit': 'Zurück zur Seite', 'read.exit_label': 'Lesemodus verlassen',
    29062906    'lbio.empty': 'Noch keine Links eingerichtet.',
    29072907    'lbio.back_to_site': 'zurück zur Seite',
  • src/views/partials/post-body.ejs

    r9622f20 rb67edbd  
    1919var _b = (typeof _base !== 'undefined' && _base) ? _base : '';
    2020var _href = _b + '/' + post.slug;
     21// Het lijf komt als eigen waarde binnen en wordt NIET uit `post` gevist. De rij
     22// draagt nog de ruwe `content`; door alleen te tonen wat de aanroeper bewust
     23// meegeeft, kan een gesloten poort hier niets laten ontsnappen.
     24var _html = (typeof content_html !== 'undefined' && content_html) ? content_html : '';
    2125%>
    2226
    2327<% if (_acc === 'full') { %>
    24   <div class="post-content"><%- post.content_html %></div>
     28  <div class="post-content"><%- _html %></div>
    2529
    2630<% } else if (_acc === 'paid') { %>
Note: See TracChangeset for help on using the changeset viewer.