Changeset 847775c in Klonkt
- Timestamp:
- 08/18/2026 06:47:58 PM (3 weeks ago)
- 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)
- Location:
- src
- Files:
-
- 5 edited
-
assets/js/mod/read.js (modified) (2 diffs)
-
services/i18n.js (modified) (3 diffs)
-
views/pages/read.ejs (modified) (1 diff)
-
views/partials/read-article.ejs (modified) (2 diffs)
-
views/shell.ejs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/assets/js/mod/read.js
r87696ce r847775c 166 166 } 167 167 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 */ 180 let tapX = 0, tapY = 0; 181 function onPointerDown(e) { tapX = e.clientX; tapY = e.clientY; } 182 183 function 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 168 199 function onScroll() { 169 200 const y = window.scrollY || 0; … … 183 214 window.addEventListener('scroll', onScroll, { passive: true }); 184 215 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); 185 219 watch(); 186 220 } -
src/services/i18n.js
r87696ce r847775c 891 891 'fgate.title': 'Alleen voor vrienden', 892 892 '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.', 894 894 'lbio.empty': 'Nog geen links ingesteld.', 895 895 'lbio.back_to_site': 'naar de site', … … 1897 1897 'fgate.title': 'Friends only', 1898 1898 '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.', 1900 1900 'lbio.empty': 'No links set up yet.', 1901 1901 'lbio.back_to_site': 'back to the site', … … 2903 2903 'fgate.title': 'Nur für Freunde', 2904 2904 '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.', 2906 2906 'lbio.empty': 'Noch keine Links eingerichtet.', 2907 2907 'lbio.back_to_site': 'zurück zur Seite', -
src/views/pages/read.ejs
r87696ce r847775c 80 80 .on-read .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); } 81 81 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 82 96 .on-read .read-head { padding-bottom: .5rem; } 83 97 .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 20 20 data-title="<%= post.title || '' %>" 21 21 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. %> 22 27 <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> 24 29 <% if (post.published_at) { %><p class="read-when"><%= formatDateTime(post.published_at) %></p><% } %> 25 30 </header> … … 29 34 content_html: entry.content_html, _base: _b, 30 35 }) %> 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') %> →</a> 41 </footer> 31 42 </article> -
src/views/shell.ejs
r87696ce r847775c 503 503 // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig 504 504 // bumpen kost een bugfix die nooit aankomt. 505 var MOD_V = 1;505 var MOD_V = 2; 506 506 507 507 // 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)