source: Klonkt/src/views/pages/read.ejs@ b67edbd

main
Last change on this file since b67edbd was b67edbd, checked in by Bart <bart@…>, 3 weeks ago

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@…>

  • Property mode set to 100644
File size: 4.0 KB
Line 
1<%
2// De leesweergave: berichten achter elkaar, één per beeld, en de balken gaan weg.
3//
4// Barts idee, naar bartoverkamp.nl -- maar NIET met de truc die daar staat.
5// Daar wordt bij de rand naar de andere kant gesprongen en het artikel
6// "vloeiend" in beeld gezet; dat is een naad die je verbergt. Hier groeit de
7// stroom gewoon: bij de onderrand hangt de client de oudere buur eronder, bij de
8// bovenrand de nieuwere erboven, en de browser snapt naar de berichtgrenzen.
9// Dan is er geen naad om te verbergen.
10//
11// Zonder JavaScript blijft dit één leesbaar bericht met twee gewone links. Een
12// leesweergave die alleen met script bestaat, bestaat niet voor wie het uitzet.
13var _b = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
14%>
15
16<div class="read-stream" id="read-stream" data-base="<%= _b %>">
17 <%- include('../partials/read-article', {
18 post: post, entry: entry, newerPost: newerPost, olderPost: olderPost,
19 }) %>
20</div>
21
22<%# De weg terug. Blijft staan als de balken weg zijn -- een scherm zonder
23 uitgang is geen scherm maar een val. %>
24<nav class="read-exit" aria-label="<%= t('read.exit_label') %>">
25 <a class="read-hand" href="<%= _b %>/" title="<%= t('read.exit') %>" aria-label="<%= t('read.exit') %>">👋</a>
26</nav>
27
28<noscript>
29 <nav class="read-fallback">
30 <% if (newerPost) { %><a href="<%= _b %>/read/<%= newerPost.slug %>">← <%= newerPost.title %></a><% } %>
31 <% if (olderPost) { %><a href="<%= _b %>/read/<%= olderPost.slug %>"><%= olderPost.title %> →</a><% } %>
32 </nav>
33</noscript>
34
35<style>
36/* Alles onder .on-read: dit is een nieuw scherm op een LIVE site, dus niets
37 hiervan mag daarbuiten iets aanraken. */
38
39/* De balken schuiven weg zodra je leest. Transform en niet display: een
40 schuivende balk laat zien dat hij terugkomt, een verdwijnende niet. */
41.on-read #pcms-chrome,
42.on-read .bottom-tab {
43 transition: transform .28s ease, opacity .28s ease;
44 will-change: transform;
45}
46.on-read.read-chrome-weg #pcms-chrome { transform: translateY(-100%); opacity: 0; }
47.on-read.read-chrome-weg .bottom-tab { transform: translateY(100%); opacity: 0; }
48
49/* De vrije ruimte onder de laatste post moet weg: anders eindigt het document
50 ver onder het laatste bericht en klopt "bij de rand" niet meer. */
51.on-read #pcms-main { padding-bottom: 0; }
52
53/* PROXIMITY, geen mandatory. Een bericht dat langer is dan het scherm moet je
54 rustig kunnen doorlezen; mandatory zou je bij elke pauze terugtrekken naar
55 een grens. Zo snapt hij alleen als je in de buurt van een grens bent. */
56.on-read .read-stream { scroll-snap-type: y proximity; }
57.on-read .read-post {
58 scroll-snap-align: start;
59 scroll-snap-stop: normal;
60 min-height: 100svh;
61 max-width: 46rem;
62 margin: 0 auto;
63 padding: 2rem 1.2rem 4rem;
64 box-sizing: border-box;
65}
66/* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
67.on-read .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
68
69.on-read .read-head { padding-bottom: .5rem; }
70.on-read .read-title { font-size: clamp(1.6rem, 4vw, 2.4rem); line-height: 1.15; margin: 0 0 .3rem; }
71.on-read .read-when { font-size: .85rem; opacity: .6; margin: 0; }
72
73/* Bezig / mislukt: de lezer hoort te merken dat er iets gebeurt, en vooral dat
74 er NIETS gebeurde als het misging. */
75.on-read .read-laden { text-align: center; padding: 1.2rem; opacity: .6; font-size: .9rem; }
76.on-read .read-eind { text-align: center; padding: 2rem 1rem 3rem; opacity: .5; font-size: .9rem; }
77
78.on-read .read-exit { position: fixed; right: 1rem; bottom: 1rem; z-index: 60; }
79.on-read .read-hand {
80 display: grid; place-items: center; width: 3rem; height: 3rem;
81 font-size: 1.5rem; text-decoration: none; border-radius: 50%;
82 background: var(--paper, #fff); box-shadow: 0 2px 10px rgba(0,0,0,.18);
83}
84.on-read .read-fallback { display: flex; gap: 1rem; padding: 1rem 1.2rem; }
85
86@media (prefers-reduced-motion: reduce) {
87 .on-read #pcms-chrome, .on-read .bottom-tab { transition: none; }
88 .on-read .read-stream { scroll-snap-type: none; }
89}
90</style>
Note: See TracBrowser for help on using the repository browser.