Changeset 847775c in Klonkt


Ignore:
Timestamp:
08/18/2026 06:47:58 PM (3 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
03ff677
Parents:
87696ce
git-author:
Bart <bart@…> (08/18/2026 04:42:55 AM)
git-committer:
Bart <bart@…> (08/18/2026 06:47:58 PM)
Message:

Leesweergave: tikken op een bericht opent het bericht

De stroom toont de tekst, maar het gesprek staat op de berichtpagina: ⭐,
🔁, reacties, en het antwoordveld voor bezoekers van elders. Een leesweergave
waar je niet uit kunt naar dat gesprek is een doodlopende weg.

Drie ingangen, met opzet:

  • de titel is een echte <a>, dus toetsenbord, schermlezer en cmd-klik werken;
  • een voetlink zegt waar je heen gaat ("Reacties en waarderingen"), want een tik die je niet ziet, bestaat niet;
  • en een tik ergens op het bericht, voor een duim.

Die tik kent vier uitzonderingen, want een tik die je niet bedoelde is erger dan
geen tik: links, knoppen en velden houden hun eigen werking, een geselecteerde
tekst is geen tik, een verschoven vinger is scrollen, en cmd/ctrl-klik laat je
aan de browser. Alle vier nagemeten in de browser, plus dat een link ín een
bericht wint van de tik.

MOD_V naar 2: mod/read.js is gewijzigd.

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

Location:
src
Files:
5 edited

Legend:

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

    r87696ce r847775c  
    166166}
    167167
     168/**
     169 * Tikken op een bericht opent dat bericht.
     170 *
     171 * De stroom toont de tekst; het gesprek -- reacties, waarderingen, boosts --
     172 * staat op de berichtpagina. De titel en de voetlink zijn echte <a>'s en doen
     173 * het werk voor toetsenbord en schermlezer; dit hier is het gemak voor een duim.
     174 *
     175 * Daarom vier uitzonderingen, want een tik die je niet bedoelde is erger dan
     176 * geen tik: iets dat zelf al een doel heeft (link, knop, veld) houdt zijn eigen
     177 * werking, een geselecteerde tekst is geen tik, een verschoven vinger is
     178 * scrollen, en cmd/ctrl-klik hoort de browser zelf af te handelen.
     179 */
     180let tapX = 0, tapY = 0;
     181function onPointerDown(e) { tapX = e.clientX; tapY = e.clientY; }
     182
     183function onTap(e) {
     184  if (e.defaultPrevented || e.button !== 0) return;
     185  if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
     186  const t = e.target;
     187  if (!t || typeof t.closest !== 'function') return;
     188  const art = t.closest('.read-post');
     189  if (!art) return;
     190  if (t.closest('a, button, input, textarea, select, label, summary, [role="button"]')) return;
     191  if (Math.abs(e.clientX - tapX) > 10 || Math.abs(e.clientY - tapY) > 10) return;
     192  const sel = window.getSelection && window.getSelection();
     193  if (sel && String(sel).trim()) return;
     194  const slug = art.dataset.slug;
     195  if (!slug) return;
     196  location.href = (art.dataset.base || '') + '/' + encodeURIComponent(slug);
     197}
     198
    168199function onScroll() {
    169200  const y = window.scrollY || 0;
     
    183214  window.addEventListener('scroll', onScroll, { passive: true });
    184215  window.addEventListener('resize', watch, { passive: true });
     216  // Op de stroom, niet per artikel: aangevulde berichten doen zo vanzelf mee.
     217  s.addEventListener('pointerdown', onPointerDown, { passive: true });
     218  s.addEventListener('click', onTap);
    185219  watch();
    186220}
  • src/services/i18n.js

    r87696ce r847775c  
    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', 'read.end': 'Je bent bij het begin van het archief.', 'read.load_error': 'Kon het volgende bericht niet laden.',
     893    'fgate.login': 'Inloggen / aanmelden', 'read.open': 'Reacties en waarderingen', 'read.end': 'Je bent bij het begin van het archief.', 'read.load_error': 'Kon het volgende bericht niet laden.',
    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', 'read.end': 'You have reached the beginning of the archive.', 'read.load_error': 'Could not load the next post.',
     1899    'fgate.login': 'Log in / sign up', 'read.open': 'Replies and reactions', 'read.end': 'You have reached the beginning of the archive.', 'read.load_error': 'Could not load the next post.',
    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', 'read.end': 'Du bist am Anfang des Archivs angekommen.', 'read.load_error': 'Der nächste Beitrag konnte nicht geladen werden.',
     2905    'fgate.login': 'Anmelden / Registrieren', 'read.open': 'Antworten und Reaktionen', 'read.end': 'Du bist am Anfang des Archivs angekommen.', 'read.load_error': 'Der nächste Beitrag konnte nicht geladen werden.',
    29062906    'lbio.empty': 'Noch keine Links eingerichtet.',
    29072907    'lbio.back_to_site': 'zurück zur Seite',
  • src/views/pages/read.ejs

    r87696ce r847775c  
    8080.on-read .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
    8181
     82/* De titel is een link, maar mag er niet als een link uitzien: dit is een
     83   leesscherm, geen index. Onderstrepen pas als je hem aanwijst. */
     84.on-read .read-title a { color: inherit; text-decoration: none; }
     85.on-read .read-title a:hover,
     86.on-read .read-title a:focus-visible { text-decoration: underline; }
     87
     88/* De aankondiging onderaan: waar de tik je heen brengt. */
     89.on-read .read-foot { margin-top: 2rem; }
     90.on-read .read-open {
     91  display: inline-block; font-size: .9rem; opacity: .75;
     92  text-decoration: none; border-bottom: 1px solid currentColor; padding-bottom: 1px;
     93}
     94.on-read .read-open:hover, .on-read .read-open:focus-visible { opacity: 1; }
     95
    8296.on-read .read-head { padding-bottom: .5rem; }
    8397.on-read .read-title { font-size: clamp(1.6rem, 4vw, 2.4rem); line-height: 1.15; margin: 0 0 .3rem; }
  • src/views/partials/read-article.ejs

    r87696ce r847775c  
    2020         data-title="<%= post.title || '' %>"
    2121         aria-label="<%= post.title || '' %>">
     22  <%# De titel is een echte link naar het bericht zelf. De leesstroom toont de
     23      TEKST, maar reacties, waarderingen en boosts staan op de berichtpagina --
     24      en een stroom waar je niet uit kunt naar het gesprek is een doodlopende weg.
     25      Een <a> en niet alleen een tik-afhandelaar: dat werkt ook met een
     26      toetsenbord, met een schermlezer, en met cmd-klik. %>
    2227  <header class="read-head">
    23     <h1 class="read-title"><%= post.title || '' %></h1>
     28    <h1 class="read-title"><a href="<%= _b %>/<%= post.slug %>"><%= post.title || '' %></a></h1>
    2429    <% if (post.published_at) { %><p class="read-when"><%= formatDateTime(post.published_at) %></p><% } %>
    2530  </header>
     
    2934        content_html: entry.content_html, _base: _b,
    3035      }) %>
     36
     37  <%# Zegt waar je heen gaat, in plaats van te vertrouwen op een tik die niemand
     38      ziet. De tik-afhandelaar in mod/read.js is het gemak; dit is de aankondiging. %>
     39  <footer class="read-foot">
     40    <a class="read-open" href="<%= _b %>/<%= post.slug %>"><%= t('read.open') %> &rarr;</a>
     41  </footer>
    3142</article>
  • src/views/shell.ejs

    r87696ce r847775c  
    503503  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    504504  // bumpen kost een bugfix die nooit aankomt.
    505   var MOD_V = 1;
     505  var MOD_V = 2;
    506506
    507507  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.