Skip to content

Release: merge development into beta - #366

Merged
rubenvdlinde merged 4 commits into
betafrom
development
Aug 20, 2026
Merged

Release: merge development into beta#366
rubenvdlinde merged 4 commits into
betafrom
development

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

Conduction Release Bot and others added 4 commits August 20, 2026 14:07
The demo portal has to be pixel-comparable with opencatalogi.nl, so it needed
that site's tokens rather than a set that merely looks like them.

WHAT IS IN IT

  A. 94 --opencatalogi-* palette tokens, transcribed
  B. 922 component tokens, CAPTURED from the running site
  C. 591 role-layer tokens filling what B leaves out
  D. 67 --nldesign-* semantic tokens
  E. 15 card tokens nothing else defines

Section B is the one that mattered. The first attempt took only the
--opencatalogi-* palette and let the shared role layer supply components — and
the portal rendered VNG BLUE with a VNG logo, because the reference also ships
999 --utrecht-* and 275 --tilburg-* overrides that I had not looked at. Without
them my ramp guesses drove the chrome: hero #003865, search button #004488
where the reference is magenta #c93675.

The values are TRANSCRIBED, not aliased to `rotterdam`. The gray, green,
magenta and blue ramps are byte-identical to RODS today and the font stack is
literally RODS' — OpenCatalogi's system is RODS-derived. Writing that as
`var(--rods-…)` would turn a fact about today into a dependency and move this
set the day RODS moves, with nobody deciding that it should.

GENERATOR

`upstream` is now optional: a brand can declare an inline `palette` plus a
captured `componentsFile`, which is what a design system with no npm package
needs. Same composition, same precedence, same coverage report.

`keepLiterals` names the role-layer colours a brand deliberately does NOT
re-brand, so the "unmapped literal" warning keeps meaning something. Ten
permanent entries in a warning is a warning nobody reads, and the eleventh is
the one that matters.

`upstreamOverrides` now also applies to section C, and reports as stale only
after C is assembled. The logo tokens live in the role layer, so an override of
one previously "matched nothing" while the wrong logo still shipped.

FOUR DELIBERATE OVERRIDES, each with its reason printed on every run:

- --tilburg-typography-font-family-primary was captured verbatim as
  `TradeGothicCondensed18` with NO fallback — a licensed face this app does not
  serve. Faithfully reproducing it made every heading fall back to the
  browser's default SERIF, which is worse than the reference rather than equal
  to it. Now it names the face first and degrades to the brand's own sans.
- Three --conduction-logo-*-background-image tokens: the role layer bakes a VNG
  mark into them, and the capture skips data URIs (one is ~1MB of base64), so an
  OpenCatalogi portal wore the VNG logo in its header AND its footer.

The logo itself is the project's own vector mark from ConductionNL/opencatalogi;
the site header uses a raster mark that is not distributed as SVG, so this is
the OpenCatalogi logo rather than that exact image.
… scoped deeper

Every rem on the page was 25% too small: heading-3 rendered 24px against the
reference's 32px, `utrecht-paragraph--small` 9px against 12px. The tokens were
right — `2rem` and `0.75rem`, exactly as captured. The ROOT was wrong.

`--tilburg-erm-font-size` is undefined at `html` on opencatalogi.nl and 12px
only inside `.ac-app-container`. The rule that reads it targets `body, html`,
so on the reference it finds NOTHING and the root stays 16px. The capture read
from the container — which is where almost every --utrecht-* is declared, and
why it reads from there — and wrote 12px to `:root`, where that rule promptly
found it.

So a token the site scopes deeper ON PURPOSE became a root value, and the
failure landed nowhere near its cause: nothing about a 24px heading points at a
font-size on `html`, and every token in the chain reads correctly.

Corrected as an upstreamOverride with the mechanism spelled out, and the
components file now carries the hazard at the top so the next re-capture checks
anything consumed at `html` or `body` scope rather than rediscovering this.
Five CI failures, and every one of them was a real invariant this repo keeps
about its own documentation.

  - README.md and project.md state a canonical token-set count. Adding a set
    without updating it makes the docs wrong; 46 → 47.
  - img/ICONS.md states a logo total. Adding img/logos/opencatalogi.svg makes
    it wrong; 24 → 25.
  - docs/reference/contrast-report.md is compared byte-for-byte against a fresh
    render, so a new set leaves it stale. Regenerated.

The fourth was mine to fix in the capture rather than in a doc:

  --denhaag-process-steps-step-heading-font-family arrived as the literal
  string `{utrecht.heading-1.font-family}` — a Style Dictionary reference the
  reference site ships UNRESOLVED. It is not valid CSS there either, and
  carried into a flat `:root` block its stray `{` opens a second selector and
  breaks every declaration after it. `TokenCssShapeTest` caught exactly that.
  Placeholder values are now dropped at capture time, with the reason recorded
  in the components file.

Also fixed while counting: `frankendesk` was on disk and missing from the
ICONS.md list. It never failed because the test compares the HEADER NUMBER to
the disk count, not the list to the disk — so a list that was one short and a
header that was one short agreed with each other. The list now matches disk
name for name.
OpenCatalogi token set, captured from the site it has to match
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/nldesign @ cb77be1

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
test-l10n
format
composer ✅ 104/104
npm ✅ 2/2
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman
Playwright
Hydra gates

Quality workflow — 2026-08-20 21:42 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving the development → beta promotion.

Verified before approving, not inferred from the check list:

  • 3 pull_request-event runs, 38 jobs, 0 failed, 0 cancelled. The earlier
    "42 green" reading on this PR came from the PUSH runs on development;
    the three runs actually targeting beta had been held at action_required
    with ZERO jobs each and were approved so they would run.
  • PR head ebe907c is identical to development's head, so this promotes
    exactly what was measured.

Also repaired beta's required_status_checks in the same pass: they named
PHP Quality / CSS Quality / Branch Policy Check, three contexts no workflow
emits any more, so every dev→beta PR was permanently unmergeable rather
than merely unreviewed. Replaced with the current equivalents — same three
gates, current names: quality / PHP Quality (phpcs), quality / Vue Quality
(stylelint), branch-protection / check-branch.

@rubenvdlinde
rubenvdlinde merged commit 86bd321 into beta Aug 20, 2026
82 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant