| 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.
|
|---|
| 13 | var _b = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
|
|---|
| 14 | %>
|
|---|
| 15 |
|
|---|
| 16 | <%# De teksten die het script zelf plaatst, komen van hier -- zoals de
|
|---|
| 17 | zoekteksten van de topnav (zie mod/chrome.js). Een zin die in het
|
|---|
| 18 | script staat, staat in één taal, en dat is nooit de taal van de lezer. %>
|
|---|
| 19 | <div class="read-stream" id="read-stream" data-base="<%= _b %>"
|
|---|
| 20 | data-i18n="<%= JSON.stringify({ end: t('read.end'), load_error: t('read.load_error') }) %>">
|
|---|
| 21 | <%- include('../partials/read-article', {
|
|---|
| 22 | post: post, entry: entry, newerPost: newerPost, olderPost: olderPost,
|
|---|
| 23 | }) %>
|
|---|
| 24 | </div>
|
|---|
| 25 |
|
|---|
| 26 | <%# Geen eigen uitgangsknop. De balken schuiven terug zodra je omhoog scrolt
|
|---|
| 27 | (en staan er sowieso bovenaan), dus de weg terug is altijd één veeg weg. Een
|
|---|
| 28 | zwevende knop erbij zou een tweede uitgang zijn die hetzelfde doet. %>
|
|---|
| 29 |
|
|---|
| 30 | <noscript>
|
|---|
| 31 | <nav class="read-fallback">
|
|---|
| 32 | <% if (newerPost) { %><a href="<%= _b %>/read/<%= newerPost.slug %>">← <%= newerPost.title %></a><% } %>
|
|---|
| 33 | <% if (olderPost) { %><a href="<%= _b %>/read/<%= olderPost.slug %>"><%= olderPost.title %> →</a><% } %>
|
|---|
| 34 | </nav>
|
|---|
| 35 | </noscript>
|
|---|
| 36 |
|
|---|
| 37 | <style>
|
|---|
| 38 | /* Alles onder .on-read: dit is een nieuw scherm op een LIVE site, dus niets
|
|---|
| 39 | hiervan mag daarbuiten iets aanraken. */
|
|---|
| 40 |
|
|---|
| 41 | /* De balken schuiven weg zodra je leest. Transform en niet display: een
|
|---|
| 42 | schuivende balk laat zien dat hij terugkomt, een verdwijnende niet. */
|
|---|
| 43 | .on-read #pcms-chrome,
|
|---|
| 44 | .on-read .bottom-tab {
|
|---|
| 45 | transition: transform .28s ease, opacity .28s ease;
|
|---|
| 46 | will-change: transform;
|
|---|
| 47 | }
|
|---|
| 48 | .on-read.read-chrome-hidden #pcms-chrome { transform: translateY(-100%); opacity: 0; }
|
|---|
| 49 | .on-read.read-chrome-hidden .bottom-tab { transform: translateY(100%); opacity: 0; }
|
|---|
| 50 |
|
|---|
| 51 | /* De vrije ruimte onder de laatste post moet weg: anders eindigt het document
|
|---|
| 52 | ver onder het laatste bericht en klopt "bij de rand" niet meer. */
|
|---|
| 53 | .on-read #pcms-main { padding-bottom: 0; }
|
|---|
| 54 |
|
|---|
| 55 | /* PROXIMITY, geen mandatory. Een bericht dat langer is dan het scherm moet je
|
|---|
| 56 | rustig kunnen doorlezen; mandatory zou je bij elke pauze terugtrekken naar
|
|---|
| 57 | een grens. Zo snapt hij alleen als je in de buurt van een grens bent.
|
|---|
| 58 |
|
|---|
| 59 | OP <html>, en dat is geen smaakkwestie: snappen doet de SCROLLCONTAINER, en
|
|---|
| 60 | dat is hier het document -- .read-stream heeft overflow: visible en scrollt
|
|---|
| 61 | zelf niet. Op .read-stream stond de regel er wel, maar deed hij niets. */
|
|---|
| 62 | html:has(body.on-read) { scroll-snap-type: y proximity; }
|
|---|
| 63 |
|
|---|
| 64 | /* De browser NIET ook laten compenseren. Chrome en Firefox schuiven bij
|
|---|
| 65 | invoegen bóven het beeld de scrollpositie zelf mee (scroll anchoring); samen
|
|---|
| 66 | met onze eigen correctie in mod/read.js is dat twee keer, en dan springt de
|
|---|
| 67 | tekst precies één bericht weg. Onze eigen correctie moet blijven, want Safari
|
|---|
| 68 | (en dus iOS) kent scroll anchoring helemaal niet. */
|
|---|
| 69 | html:has(body.on-read), .on-read .read-stream, .on-read .read-post { overflow-anchor: none; }
|
|---|
| 70 | .on-read .read-post {
|
|---|
| 71 | scroll-snap-align: start;
|
|---|
| 72 | scroll-snap-stop: normal;
|
|---|
| 73 | min-height: 100svh;
|
|---|
| 74 | max-width: 46rem;
|
|---|
| 75 | margin: 0 auto;
|
|---|
| 76 | padding: 2rem 1.2rem 4rem;
|
|---|
| 77 | box-sizing: border-box;
|
|---|
| 78 | }
|
|---|
| 79 | /* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
|
|---|
| 80 | .on-read .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
|
|---|
| 81 |
|
|---|
| 82 | .on-read .read-head { padding-bottom: .5rem; }
|
|---|
| 83 | .on-read .read-title { font-size: clamp(1.6rem, 4vw, 2.4rem); line-height: 1.15; margin: 0 0 .3rem; }
|
|---|
| 84 | .on-read .read-when { font-size: .85rem; opacity: .6; margin: 0; }
|
|---|
| 85 |
|
|---|
| 86 | /* Bezig / mislukt: de lezer hoort te merken dat er iets gebeurt, en vooral dat
|
|---|
| 87 | er NIETS gebeurde als het misging. */
|
|---|
| 88 | .on-read .read-loading { text-align: center; padding: 1.2rem; opacity: .6; font-size: .9rem; }
|
|---|
| 89 | .on-read .read-end { text-align: center; padding: 2rem 1rem 3rem; opacity: .5; font-size: .9rem; }
|
|---|
| 90 |
|
|---|
| 91 | .on-read .read-fallback { display: flex; gap: 1rem; padding: 1rem 1.2rem; }
|
|---|
| 92 |
|
|---|
| 93 | @media (prefers-reduced-motion: reduce) {
|
|---|
| 94 | .on-read #pcms-chrome, .on-read .bottom-tab { transition: none; }
|
|---|
| 95 | html:has(body.on-read) { scroll-snap-type: none; }
|
|---|
| 96 | }
|
|---|
| 97 | </style>
|
|---|