Files
atomic-design-poc/libs/shared/styles.scss
T
ehoandClaude Sonnet 5 e7156c5132 feat(WP-67): merge behandelportal into this repo as a monorepo
Restructures into apps/ssp + apps/behandelportal (two Angular projects)
plus libs/shared + libs/beheer (cross-app libraries), replacing WP-61's
separate sibling repo. That split had already produced real drift: a
hand-vendored copy of the backend's OpenAPI doc, a shared/ui+layout tree
forked and silently diverging (7 files), and beheer + the styles.scss
token bridge duplicated byte-for-byte across both repos.

- git mv the SSP's src/app/* into apps/ssp/; fold shared/, beheer/,
  environments/, the Storybook docs/*.mdx, and styles.scss into
  libs/shared + libs/beheer (all confirmed identical between the two
  repos before merging). auth stays deliberately duplicated per
  ADR-0002 (actor-specific, expected to diverge) - amended there.
- One generated API client (libs/shared), no more vendored swagger.json.
- .dependency-cruiser split into a base factory + one config per app,
  and Storybook into .storybook-ssp/.storybook-behandelportal - both
  forced by the @auth/* alias resolving to different directories per app.
- SiteHeaderComponent/ShellComponent gained HEADER_NAV_ITEMS/
  HEADER_ADMIN_LINKS/DEBUG_PANEL injection tokens so each app supplies
  its own nav/admin-links/dev-panel instead of one being hardcoded.
- CLAUDE.md, ARCHITECTURE.md, dependencies.md, and ADR-0002 updated;
  WP-67 backlog entry documents the full decision trail.

npm run ci green (lint, dep:check x2, 360 tests across ssp/
behandelportal/shared/beheer, both localized builds, backend tests,
snippet + api-client drift); both dev servers, both Storybook
instances, and docker compose verified working.

The old sibling repo (/home/eho/repos/behandelportal) is left
untouched, not deleted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-02 21:01:57 +02:00

195 lines
6.7 KiB
SCSS

/* CIBG Huisstijl (a customized Bootstrap 5.2 build) is loaded as a plain <link> in
index.html (public/cibg-huisstijl/css/huisstijl.min.css) so its relative url(../fonts|
icons|images) references resolve at runtime.
Token bridge: the app's components reference a semantic `--rhc-*` token vocabulary
(316 refs, 54 tokens). Rather than rewrite every reference, we redefine those tokens
HERE onto CIBG/Bootstrap values (--bs-* where one exists, CIBG palette hex otherwise).
The names are now an internal alias set; the VALUES are CIBG. (styles.scss is exempt
from check:tokens, so palette hex is allowed in this one file.) */
:root {
/* — CIBG layout chrome colour (robijn under body.brand--cibg; blue fallback otherwise) — */
--rhc-color-layout: var(--ro-layout);
/* — semantic foreground/background/border — */
--rhc-color-foreground-default: var(--bs-body-color);
--rhc-color-foreground-subtle: #64748b; /* CIBG grey-3 */
--rhc-color-foreground-link: var(--ro-link-color); /* brand--cibg → hemelblauw-fixed */
--rhc-color-foreground-link-hover: var(--ro-link-active-color);
--rhc-color-foreground-on-primary: #fff;
--rhc-color-border-default: var(--bs-border-color);
--rhc-color-border-subtle: #e2e8f0;
--rhc-color-border-strong: #adb5bd;
--rhc-color-wit: #fff;
/* — greys — */
--rhc-color-cool-grey-100: #f8fafc;
--rhc-color-cool-grey-200: #f1f5f9;
--rhc-color-cool-grey-300: #e2e8f0;
--rhc-color-grijs-100: #f1f5f9;
--rhc-color-grijs-200: #e2e8f0;
--rhc-color-grijs-300: #cbd5e1;
--rhc-color-grijs-400: #94a3b8;
--rhc-color-grijs-700: #334155;
/* — blues (CIBG primary family) — */
--rhc-color-lintblauw-100: #e6eef3;
--rhc-color-lintblauw-500: var(--ro-brand-primary); /* #01689b */
--rhc-color-lintblauw-600: var(--ro-brand-primary-focus); /* #015782 */
--rhc-color-lintblauw-700: var(--ro-lintblauw); /* #154273 */
--rhc-color-hemelblauw-100: #d9ebf7; /* CIBG light-blue (info bg) */
--rhc-color-hemelblauw-500: var(--ro-hemelblauw); /* #007bc7 CIBG info blue */
--rhc-color-hemelblauw-700: #005a94;
/* — status colors (CIBG semantic, kleuren page) — */
--rhc-color-groen-300: #e1eddb; /* light-green */
--rhc-color-groen-500: #39870c; /* green */
--rhc-color-groen-700: #176e1b;
--rhc-color-rood-100: #f7d2dd; /* light-red */
--rhc-color-rood-300: #eda3b6;
--rhc-color-rood-500: var(--ro-brand-danger); /* #cc003d CIBG red */
--rhc-color-rood-600: #b30035;
--rhc-color-geel-100: #fff4dc; /* light-yellow */
--rhc-color-geel-600: #ffb612; /* yellow */
--rhc-color-oranje-500: #e17000;
/* — spacing scale (rem, Bootstrap-aligned) — */
--rhc-space-max-xs: 0.25rem;
--rhc-space-max-sm: 0.5rem;
--rhc-space-max-md: 1rem;
--rhc-space-max-lg: 1.5rem;
--rhc-space-max-xl: 2rem;
--rhc-space-max-2xl: 3rem;
--rhc-space-max-3xl: 4rem;
--rhc-space-max-4xl: 5rem;
--rhc-space-max-5xl: 6rem;
/* — border — */
--rhc-border-radius-sm: var(--bs-border-radius-sm);
--rhc-border-radius-md: var(--bs-border-radius);
--rhc-border-radius-round: 50%;
--rhc-border-width-sm: 1px;
--rhc-border-width-md: 2px;
--rhc-border-width-lg: 3px;
/* — typography — */
--rhc-text-font-size-sm: 0.875rem;
--rhc-text-font-size-lg: 1.25rem;
--rhc-text-font-weight-regular: 400;
--rhc-text-font-weight-semi-bold: 600;
--rhc-text-font-weight-bold: 700;
--rhc-text-line-height-sm: 1.4;
/* System-font stack (licensed Rijksoverheid fonts intentionally not bundled — POC). */
--bs-font-sans-serif:
system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
html,
body {
margin: 0;
min-height: 100%;
}
/* Pages sit on white; cards/panels carry the subtle grey. */
body {
background: var(--rhc-color-wit);
color: var(--rhc-color-foreground-default);
}
/* App theme layer: a few app-specific measures RHC has no token for (content/form
widths), defined ONCE here and mapped onto RHC where possible. Components reference
these tokens instead of raw values. */
:root {
--app-content-max: 67rem; /* readable page column */
--app-form-narrow: 32rem; /* page-shell narrow variant */
--app-skip-link-offset: -999px; /* off-screen skip link */
/* Dev-only state inspector (debug-state.component.ts, isDevMode-gated, never in
prod): a dark code-editor palette kept deliberately OFF the CIBG design system
so it reads as a tool, not product chrome. Defined here (the one exempt file)
so the component itself stays colour-token-only. */
--app-devpanel-bg: #1e1e1e;
--app-devpanel-fg: #d4d4d4;
--app-devpanel-accent: #9cdcfe;
--app-devpanel-border: #444;
--app-devpanel-shadow: rgb(0 0 0 / 0.4);
}
/* App utility classes: centralise the repeated inline layout idioms so components stay
token-based and free of raw values. */
/* vertical rhythm between stacked blocks */
.app-stack > * + * {
margin-block-start: var(--rhc-space-max-xl);
}
.app-section {
margin-block-start: var(--rhc-space-max-2xl);
}
.app-text-subtle {
color: var(--rhc-color-foreground-subtle);
}
/* Route transitions (withViewTransitions): cross-fade the routed CONTENT only.
The chrome gets its own stable view-transition-name so it's lifted out of the
`root` snapshot and stays put while the content fades. */
app-site-header {
view-transition-name: site-header;
}
app-site-footer {
view-transition-name: site-footer;
}
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 180ms;
animation-timing-function: ease;
}
/* List-item enter/leave for lists that add/remove at runtime (aanvraag cards, upload
rows). Used via Angular's native `animate.enter`/`animate.leave` — no @angular/animations. */
@keyframes app-item-enter {
from {
opacity: 0;
transform: translateY(-0.5rem);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes app-item-leave {
from {
opacity: 1;
max-block-size: 50rem;
}
to {
opacity: 0;
transform: translateY(-0.25rem);
max-block-size: 0;
margin-block: 0;
padding-block: 0;
}
}
.app-item-enter {
animation: app-item-enter 220ms ease both;
}
.app-item-leave {
display: block; /* collapse needs block formatting (host is inline/flex by default) */
overflow: hidden;
pointer-events: none;
/* ponytail: 50rem max-height hack; if an item is taller the collapse eases slightly late — measure height in JS then. */
animation: app-item-leave 260ms ease both;
}
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
animation: none !important;
}
/* No animation → Angular removes the leaving node immediately (instant, no motion). */
.app-item-enter,
.app-item-leave {
animation: none;
}
}