Ignore:
File:
1 edited

Legend:

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

    r520c993 r77019fa  
    25442544    scroll-margin-top: 2rem;
    25452545}
    2546 /* Het laatste bericht krijgt geen snappunt: zijn bovenkant is niet te bereiken
    2547    (er zit te weinig pagina onder), en de browser snapt dan naar de dichtstbij-
    2548    zijnde bereikbare positie -- de bodem. Gemeten: snappunt 2548, maxScroll 2356. */
    2549 .feed-reader .read-post:last-child .read-anker { scroll-snap-align: none; }
     2546/* HET LAATSTE BERICHT SNAPT OOK (Robin, 21-8). Dat kon eerst niet: zijn
     2547   bovenkant was onbereikbaar -- er zat te weinig pagina onder om hem naar de
     2548   bovenrand te brengen (gemeten: snappunt 2548, maxScroll 2356), en de browser
     2549   viel dan terug op de dichtstbijzijnde bereikbare positie: de bodem. Het
     2550   snappunt weghalen was de vorige oplossing; dit is de echte.
     2551   Een volle schermhoogte op het LAATSTE bericht maakt die bovenkant precies
     2552   bereikbaar. Korter dan het scherm: het bericht wordt even hoog en het snappunt
     2553   valt exact op maxScroll. Langer dan het scherm: dan was het al haalbaar en
     2554   doet min-height niets.
     2555   100lvh en niet 100svh: op een telefoon met een verdwijnende adresbalk is het
     2556   zichtbare scherm soms de GROTE viewport, en dan komt svh net tekort.
     2557   Zichtbaar kost dit niets: berichten hebben geen kader, alleen een scheidings-
     2558   lijn erboven, dus het laatste bericht krijgt hooguit witruimte eronder. */
     2559.feed-reader .read-post:last-child { min-height: 100lvh; }
    25502560
    25512561/* ELK BERICHT EEN EIGEN SCHERM, als de site dat wil (Instellingen -> Weergave).
     
    25562566   -- want welke van de twee prettiger leest hangt af van wat je schrijft. */
    25572567body[data-reader-pages="1"] .feed-reader .read-post { min-height: 100svh; }
     2568/* OP MOBIEL ALTIJD, wat de instelling ook zegt (Robin, 20-8). Op een telefoon is
     2569   een bericht per scherm de vorm die werkt -- je veegt van bericht naar bericht.
     2570   Op desktop blijft het een keuze, want daar lees je in een kolom naast veel
     2571   witruimte en is een doorlopende stroom vaak prettiger. */
     2572@media (hover: none) and (pointer: coarse) {
     2573    /* Op mobiel draait Lezen in paginamodus (body.is-paged), en die zet hieronder
     2574       een vaste hoogte. Deze regel is de terugval voor het moment vóór de module
     2575       geladen is, zodat de berichten niet eerst als losse stroom in beeld
     2576       springen. */
     2577    .feed-reader .read-post { min-height: 100svh; }
     2578/* Geen native snap op mobiel: dat doet lenis/snap, met een instelbare vangzone
     2579       en duur. Twee snapsystemen op dezelfde scroller vechten. */
     2580    html:has(body.on-home[data-feed-view="reader"]) { scroll-snap-type: none; }
     2581}
     2582
     2583/* -------- PAGINAMODUS --------
     2584   Elk bericht is een paneel van precies een scherm dat ZELF scrollt; tussen
     2585   berichten ga je met knoppen. Daarmee doet het scrollgevoel er niet meer toe:
     2586   geen momentum om na te bouwen en geen snap die vangt.
     2587   De stroom zelf vangt geen vingers meer -- dat regelt lenis.stop() in
     2588   mod/read.js -- en data-lenis-prevent op het paneel houdt de scroll BINNEN een
     2589   bericht ongemoeid (die controle staat in Lenis vóór de gestopt-controle).
     2590   Geldt waar een bericht een eigen scherm heeft: op mobiel altijd, op desktop
     2591   als de site dat zo instelt. */
     2592body.is-paged .feed-reader .read-post {
     2593    height: 100svh;
     2594    min-height: 0;
     2595    overflow-y: auto;
     2596    overscroll-behavior: contain;   /* raakt het einde, dan niet doorschuiven */
     2597    scroll-snap-align: none;
     2598    /* Ruimte voor de twee balken, zodat er nooit tekst onder een knop verdwijnt.
     2599       Het verloop laat een regel wel zacht wegvagen, maar wat je moet KUNNEN
     2600       lezen hoort er niet achter te komen -- vandaar padding en niet alleen die
     2601       fade. --read-balk staat hieronder bij .read-nav, zodat de twee niet uit
     2602       elkaar kunnen lopen. */
     2603    padding-top: calc(var(--read-balk) + .5rem);
     2604    padding-bottom: calc(var(--read-balk) + .5rem);
     2605    /* BOVENAAN beginnen, niet gecentreerd. Ik had de inhoud een ronde lang
     2606       verticaal gecentreerd om het gat onder een kort bericht te verdelen, maar
     2607       dan hangt zo'n bericht halverwege het scherm en begint niet elk paneel op
     2608       dezelfde plek -- dat leest onrustig. Robin ving het (20-8). Elk bericht
     2609       begint nu bovenaan, en de ruimte die overblijft valt onderaan. */
     2610}
     2611body.is-paged .feed-reader .read-anker { scroll-snap-align: none; }
     2612
     2613/* DE DYNAMIC ISLAND, en met opzet alleen op iOS (Robin, 20-8: "op android is het
     2614   een ander verhaal").
     2615   In paginamodus vult een bericht precies het scherm, dus de eerste regel komt
     2616   bovenaan -- en op een iPhone ligt daar de island of de notch overheen.
     2617   env(safe-area-inset-top) geeft daar de vrije ruimte; viewport-fit=cover staat
     2618   al in de viewport-meta, dus die waarde is echt.
     2619   De @supports-regel is de iOS-Safari-toets: -webkit-touch-callout bestaat alleen
     2620   daar. Op Android is env() vaak 0 of betekent het iets anders (camera-uitsparing,
     2621   statusbalk die al meegerekend is), en dan zou dit een gat bovenin maken dat er
     2622   niet hoort. Vandaar afgeschermd in plaats van env() overal toepassen.
     2623   De hoogte krimpt mee, anders duwt de padding het paneel groter dan het scherm
     2624   en krijg je alsnog scroll tussen de berichten. */
     2625@supports (-webkit-touch-callout: none) {
     2626    body.is-paged .feed-reader .read-post {
     2627        padding-top: calc(var(--read-balk) + .5rem + env(safe-area-inset-top, 0px));
     2628        height: calc(100svh - env(safe-area-inset-top, 0px));
     2629    }
     2630    /* De bovenbalk houdt zijn knop al vrij van de island via padding-top
     2631       hierboven; hier hoeft niets extra's meer. */
     2632}
     2633
     2634/* De knop onderaan een bericht: naar het volgende. */
     2635
     2636
     2637/* Omhoog en omlaag: twee balken, boven en onder, die BLIJVEN staan terwijl je in
     2638   een bericht scrolt (Robin, 20-8). Het verloop van paginakleur naar doorzichtig
     2639   laat de tekst eronderdoor wegvagen -- zonder dat zou een regel halverwege hard
     2640   achter de knop verdwijnen en oogt het als een afgeknipte pagina.
     2641   De BALK vangt geen aanrakingen (pointer-events: none), alleen de knop zelf --
     2642   anders zou een strook van 5rem boven- en onderaan je scroll opeten. */
     2643/* TWEE BALKEN over de volle breedte, boven en onder. Eerder waren dit losse
     2644   cirkels (te rommelig naast de tabbalk en de speler) en daarna onzichtbare
     2645   tikzones -- maar die werkten niet, omdat de onderste strook onder de
     2646   mini-speler en de tabbalk ligt en die de tik opvangen. Een balk met een eigen
     2647   z-index kan daar wel overheen.
     2648   Slank gehouden: ze eten hooguit 2.6rem aan elke kant, en het paneel houdt daar
     2649   al ruimte voor vrij. */
     2650:root { --read-balk: 2.6rem; }
     2651.read-bar {
     2652    position: fixed; left: 0; right: 0; z-index: 1060;   /* boven tabbalk (1050) */
     2653    display: flex; align-items: center;
     2654    /* Pijlen LINKS in de balk, niet gecentreerd (Robin, 20-8). */
     2655    justify-content: flex-start;
     2656    padding-left: max(1.1rem, env(safe-area-inset-left, 0px));
     2657    box-sizing: border-box;
     2658    height: var(--read-balk);
     2659    border: 0;
     2660    border-top: 1px solid transparent;
     2661    background: color-mix(in srgb, var(--paper) 90%, var(--ink));
     2662    backdrop-filter: blur(14px) saturate(140%);
     2663    -webkit-backdrop-filter: blur(14px) saturate(140%);
     2664    color: var(--ink);
     2665    cursor: pointer;
     2666    transition: opacity .15s ease;
     2667}
     2668.read-bar--top {
     2669    top: 0;
     2670    height: calc(var(--read-balk) + env(safe-area-inset-top, 0px));
     2671    padding-top: env(safe-area-inset-top, 0px);
     2672    border-bottom: 1px solid color-mix(in srgb, var(--ink) 14%, transparent);
     2673}
     2674.read-bar--bottom {
     2675    /* De waarde komt uit mod/read.js: die meet hoe hoog de tabbalk en de
     2676       mini-speler werkelijk staan. Geraden rem-waarden lieten hem zweven -- een
     2677       kier boven de speler, of er half achter. Dit is de terugval voor de eerste
     2678       frame en voor als de module niet laadt. */
     2679    bottom: 0;
     2680    border-top: 1px solid color-mix(in srgb, var(--ink) 14%, transparent);
     2681}
     2682.read-bar:active { background: color-mix(in srgb, var(--paper) 78%, var(--ink)); }
     2683.read-bar[hidden], body:not(.is-paged) .read-bar { display: none; }
    25582684
    25592685/* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
Note: See TracChangeset for help on using the changeset viewer.