source: Klonkt/src/assets/css/ward.css@ a5a6249

Last change on this file since a5a6249 was a5a6249, checked in by Robin <roboburr@…>, 3 months ago

De Ward PWA: de feed en de reddingsboei

Plak 2. Nu valt er iets te doen op /ward in plaats van alleen te kijken.

DE FEED. Dezelfde bron als de Krant (getTimeline) en dezelfde partial
voor de body (renderNoteBody), zodat een post er overal hetzelfde uitziet:
opmaak, media, quote-kaart, embed. Alleen kale content doorgeven zou een
lege regel opleveren waar een foto hoort, precies de fout die het
guardian-dashboard ooit had.

DE BOEI, en die is hier BETER dan in de app. Shaer maakt een
schermafdruk van de kaart, met al het gedoe van buiten beeld renderen.
Op de server weten we wélke note het is, dus de hulpvraag draagt de note
zelf mee. Een guardian ziet daardoor de echte post en niet een plaatje
dat er ooit op leek.

Slepen met pointer-events, want dat is het enige dat op een telefoon en
met een muis hetzelfde doet. touch-action: none op de boei houdt de
pagina stil tijdens het slepen; zonder dat vecht het met scrollen en
verlies je hem halverwege. De kaart eronder licht op, want mikken met een
vinger zonder terugkoppeling is gokken. Een tik zonder slepen vraagt hulp
zonder dat er een post bij hoort, en de grote knop bovenaan doet
hetzelfde.

Changed files:
src/routes/ward.js

  • /api/feed met afgemaakte body per kaart
  • /api/help: direct bericht aan ALLE guardians, met de note erbij; 409 als er geen guardians zijn, want dan is er niets te vragen

src/views/pages/ward.ejs

  • feed-sectie, zwevende boei, hulpdialoog

src/assets/js/ward.js

  • kaarten tekenen, slepen, mikken, versturen

src/assets/css/ward.css

  • kaarten, boei, dialoog, sr-only

src/services/i18n.js

  • acht nieuwe sleutels in nl, en, de

test/ward-pwa.test.js

  • de feed levert een gerenderde body; de boei weigert zonder guardians; een vreemde kan hem niet afvuren

remarks: 889 tests groen. Slepen is alleen in code getest, niet met een
echte vinger op een echt scherm; dat is aan Robin op dev.

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

  • Property mode set to 100644
File size: 4.5 KB
RevLine 
[303bfc4]1/* De Ward PWA: rustig, groot genoeg voor een kind, donker als de rest. */
2:root {
3 --bg: #141a24;
4 --card: #1c2431;
5 --ink: #eef2f8;
6 --dim: #9aa7bb;
7 --accent: #5a32e6;
8 --alarm: #ef9f27;
9 --ok: #46c26a;
10}
11* { box-sizing: border-box; }
12body {
13 margin: 0; padding: 16px calc(16px + env(safe-area-inset-right)) 32px calc(16px + env(safe-area-inset-left));
14 background: var(--bg); color: var(--ink);
15 font: 16px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
16}
17h1 { font-size: 1.4rem; margin: 8px 0 20px; }
18h2 { font-size: 1rem; margin: 24px 0 10px; color: var(--dim); font-weight: 600; }
19
20/* De hulpknop is het belangrijkste element op deze pagina en ziet er ook zo
21 uit: vol breed, grote raakzone, geen concurrentie eromheen. */
22.help button {
23 width: 100%; padding: 18px; border: 0; border-radius: 14px;
24 background: var(--accent); color: #fff; font-size: 1.1rem; font-weight: 600;
25}
26.help button:disabled { background: #3a3f4d; color: var(--dim); }
27.help .hint { margin: 8px 2px 0; color: var(--dim); font-size: .85rem; }
28
29.list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
30.card { background: var(--card); border-radius: 12px; padding: 12px 14px; }
31.row { display: flex; align-items: center; gap: 10px; }
32.name { font-weight: 600; margin: 0; }
33.hint { color: var(--dim); font-size: .85rem; margin: 6px 0 0; }
34.empty { color: var(--dim); }
35
36.chip { margin-left: auto; font-size: .75rem; padding: 3px 9px; border-radius: 999px; background: #2a3342; color: var(--dim); }
37.chip.ok { background: rgba(70,194,106,.16); color: var(--ok); }
38.chip.away { background: rgba(239,159,39,.16); color: var(--alarm); }
39
40/* Misvormd krijgt de alarmkleur, onbereikbaar bewust NIET: niet-weten is geen
41 misconfiguratie. Maar het is ook geen goedkeuring, dus het staat er wel. */
42.note { margin: 8px 0 0; font-size: .85rem; padding: 6px 9px; border-radius: 8px; }
43.note.alarm { background: rgba(239,159,39,.16); color: var(--alarm); }
44.note.unknown { background: rgba(154,167,187,.14); color: var(--dim); }
[a5a6249]45
46/* ── De feed ──────────────────────────────────────────────────────────── */
47.cards { display: grid; gap: 12px; }
48.post { background: var(--card); border-radius: 12px; padding: 12px 14px; border: 2px solid transparent; }
49.post .avatar { width: 28px; height: 28px; border-radius: 50%; object-fit: cover; }
50.post .when { margin-left: auto; color: var(--dim); font-size: .8rem; }
51.post .cw { color: var(--alarm); font-size: .85rem; margin: 6px 0 0; }
52.post .body { margin-top: 8px; overflow-wrap: anywhere; }
53.post .body img, .post .body video { max-width: 100%; height: auto; border-radius: 8px; }
54/* Waar de boei zou landen. Zichtbaar oplichten, want mikken met een vinger
55 zonder terugkoppeling is gokken. */
56.post.hover { border-color: var(--accent); }
57
58/* ── De reddingsboei ──────────────────────────────────────────────────── */
59#buoy {
60 position: fixed; right: 18px; bottom: calc(18px + env(safe-area-inset-bottom));
61 width: 76px; height: 76px; border: 0; border-radius: 50%;
62 background: transparent; font-size: 52px; line-height: 1;
63 /* Zonder dit vecht slepen met scrollen en verlies je hem halverwege. */
64 touch-action: none; cursor: grab; z-index: 50;
65}
66#buoy.dragging { cursor: grabbing; transform: scale(1.1); }
67
68dialog#help-dialog {
69 border: 0; border-radius: 16px; padding: 18px; max-width: 420px; width: calc(100% - 32px);
70 background: var(--card); color: var(--ink);
71}
72dialog#help-dialog::backdrop { background: rgba(0,0,0,.5); }
73dialog#help-dialog h2 { margin: 0 0 10px; font-size: 1.05rem; color: var(--ink); }
74dialog#help-dialog label { display: block; color: var(--dim); font-size: .85rem; margin-bottom: 4px; }
75dialog#help-dialog textarea {
76 width: 100%; border-radius: 10px; border: 1px solid #2a3342;
77 background: #131a25; color: var(--ink); padding: 8px; font: inherit;
78}
79dialog#help-dialog menu { display: flex; gap: 8px; justify-content: flex-end; margin: 14px 0 0; padding: 0; }
80dialog#help-dialog button { border: 0; border-radius: 10px; padding: 10px 14px; background: #2a3342; color: var(--ink); font: inherit; }
81dialog#help-dialog button.primary { background: var(--accent); color: #fff; font-weight: 600; }
82
83/* Voor schermlezers, niet voor het oog. */
84.sr-only {
85 position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
86 overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
87}
Note: See TracBrowser for help on using the repository browser.