Changeset e46ebaa in Klonkt for src/assets/css/style.css


Ignore:
Timestamp:
08/20/2026 12:54:30 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
48481cd
Parents:
598f090
Message:

Lezen: snappen dat je laat lezen, en geen lege schermen meer

Barts meldingen van 20 augustus, in een stuk of zes rondes bijgesteld. De
uitkomst is korter dan de weg ernaartoe, en die weg is het waard om vast te
leggen omdat ik er twee keer overheen ben geschoten.

SNAPPEN. De regel is nu in drie zinnen te zeggen:

omhoog scrollen nooit snappen -- je zoekt iets terug en bepaalt zelf

waar je stopt

omlaag, ver weg vrij scrollen
omlaag, laatste
150px van een
bericht vangt, en je landt op de bovenkant van het volgende

Er is geen top-zone: de bovenkant van het bericht waar je IN zit is geen
doelwit meer. Dat was de oorspronkelijke klacht -- je las een paar regels
verder en proximity trok je terug naar de bovenrand, waardoor het leek of
het scrollen vastliep. De grens die wel vangt is de onderkant van je huidige
bericht, en dat is hetzelfde punt als de bovenkant van het volgende.

Onderweg twee doodlopende wegen, allebei door Robin gecorrigeerd:

  • Eerst zette ik de snap UIT voor berichten langer dan het scherm. Op een telefoon is bijna elk bericht net iets langer dan de viewport, dus daar verdween het snappen overal: op 812px hoog kregen berichten van 1009 en zelfs 839 al geen snap meer.
  • Toen probeerde ik de vangzone aan de VOET van het bericht te hangen ("ben je de reacties voorbij"). Bij een kort bericht staat die voet middenin de lege ruimte die min-height maakte, dus de zone begon op een willekeurige plek. Gelukkig ving Robin dat voordat het uitgerold stond.

Het moest dus een getal in pixels zijn, en 150 is dat getal.

GEEN LEGE SCHERMEN MEER. min-height:100svh rekte elk bericht op tot een vol
scherm. Bij een kort bericht gaf dat een halve pagina leegte onder "Replies
and reactions" -- je keek naar niets en moest doorscrollen om te ontdekken
dat er nog iets kwam. Weg dus: berichten hebben hun eigen hoogte (gemeten:
360/1009/839/250 waar het eerst 888/888/888/888 was) en de stroom is gewoon
bericht na bericht. Het snappen hangt aan scroll-snap-align en niet aan die
hoogte, dus dat werkt onveranderd.

VLOEIEND: scroll-behavior:smooth, want zonder dat springt een snap er in een
frame naartoe en voelt het als een hik. Uit bij prefers-reduced-motion.

TERUG NAAR BOVEN, rechtsonder, in twee stappen: eerst naar het begin van DIT
bericht, daarna pas naar de kop van de pagina. Die knop is de enige die naar
een bovenkant mag springen, en hij heeft het snappen daar niet voor nodig --
scrollIntoView stuurt zelf. Nagemeten, juist omdat omhoog-snappen uit staat:
1706 -> 1206, exact de bovenkant.

COVERS nemen de volle kolombreedte met de verhouding intact. De ronde ervoor
haalde het opblazen eruit maar liet kleine afbeeldingen op ware grootte
staan, en dat was als postzegel in een brede kolom te klein.

DE CIRKEL. Lezen blijft daar dood (berichten van anderen), maar een tijdlijn
werkt er juist bij uitstek. Die dwong ik eerst af zodra de site geen
Lezen-site was, en dan kon je in de cirkel geen Grid meer kiezen. Nu is Grid
de landing en staat Tijdlijn ernaast: bij feed_alt_view=timeline altijd, bij
auto op desktop. De cirkel krijgt zijn eigen geheugen terug, met een eigen
sleutel zodat een keuze daar je thuisweergave niet aanraakt.

style.css naar v77 en MOD_V naar 13.

Suite 1165/1165.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/style.css

    r598f090 re46ebaa  
    24302430}
    24312431
     2432/* -------- AUTO (data-feed-view="auto") --------
     2433   Lezen op mobiel, Tijdlijn op desktop. GEEN JavaScript: de CSS kiest, dus geen
     2434   resize-afhandeling en geen flikkering waarin je eerst de verkeerde weergave
     2435   ziet. De tijdlijn is de terugval, dus boven de grens hoeft hier niets te
     2436   staan -- die is vanzelf al zichtbaar.
     2437   De :has(.feed-reader)-voorwaarde staat er om dezelfde reden als hierboven:
     2438   zonder berichten is er geen leessectie, en dan moet de tijdlijn blijven staan
     2439   met "nog niets geschreven" erin. */
     2440@media (max-width: 767px) {
     2441    body.on-home[data-feed-view="auto"] .feed-reader { display: block; }
     2442    body.on-home[data-feed-view="auto"]:has(.feed-reader) .feed-timeline,
     2443    body.on-home[data-feed-view="auto"]:has(.feed-reader) .feed-grid,
     2444    body.on-home[data-feed-view="auto"]:has(.feed-reader) .pagination,
     2445    body.on-home[data-feed-view="auto"]:has(.feed-reader) .related-posts,
     2446    body.on-home[data-feed-view="auto"]:has(.feed-reader) .article-footer {
     2447        display: none !important;
     2448    }
     2449}
     2450/* In de auto-stand staan BEIDE knoppen in de HTML en laat de mediaquery er een
     2451   zien. Zo verspringt de naam van de knop niet terwijl je ernaar kijkt, en is er
     2452   geen JavaScript nodig dat op resize moet luisteren. */
     2453.view-switch-btn.vs-alleen-mobiel { display: none; }
     2454@media (max-width: 767px) {
     2455    .view-switch-btn.vs-alleen-mobiel { display: inline-flex; }
     2456    .view-switch-btn.vs-alleen-desktop { display: none; }
     2457}
     2458
    24322459/* Snappen doet de SCROLLCONTAINER, en dat is het document -- niet .read-stream,
    24332460   die heeft overflow: visible en scrollt zelf niet. Proximity en geen mandatory:
    24342461   in een bericht dat langer is dan het scherm moet je rustig door kunnen lezen. */
    2435 html:has(body.on-home[data-feed-view="reader"]) { scroll-snap-type: y proximity; }
     2462html:has(body.on-home[data-feed-view="reader"]) {
     2463    scroll-snap-type: y proximity;
     2464    /* Vloeiend, niet in een klap. Zonder dit springt een snap er in EEN frame
     2465       naartoe en voelt het als een hik in plaats van als meegeven -- Barts
     2466       melding (20-8). Geldt ook voor de terug-naar-boven-knop en voor een
     2467       ankersprong, en dat is precies wat je wilt.
     2468       Uitgezet bij prefers-reduced-motion, onderaan dit blok. */
     2469    scroll-behavior: smooth;
     2470}
    24362471/* En de browser niet óók laten compenseren als Load more er berichten bij zet:
    24372472   Chrome en Firefox schuiven bij invoegen zelf mee (scroll anchoring), en dat
     
    24412476
    24422477.feed-reader .read-post {
     2478    /* Snap naar de BOVENkant van een bericht, zacht (proximity op html) en nooit
     2479       dwingend (stop: normal). Een korte post vult het scherm, zodat hij niet als
     2480       snipper tussen twee lijnen hangt.
     2481       De uitzondering staat NIET hier maar in mod/read.js: een bericht dat langer
     2482       is dan het scherm krijgt scroll-snap-align:none, anders trekt de browser je
     2483       tijdens het lezen terug naar zijn bovenrand en lijkt het of het scrollen
     2484       stopt. "Past het op het scherm?" is een vraag over gemeten hoogte, en die
     2485       kan CSS niet stellen. */
     2486    /* Je LANDT op de bovenkant van een bericht -- dat is wat "snap to post"
     2487       hoort te betekenen. (align:end probeerde ik ook; dan land je op de
     2488       ONDERKANT van het vorige bericht, en bij een lang bericht zie je dus zijn
     2489       laatste schermvol in plaats van de kop van het volgende.)
     2490       Wanneer die bovenkant een snappunt IS, staat in mod/read.js: alleen zolang
     2491       je er nog niet voorbij bent. Eenmaal in een bericht snapt er niets meer,
     2492       ook niet naar zijn eigen bovenrand -- anders trekt proximity je terug
     2493       zodra je een paar regels verder leest. */
    24432494    scroll-snap-align: start;
    24442495    scroll-snap-stop: normal;
    2445     min-height: 100svh;
     2496    /* GEEN min-height meer. Die rekte elk bericht tot een vol scherm, en bij een
     2497       kort bericht leverde dat een halve pagina leegte op onder "Replies and
     2498       reactions" -- je zat naar niets te kijken en moest verder scrollen om te
     2499       ontdekken dat er nog iets kwam. Robins vondst (20-8), met een
     2500       schermafbeelding erbij.
     2501       Zonder die hoogte is de stroom gewoon bericht na bericht: je ziet het
     2502       volgende meteen onder het vorige beginnen. Het snappen doet nog steeds
     2503       zijn werk aan de grens -- dat hangt aan scroll-snap-align en niet aan de
     2504       hoogte -- dus de streep lijnt nog altijd uit met de bovenkant van het
     2505       volgende bericht. */
    24462506    max-width: 46rem;
    24472507    margin: 0 auto;
     
    24612521   scrollen om te zien wat het IS. */
    24622522.feed-reader .read-cover {
    2463     /* Krimpt om het beeld heen en staat gecentreerd, in plaats van de kolom vol
    2464        te trekken. Anders staat een klein plaatje in een veel te grote lijst. */
    2465     width: fit-content;
    2466     max-width: 100%;
    2467     margin: 0 auto 1.2rem;
     2523    /* Volle kolombreedte: de afbeelding erin neemt die breedte, dus de figure
     2524       hoeft niet meer om het beeld te krimpen. */
     2525    width: 100%;
     2526    margin: 0 0 1.2rem;
    24682527    border-radius: 10px;
    24692528    overflow: hidden;
     
    24722531.feed-reader .read-cover video {
    24732532    display: block;
    2474     /* GEEN width:100%. Dat blies een cover van 221x165 op tot 505x378 -- ruim
    2475        twee keer zo groot als hij is, en dus wazig. De tijdlijn deed dat nooit:
    2476        daar zat een cover in een vakje van 120px, dus klein bleef klein. Met
    2477        auto + max-width vult een grote afbeelding de kolom en blijft een kleine
    2478        op ware grootte staan.
    2479        En GEEN object-fit:cover: samen met de hoogtegrens sneed dat de onderkant
    2480        eraf (553x464 kwam er als 505x400 uit). Met max-width en max-height houdt
    2481        de browser de verhouding zelf en past het beeld HEEL in het vak. */
    2482     width: auto;
     2533    /* Neemt de VOLLE kolombreedte, met de verhouding intact (object-fit
     2534       weggelaten, dus geen bijsnijden). Een cover die van zichzelf kleiner is
     2535       wordt netjes tot de kolom opgeschaald in plaats van als postzegeltje te
     2536       blijven staan -- dat was te klein. De hoogtegrens houdt een staande foto
     2537       nog binnen de perken zodat titel + eerste alinea boven de vouw blijven;
     2538       hij krimpt dan mee in plaats van bijgesneden te worden. */
     2539    display: block;
     2540    width: 100%;
    24832541    height: auto;
    2484     max-width: 100%;
    2485     max-height: 45svh;
     2542    max-height: 70svh;
     2543    object-fit: contain;
    24862544    /* Een logo met doorzichtige achtergrond zweeft anders op de paginakleur;
    24872545       dezelfde keuze als bij .post-list-cover in de tijdlijn. */
     
    25062564.feed-reader .read-open:focus-visible { opacity: 1; }
    25072565
     2566/* Terug naar boven. Rechtsonder, want daar zit de duim -- en boven de tabbalk,
     2567   die op mobiel 1050 is en anders overheen zou vallen. Onzichtbaar tot je ver
     2568   genoeg bent, zodat hij niet meteen in de weg staat bij het eerste bericht. */
     2569.read-top {
     2570    position: fixed;
     2571    right: max(1rem, env(safe-area-inset-right, 0));
     2572    bottom: calc(env(safe-area-inset-bottom, 0) + 4.75rem);
     2573    z-index: 1040;
     2574    display: grid;
     2575    place-items: center;
     2576    width: 44px;
     2577    height: 44px;                 /* 44px = de kleinste maat die een duim betrouwbaar raakt */
     2578    border-radius: 999px;
     2579    border: 1px solid var(--rule);
     2580    background: color-mix(in srgb, var(--paper) 88%, transparent);
     2581    backdrop-filter: blur(14px) saturate(140%);
     2582    -webkit-backdrop-filter: blur(14px) saturate(140%);
     2583    color: var(--ink);
     2584    box-shadow: 0 2px 12px color-mix(in srgb, var(--ink) 12%, transparent);
     2585    cursor: pointer;
     2586    opacity: 0;
     2587    pointer-events: none;
     2588    transition: opacity .18s ease, transform .18s ease;
     2589    transform: translateY(6px);
     2590}
     2591.read-top.is-zichtbaar { opacity: 1; pointer-events: auto; transform: none; }
     2592/* Buiten de leesweergave bestaat hij niet -- home.ejs rendert alle drie de
     2593   secties, dus zonder deze regel zweeft hij ook boven Tijdlijn en Grid. */
     2594body:not([data-feed-view="reader"]) .read-top,
     2595body:not(.on-home) .read-top { display: none; }
     2596/* Op desktop is er geen tabbalk, dus mag hij lager staan. */
     2597@media (min-width: 768px) {
     2598    .read-top { bottom: 1.5rem; right: 1.5rem; }
     2599}
    25082600@media (prefers-reduced-motion: reduce) {
    2509     html:has(body.on-home[data-feed-view="reader"]) { scroll-snap-type: none; }
     2601    .read-top { transition: none; transform: none; }
     2602}
     2603
     2604@media (prefers-reduced-motion: reduce) {
     2605    html:has(body.on-home[data-feed-view="reader"]) {
     2606        scroll-snap-type: none;
     2607        scroll-behavior: auto;
     2608    }
    25102609}
    25112610
Note: See TracChangeset for help on using the changeset viewer.