source: Klonkt/src/assets/css/style.css@ 0251bae

main
Last change on this file since 0251bae was 0251bae, checked in by roboburr <roboburr@…>, 3 months ago

feat(themes): more colour variety — fewer greens/blues in accents + palettes

Accents: 12 redistributed across the colour wheel (red/orange/amber/gold/green/
teal/blue/indigo/violet/magenta/pink/brown) — green+blue reduced from 6 to 4.
Palettes: 'slate' (2nd blue) -> warm Gold, 'mint' (2nd green) -> warm Terracotta;
keys unchanged so existing sites don't break. style.css blocks + buster v30.

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

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