Release: merge development into beta - #45
Conversation
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (100 total)
npm dependencies (7 total)
PHPUnit Tests
Code coverage: 0% (0 / 24 statements) Integration Tests (Newman)Newman integration tests were not enabled for this run. Generated automatically by the Quality workflow.
|
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (100 total)
npm dependencies (7 total)
PHPUnit Tests
Code coverage: 0% (0 / 24 statements) Integration Tests (Newman)Newman integration tests were not enabled for this run. Generated automatically by the Quality workflow.
|
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (100 total)
npm dependencies (7 total)
PHPUnit Tests
Code coverage: 0% (0 / 24 statements) Integration Tests (Newman)Newman integration tests were not enabled for this run. Generated automatically by the Quality workflow.
|
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (100 total)
npm dependencies (7 total)
PHPUnit Tests
Code coverage: 0% (0 / 24 statements) Integration Tests (Newman)Newman integration tests were not enabled for this run. E2E Tests (Playwright)Playwright E2E tests were not enabled for this run. Generated automatically by the Quality workflow.
|
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-01 11:51 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-07 20:51 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-07 21:25 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-12 22:09 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-12 22:29 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-13 09:26 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-17 07:45 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 18:09 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 18:54 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 19:16 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 20:47 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 20:59 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-18 21:17 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 02:56 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 03:08 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ⏭️ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ⏭️ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ⏭️ | ||||
| eslint | ⏭️ | ||||
| stylelint | ⏭️ | ||||
| composer | ⏭️ | ⏭️ | |||
| npm | ⏭️ | ⏭️ | |||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ |
Quality workflow — 2026-05-19 05:05 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 05:07 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-19 05:21 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 05:24 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 07:42 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 08:13 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 08:23 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/24 statements)
Quality workflow — 2026-05-19 08:35 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ❌ | ✅ 100/100 | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-21 20:32 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ❌ | ||||
| phpcs | ❌ | ||||
| phpmd | ❌ | ||||
| psalm | ❌ | ||||
| phpstan | ❌ | ||||
| phpmetrics | ❌ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ❌ | ❌ | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-22 07:13 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/nldesign @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ❌ | ||||
| phpcs | ❌ | ||||
| phpmd | ❌ | ||||
| psalm | ❌ | ||||
| phpstan | ❌ | ||||
| phpmetrics | ❌ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ❌ | ❌ | |||
| npm | ✅ | ✅ 7/7 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-23 07:26 UTC
Download the full PDF report from the workflow artifacts.
… and Frankendesk sets
Two things, both source-side.
🔴 **The dark-variant logo URL was one directory too deep.** The generator
emitted `../../../../img/logos/...` on the reasoning that shipped
`tokens/{set}.css` files use three `..` — but nldesign is served from a
custom_apps URL prefix in this fleet's standard deployment, where no
`/apps/nldesign/` alias exists. From `css/tokens/{set}.css`, two levels under
the app root, three `..` is correct and four resolves above it. Verified live
against a running custom-app install: the old value 404'd, the new one loads.
Plus new token sets — Conduction and Frankendesk — with their fonts (Figtree
variable, IBM Plex Mono), the Frankendesk logo, and `public-bridge.css`.
⚠️ nldesign has no `vendor/` in this checkout, so its PHPUnit suite could not be
run here; CI runs it. The change to `DarkPaletteServiceTest` is the assertion
for the corrected depth.
…heme 45 dark-variant files, adding `--nldesign-component-*` tokens (badge, button, and the rest) so a component has a dark appearance rather than inheriting one. 🔴 **THE GENERATOR THAT PRODUCED THESE IS NOT IN THIS REPOSITORY. DO NOT REGENERATE UNTIL IT IS.** Every file is stamped `DarkPaletteService v2`. `DarkPaletteService::GENERATOR_VERSION` in this tree is **1**, and that class contains **zero** occurrences of the string "component" while each generated file contains **100** `--nldesign-component-*` declarations. Both numbers were counted, not inferred. So `occ nldesign:generate-dark-variants` as it stands would rewrite all 45 files back to the v1 shape and **silently strip component theming from every municipal theme** — Amsterdam, Den Haag, Rotterdam, Utrecht, the lot. The loss would show up as a styling regression with no code change to blame it on, which is the worst kind to diagnose. Committed rather than discarded because the output is real work and throwing it away loses it; committed loudly rather than quietly because generator output the committed generator cannot reproduce is otherwise indistinguishable from output it can. The v2 generator needs to be located and landed before anyone runs the command again.⚠️ Not verified by regeneration, and that is stated deliberately: running `occ nldesign:generate-dark-variants` returned "There are no commands defined in the nldesign namespace" — the command is not registered on this instance. The files were unchanged afterwards, which looks exactly like a passing check and is not one. What IS measured is the v1-vs-v2 stamp and the 0-vs-100 component-token count.
…onent-tokens-and-logo-paths # Conflicts: # css/tokens/dark/amsterdam.css # css/tokens/dark/denhaag.css # css/tokens/dark/drechterland.css # css/tokens/dark/epe.css # css/tokens/dark/hoorn.css # css/tokens/dark/leiden.css # css/tokens/dark/nijmegen.css # css/tokens/dark/noordwijk.css # css/tokens/dark/provincie-zuid-holland.css # css/tokens/dark/rijkshuisstijl.css # css/tokens/dark/rotterdam.css # css/tokens/dark/tilburg.css # css/tokens/dark/utrecht.css # css/tokens/dark/vng.css # css/tokens/dark/xxllnc.css
Resolving the merge conflict let CI run this branch for the first time, and it
found five failures — none of them caused by the merge, all of them real.
🔴 **The conflict itself was the important one.** Every `css/tokens/dark/*.css`
file conflicted on its generator stamp: this branch had regenerated them with
**v1**, `development` carried **v2**. Measured before resolving, on all 15 files:
ours (v1): 12 component tokens theirs (v2): 100
So "take ours" would have stripped ~88 `--nldesign-component-*` declarations
from every affected theme — the exact harm the missing-v2-generator note warns
about. Resolved as THEIRS for all 15; the branch's own logo-URL work is
untouched.
**The token-file shape (TokenCssShapeTest).** `frankendesk.css` carried a
`#header .logo` rule, so it had two selector blocks. A shipped token file is
exactly one flat `:root { }` block and the scoped-application contract depends
on that shape, so an element rule there broke the invariant for every consumer
in order to style one header. Moved to `css/token-overrides/frankendesk.css`,
emitted by a new `injectTokenSetOverrides()` directly after the set's token
file — so it still wins over the shared `element-overrides.css`, and still only
for the set that has one. The two-tone Frankendesk mark keeps its unmasked
rendering.
**Counts that had drifted.** The merge brought 46 token sets and 24 logos while
README/project.md/ICONS.md still claimed 44 and 23. Updated, and the contrast
report regenerated from the current token files (it had not seen
`conduction-new`).
**stylelint:** an empty spacer comment in the frankendesk header.
Local: 592 tests pass, stylelint clean.
…e2e failure
`dark-mode-scope` failed on 'the OS switch must be pure CSS — no nldesign
request may be issued', and the request it caught was:
http://localhost:8080/apps/nldesign/css/img/nederland-logo.svg
The switch really was pure CSS. What issued the request was a BROKEN image:
`rijkshuisstijl.css` still pointed at `../../img/nederland-logo.svg`, which did
not resolve from the served stylesheet, and a 404 gets RE-REQUESTED on every
recompute — including on an OS dark/light flip. So a missing asset presented
itself as 'the dark-mode implementation is not pure CSS'.
Pointed at `img/logos/rijkshuisstijl.svg`, the same convention the other
sets use and the copy `docs/reference/brand-identity.md` already documents as
existing 'for consistency with the theming sync system'.
Swept the rest rather than fixing the one that failed: all 17 `url('../../img/…')`
declarations across `css/tokens/*.css` now point into `img/logos/`, and every
target was verified to exist on disk.
Local: 592 tests pass, stylelint clean.
…overrides `injectTokenSetOverrides()` shipped with no test, and the coverage ratchet was one statement short. Order is the whole point: the override exists to beat the design system's shared `element-overrides.css`, and it can only do that by being emitted later. Both positions are asserted — after the shared stylesheet AND after its own tokens, whose values it reads. The second test is the control: without it, the first would pass on an implementation that emitted a `token-overrides/` stylesheet for EVERY set, including the ~45 that have no such file — 45 new 404s, and the test would not have noticed.
…site
🔴 The logo 404'd no matter which relative path the token file declared, and
this is why: a relative `url()` inside a CSS custom property is resolved
against the stylesheet that USES the property, not the one that declares it.
The token files sit in `css/tokens/` and declared `../../img/logos/<set>.svg`,
which is correct from there. But the property is consumed in
`css/systems/nldesign/theme.css` and in `css/token-overrides/*.css` — two
DIFFERENT depths. No single relative path can be right for both, so one of them
was always going to 404, and the e2e failure moved with the path rather than
disappearing:
../../img/nederland-logo.svg -> /css/img/nederland-logo.svg 404
../../img/logos/rijkshuisstijl.svg -> /css/img/logos/rijkshuisstijl.svg 404
PHP now re-declares the property with an ABSOLUTE url after the token file.
`linkTo()` resolves the install root, so it is right under `custom_apps` and
under `apps` without either being hard-coded.
⚠️ UNQUOTED, and that is not cosmetic: `Util::addHeader()` HTML-escapes its
text, so `url("…")` reached the page as `url("…")` and the whole
declaration was invalid. Measured in the browser, then re-measured after the
fix — the property now reads
`url(/custom_apps/nldesign/img/logos/rijkshuisstijl.svg)` and that URL returns
**200**.
Local: 594 tests pass, phpcs clean.
…and-logo-paths fix(tokens): logo URLs resolve under custom_apps + regenerated dark component tokens
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-19 08:28 UTC
Download the full PDF report from the workflow artifacts.
…component tokens each Regenerated output that was sitting uncommitted after #358. `conduction`, `conduction-new` and `frankendesk` carried only **12** `--nldesign-component-*` tokens where every other theme carries 100, so those three had no dark-mode values for buttons, badges, cards and the rest — they fell back to their light values in dark mode. conduction 332 -> 924 token names conduction-new 158 -> 518 frankendesk 130 -> 218 the other 15 unchanged⚠️ **Verified that NOTHING was lost, per file, by name.** The diff shows 108 deleted lines, which reads like removal — it is not. A per-file census of every `--token:` name before and after reports **0 lost across all 18 files**; the deleted lines are value and ordering changes, plus three files whose header moves from `DarkPaletteService v1` to `v2`. `--conduction-primary-top-nav-color` is the example that makes the point: it appears as a `-` line and is still present twice afterwards. 🔴 The hazard this does NOT fix, recorded so nobody trips it: there are TWO generators, and only one knows about component tokens. scripts/generate-tokens.mjs emits --nldesign-component-* (needs an nl-design-system/themes clone) occ nldesign:generate-dark-variants contains ZERO occurrences of "component" The light sources carry no component tokens at all (`css/tokens/amsterdam.css` greps 0 while its dark variant has 100), so the PHP command cannot re-derive them. Running it would strip component theming from every theme. That is separate work — it needs the mjs generator's behaviour folded into the command, or the command retired.
…three-themes fix(tokens): regenerate dark variants — three themes were missing 88 component tokens each
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-19 16:51 UTC
Download the full PDF report from the workflow artifacts.
…n) (#360) Green on the live run 32275687077: 36 jobs, 32 success, 0 failures. The PR also carries a FAILURE row for 'quality / Quality Report' from run 32275680508 — a run started 4 seconds earlier on the same commit and cancelled by concurrency. Its E2E, PHPUnit and Hydra Gates jobs were all cancelled, and the report correctly refused to pass on absent verdicts rather than guessing. That is the aggregator working, not a defect in this change; the row is a stale artefact of the superseded run. Precondition for ConductionNL/.github#483. Measured with a control: before, A TOTAL OF 1 ERROR AND 0 WARNINGS; after, phpcs exits 0 having scanned 63/63 files.
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-19 17:19 UTC
Download the full PDF report from the workflow artifacts.
docs: public portals are a second consumer, and they behave differently
…n-2026-tokens # Conflicts: # css/tokens/frankendesk.css
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-19 22:09 UTC
Download the full PDF report from the workflow artifacts.
…oken v1.8.0 shipped an ObjectServiceInterface WITHOUT patchObject() and with updateObject() still summarised as "Apply a partial update" — the wording that sent a consumer down the erasing path. The correction landed on main two days after the tag; every app has been pinned to the broken copy since. It is not confined to this repo: hydra-gates claims OCA\OpenRegister\Contract\ in its composer autoload, a LONGER psr-4 prefix than openregister's own OCA\OpenRegister\ -> lib/, so the gate package wins. Nine repos vendor it, so under OC_App::loadApps() whichever app registers first defines the contract for the whole instance. Measured on a running instance, softwarecatalog's vendor directory was supplying openregister's interface, and updating openregister ALONE did not change the winner — which is why this lands across the fleet rather than in one repo.
feat(tokens): Conduction 2026, built from identity.conduction.nl and nothing else
The Rotterdam set defined 90 lines of --nldesign-* colour and nothing else.
NL Design System components read --utrecht-* / --ams-* tokens, so every
button, textbox, card and pagination control on a Rotterdam-themed page
rendered in the upstream default with one green accent over the top. Four of
this repo's 48 sets defined the component vocabulary; 44 did not.
rotterdam.css is now composed from three sources, in precedence order:
A. the RODS palette, verbatim from @gemeente-rotterdam/design-tokens@1.1.0
B. Rotterdam's OWN component mapping, verbatim from that package's
dist/theme.css — 1,990 tokens Rotterdam authored, never overwritten
C. the shared role layer (css/tokens/vng.css) filling only what B omits,
with the colour ramp re-pointed at RODS — 801 component tokens
E. 15 card tokens neither source defines
D. the --nldesign-* semantic layer
3,169 tokens, up from 47. Every colour traces to a RODS token in
scripts/brands/rotterdam.json; the three that do not say DERIVED and why.
Links are black and turn green on hover, because that is what RODS says
(interactive-default resolves to base-black). A blue link would have been the
generic default wearing Rotterdam's palette, which is the failure this fixes.
scripts/generate-brand-set.mjs makes the composition repeatable — css/tokens/
conduction.css already documented being "GENERATED from the shared role
layer", but the generator was never committed. It reports coverage and names
every literal the ramp could not account for, so a colour that stays VNG blue
is printed rather than shipped quietly.
Also fixed, both found by running the above:
- generate-dark-variants.php died at class-declaration time: its IAppManager
stub was missing getAppNamespace/getAppFromNamespace (@SInCE NC 34) and
declared getAppInfo without the interface's `: ?array`. The fatal read as
"dark variants are broken" rather than "a stub drifted".
- --utrecht-card-* is consumed by the bundled CSS and defined by 1 of 48
sets. Cards are what a search results list is made of, so the most repeated
element on the page was the one no theme reached.
tests/vitest/rotterdamBrandSet.spec.js asserts what distinguishes a set that
themes from one that does not: named component tokens (not a count), AA
contrast on text and 3:1 on the control border, and that Rotterdam resolves
DIFFERENTLY from the role layer it came from — the last catches "the
generator ran and substituted nothing", a state every other assertion
survives. The contrast helper is shown to reject a known-bad pair first, so
a green run means the check ran. Verified by reverting one token: 2 tests go
red.
The structural checks exist because the first generated file was invalid: the
value parser ended declarations at the first `;`, which truncated
url('data:image/svg+xml;base64,...') and left the block unparseable from line
2,988 of 3,197 — correct-looking everywhere a reader would look.
chore(deps): take hydra-gates v1.8.1 — the contract v1.8.0 shipped broken
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 06:00 UTC
Download the full PDF report from the workflow artifacts.
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 06:39 UTC
Download the full PDF report from the workflow artifacts.
Measured in the browser on the demo rig: .utrecht-paragraph resolved to "Bolder, ArialforRotterdam, Arial" and .utrecht-heading-2 resolved to "IBM Plex Sans". Rotterdam's own upstream theme.css ships the shared `basis` layer's placeholder default, and 26 tokens route through it — every heading, form control, blockquote and pagination control on the page. That is a generic default rather than a brand decision, so one token is corrected and the other 25 follow. `upstreamOverrides` is a separate mechanism from `componentOverrides` on purpose. The latter may only FILL GAPS and the generator drops any entry that shadows something already defined; this one deliberately BEATS the brand's own mapping, so every entry states a reason, the generator prints it on each run, and an entry matching nothing upstream is reported and dropped rather than promoted to a new token — the reason it carried no longer applies. Applied IN PLACE rather than appended: appending wins by cascade order and leaves two declarations of one custom property in the same block, which stylelint rejects and which leaves a reader looking up the token finding the upstream value first with no reason to keep scrolling.
…ildout Rotterdam token set that actually reaches the components
Two user-visible defects are fixed by this bump. TWO AI-COMPANION HEXES ON EVERY PAGE. The companion singleton landed in 2.7.0. Below that the host app's own companion never stands down, so any page of this app rendered a second hex 8px from hermiq's — measured on a running instance: openconnector (2.7.1) showed ONE, openbuild (2.6.3) showed TWO, both visible at 52x60, from two separate mounts. THE DETAIL PAGE RECLOSED ITS SIDEBAR WHILE HYDRATING. CnDetailPage set sidebarSeeded and never read it, so 'open' was re-applied on every sync and each reactive change during hydration reset it to the prop default. Fixed in nextcloud-vue#711; that is the cause behind openbuild#268 and, on the evidence, #188. Lockfile only — the existing caret already allowed this. Three-line diff (version, resolved, integrity).
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 10:48 UTC
Download the full PDF report from the workflow artifacts.
chore(deps): take @conduction/nextcloud-vue 2.8.2 (was 2.3.0)
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 11:50 UTC
Download the full PDF report from the workflow artifacts.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.