source: Klonkt/src/assets/css/style.css@ 41a7637

main
Last change on this file since 41a7637 was 7f46112b, checked in by Robin Genis <roboburr@…>, 3 months ago

feat(activitypub): per-comment reply-via-fediverse + clearer button

Visitors can now reply to a specific fediverse comment from their own server
(bounces authorize_interaction at the comment AP id). Replaced the unclear
elephant emoji with a reply-arrow icon and gave the post button a clean accent
pill style.

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

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