source: Klonkt/src/assets/css/style.css@ 19fbe03

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

Palettes: drop Stone+Terracotta, add Ocean+Candy, rework warm to 'Sand'

  • 8 palettes: klonkt, paper, forest, sunset, Sand (warm paper, clay accent, not yellow; key 'cream'), lilac, Ocean (klonkt navy + blue), Candy (klonkt navy + red).
  • Ocean/Candy reuse the klonkt structure with their own accent (Robin: klonkt-based looks best). CSS blocks added; cream block reworked to Sand.
  • Accents: drop Oranje + Bruin; Rood -> Candy-rood (#e11d48). style.css?v=45.

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

  • Property mode set to 100644
File size: 140.8 KB
Line 
1/* ============================================================
2 LOKALE FONTS — SIL OFL 1.1 licensed, self-hosted
3 Geen third-party requests, geen privacy-leak naar Google.
4 Variable WOFF2 bestanden onder /assets/fonts/
5 Licenses in /assets/fonts/licenses/
6 ============================================================ */
7@font-face {
8 font-family: 'Fraunces';
9 font-style: normal;
10 font-display: swap;
11 font-weight: 100 900;
12 src: url('/assets/fonts/fraunces-latin-full-normal.woff2') format('woff2-variations');
13 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
14}
15@font-face {
16 font-family: 'Fraunces';
17 font-style: italic;
18 font-display: swap;
19 font-weight: 100 900;
20 src: url('/assets/fonts/fraunces-latin-full-italic.woff2') format('woff2-variations');
21 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
22}
23@font-face {
24 font-family: 'Literata';
25 font-style: normal;
26 font-display: swap;
27 font-weight: 400 700;
28 src: url('/assets/fonts/literata-latin-opsz-normal.woff2') format('woff2-variations');
29 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
30}
31@font-face {
32 font-family: 'Literata';
33 font-style: italic;
34 font-display: swap;
35 font-weight: 400 700;
36 src: url('/assets/fonts/literata-latin-opsz-italic.woff2') format('woff2-variations');
37 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
38}
39@font-face {
40 font-family: 'Plus Jakarta Sans';
41 font-style: normal;
42 font-display: swap;
43 font-weight: 400 700;
44 src: url('/assets/fonts/plus-jakarta-sans-latin-wght-normal.woff2') format('woff2-variations');
45 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
46}
47@font-face {
48 font-family: 'Plus Jakarta Sans';
49 font-style: italic;
50 font-display: swap;
51 font-weight: 400 700;
52 src: url('/assets/fonts/plus-jakarta-sans-latin-wght-italic.woff2') format('woff2-variations');
53 unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
54}
55
56/* PrutCMS publieke stijl — editorial-ish, geen emoji-UI */
57
58:root {
59 --font-display: 'Fraunces', Georgia, serif;
60 --font-body: 'Literata', Georgia, serif;
61 --font-ui: 'Plus Jakarta Sans', system-ui, sans-serif;
62 --font-mono: ui-monospace, Menlo, Consolas, monospace;
63 --radius: 8px; --transition: 180ms cubic-bezier(.4,0,.2,1);
64 --safe-top: env(safe-area-inset-top, 0); --safe-bot: env(safe-area-inset-bottom, 0);
65 color-scheme: light dark;
66}
67
68/* Native controls (datum/tijd-picker, scrollbars) het SITE-thema laten volgen i.p.v.
69 de OS-voorkeur, en de datum/tijd-velden de site-accentkleur geven. Zo staat de
70 ingebouwde kalender-popup in dark + accent (de popup zelf is een browser-widget,
71 dus fonts/randen blijven van de browser). */
72[data-theme="dark"] { color-scheme: dark; }
73[data-theme="light"] { color-scheme: light; }
74input[type="date"], input[type="time"], input[type="datetime-local"] { accent-color: var(--accent, #6b8f71); }
75input[type="date"]::-webkit-calendar-picker-indicator,
76input[type="time"]::-webkit-calendar-picker-indicator,
77input[type="datetime-local"]::-webkit-calendar-picker-indicator { cursor: pointer; opacity: .7; }
78input[type="date"]:hover::-webkit-calendar-picker-indicator,
79input[type="time"]:hover::-webkit-calendar-picker-indicator,
80input[type="datetime-local"]:hover::-webkit-calendar-picker-indicator { opacity: 1; }
81
82/* ============================================================
83 PALETTES — elk palette definieert alleen bg/tekst/rand shades.
84 --accent wordt LOS ingesteld via de accent-kleur config (inline in template).
85 Palette-selector: <html data-palette="forest"> en optioneel data-theme="dark"|"light".
86 Als geen data-palette = Sage default.
87 ============================================================ */
88
89/* ── SAGE (default) ── warme crème ── */
90:root,
91[data-palette="sage"] {
92 --paper: #faf8f3; --paper-2: #f2ede0;
93 --ink: #1a1a1a; --ink-soft: #3d3833; --ink-muted: #6b6560; --ink-faint: #a8a29e;
94 --rule: #e8e2d5; --rule-2: #d4ccb8;
95}
96@media (prefers-color-scheme: dark) {
97 :root:not([data-theme="light"]):not([data-palette]),
98 [data-palette="sage"]:not([data-theme="light"]) {
99 --paper: #1c1a17; --paper-2: #252220;
100 --ink: #f4ede0; --ink-soft: #d4ccb8; --ink-muted: #a8a29e; --ink-faint: #6b6560;
101 --rule: #3d3833; --rule-2: #4d4740;
102 }
103}
104[data-theme="dark"]:not([data-palette]),
105[data-theme="dark"][data-palette="sage"] {
106 --paper: #1c1a17; --paper-2: #252220;
107 --ink: #f4ede0; --ink-soft: #d4ccb8; --ink-muted: #a8a29e; --ink-faint: #6b6560;
108 --rule: #3d3833; --rule-2: #4d4740;
109}
110
111/* ── KLONKT ── merk-standaard: off-white → donkerblauw (klonkt.com) ── */
112[data-palette="klonkt"] {
113 --paper: #f3f1ea; --paper-2: #e7e4d9;
114 --ink: #11141c; --ink-soft: #2b3040; --ink-muted: #5b6473; --ink-faint: #9aa3b2;
115 --rule: #d8d4c6; --rule-2: #c5c0af;
116}
117@media (prefers-color-scheme: dark) {
118 [data-palette="klonkt"]:not([data-theme="light"]) {
119 --paper: #0b0d12; --paper-2: #11141c;
120 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
121 --rule: #232a38; --rule-2: #2b3040;
122 }
123}
124[data-theme="dark"][data-palette="klonkt"] {
125 --paper: #0b0d12; --paper-2: #11141c;
126 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
127 --rule: #232a38; --rule-2: #2b3040;
128}
129
130/* ── PAPER ── minimalistisch wit → zwart ── */
131[data-palette="paper"] {
132 --paper: #ffffff; --paper-2: #f4f4f5;
133 --ink: #09090b; --ink-soft: #27272a; --ink-muted: #52525b; --ink-faint: #a1a1aa;
134 --rule: #e4e4e7; --rule-2: #d4d4d8;
135}
136@media (prefers-color-scheme: dark) {
137 [data-palette="paper"]:not([data-theme="light"]) {
138 --paper: #0a0a0a; --paper-2: #18181b;
139 --ink: #fafafa; --ink-soft: #d4d4d8; --ink-muted: #a1a1aa; --ink-faint: #71717a;
140 --rule: #27272a; --rule-2: #3f3f46;
141 }
142}
143[data-theme="dark"][data-palette="paper"] {
144 --paper: #0a0a0a; --paper-2: #18181b;
145 --ink: #fafafa; --ink-soft: #d4d4d8; --ink-muted: #a1a1aa; --ink-faint: #71717a;
146 --rule: #27272a; --rule-2: #3f3f46;
147}
148
149
150/* ── FOREST ── olijfgroen → donker bos ── */
151[data-palette="forest"] {
152 --paper: #f2f6ed; --paper-2: #e1ead6;
153 --ink: #1a2e15; --ink-soft: #2d4a26; --ink-muted: #5a6f52; --ink-faint: #8aa080;
154 --rule: #ccddbd; --rule-2: #adc396;
155}
156@media (prefers-color-scheme: dark) {
157 [data-palette="forest"]:not([data-theme="light"]) {
158 --paper: #0d1f12; --paper-2: #1a331e;
159 --ink: #dcf2d0; --ink-soft: #b8d8a8; --ink-muted: #8aad7c; --ink-faint: #5a7a50;
160 --rule: #2d4a30; --rule-2: #3d5e42;
161 }
162}
163[data-theme="dark"][data-palette="forest"] {
164 --paper: #0d1f12; --paper-2: #1a331e;
165 --ink: #dcf2d0; --ink-soft: #b8d8a8; --ink-muted: #8aad7c; --ink-faint: #5a7a50;
166 --rule: #2d4a30; --rule-2: #3d5e42;
167}
168
169/* ── STONE ── beige bruin → koffie ── */
170[data-palette="stone"] {
171 --paper: #f5f0e8; --paper-2: #e7ddce;
172 --ink: #2b2218; --ink-soft: #4a3a2a; --ink-muted: #78614a; --ink-faint: #a8927b;
173 --rule: #d6c6ac; --rule-2: #bda98a;
174}
175@media (prefers-color-scheme: dark) {
176 [data-palette="stone"]:not([data-theme="light"]) {
177 --paper: #1a130b; --paper-2: #2d2416;
178 --ink: #f5e9d5; --ink-soft: #d4c0a3; --ink-muted: #a8927b; --ink-faint: #786452;
179 --rule: #3d2f1e; --rule-2: #534029;
180 }
181}
182[data-theme="dark"][data-palette="stone"] {
183 --paper: #1a130b; --paper-2: #2d2416;
184 --ink: #f5e9d5; --ink-soft: #d4c0a3; --ink-muted: #a8927b; --ink-faint: #786452;
185 --rule: #3d2f1e; --rule-2: #534029;
186}
187
188/* ── MIDNIGHT ── lavendel → donker paars ── */
189[data-palette="midnight"] {
190 --paper: #f3f1f8; --paper-2: #e3ddf0;
191 --ink: #1e1a2e; --ink-soft: #332c4d; --ink-muted: #5e5478; --ink-faint: #9288a8;
192 --rule: #d4cae3; --rule-2: #b8a9cc;
193}
194@media (prefers-color-scheme: dark) {
195 [data-palette="midnight"]:not([data-theme="light"]) {
196 --paper: #0f0a1f; --paper-2: #1c1432;
197 --ink: #e9def7; --ink-soft: #c4b5d9; --ink-muted: #9d88b8; --ink-faint: #6b5a85;
198 --rule: #2d1f4a; --rule-2: #3d2b5e;
199 }
200}
201[data-theme="dark"][data-palette="midnight"] {
202 --paper: #0f0a1f; --paper-2: #1c1432;
203 --ink: #e9def7; --ink-soft: #c4b5d9; --ink-muted: #9d88b8; --ink-faint: #6b5a85;
204 --rule: #2d1f4a; --rule-2: #3d2b5e;
205}
206
207/* ── SUNSET ── roze crème → diep paars-roze ── */
208[data-palette="sunset"] {
209 --paper: #fdf4f3; --paper-2: #f7e1dc;
210 --ink: #2e1618; --ink-soft: #4d282b; --ink-muted: #7a4a4e; --ink-faint: #b08589;
211 --rule: #ebcac3; --rule-2: #d9a8a0;
212}
213@media (prefers-color-scheme: dark) {
214 [data-palette="sunset"]:not([data-theme="light"]) {
215 --paper: #1f0a14; --paper-2: #321525;
216 --ink: #fce7f3; --ink-soft: #f0c5d3; --ink-muted: #c896a8; --ink-faint: #8a6878;
217 --rule: #4a1f35; --rule-2: #5e2d43;
218 }
219}
220[data-theme="dark"][data-palette="sunset"] {
221 --paper: #1f0a14; --paper-2: #321525;
222 --ink: #fce7f3; --ink-soft: #f0c5d3; --ink-muted: #c896a8; --ink-faint: #8a6878;
223 --rule: #4a1f35; --rule-2: #5e2d43;
224}
225
226/* ── SAND ── warm papier (subtiel, niet fel geel) → warm donker ── (key blijft 'cream') */
227[data-palette="cream"] {
228 --paper: #f7f3ec; --paper-2: #ece5d8;
229 --ink: #232019; --ink-soft: #43392c; --ink-muted: #6f6149; --ink-faint: #a3957c;
230 --rule: #ddd3c0; --rule-2: #c9bca3;
231}
232@media (prefers-color-scheme: dark) {
233 [data-palette="cream"]:not([data-theme="light"]) {
234 --paper: #14120d; --paper-2: #221e15;
235 --ink: #efe9dd; --ink-soft: #d0c6b2; --ink-muted: #a3957c; --ink-faint: #6f6149;
236 --rule: #322c20; --rule-2: #463d2c;
237 }
238}
239[data-theme="dark"][data-palette="cream"] {
240 --paper: #14120d; --paper-2: #221e15;
241 --ink: #efe9dd; --ink-soft: #d0c6b2; --ink-muted: #a3957c; --ink-faint: #6f6149;
242 --rule: #322c20; --rule-2: #463d2c;
243}
244
245/* ── OCEAN ── klonkt-structuur (navy → off-white), blauw accent ── */
246[data-palette="ocean"] {
247 --paper: #f3f1ea; --paper-2: #e7e4d9;
248 --ink: #11141c; --ink-soft: #2b3040; --ink-muted: #5b6473; --ink-faint: #9aa3b2;
249 --rule: #d8d4c6; --rule-2: #c5c0af;
250}
251@media (prefers-color-scheme: dark) {
252 [data-palette="ocean"]:not([data-theme="light"]) {
253 --paper: #0b0d12; --paper-2: #11141c;
254 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
255 --rule: #232a38; --rule-2: #2b3040;
256 }
257}
258[data-theme="dark"][data-palette="ocean"] {
259 --paper: #0b0d12; --paper-2: #11141c;
260 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
261 --rule: #232a38; --rule-2: #2b3040;
262}
263
264/* ── CANDY ── klonkt-structuur (navy → off-white), candy-rood accent ── */
265[data-palette="candy"] {
266 --paper: #f3f1ea; --paper-2: #e7e4d9;
267 --ink: #11141c; --ink-soft: #2b3040; --ink-muted: #5b6473; --ink-faint: #9aa3b2;
268 --rule: #d8d4c6; --rule-2: #c5c0af;
269}
270@media (prefers-color-scheme: dark) {
271 [data-palette="candy"]:not([data-theme="light"]) {
272 --paper: #0b0d12; --paper-2: #11141c;
273 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
274 --rule: #232a38; --rule-2: #2b3040;
275 }
276}
277[data-theme="dark"][data-palette="candy"] {
278 --paper: #0b0d12; --paper-2: #11141c;
279 --ink: #f3f1ea; --ink-soft: #c8cdd6; --ink-muted: #9aa3b2; --ink-faint: #6b7280;
280 --rule: #232a38; --rule-2: #2b3040;
281}
282
283/* ── ROSE ── zacht roze → wijnrood ── */
284[data-palette="rose"] {
285 --paper: #fdf2f4; --paper-2: #f8dde3;
286 --ink: #2e1419; --ink-soft: #4d242c; --ink-muted: #7a4651; --ink-faint: #b3838d;
287 --rule: #f0c9d1; --rule-2: #e0a3af;
288}
289@media (prefers-color-scheme: dark) {
290 [data-palette="rose"]:not([data-theme="light"]) {
291 --paper: #1f0a0f; --paper-2: #33141c;
292 --ink: #fce4ea; --ink-soft: #f0bcc8; --ink-muted: #c98f9d; --ink-faint: #8a6470;
293 --rule: #4a1f2c; --rule-2: #5e2d3a;
294 }
295}
296[data-theme="dark"][data-palette="rose"] {
297 --paper: #1f0a0f; --paper-2: #33141c;
298 --ink: #fce4ea; --ink-soft: #f0bcc8; --ink-muted: #c98f9d; --ink-faint: #8a6470;
299 --rule: #4a1f2c; --rule-2: #5e2d3a;
300}
301
302
303/* ── TERRACOTTA ── warme klei → diep brick ── (key blijft 'mint' voor DB-compat) */
304[data-palette="mint"] {
305 --paper: #faf2ee; --paper-2: #f2ddd0;
306 --ink: #2e1a12; --ink-soft: #4a2c1e; --ink-muted: #7a5544; --ink-faint: #b3917e;
307 --rule: #eccdbb; --rule-2: #ddb49d;
308}
309@media (prefers-color-scheme: dark) {
310 [data-palette="mint"]:not([data-theme="light"]) {
311 --paper: #1f120c; --paper-2: #2e1c13;
312 --ink: #f7e6da; --ink-soft: #e0c3b0; --ink-muted: #b3917c; --ink-faint: #7a5544;
313 --rule: #4a2c1e; --rule-2: #5e3a28;
314 }
315}
316[data-theme="dark"][data-palette="mint"] {
317 --paper: #1f120c; --paper-2: #2e1c13;
318 --ink: #f7e6da; --ink-soft: #e0c3b0; --ink-muted: #b3917c; --ink-faint: #7a5544;
319 --rule: #4a2c1e; --rule-2: #5e3a28;
320}
321
322/* ── LILAC ── zacht lila → donker violet ── */
323[data-palette="lilac"] {
324 --paper: #faf4fb; --paper-2: #f0e0f3;
325 --ink: #2a1830; --ink-soft: #46294f; --ink-muted: #7a5685; --ink-faint: #b393bd;
326 --rule: #e6cdec; --rule-2: #d4abdd;
327}
328@media (prefers-color-scheme: dark) {
329 [data-palette="lilac"]:not([data-theme="light"]) {
330 --paper: #170a1c; --paper-2: #281433;
331 --ink: #f3e2f7; --ink-soft: #dabce4; --ink-muted: #b088c0; --ink-faint: #7a5a88;
332 --rule: #3d1f4a; --rule-2: #4f2b5e;
333 }
334}
335[data-theme="dark"][data-palette="lilac"] {
336 --paper: #170a1c; --paper-2: #281433;
337 --ink: #f3e2f7; --ink-soft: #dabce4; --ink-muted: #b088c0; --ink-faint: #7a5a88;
338 --rule: #3d1f4a; --rule-2: #4f2b5e;
339}
340
341/* Accent-tint wordt berekend uit --accent, zodat hij meegaat bij elke accent-keuze.
342 Wordt in template inline gezet; hier alleen een fallback. */
343:root { --accent: #c2410c; --accent-soft: #ea580c; --accent-tint: #fef2e8; }
344
345* { box-sizing: border-box; }
346html {
347 -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent;
348 overscroll-behavior-y: none;
349 /* Horizontaal clippen op ROOT-niveau: dit propageert naar de viewport (geen
350 horizontale scroll) ZONDER position:fixed te breken — html is sowieso de
351 document-scroller. De body mag GEEN overflow-x krijgen, want dan zou die een
352 tweede scroll-container worden en zou de fixed bottom-tab meeschuiven. */
353 overflow-x: hidden;
354}
355body {
356 margin: 0;
357}
358
359/* ── Thema-scrollbar: slank, afgerond, subtiel — vervangt de standaard chunky
360 browser-scrollbar (met pijltjes) die niet bij het donkere thema past.
361 Werkt op de pagina én op interne scrollers (queue, chat-thread, dropdowns). ── */
362* {
363 scrollbar-width: thin;
364 scrollbar-color: color-mix(in srgb, var(--ink) 28%, transparent) transparent;
365}
366::-webkit-scrollbar { width: 10px; height: 10px; }
367::-webkit-scrollbar-track { background: transparent; }
368::-webkit-scrollbar-thumb {
369 background-color: color-mix(in srgb, var(--ink) 24%, transparent);
370 border-radius: 999px;
371 border: 2px solid transparent; /* transparante rand → optisch slanker (≈6px) */
372 background-clip: content-box;
373}
374::-webkit-scrollbar-thumb:hover {
375 background-color: color-mix(in srgb, var(--accent) 60%, var(--ink));
376}
377::-webkit-scrollbar-corner { background: transparent; }
378
379/* Login/auth = focus-scherm. Bij htmx-navigatie naar login blijft de bottom-tab
380 uit de vorige pagina in de DOM staan → hier verbergen zodat het login-scherm
381 net zo "kaal" is als bij een full-load (waar de tab niet eens gerenderd wordt). */
382body.on-auth .bottom-tab { display: none; }
383body:not(.admin) {
384 min-height: 100dvh;
385 background: var(--paper); color: var(--ink);
386 font-family: var(--font-body); font-size: 1.0625rem; line-height: 1.65;
387 font-feature-settings: "liga" 1, "kern" 1, "onum" 1;
388 -webkit-font-smoothing: antialiased;
389 /* v9.4 — Sticky footer: body als flex-kolom, main groeit, footer onderaan */
390 display: flex;
391 flex-direction: column;
392}
393body:not(.admin) #pcms-main { flex: 1 0 auto; }
394body:not(.admin) .site-footer { flex-shrink: 0; }
395body:not(.admin)::before {
396 content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
397 /* Per-palette achtergrond-gradient: opgebouwd uit de palette's EIGEN --paper/--paper-2
398 (diagonale verloop) + een zachte accent-glow erbovenop. Werkt automatisch voor elk
399 palet, light én dark — geen per-palette regels nodig. */
400 background: radial-gradient(ellipse at top, color-mix(in srgb, var(--accent) 6%, transparent), transparent 60%),
401 radial-gradient(ellipse at bottom right, color-mix(in srgb, var(--accent) 7%, transparent), transparent 55%),
402 linear-gradient(160deg, var(--paper) 0%, var(--paper-2) 100%);
403}
404/* Klonkt-palet (donker): zuivere navy-diepte i.p.v. de accent(goud)-wash — anders
405 kleurt het gouden accent de navy warm/bruinig. Matcht de klonkt.com-look. */
406[data-theme="dark"][data-palette="klonkt"] body:not(.admin)::before {
407 background: radial-gradient(ellipse at top, #1a1f2b 0%, transparent 62%),
408 linear-gradient(160deg, var(--paper) 0%, var(--paper-2) 100%);
409}
410@media (prefers-color-scheme: dark) {
411 [data-palette="klonkt"]:not([data-theme="light"]) body:not(.admin)::before {
412 background: radial-gradient(ellipse at top, #1a1f2b 0%, transparent 62%),
413 linear-gradient(160deg, var(--paper) 0%, var(--paper-2) 100%);
414 }
415}
416::selection { background: var(--accent-tint); color: var(--accent); }
417
418h1, h2, h3, h4 { font-family: var(--font-display); font-weight: 450; line-height: 1.15; letter-spacing: -0.015em; margin: 0; text-wrap: balance; font-variation-settings: "opsz" 144, "SOFT" 50; }
419h1 { font-size: clamp(2rem, 4vw + 1rem, 3.5rem); letter-spacing: -0.022em; }
420h2 { font-size: clamp(1.5rem, 2vw + 1rem, 2.25rem); margin: 1.5rem 0 .4rem; }
421h3 { font-size: 1.375rem; margin: 1.25rem 0 .3rem; }
422p { margin: 0 0 .85em; text-wrap: pretty; hyphens: auto; }
423a { color: var(--ink); text-decoration: underline; text-decoration-color: var(--rule-2); text-underline-offset: 3px; transition: color var(--transition), text-decoration-color var(--transition); }
424a:hover { color: var(--accent); text-decoration-color: var(--accent); }
425/* Knop-ankers houden hun eigen tekstkleur bij hover. Zonder dit overschrijft de
426 globale a:hover{color:accent} de knop-tekst → die wordt dezelfde kleur als de
427 accent-achtergrond en valt weg (vooral op sites met een felle accent). */
428a.btn:hover, a.epk-btn:hover { color: var(--ink); }
429a.btn-primary:hover, a.btn-danger:hover, a.btn-success:hover, a.button:hover,
430a.epk-btn-primary:hover, a.dls-btn:hover, a.sh-tix:hover, a.dl-go:hover { color: #fff; text-decoration-color: currentColor; }
431a:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 2px; text-decoration: none; }
432blockquote { margin: 2em 0; padding: .25em 0 .25em 1.25em; border-left: 2px solid var(--accent); font-family: var(--font-display); font-style: italic; font-size: 1.15em; color: var(--ink-soft); }
433code { font-family: var(--font-mono); font-size: .9em; padding: .15em .4em; background: var(--paper-2); border: 1px solid var(--rule); border-radius: 4px; }
434pre { font-family: var(--font-mono); font-size: .85rem; padding: 1.25em 1.5em; background: var(--paper-2); border: 1px solid var(--rule); border-radius: var(--radius); overflow-x: auto; line-height: 1.5; }
435pre code { padding: 0; background: none; border: none; }
436hr { border: 0; border-top: 1px solid var(--rule); margin: 3em auto; max-width: 4rem; }
437
438/* Container — schaalt mee met schermgrootte.
439 42rem default (optimale leesbreedte voor tekst),
440 breder op HD/2.5K/4K waar je meer ademruimte hebt.
441 Grid-view heeft z'n eigen bredere variant (zie .feed-grid). */
442/* Container max-width schaalt per schermformaat.
443 42rem is optimale leesbreedte voor tekst. Op grotere schermen
444 ademruimte geven zonder uitwaaieren. Grid apart geregeld. */
445.container { max-width: 42rem; margin-inline: auto; padding-inline: clamp(1.25rem, 4vw, 2rem); }
446
447/* Post-/leesbreedte. Globaal + hogere specificity (.container.post-page) zodat 'ie
448 de responsive .container-breakpoints (56/72rem) overal overrult — posts én de
449 downloads-pagina krijgen zo exact dezelfde 720px-breedte. */
450.container.post-page { max-width: 720px; margin: 0.5rem auto 2rem; padding: 0 1rem; }
451
452/* Laptop / Full HD — 1440px viewport of groter */
453@media (min-width: 1440px) {
454 .container { max-width: 56rem; }
455}
456/* Desktop / QHD 2.5K — 1920px viewport of groter */
457@media (min-width: 1920px) {
458 .container { max-width: 72rem; }
459}
460/* 4K UHD — 2560px viewport of groter */
461@media (min-width: 2560px) {
462 .container { max-width: 88rem; }
463}
464
465/* Grid-view tiles: Instagram-feel. Max-width schaalt met gekozen kolommen zodat
466 tegels niet te groot of te klein worden. */
467@media (min-width: 1200px) {
468 body[data-grid-cols="4"] .feed-grid.container { max-width: 80rem; }
469 body[data-grid-cols="3"] .feed-grid.container { max-width: 64rem; }
470 body[data-grid-cols="2"] .feed-grid.container { max-width: 48rem; }
471}
472@media (min-width: 1920px) {
473 body[data-grid-cols="4"] .feed-grid.container { max-width: 96rem; }
474}
475
476.icon { width: 1.125em; height: 1.125em; flex-shrink: 0; vertical-align: -0.15em; stroke: currentColor; fill: none; display: inline-block; }
477
478/* Masthead */
479.masthead {
480 border-bottom: 1px solid var(--rule);
481 padding: calc(1rem + var(--safe-top)) 0 1rem;
482 /* GEEN backdrop-filter hier: een voorouder met backdrop-filter blokkeert de
483 frosted blur van het user-menu-dropdown eronder. Masthead is toch bijna
484 dekkend, dus solide bg i.p.v. blur. */
485 background: color-mix(in srgb, var(--paper) 94%, transparent);
486 position: sticky; top: 0; z-index: 20;
487}
488.masthead-inner { display: flex; align-items: center; justify-content: flex-end; gap: 1.5rem; }
489.masthead-brand { min-width: 0; flex: 1 1 auto; overflow: hidden; }
490.site-title { font-family: var(--font-display); font-size: 1.5rem; font-weight: 500; font-variation-settings: "opsz" 72, "SOFT" 100; letter-spacing: -0.015em; text-decoration: none; color: var(--ink); line-height: 1; display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
491.site-title:hover { color: var(--accent); }
492/* v9.0 — nav-home icon (replaces site-title text in nav) */
493.nav-home {
494 display: inline-flex; align-items: center; justify-content: center;
495 width: 2.25rem; height: 2.25rem;
496 color: var(--ink-soft); text-decoration: none;
497 border-radius: 6px; border: 1px solid transparent;
498 transition: all var(--transition);
499}
500.nav-home:hover { color: var(--ink); background: var(--paper-2); border-color: var(--rule); }
501.nav-home .icon { width: 1.15rem; height: 1.15rem; }
502.top-nav { display: flex; align-items: center; gap: .25rem; flex-shrink: 0; }
503.nav-link, .nav-btn {
504 font-family: var(--font-ui); font-size: .875rem; font-weight: 500;
505 color: var(--ink-soft); text-decoration: none;
506 padding: .5rem .85rem; border-radius: 6px;
507 background: transparent; border: 1px solid transparent;
508 cursor: pointer;
509 display: inline-flex; align-items: center; gap: .4rem;
510 min-height: 2.25rem;
511 transition: all var(--transition);
512}
513.nav-link:hover, .nav-btn:hover { color: var(--ink); background: var(--paper-2); border-color: var(--rule); }
514.nav-link-muted { color: var(--ink-muted); }
515.nav-label { display: none; }
516@media (min-width: 560px) { .nav-label { display: inline; } }
517
518/* Article */
519main { padding-top: 2rem; }
520.page { padding-block: 2rem 3rem; }
521page-container { display: block; font-size: 1.125rem; line-height: 1.75; }
522page-container h1 { font-size: clamp(2rem, 5vw + 1rem, 3.75rem); margin-bottom: 1rem; letter-spacing: -0.025em; }
523page-container img, page-container iframe, page-container video { max-width: 100%; height: auto; display: block; margin: 2rem auto; border-radius: var(--radius); }
524page-container audio { width: 100%; margin: 1.5rem 0; }
525page-container figure { margin: 2rem 0; }
526page-container figcaption { font-family: var(--font-ui); font-size: .85rem; color: var(--ink-muted); text-align: center; margin-top: .5rem; }
527page-container[contenteditable="true"] { outline: 2px dashed var(--accent); outline-offset: .5rem; border-radius: var(--radius); }
528
529.empty { text-align: center; padding: 4rem 1rem; }
530.empty h1 { font-size: 2rem; }
531.empty p { color: var(--ink-muted); }
532
533/* Embeds */
534.pcms-embed, .folio-embed { margin: 2rem 0; }
535.pcms-embed iframe, .folio-embed iframe { width: 100%; display: block; border: 0; border-radius: var(--radius); }
536
537/* Article footer */
538.article-footer { display: flex; justify-content: center; padding-top: 2rem; margin-top: 2rem; border-top: 1px solid var(--rule); }
539
540/* Buttons */
541.button {
542 font-family: var(--font-ui); font-size: .875rem; font-weight: 500;
543 padding: .6rem 1.1rem; min-height: 2.5rem;
544 display: inline-flex; align-items: center; gap: .5rem;
545 background: var(--ink); color: var(--paper);
546 border: 1px solid var(--ink);
547 border-radius: 6px;
548 text-decoration: none; cursor: pointer;
549 transition: all var(--transition);
550}
551.button:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
552.button-ghost { background: transparent; color: var(--ink); border-color: var(--rule-2); }
553.button-ghost:hover { background: var(--paper-2); border-color: var(--accent); color: var(--accent); }
554
555/* Pagination */
556.pagination {
557 display: grid;
558 grid-template-columns: 1fr 1fr;
559 gap: 1rem;
560 padding-block: 2rem 4rem;
561 margin-top: 2rem;
562 border-top: 1px solid var(--rule);
563}
564a.pagination-item {
565 display: flex; align-items: center; gap: 1rem; padding: 1rem 1.25rem;
566 border: 2px solid var(--rule-2, var(--rule));
567 border-radius: var(--radius);
568 text-decoration: none; transition: all .15s ease; font-size: .9rem;
569 background: var(--paper-2);
570 min-height: 5rem;
571 min-width: 0;
572 overflow: hidden;
573 cursor: pointer;
574 box-shadow: 0 1px 0 rgba(0,0,0,.02);
575 -webkit-tap-highlight-color: color-mix(in srgb, var(--accent) 30%, transparent);
576 position: relative;
577}
578.pagination-item:not(a) {
579 display: flex; align-items: center; gap: 1rem; padding: 1rem 1.25rem;
580 border: 1px dashed var(--rule); border-radius: var(--radius);
581 font-size: .9rem; background: transparent; min-height: 5rem;
582 min-width: 0; overflow: hidden;
583}
584.pagination-next { flex-direction: row-reverse; text-align: right; }
585a.pagination-item:hover {
586 border-color: var(--accent);
587 background: color-mix(in srgb, var(--accent) 5%, var(--paper-2));
588 transform: translateY(-2px);
589 box-shadow: 0 4px 12px rgba(0,0,0,.08);
590}
591a.pagination-item:active {
592 transform: translateY(0);
593 transition-duration: .05s;
594}
595.pagination-disabled { opacity: .5; cursor: default; font-style: italic; }
596.pagination-body { display: flex; flex-direction: column; gap: .15rem; min-width: 0; flex: 1; }
597.pagination-label {
598 display: block; font-family: var(--font-ui); font-size: .7rem; font-weight: 700;
599 letter-spacing: .08em; text-transform: uppercase; color: var(--accent);
600 margin-bottom: .15rem;
601}
602.pagination-slug {
603 display: block; font-size: .72rem; color: var(--ink-muted);
604 opacity: .75; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
605 font-style: italic;
606}
607.pagination-title {
608 display: block; font-family: var(--font-display); font-weight: 600; color: var(--ink);
609 font-variation-settings: "opsz" 72; font-style: normal;
610 line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
611 font-size: 1.05rem;
612 text-decoration: underline;
613 text-decoration-color: var(--rule-2, var(--rule));
614 text-decoration-thickness: 1px;
615 text-underline-offset: 3px;
616 transition: text-decoration-color .15s;
617}
618a.pagination-item:hover .pagination-title {
619 text-decoration-color: var(--accent);
620}
621.pagination .icon {
622 width: 1.75em; height: 1.75em; flex-shrink: 0;
623 color: var(--accent);
624 transition: transform .15s;
625}
626a.pagination-prev:hover .icon { transform: translateX(-4px); }
627a.pagination-next:hover .icon { transform: translateX(4px); }
628
629/* Pinned-targets → accent-tint en dikkere rand voor duidelijkheid */
630.pagination-item.is-pinned {
631 background: color-mix(in srgb, var(--accent) 8%, var(--paper-2));
632 border-color: color-mix(in srgb, var(--accent) 45%, var(--rule));
633}
634a.pagination-item.is-pinned:hover {
635 background: color-mix(in srgb, var(--accent) 15%, var(--paper-2));
636 border-color: var(--accent);
637}
638
639@media (max-width: 800px) { .pagination { grid-template-columns: 1fr; } }
640
641/* Footer */
642.site-footer { padding: 2rem 0 calc(2rem + var(--safe-bot)); border-top: 1px solid var(--rule); margin-top: 4rem; font-family: var(--font-ui); font-size: .85rem; color: var(--ink-muted); }
643.site-footer-inner { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 1rem; align-items: center; }
644.site-footer a { color: var(--ink-muted); text-decoration-color: var(--rule); }
645.site-footer a:hover { color: var(--accent); }
646.site-footer-links { display: flex; gap: 1rem; }
647.sep { color: var(--ink-faint); margin: 0 .5rem; }
648.footer-tagline { font-style: italic; opacity: .8; }
649
650@media print {
651 .masthead, .pagination, .site-footer, .article-footer, .top-nav { display: none; }
652 body { background: #fff; color: #000; }
653}
654@media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition: none !important; animation: none !important; } }
655
656/* ============================================================
657 V7 ADDITIONS — post metadata UI + audio player + post-images
658 ============================================================ */
659
660/* Post header */
661.post-header { margin: 0 0 2rem; }
662.post-cover {
663 margin: 0 0 1.5rem;
664 border-radius: 8px;
665 overflow: hidden;
666 background: color-mix(in srgb, var(--fg) 4%, transparent);
667}
668.post-cover img {
669 display: block;
670 width: 100%;
671 height: auto; /* volledige (niet-bijgesneden) hoogte */
672 /* geen max-height/object-fit: cover meer → de hele afbeelding toont,
673 volle containerbreedte, zijkanten gerespecteerd. */
674}
675.post-title { font-size: clamp(1.6rem, 4vw, 2.6rem); line-height: 1.15; margin: 0 0 .5rem; letter-spacing: -.02em; }
676
677/* Pin banner — duidelijk zichtbaar dat een post gepind is */
678.post-pin-banner {
679 display: inline-flex;
680 align-items: center;
681 gap: .5rem;
682 background: color-mix(in srgb, var(--accent) 14%, transparent);
683 border: 1px solid color-mix(in srgb, var(--accent) 40%, transparent);
684 color: var(--accent);
685 padding: .4rem .8rem;
686 border-radius: 999px;
687 font-size: .75rem;
688 font-weight: 600;
689 text-transform: uppercase;
690 letter-spacing: .08em;
691 margin: 0 0 .85rem;
692 line-height: 1;
693}
694.post-pin-banner-icon { font-size: 1rem; line-height: 1; }
695.post-pin-banner-sep { opacity: .5; }
696.post-pin-banner-pos { opacity: .85; }
697.post-date {
698 color: var(--fg-muted, #888);
699 font-size: .85rem;
700 letter-spacing: .05em;
701 text-transform: uppercase;
702 margin: 0 0 1.5rem;
703}
704
705/* Post-images in content (resize + align) */
706.post-image {
707 margin: 1.5rem 0;
708}
709.post-image img {
710 display: block;
711 height: auto;
712 border-radius: 6px;
713 max-width: 100%;
714}
715.post-image figcaption {
716 font-size: .85rem;
717 color: var(--fg-muted, #888);
718 margin-top: .5rem;
719 font-style: italic;
720 text-align: center;
721}
722.post-image--small img { max-width: 240px; }
723.post-image--medium img { max-width: 440px; }
724.post-image--large img { max-width: 720px; }
725.post-image--full img { width: 100%; max-width: 100%; }
726.post-image--left { text-align: left; }
727.post-image--left img { margin-left: 0; margin-right: auto; }
728.post-image--center { text-align: center; }
729.post-image--center img { margin-left: auto; margin-right: auto; }
730.post-image--right { text-align: right; }
731.post-image--right img { margin-left: auto; margin-right: 0; }
732
733/* Afbeeldingen in de post-tekst vullen ALTIJD de containerbreedte en houden hun
734 natuurlijke (niet-bijgesneden) hoogte — geen vaste hoogte / geen crop. */
735.post-content img {
736 display: block;
737 width: 100%;
738 max-width: 100%;
739 height: auto;
740 border-radius: 6px;
741 margin: 1.4em auto;
742}
743
744/* Mini-player + bottom-tab clearance: applied to .pcms-main so the footer
745 is NOT pushed below the viewport bottom. The bars are position:fixed so
746 they overlap whatever they sit on top of; the padding ensures the last
747 content row isn't covered. Footer naturally follows main and now sits
748 exactly at viewport-bottom on short pages (sticky footer flex). */
749.pcms-main { padding-bottom: 5.5rem; }
750body.has-audio-player .pcms-main { padding-bottom: 5.5rem; }
751
752/* Mobiel toetsenbord open (body.kb-open, gezet via visualViewport in shell.ejs):
753 verberg de vaste onderbalken — anders zweven de bottom-tab + mini-speler boven
754 het toetsenbord of overlappen ze het invoerveld. Ze komen terug zodra het
755 toetsenbord sluit. De extra clearance onderaan is dan ook niet meer nodig. */
756body.kb-open .bottom-tab,
757body.kb-open .audio-player { display: none !important; }
758body.kb-open .pcms-main { padding-bottom: 1rem; }
759
760/* Mobiel & tablet (touch): scrollbalken verbergen — scrollen blijft werken, alleen
761 de balk-UI is weg (geen verwarrende/dubbele balken). */
762@media (pointer: coarse) {
763 * { scrollbar-width: none; -ms-overflow-style: none; }
764 *::-webkit-scrollbar { width: 0; height: 0; display: none; }
765}
766
767/* Afbeeldingen lastiger op te slaan (frictie, geen echte beveiliging): geen
768 sleep-naar-bureaublad, geen iOS long-press-bewaarmenu. Rechtsklik wordt in JS
769 geblokkeerd (zie shell.ejs). Covers/hero zijn al CSS-achtergronden = niet via
770 "afbeelding opslaan" te pakken. */
771img { -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-drag: none; user-drag: none; -webkit-touch-callout: none; }
772
773/* ============================================================
774 AUDIO PLAYER v7.1 — SVG iconen, thema-aware, geen emoji
775 ============================================================ */
776.audio-player {
777 position: fixed;
778 left: 0; right: 0; bottom: 0;
779 background: color-mix(in srgb, var(--paper, #fff) 96%, var(--ink, #000));
780 border-top: 1px solid var(--rule, rgba(0,0,0,.1));
781 color: var(--ink, #222);
782 z-index: 1000;
783 backdrop-filter: blur(12px);
784 -webkit-backdrop-filter: blur(12px);
785 box-shadow: 0 -4px 20px rgba(0,0,0,.04);
786}
787[data-theme="dark"] .audio-player {
788 background: color-mix(in srgb, var(--paper, #1a1a1a) 92%, #fff);
789 box-shadow: 0 -4px 20px rgba(0,0,0,.3);
790}
791.audio-player-inner {
792 display: grid;
793 grid-template-columns: minmax(0, 1.6fr) auto minmax(180px, 2fr) auto;
794 gap: 1rem;
795 align-items: center;
796 padding: .65rem 1.25rem;
797 max-width: 1400px;
798 margin: 0 auto;
799}
800
801/* v9.0 — Clickable trigger dat cover + meta combineert zodat klikken erop sheet opent */
802.audio-player-expand-trigger {
803 display: flex;
804 align-items: center;
805 gap: .65rem;
806 min-width: 0;
807 background: none;
808 border: none;
809 padding: 0;
810 margin: 0;
811 cursor: pointer;
812 color: inherit;
813 text-align: left;
814 font: inherit;
815 border-radius: 6px;
816 transition: background .15s;
817}
818.audio-player-expand-trigger:hover {
819 background: color-mix(in srgb, var(--ink, #000) 6%, transparent);
820}
821
822/* Cover art */
823.audio-player-cover {
824 width: 48px; height: 48px;
825 border-radius: 4px;
826 background: linear-gradient(135deg,
827 var(--accent, #c2410c),
828 color-mix(in srgb, var(--accent, #c2410c) 55%, #000));
829 background-size: cover;
830 background-position: center;
831 flex-shrink: 0;
832 position: relative;
833}
834.audio-player-cover.has-image {
835 background-blend-mode: normal;
836}
837
838/* Meta — titel + artiest */
839.audio-player-meta {
840 min-width: 0;
841 display: flex;
842 flex-direction: column;
843 gap: 2px;
844}
845.audio-player-title-wrap {
846 overflow: hidden;
847 white-space: nowrap;
848 position: relative;
849}
850.audio-player-title {
851 display: inline-block;
852 font-family: var(--font-ui, inherit);
853 font-weight: 600;
854 font-size: .9rem;
855 line-height: 1.3;
856 letter-spacing: -.01em;
857 color: var(--ink, inherit);
858 white-space: nowrap;
859}
860.audio-player-title.is-overflowing {
861 animation: audio-title-marquee 6s ease-in-out infinite alternate;
862}
863@keyframes audio-title-marquee {
864 0%, 8% { transform: translateX(0); }
865 92%, 100% { transform: translateX(calc(-1 * var(--audio-shift, 0px))); }
866}
867.audio-player-artist {
868 font-family: var(--font-ui, inherit);
869 font-size: .74rem;
870 line-height: 1.3;
871 color: var(--ink-muted, rgba(0,0,0,.55));
872 white-space: nowrap;
873 overflow: hidden;
874 text-overflow: ellipsis;
875}
876
877/* Controls — prev / play / next */
878.audio-player-controls {
879 display: flex;
880 gap: .1rem;
881 align-items: center;
882}
883.audio-btn {
884 background: transparent;
885 border: none;
886 color: inherit;
887 cursor: pointer;
888 padding: .5rem;
889 border-radius: 50%;
890 transition: background .15s, color .15s, transform .08s;
891 display: inline-flex;
892 align-items: center;
893 justify-content: center;
894 position: relative;
895}
896.audio-btn svg {
897 width: 18px; height: 18px;
898 display: block;
899}
900.audio-btn:hover { background: color-mix(in srgb, var(--ink, #000) 8%, transparent); }
901.audio-btn:active { transform: scale(.94); }
902.audio-btn-play {
903 background: var(--accent, #c2410c);
904 color: #fff;
905 width: 38px; height: 38px;
906 padding: 0;
907}
908.audio-btn-play:hover {
909 background: color-mix(in srgb, var(--accent, #c2410c) 85%, #fff);
910}
911[data-theme="dark"] .audio-btn-play:hover {
912 background: color-mix(in srgb, var(--accent, #c2410c) 85%, #000);
913}
914.audio-btn-play svg { width: 16px; height: 16px; }
915.audio-btn-play .icon-pause { display: none; }
916.audio-player.is-playing .audio-btn-play .icon-play { display: none; }
917.audio-player.is-playing .audio-btn-play .icon-pause { display: block; }
918
919/* Progress bar */
920.audio-player-progress {
921 display: flex;
922 gap: .75rem;
923 align-items: center;
924 min-width: 0;
925}
926.audio-time {
927 font-size: .7rem;
928 color: var(--ink-muted, rgba(0,0,0,.55));
929 font-variant-numeric: tabular-nums;
930 min-width: 2.7em;
931 text-align: center;
932}
933.audio-seek {
934 flex: 1;
935 min-width: 0;
936 cursor: pointer;
937 padding: .5rem 0;
938 position: relative;
939}
940.audio-seek-bar {
941 height: 3px;
942 background: color-mix(in srgb, var(--ink, #000) 12%, transparent);
943 border-radius: 2px;
944 overflow: hidden;
945 transition: height .15s;
946}
947.audio-seek:hover .audio-seek-bar { height: 5px; }
948.audio-seek-fill {
949 height: 100%;
950 background: var(--accent, #c2410c);
951 width: 0%;
952 transition: width .1s linear;
953}
954
955/* Volume — popup on hover */
956.audio-player-volume {
957 position: relative;
958 display: flex;
959 align-items: center;
960}
961.audio-btn .icon-mute { display: none; }
962.audio-player.is-muted .audio-btn .icon-vol { display: none; }
963.audio-player.is-muted .audio-btn .icon-mute { display: block; }
964.audio-volume-popup {
965 position: absolute;
966 bottom: calc(100% + 8px);
967 left: 50%;
968 transform: translateX(-50%) scale(.95);
969 transform-origin: bottom center;
970 background: var(--paper, #fff);
971 border: 1px solid var(--rule, rgba(0,0,0,.1));
972 border-radius: 8px;
973 padding: .75rem .5rem;
974 box-shadow: 0 4px 16px rgba(0,0,0,.15);
975 opacity: 0;
976 pointer-events: none;
977 transition: opacity .15s, transform .15s, visibility .15s;
978 height: 110px;
979 visibility: hidden;
980}
981/* Invisible bridge tussen knop en popup zodat hover niet breekt */
982.audio-volume-popup::after {
983 content: '';
984 position: absolute;
985 bottom: -12px;
986 left: -10px;
987 right: -10px;
988 height: 16px;
989}
990[data-theme="dark"] .audio-volume-popup {
991 background: color-mix(in srgb, var(--paper, #111) 92%, #fff);
992}
993.audio-player-volume:hover .audio-volume-popup,
994.audio-player-volume:focus-within .audio-volume-popup,
995.audio-player-volume.is-open .audio-volume-popup {
996 opacity: 1;
997 visibility: visible;
998 transform: translateX(-50%) scale(1);
999 pointer-events: auto;
1000}
1001.audio-volume-popup input[type=range] {
1002 /* Standard vertical slider — replaces deprecated -webkit-appearance: slider-vertical. */
1003 writing-mode: vertical-lr;
1004 direction: rtl;
1005 width: 6px;
1006 height: 90px;
1007 accent-color: var(--accent, #c2410c);
1008 /* Grotere hit-area via pseudo-touch padding */
1009 padding: 0 12px;
1010 box-sizing: content-box;
1011 cursor: pointer;
1012}
1013
1014/* Mobile */
1015@media (max-width: 720px) {
1016 .audio-player-inner {
1017 /* v9.0 — 3 cols: expand-trigger (cover+meta) | controls | volume */
1018 grid-template-columns: minmax(0, 1fr) auto auto;
1019 gap: .5rem;
1020 padding: .5rem .8rem;
1021 }
1022 .audio-player-progress {
1023 display: none;
1024 }
1025 .audio-player-cover { width: 40px; height: 40px; }
1026 .audio-btn-play { width: 34px; height: 34px; }
1027 body.has-audio-player .pcms-main { padding-bottom: 4.2rem; }
1028 /* Verberg titel-artiest op bijzonder smal, verstop volume op mobile */
1029 .audio-player-volume { display: none; }
1030}
1031
1032/* Ultra-small schermen (iPhone 4 = 320px; iPhone SE 1st gen = 320px;
1033 iPhone mini ~360px). v9.3 — alles vanaf 320px moet werken; daaronder
1034 accepteren we wel/niet. */
1035@media (max-width: 380px) {
1036 .audio-player-inner {
1037 gap: .35rem;
1038 padding: .4rem .6rem;
1039 }
1040 .audio-player-expand-trigger {
1041 gap: .45rem;
1042 }
1043 .audio-player-cover { width: 36px; height: 36px; }
1044 .audio-player-title { font-size: .88rem; }
1045 .audio-player-artist { font-size: .72rem; }
1046 .audio-player-controls { gap: .15rem; }
1047 .audio-btn { width: 30px; height: 30px; }
1048 .audio-btn svg { width: 16px; height: 16px; }
1049 .audio-btn-play { width: 32px; height: 32px; }
1050 .audio-btn-play svg { width: 18px; height: 18px; }
1051
1052 /* v9.3 — Tracklist compact op smalle telefoons.
1053 Leader 28×28, kleinere gap, padding strakker. Tijd in monoscript blijft
1054 leesbaar; titel krijgt 5-10px meer ruimte. */
1055 .pat-row {
1056 grid-template-columns: 28px 1fr auto;
1057 gap: .5rem;
1058 padding: .45rem .65rem;
1059 }
1060 .pat-row .pat-num,
1061 .pat-row .pat-cover {
1062 width: 28px;
1063 height: 28px;
1064 }
1065 .pat-row::before {
1066 left: .65rem;
1067 width: 28px; height: 28px;
1068 -webkit-mask-size: 22px 22px;
1069 mask-size: 22px 22px;
1070 }
1071 .pat-row .pat-title { font-size: .92rem; }
1072 .pat-row .pat-artist { font-size: .74rem; }
1073 .pat-row .pat-duration { font-size: .74rem; }
1074
1075 /* v9.3 — Album binnen post: cover + tracks compacter */
1076 .post-album-cover {
1077 width: 90px;
1078 height: 90px;
1079 }
1080 .post-album-header {
1081 gap: .65rem;
1082 padding: .65rem;
1083 }
1084 .post-album-title { font-size: 1rem; }
1085
1086 /* v9.3 — Profile-header bovenin compacter */
1087 .profile-photo {
1088 width: 48px !important;
1089 height: 48px !important;
1090 }
1091 .profile-content {
1092 gap: .65rem;
1093 }
1094
1095 /* v9.3 — Install-app modal: minder padding, kleinere knoppen */
1096 .install-modal-inner {
1097 padding: 1rem;
1098 }
1099 .install-app-btn {
1100 padding: .55rem 1rem;
1101 font-size: .9rem;
1102 }
1103
1104 /* v9.3 — horizontaal clippen gebeurt nu globaal op html (zie de html-regel
1105 bovenaan). Hier bewust NIETS op body zetten: body als scroll-container zou
1106 de fixed bottom-tab op mobiel laten meeschuiven. */
1107}
1108
1109/* iPhone 4 / iPhone SE 1st gen / iPhone 5/5s (320px) — strakste niveau */
1110@media (max-width: 340px) {
1111 .audio-player-inner {
1112 padding: .35rem .5rem;
1113 }
1114 .audio-player-artist { display: none; }
1115 .audio-player-cover { width: 32px; height: 32px; }
1116 body.has-audio-player .pcms-main { padding-bottom: 3.6rem; }
1117 /* Expand-sheet wat strakker */
1118 .audio-sheet-panel {
1119 padding: .5rem 1rem 1.5rem;
1120 }
1121 .audio-sheet-title { font-size: 1.2rem; }
1122 .audio-sheet-artist { font-size: .9rem; }
1123 .audio-sheet-play { width: 60px; height: 60px; }
1124 .audio-sheet-play svg { width: 26px; height: 26px; }
1125 .audio-sheet-btn { width: 42px; height: 42px; }
1126 .audio-sheet-btn svg { width: 24px; height: 24px; }
1127 .audio-sheet-controls { gap: 1rem; }
1128
1129 /* v9.3 — Op iPhone 4 (320px): tracklist nog strakker */
1130 .pat-row {
1131 grid-template-columns: 26px 1fr auto;
1132 gap: .4rem;
1133 padding: .4rem .55rem;
1134 }
1135 .pat-row .pat-num,
1136 .pat-row .pat-cover {
1137 width: 26px;
1138 height: 26px;
1139 }
1140 .pat-row::before {
1141 left: .55rem;
1142 width: 26px; height: 26px;
1143 -webkit-mask-size: 20px 20px;
1144 mask-size: 20px 20px;
1145 }
1146 .pat-row .pat-artist {
1147 display: none; /* op extreem smal weglaten ten gunste van titel */
1148 }
1149 .pat-row .pat-title { font-size: .9rem; }
1150 .pat-row .pat-duration { font-size: .72rem; }
1151
1152 /* Container padding reduceren voor max content-breedte */
1153 .container {
1154 padding-inline: 1rem !important;
1155 }
1156
1157 /* Post-cover (de grote bovenste) krimpen */
1158 .post-cover {
1159 max-height: 200px;
1160 }
1161}
1162
1163/* ============================================================
1164 v9.0 — Audio player expand-sheet (Spotify-style "now playing")
1165 Slide-up half-screen met grote cover, track info, big controls
1166 ============================================================ */
1167.audio-sheet {
1168 position: fixed;
1169 inset: 0;
1170 z-index: 1100;
1171 pointer-events: none;
1172 opacity: 0;
1173 transition: opacity .25s ease;
1174}
1175.audio-sheet.is-open {
1176 pointer-events: auto;
1177 opacity: 1;
1178}
1179.audio-sheet-backdrop {
1180 position: absolute;
1181 inset: 0;
1182 /* v9.3 — Blur en overlay-dim allebei via CSS-variabele --pcms-sheet-progress
1183 (1 = volledig, 0 = weg). JS update tijdens drag; CSS-transition pakt
1184 open/close af. Sterke blur (24px) zodat 't effect goed zichtbaar is. */
1185 background: rgb(0 0 0 / calc(.4 * var(--pcms-sheet-progress, 1)));
1186 backdrop-filter: blur(calc(24px * var(--pcms-sheet-progress, 1)));
1187 -webkit-backdrop-filter: blur(calc(24px * var(--pcms-sheet-progress, 1)));
1188 transition: background .25s ease,
1189 backdrop-filter .25s ease,
1190 -webkit-backdrop-filter .25s ease;
1191 will-change: backdrop-filter, background;
1192}
1193/* Tijdens drag: instant updates vanuit JS, geen transition */
1194.audio-sheet-panel.is-dragging ~ .audio-sheet-backdrop,
1195.audio-sheet-backdrop.is-dragging {
1196 transition: none;
1197}
1198.audio-sheet-panel {
1199 position: absolute;
1200 left: 0; right: 0; bottom: 0;
1201 background: var(--paper, #fff);
1202 border-top-left-radius: 20px;
1203 border-top-right-radius: 20px;
1204 box-shadow: 0 -20px 60px rgba(0, 0, 0, .25);
1205 padding: .75rem 1.5rem 2rem;
1206 max-height: 85vh;
1207 overflow-y: auto;
1208 /* v9.2.1 — scroll blijft binnen panel, geen chaining naar body (iOS-proof) */
1209 overscroll-behavior: contain;
1210 touch-action: pan-y;
1211 /* Hide scrollbar but keep scrollable */
1212 scrollbar-width: none; /* Firefox */
1213 -ms-overflow-style: none; /* IE/Edge */
1214 transform: translateY(100%);
1215 transition: transform .3s cubic-bezier(.22, .9, .3, 1),
1216 opacity .3s cubic-bezier(.22, .9, .3, 1);
1217 display: flex;
1218 flex-direction: column;
1219 gap: 1rem;
1220 color: var(--ink);
1221}
1222.audio-sheet-panel::-webkit-scrollbar {
1223 display: none; /* Chrome/Safari */
1224}
1225/* Body scroll lock wanneer sheet open is */
1226body.audio-sheet-locked {
1227 overflow: hidden;
1228}
1229.audio-sheet.is-open .audio-sheet-panel {
1230 transform: translateY(0);
1231}
1232
1233/* v9.3 — Drag-zone: pill bovenaan + cover. Hele strook is touch-target voor
1234 swipe-down-to-close. Pull-to-refresh is uitgeschakeld op html-niveau dus
1235 geen interferentie. Onder de cover (info/progress/controls/queue) werkt
1236 normale touch — knoppen, scroll in queue, etc. */
1237.audio-sheet-drag-zone {
1238 flex-shrink: 0;
1239 display: flex;
1240 flex-direction: column;
1241 align-items: stretch;
1242 gap: 1rem;
1243 /* v9.3 — touch-action: pan-y staat verticale scroll toe (zodat queue
1244 eronder scrollt als gebruiker omhoog veegt over cover). Onze JS
1245 detecteert intent: alleen omlaag-swipe vanaf de top sluit de sheet,
1246 omhoog-swipe = scroll. */
1247 touch-action: pan-y;
1248 user-select: none;
1249 -webkit-user-select: none;
1250 cursor: grab;
1251 margin: -.75rem -1.5rem 0;
1252 padding: .75rem 1.5rem 0;
1253}
1254.audio-sheet-drag-zone:active { cursor: grabbing; }
1255
1256/* v9.4 — Drag alleen actief op touch-only apparaten (telefoons).
1257 Desktop met muis + tablets met muis-cursor → geen drag-grip,
1258 gebruiker sluit via × pill-knop bovenin of klik op backdrop. */
1259@media (hover: hover) and (pointer: fine) {
1260 .audio-sheet-drag-zone {
1261 touch-action: auto;
1262 cursor: default;
1263 pointer-events: none;
1264 }
1265 /* Pill blijft klikbaar als sluit-knop */
1266 .audio-sheet-drag-zone .audio-sheet-handle {
1267 pointer-events: auto;
1268 cursor: pointer;
1269 }
1270}
1271
1272/* Pill (handle) gecentreerd boven de cover */
1273.audio-sheet-drag-zone .audio-sheet-handle {
1274 margin: 0 auto .25rem;
1275}
1276
1277/* Tijdens dragging: panel volgt vinger realtime; geen transition */
1278.audio-sheet-panel.is-dragging {
1279 transition: none;
1280 will-change: transform;
1281}
1282[data-theme="dark"] .audio-sheet-panel {
1283 background: var(--paper, #1a1a1a);
1284 box-shadow: 0 -20px 60px rgba(0, 0, 0, .5);
1285}
1286/* Drag-handle + close button in één */
1287.audio-sheet-handle {
1288 display: block;
1289 width: 48px;
1290 height: 4px;
1291 border-radius: 2px;
1292 background: color-mix(in srgb, var(--ink, #000) 25%, transparent);
1293 border: none;
1294 margin: 0 auto .5rem;
1295 padding: 0;
1296 cursor: pointer;
1297 flex-shrink: 0;
1298 position: relative;
1299}
1300.audio-sheet-handle::before {
1301 content: "";
1302 position: absolute;
1303 /* v9.3 — Drag-strip wrapper neemt nu de hit-area-rol over. ::before
1304 blijft als kleine extra padding voor click-comfort. */
1305 inset: -10px -20px;
1306}
1307.audio-sheet-handle:hover {
1308 background: color-mix(in srgb, var(--ink, #000) 45%, transparent);
1309}
1310/* Grote cover */
1311.audio-sheet-cover {
1312 width: 100%;
1313 max-width: 360px;
1314 aspect-ratio: 1/1;
1315 margin: 0 auto;
1316 border-radius: 12px;
1317 background: linear-gradient(135deg,
1318 var(--accent, #c2410c),
1319 color-mix(in srgb, var(--accent, #c2410c) 55%, #000));
1320 background-size: cover;
1321 background-position: center;
1322 box-shadow: 0 20px 40px rgba(0, 0, 0, .15);
1323 flex-shrink: 0;
1324}
1325[data-theme="dark"] .audio-sheet-cover {
1326 box-shadow: 0 20px 40px rgba(0, 0, 0, .4);
1327}
1328.audio-sheet-info {
1329 text-align: center;
1330 padding: 0 1rem;
1331}
1332.audio-sheet-title {
1333 font-family: var(--font-display, inherit);
1334 font-size: 1.5rem;
1335 font-weight: 600;
1336 line-height: 1.2;
1337 margin: 0 0 .25rem;
1338 letter-spacing: -0.01em;
1339 color: var(--ink);
1340}
1341.audio-sheet-artist {
1342 font-size: 1rem;
1343 color: var(--ink-muted, var(--ink));
1344 opacity: .7;
1345}
1346.audio-sheet-album {
1347 margin-top: .35rem;
1348 font-size: .82rem;
1349 opacity: .5;
1350 text-transform: uppercase;
1351 letter-spacing: .05em;
1352}
1353.audio-sheet-album:empty { display: none; }
1354/* Progress + time */
1355.audio-sheet-progress {
1356 display: grid;
1357 grid-template-columns: auto 1fr auto;
1358 gap: .6rem;
1359 align-items: center;
1360 padding: 0 .5rem;
1361}
1362.audio-sheet-progress .audio-seek { width: 100%; }
1363.audio-sheet-progress .audio-time {
1364 font-size: .78rem;
1365 opacity: .55;
1366}
1367/* Grote controls */
1368.audio-sheet-controls {
1369 display: flex;
1370 align-items: center;
1371 justify-content: center;
1372 gap: 1.75rem;
1373}
1374.audio-sheet-btn {
1375 width: 48px;
1376 height: 48px;
1377 padding: 0;
1378}
1379.audio-sheet-btn svg { width: 28px; height: 28px; }
1380.audio-sheet-play {
1381 width: 72px;
1382 height: 72px;
1383 border-radius: 50%;
1384 background: var(--accent, #c2410c);
1385 color: var(--paper, #fff);
1386 border: none;
1387 cursor: pointer;
1388 display: inline-flex;
1389 align-items: center;
1390 justify-content: center;
1391 transition: transform .1s;
1392}
1393.audio-sheet-play:hover { transform: scale(1.05); }
1394.audio-sheet-play:active { transform: scale(.95); }
1395.audio-sheet-play svg { width: 30px; height: 30px; }
1396.audio-sheet-play .icon-pause { display: none; }
1397/* v9.2.1 — sheet staat nu als sibling van .audio-player buiten de balk,
1398 dus ancestor-selector .audio-player.is-playing werkt niet meer voor de
1399 sheet. JS zet is-playing ook rechtstreeks op sheet.play (regel 551 app.js). */
1400.audio-sheet-play.is-playing .icon-play { display: none; }
1401.audio-sheet-play.is-playing .icon-pause { display: block; }
1402/* v9.2.1 — fallback: als sheet buiten alle ancestors zit, tag body */
1403body.audio-is-playing .audio-sheet-play .icon-play { display: none; }
1404body.audio-is-playing .audio-sheet-play .icon-pause { display: block; }
1405
1406/* v9.3 — Loading state: roterende spiraal (het roboburr logo).
1407 Button-achtergrond wordt transparant, play/pause svgs verbergen, en de
1408 spiraal verschijnt als roterende background via ::after pseudo-element.
1409 Cool-effect: zachte hue-drift geeft de kleur een levend gevoel. */
1410.audio-player.is-loading .audio-btn-play,
1411.audio-player.is-loading .audio-sheet-play,
1412body.audio-is-loading .audio-sheet-play,
1413.pat-row.is-loading {
1414 pointer-events: none;
1415}
1416.audio-player.is-loading .audio-btn-play,
1417.audio-player.is-loading .audio-sheet-play,
1418body.audio-is-loading .audio-sheet-play {
1419 background: transparent;
1420 box-shadow: none;
1421}
1422
1423/* v9.3 — Play/pause-icons in de player-knoppen faden smooth uit/in tijdens
1424 loading. Pseudo-spiraal faded tegelijkertijd in (geen instant pop). */
1425.audio-btn-play > svg,
1426.audio-sheet-play > svg {
1427 transition: opacity .35s cubic-bezier(.4, 0, .2, 1),
1428 transform .35s cubic-bezier(.4, 0, .2, 1);
1429}
1430.audio-player.is-loading .audio-btn-play > svg,
1431.audio-player.is-loading .audio-sheet-play > svg,
1432body.audio-is-loading .audio-sheet-play > svg {
1433 opacity: 0;
1434 transform: scale(.7);
1435}
1436.pat-row.is-loading .pat-play-icon > svg,
1437.pat-row.is-loading .pat-num,
1438.pat-row.is-loading .pat-cover {
1439 opacity: 0;
1440}
1441
1442/* v9.3 — Spiraal als pseudo-element, ALTIJD aanwezig met opacity 0 default.
1443 Bij is-loading faden 'ie smooth in (opacity + scale-bounce), bij klaar
1444 faden 'ie weer uit. Pure accent-kleur, geen hue-drift. */
1445.audio-player .audio-btn-play,
1446.audio-player .audio-sheet-play,
1447.pat-row .pat-play-icon {
1448 position: relative;
1449}
1450.audio-btn-play::after,
1451.audio-sheet-play::after {
1452 content: "";
1453 position: absolute;
1454 inset: 0;
1455 background-color: var(--accent, #c2410c);
1456 -webkit-mask: url('/assets/spinner.svg') center/contain no-repeat;
1457 mask: url('/assets/spinner.svg') center/contain no-repeat;
1458 opacity: 0;
1459 transform: scale(.6);
1460 transition: opacity .4s cubic-bezier(.4, 0, .2, 1),
1461 transform .4s cubic-bezier(.34, 1.56, .64, 1);
1462 pointer-events: none;
1463 animation: pcms-spiral-spin 1.2s linear infinite paused;
1464 will-change: opacity, transform;
1465}
1466.audio-player.is-loading .audio-btn-play::after,
1467.audio-player.is-loading .audio-sheet-play::after,
1468body.audio-is-loading .audio-sheet-play::after {
1469 opacity: 1;
1470 transform: scale(1);
1471 animation-play-state: running;
1472}
1473/* Pat-row keeps its existing ::before spinner from earlier change.
1474 Voor backward-compat als oude HTML nog .pat-play-icon::after spinner had */
1475.pat-row.is-loading .pat-play-icon::after {
1476 content: "";
1477 position: absolute;
1478 inset: 0;
1479 background-color: var(--accent, #c2410c);
1480 -webkit-mask: url('/assets/spinner.svg') center/contain no-repeat;
1481 mask: url('/assets/spinner.svg') center/contain no-repeat;
1482 opacity: 1;
1483 animation: pcms-spiral-spin 1.2s linear infinite;
1484 pointer-events: none;
1485}
1486@keyframes pcms-spiral-spin {
1487 to { transform: scale(1) rotate(-360deg); }
1488}
1489/* Queue list */
1490.audio-sheet-queue {
1491 margin-top: .5rem;
1492 padding-top: 1rem;
1493 border-top: 1px solid var(--rule);
1494}
1495.audio-sheet-queue-label {
1496 font-size: .75rem;
1497 text-transform: uppercase;
1498 letter-spacing: .08em;
1499 opacity: .5;
1500 font-weight: 600;
1501 margin-bottom: .5rem;
1502 padding: 0 .5rem;
1503}
1504.audio-sheet-queue-list {
1505 list-style: none;
1506 padding: 0;
1507 margin: 0;
1508 display: flex;
1509 flex-direction: column;
1510 gap: 2px;
1511}
1512.audio-sheet-queue-item {
1513 display: flex;
1514 align-items: center;
1515 gap: .75rem;
1516 padding: .5rem .6rem;
1517 border-radius: 6px;
1518 cursor: pointer;
1519 transition: background .15s;
1520 background: none;
1521 border: none;
1522 width: 100%;
1523 color: inherit;
1524 font: inherit;
1525 text-align: left;
1526}
1527.audio-sheet-queue-item:hover {
1528 background: color-mix(in srgb, var(--ink, #000) 6%, transparent);
1529}
1530.audio-sheet-queue-item.is-current {
1531 background: color-mix(in srgb, var(--accent, #c2410c) 14%, transparent);
1532 color: var(--accent, #c2410c);
1533}
1534.audio-sheet-queue-cover {
1535 width: 36px;
1536 height: 36px;
1537 border-radius: 4px;
1538 background-size: cover;
1539 background-position: center;
1540 background-color: var(--rule);
1541 flex-shrink: 0;
1542}
1543.audio-sheet-queue-meta {
1544 flex: 1;
1545 min-width: 0;
1546 display: flex;
1547 flex-direction: column;
1548}
1549.audio-sheet-queue-title {
1550 font-size: .9rem;
1551 font-weight: 500;
1552 overflow: hidden;
1553 text-overflow: ellipsis;
1554 white-space: nowrap;
1555}
1556.audio-sheet-queue-artist {
1557 font-size: .75rem;
1558 opacity: .55;
1559 overflow: hidden;
1560 text-overflow: ellipsis;
1561 white-space: nowrap;
1562}
1563.audio-sheet-queue-duration {
1564 font-family: ui-monospace, monospace;
1565 font-size: .72rem;
1566 opacity: .5;
1567 flex-shrink: 0;
1568}
1569
1570/* Desktop: sheet is max 480px wide and centered for bigger screens */
1571@media (min-width: 720px) {
1572 .audio-sheet-panel {
1573 left: 50%;
1574 right: auto;
1575 width: 480px;
1576 transform: translate(-50%, 100%);
1577 border-top-left-radius: 20px;
1578 border-top-right-radius: 20px;
1579 }
1580 .audio-sheet.is-open .audio-sheet-panel {
1581 transform: translate(-50%, 0);
1582 }
1583}
1584
1585/* v9.2.1 — Mobiel: sheet is fullscreen, alleen te sluiten via handle-knop bovenin.
1586 Geen rounded corners, volledige viewport, safe-area voor notches/status bar. */
1587@media (max-width: 719.98px) {
1588 .audio-sheet-panel {
1589 inset: 0;
1590 max-height: none;
1591 border-top-left-radius: 0;
1592 border-top-right-radius: 0;
1593 box-shadow: none;
1594 padding-top: calc(.75rem + env(safe-area-inset-top, 0px));
1595 padding-bottom: calc(2rem + env(safe-area-inset-bottom, 0px));
1596 }
1597 /* v9.3 — Backdrop blijft visible op mobile zodat drag-gesture de blur
1598 laat doorschemeren naar helder. */
1599}
1600
1601/* ============================================================
1602 Mobile masthead + pagination
1603 ============================================================ */
1604@media (max-width: 600px) {
1605 .masthead-inner { gap: .35rem; }
1606 .site-title { font-size: 1.2rem; }
1607 .site-subtitle { display: none; }
1608 .top-nav { gap: .1rem; }
1609 .nav-label { display: none; }
1610 .nav-btn, .nav-link {
1611 padding: .4rem .45rem;
1612 min-width: 38px;
1613 justify-content: center;
1614 }
1615 .pagination { flex-direction: column; gap: .5rem; }
1616 .pagination-item { width: 100%; }
1617}
1618
1619/* Taal-keuze in de header-nav (NL/EN/DE) — eigen gestylede dropdown. */
1620.lang-menu { position: relative; }
1621.lang-menu > summary {
1622 list-style: none; cursor: pointer;
1623 display: inline-flex; align-items: center; gap: .3rem;
1624 padding: .35rem .55rem; border-radius: 999px;
1625 border: 1px solid var(--rule); background: transparent; color: var(--ink);
1626}
1627.lang-menu > summary::-webkit-details-marker { display: none; }
1628.lang-menu > summary:hover { border-color: var(--accent); }
1629.lang-toggle .lang-code { font-size: .8rem; font-weight: 700; letter-spacing: .02em; }
1630.lang-toggle .icon { width: 16px; height: 16px; opacity: .8; }
1631.lang-caret { width: 12px; height: 12px; opacity: .7; transition: transform .15s; }
1632.lang-menu[open] .lang-caret { transform: rotate(180deg); }
1633.lang-dropdown {
1634 position: absolute; top: calc(100% + 8px); right: 0;
1635 min-width: 170px; z-index: 60;
1636 background: var(--paper); border: 1px solid var(--rule);
1637 border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,.22);
1638 padding: .35rem; display: flex; flex-direction: column;
1639}
1640.lang-item {
1641 display: flex; align-items: center; gap: .6rem;
1642 padding: .5rem .65rem; border-radius: 8px;
1643 color: var(--ink); text-decoration: none; font-size: .9rem;
1644}
1645.lang-item:hover { background: var(--paper-2); }
1646.lang-item.is-active { color: var(--accent); font-weight: 600; }
1647.lang-item-code {
1648 font-size: .7rem; font-weight: 700; opacity: .6;
1649 min-width: 1.6em;
1650}
1651@media (max-width: 400px) {
1652 .masthead { padding: calc(.5rem + var(--safe-top)) 0 .5rem; }
1653 .masthead-inner { gap: .25rem; }
1654 .site-title { font-size: 1.05rem; }
1655 .nav-btn, .nav-link {
1656 padding: .35rem .3rem;
1657 min-width: 34px;
1658 }
1659 .nav-btn .icon, .nav-link .icon { width: 1rem; height: 1rem; }
1660 /* PWA-install knop verbergen op klein scherm — kan ook via menu */
1661 .nav-install-btn { display: none !important; }
1662}
1663@media (max-width: 340px) {
1664 .site-title { font-size: .95rem; }
1665 .nav-btn, .nav-link { padding: .3rem .25rem; min-width: 30px; }
1666 /* Theme-toggle verbergen op ultra-klein — kan via user-menu */
1667 [data-pcms-theme-toggle] { display: none; }
1668}
1669
1670.post-date-ago {
1671 margin-left: .5em;
1672 opacity: .6;
1673 font-size: .9em;
1674 font-style: italic;
1675 text-transform: none;
1676 letter-spacing: 0;
1677}
1678
1679/* HTMX loading indicator — subtle progress-bar aan de top van de content */
1680.pcms-loading {
1681 position: fixed;
1682 top: 0; left: 0;
1683 height: 2px;
1684 width: 0%;
1685 background: var(--accent, #c2410c);
1686 z-index: 9999;
1687 transition: width .3s ease, opacity .2s;
1688 opacity: 0;
1689 pointer-events: none;
1690}
1691.pcms-loading.htmx-request {
1692 opacity: 1;
1693 width: 80%;
1694 transition: width 6s cubic-bezier(.1,.9,.2,1), opacity .2s;
1695}
1696/* subtile fade wanneer content gewisseld wordt */
1697#pcms-main.htmx-swapping {
1698 opacity: .5;
1699 transition: opacity .15s;
1700}
1701
1702/* Masthead brand group (site-title + optional tagline) */
1703.masthead-brand { display: flex; flex-direction: column; gap: 2px; }
1704.site-subtitle {
1705 font-family: var(--font-ui, inherit);
1706 font-size: .75rem;
1707 color: var(--ink-muted, rgba(0,0,0,.55));
1708 letter-spacing: 0;
1709 line-height: 1.3;
1710}
1711
1712/* ============================================================
1713 v7.3 — TAGS, TYPE, ARCHIEF, ZOEK, RELATED, SPECIAL VIEWS
1714 ============================================================ */
1715
1716/* Post-meta row — datum + type-chip + tags samen onder de titel */
1717.post-meta {
1718 display: flex;
1719 flex-wrap: wrap;
1720 align-items: center;
1721 gap: .5rem .85rem;
1722 margin-top: .5rem;
1723}
1724.post-meta .post-date { margin: 0; }
1725
1726/* Type-chip (groter, als een label) */
1727.post-type-chip {
1728 display: inline-flex;
1729 align-items: center;
1730 padding: .2rem .6rem;
1731 background: color-mix(in srgb, var(--accent) 10%, transparent);
1732 color: var(--accent);
1733 border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
1734 border-radius: 999px;
1735 font-family: var(--font-ui);
1736 font-size: .72rem;
1737 font-weight: 600;
1738 text-decoration: none;
1739 letter-spacing: .04em;
1740 text-transform: uppercase;
1741 transition: background .15s;
1742}
1743.post-type-chip:hover { background: color-mix(in srgb, var(--accent) 20%, transparent); }
1744
1745/* Tag-chips — klein, subtiel, gelinkt */
1746.post-tags, .post-list-tags {
1747 display: inline-flex;
1748 flex-wrap: wrap;
1749 gap: .3rem;
1750}
1751.tag-chip {
1752 display: inline-block;
1753 padding: .15rem .55rem;
1754 background: color-mix(in srgb, var(--ink) 5%, transparent);
1755 color: var(--ink-muted);
1756 border-radius: 999px;
1757 font-family: var(--font-ui);
1758 font-size: .72rem;
1759 font-weight: 500;
1760 text-decoration: none;
1761 transition: background .15s, color .15s;
1762}
1763.tag-chip:hover {
1764 background: color-mix(in srgb, var(--accent) 12%, transparent);
1765 color: var(--accent);
1766}
1767
1768/* ============================================================
1769 SPECIAL PAGES (archief, tag, type, zoek)
1770 ============================================================ */
1771.special-page .post-header { margin-bottom: 2rem; }
1772.special-eyebrow {
1773 font-size: .72rem;
1774 color: var(--ink-muted);
1775 text-transform: uppercase;
1776 letter-spacing: .12em;
1777 margin: 0 0 .25rem;
1778}
1779
1780/* Archief: jaar-overzicht */
1781.archive-years {
1782 display: flex;
1783 flex-direction: column;
1784 gap: 2rem;
1785}
1786.archive-year h2 {
1787 font-family: var(--font-display);
1788 font-size: 1.75rem;
1789 margin: 0 0 .75rem;
1790}
1791.archive-year h2 a {
1792 color: var(--ink);
1793 text-decoration: none;
1794}
1795.archive-year h2 a:hover { color: var(--accent); }
1796.archive-year h2 .admin-muted { font-size: .9rem; font-weight: normal; color: var(--ink-muted); }
1797.archive-months {
1798 list-style: none;
1799 padding: 0; margin: 0;
1800 display: grid;
1801 grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1802 gap: .5rem;
1803}
1804.archive-months li {
1805 display: flex;
1806 align-items: center;
1807 gap: .4rem;
1808 padding: .55rem .75rem;
1809 background: color-mix(in srgb, var(--ink) 3%, transparent);
1810 border-radius: var(--radius);
1811 transition: background .15s;
1812}
1813.archive-months li:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); }
1814.archive-months a {
1815 color: var(--ink);
1816 text-decoration: none;
1817 font-weight: 500;
1818 font-size: .95rem;
1819}
1820.archive-months .admin-muted { font-size: .75rem; color: var(--ink-muted); margin-left: auto; }
1821
1822/* Archief: jaar drill-down */
1823.archive-month-list {
1824 display: flex;
1825 flex-direction: column;
1826 gap: 2rem;
1827}
1828.archive-month h2 {
1829 font-family: var(--font-display);
1830 font-size: 1.35rem;
1831 margin: 0 0 .5rem;
1832 padding-bottom: .35rem;
1833 border-bottom: 1px solid var(--rule);
1834}
1835.archive-month h2 a {
1836 color: var(--ink);
1837 text-decoration: none;
1838}
1839.archive-month h2 a:hover { color: var(--accent); }
1840
1841/* Compact post-list (gebruikt in archief drill-down per maand) */
1842.post-compact-list {
1843 list-style: none;
1844 padding: 0; margin: 0;
1845 display: flex;
1846 flex-direction: column;
1847}
1848.post-compact-list li {
1849 border-bottom: 1px solid var(--rule);
1850}
1851.post-compact-list li:last-child { border-bottom: none; }
1852.post-compact-list a {
1853 display: grid;
1854 grid-template-columns: 3em 1fr;
1855 gap: .75rem;
1856 padding: .6rem .2rem;
1857 text-decoration: none;
1858 color: var(--ink);
1859 transition: background .12s;
1860 border-radius: 4px;
1861}
1862.post-compact-list a:hover {
1863 background: color-mix(in srgb, var(--accent) 6%, transparent);
1864}
1865.post-compact-date {
1866 color: var(--ink-muted);
1867 font-size: .8rem;
1868 align-self: center;
1869}
1870.post-compact-title { font-weight: 500; font-size: 1rem; align-self: center; }
1871.post-compact-list.large a { grid-template-columns: 4em 1fr; padding: .8rem .3rem; }
1872.post-compact-list.large .post-compact-title { font-family: var(--font-display); font-size: 1.15rem; }
1873.post-compact-excerpt {
1874 grid-column: 2;
1875 color: var(--ink-muted);
1876 font-size: .88rem;
1877 line-height: 1.5;
1878}
1879
1880/* Post-list (gebruikt in tag / type / zoek pagina's) */
1881.post-list {
1882 list-style: none;
1883 padding: 0; margin: 0;
1884 display: flex;
1885 flex-direction: column;
1886 gap: 1.5rem;
1887}
1888.post-list-item {
1889 display: grid;
1890 grid-template-columns: 120px 1fr;
1891 gap: 1.25rem;
1892 padding-bottom: 1.5rem;
1893 border-bottom: 1px solid var(--rule);
1894}
1895.post-list-item:last-child { border-bottom: none; }
1896.post-list-item:has(> .post-list-cover + .post-list-body) { grid-template-columns: 120px 1fr; }
1897.post-list-item:not(:has(.post-list-cover)) { grid-template-columns: 1fr; }
1898.post-list-cover {
1899 display: block;
1900 aspect-ratio: 1;
1901 overflow: hidden;
1902 border-radius: var(--radius);
1903}
1904.post-list-cover img {
1905 width: 100%; height: 100%;
1906 object-fit: cover;
1907 display: block;
1908}
1909.post-list-body { display: flex; flex-direction: column; gap: .35rem; }
1910.post-list-meta {
1911 color: var(--ink-muted);
1912 font-size: .75rem;
1913 display: flex; gap: .35rem; align-items: center;
1914}
1915.post-list-title {
1916 font-family: var(--font-display);
1917 font-size: 1.3rem;
1918 font-weight: 450;
1919 margin: 0;
1920 line-height: 1.2;
1921}
1922.post-list-title a {
1923 color: var(--ink);
1924 text-decoration: none;
1925}
1926.post-list-title a:hover { color: var(--accent); }
1927.post-list-excerpt {
1928 color: var(--ink-muted);
1929 font-size: .95rem;
1930 margin: 0;
1931 line-height: 1.5;
1932}
1933
1934/* Zoek-formulier binnen special view */
1935.search-form {
1936 display: flex;
1937 gap: .5rem;
1938 margin-bottom: 2rem;
1939}
1940.search-form input[type=search] {
1941 flex: 1;
1942 padding: .75rem 1rem;
1943 background: var(--paper-2);
1944 border: 1px solid var(--rule);
1945 border-radius: var(--radius);
1946 font: inherit;
1947 color: var(--ink);
1948}
1949.search-form input[type=search]:focus {
1950 outline: none;
1951 border-color: var(--accent);
1952 box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 20%, transparent);
1953}
1954
1955/* ============================================================
1956 SEARCH OVERLAY (masthead → full-screen zoekbalk)
1957 ============================================================ */
1958.search-overlay {
1959 position: fixed;
1960 inset: 0;
1961 background: color-mix(in srgb, var(--ink) 50%, transparent);
1962 z-index: 1500;
1963 display: flex;
1964 justify-content: center;
1965 align-items: flex-start;
1966 padding-top: 10vh;
1967 backdrop-filter: blur(6px);
1968 -webkit-backdrop-filter: blur(6px);
1969}
1970.search-overlay[hidden] { display: none; }
1971.search-overlay-form {
1972 width: min(90vw, 600px);
1973 background: var(--paper);
1974 border-radius: calc(var(--radius) * 1.5);
1975 padding: .75rem 1rem;
1976 display: flex;
1977 align-items: center;
1978 gap: .6rem;
1979 box-shadow: 0 20px 60px rgba(0,0,0,.3);
1980 border: 1px solid var(--rule);
1981}
1982.search-overlay-form .icon {
1983 width: 1.2rem; height: 1.2rem;
1984 color: var(--ink-muted);
1985 flex-shrink: 0;
1986}
1987.search-overlay-form input[type=search] {
1988 flex: 1;
1989 background: transparent;
1990 border: none;
1991 font-family: var(--font-body);
1992 font-size: 1.1rem;
1993 color: var(--ink);
1994 padding: .5rem 0;
1995}
1996.search-overlay-form input[type=search]:focus { outline: none; }
1997.search-overlay-form .nav-btn {
1998 background: transparent;
1999 border: none;
2000 color: var(--ink-muted);
2001 cursor: pointer;
2002 font-size: 1.25rem;
2003 line-height: 1;
2004 padding: .3rem .5rem;
2005}
2006.search-overlay-form .nav-btn:hover { color: var(--ink); }
2007body.search-open { overflow: hidden; }
2008
2009/* ============================================================
2010 RELATED POSTS (onder elke post-view)
2011 ============================================================ */
2012.related-posts {
2013 margin-top: 2.5rem;
2014 padding-top: 2rem;
2015 border-top: 1px solid var(--rule);
2016}
2017.related-title {
2018 font-family: var(--font-mono);
2019 font-size: .7rem;
2020 color: var(--ink-muted);
2021 text-transform: uppercase;
2022 letter-spacing: .12em;
2023 margin: 0 0 1rem;
2024}
2025.related-grid {
2026 list-style: none;
2027 padding: 0; margin: 0;
2028 display: grid;
2029 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
2030 gap: 1rem;
2031}
2032.related-grid a {
2033 display: flex;
2034 flex-direction: column;
2035 gap: .5rem;
2036 text-decoration: none;
2037 color: var(--ink);
2038 border: 1px solid var(--rule);
2039 border-radius: var(--radius);
2040 overflow: hidden;
2041 transition: border-color .15s, transform .15s;
2042 height: 100%;
2043}
2044.related-grid a:hover {
2045 border-color: color-mix(in srgb, var(--accent) 50%, var(--rule));
2046 transform: translateY(-2px);
2047}
2048.related-cover {
2049 display: block;
2050 aspect-ratio: 16/10;
2051 background-size: cover;
2052 background-position: center;
2053 background-color: var(--paper-2);
2054}
2055
2056/* v9.4 — Wanneer related-cover ook .grid-tile-gradient class heeft (lege cover
2057 fallback), erft 'ie automatisch de hue/gradient/title styling van grid-tiles.
2058 Geen aparte related-cover-gradient meer nodig. */
2059.related-body {
2060 display: flex;
2061 flex-direction: column;
2062 gap: .25rem;
2063 padding: .6rem .75rem .9rem;
2064}
2065.related-meta { color: var(--ink-muted); font-size: .7rem; }
2066.related-name {
2067 font-family: var(--font-display);
2068 font-weight: 450;
2069 font-size: 1rem;
2070 line-height: 1.25;
2071}
2072
2073/* ============================================================
2074 MOBILE TWEAKS voor v7.3
2075 ============================================================ */
2076@media (max-width: 600px) {
2077 .post-list-item { grid-template-columns: 1fr; }
2078 .post-list-cover { aspect-ratio: 16/9; }
2079 .archive-months { grid-template-columns: repeat(2, 1fr); }
2080 .related-grid { grid-template-columns: 1fr; }
2081 .search-overlay { padding-top: 4vh; }
2082}
2083
2084/* ============================================================
2085 v7.4 — PROFILE HEADER + VIEW SWITCHER + GRID + POST-TYPE LAYOUTS
2086 MOBILE-FIRST — belangrijkste eis
2087 ============================================================ */
2088
2089/* -------- PROFILE HEADER (Optie C: full op home, compact op post/special) -------- */
2090
2091.profile-header {
2092 background: var(--paper-2, var(--paper));
2093 border-bottom: 1px solid var(--rule);
2094 transition: padding .25s ease, background .2s;
2095}
2096/* Mobiel default = full-mode padding */
2097.profile-header { padding: 1.25rem 0; }
2098.profile-header-inner {
2099 display: flex;
2100 gap: .9rem;
2101 align-items: flex-start;
2102}
2103
2104.profile-photo {
2105 flex-shrink: 0;
2106 width: 80px;
2107 height: 80px;
2108 border-radius: 50%;
2109 overflow: hidden;
2110 display: block;
2111 background: var(--paper);
2112 border: 2px solid var(--rule);
2113 transition: width .25s ease, height .25s ease, border-color .2s;
2114 text-decoration: none;
2115}
2116.profile-photo:hover { border-color: var(--accent); }
2117.profile-photo img {
2118 width: 100%; height: 100%;
2119 object-fit: cover;
2120 display: block;
2121}
2122.profile-photo-fallback {
2123 display: flex;
2124 align-items: center;
2125 justify-content: center;
2126 width: 100%; height: 100%;
2127 background: var(--accent);
2128 color: var(--paper);
2129 font-family: var(--font-display);
2130 font-weight: 700;
2131 font-size: 2.2rem;
2132 text-transform: uppercase;
2133 line-height: 1;
2134 transition: font-size .25s ease;
2135}
2136
2137.profile-info {
2138 flex: 1;
2139 min-width: 0;
2140 display: flex;
2141 flex-direction: column;
2142 gap: .3rem;
2143}
2144.profile-name {
2145 margin: 0;
2146 font-family: var(--font-display);
2147 font-size: 1.2rem;
2148 font-weight: 500;
2149 line-height: 1.15;
2150 transition: font-size .25s ease;
2151}
2152.profile-name a {
2153 color: var(--ink);
2154 text-decoration: none;
2155}
2156.profile-name a:hover { color: var(--accent); }
2157.profile-bio {
2158 margin: 0;
2159 color: var(--ink-muted);
2160 font-size: .92rem;
2161 line-height: 1.45;
2162 max-height: 200px;
2163 overflow: hidden;
2164 transition: max-height .25s ease, margin .25s ease, opacity .2s;
2165}
2166.profile-links {
2167 list-style: none;
2168 padding: 0;
2169 margin: .15rem 0 0;
2170 display: flex;
2171 flex-wrap: wrap;
2172 gap: .4rem;
2173 max-height: 50px;
2174 overflow: hidden;
2175 transition: max-height .25s ease, margin .25s ease, opacity .2s;
2176}
2177.profile-links li { margin: 0; }
2178.profile-links a {
2179 display: inline-flex;
2180 align-items: center;
2181 justify-content: center;
2182 width: 40px;
2183 height: 40px;
2184 border-radius: 50%;
2185 background: color-mix(in srgb, var(--ink) 5%, transparent);
2186 color: var(--ink-muted);
2187 text-decoration: none;
2188 transition: background .15s, color .15s;
2189}
2190.profile-links a:hover {
2191 background: color-mix(in srgb, var(--accent) 15%, transparent);
2192 color: var(--accent);
2193}
2194.profile-links .icon { width: 1.1rem; height: 1.1rem; }
2195
2196/* -------- COMPACT MODE: op post + special pages -------- */
2197
2198.on-post .profile-header,
2199.on-special .profile-header {
2200 padding: .5rem 0;
2201}
2202.on-post .profile-photo,
2203.on-special .profile-photo {
2204 width: 36px;
2205 height: 36px;
2206 border-width: 1px;
2207}
2208.on-post .profile-photo-fallback,
2209.on-special .profile-photo-fallback {
2210 font-size: 1rem;
2211}
2212.on-post .profile-name,
2213.on-special .profile-name {
2214 font-size: 1rem;
2215 align-self: center;
2216}
2217.on-post .profile-bio,
2218.on-special .profile-bio,
2219.on-post .profile-links,
2220.on-special .profile-links {
2221 display: none;
2222}
2223.on-post .profile-header-inner,
2224.on-special .profile-header-inner {
2225 align-items: center;
2226 justify-content: flex-start;
2227 gap: .6rem;
2228}
2229.on-post .profile-info,
2230.on-special .profile-info {
2231 flex: 0 1 auto;
2232 min-width: 0;
2233}
2234.on-post .profile-name,
2235.on-special .profile-name {
2236 text-align: left;
2237}
2238
2239/* -------- DESKTOP: meer ruimte, grotere foto -------- */
2240@media (min-width: 768px) {
2241 .profile-header { padding: 2rem 0; }
2242 .profile-photo { width: 120px; height: 120px; }
2243 .profile-photo-fallback { font-size: 3.2rem; }
2244 .profile-name { font-size: 1.5rem; }
2245 .profile-bio { font-size: 1rem; }
2246 .profile-header-inner { gap: 1.5rem; }
2247 .on-post .profile-header,
2248 .on-special .profile-header { padding: .6rem 0; }
2249 .on-post .profile-photo,
2250 .on-special .profile-photo { width: 42px; height: 42px; }
2251 /* Compact mode: gap blijft klein, ook op desktop */
2252 .on-post .profile-header-inner,
2253 .on-special .profile-header-inner { gap: .75rem; }
2254 .on-post .profile-name,
2255 .on-special .profile-name { font-size: 1.1rem; }
2256}
2257
2258/* -------- VIEW SWITCHER -------- */
2259.view-switcher-wrap {
2260 border-bottom: 1px solid var(--rule);
2261 background: var(--paper);
2262 /* Bottom margin gives breathing room between the switcher bar and the
2263 first post. margin-top staat in shared-styles.ejs (de winnende inline
2264 <style>) — symmetrisch op 1.5rem. */
2265 margin-bottom: 1.5rem;
2266}
2267.view-switcher {
2268 display: flex;
2269 justify-content: center;
2270 gap: .35rem;
2271 /* Slimmer bar — was .6rem, now .35rem so the bar reads as a divider
2272 rather than a row of weight equal to the header. */
2273 padding: .35rem 0;
2274}
2275.view-switch-btn {
2276 display: inline-flex;
2277 align-items: center;
2278 gap: .4rem;
2279 padding: .35rem .85rem; /* was .55rem 1rem */
2280 min-height: 32px; /* was 44px */
2281 background: transparent;
2282 border: 1px solid var(--rule);
2283 border-radius: 999px;
2284 color: var(--ink-muted);
2285 font-family: var(--font-ui);
2286 font-size: .82rem; /* was .85rem */
2287 cursor: pointer;
2288 transition: all .15s;
2289}
2290.view-switch-btn:hover {
2291 color: var(--ink);
2292 border-color: var(--ink-muted);
2293}
2294/* Actieve state: puur afgeleid van body[data-feed-view]. Geen .is-active class meer.
2295 Niet op de Archive-pagina: daar is geen "huidige" timeline/grid-keuze, dus beide
2296 knoppen blijven neutraal (grijs). */
2297/* Actieve Tijdlijn/Grid-state wordt nu gestuurd via [aria-selected="true"] (gezet
2298 door syncAria, die óók op htmx:afterSettle draait) i.p.v. body[data-feed-view].
2299 Reden: body-class/attribuut-CSS pakte niet betrouwbaar na een htmx-OOB-swap;
2300 een element-attribuut wel. De witte active-regel staat in shared-styles. */
2301.view-switch-btn .icon { width: 1rem; height: 1rem; }
2302
2303/* -------- FEED TOGGLE VIA BODY --------
2304 Grid-modus werkt op de feed (home, cirkel). Het ARCHIEF negeert de grid-keuze
2305 bewust: dat is altijd de chronologische jaar/maand-lijst (de switcher is daar
2306 grijs en springt bij klik terug naar de feed). Post-pagina's tonen de
2307 feed-timeline article sowieso altijd. Alle andere body-classes negeren
2308 data-feed-view en houden timeline visible. */
2309body.on-home[data-feed-view="grid"] .feed-timeline,
2310body.on-home[data-feed-view="grid"] .pagination,
2311body.on-home[data-feed-view="grid"] .related-posts,
2312body.on-home[data-feed-view="grid"] .article-footer,
2313body.on-cirkel[data-feed-view="grid"] .feed-timeline {
2314 display: none !important;
2315}
2316/* Grid-sectie alleen zichtbaar op de feed in grid-mode (NIET op archief) */
2317.feed-grid { display: none; }
2318body.on-home[data-feed-view="grid"] .feed-grid,
2319body.on-cirkel[data-feed-view="grid"] .feed-grid { display: block; }
2320
2321/* -------- GRID VIEW TILES (Instagram-stijl) -------- */
2322.feed-grid {
2323 padding: 1rem 0 2rem;
2324}
2325.grid-tiles {
2326 display: grid;
2327 gap: 4px;
2328 grid-template-columns: repeat(2, 1fr);
2329}
2330.grid-tile {
2331 position: relative;
2332 display: block;
2333 aspect-ratio: 1;
2334 background-size: cover;
2335 background-position: center;
2336 background-color: var(--paper-2);
2337 overflow: hidden;
2338 text-decoration: none;
2339 color: var(--ink);
2340 transition: transform .2s;
2341 cursor: pointer;
2342 -webkit-tap-highlight-color: rgba(0,0,0,.1);
2343}
2344.grid-tile:hover { transform: scale(0.98); }
2345.grid-tile-overlay {
2346 position: absolute;
2347 inset: 0;
2348 padding: .6rem;
2349 display: flex;
2350 flex-direction: column;
2351 justify-content: flex-end;
2352 align-items: flex-start;
2353 background: linear-gradient(to top, rgba(0,0,0,.65) 0%, rgba(0,0,0,0) 50%);
2354 opacity: 0;
2355 transition: opacity .2s;
2356 pointer-events: none; /* klik moet naar de <a> eronder gaan, niet naar de overlay */
2357}
2358/* Bron-site (cirkel-feed): toont bij hover "van <site>" onder de titel. */
2359.grid-tile-overlay-src {
2360 color: #fff; opacity: .85;
2361 font-size: .72rem; margin-top: .2rem;
2362 display: inline-flex; align-items: center;
2363}
2364.grid-tile-overlay-src::before { content: "⛓"; margin-right: .25rem; font-size: .9em; }
2365.grid-tile-gradient-src {
2366 margin-top: .3rem; font-size: .72rem; opacity: .8;
2367}
2368.grid-tile-overlay strong {
2369 color: #fff;
2370 font-family: var(--font-display);
2371 font-size: .9rem;
2372 font-weight: 500;
2373 line-height: 1.15;
2374 display: -webkit-box;
2375 -webkit-line-clamp: 3;
2376 -webkit-box-orient: vertical;
2377 overflow: hidden;
2378}
2379@media (hover: hover) {
2380 .grid-tile:hover .grid-tile-overlay { opacity: 1; }
2381}
2382@media (hover: none) {
2383 /* Op touch-devices altijd overlay tonen zodat titels zichtbaar zijn */
2384 .grid-tile-overlay { opacity: 1; background: linear-gradient(to top, rgba(0,0,0,.7) 0%, rgba(0,0,0,0) 70%); }
2385}
2386
2387.grid-tile-gradient {
2388 background-image: none;
2389 background-color: hsl(var(--tile-hue, 30), 40%, 85%);
2390 background-image: linear-gradient(135deg, hsl(var(--tile-hue, 30), 45%, 88%), hsl(calc(var(--tile-hue, 30) + 30), 35%, 75%));
2391 display: flex;
2392 align-items: center;
2393 justify-content: center;
2394 padding: 1rem;
2395 text-align: center;
2396}
2397[data-theme="dark"] .grid-tile-gradient,
2398.grid-tile-gradient[data-theme="dark"] {
2399 background-image: linear-gradient(135deg, hsl(var(--tile-hue, 30), 30%, 18%), hsl(calc(var(--tile-hue, 30) + 30), 25%, 12%));
2400}
2401.grid-tile-title {
2402 font-family: var(--font-display);
2403 font-size: 1rem;
2404 font-weight: 500;
2405 color: var(--ink);
2406 line-height: 1.2;
2407 display: -webkit-box;
2408 -webkit-line-clamp: 4;
2409 -webkit-box-orient: vertical;
2410 overflow: hidden;
2411 z-index: 1;
2412}
2413
2414.grid-tile-pin {
2415 position: absolute;
2416 top: .5rem;
2417 right: .5rem;
2418 display: inline-flex;
2419 align-items: center;
2420 gap: .25rem;
2421 padding: .2rem .55rem;
2422 background: var(--accent);
2423 color: #fff;
2424 border-radius: 999px;
2425 font-family: var(--font-ui);
2426 font-size: .65rem;
2427 font-weight: 700;
2428 text-transform: uppercase;
2429 letter-spacing: .06em;
2430 z-index: 3;
2431 box-shadow: 0 2px 6px rgba(0,0,0,.3);
2432 pointer-events: none;
2433}
2434.grid-tile-pin::before {
2435 content: "📌";
2436 font-size: .9em;
2437 line-height: 1;
2438}
2439/* Pinned-tile overall highlight: accent border + subtle inner glow */
2440.grid-tile.is-pinned {
2441 outline: 3px solid var(--accent);
2442 outline-offset: -3px;
2443 z-index: 1;
2444}
2445.grid-tile.is-pinned:hover {
2446 outline-offset: -2px;
2447}
2448.grid-tile-type {
2449 position: absolute;
2450 top: .4rem;
2451 left: .4rem;
2452 padding: .15rem .5rem;
2453 background: rgba(0,0,0,.55);
2454 color: #fff;
2455 border-radius: 999px;
2456 font-family: var(--font-ui);
2457 font-size: .6rem;
2458 font-weight: 600;
2459 text-transform: uppercase;
2460 letter-spacing: .05em;
2461 z-index: 2;
2462}
2463
2464@media (min-width: 600px) {
2465 .grid-tiles { grid-template-columns: repeat(3, 1fr); }
2466}
2467@media (min-width: 900px) {
2468 .grid-tiles { grid-template-columns: repeat(3, 1fr); gap: 8px; }
2469}
2470
2471/* -------- POST-TYPE SPECIFIEKE LAYOUTS -------- */
2472
2473/* Foto-post: beeld prominent, geen titel bovenaan, caption onder */
2474.feed-timeline[data-post-type="foto"] .post-title {
2475 font-size: 1.1rem;
2476 color: var(--ink-muted);
2477 font-weight: 400;
2478}
2479.feed-timeline[data-post-type="foto"] .post-cover {
2480 margin: 0 -1rem 1rem;
2481 border-radius: 0;
2482}
2483.feed-timeline[data-post-type="foto"] .post-cover img {
2484 width: 100%;
2485 border-radius: 0;
2486}
2487
2488/* Post-caption onder de cover */
2489.post-caption {
2490 font-family: var(--font-body);
2491 font-size: 1rem;
2492 color: var(--ink);
2493 line-height: 1.5;
2494 margin: 0 0 1.25rem;
2495 padding: 0 0 1rem;
2496 border-bottom: 1px solid var(--rule);
2497 white-space: pre-wrap;
2498}
2499.feed-timeline[data-post-type="foto"] .post-caption {
2500 font-size: 1.05rem;
2501 margin-top: -.5rem;
2502 padding-bottom: 1.25rem;
2503}
2504
2505/* Audio/video posts — type-chip helder, content eronder zoals normaal */
2506.feed-timeline[data-post-type="audio"] .post-title,
2507.feed-timeline[data-post-type="video"] .post-title {
2508 font-size: 1.5rem;
2509}
2510
2511@media (min-width: 768px) {
2512 .feed-timeline[data-post-type="foto"] .post-cover {
2513 margin: 0 0 1.5rem;
2514 border-radius: var(--radius);
2515 }
2516}
2517
2518/* -------- ADMIN EDIT-BUTTON op post-view (alleen zichtbaar voor ingelogde admin) -------- */
2519.post-edit-btn {
2520 position: absolute;
2521 top: 1rem;
2522 right: 1rem;
2523 display: inline-flex;
2524 align-items: center;
2525 justify-content: center;
2526 width: 44px;
2527 height: 44px;
2528 background: var(--paper);
2529 border: 1px solid var(--rule);
2530 border-radius: 50%;
2531 color: var(--ink-muted);
2532 text-decoration: none;
2533 box-shadow: 0 2px 8px rgba(0,0,0,.08);
2534 transition: background .15s, color .15s, transform .15s, border-color .15s;
2535 z-index: 10;
2536}
2537.post-edit-btn:hover {
2538 background: var(--accent);
2539 border-color: var(--accent);
2540 color: var(--paper);
2541 transform: scale(1.05);
2542}
2543.post-edit-btn .icon {
2544 width: 1.1rem;
2545 height: 1.1rem;
2546}
2547/* Zorg dat de article relative is zodat absolute positionering werkt */
2548.feed-timeline { position: relative; }
2549
2550@media (min-width: 768px) {
2551 .post-edit-btn {
2552 top: 1.5rem;
2553 right: 1.5rem;
2554 }
2555}
2556
2557/* ============================================================
2558 v8.0 — ACCENT SPAN + POST-TABLE (published posts)
2559 ============================================================ */
2560.post span.accent,
2561.post-content span.accent,
2562article span.accent,
2563page-container span.accent {
2564 color: var(--accent);
2565 font-weight: 500;
2566}
2567
2568.post-table,
2569article table.post-table {
2570 width: 100%;
2571 max-width: 100%;
2572 border-collapse: collapse;
2573 margin: 1.25rem 0;
2574 font-size: .95rem;
2575 display: block;
2576 overflow-x: auto;
2577 -webkit-overflow-scrolling: touch;
2578}
2579.post-table thead { background: color-mix(in srgb, var(--accent) 10%, transparent); }
2580.post-table th,
2581.post-table td {
2582 padding: .6rem .8rem;
2583 text-align: left;
2584 border: 1px solid var(--rule);
2585 vertical-align: top;
2586}
2587.post-table th {
2588 font-family: var(--font-ui);
2589 font-weight: 600;
2590 font-size: .88rem;
2591 color: var(--ink);
2592 letter-spacing: .02em;
2593}
2594.post-table tbody tr:nth-child(even) {
2595 background: color-mix(in srgb, var(--ink) 3%, transparent);
2596}
2597@media (min-width: 700px) {
2598 .post-table { display: table; overflow: visible; }
2599}
2600
2601/* ============================================================
2602 v8.0 fix — grid-cols picker (desktop only) + grid col overrides
2603 ============================================================ */
2604
2605/* Switcher-wrap bevat nu ook de cols-picker; layout side-by-side */
2606.view-switcher-wrap .container {
2607 display: flex;
2608 align-items: center;
2609 justify-content: center;
2610 gap: 1rem;
2611 flex-wrap: wrap;
2612}
2613
2614/* Solo / Cirkel scope-switcher (alleen in circle-modus) — segmented toggle, centraal.
2615 Hoge specificiteit (+ !important op tekst) zodat 'ie globale link-stijlen wint. */
2616.view-switcher-wrap .feed-scope {
2617 display: inline-flex;
2618 background: var(--paper-2);
2619 border: 1px solid var(--rule);
2620 border-radius: 999px;
2621 padding: 3px;
2622}
2623.view-switcher-wrap .feed-scope-btn {
2624 display: inline-flex;
2625 align-items: center;
2626 padding: .32rem .95rem;
2627 min-height: 30px;
2628 border: none !important;
2629 border-radius: 999px !important;
2630 background: transparent !important;
2631 color: var(--ink-muted) !important;
2632 font-family: var(--font-ui);
2633 font-size: .82rem;
2634 font-weight: 500 !important;
2635 text-decoration: none !important;
2636 cursor: pointer;
2637 transition: all .15s;
2638}
2639.view-switcher-wrap .feed-scope-btn:hover { color: var(--ink) !important; }
2640.view-switcher-wrap .feed-scope-btn.is-active {
2641 background: var(--ink) !important;
2642 color: var(--paper) !important;
2643}
2644
2645.grid-cols-picker {
2646 display: none; /* default hidden — desktop + grid-active maakt 'm zichtbaar */
2647 gap: 2px;
2648 padding: 0;
2649}
2650.grid-cols-btn {
2651 display: inline-flex;
2652 align-items: center;
2653 justify-content: center;
2654 min-width: 36px;
2655 height: 32px;
2656 padding: 0 .6rem;
2657 background: transparent;
2658 border: 1px solid var(--rule);
2659 color: var(--ink-muted);
2660 font-family: var(--font-ui);
2661 font-size: .85rem;
2662 font-weight: 500;
2663 cursor: pointer;
2664 transition: all .12s;
2665}
2666.grid-cols-btn:first-child { border-radius: 999px 0 0 999px; }
2667.grid-cols-btn:last-child { border-radius: 0 999px 999px 0; }
2668.grid-cols-btn:not(:first-child):not(:last-child) { border-left: none; border-right: none; }
2669.grid-cols-btn:hover { color: var(--ink); }
2670/* Active state puur via body[data-grid-cols] — geen is-active-class meer. */
2671body[data-grid-cols="2"] .grid-cols-btn[data-cols="2"],
2672body[data-grid-cols="3"] .grid-cols-btn[data-cols="3"],
2673body[data-grid-cols="4"] .grid-cols-btn[data-cols="4"] {
2674 background: var(--ink);
2675 color: var(--paper);
2676 border-color: var(--ink);
2677}
2678
2679/* Desktop + grid-view → toon cols-picker (op de home-feed; niet op archief) */
2680@media (min-width: 600px) {
2681 body.on-home[data-feed-view="grid"] .grid-cols-picker {
2682 display: inline-flex;
2683 }
2684}
2685
2686/* Kolom-overrides op desktop. Mobiel negeert dit (staat vast op 2). Geldt op ELKE
2687 feed met grid (home én cirkel/tag/type/user) — scope op .feed-grid .grid-tiles. */
2688@media (min-width: 600px) {
2689 body[data-grid-cols="2"] .feed-grid .grid-tiles { grid-template-columns: repeat(2, 1fr); }
2690 body[data-grid-cols="3"] .feed-grid .grid-tiles { grid-template-columns: repeat(3, 1fr); }
2691 body[data-grid-cols="4"] .feed-grid .grid-tiles { grid-template-columns: repeat(4, 1fr); }
2692}
2693
2694/* Gradient-tile: iets meer contrast voor light + dark mode zodat titel altijd leesbaar is */
2695.grid-tile-gradient {
2696 background-image: linear-gradient(135deg,
2697 hsl(var(--tile-hue, 30), 55%, 72%),
2698 hsl(calc(var(--tile-hue, 30) + 40), 45%, 60%));
2699}
2700[data-theme="dark"] .grid-tile-gradient {
2701 background-image: linear-gradient(135deg,
2702 hsl(var(--tile-hue, 30), 40%, 30%),
2703 hsl(calc(var(--tile-hue, 30) + 40), 30%, 18%));
2704}
2705.grid-tile-gradient .grid-tile-title {
2706 color: #fff;
2707 text-shadow: 0 1px 3px rgba(0,0,0,.25);
2708}
2709[data-theme="dark"] .grid-tile-gradient .grid-tile-title {
2710 color: #fff;
2711 text-shadow: 0 1px 2px rgba(0,0,0,.5);
2712}
2713
2714/* ============================================================
2715 v8.0.2 — COMPACT DESIGN OVERRIDES
2716 Tighter masthead, padding, margins overall. Profiel-header
2717 collapse/expand blijft zoals 'ie was.
2718 ============================================================ */
2719
2720/* Masthead: compacter */
2721.masthead { padding: calc(.55rem + var(--safe-top)) 0 .55rem; }
2722.masthead-inner { gap: 1rem; }
2723.site-title { font-size: 1.25rem; }
2724.nav-link, .nav-btn { padding: .4rem .7rem; min-height: 2rem; font-size: .82rem; }
2725
2726/* Main content padding */
2727main { padding-top: 1rem; }
2728.page { padding-block: 1rem 1.75rem; }
2729
2730/* View switcher-bar strakker */
2731.view-switcher { padding: .4rem 0; gap: .3rem; }
2732.view-switch-btn { padding: .4rem .85rem; min-height: 38px; font-size: .8rem; }
2733.grid-cols-btn { min-width: 32px; height: 28px; padding: 0 .5rem; font-size: .8rem; }
2734
2735/* Post header spacing terug */
2736.post-header { margin: 0 0 1.25rem; }
2737.post-title { margin-bottom: .35rem; }
2738.post-meta { font-size: .78rem; }
2739.post-tags { margin-top: .6rem; gap: .3rem; }
2740.post-tag { font-size: .7rem; padding: .15rem .55rem; }
2741
2742/* Article footer + pagination compacter */
2743.article-footer { padding-top: 1.25rem; margin-top: 1.5rem; }
2744.pagination { padding-block: 1.25rem 2rem; margin-top: 1.5rem; }
2745.pagination-item { padding: .75rem .95rem; min-height: 4rem; }
2746.pagination-title { font-size: .95rem; }
2747
2748/* Site footer compacter */
2749.site-footer { padding: 1.25rem 0 calc(1.25rem + var(--safe-bot)); margin-top: 2rem; font-size: .78rem; }
2750.site-footer-inner { gap: .75rem; }
2751
2752/* Profiel-header: full mode iets minder riant (compact mode blijft hetzelfde) */
2753.profile-header { padding: 1rem 0; }
2754.profile-photo { width: 72px; height: 72px; }
2755.profile-photo-fallback { font-size: 1.8rem; }
2756.profile-name { font-size: 1.2rem; }
2757.profile-bio { font-size: .85rem; margin-top: .15rem; }
2758.profile-links { margin-top: .5rem; gap: .4rem; }
2759.profile-links a { width: 32px; height: 32px; }
2760
2761@media (min-width: 768px) {
2762 .profile-header { padding: 1.35rem 0; }
2763 .profile-photo { width: 92px; height: 92px; }
2764 .profile-photo-fallback { font-size: 2.4rem; }
2765 .profile-name { font-size: 1.4rem; }
2766 .profile-bio { font-size: .95rem; }
2767 .profile-header-inner { gap: 1.1rem; }
2768 /* Compact-mode op desktop blijft klein zoals we hadden afgesproken */
2769 .on-post .profile-photo,
2770 .on-special .profile-photo { width: 42px; height: 42px; }
2771}
2772
2773/* Grid-tegels iets strakker gaten */
2774.grid-tiles { gap: 3px; }
2775
2776/* Post-cover margin */
2777.post-cover { margin: 0 0 1rem; }
2778
2779/* Audio player wat lichter */
2780#pcms-audio-bar { padding: .55rem 1rem; }
2781
2782/* v8.1 — pagination CTA + mobile tap target */
2783.pagination-cta {
2784 display: inline-block;
2785 font-family: var(--font-ui);
2786 font-size: .72rem;
2787 font-weight: 600;
2788 color: var(--accent);
2789 margin-top: .35rem;
2790 letter-spacing: .02em;
2791 opacity: .9;
2792}
2793a.pagination-item:hover .pagination-cta { opacity: 1; }
2794
2795/* Mobiel: nog meer tap-feedback + iets prominenter */
2796@media (max-width: 640px) {
2797 a.pagination-item {
2798 padding: 1.1rem 1rem;
2799 min-height: 5.5rem;
2800 border-width: 2px;
2801 }
2802 a.pagination-item:active {
2803 background: color-mix(in srgb, var(--accent) 10%, var(--paper-2));
2804 transform: scale(.98);
2805 }
2806 .pagination-title { font-size: 1rem; }
2807 .pagination-cta { font-size: .75rem; }
2808 .pagination .icon { width: 1.5em; height: 1.5em; }
2809}
2810
2811
2812
2813/* v8.3 / v9.4 — PWA install button (alleen zichtbaar als browser install ondersteunt) */
2814.nav-install-btn[hidden] { display: none; }
2815.nav-install-btn {
2816 position: relative;
2817 display: inline-flex;
2818 align-items: center;
2819 justify-content: center;
2820 gap: .35rem;
2821 background: linear-gradient(135deg,
2822 var(--accent),
2823 color-mix(in srgb, var(--accent) 80%, #000));
2824 color: #fff;
2825 border: none;
2826 border-radius: .65rem;
2827 padding: .45rem .85rem;
2828 font-size: .8rem;
2829 font-weight: 600;
2830 line-height: 1;
2831 cursor: pointer;
2832 overflow: hidden;
2833 isolation: isolate;
2834 box-shadow:
2835 0 1px 0 rgba(255,255,255,.15) inset,
2836 0 2px 6px color-mix(in srgb, var(--accent) 35%, transparent);
2837 transition:
2838 transform .15s cubic-bezier(.4, 0, .2, 1),
2839 box-shadow .2s ease,
2840 filter .15s ease;
2841}
2842.nav-install-btn::before {
2843 content: "";
2844 position: absolute;
2845 top: 0;
2846 left: -100%;
2847 width: 60%;
2848 height: 100%;
2849 background: linear-gradient(110deg,
2850 transparent 30%,
2851 rgba(255,255,255,.22) 50%,
2852 transparent 70%);
2853 z-index: -1;
2854 animation: pcmsInstallShimmer 4s ease-in-out infinite;
2855 pointer-events: none;
2856}
2857.nav-install-btn:hover {
2858 transform: translateY(-1px);
2859 filter: brightness(1.08);
2860 box-shadow:
2861 0 1px 0 rgba(255,255,255,.2) inset,
2862 0 4px 10px color-mix(in srgb, var(--accent) 50%, transparent);
2863}
2864.nav-install-btn:active { transform: translateY(0); }
2865.nav-install-btn .icon {
2866 flex-shrink: 0;
2867 transition: transform .25s cubic-bezier(.34, 1.56, .64, 1);
2868}
2869.nav-install-btn:hover .icon { transform: translateY(-1px); }
2870@media (prefers-reduced-motion: reduce) {
2871 .nav-install-btn::before { animation: none; left: -100%; }
2872 .nav-install-btn:hover { transform: none; }
2873 .nav-install-btn:hover .icon { transform: none; }
2874}
2875/* Als PWA al draait (standalone mode) — verberg install-prompt knop volledig */
2876@media all and (display-mode: standalone) {
2877 #pwa-install-btn { display: none !important; }
2878}
2879
2880/* ========== v8.9.9 — Privé-post indicators ========== */
2881.post-private-banner {
2882 display: flex;
2883 align-items: center;
2884 gap: .6rem;
2885 padding: .75rem 1rem;
2886 background: color-mix(in srgb, #eab308 12%, var(--paper, #fff));
2887 border: 1px solid color-mix(in srgb, #eab308 40%, transparent);
2888 border-radius: 8px;
2889 margin: 0 0 1rem;
2890 font-size: .88rem;
2891 color: var(--ink, #1a1a1a);
2892}
2893.post-private-banner strong {
2894 color: #b45309;
2895}
2896
2897.grid-tile-private {
2898 position: absolute;
2899 top: 8px;
2900 left: 8px;
2901 padding: 3px 8px;
2902 background: rgba(0,0,0,0.7);
2903 color: #fde68a;
2904 font-size: .7rem;
2905 font-weight: 700;
2906 border-radius: 999px;
2907 z-index: 3;
2908 backdrop-filter: blur(4px);
2909 -webkit-backdrop-filter: blur(4px);
2910}
2911
2912/* ========== v8.9.10 — Social chip (inline in post-body) ========== */
2913.social-chip {
2914 display: inline-flex;
2915 align-items: center;
2916 gap: .45rem;
2917 padding: .35rem .75rem;
2918 background: color-mix(in srgb, var(--accent) 10%, transparent);
2919 border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
2920 border-radius: 999px;
2921 color: var(--ink, #1a1a1a);
2922 text-decoration: none;
2923 font-family: var(--font-ui, system-ui);
2924 font-size: .85rem;
2925 font-weight: 600;
2926 line-height: 1.2;
2927 transition: all .15s;
2928 vertical-align: middle;
2929 margin: 0 .1rem;
2930}
2931.social-chip:hover {
2932 background: var(--accent);
2933 color: #fff;
2934 border-color: var(--accent);
2935 text-decoration: none;
2936 transform: translateY(-1px);
2937 box-shadow: 0 2px 8px color-mix(in srgb, var(--accent) 40%, transparent);
2938}
2939.social-chip .icon {
2940 width: 16px;
2941 height: 16px;
2942 flex-shrink: 0;
2943}
2944.social-chip-icon-only {
2945 width: 36px;
2946 height: 36px;
2947 padding: 0;
2948 justify-content: center;
2949 border-radius: 50%;
2950}
2951.social-chip-icon-only .icon {
2952 width: 18px;
2953 height: 18px;
2954}
2955
2956/* v8.9.34 — player hidden state + post audio blocks
2957 v9.3 — Hide-rules uitgeschakeld: mini-player blijft permanent zichtbaar
2958 zodat 'ie niet meer verdwijnt bij browser-back of navigatie. */
2959.audio-player.is-hidden {
2960 /* display: none !important; */
2961}
2962body:not(.has-audio-player) #pcms-audio-player.is-hidden {
2963 /* display: none !important; */
2964}
2965
2966/* Post audio track — single track row in een post */
2967/* Lokale audio-track — visueel consistent met .post-audio-external */
2968.post-audio-track {
2969 display: flex;
2970 align-items: center;
2971 gap: .75rem;
2972 padding: .65rem .85rem;
2973 background: var(--paper-2, color-mix(in srgb, var(--ink) 4%, transparent));
2974 border: 1px solid var(--rule, rgba(0,0,0,.08));
2975 border-radius: 10px;
2976 margin: .75rem 0;
2977 transition: background .15s, border-color .15s;
2978}
2979.post-audio-track:hover {
2980 border-color: var(--accent, #c2410c);
2981 background: color-mix(in srgb, var(--accent, #c2410c) 5%, var(--paper-2, transparent));
2982}
2983/* Korte highlight wanneer je via de mini-speler naar deze track springt. */
2984.post-audio-track.pat-flash,
2985.post-album-track-compact.pat-flash {
2986 animation: patFlash 1.6s ease-out;
2987 border-radius: 8px;
2988}
2989/* Blijvende highlight op de track die NU actief is in de speler. */
2990.post-audio-track.pat-playing,
2991.post-album-track-compact.pat-playing {
2992 background: color-mix(in srgb, var(--accent, #c2410c) 12%, var(--paper-2, transparent));
2993 box-shadow: inset 3px 0 0 0 var(--accent, #c2410c);
2994 border-radius: 8px;
2995}
2996@keyframes patFlash {
2997 0%, 30% { border-color: var(--accent, #c2410c); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #c2410c) 35%, transparent); }
2998 100% { box-shadow: 0 0 0 0 transparent; }
2999}
3000.post-audio-track .pat-play {
3001 flex-shrink: 0;
3002 width: 42px;
3003 height: 42px;
3004 border-radius: 8px; /* zelfde rounded-square als pae-icon */
3005 border: none;
3006 background: var(--accent, #c2410c);
3007 color: var(--paper, #fff);
3008 cursor: pointer;
3009 display: inline-flex;
3010 align-items: center;
3011 justify-content: center;
3012 transition: transform .1s, background .15s;
3013 padding: 0;
3014 position: relative;
3015 overflow: hidden;
3016}
3017.post-audio-track .pat-play:hover { transform: scale(1.04); }
3018.post-audio-track .pat-play:active { transform: scale(.96); }
3019.post-audio-track .pat-play svg,
3020.post-audio-track .pat-play .pat-sitelogo {
3021 width: 100%; height: 100%;
3022 position: absolute;
3023 top: 0; left: 0;
3024 transition: opacity .15s;
3025}
3026.post-audio-track .pat-play .icon-play,
3027.post-audio-track .pat-play .icon-pause {
3028 width: 18px; height: 18px;
3029 position: absolute;
3030 top: 50%; left: 50%;
3031 transform: translate(-50%, -50%);
3032 fill: currentColor;
3033 opacity: 0; /* verborgen tot hover of is-current */
3034}
3035/* Site logo: object-cover binnen 42x42 box */
3036.post-audio-track .pat-play .pat-sitelogo {
3037 object-fit: cover;
3038 opacity: 1;
3039}
3040.post-audio-track .pat-play .pat-sitelogo-fallback {
3041 padding: 11px; /* SVG music-note iets kleiner in box */
3042 opacity: 1;
3043}
3044/* Bij hover: site logo faded, play-icoon verschijnt */
3045.post-audio-track:hover .pat-play .pat-sitelogo { opacity: 0.25; }
3046.post-audio-track:hover .pat-play .icon-play { opacity: 1; }
3047/* Bij current + playing: toon pause-icon */
3048.post-audio-track.is-current .pat-play .pat-sitelogo { opacity: 0.25; }
3049.post-audio-track.is-current .pat-play .icon-play { opacity: 1; }
3050.post-audio-track.is-current.is-playing .pat-play .icon-play { opacity: 0; }
3051.post-audio-track.is-current.is-playing .pat-play .icon-pause { opacity: 1; }
3052.post-audio-track.is-current {
3053 border-color: var(--accent, #c2410c);
3054 background: color-mix(in srgb, var(--accent, #c2410c) 10%, transparent);
3055}
3056.post-audio-track .pat-meta {
3057 flex: 1;
3058 min-width: 0;
3059 display: flex;
3060 flex-direction: column;
3061 gap: 2px;
3062}
3063.post-audio-track .pat-title {
3064 display: block;
3065 font-weight: 600;
3066 color: var(--ink);
3067 font-size: .95rem;
3068 overflow: hidden;
3069 text-overflow: ellipsis;
3070 white-space: nowrap;
3071}
3072.post-audio-track .pat-artist {
3073 display: block;
3074 font-size: .78rem;
3075 color: var(--ink-muted, var(--ink));
3076 opacity: .65;
3077 overflow: hidden;
3078 text-overflow: ellipsis;
3079 white-space: nowrap;
3080}
3081.post-audio-track .pat-duration {
3082 flex-shrink: 0;
3083 font-family: ui-monospace, monospace;
3084 font-size: .8rem;
3085 opacity: .55;
3086}
3087
3088/* Album block in een post */
3089.post-album {
3090 position: relative;
3091 border: 1px solid var(--rule, rgba(0,0,0,.1));
3092 border-radius: 14px;
3093 overflow: hidden;
3094 margin: 1.25rem 0;
3095 background: var(--paper-2, color-mix(in srgb, var(--ink) 3%, transparent));
3096}
3097.post-album-header {
3098 display: flex;
3099 gap: .75rem;
3100 padding: .55rem .7rem;
3101 align-items: center;
3102}
3103.post-album-cover {
3104 width: 120px;
3105 height: 120px;
3106 border-radius: 8px;
3107 background-size: cover;
3108 background-position: center;
3109 background-color: var(--rule);
3110 flex-shrink: 0;
3111}
3112/* v9.0 — Collage van track-covers als album-cover leeg is */
3113.post-album-cover-collage {
3114 display: grid;
3115 grid-template-columns: 1fr 1fr;
3116 grid-template-rows: 1fr 1fr;
3117 gap: 0;
3118 overflow: hidden;
3119 background: transparent;
3120}
3121.post-album-cover-collage .post-album-cover-tile {
3122 background-size: cover;
3123 background-position: center;
3124 width: 100%;
3125 height: 100%;
3126}
3127/* Empty state: gradient met muziek-noot */
3128.post-album-cover-empty {
3129 display: flex;
3130 align-items: center;
3131 justify-content: center;
3132 background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 25%, var(--paper-2)), color-mix(in srgb, var(--accent) 10%, var(--paper)));
3133 color: var(--accent, #c2410c);
3134}
3135.post-album-cover-empty svg {
3136 width: 42%;
3137 height: 42%;
3138 opacity: .55;
3139}
3140.post-album-info {
3141 flex: 1;
3142 min-width: 0;
3143}
3144.post-album-label {
3145 text-transform: uppercase;
3146 font-size: .68rem;
3147 letter-spacing: .1em;
3148 opacity: .55;
3149 margin: 0 0 .15rem;
3150 font-weight: 700;
3151}
3152.post-album-title {
3153 font-family: var(--font-display);
3154 font-size: 1.1rem;
3155 font-weight: 600;
3156 margin: 0 0 .1rem;
3157 line-height: 1.15;
3158 letter-spacing: -0.01em;
3159}
3160.post-album-artist {
3161 font-size: .88rem;
3162 opacity: .8;
3163 margin: 0 0 .12rem;
3164 line-height: 1.25;
3165}
3166.post-album-meta {
3167 font-size: .74rem;
3168 opacity: .55;
3169 margin: 0;
3170 line-height: 1.2;
3171}
3172.post-album-playall {
3173 margin-top: .75rem;
3174 padding: .45rem .9rem;
3175 background: var(--accent, #c2410c);
3176 color: var(--paper, #fff);
3177 border: none;
3178 border-radius: 6px;
3179 font-weight: 600;
3180 cursor: pointer;
3181 font-size: .88rem;
3182 display: inline-flex;
3183 align-items: center;
3184 gap: .35rem;
3185}
3186.post-album-playall:hover { filter: brightness(1.08); }
3187
3188/* ============================================================
3189 v9.0 — Album cover clickable button
3190 ============================================================ */
3191.post-album-cover-btn {
3192 position: relative;
3193 background: none;
3194 border: none;
3195 padding: 0;
3196 margin: 0;
3197 cursor: pointer;
3198 flex-shrink: 0;
3199 border-radius: 8px;
3200 overflow: hidden;
3201 display: block;
3202 width: auto;
3203 /* v9.1 — voorkom mobile 300ms double-tap zoom delay, anders zou 2× snel klikken
3204 een zoom triggeren i.p.v. 2× click-events */
3205 touch-action: manipulation;
3206 -webkit-tap-highlight-color: transparent;
3207}
3208.post-album-cover-btn .post-album-cover {
3209 display: block;
3210 width: 76px;
3211 height: 76px;
3212 border-radius: 7px;
3213 background-size: cover;
3214 background-position: center;
3215 background-color: var(--rule);
3216 transition: transform .25s ease;
3217}
3218.post-album-cover-btn:hover .post-album-cover {
3219 transform: scale(1.04);
3220}
3221.post-album-cover-btn .post-album-cover-empty {
3222 background: linear-gradient(135deg,
3223 color-mix(in srgb, var(--accent, #c2410c) 35%, var(--paper)),
3224 color-mix(in srgb, var(--accent, #c2410c) 10%, var(--paper-2)));
3225 display: flex;
3226 align-items: center;
3227 justify-content: center;
3228}
3229.post-album-cover-btn .post-album-cover-empty svg {
3230 width: 28px;
3231 height: 28px;
3232 color: color-mix(in srgb, var(--accent, #c2410c) 60%, transparent);
3233}
3234/* Play overlay op hover */
3235.post-album-cover-play {
3236 position: absolute;
3237 inset: 0;
3238 display: flex;
3239 align-items: center;
3240 justify-content: center;
3241 background: rgba(0, 0, 0, .35);
3242 opacity: 0;
3243 transition: opacity .2s ease;
3244 border-radius: 8px;
3245 pointer-events: none;
3246}
3247.post-album-cover-play svg {
3248 width: 48px;
3249 height: 48px;
3250 color: #fff;
3251 filter: drop-shadow(0 2px 8px rgba(0,0,0,.4));
3252}
3253.post-album-cover-btn:hover .post-album-cover-play,
3254.post-album-cover-btn:focus-visible .post-album-cover-play {
3255 opacity: 1;
3256}
3257
3258/* ============================================================
3259 v1 P52 — Admin actions overlay (edit / delete)
3260 Only rendered when the viewer has god role. Sits top-right
3261 of the card so it doesn't compete with the cover play affordance.
3262 ============================================================ */
3263.post-album-actions {
3264 position: absolute;
3265 top: .4rem;
3266 right: .4rem;
3267 display: flex;
3268 gap: .25rem;
3269 z-index: 2;
3270}
3271.post-album-action {
3272 width: 28px;
3273 height: 28px;
3274 border-radius: 6px;
3275 border: 1px solid var(--rule);
3276 background: color-mix(in srgb, var(--paper) 78%, transparent);
3277 backdrop-filter: blur(8px);
3278 -webkit-backdrop-filter: blur(8px);
3279 color: var(--ink);
3280 display: inline-flex;
3281 align-items: center;
3282 justify-content: center;
3283 cursor: pointer;
3284 text-decoration: none;
3285 opacity: .65;
3286 padding: 0;
3287 transition: opacity .15s ease, transform .15s ease, background .15s ease, color .15s ease, border-color .15s ease;
3288 -webkit-tap-highlight-color: transparent;
3289}
3290.post-album-action:hover,
3291.post-album-action:focus-visible {
3292 opacity: 1;
3293 transform: translateY(-1px);
3294 outline: none;
3295}
3296.post-album-action.is-danger:hover,
3297.post-album-action.is-danger:focus-visible {
3298 background: color-mix(in srgb, #c2410c 18%, var(--paper));
3299 border-color: color-mix(in srgb, #c2410c 45%, var(--rule));
3300 color: #c2410c;
3301}
3302.post-album-action svg {
3303 width: 15px;
3304 height: 15px;
3305 display: block;
3306}
3307
3308/* ============================================================
3309 v9.0 — Compacte tracklist (informatief, niet-klikbaar)
3310 ============================================================ */
3311.post-album-tracks {
3312 list-style: none;
3313 padding: 0;
3314 margin: 0;
3315 border-top: 1px solid var(--rule);
3316}
3317/* v9.4 — Playlist insert modal rows */
3318.pli-row {
3319 display: flex;
3320 align-items: center;
3321 gap: .75rem;
3322 padding: .65rem .5rem;
3323 border-bottom: 1px solid var(--border);
3324}
3325.pli-row:last-child { border-bottom: none; }
3326.pli-row-cover {
3327 width: 44px;
3328 height: 44px;
3329 border-radius: 6px;
3330 background-size: cover;
3331 background-position: center;
3332 background-color: color-mix(in srgb, var(--ink, #000) 8%, transparent);
3333 flex-shrink: 0;
3334 display: flex;
3335 align-items: center;
3336 justify-content: center;
3337 font-size: 1.4rem;
3338}
3339.pli-row-info {
3340 flex: 1;
3341 min-width: 0;
3342}
3343.pli-row-title {
3344 font-weight: 600;
3345 overflow: hidden;
3346 text-overflow: ellipsis;
3347 white-space: nowrap;
3348}
3349.pli-row-meta {
3350 font-size: .82rem;
3351 overflow: hidden;
3352 text-overflow: ellipsis;
3353 white-space: nowrap;
3354}
3355.post-playlist-placeholder {
3356 margin: 1rem 0;
3357 user-select: none;
3358}
3359
3360/* v9.4 — Generic modal classes (gebruikt door playlist-editor en andere modals) */
3361.pcms-modal-backdrop {
3362 position: fixed;
3363 inset: 0;
3364 background: rgba(0, 0, 0, .6);
3365 display: flex;
3366 align-items: center;
3367 justify-content: center;
3368 z-index: 9000;
3369 padding: 1rem;
3370 box-sizing: border-box;
3371 overflow-y: auto;
3372}
3373.pcms-modal {
3374 background: var(--paper, #fff);
3375 color: var(--ink, #000);
3376 border-radius: 12px;
3377 width: 100%;
3378 max-width: 640px;
3379 max-height: calc(100vh - 2rem);
3380 display: flex;
3381 flex-direction: column;
3382 overflow: hidden;
3383 box-shadow: 0 20px 60px rgba(0, 0, 0, .3);
3384}
3385.pcms-modal-header {
3386 display: flex;
3387 align-items: center;
3388 justify-content: space-between;
3389 padding: 1rem 1.25rem;
3390 border-bottom: 1px solid var(--border);
3391 flex-shrink: 0;
3392}
3393.pcms-modal-header h3 { font-size: 1.1rem; }
3394.pcms-modal-close {
3395 background: transparent;
3396 border: none;
3397 font-size: 1.6rem;
3398 line-height: 1;
3399 cursor: pointer;
3400 padding: .25rem .5rem;
3401 color: var(--fg-muted, #666);
3402 border-radius: 4px;
3403}
3404.pcms-modal-close:hover {
3405 background: color-mix(in srgb, var(--ink, #000) 8%, transparent);
3406}
3407.pcms-modal-body {
3408 padding: 1.25rem;
3409 overflow-y: auto;
3410 overscroll-behavior: contain;
3411 flex: 1;
3412 min-height: 0;
3413}
3414.pcms-modal-footer {
3415 display: flex;
3416 gap: .5rem;
3417 justify-content: flex-end;
3418 padding: .75rem 1.25rem;
3419 border-top: 1px solid var(--border);
3420 flex-shrink: 0;
3421 background: color-mix(in srgb, var(--ink, #000) 3%, transparent);
3422}
3423
3424/* On mobile: full-screen modal */
3425@media (max-width: 600px) {
3426 .pcms-modal-backdrop {
3427 padding: 0;
3428 }
3429 .pcms-modal {
3430 border-radius: 0;
3431 max-width: 100%;
3432 max-height: 100vh;
3433 height: 100vh;
3434 }
3435}
3436
3437/* v9.4 — Media → Playlists tab */
3438.playlists-page-header {
3439 display: flex;
3440 flex-wrap: wrap;
3441 gap: 1rem;
3442 align-items: center;
3443 justify-content: space-between;
3444 margin-bottom: 1.25rem;
3445}
3446.playlists-page-header > p { flex: 1; min-width: 200px; }
3447.playlists-grid {
3448 display: grid;
3449 grid-template-columns: 1fr;
3450 gap: .75rem;
3451}
3452@media (min-width: 720px) {
3453 .playlists-grid { grid-template-columns: repeat(2, 1fr); }
3454}
3455@media (min-width: 1100px) {
3456 .playlists-grid { grid-template-columns: repeat(3, 1fr); }
3457}
3458.playlist-card {
3459 display: grid;
3460 grid-template-columns: 64px 1fr auto;
3461 gap: .75rem;
3462 align-items: center;
3463 padding: .75rem;
3464 border: 1px solid var(--border);
3465 border-radius: var(--radius);
3466 background: var(--paper, #fff);
3467}
3468.playlist-card-cover {
3469 width: 64px;
3470 height: 64px;
3471 border-radius: 8px;
3472 overflow: hidden;
3473 background-color: color-mix(in srgb, var(--ink, #000) 6%, transparent);
3474 display: flex;
3475 align-items: center;
3476 justify-content: center;
3477}
3478.playlist-card-cover img {
3479 width: 100%;
3480 height: 100%;
3481 object-fit: cover;
3482}
3483.playlist-card-cover-empty { font-size: 1.6rem; opacity: .5; }
3484.playlist-card-info { min-width: 0; }
3485.playlist-card-title {
3486 font-weight: 600;
3487 overflow: hidden;
3488 text-overflow: ellipsis;
3489 white-space: nowrap;
3490}
3491.playlist-card-artist,
3492.playlist-card-meta {
3493 font-size: .82rem;
3494 overflow: hidden;
3495 text-overflow: ellipsis;
3496 white-space: nowrap;
3497}
3498.playlist-card-actions {
3499 display: flex;
3500 gap: .25rem;
3501 flex-shrink: 0;
3502}
3503
3504/* v9.4 — Playlist editor modal (mobile-friendly, single-column) */
3505.pl-editor {
3506 /* Erft van .pcms-modal */
3507}
3508.pl-editor-meta {
3509 display: grid;
3510 grid-template-columns: 1fr;
3511 gap: .75rem;
3512 margin-bottom: 1rem;
3513}
3514@media (min-width: 560px) {
3515 .pl-editor-meta {
3516 grid-template-columns: 1fr 1fr;
3517 }
3518 .pl-editor-meta .pl-editor-field-full { grid-column: 1 / -1; }
3519}
3520.pl-editor-field {
3521 display: flex;
3522 flex-direction: column;
3523 gap: .25rem;
3524 min-width: 0;
3525}
3526.pl-editor-field span {
3527 font-size: .82rem;
3528 color: var(--fg-muted, #666);
3529 font-weight: 500;
3530}
3531.pl-editor-field input,
3532.pl-editor-field select {
3533 width: 100%;
3534 box-sizing: border-box;
3535 padding: .5rem .65rem;
3536 font-size: .95rem;
3537 border: 1px solid var(--border);
3538 border-radius: 6px;
3539 background: var(--paper, #fff);
3540 color: var(--ink, #000);
3541}
3542.pl-editor-field input:focus,
3543.pl-editor-field select:focus {
3544 outline: 2px solid var(--accent, #5a8a5a);
3545 outline-offset: -1px;
3546}
3547.pl-editor-section-title {
3548 margin: 1.25rem 0 .5rem;
3549 font-size: 1rem;
3550 font-weight: 600;
3551}
3552.pl-tracks-selected {
3553 border: 1px solid var(--border);
3554 border-radius: var(--radius);
3555 background: var(--paper, #fff);
3556 min-height: 60px;
3557 margin-bottom: 1rem;
3558 padding: .25rem;
3559}
3560.pl-tracks-empty {
3561 padding: 1.5rem;
3562 text-align: center;
3563 color: var(--fg-muted, #666);
3564 font-size: .9rem;
3565}
3566.pl-track-row {
3567 display: grid;
3568 grid-template-columns: 32px 36px 1fr auto;
3569 gap: .5rem;
3570 align-items: center;
3571 padding: .5rem;
3572 border-bottom: 1px solid var(--border);
3573 background: var(--paper, #fff);
3574 user-select: none;
3575 touch-action: pan-x;
3576}
3577.pl-track-row:last-child { border-bottom: none; }
3578.pl-track-row.is-dragging {
3579 opacity: .55;
3580 transform: scale(.98);
3581 background: color-mix(in srgb, var(--accent, #5a8a5a) 10%, transparent);
3582 border-radius: 6px;
3583}
3584.pl-track-row.drop-target-above {
3585 box-shadow: inset 0 2px 0 0 var(--accent, #5a8a5a);
3586}
3587.pl-track-row.drop-target-below {
3588 box-shadow: inset 0 -2px 0 0 var(--accent, #5a8a5a);
3589}
3590.pl-track-handle {
3591 cursor: grab;
3592 font-size: 1.2rem;
3593 line-height: 1;
3594 color: var(--fg-muted, #666);
3595 display: flex;
3596 align-items: center;
3597 justify-content: center;
3598 height: 32px;
3599 width: 32px;
3600 border-radius: 4px;
3601 flex-shrink: 0;
3602}
3603.pl-track-handle:active { cursor: grabbing; }
3604.pl-track-handle:hover {
3605 background: color-mix(in srgb, var(--ink, #000) 8%, transparent);
3606}
3607.pl-track-num {
3608 text-align: center;
3609 color: var(--fg-muted, #666);
3610 font-size: .85rem;
3611 width: 36px;
3612}
3613.pl-track-info {
3614 min-width: 0;
3615 overflow: hidden;
3616}
3617.pl-track-title {
3618 font-weight: 500;
3619 overflow: hidden;
3620 text-overflow: ellipsis;
3621 white-space: nowrap;
3622}
3623.pl-track-artist {
3624 font-size: .78rem;
3625 color: var(--fg-muted, #666);
3626 overflow: hidden;
3627 text-overflow: ellipsis;
3628 white-space: nowrap;
3629}
3630.pl-track-remove {
3631 background: transparent;
3632 border: none;
3633 cursor: pointer;
3634 padding: .35rem;
3635 border-radius: 4px;
3636 color: var(--fg-muted, #666);
3637 font-size: 1.2rem;
3638 line-height: 1;
3639}
3640.pl-track-remove:hover {
3641 background: color-mix(in srgb, #c00 12%, transparent);
3642 color: #c00;
3643}
3644
3645/* Available tracks panel */
3646.pl-tracks-available-panel {
3647 border: 1px solid var(--border);
3648 border-radius: var(--radius);
3649 background: var(--paper, #fff);
3650}
3651.pl-tracks-available-search {
3652 padding: .5rem;
3653 border-bottom: 1px solid var(--border);
3654}
3655.pl-tracks-available-search input {
3656 width: 100%;
3657 box-sizing: border-box;
3658}
3659.pl-tracks-available-list {
3660 max-height: 30vh;
3661 overflow-y: auto;
3662}
3663.pl-track-row-available {
3664 display: grid;
3665 grid-template-columns: 1fr auto;
3666 gap: .5rem;
3667 align-items: center;
3668 padding: .5rem;
3669 border-bottom: 1px solid var(--border);
3670 cursor: pointer;
3671}
3672.pl-track-row-available:last-child { border-bottom: none; }
3673.pl-track-row-available:hover {
3674 background: color-mix(in srgb, var(--accent, #5a8a5a) 8%, transparent);
3675}
3676.pl-track-row-available.is-already-added {
3677 opacity: .4;
3678 pointer-events: none;
3679}
3680.pl-track-add-btn {
3681 background: transparent;
3682 border: 1px solid var(--border);
3683 border-radius: 4px;
3684 padding: .25rem .5rem;
3685 cursor: pointer;
3686 font-size: .85rem;
3687 color: var(--accent, #5a8a5a);
3688}
3689
3690/* v9.3 — Tracklist items zijn nu klikbare <button class="pat-row"> binnen <li>.
3691 De LI is puur een container zonder visuele styling; alles gebeurt op de button. */
3692.post-album-track-compact {
3693 padding: 0;
3694 margin: 0;
3695 border-bottom: 1px solid var(--rule);
3696 list-style: none;
3697}
3698.post-album-track-compact:last-child { border-bottom: none; }
3699
3700.pat-row {
3701 display: grid;
3702 grid-template-columns: 32px 1fr auto;
3703 gap: .65rem;
3704 align-items: center;
3705 width: 100%;
3706 padding: .5rem .85rem;
3707 background: transparent;
3708 border: none;
3709 color: inherit;
3710 font: inherit;
3711 font-size: .82rem;
3712 text-align: left;
3713 cursor: pointer;
3714 position: relative;
3715 transition: background .15s ease;
3716}
3717.pat-row:hover {
3718 background: color-mix(in srgb, var(--ink, #000) 6%, transparent);
3719}
3720.pat-row:active { transform: scale(.995); }
3721[data-theme="dark"] .pat-row:hover {
3722 background: color-mix(in srgb, var(--paper, #fff) 10%, transparent);
3723}
3724
3725/* Leader: track-nummer OF cover-thumb (afhankelijk van kind).
3726 v9.3 — pat-leader is altijd 32×32, met overgang voor spinner-vervanging. */
3727.pat-row .pat-num,
3728.pat-row .pat-cover {
3729 width: 32px;
3730 height: 32px;
3731 border-radius: 4px;
3732 flex-shrink: 0;
3733 transition: opacity .25s ease, transform .25s ease;
3734}
3735.pat-row .pat-num {
3736 font-family: ui-monospace, monospace;
3737 font-size: .8rem;
3738 opacity: .5;
3739 display: flex;
3740 align-items: center;
3741 justify-content: center;
3742}
3743.pat-row .pat-cover {
3744 background-size: cover;
3745 background-position: center;
3746 background-color: color-mix(in srgb, var(--ink, #000) 8%, transparent);
3747}
3748
3749/* v9.3 — Loading-spiraal als overlay op de leader-kolom.
3750 pat-num/pat-cover faden uit, spinner faded in via ::before. */
3751.pat-row::before {
3752 content: "";
3753 position: absolute;
3754 left: .85rem; top: 50%;
3755 width: 32px; height: 32px;
3756 transform: translateY(-50%);
3757 color: var(--accent, #c2410c);
3758 background-color: currentColor;
3759 -webkit-mask: url('/assets/spinner.svg') center/26px 26px no-repeat;
3760 mask: url('/assets/spinner.svg') center/26px 26px no-repeat;
3761 opacity: 0;
3762 transition: opacity .25s ease;
3763 pointer-events: none;
3764 animation: pat-spinner-rotate 1.2s linear infinite;
3765 animation-play-state: paused;
3766}
3767.pat-row.is-loading::before {
3768 opacity: 1;
3769 animation-play-state: running;
3770}
3771.pat-row.is-loading .pat-num,
3772.pat-row.is-loading .pat-cover {
3773 opacity: 0;
3774 transform: scale(.85);
3775}
3776@keyframes pat-spinner-rotate {
3777 from { transform: translateY(-50%) rotate(0deg); }
3778 to { transform: translateY(-50%) rotate(-360deg); }
3779}
3780
3781/* Meta-kolom */
3782.pat-row .pat-meta {
3783 display: flex;
3784 flex-direction: column;
3785 min-width: 0;
3786 gap: 1px;
3787 overflow: hidden;
3788}
3789.pat-row .pat-title {
3790 font-weight: 500;
3791 overflow: hidden;
3792 text-overflow: ellipsis;
3793 white-space: nowrap;
3794}
3795.pat-row .pat-artist {
3796 font-size: .72rem;
3797 opacity: .6;
3798 overflow: hidden;
3799 text-overflow: ellipsis;
3800 white-space: nowrap;
3801}
3802.pat-row .pat-duration {
3803 font-family: ui-monospace, monospace;
3804 font-size: .72rem;
3805 opacity: .55;
3806 font-variant-numeric: tabular-nums;
3807 white-space: nowrap;
3808}
3809.pat-row .pat-duration-empty {
3810 opacity: .25;
3811}
3812
3813/* is-current — actieve track in de player */
3814.pat-row.is-current {
3815 background: color-mix(in srgb, var(--accent, #c2410c) 12%, transparent);
3816}
3817.pat-row.is-current .pat-title,
3818.pat-row.is-current .pat-artist { color: var(--accent, #c2410c); }
3819
3820/* v9.3 — Marquee bij actief afspelen: titel scrollt heen-en-weer.
3821 --pat-shift wordt door JS gezet (= overflow in pixels). Bij 0 → geen
3822 beweging want translateX(0) blijft 0.
3823 Snelle cyclus (6s) met korte rust aan beide uiteinden (8%) zodat 't
3824 vlot voelt zonder onleesbaar te zijn. */
3825.pat-row.is-current.is-playing .pat-title {
3826 animation: pat-title-marquee 6s ease-in-out infinite alternate;
3827 text-overflow: clip;
3828 overflow: visible;
3829 will-change: transform;
3830}
3831@keyframes pat-title-marquee {
3832 0%, 8% { transform: translateX(0); }
3833 92%, 100% { transform: translateX(calc(-1 * var(--pat-shift, 0px))); }
3834}
3835
3836/* ============================================================
3837 v9.0 — CSS-migratie voor OUDE opgeslagen albums
3838 Oude posts hebben <li class="post-audio-track"> met play-knoppen + cover-spans.
3839 We renderen die VISUEEL als compact, zonder de HTML aan te passen.
3840 ============================================================ */
3841.post-album-tracks .post-audio-track {
3842 display: grid;
3843 grid-template-columns: 28px 1fr auto;
3844 gap: .75rem;
3845 align-items: center;
3846 padding: .5rem .85rem;
3847 margin: 0;
3848 border: none;
3849 border-bottom: 1px solid var(--rule);
3850 background: transparent;
3851 border-radius: 0;
3852 cursor: default;
3853 font-size: .92rem;
3854}
3855.post-album-tracks .post-audio-track:last-child { border-bottom: none; }
3856/* Verberg de cover-thumb en play-button in OUDE saved posts */
3857.post-album-tracks .post-audio-track .pat-cover,
3858.post-album-tracks .post-audio-track .pat-play {
3859 display: none !important;
3860}
3861.post-album-tracks .post-audio-track .pat-num {
3862 font-family: ui-monospace, monospace;
3863 font-size: .8rem;
3864 opacity: .45;
3865 text-align: center;
3866 width: auto;
3867}
3868.post-album-tracks .post-audio-track .pat-meta {
3869 display: flex;
3870 flex-direction: column;
3871 min-width: 0;
3872 gap: 1px;
3873}
3874.post-album-tracks .post-audio-track .pat-title {
3875 font-weight: 500;
3876 overflow: hidden;
3877 text-overflow: ellipsis;
3878 white-space: nowrap;
3879}
3880.post-album-tracks .post-audio-track .pat-artist {
3881 font-size: .78rem;
3882 opacity: .6;
3883}
3884.post-album-tracks .post-audio-track .pat-duration {
3885 font-family: ui-monospace, monospace;
3886 font-size: .78rem;
3887 opacity: .55;
3888}
3889.post-album-tracks .post-audio-track.is-current {
3890 background: color-mix(in srgb, var(--accent, #c2410c) 10%, transparent);
3891}
3892.post-album-tracks .post-audio-track.is-current .pat-num,
3893.post-album-tracks .post-audio-track.is-current .pat-title {
3894 color: var(--accent);
3895}
3896
3897@media (max-width: 540px) {
3898 .post-album-header { flex-direction: column; }
3899 .post-album-cover-btn .post-album-cover { width: 100%; max-width: 240px; height: auto; aspect-ratio: 1/1; }
3900}
3901@media (max-width: 380px) {
3902 .post-album-header { padding: .75rem; gap: .75rem; }
3903 .post-album-cover-btn .post-album-cover { max-width: 180px; }
3904 .post-album-title { font-size: 1.15rem; }
3905 .post-album-meta { font-size: .8rem; }
3906 .post-album-track-compact,
3907 .post-album-tracks .post-audio-track {
3908 grid-template-columns: 24px 1fr auto;
3909 gap: .5rem;
3910 padding: .4rem .6rem;
3911 font-size: .85rem;
3912 }
3913 .post-album-track-compact .pat-duration,
3914 .post-album-tracks .post-audio-track .pat-duration {
3915 font-size: .72rem;
3916 }
3917 /* Queue items in expand-sheet */
3918 .audio-sheet-queue-item { padding: .4rem .45rem; gap: .55rem; }
3919 .audio-sheet-queue-cover { width: 32px; height: 32px; }
3920 .audio-sheet-queue-title { font-size: .85rem; }
3921 .audio-sheet-queue-artist { font-size: .7rem; }
3922}
3923
3924/* External track (SoundCloud / YouTube / Spotify / etc) — klikbaar maar link-naar-platform */
3925.post-audio-external {
3926 display: flex;
3927 align-items: center;
3928 gap: .75rem;
3929 padding: .65rem .85rem;
3930 background: var(--paper-2, color-mix(in srgb, var(--ink) 4%, transparent));
3931 border: 1px solid var(--rule, rgba(0,0,0,.08));
3932 border-radius: 10px;
3933 margin: .75rem 0;
3934 text-decoration: none;
3935 color: var(--ink);
3936 transition: background .15s, border-color .15s;
3937}
3938.post-audio-external:hover {
3939 border-color: var(--accent);
3940 background: color-mix(in srgb, var(--accent) 5%, var(--paper-2, transparent));
3941}
3942.post-audio-external .pae-icon {
3943 flex-shrink: 0;
3944 width: 42px;
3945 height: 42px;
3946 border-radius: 8px;
3947 display: inline-flex;
3948 align-items: center;
3949 justify-content: center;
3950 background: var(--platform-color, #555);
3951 color: #fff;
3952 font-size: 1.2rem;
3953}
3954.post-audio-external .pae-icon-svg svg {
3955 width: 60%;
3956 height: 60%;
3957 fill: currentColor;
3958}
3959/* Per-platform vult de box net wat anders — brand-specifiek geoptimaliseerd */
3960.post-audio-external[data-platform="soundcloud"] .pae-icon-svg svg { width: 72%; height: auto; }
3961.post-audio-external[data-platform="spotify"] .pae-icon-svg svg { width: 72%; height: 72%; }
3962.post-audio-external[data-platform="youtube"] .pae-icon-svg svg { width: 68%; height: auto; }
3963.post-audio-external[data-platform="bandcamp"] .pae-icon-svg svg { width: 62%; height: auto; }
3964.post-audio-external[data-platform="apple"] .pae-icon-svg svg { width: 58%; height: 58%; }
3965.post-audio-external[data-platform="tidal"] .pae-icon-svg svg { width: 68%; height: auto; }
3966.post-audio-external[data-platform="deezer"] .pae-icon-svg svg { width: 65%; height: auto; }
3967.post-audio-external[data-platform="mixcloud"] .pae-icon-svg svg { width: 75%; height: auto; }
3968.post-audio-external[data-platform="soundcloud"] .pae-icon { background: #ff5500; }
3969.post-audio-external[data-platform="spotify"] .pae-icon { background: #1db954; }
3970.post-audio-external[data-platform="youtube"] .pae-icon { background: #ff0000; }
3971.post-audio-external[data-platform="bandcamp"] .pae-icon { background: #1da0c3; }
3972.post-audio-external[data-platform="apple"] .pae-icon { background: #fa243c; }
3973.post-audio-external[data-platform="tidal"] .pae-icon { background: #000; }
3974.post-audio-external[data-platform="deezer"] .pae-icon { background: #a238ff; }
3975.post-audio-external[data-platform="mixcloud"] .pae-icon { background: #314359; }
3976.post-audio-external[data-platform="other"] .pae-icon { background: #555; }
3977.post-audio-external .pae-meta {
3978 flex: 1;
3979 min-width: 0;
3980 display: flex;
3981 flex-direction: column;
3982 gap: 2px;
3983}
3984.post-audio-external .pae-title {
3985 display: block;
3986 font-weight: 600;
3987 overflow: hidden;
3988 text-overflow: ellipsis;
3989 white-space: nowrap;
3990 color: var(--ink);
3991}
3992.post-audio-external .pae-platform {
3993 display: block;
3994 font-size: .78rem;
3995 opacity: .65;
3996 text-transform: capitalize;
3997}
3998.post-audio-external .pae-go {
3999 flex-shrink: 0;
4000 opacity: .5;
4001 font-size: 1.1rem;
4002}
4003
4004/* =========================================================================
4005 v9.0 — Video player (inline)
4006 ========================================================================= */
4007
4008.post-video-figure {
4009 margin: 1.25rem 0;
4010 max-width: 100%;
4011}
4012
4013.post-video {
4014 display: block;
4015 width: 100%;
4016 max-width: 100%;
4017 height: auto;
4018 border-radius: 10px;
4019 background: #000;
4020 box-shadow: 0 4px 20px rgba(0,0,0,.15);
4021}
4022
4023.post-video-caption {
4024 margin-top: .5rem;
4025 font-size: .88rem;
4026 color: var(--ink-muted, color-mix(in srgb, var(--ink) 60%, transparent));
4027 text-align: center;
4028 line-height: 1.5;
4029}
4030
4031.post-video-caption strong {
4032 display: inline;
4033 font-weight: 600;
4034 color: var(--ink);
4035}
4036
4037@media (max-width: 640px) {
4038 .post-video-figure { margin: .75rem -.5rem; }
4039 .post-video { border-radius: 6px; }
4040}
4041
4042/* v9.3 — Floating "Bewerken" knop voor album-blokken in de post-editor.
4043 Verschijnt bij hover over een .post-album binnen #visual en wordt via JS
4044 geplaatst op de rechterbovenhoek van het blok. Niet in de opgeslagen HTML. */
4045.pcms-album-edit-overlay {
4046 position: absolute;
4047 z-index: 1000;
4048 transform: translateX(-100%);
4049 display: inline-flex;
4050 align-items: center;
4051 gap: .35rem;
4052 padding: .35rem .7rem;
4053 background: var(--accent, #c2410c);
4054 color: #fff;
4055 border: none;
4056 border-radius: 6px;
4057 font-size: .82rem;
4058 font-weight: 600;
4059 cursor: pointer;
4060 box-shadow: 0 4px 12px rgba(0, 0, 0, .18);
4061 transition: transform .12s ease, box-shadow .12s ease;
4062}
4063.pcms-album-edit-overlay:hover {
4064 transform: translateX(-100%) translateY(-1px);
4065 box-shadow: 0 6px 16px rgba(0, 0, 0, .24);
4066}
4067.pcms-album-edit-overlay:active {
4068 transform: translateX(-100%) translateY(0);
4069 box-shadow: 0 2px 6px rgba(0, 0, 0, .18);
4070}
4071
4072/* v9.3 — Drag-and-drop in de album-builder selected-lijst */
4073.ab-selected-row { cursor: default; }
4074.ab-selected-row .ab-drag-handle {
4075 display: inline-flex;
4076 align-items: center;
4077 justify-content: center;
4078 width: 18px;
4079 height: 100%;
4080 color: color-mix(in srgb, currentColor 40%, transparent);
4081 cursor: grab;
4082 user-select: none;
4083 font-size: .9rem;
4084 letter-spacing: -2px;
4085 flex-shrink: 0;
4086}
4087.ab-selected-row:hover .ab-drag-handle {
4088 color: color-mix(in srgb, currentColor 70%, transparent);
4089}
4090.ab-selected-row.is-dragging {
4091 opacity: .35;
4092 cursor: grabbing;
4093}
4094.ab-selected-row.is-dragging .ab-drag-handle { cursor: grabbing; }
4095/* Drop-indicator lijnen boven/onder de target rij */
4096.ab-selected-row.is-drag-target-before {
4097 box-shadow: 0 -2px 0 0 var(--accent, #c2410c) inset, 0 2px 0 0 var(--accent, #c2410c);
4098 /* Gebruik outline voor cross-browser zichtbaarheid */
4099 position: relative;
4100}
4101.ab-selected-row.is-drag-target-before::before {
4102 content: "";
4103 position: absolute;
4104 top: -1px; left: 0; right: 0;
4105 height: 2px;
4106 background: var(--accent, #c2410c);
4107 pointer-events: none;
4108}
4109.ab-selected-row.is-drag-target-after::after {
4110 content: "";
4111 position: absolute;
4112 bottom: -1px; left: 0; right: 0;
4113 height: 2px;
4114 background: var(--accent, #c2410c);
4115 pointer-events: none;
4116}
4117.ab-selected-row.is-drag-target-after { position: relative; }
4118
4119/* v9.3 — Playlist fallback states (missing of empty playlist reference in post) */
4120.post-playlist-missing, .post-playlist-empty {
4121 padding: 1rem;
4122 margin: .75rem 0;
4123 background: color-mix(in srgb, var(--accent, #c2410c) 8%, transparent);
4124 border: 1px dashed color-mix(in srgb, var(--accent, #c2410c) 30%, transparent);
4125 border-radius: 8px;
4126 font-size: .9rem;
4127}
4128.post-playlist-missing em, .post-playlist-empty em {
4129 opacity: .8;
4130}
4131
4132/* v9.3 — Install-app footer-knop */
4133.site-footer-install {
4134 display: flex;
4135 justify-content: center;
4136 padding: 1rem 1rem 1.25rem;
4137 border-top: 1px solid color-mix(in srgb, currentColor 8%, transparent);
4138 margin-top: .5rem;
4139}
4140
4141/* v9.4 — Cooler install-knop: gradient + shimmer + perfect centering.
4142 Twee kleur-stops voor diepte, animated shimmer-streep om aandacht te trekken,
4143 icon perfect verticaal gecentreerd via flex (was: net iets te hoog tov tekst). */
4144.install-app-btn {
4145 position: relative;
4146 display: inline-flex;
4147 align-items: center;
4148 justify-content: center;
4149 gap: .55rem;
4150 padding: .8rem 1.6rem;
4151 background: linear-gradient(135deg,
4152 var(--accent, #c2410c),
4153 color-mix(in srgb, var(--accent, #c2410c) 80%, #000));
4154 color: #fff;
4155 border: none;
4156 border-radius: 999px;
4157 font: inherit;
4158 font-weight: 600;
4159 font-size: .95rem;
4160 line-height: 1;
4161 letter-spacing: .01em;
4162 cursor: pointer;
4163 overflow: hidden;
4164 isolation: isolate;
4165 box-shadow:
4166 0 1px 0 rgba(255,255,255,.15) inset,
4167 0 -2px 0 rgba(0,0,0,.1) inset,
4168 0 4px 14px color-mix(in srgb, var(--accent, #c2410c) 40%, transparent),
4169 0 1px 3px rgba(0,0,0,.18);
4170 transition:
4171 transform .15s cubic-bezier(.4, 0, .2, 1),
4172 box-shadow .2s ease,
4173 filter .15s ease;
4174}
4175.install-app-btn svg {
4176 flex-shrink: 0;
4177 /* subtle bounce-on-hover trigger, separate animation */
4178 transition: transform .25s cubic-bezier(.34, 1.56, .64, 1);
4179}
4180.install-app-btn span {
4181 line-height: 1;
4182}
4183
4184/* Shimmer-streep die langzaam over de knop loopt — "alive" effect */
4185.install-app-btn::before {
4186 content: "";
4187 position: absolute;
4188 top: 0;
4189 left: -100%;
4190 width: 60%;
4191 height: 100%;
4192 background: linear-gradient(110deg,
4193 transparent 30%,
4194 rgba(255,255,255,.25) 50%,
4195 transparent 70%);
4196 z-index: -1;
4197 animation: pcmsInstallShimmer 4s ease-in-out infinite;
4198 pointer-events: none;
4199}
4200@keyframes pcmsInstallShimmer {
4201 0%, 35% { left: -100%; }
4202 65%, 100% { left: 200%; }
4203}
4204
4205.install-app-btn:hover {
4206 transform: translateY(-2px) scale(1.02);
4207 filter: brightness(1.06);
4208 box-shadow:
4209 0 1px 0 rgba(255,255,255,.2) inset,
4210 0 -2px 0 rgba(0,0,0,.1) inset,
4211 0 8px 24px color-mix(in srgb, var(--accent, #c2410c) 55%, transparent),
4212 0 2px 6px rgba(0,0,0,.2);
4213}
4214.install-app-btn:hover svg {
4215 transform: translateY(-2px);
4216}
4217.install-app-btn:active {
4218 transform: translateY(0) scale(.98);
4219 transition-duration: .05s;
4220}
4221.install-app-btn:focus-visible {
4222 outline: 2px solid var(--accent, #c2410c);
4223 outline-offset: 3px;
4224}
4225
4226/* Reduced motion: shimmer uit, alleen statisch */
4227@media (prefers-reduced-motion: reduce) {
4228 .install-app-btn::before { animation: none; left: -100%; }
4229 .install-app-btn:hover { transform: none; }
4230 .install-app-btn:hover svg { transform: none; }
4231}
4232
4233/* Install-instructions modal */
4234.install-modal {
4235 position: fixed;
4236 inset: 0;
4237 z-index: 10000;
4238 display: flex;
4239 align-items: center;
4240 justify-content: center;
4241 padding: 1rem;
4242}
4243.install-modal-backdrop {
4244 position: absolute;
4245 inset: 0;
4246 background: rgba(0,0,0,.55);
4247 backdrop-filter: blur(3px);
4248}
4249.install-modal-panel {
4250 position: relative;
4251 z-index: 1;
4252 background: var(--paper);
4253 color: var(--ink);
4254 border: 1px solid var(--rule);
4255 border-radius: 14px;
4256 padding: 1.5rem;
4257 max-width: 440px;
4258 width: 100%;
4259 max-height: 90vh;
4260 overflow-y: auto;
4261 box-shadow: 0 20px 60px rgba(0,0,0,.4);
4262}
4263.install-modal-panel h3 { font-size: 1.15rem; color: var(--ink); }
4264.install-modal-panel h4 {
4265 margin: 1rem 0 .4rem;
4266 font-size: .92rem;
4267 letter-spacing: .03em;
4268 text-transform: uppercase;
4269 opacity: .7;
4270 color: var(--ink);
4271}
4272.install-modal-panel p { color: var(--ink); }
4273.install-steps {
4274 margin: 0;
4275 padding-left: 1.35rem;
4276 display: flex;
4277 flex-direction: column;
4278 gap: .45rem;
4279 font-size: .95rem;
4280 line-height: 1.45;
4281 color: var(--ink);
4282}
4283.install-steps li::marker { color: var(--accent); font-weight: 700; }
4284.install-apk-block {
4285 margin-top: 1.25rem;
4286 padding-top: 1rem;
4287 border-top: 1px dashed var(--rule);
4288}
4289.install-apk-link {
4290 display: inline-flex;
4291 align-items: center;
4292 margin-top: .4rem;
4293 padding: .6rem 1rem;
4294 background: var(--accent);
4295 color: #fff;
4296 border-radius: 8px;
4297 text-decoration: none;
4298 font-weight: 600;
4299}
4300.install-apk-link:hover { filter: brightness(1.08); }
4301.install-modal-actions {
4302 display: flex;
4303 justify-content: flex-end;
4304 margin-top: 1.25rem;
4305}
4306.install-modal-actions .btn {
4307 padding: .5rem 1rem;
4308 background: var(--paper-2);
4309 border: 1px solid var(--rule);
4310 border-radius: 8px;
4311 color: var(--ink);
4312 cursor: pointer;
4313 font: inherit;
4314 font-weight: 500;
4315}
4316.install-modal-actions .btn:hover {
4317 background: color-mix(in srgb, var(--accent) 10%, var(--paper-2));
4318 border-color: var(--accent);
4319 color: var(--accent);
4320}
4321
4322@media (max-width: 520px) {
4323 .install-modal-panel { padding: 1.2rem; }
4324 .install-app-btn { width: 100%; justify-content: center; }
4325}
4326
4327/* v9.3 — Install-modal: choice-blocks met voor/nadelen */
4328.install-choice {
4329 margin-top: 1.25rem;
4330 padding: 1rem;
4331 border: 1px solid color-mix(in srgb, currentColor 15%, transparent);
4332 border-radius: 10px;
4333 background: color-mix(in srgb, currentColor 3%, transparent);
4334}
4335.install-choice + .install-choice { margin-top: 1rem; }
4336.install-choice h4 {
4337 margin: 0 0 .75rem;
4338 font-size: 1rem;
4339 letter-spacing: 0;
4340 text-transform: none;
4341 opacity: 1;
4342}
4343.install-pros-cons {
4344 display: flex;
4345 gap: 1rem;
4346 margin: .5rem 0 1rem;
4347}
4348.install-pros,
4349.install-cons {
4350 flex: 1;
4351 min-width: 0;
4352 font-size: .85rem;
4353 line-height: 1.45;
4354}
4355.install-pros strong,
4356.install-cons strong {
4357 display: block;
4358 margin-bottom: .35rem;
4359 font-size: .82rem;
4360 letter-spacing: .02em;
4361}
4362.install-pros strong { color: #16a34a; }
4363.install-cons strong { color: #dc2626; }
4364.install-pros ul,
4365.install-cons ul {
4366 margin: 0;
4367 padding-left: 1.1rem;
4368 display: flex;
4369 flex-direction: column;
4370 gap: .25rem;
4371}
4372.install-pros li::marker { color: #16a34a; }
4373.install-cons li::marker { color: #dc2626; }
4374
4375.install-choice-cta {
4376 display: inline-flex;
4377 align-items: center;
4378 justify-content: center;
4379 gap: .35rem;
4380 margin-top: .5rem;
4381 padding: .7rem 1.1rem;
4382 background: var(--accent, #c2410c);
4383 color: #fff;
4384 border: none;
4385 border-radius: 8px;
4386 text-decoration: none;
4387 font: inherit;
4388 font-weight: 600;
4389 font-size: .95rem;
4390 cursor: pointer;
4391 transition: filter .12s ease;
4392}
4393.install-choice-cta:hover { filter: brightness(1.08); }
4394.install-choice-note {
4395 margin: .5rem 0 0;
4396 padding: .6rem .8rem;
4397 background: color-mix(in srgb, currentColor 4%, transparent);
4398 border-left: 3px solid var(--accent, #c2410c);
4399 border-radius: 4px;
4400 font-size: .9rem;
4401 line-height: 1.45;
4402}
4403
4404@media (max-width: 520px) {
4405 .install-pros-cons { flex-direction: column; gap: .75rem; }
4406}
4407
4408/* v9.4 — Soft fade-overgang tussen posts bij navigatie.
4409 Fade-out is rustig (450ms): oude content vervaagt geleidelijk terwijl
4410 de scroll-naar-top loopt. Fade-in is snel (180ms) met een lichte blur-
4411 onscherp → scherp animatie zodat de nieuwe content niet abrupt verschijnt. */
4412#pcms-main {
4413 transition: opacity .45s ease-out;
4414}
4415#pcms-main.is-pcms-transitioning-out {
4416 opacity: 0;
4417}
4418#pcms-main.is-pcms-transitioning-in {
4419 opacity: 0;
4420 filter: blur(6px);
4421 animation: pcmsFadeIn .18s ease-out forwards;
4422 will-change: opacity, filter;
4423}
4424@keyframes pcmsFadeIn {
4425 from { opacity: 0; filter: blur(6px); }
4426 to { opacity: 1; filter: blur(0); }
4427}
4428
4429/* Respecteer reduced-motion voorkeur (iOS/Android accessibility setting) */
4430@media (prefers-reduced-motion: reduce) {
4431 #pcms-main {
4432 transition: opacity .15s ease-out;
4433 }
4434 #pcms-main.is-pcms-transitioning-in {
4435 filter: none;
4436 animation: none;
4437 opacity: 1;
4438 }
4439}
4440
4441/* === Fediverse interactions — inherits the native .comment styling === */
4442.post-fediverse .fedi-stats { display: flex; gap: .55rem; margin: .25rem 0 1.25rem; }
4443.post-fediverse .fedi-stats span {
4444 display: inline-flex; align-items: center; gap: .35rem;
4445 padding: .2rem .65rem; border-radius: 999px; font-size: .82rem;
4446 color: var(--ink-soft, #888);
4447 background: color-mix(in srgb, currentColor 12%, transparent);
4448}
4449.post-fediverse .fedi-handle { color: var(--ink-soft, #888); font-size: .82rem; }
4450.post-fediverse .comment-content p { margin: .2rem 0; }
4451.post-fediverse .comment-content p:first-child { margin-top: 0; }
4452.post-fediverse .comment-content p:last-child { margin-bottom: 0; }
4453/* reply toggle: a plain "Reageer" action like the comment buttons (no triangle) */
4454.post-fediverse .fedi-reply-toggle { list-style: none; cursor: pointer; display: inline-block; }
4455.post-fediverse .fedi-reply-toggle::-webkit-details-marker { display: none; }
4456.post-fediverse details[open] .fedi-reply-toggle { margin-bottom: .5rem; }
4457
4458/* Reply-via-fediverse CTA on post pages */
4459.post-fediverse-cta { margin: 1.75rem 0; }
4460.fedi-remote-reply-btn { display: inline-flex; align-items: center; gap: .45rem; }
4461.post-fediverse-cta .fedi-remote-reply-btn {
4462 border: 1px solid color-mix(in srgb, var(--accent, #888) 55%, transparent);
4463 background: color-mix(in srgb, var(--accent, #888) 10%, transparent);
4464 color: var(--ink, inherit); border-radius: 999px; padding: .5rem 1.05rem;
4465 font-weight: 600; cursor: pointer; transition: background .15s ease;
4466}
4467.post-fediverse-cta .fedi-remote-reply-btn:hover { background: color-mix(in srgb, var(--accent, #888) 22%, transparent); }
4468.post-fediverse-cta .fedi-remote-reply-btn svg { color: var(--accent, currentColor); }
4469.post-fediverse .comment-actions .fedi-remote-reply-btn { gap: .3rem; }
4470
4471/* Inline "reply via fediverse" address form (replaces the browser prompt) */
4472.fedi-remote-form {
4473 position: absolute; z-index: 60; display: inline-flex; align-items: center; gap: .4rem;
4474 padding: .4rem; border-radius: 999px;
4475 background: var(--paper-2, var(--paper, #fff));
4476 border: 1px solid color-mix(in srgb, var(--ink, #000) 12%, transparent);
4477 box-shadow: 0 10px 30px rgba(0,0,0,.28);
4478}
4479.fedi-remote-form input {
4480 height: 2.2rem; padding: 0 .9rem; border-radius: 999px; font: inherit; min-width: 230px;
4481 border: 1px solid color-mix(in srgb, var(--ink, #000) 18%, transparent);
4482 background: color-mix(in srgb, var(--ink, #000) 4%, transparent); color: var(--ink, #000);
4483}
4484.fedi-remote-form input::placeholder { color: var(--ink-soft, #999); }
4485.fedi-remote-form input:focus { outline: none; border-color: color-mix(in srgb, var(--accent, #888) 70%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #888) 22%, transparent); }
4486.fedi-remote-form .fedi-remote-go {
4487 height: 2.2rem; min-width: 2.2rem; padding: 0 .85rem; border-radius: 999px;
4488 display: inline-flex; align-items: center; justify-content: center; font-size: 1rem;
4489}
4490.fedi-remote-form .fedi-remote-cancel { background: none; border: none; color: var(--ink-soft, #888); cursor: pointer; font-size: 1.1rem; line-height: 1; padding: .25rem .35rem; }
4491.fedi-remote-form .fedi-remote-cancel:hover { color: var(--ink, #000); }
Note: See TracBrowser for help on using the repository browser.