source: Klonkt/src/views/partials/read-article.ejs@ 8c91ed3

main
Last change on this file since 8c91ed3 was 8c91ed3, checked in by Robin <roboburr@…>, 3 weeks ago

Covers in de leesweergave

Een bericht in de leesstroom begon met kale tekst: de cover ontbrak,
terwijl hij op de berichtpagina, in de tijdlijn en in Grid gewoon staat.
Nu staat hij er ook, boven de titel, in dezelfde volgorde als post.ejs.

Twee dingen komen van post-card en niet van post.ejs. De SLUIER: op de
berichtpagina hangt de NSFW-waarschuwing als banner boven de pagina,
want daar staat een bericht -- in een stroom kan dat niet, want de buren
rollen voorbij en dan is het beeld onderweg al te zien. En thumb(), want
hier staan er meerdere onder elkaar in een stroom die dooraanvult.

De hoogte is begrensd op 45svh. Een paneel is min-height:100svh en snapt;
een staande foto op volle breedte zou titel en eerste alinea onder de
vouw duwen, en dan begint elk bericht met een plaat waar je langs moet
scrollen om te zien wat het is.

Nagekeken en niet aangenomen: beide voedingen van readerItems() halen
SELECT p.* op, dus cover_image_url, cover_video_url, cover_alt, nsfw en
content_warning komen mee. Een versmalde kolommenlijst zou hier niets
opleveren zonder ergens te klagen.

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

  • Property mode set to 100644
File size: 4.4 KB
Line 
1<%
2// Eén bericht in de leesstroom.
3//
4// Dit is het stuk dat de client AANVULT: bij de onderrand komt de oudere buur
5// eronder, bij de bovenrand de nieuwere erboven. Geen sprongen, geen
6// scrollpositie die stiekem verzet wordt -- de stroom groeit gewoon in de
7// richting waarin je leest, en de browser snapt naar de grenzen.
8//
9// Elk artikel draagt zijn eigen buren, dus de client hoeft niets te onthouden:
10// wat er nog te halen valt staat op het stuk dat er al is.
11var _b = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
12var _newer = (typeof newerPost !== 'undefined' && newerPost) ? newerPost : null;
13var _older = (typeof olderPost !== 'undefined' && olderPost) ? olderPost : null;
14%>
15<article class="read-post"
16 data-slug="<%= post.slug %>"
17 data-newer="<%= _newer ? _newer.slug : '' %>"
18 data-older="<%= _older ? _older.slug : '' %>"
19 data-base="<%= _b %>"
20 data-title="<%= post.title || '' %>"
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. %>
27 <%# De cover hoort hier net zo goed als op de berichtpagina: het is het beeld
28 van het stuk, en zonder hem begint elk bericht in de stroom met kale tekst.
29 Boven de titel, in dezelfde volgorde als post.ejs.
30
31 Twee dingen komen hier van post-card en NIET van post.ejs:
32
33 - De SLUIER. Op de berichtpagina hangt de waarschuwing als banner boven de
34 hele pagina, want daar staat een bericht. In een stroom kan dat niet: de
35 buren rollen gewoon voorbij, dus het beeld moet zijn eigen sluier dragen
36 of het is onderweg al te zien. De afhandelaar zit gedelegeerd op
37 document (shell.ejs), dus hij werkt ook op wat de client later aanschuift.
38 - thumb(). De bron kan het volle bestand zijn en hier staan er meerdere
39 onder elkaar in een stroom die dooraanvult.
40
41 cover_image_url en cover_video_url komen mee: beide voedingen van
42 readerItems() halen `SELECT p.*` op (routes/posts.js, de pinned- en de
43 gewone feed-query). Nagekeken, want een versmalde lijst zou hier niets
44 opleveren zonder ergens te klagen. %>
45 <% if (post.cover_image_url || post.cover_video_url) { %>
46 <figure class="read-cover<%= post.nsfw ? ' nsfw-media' : '' %>">
47 <% if (post.cover_image_url) { %>
48 <img src="<%= thumb(post.cover_image_url, 1280) %>"
49 srcset="<%= thumb(post.cover_image_url, 640) %> 640w, <%= thumb(post.cover_image_url, 1280) %> 1280w"
50 sizes="(min-width: 768px) 46rem, 100vw"
51 alt="<%= post.cover_alt || '' %>" loading="lazy" decoding="async"<% if (post.cover_video_url) { %> data-ios-mp4="<%= post.cover_video_url %>"<% } %>>
52 <% } else { %>
53 <video src="<%= post.cover_video_url %>" poster="<%= thumb(post.cover_video_url, 1280) %>"
54 controls loop muted playsinline preload="metadata"></video>
55 <% } %>
56 <% if (post.nsfw) { %><span class="nsfw-veil"><%- include('nsfw-veil', { cw: post.content_warning }) %></span><% } %>
57 </figure>
58 <% } %>
59
60 <header class="read-head">
61 <h1 class="read-title"><a href="<%= _b %>/<%= post.slug %>"><%= post.title || '' %></a></h1>
62 <% if (post.published_at) { %><p class="read-when"><%= formatDateTime(post.published_at) %></p><% } %>
63 </header>
64
65 <%- include('post-body', {
66 post: post, access: entry.access, teaser: entry.teaser,
67 content_html: entry.content_html, _base: _b,
68 }) %>
69
70 <%# Zegt waar je heen gaat, in plaats van te vertrouwen op een tik die niemand
71 ziet. De tik-afhandelaar in mod/read.js is het gemak; dit is de aankondiging.
72
73 #fediverse is de sectie op de berichtpagina met de ⭐/🔁/💬-tellers en de
74 reacties (post.ejs). Alleen DEZE link springt daarheen: de titel en de tik
75 openen het bericht bovenaan, want die zeggen "lees dit", niet "laat het
76 gesprek zien". Staat de sectie er niet -- AP uit, of een concept -- dan
77 negeert de browser de anker en beland je gewoon bovenaan. %>
78 <footer class="read-foot">
79 <a class="read-open" href="<%= _b %>/<%= post.slug %>#fediverse"><%= t('read.open') %> &rarr;</a>
80 </footer>
81</article>
Note: See TracBrowser for help on using the repository browser.