Release: merge development into beta - #366
Merged
Merged
Conversation
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
Contributor
Author
Quality Report — ConductionNL/nldesign @
|
| 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
approved these changes
Aug 20, 2026
rubenvdlinde
left a comment
Contributor
There was a problem hiding this comment.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.