Design tokens & asset-strategie¶
Doel & context¶
Dit document legt de visuele grondslag van de huidige site vast (kleuren, typografie, grid, afbeeldingsformaten) als token-referentie voor de Next.js-rebuild, plus de strategie om pixelgetrouwheid te halen door hergebruik van de bestaande main.css. Bron: theme-code (Sage 9) en de gerenderde output van de live templates. Peildatum: 2026-08-06.
Alleen de main-bundle telt
Het thema bevat drie template-sets (main / katen / v2), maar alle live pagina's laden uitsluitend dist/styles/main.css + dist/scripts/main.js, met daarin een "v2-header-bridge" voor de header/navigatie. De katen- en v2-bundels (v2.css/v2.js) zijn aan geen enkele gepubliceerde pagina gekoppeld — dood gewicht, niet nabouwen. De main-bundle is gebaseerd op Bootstrap 5 (npm-alias bootstrap5), niet Bootstrap 4 zoals verouderde projectdocumentatie zegt.
Kleuren¶
Basispalet (common/_colors.scss)¶
| Token | Waarde | Gebruik |
|---|---|---|
$blue / $primary |
#0080be |
primaire accentkleur (basis) |
$blue-dark / $secondary / $body-color |
#293e51 |
bodytekst, headings-basis |
$red |
#99465f |
accent/fout |
$green-light |
#d4edda |
succes |
$grey-light |
#ebebeb |
randen, topbar-achtergrond, lijnen |
$grey |
#ccc |
secundair grijs |
$grey-dark |
#555 |
topbar-tekst (GB/WV) |
$white |
#fff |
achtergronden |
Subsite-kleuren¶
De hele theming hangt aan één body-klasse theme-gb / theme-wv / theme-tr / theme-cgc (bepaald door URL-prefix, override via ?t=KEY). Per subsite:
| Subsite | primary | secondary | gradient light / mid / dark (header-pill, accenten) |
|---|---|---|---|
| GB | #277695 |
#293e51 |
#4bb3dc / #0064a7 / #0e588a |
| WV | #2c3d50 |
#336699 |
#4a6a8a / #2c3d50 / #1a2530 |
| TR | #29917b |
#063418 |
#3db89e / #29917b / #1a5f50 |
| CGC | #a78550 |
#514027 |
#c9a76a / #a78550 / #7a6139 |
Aanvullende thememap-waarden (per subsite, uit $themes in _colors.scss):
| Onderdeel | GB | WV | TR | CGC |
|---|---|---|---|---|
| Topbar tekst | #555 |
#555 |
#ebebeb |
#ebebeb |
| Topbar achtergrond | #ebebeb |
#ebebeb |
lighten(#063418, 5%) |
#a78550 |
| Header tekstkleur | #277695 |
#2c3d50 |
#29917b |
#514027 |
| Headings-kleur | #277695 |
#336699 |
#063418 |
#514027 |
| Logo-hoogte desktop (bridge) | 40px (logo-v2: 107px) | 29px | 24px (header-personal: 80px) | 40px (header-personal: 80px) |
De thememap wordt via tools/_theme.scss toegepast op ±50 component-mixins (typografie, topbar, header, footer, buttons, previews, paywall, paginering, formulieren): elke component heeft per subsite een kleurvariant.
CSS custom properties (v2-bridge)¶
Op :root/.theme-*: --v2-gradient-light, --v2-gradient-mid, --v2-gradient-dark, --v2-accent (= gradient-mid), --v2-primary-rgb. Gradientformule: linear-gradient(to right, var(--v2-gradient-light) 0%, var(--v2-gradient-dark) 100%) — o.a. de actieve menu-pill in de navigatie.
Typografie¶
| Token | Waarde |
|---|---|
| Body-font | "Inter", sans-serif (gewichten 300/400/600) |
| Headings- én topbar-font | "Ubuntu", sans-serif (gewichten 400/500/700) |
| Basis | 1rem = 16px, line-height 1.5 |
$font-size-lg / $font-size-sm |
1.25rem / 0.875rem |
| Gewicht-tokens | light 300, normal 400, bold 500, bolder 600 |
| h1–h6 | 2.5 / 2 / 1.75 / 1.5 / 1.25 / 1 rem; line-height 1.2; gewicht 400; margin-bottom 1rem; kleur per subsite |
Fonts worden geladen via Google Fonts <link> (Inter:wght@300;400;600 + Ubuntu:wght@400;500;700, display=swap, preconnect naar fonts.gstatic.com). Geen self-hosted fonts. Voor de rebuild: zelf hosten via next/font mag, mits dezelfde gewichten/fallbacks.
Roboto/Poppins worden nooit geladen
De v2-header-bridge declareert font-family: "Roboto" (navbar/dropdowns) en "Poppins" (canvas-menu-CTA's), maar geen van beide fonts wordt geladen — het gerenderde navigatiefont is dus de systeem-sans-serif. Pixelgetrouw nabouwen = het huidige fallback-gedrag overnemen, niet alsnog Roboto/Poppins laden.
Eén échte @font-face in main.css: Simple Line Icons (iconfont voor icon-magnifier, icon-user, icon-arrow-down; \e604 als dropdown-pijl). Daarnaast Font Awesome 5 als SVG-JS (o.a. fab fa-linkedin-in) en losse inline SVG's in de templates.
Breakpoints & grid¶
Afwijkend van de Bootstrap-defaults (common/_variables.scss):
| Breakpoint | xs | sm | md | lg | xl | xxl | xxxl |
|---|---|---|---|---|---|---|---|
| Min-breedte | 0 | 576 | 768 | 992 | 1200 | 1460 | 1600 |
| Container-max | — | 560 | 720 | 926 | 1152 | 1395 | 1535 |
- 12 kolommen, gutter 32px.
- Header gebruikt
.container-xlmet explicietemax-width: 1152pxen 16px zijpadding, uitgelijnd met de.containervan de pagina. - Header-gedrag per breakpoint: <768px compact (logo + zoekknop + hamburger); 768–991px header-top met hamburger, geen menubalk, geen topbar; ≥992px topbar + menubalk zichtbaar, hamburger weg. Sticky nav (kloon met 65px-logo) verschijnt na 300px scroll.
body { min-width: 320px; touch-action: pan-x pan-y; }(zoom uitgeschakeld i.v.m. de PDF-lezer).
Overige tokens¶
| Token | Waarde |
|---|---|
| Transitie standaard / snel | all .3s ease-in-out / .2s |
| Schaduw dropdowns | 0 8px 20px rgba(32,54,86,.2) |
| Schaduw klein | 0 2px 4px rgba(0,0,0,.15) |
| Borderkleur | #ebebeb |
| Menu-item (desktop) | 15px, kleur #79889e, hover #203656; actief: witte tekst op pill (border-radius 25px) met subsite-gradient |
Afbeeldingsformaten (image sizes)¶
| Naam | Afmetingen | Crop | Gebruik |
|---|---|---|---|
theme-25:18-l |
750×540 | ja | grote artikel-/nieuwspreviews, artikelheader |
theme-25:18-s |
450×325 | ja | kleinere previews, themakaarten |
theme-25:18-t |
180×136 | ja | thumbnails |
theme-newsletter |
560×260 | ja | nieuwsbrief-e-mail |
cover |
300×∞ | nee | product-/boekcovers |
issue-cover |
328×464 | ja | uitgave-covers ("laatste uitgave"-blok) |
og-image |
1200×630 | ja | social sharing |
thumbnail (WP) |
150×150 | ja | o.a. auteursfoto's in artikelmeta |
Géén srcset, géén lazy loading in de huidige output
Vrijwel alle afbeeldingen renderen via een kale <img> in partials/image.blade.php — gemeten: 0× srcset, 0× loading="lazy". Pixelgetrouw = exacte crops uit bovenstaande tabel (25:18-verhouding voor previews, 328×464 covers). Functioneel verbeteren met next/image (srcset/lazy) is toegestaan mits de zichtbare crop en beeldmaat gelijk blijven; de bron-crops zijn deze WP-maten (beschikbaar via media_details.sizes in REST).
Uploads worden door nginx naar Azure Blob geproxied; …/uploads/issues/ is cookie-beschermd (403) — uitgave-PDF's uitsluitend via gb-app/v1/issues/{id}/pdf.
Iconen, logo's, favicons¶
- Logo's: GB = inline SVG (header-variant "logo-v2", kleuren
#0064a7/#00b1eb); WV/TR/CGC = PNG's (logo-wv.png,logo-tr.png,logo-cgc.png; SVG-varianten aanwezig indist/images/). Elke subsite heeft daarnaast een klein inline SVG-icoon (topbar-subswitch, subsites-menu, footer). - Favicons: één volledige set met GB-branding voor álle subsites (
dist/images/favicon/; mask-kleur#2a80b9,theme-color #ffffff). Er is géén per-subsite-favicon — beslispunt voor de rebuild, huidige situatie is: overal GB-icoon. - Vier icon-systemen naast elkaar (inline SVG, FA5 SVG-JS, Simple Line Icons-font, PNG/SVG-sprite voor het Digibron-blok). Bij de rebuild consolideren mag; de zichtbare glyphs moeten gelijk blijven.
Hergebruik main.css: strategie voor pixelgetrouwheid¶
De gecompileerde dist/styles/main.css (≈1,5 MB) bevat alle live styling, inclusief de per-subsite-theming en de v2-header-bridge. Strategie voor de rebuild, in volgorde van voorkeur:
- Fase 1 — bundel 1-op-1 meenemen. Neem
main.cssongewijzigd op in de Next.js-app en behoud de bestaande BEM-klassen (c-/o--prefix) en de body-klassetheme-{gb|wv|tr|cgc}in de gerenderde markup. Dit garandeert pixelgetrouwheid zonder herimplementatie: identieke klassen + identieke CSS = identieke weergave. Voorwaarden:- dezelfde markupstructuur per component (zie de template-documentatie:
c-article-preview-big,c-latest-issue,c-pay-wall,c-pagination, enz.); - Google Fonts-link (of
next/font-equivalent met dezelfde gewichten); - Simple Line Icons-font en FA-assets uit
dist/vendor/meeverhuizen; - jQuery-gedrag (canvas-menu, zoek-overlay, sticky nav, FlexSlider-galerij) herbouwen in React — de CSS-klassen (
open,visible,down) blijven het contract.
- dezelfde markupstructuur per component (zie de template-documentatie:
- Fase 2 — SCSS-bron overnemen (optioneel, na livegang). De SCSS-bron (
common/,components/,tools/_theme.scss, v2-bridge) in de Next.js-build compileren zodat ongebruikte katen/v2-restanten en dode selectors (legacy sidenav,header--fixed) gesaneerd kunnen worden. Alleen doen met visuele regressietests (Playwright-screenshots) als vangnet. - Niet doen: de tokens handmatig overtikken in een nieuw designsystem als primaire route — dat maakt pixelgetrouwheid onbewijsbaar. Bovenstaande token-tabellen zijn de referentie voor toekomstig onderhoud, niet de bouwinstructie voor fase 1.
Acceptatiecriteria¶
Visueel testbaar met Playwright (screenshots + computed styles) op de nieuwe site vs. de huidige.
- Als bezoeker op
/heeft<body>de klassetheme-gb; op/de-waarheidsvriend/theme-wv; op/theologia-reformata/theme-tr; op/cornelis-graafland-centrum/theme-cgc. - Als bezoeker op een WV-pagina is de computed headings-kleur
#336699en de topbar-achtergrond#ebebeb; op TR is de topbar-achtergrond de verlichte variant van#063418met tekst#ebebeb; op CGC is de topbar#a78550. - Als bezoeker op elke subsite-home heeft het actieve menu-item een pill (border-radius 25px) met de gradient
linear-gradient(to right, <gradient-light>, <gradient-dark>)van die subsite. - Als bezoeker is de bodytekst gerenderd in Inter (400) en zijn h1–h6 gerenderd in Ubuntu met de maten 2.5/2/1.75/1.5/1.25/1 rem.
- Als bezoeker met viewport 767px toont de header logo + zoekknop + hamburger, geen menubalk en geen topbar; met viewport 992px zijn topbar én menubalk zichtbaar en is de hamburger weg.
- Als bezoeker die 301px of meer scrolt verschijnt de sticky nav-kloon (body-klasse
down); erboven niet. - Als bezoeker op een pagina met content-container is de container-max-breedte bij viewport ≥1200px 1152px en de guttermaat 32px.
- Als bezoeker op de homepage heeft de uitgave-cover in "Lees de laatste uitgave" de weergavemaat 328×464 (crop
issue-cover). - Als bezoeker op een artikeloverzicht hebben preview-beelden de verhouding 25:18 (bron-crops 750×540 of 450×325).
- Als bezoeker op elke subsite-pagina is het favicon de GB-set (zelfde bestanden op alle subsites, conform huidige situatie).
- Als bezoeker rendert de navigatiebalk in de systeem-sans-serif (geen Roboto/Poppins geladen) — gelijk aan de huidige site.
- Als bezoeker op een pagina met fotogalerij werkt de slider met dezelfde slides als de huidige FlexSlider-galerij.
Bekende afwijkingen¶
Niet nabouwen in Next.js — wel vermelden in het testrapport
- Roboto/Poppins-declaraties zonder geladen font in de v2-header-bridge (valt terug op systeemfont). In de rebuild: bewust één fontkeuze vastleggen; het per ongeluk declareren van niet-geladen fonts niet overnemen.
- GB-logo-v2 bevat een live
<text>-element met font 'Depot New' dat nergens geladen wordt (rendert in fallbackfont) — logo-SVG bij rebuild platslaan naar outlines. - Footer-socialblok: het ACF-veld "instagram" rendert feitelijk een LinkedIn-icoon (elseif-keten-bug).
- Placeholder-links (
href="#") in de v2-account-dropdown en canvas-menu-CTA's ("Word lid", "Doneer nu"); de werkende accountlinks staan alleen in de desktop-topbar. In de rebuild krijgen deze CTA's echte bestemmingen. - Dode JS-sporen (legacy sidenav/
header--fixed-code in main.js) en ongebruikte katen/v2-bundels — niet meenemen. - Geen srcset/lazy loading — mag in de rebuild verbeterd worden (zie hierboven), maar het testrapport moet vermelden dat de huidige site dit mist.