source: Klonkt/src/assets/css/guardian.css@ 86ec01b

main
Last change on this file since 86ec01b was 86ec01b, checked in by roboburr <roboburr@…>, 4 weeks ago

De poortenlijst klapt weer dicht (Barts melding, 9-8)

"Het gate panel zat achter een te verbergen collapsible, daar is die nu onderuit
gekomen." Klopt, en de inklap zelf was niet stuk -- de JS zet hidden netjes.

.g-gates kreeg met het cockpit-werk display: grid, en een auteursregel slaat
de browserstijl [hidden] { display: none } ongeacht specificiteit. Dus stond de
lijst permanent open, en met twaalf poorten maal honderd wards duwt dat precies
alles van het scherm wat de inklap moest voorkomen.

Het geschiedenislogje deelt die klasse en stond dus ook altijd open. Een melding,
twee kwalen.

NIET OP EEN KLASSE GEREPAREERD MAAR OP DE REGEL. .g-panel[hidden] stond er al:
iemand liep hier eerder tegenaan en loste het voor dat ene element op, waarna de
volgende display: de fout opnieuw maakte. Er staan eenentwintig regels met
display: in dit bestand en elke nieuwe is een kandidaat. [hidden] hoort per
definitie boven alles te staan, en dat is de zeldzame plek waar !important het
juiste gereedschap is in plaats van een noodgreep.

Suite 837/837 (837, niet 782: er is werk van anderen bijgekomen).

  • Property mode set to 100644
File size: 15.7 KB
Line 
1/* Guardian PWA (FEP-633c): its own calm, dark surface; the buoy orange is
2 the accent. Standalone: this page never inherits the site theme. */
3:root {
4 --bg: #141a24;
5 --card: #1e2632;
6 --ink: #e8ecf2;
7 --sub: #93a0b4;
8 --line: #2c3646;
9 --accent: #ff6b35;
10 --ok: #4caf7d;
11 --danger: #e05a5a; /* alleen voor onomkeerbare stappen, zoals een ward loslaten */
12}
13* { box-sizing: border-box; }
14body {
15 margin: 0;
16 background: var(--bg);
17 color: var(--ink);
18 font: 16px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
19 padding-bottom: 48px;
20}
21.g-head {
22 display: flex;
23 align-items: center;
24 gap: 12px;
25 padding: 16px;
26 background: var(--card);
27 border-bottom: 1px solid var(--line);
28 position: sticky;
29 top: 0;
30 z-index: 2;
31}
32.g-head-txt { flex: 1; }
33.g-head h1 { font-size: 1.15rem; margin: 0; }
34.g-head .g-sub { margin: 0; color: var(--sub); font-size: .78rem; }
35.g-buoy { font-size: 1.7rem; }
36.g-me { color: var(--sub); font-size: .85rem; }
37#site-picker {
38 background: var(--bg); color: var(--ink);
39 border: 1px solid var(--line); border-radius: 8px; padding: 6px 8px;
40}
41main { max-width: 640px; margin: 0 auto; padding: 8px 16px; }
42
43section { padding: 18px 0; border-bottom: 1px solid var(--line); }
44section:last-child { border-bottom: 0; }
45.g-sec-head { display: flex; align-items: center; gap: 8px; }
46.g-sec-head h2 { font-size: 1.02rem; margin: 0; }
47.g-badge {
48 background: var(--accent); color: #fff; font-size: .72rem; font-weight: 700;
49 min-width: 20px; text-align: center; border-radius: 10px; padding: 1px 7px;
50}
51.g-sec-sub { color: var(--sub); font-size: .84rem; margin: 4px 0 12px; }
52.g-empty { color: var(--sub); font-size: .9rem; margin: 6px 0 0; }
53.g-msg { font-size: .85rem; color: var(--ok); margin: 8px 0 0; }
54.g-msg.err { color: #ff7a7a; }
55.g-list { display: flex; flex-direction: column; gap: 8px; }
56
57.g-card { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; }
58.g-card.help { border-left: 3px solid var(--accent); }
59.g-card .row { display: flex; align-items: center; gap: 10px; }
60.g-card .row .grow { flex: 1; min-width: 0; }
61.g-card .who { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
62.g-card .when { color: var(--sub); font-size: .76rem; white-space: nowrap; }
63.g-card .body { margin-top: 8px; font-size: .92rem; overflow-wrap: anywhere; }
64.g-card .body img { max-width: 100%; border-radius: 8px; margin-top: 6px; }
65.g-link { display: inline-block; margin-top: 8px; color: var(--accent); font-size: .82rem; text-decoration: none; }
66
67.tag { font-size: .72rem; font-weight: 600; padding: 3px 9px; border-radius: 20px; white-space: nowrap; }
68.tag.wait { background: #3a2f1a; color: #e8b04b; }
69.tag.ok { background: #17301f; color: var(--ok); }
70.tag.co { background: #2a1f3a; color: #c39bff; }
71
72#adopt-form { display: flex; gap: 8px; }
73#adopt-form input {
74 flex: 1; min-width: 0;
75 background: var(--bg); color: var(--ink);
76 border: 1px solid var(--line); border-radius: 10px; padding: 11px 12px;
77}
78button {
79 background: var(--accent); color: #fff; border: 0;
80 border-radius: 10px; padding: 11px 18px; font-weight: 600; cursor: pointer;
81}
82button:disabled { opacity: .5; cursor: default; }
83button.quiet { background: transparent; color: var(--sub); border: 1px solid var(--line); font-weight: 500; }
84button.quiet.is-on { color: var(--ok); border-color: var(--ok); }
85button.small { padding: 6px 12px; font-size: .82rem; }
86
87/* Wards' corner (v2 meekijken) */
88.g-card.feed .g-when { color: var(--muted, #888); font-size: .8em; margin-left: auto; }
89.g-card.feed .feed-body { margin-top: 6px; line-height: 1.4; }
90.g-card.feed .feed-body img { max-width: 100%; border-radius: 8px; }
91
92/* ── The body of a post ────────────────────────────────────────────────────
93 The 🛟 card shows a real post, so it is rendered by the same partial de
94 Krant and Berichten use (partials/note-body). These are that partial's
95 classes, in the PWA's own colours: the dashboard is standalone and does not
96 load the site's stylesheet. */
97.g-note .tl-content { line-height: 1.5; overflow-wrap: anywhere; }
98.g-note .tl-content p { margin: .35rem 0; }
99.g-note .tl-content p:first-child { margin-top: 0; }
100.g-note .tl-content p:last-child { margin-bottom: 0; }
101.g-note .tl-content a { color: var(--accent); }
102.g-note img.emoji { height: 1.25em; width: auto; margin: 0 .05em; vertical-align: -.2em;
103 display: inline-block; border-radius: 0; background: none; }
104
105/* Quote card and link preview: one card, two origins. */
106.g-note .tl-quote { margin: 8px 0 0; padding: 8px 10px; border-radius: 10px;
107 border: 1px solid var(--line); background: var(--card-2, rgba(128,128,128,.07)); }
108.g-note .tl-quote-head { display: flex; align-items: center; gap: 6px; margin: 0 0 4px; min-width: 0; }
109.g-note .tl-quote-avatar { flex: 0 0 auto; width: 20px; height: 20px; border-radius: 50%; object-fit: cover; }
110.g-note .tl-quote-name { font-weight: 600; font-size: .82rem; white-space: nowrap; }
111.g-note .tl-quote-handle { color: var(--sub); font-size: .76rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
112.g-note .tl-quote-body { color: var(--sub); font-size: .88rem; line-height: 1.45; max-height: 14em; overflow: hidden; }
113.g-note .tl-quote-media { display: block; margin: 6px 0 0; }
114
115/* The capture a 🛟 usually carries. */
116.g-note .tl-media { display: flex; flex-direction: column; gap: 6px; margin: 8px 0 0; }
117.g-note .tl-media-img { display: block; border-radius: 10px; overflow: hidden; }
118.g-note .tl-media-img img { width: 100%; height: auto; display: block; background: #fff; }
119.g-note .tl-media-video, .g-note .tl-media-audio { width: 100%; margin: 8px 0 0; border-radius: 10px; display: block; }
120.g-note .tl-media-video { max-height: 320px; background: #000; }
121
122/* ── Paneel per ward ───────────────────────────────────────────────────────
123 Een guardian denkt per kind, niet per functie: achter de regel van een kind
124 zit alles over dat kind. De regel zelf draagt de tellers, zodat een dicht
125 paneel nooit iets verbergt dat een antwoord nodig heeft. */
126.g-card.ward > .row { gap: 8px; }
127.g-panel { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line); }
128/* HIDDEN MOET ALTIJD WINNEN, van elke display-regel hierboven of hieronder.
129 Dit stond eerst alleen op .g-panel, en toen de poortenlijst `display: grid`
130 kreeg klapte die niet meer dicht -- Barts melding (9-8): "die is er onderuit
131 gekomen". Ook het geschiedenislogje deelde die klasse en stond dus permanent
132 open.
133
134 Een auteursregel slaat de browserstijl `[hidden] { display: none }` ongeacht
135 specificiteit, dus elke nieuwe `display:` in dit bestand zou de fout opnieuw
136 maken. Dit is de zeldzame plek waar !important het juiste gereedschap is: de
137 regel hoort per definitie boven alles te staan. */
138[hidden] { display: none !important; }
139.g-panel-sec + .g-panel-sec { margin-top: 16px; }
140.g-panel-sec h3 { margin: 0 0 6px; font-size: .82rem; font-weight: 600; letter-spacing: .03em;
141 text-transform: uppercase; color: var(--sub); }
142.g-panel-sec .g-card { background: transparent; border-color: var(--line); }
143.g-panel-sec .g-card + .g-card { margin-top: 6px; }
144.g-panel-sec .row { flex-wrap: wrap; }
145.g-empty.small { margin: 0; font-size: .85rem; }
146.tag.help { color: var(--accent); border-color: var(--accent); }
147
148/* Loslaten van een ward: geen browser-confirm maar een stap in het paneel, met
149 de gevolgen erbij. Rustig van kleur; het is een besluit, geen alarm. */
150.g-warn { margin-top: 10px; padding: 12px 14px; border-radius: 10px;
151 border: 1px solid var(--danger); background: color-mix(in srgb, var(--danger) 8%, transparent); }
152.g-warn strong { display: block; margin-bottom: 6px; }
153.g-warn p { margin: 0 0 8px; font-size: .88rem; line-height: 1.45; color: var(--sub); }
154.g-warn p.grave { color: var(--ink); font-weight: 500; }
155.g-warn .row { margin-top: 10px; gap: 8px; }
156button.danger { background: var(--danger); color: #fff; border-color: var(--danger); }
157
158/* ── Beschikbaarheid (FEP-633c 3.6) ────────────────────────────────────────
159 De buddy-list-stip op de verantwoordelijkheids-as: groen beschikbaar, geel
160 afwezig-verklaard met een einde, grijs slapend-geconstateerd (een antwoord
161 herstelt alles). Labels zijn UI; de draad houdt de spec-termen. */
162.g-avdot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; flex: 0 0 auto; }
163.g-avdot.is-active { background: var(--ok); }
164.g-avdot.is-away { background: #e0a83a; }
165.g-avdot.is-dormant { background: #8a93a3; }
166.g-avlabel { color: var(--sub); font-size: .8rem; white-space: nowrap; }
167.row.g-guard { gap: 8px; margin-top: 6px; }
168/* The status of a proposal this guardian sent (5.6): one quiet line per
169 feature. The colour says the state before the words do. */
170.g-prop { margin: 6px 0 0; color: var(--sub); }
171.g-prop-accepted { color: var(--ok); }
172.g-prop-rejected, .g-prop-expired { color: var(--danger); }
173.g-away-row { display: flex; gap: 8px; }
174.g-card.lapse { border-left: 3px solid #8a93a3; }
175.g-card.lapse .row { margin-top: 8px; gap: 8px; }
176
177/* Een voorgestelde gated setting (FEP-633c 5.6) van een mede-guardian. */
178.g-card.gated { border-left: 3px solid var(--accent); }
179.g-card.gated .row { margin-top: 8px; gap: 8px; }
180
181/* Het gate-paneel per ward (shaer-ahy.1). Een rij per gate, met het soort en de
182 drempel erbij. Bewust rustig: dit is een overzicht om te LEZEN, en pas daarna
183 een plek om iets voor te stellen. */
184.g-gate { padding: .5rem 0; border-top: 1px solid var(--g-line, rgba(0,0,0,.08)); }
185.g-gate:first-of-type { border-top: 0; }
186.g-gate-head { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
187.g-gate-name { font-weight: 600; }
188/* Het soort is een fluistering, geen kop: het hoort erbij te staan zonder de
189 naam van de gate te overstemmen. */
190.g-gate-kind { font-size: .78em; opacity: .65; }
191.g-gate-meta { display: flex; gap: .75rem; flex-wrap: wrap; margin-top: .15rem; }
192.g-gate-meta .g-dim { opacity: .55; }
193/* Onomkeerbaar krijgt gewicht, want dat is het enige in dit paneel dat je niet
194 kunt terugdraaien. */
195.g-gate-warn { font-weight: 600; }
196.g-gate-wait { font-weight: 600; }
197
198/* De gedeelde staat van een hulpvraag (shaer-lgo). Rustig: dit is geen alarm,
199 het moet alleen onmogelijk te missen zijn wie er al op af is. */
200.g-help-state { margin-top: .5rem; }
201.g-help-pick { font-size: .9em; }
202.g-help-age { opacity: .6; } /* oud, maar niet weg */
203.g-help-done { font-weight: 600; }
204.g-confirm { margin-top: .5rem; }
205
206/* Het archief van afgehandelde hulpvragen: aanwezig, niet in de weg. */
207.g-help-archive { margin-top: .5rem; opacity: .75; }
208
209/* De geschiedenis onderaan een wardpaneel: aanwezig, duidelijk afgesloten, en
210 visueel losgemaakt van wat nog wacht. */
211.g-panel-history { border-top: 2px solid var(--g-line, rgba(0,0,0,.12)); margin-top: 1rem; opacity: .8; }
212
213/* ── Het poortenpaneel als cockpit (shaer-ahy.1, Barts richting 8-8) ──
214 Elke gate is een toets zoals op een aircopaneel: lampje links, naam erop,
215 en een klein verzonken statusveld met de stand als tekst. Het lampje en het
216 veld zeggen hetzelfde in twee vormen -- kleur alleen is geen antwoord. */
217.g-gates { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: .5rem; margin: .35rem 0; }
218.g-sw-wrap { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
219.g-sw {
220 display: flex; flex-direction: column; align-items: stretch; gap: .3rem;
221 text-align: left; padding: .5rem .6rem; border-radius: 10px;
222 border: 1px solid var(--g-line, rgba(0,0,0,.18));
223 background: var(--g-key, linear-gradient(180deg, rgba(255,255,255,.9), rgba(0,0,0,.04)));
224 box-shadow: inset 0 1px 0 rgba(255,255,255,.6), 0 1px 2px rgba(0,0,0,.12);
225 cursor: pointer; font: inherit;
226 /* Expliciet, niet geerfd (Barts aanwijzing, 8-8): de paginakleur zakte weg
227 in het toetsvlak. Het opschrift is het donkerste op de toets. */
228 color: var(--g-key-ink, #1b1e22);
229}
230.g-sw:active:not([disabled]) { box-shadow: inset 0 1px 3px rgba(0,0,0,.25); transform: translateY(1px); }
231/* Niet verstelbaar is niet kapot: de toets drukt niet in, de stand blijft leesbaar. */
232.g-sw[disabled] { cursor: default; opacity: .8; }
233.g-sw-head { display: flex; align-items: center; gap: .45em; min-width: 0; }
234.g-sw-name { font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
235
236/* Het lampje. Aan gloeit, uit is dof, onbeslist is een open kringetje (geen
237 besluit is de afwezigheid van een), wachten knippert -- de enige stand die
238 vanzelf verandert, dus de enige die om je blik mag vragen -- en gepland is
239 een lege fitting: een poort die nog niet bestaat is geen dichte deur. */
240.g-sw-lamp { flex: none; width: .6em; height: .6em; border-radius: 50%; box-shadow: inset 0 0 2px rgba(0,0,0,.35); }
241.g-lamp-on { background: var(--g-lamp-on, #2f9e5f); box-shadow: 0 0 6px 1px rgba(47,158,95,.55); }
242.g-lamp-off { background: var(--g-lamp-off, #7a8087); }
243.g-lamp-undecided { background: transparent; border: 1px dashed currentColor; opacity: .55; box-shadow: none; }
244.g-lamp-waiting { background: var(--g-warn, #b8860b); animation: g-lamp-pulse 1.4s ease-in-out infinite; }
245.g-lamp-planned { background: transparent; border: 1px dotted currentColor; opacity: .4; box-shadow: none; }
246@keyframes g-lamp-pulse { 50% { opacity: .3; } }
247@media (prefers-reduced-motion: reduce) { .g-lamp-waiting { animation: none; } }
248
249/* In het donker geen lichte toetsen: de site heeft een echt donker thema
250 (style.css), en een wit-op-lichtgrijs paneel is daar onleesbaar. Zelfde
251 vorm, andere verf; de vars blijven overschrijfbaar. */
252@media (prefers-color-scheme: dark) {
253 .g-sw {
254 background: var(--g-key, linear-gradient(180deg, rgba(255,255,255,.10), rgba(0,0,0,.25)));
255 box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 1px 2px rgba(0,0,0,.5);
256 color: var(--g-key-ink, rgba(255,255,255,.95));
257 }
258 .g-sw-state { background: var(--g-lcd, rgba(0,0,0,.4)); }
259}
260
261/* Het statusveld: verzonken venstertje, vaste letter, zoals de temperatuur op
262 het aircopaneel. */
263.g-sw-state {
264 align-self: flex-start; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
265 font-size: .74em; padding: .1em .5em; border-radius: 4px;
266 border: 1px solid var(--g-line, rgba(0,0,0,.18));
267 background: var(--g-lcd, rgba(0,0,0,.07));
268 box-shadow: inset 0 1px 2px rgba(0,0,0,.12);
269 /* Het oplichtende display van de toets: de stand in de accentkleur van het
270 huis (Barts aanwijzing, 8-8), zoals de cijfers op het aircopaneel. */
271 color: var(--accent, #6b8f71);
272 font-weight: 600;
273}
274.g-sw-meta { display: flex; flex-wrap: wrap; gap: .3em .7em; opacity: .7; font-size: .82em; }
275
276/* De poortenlijst blijft ingeklapt tot je hem opent. Met twaalf toetsen duwt
277 een open paneel alles eronder van het scherm. */
278.g-gates-toggle { display: block; width: 100%; text-align: left; margin: .25rem 0; }
279
280/* De waarschuwing bij een gate-voorstel (shaer-nf9). Geen rode paniekbalk: dit
281 moet gelezen worden, niet weggeklikt. Een rand links, zoals een citaat. */
282.g-warn { margin: .5rem 0; padding: .4rem 0 .4rem .7rem; border-left: 3px solid var(--g-warn, #b8860b); }
283.g-warn p { margin: 0 0 .25rem; }
284.g-warn p:last-child { margin-bottom: 0; }
285.g-confirm .g-warn { border-left: 0; padding-left: 0; }
286
287/* De vraag van het kind zelf (shaer-8ru). Het enige op een poortrij dat van het
288 kind komt, dus niet grijs weggeschreven tussen de drempels. */
289.g-gate-asked { margin: .2rem 0 0; color: var(--g-asked, #7a5ea8); font-weight: 600; }
290
291/* "Jouw antwoord beslist dit" (shaer-8vt). Zwaarder dan de rest van de
292 waarschuwing: dit is het verschil tussen meedoen en beslissen. */
293.g-decisive { font-weight: 700; color: var(--g-decisive, #a33); }
Note: See TracBrowser for help on using the repository browser.