Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
476 commits
Select commit Hold shift + click to select a range
626ffb5
feat(mail): brand system email with NL Design token set + compliance …
Jul 23, 2026
e2e3b04
feat(theming-audit): append-only JSONL audit trail for theming changes
Jul 23, 2026
e0627c2
Merge pull request #151 from ConductionNL/wip/email-template-theming
rubenvdlinde Jul 23, 2026
8480627
feat(design-systems): bundle La Suite numérique design stack
Jul 23, 2026
ae3358a
fix(quality): phpstan excludePaths for NLDesignEMailTemplate (extends…
Jul 23, 2026
a142845
feat: add opt-in upstream token freshness check (first background job)
Jul 23, 2026
ec3462a
Merge pull request #154 from ConductionNL/fix/phpstan-exclude-mail-te…
rubenvdlinde Jul 23, 2026
3c37b53
feat: custom font upload (self-hosted, woff2-only, license-gated)
Jul 23, 2026
e61ff0e
feat(compliance): add active-configuration WCAG contrast evidence report
Jul 23, 2026
046817d
merge development into wip/theming-audit-log (audit + email theming b…
Jul 23, 2026
4d6c2bf
Merge pull request #152 from ConductionNL/wip/theming-audit-log
rubenvdlinde Jul 23, 2026
0ad3774
fix: reconcile audit-log + email-theming merge — test arity drift, un…
Jul 23, 2026
6644fd2
Merge pull request #158 from ConductionNL/fix/post-152-reconciliation
rubenvdlinde Jul 23, 2026
a5cdb9a
Merge pull request #153 from ConductionNL/wip/lasuite-design-stack
rubenvdlinde Jul 23, 2026
7b3f360
feat(tokens): full W3C DTCG v2025.10 ingestion — aliases, composite t…
Jul 23, 2026
a1d5c99
Merge remote-tracking branch 'origin/development' into wip/dtcg-inges…
Jul 23, 2026
c6f34b8
Merge pull request #159 from ConductionNL/wip/dtcg-ingestion-hardening
rubenvdlinde Jul 23, 2026
283e8c1
fix(quality): document essential DTCG mapper complexity (PHPMD suppre…
Jul 23, 2026
f09d08e
Merge pull request #160 from ConductionNL/fix/dtcg-mapper-complexity
rubenvdlinde Jul 23, 2026
7ecc096
Merge remote-tracking branch 'origin/development' into wip/custom-fon…
Jul 23, 2026
b5b2ca0
Merge pull request #156 from ConductionNL/wip/custom-font-upload
rubenvdlinde Jul 23, 2026
9ac662d
Merge remote-tracking branch 'origin/development' into wip/compliance…
Jul 23, 2026
6cd5c6f
Merge pull request #157 from ConductionNL/wip/compliance-evidence-report
rubenvdlinde Jul 23, 2026
ab720e9
fix(compliance): reconcile SettingsController 10-arg constructor acro…
Jul 23, 2026
6335e38
Merge pull request #161 from ConductionNL/fix/compliance-constructor-…
rubenvdlinde Jul 23, 2026
f1b8fba
Merge remote-tracking branch 'origin/development' into wip/upstream-t…
Jul 23, 2026
7f61ab0
Merge pull request #155 from ConductionNL/wip/upstream-token-freshness
rubenvdlinde Jul 23, 2026
190f75d
fix(freshness): reconcile 11-arg SettingsController + wire real token…
Jul 23, 2026
72c0ba9
Merge pull request #162 from ConductionNL/fix/freshness-constructor-a…
rubenvdlinde Jul 23, 2026
13e1810
docs(openspec): archive 8 built+live-verified changes from the market…
Jul 23, 2026
d2f0a3f
Merge pull request #163 from ConductionNL/chore/archive-batch-2
rubenvdlinde Jul 23, 2026
0e56a81
refactor(theming): move CSS injection from boot() to render events
Jul 23, 2026
c84eeec
Merge pull request #164 from ConductionNL/wip/render-event-injection
rubenvdlinde Jul 23, 2026
d50998a
feat(theming): per-group token-set mapping for shared-instance multi-…
Jul 23, 2026
5aaeb8f
feat(theme-preview): add proefdraaien — per-session token set preview…
Jul 23, 2026
5c537fd
fix(admin-js): restore DTCG diagnostics rendering lost in a merge rec…
Jul 23, 2026
4f42b2c
Merge pull request #167 from ConductionNL/fix/restore-dtcg-admin-js
rubenvdlinde Jul 23, 2026
dc2720e
feat: complete configuration bundle export/import for OTAP promotion
Jul 23, 2026
c6cc41d
Merge remote-tracking branch 'origin/development' into wip/per-group-…
Jul 23, 2026
76d8189
Merge remote-tracking branch 'origin/development' into wip/theme-conf…
Jul 23, 2026
25e5d07
fix: wire per-group resolution into CssInjectionService (post render-…
Jul 23, 2026
c8ff1f0
Merge pull request #165 from ConductionNL/wip/per-group-theming
rubenvdlinde Jul 23, 2026
a087020
fix(quality): complete CssInjectionService constructor docblock for t…
Jul 23, 2026
41b6900
Merge pull request #169 from ConductionNL/fix/per-group-analyzers
rubenvdlinde Jul 23, 2026
b1e6f28
fix(a11y): keep keyboard focus on the moved row when reordering group…
Jul 23, 2026
61107c0
Merge pull request #170 from ConductionNL/fix/group-theming-focus-res…
rubenvdlinde Jul 23, 2026
c550f61
Merge remote-tracking branch 'origin/development' (up to PR#167) into…
Jul 23, 2026
00411eb
Merge remote-tracking branch 'origin/development' into wip/theme-prev…
Jul 23, 2026
29aa19b
Merge pull request #166 from ConductionNL/wip/theme-preview-workflow
rubenvdlinde Jul 23, 2026
b841b0d
Merge remote-tracking branch 'origin/development' into wip/theme-conf…
Jul 23, 2026
3ddce57
fix(preview): compose theme preview with per-group resolution + rende…
Jul 23, 2026
76afeeb
Merge pull request #171 from ConductionNL/fix/theme-preview-analyzers
rubenvdlinde Jul 23, 2026
349b6e0
docs(openspec): archive render-event-injection, per-group-theming, th…
Jul 23, 2026
daeb0c2
Merge pull request #172 from ConductionNL/chore/archive-batch-3
rubenvdlinde Jul 23, 2026
a0f2999
Merge remote-tracking branch 'origin/development' into wip/theme-conf…
Jul 23, 2026
02fa80b
Merge remote-tracking branch 'origin/development' into wip/theme-conf…
Jul 23, 2026
de08c8e
Merge pull request #168 from ConductionNL/wip/theme-config-portability
rubenvdlinde Jul 23, 2026
7fbf36d
feat(dark-mode): algorithmic dark-mode CSS variants for token sets
Jul 23, 2026
21cd3c1
docs(openspec): archive theme-config-portability
Jul 23, 2026
8e0fac4
Merge pull request #174 from ConductionNL/chore/archive-config-portab…
rubenvdlinde Jul 23, 2026
3c8ef49
Merge remote-tracking branch 'origin/development' into wip/dark-mode-…
Jul 23, 2026
0d4c605
Merge pull request #173 from ConductionNL/wip/dark-mode-token-variants
rubenvdlinde Jul 23, 2026
6120bd5
fix(dark-mode): reconcile constructor arity after the dark-mode merge
Jul 23, 2026
09343b6
Merge pull request #176 from ConductionNL/fix/dark-mode-arity
rubenvdlinde Jul 23, 2026
1b5fffb
docs(openspec): archive dark-mode-token-variants
Jul 23, 2026
3feb2cd
Merge pull request #177 from ConductionNL/chore/archive-dark-mode
rubenvdlinde Jul 23, 2026
b13e821
feat(icons)!: source icons from nc-vue, drop proprietary Amsterdam set
Jul 24, 2026
cd77fa8
Merge remote-tracking branch 'origin/development' into wip/icons-from…
Jul 24, 2026
236b082
Merge pull request #178 from ConductionNL/wip/icons-from-ncvue
rubenvdlinde Jul 24, 2026
11bb1dc
docs(openspec): archive icons-from-ncvue — the wave's final change
Jul 24, 2026
d1f75fd
Merge pull request #179 from ConductionNL/chore/archive-icons
rubenvdlinde Jul 24, 2026
9a738fc
test(e2e): revive the dead Playwright harness + cover the market-gap …
Jul 24, 2026
9bef03a
fix(admin-js): OC.Notification was removed in NC 34 — a toast must ne…
Jul 24, 2026
6107074
Merge pull request #180 from ConductionNL/test/e2e-wave-coverage
rubenvdlinde Jul 24, 2026
4805968
docs(openspec): La Suite pixel-parity wave — token completeness, Mari…
Jul 25, 2026
38b1064
Merge pull request #183 from ConductionNL/specs/lasuite-parity-2026-0…
rubenvdlinde Jul 25, 2026
bb1671f
feat(lasuite): generate full 1167-token Cunningham base, sourced viol…
Jul 25, 2026
27afec1
Merge pull request #184 from ConductionNL/wip/lasuite-token-completeness
rubenvdlinde Jul 25, 2026
6846b96
docs(openspec): archive lasuite-token-completeness
Jul 25, 2026
daa3236
Merge pull request #185 from ConductionNL/chore/archive-lasuite-token…
rubenvdlinde Jul 25, 2026
09896a5
feat(token-sets): non-admin catalogue + shared contrast evaluation en…
Jul 25, 2026
041eb05
Merge remote-tracking branch 'origin/development' into wip/app-token-…
Jul 25, 2026
bc140a2
Merge pull request #186 from ConductionNL/wip/app-token-set-selection
rubenvdlinde Jul 25, 2026
04cc9e1
feat(lasuite): bundle Marianne font gated behind admin French-state a…
Jul 25, 2026
4a679ac
Merge pull request #187 from ConductionNL/wip/marianne-font-restricted
rubenvdlinde Jul 25, 2026
0102c43
docs(openspec): archive marianne-font-restricted
Jul 25, 2026
b0b22b6
Merge pull request #188 from ConductionNL/chore/archive-marianne
rubenvdlinde Jul 25, 2026
a57ce94
feat: theme-switchable iconography — DSFR pack + design-system icon-p…
Jul 25, 2026
e30701a
Merge remote-tracking branch 'origin/development' into wip/theme-swit…
Jul 25, 2026
35d38c2
Merge pull request #189 from ConductionNL/wip/theme-switchable-iconog…
rubenvdlinde Jul 25, 2026
f09bce1
fix(icons): default a design_system-less token set to nldesign packs
Jul 25, 2026
dffe09d
Merge pull request #190 from ConductionNL/fix/icon-pack-default-desig…
rubenvdlinde Jul 25, 2026
25e954c
docs(openspec): archive theme-switchable-iconography
Jul 25, 2026
c3bd053
Merge pull request #191 from ConductionNL/chore/archive-iconography
rubenvdlinde Jul 25, 2026
20363f2
fix(nldesign): La Suite primary button = brand-550 at rest, brand-650…
Jul 26, 2026
07f5b51
feat(config): NL Design theme as a shareable config type (federated-c…
rubenvdlinde Jul 26, 2026
c547ade
feat(nldesign): full La Suite colour parity for the lasuite theme
Jul 26, 2026
2e0eab2
fix(nldesign): resolve federated-config static-analysis errors via co…
Jul 26, 2026
881a519
fix(nldesign): La Suite button label weight + tertiary colour; parse …
Jul 27, 2026
f87d5f8
fix(nldesign): align lasuite neutrals with the live La Suite app
Jul 27, 2026
3e9e0b3
feat(nldesign): align the lasuite wireframe with La Suite
Jul 27, 2026
40bce6a
docs(nldesign): record wireframe verification + correct the scope note
Jul 27, 2026
62a6990
feat(nldesign): admin-editable freeform custom CSS
Jul 28, 2026
8ef8ac6
fix(nldesign): restore the header's left corner and match La Suite's …
Jul 28, 2026
73b9633
fix(lasuite): recolour header glyphs instead of filtering them, and m…
Jul 28, 2026
9c3a8d3
fix(lasuite): close the body-colour band and frame — the shell select…
Jul 29, 2026
57c3dda
fix(lasuite): violet logo via mask, La Suite-sized app name, and a vi…
Jul 29, 2026
74a9e79
fix(lasuite): style both tertiary spellings, and add a guard for sele…
Jul 30, 2026
86cf604
docs(openspec): lasuite-dark-palette — the theme forces a light inter…
Jul 30, 2026
3e1e0d3
fix(e2e): unblock global-setup — three separate waits hung on signals…
Jul 30, 2026
f525411
fix(lasuite): search is a button, not a text field — three of my own …
Jul 30, 2026
40e7ad2
fix(e2e): parity suite was reporting navigation timeouts as parity fa…
Jul 30, 2026
0dbce48
fix(lasuite): Mail has no outer #content shell — full-bleed rules nev…
Jul 30, 2026
92b4582
fix(lasuite): settle the app-name colour by measurement, and make the…
Jul 30, 2026
0597fb8
fix(lasuite): flip the Nextcloud-facing text variables in dark mode
Jul 30, 2026
95caa69
fix(lasuite): remove Nextcloud's fade gradient from header icons, and…
Jul 30, 2026
2486439
fix(lasuite): --color-text-light means de-emphasised, not white — fiv…
Jul 30, 2026
71046fe
fix(lasuite): remove the brand rail from the settings-dialog navigation
Jul 30, 2026
d0b3049
fix(lasuite): tint the current app's icon to brand violet instead of …
Jul 31, 2026
870db42
fix(ci): composer check:strict has been exiting 1 for weeks — phpmd w…
rubenvdlinde Aug 2, 2026
bc05aab
fix(security): judge every url() on its own scheme instead of asking …
rubenvdlinde Aug 2, 2026
922ebae
fix(ci): make composer check:strict able to fail on tests (#196)
rubenvdlinde Aug 2, 2026
fece1b4
fix(quality): phpmd DevelopmentCodeFragment could never fire on names…
rubenvdlinde Aug 3, 2026
896af77
chore(security): refresh roave/security-advisories guard (2026-03-11 …
rubenvdlinde Aug 3, 2026
abe6b2a
chore(deps): pin @conduction/nextcloud-vue 2.1.0-vue3.17 and unblock …
rubenvdlinde Aug 3, 2026
354af07
ci: bound the sync-tokens job runtime (#201)
rubenvdlinde Aug 3, 2026
2a27a6d
fix(ci): regenerate docs/features.json so Features Check passes (#204)
rubenvdlinde Aug 3, 2026
5d853ab
chore(deps): upgrade @conduction/nextcloud-vue to 3.0.0-vue3.4 (#205)
rubenvdlinde Aug 3, 2026
065effe
fix(apphost): stop one cross-app `extends` from 500ing every nldesign…
rubenvdlinde Aug 4, 2026
43e6b87
ci(e2e): enable the shared Playwright job for nldesign (#206)
rubenvdlinde Aug 4, 2026
c05599c
chore(ci): remove dead Forgejo/Codeberg CI residue (#211)
rubenvdlinde Aug 4, 2026
c6b1117
ci: align workflows with fleet standard (ConductionNL/.github) (#199)
remko48 Aug 4, 2026
366a216
fix(lasuite): theme the ground, so loading shows La Suite grey instea…
Aug 4, 2026
d96c89d
fix(quality): make the skipped-unit-suite green self-documenting (#210)
rubenvdlinde Aug 4, 2026
b5e97a8
chore(deps): @conduction/nextcloud-vue 3.0.0-vue3.6
Aug 4, 2026
090f69b
Merge pull request #213 from ConductionNL/chore/ncvue-vue3.6
rubenvdlinde Aug 4, 2026
9a8877a
ci(quality): enable the Code Quality gates this repo was silently ski…
rubenvdlinde Aug 4, 2026
0484372
fix(lasuite): drop Nextcloud's wallpaper — the login page was still i…
Aug 5, 2026
a3c8843
fix(lasuite): flatten the guest/login surfaces — La Suite has no drop…
Aug 5, 2026
d8dad13
chore(quality): burn PHPMD to true zero and delete the baseline
Aug 5, 2026
c7bb92d
fix(lasuite): keep Nextcloud's container radius instead of the contro…
rubenvdlinde Aug 5, 2026
f3b288f
chore(deps): repin @conduction/nextcloud-vue to 2.2.0-vue3.3 (3.0.0-v…
rubenvdlinde Aug 5, 2026
4cc380f
ci(quality): move hydra-gates-ref v1.0.1 -> v1.3.0, which is what is …
rubenvdlinde Aug 5, 2026
e9c0912
fix(l10n): register the missing "Saved. Reload to see the change." ke…
rubenvdlinde Aug 5, 2026
930ebf0
chore(license): normalise licence declarations to EUPL-1.2 (#224)
rubenvdlinde Aug 5, 2026
9e3bcd2
chore(license): the docs homepage still advertised AGPL-3.0 (#226)
rubenvdlinde Aug 5, 2026
6e59a66
Merge branch 'development' into chore/phpmd-baseline-burndown
rubenvdlinde Aug 5, 2026
16515aa
fix(phpmd): scope the lib/Migration UnusedFormalParameter exclusion t…
rubenvdlinde Aug 5, 2026
4f6ee4d
ci(quality): give main/development push runs their own concurrency la…
rubenvdlinde Aug 6, 2026
2a0125a
ci(quality): move hydra-gates-ref to v1.5.0, the pin the floating wor…
rubenvdlinde Aug 6, 2026
e0de501
fix(ci): compare the coverage ratchet against the measured merge base…
rubenvdlinde Aug 6, 2026
1cc8446
Merge origin/development into development
Aug 6, 2026
10e96ad
chore(ci): stop pinning hydra-gates — track the package at @main (#227)
rubenvdlinde Aug 6, 2026
0f68705
test(e2e): pin the La Suite container-vs-control radius split in a br…
rubenvdlinde Aug 6, 2026
499d98e
ci: publish an installable build of development (#234)
rubenvdlinde Aug 6, 2026
f11f699
fix(security): PHP_CodeSniffer 3.13.5 -> 3.13.6 (CVE-2026-67434, OS c…
rubenvdlinde Aug 6, 2026
0ccad44
fix(deps): squizlabs/php_codesniffer 3.13.5 -> 3.13.6 (CVE-2026-67434…
rubenvdlinde Aug 6, 2026
d7f723c
fix(newman): fixture src paths are relative to the COLLECTION dir, no…
rubenvdlinde Aug 6, 2026
3d5ebaa
fix(e2e): traces that are never written, a cascade that eats 10 verdi…
rubenvdlinde Aug 7, 2026
8e1bfae
ci: drop the stable31 leg — openregister cannot install there (#240)
rubenvdlinde Aug 7, 2026
b323e01
chore: raise the Nextcloud floor to 32 (#241)
rubenvdlinde Aug 7, 2026
3193491
fix: restore the pre-32 Nextcloud floor — CI still runs stable31 (#242)
rubenvdlinde Aug 7, 2026
7b0fade
fix(tests): resolve Newman fixture paths and honour the CI base_url v…
rubenvdlinde Aug 7, 2026
fb44842
fix(e2e): 46 waits that can never resolve — networkidle on a Nextclou…
Aug 8, 2026
3b8e9ba
chore: raise the Nextcloud floor to 32, and make it impossible to dri…
Aug 8, 2026
daeec1a
Merge origin/development — keep development's two-ruleset PHPMD split…
Aug 8, 2026
0aeeeed
Merge pull request #243 from ConductionNL/fix/e2e-networkidle-sweep
rubenvdlinde Aug 8, 2026
2cb956e
fix(spec): 10 @spec anchors pointing into ANOTHER REPO's change direc…
Aug 8, 2026
07693d9
Merge pull request #244 from ConductionNL/chore/nc-floor-32
rubenvdlinde Aug 8, 2026
edb39dc
Merge pull request #217 from ConductionNL/chore/phpmd-baseline-burndown
rubenvdlinde Aug 8, 2026
fcbe743
Merge remote-tracking branch 'origin/development' into fix/spec-anchors
Aug 8, 2026
a9932c3
fix(spec): 2 scenarios I added had no @e2e marker, and 2 pre-existing…
Aug 8, 2026
5c3c550
Merge pull request #245 from ConductionNL/fix/spec-anchors
rubenvdlinde Aug 8, 2026
8bdae46
fix(phpcs): stop the SpecTagSniff instructing the pattern gate-46 rej…
rubenvdlinde Aug 8, 2026
df480d9
fix(a11y): th scope, autocomplete on three config fields, and 81 gene…
rubenvdlinde Aug 9, 2026
acbe3a8
fix(admin): server state via IInitialState, not data-* attributes — a…
rubenvdlinde Aug 9, 2026
60d8aec
fix(a11y): name the three hidden file inputs (#255)
rubenvdlinde Aug 9, 2026
0304556
fix(e2e): wait for the Vue chrome instead of sleeping, and report the…
rubenvdlinde Aug 9, 2026
3f9eeb5
fix(bootstrap): add the ADR-040 OpenRegister autoload prelude before …
rubenvdlinde Aug 9, 2026
ce45344
chore(deps): pin @conduction/nextcloud-vue to 2.2.0-vue3.7
Aug 10, 2026
9e09c8f
Merge pull request #257 from ConductionNL/chore/pin-ncvue-2.2.0-vue3.7
rubenvdlinde Aug 10, 2026
2153e38
chore(deps): pin @conduction/nextcloud-vue to 2.2.0-vue3.9
Aug 10, 2026
e924df1
Merge pull request #258 from ConductionNL/chore/pin-ncvue-2.2.0-vue3.9
rubenvdlinde Aug 10, 2026
73cbb57
fix(e2e): resolve the 29 'dead' lasuite selectors — 2 real defects, 2…
rubenvdlinde Aug 10, 2026
391b59c
fix(a11y): reduced-motion fallbacks that actually win the cascade, + …
rubenvdlinde Aug 10, 2026
702066f
test(gate-19): rendered-palette coverage for dark-mode scope selector…
rubenvdlinde Aug 11, 2026
101869f
test(gate-19): 16 real e2e tests for admin-only enforcement and theme…
rubenvdlinde Aug 11, 2026
5892eff
fix(css): one failing stylesheet layer no longer cancels the rest of …
rubenvdlinde Aug 11, 2026
8e49697
fix(a11y): nldesign no longer adds WCAG AA contrast failures core doe…
rubenvdlinde Aug 11, 2026
d18643f
fix(lasuite): give the unified-search control an NC 32 treatment (#260)
rubenvdlinde Aug 12, 2026
265ff43
chore: adopt Nextcloud's coding standard, .editorconfig and NC 34 (#272)
rubenvdlinde Aug 12, 2026
907a25a
fix(ci): test the whole declared Nextcloud range, not only the ceilin…
rubenvdlinde Aug 12, 2026
3da4f78
chore(quality): point PHPMD at the central ruleset (#275)
rubenvdlinde Aug 12, 2026
f939b14
chore(quality): adopt the central PHPStan base config (#274)
rubenvdlinde Aug 12, 2026
f1f8244
chore(deps): pin @conduction/nextcloud-vue to 2.2.0-vue3.16 (#276)
rubenvdlinde Aug 12, 2026
62a04f1
chore(deps): resolve conduction/hydra-gates v1.7.3 in composer.lock (…
rubenvdlinde Aug 12, 2026
53af54d
fix(ci): point shared workflow calls at a ref that exists (#278)
rubenvdlinde Aug 13, 2026
c5e5aa4
feat(format): adopt Nextcloud's prettier config (#280)
rubenvdlinde Aug 13, 2026
51a1634
ci: enforce prettier via a `format` Frontend Check leg (#281)
rubenvdlinde Aug 13, 2026
6f1ae0d
fix(security): rate-limit the font and health endpoints (#282)
rubenvdlinde Aug 14, 2026
2641485
ci: a branch nobody named got no checks at all (#283)
rubenvdlinde Aug 14, 2026
b2c3f8f
docs(spec): rename this app to themiq
Aug 15, 2026
17c5436
chore(deps): track @conduction/nextcloud-vue ^2.3.0 (#285)
rubenvdlinde Aug 15, 2026
ae96ef6
chore(security): enable the npm supply-chain cooldown on npm 11 (#287)
rubenvdlinde Aug 16, 2026
06f06b6
Merge pull request #284 from ConductionNL/docs/spec-themiq-rename
rubenvdlinde Aug 16, 2026
8b4d40d
fix(coverage-guard): scope the ratchet to the files a change touches
Aug 16, 2026
17f7104
fix(coverage-guard): scope the ratchet to the files a change touches …
rubenvdlinde Aug 16, 2026
924e90f
docs(spec): exclude service-level scenarios from gate-19, naming what…
rubenvdlinde Aug 16, 2026
7b33184
docs(spec): exclude bundle, audit and email scenarios, naming what pr…
rubenvdlinde Aug 16, 2026
9fe66ce
Merge pull request #350 from ConductionNL/fix/gate-19-service-level-s…
rubenvdlinde Aug 16, 2026
20c5929
chore(deps): raise hydra-gates to v1.8.0 so gates 65-84 exist locally
rubenvdlinde Aug 16, 2026
e903aab
Merge pull request #351 from ConductionNL/chore/hydra-gates-1.8.0-lock
rubenvdlinde Aug 16, 2026
f8780fe
feat(tokens): VNG carries its NL Design System component tokens
Aug 16, 2026
c38fd11
fix(tokens): keep vng to ONE flat :root block
Aug 16, 2026
6e2274c
Merge pull request #352 from ConductionNL/feat/vng-component-tokens
rubenvdlinde Aug 16, 2026
eb35a8a
fix(dark-mode): resolve var() aliases before deriving, and honour the…
rubenvdlinde Aug 16, 2026
c8186f4
fix(phpcs): clear the 17 PHPCS errors the shared gate was swallowing …
rubenvdlinde Aug 17, 2026
2e2b7a8
feat(tokens): Conduction 2026, built from identity.conduction.nl and …
Aug 17, 2026
51d58bc
feat(tokens): a La Franken municipal set, and the shape tokens Conduc…
Aug 17, 2026
7d149f0
chore(deps): add composer cooldown to dependabot.yml (#356)
rubenvdlinde Aug 17, 2026
0f44bac
feat(tokens): one public-renderer bridge for all 46 sets, and drop an…
Aug 17, 2026
8777389
feat(tokens): La Frankendesk as a delta of La Suite, and one real Inter
Aug 17, 2026
672bb13
fix(tokens): card icon geometry measured, not estimated
Aug 17, 2026
edad652
feat(tokens): the Conduction hero, measured end to end
Aug 17, 2026
5352af0
feat(tokens): the Conduction hero's icon tile and honeycomb
Aug 17, 2026
983babb
feat(tokens): footer geometry for both sets, remeasured
Aug 17, 2026
6ff7344
feat(tokens): the canal scene's colours and bands
Aug 17, 2026
78f2856
feat(tokens): header chrome, canal vessels, and a corrected content c…
Aug 17, 2026
45a561d
docs: public portals are a second consumer, and they behave differently
Aug 18, 2026
35e0a08
fix(tokens): logo URLs resolve under custom_apps, plus the Conduction…
Aug 18, 2026
f427c9d
chore(tokens): regenerated dark variants — 100 component tokens per t…
Aug 18, 2026
5ea7bad
Merge remote-tracking branch 'origin/development' into feat/dark-comp…
Aug 19, 2026
f8f7ae3
fix(tokens): the five failures the conflict was hiding
Aug 19, 2026
a7df0e8
fix(tokens): the rijkshuisstijl logo path 404'd, and the 404 was the …
Aug 19, 2026
e90b437
test(css): the token-set override must load AFTER the shared element …
Aug 19, 2026
f397c3f
fix(logo): a relative url() in a custom property resolves at the USE …
Aug 19, 2026
2a46e3a
Merge pull request #358 from ConductionNL/feat/dark-component-tokens-…
rubenvdlinde Aug 19, 2026
4c1dad3
fix(tokens): regenerate dark variants — three themes were missing 88 …
Aug 19, 2026
f1490d6
Merge pull request #359 from ConductionNL/fix/dark-tokens-regenerate-…
rubenvdlinde Aug 19, 2026
12ecd39
style(phpcs): clear the one phpcs ERROR (inline comment capitalisatio…
rubenvdlinde Aug 19, 2026
fe2369b
Merge pull request #357 from ConductionNL/docs/portal-consumer
rubenvdlinde Aug 19, 2026
f326bf8
Merge remote-tracking branch 'origin/development' into feat/conductio…
juanclaude-conduction Aug 19, 2026
36f9532
chore(deps): take hydra-gates v1.8.1 — the contract v1.8.0 shipped br…
juanclaude-conduction Aug 20, 2026
7e717eb
Merge pull request #355 from ConductionNL/feat/conduction-2026-tokens
rubenvdlinde Aug 20, 2026
f3dad3b
feat(rotterdam): a token set that actually reaches the components
Aug 20, 2026
71e3812
Merge pull request #362 from ConductionNL/chore/hydra-gates-v1.8.1
rubenvdlinde Aug 20, 2026
6d37d65
fix(rotterdam): headings wore the basis layer's placeholder typeface
Aug 20, 2026
b10ad20
Merge pull request #363 from ConductionNL/feat/rotterdam-token-set-bu…
rubenvdlinde Aug 20, 2026
164ad6b
chore(deps): take @conduction/nextcloud-vue 2.8.2 (was 2.3.0)
juanclaude-conduction Aug 20, 2026
3611f02
Merge pull request #364 from ConductionNL/chore/nc-vue-2.8.2
rubenvdlinde Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
1 change: 1 addition & 0 deletions .coverage-baseline
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
77.48
36 changes: 36 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# https://editorconfig.org

# SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later

root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true

[*.yml]
indent_size = 2
indent_style = space

[*.md]
trim_trailing_whitespace = false

[*.svg]
insert_final_newline = false

[package*.json]
indent_size = 2
indent_style = space

[build/psalm-baseline.xml]
indent_size = 2
indent_style = space

[config/*config.php]
indent_size = 2
indent_style = space
34 changes: 34 additions & 0 deletions .forgejo/workflows/app-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# app-tests.yml — nldesign caller for the reusable feature-test workflow.
#
# Runs the PHASE-5 testing layers on every PR to the protected branches.
# phpunit-unit + l10n-check HARD-GATE; e2e/newman are scaffolded and opt-in
# (run-e2e / run-newman) until the NC service container is wired (see tests.yml
# TODOs). Additive — sits alongside the existing release/quality workflows.

name: app-tests

on:
pull_request:
branches:
- development
- main
- beta
workflow_dispatch:
inputs:
run-e2e:
type: boolean
default: false
run-newman:
type: boolean
default: false

permissions:
contents: read

jobs:
tests:
uses: ./.forgejo/workflows/tests.yml
with:
app-id: nldesign
run-e2e: ${{ github.event.inputs.run-e2e == 'true' }}
run-newman: ${{ github.event.inputs.run-newman == 'true' }}
283 changes: 283 additions & 0 deletions .forgejo/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
# tests.yml — reusable feature-test workflow for Conduction NC apps.
#
# PHASE-5 CI enforcement: runs the testing layers we built so a PR can't go
# green while a feature is broken. This is a `workflow_call` reusable: a thin
# per-app caller (app-tests.yml) invokes it with the app id. Copy the pair
# (this file + app-tests.yml) into any sibling app to roll the pattern out —
# the only per-app knob is `app-id`.
#
# Layers, and what gates today:
# • phpunit-unit — HARD GATE. tests/Unit + tests/unit via phpunit-unit.xml.
# The bootstrap runs standalone (vendor OCP stubs, no NC),
# so this needs no service container.
# • l10n-check — HARD GATE. tests/l10n/check-l10n.js asserts every
# t('<app>', '...') / n(...) source string is present in
# l10n/en.json (the i18n-extraction-drift guard). Also runs
# tests/l10n/check-l10n-completeness.js, which asserts every
# en.json key is present (as a key — untranslated is fine,
# MISSING is not) in every other l10n/*.json locale file,
# so a locale can never silently drift behind en.json.
# Pure Node, no NC.
# • e2e-deep — SCAFFOLDED (non-gating). Playwright tests/e2e/workflows/
# need a live, seeded NC. See the TODO in that job.
# • newman — SCAFFOLDED (non-gating). tests/integration Postman
# collections via run-newman.sh need a live NC. See TODO.
#
# Runner labels + reusable `uses:` forms follow the fleet convention
# (codeberg-small / short Conduction/.github@main form). Additive — does not
# touch pre-merge-check-strict.yaml or any release workflow.

name: tests

on:
workflow_call:
inputs:
app-id:
description: "App id (matches package.json name + composer namespace)."
required: true
type: string
php-version:
required: false
type: string
default: "8.3"
node-version:
required: false
type: string
default: "20"
unit-gating:
description: "Fail the workflow on unit-test failures. Set false for apps whose tests/Unit suite is not yet green on baseline (e.g. openregister — see TESTING-CI-ROLLOUT.md)."
required: false
type: boolean
default: true
run-e2e:
description: "Run the scaffolded deep-e2e job (needs NC service — see TODO)."
required: false
type: boolean
default: false
run-newman:
description: "Run the scaffolded Newman job (needs NC service — see TODO)."
required: false
type: boolean
default: false

permissions:
contents: read

jobs:
# ---------------------------------------------------------------------------
# HARD GATE 1 — PHPUnit unit suite (no NC needed; vendor OCP stubs).
# ---------------------------------------------------------------------------
phpunit-unit:
name: PHPUnit unit (${{ inputs.app-id }})
runs-on: codeberg-medium
container:
image: php:8.3-cli
steps:
- name: Install base tooling
run: |
apt-get update
apt-get install -y --no-install-recommends \
git curl ca-certificates gnupg jq unzip zip \
libzip-dev libpng-dev python3
# Node is required by actions/checkout@v4 (a JS action) which runs
# inside this php:8.3-cli container; the stock image ships no node.
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y --no-install-recommends nodejs
docker-php-ext-install -j"$(nproc)" zip gd
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: Install composer deps
run: composer install --no-interaction --no-progress --prefer-dist --ignore-platform-reqs

- name: Run unit suite (phpunit-unit.xml)
# unit-gating=false reports failures without failing the job, for apps
# carrying pre-existing tests/Unit debt (see TESTING-CI-ROLLOUT.md).
continue-on-error: false
run: ./vendor/bin/phpunit --configuration phpunit-unit.xml --no-coverage --colors=never

# ---------------------------------------------------------------------------
# HARD GATE 2 — l10n extraction-drift check (no NC needed; pure Node).
# ---------------------------------------------------------------------------
l10n-check:
name: l10n extraction check (${{ inputs.app-id }})
runs-on: codeberg-medium
container:
image: node:${{ inputs.node-version }}
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: Assert every t() source string is in l10n/en.json
run: node tests/l10n/check-l10n.js

- name: Assert every l10n/*.json locale has every en.json key
run: node tests/l10n/check-l10n-completeness.js

# ---------------------------------------------------------------------------
# HARD GATE 3 — frontend unit suite (Vitest, OFFLINE; no NC needed).
#
# Runs the pure-logic Vitest suite under tests/vitest/** (Pinia store
# state transitions, util/formatter calc, form-validation mappers, and any
# offline component mounts). These need no DOM/NC runtime — @nextcloud/* and
# @conduction/nextcloud-vue are aliased to deterministic stubs in
# vitest.config.js. Always gating.
# ---------------------------------------------------------------------------
frontend-unit:
name: Frontend unit (Vitest — ${{ inputs.app-id }})
runs-on: codeberg-medium
container:
image: node:${{ inputs.node-version }}
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: Install npm deps
run: npm ci --legacy-peer-deps || npm install --legacy-peer-deps

- name: Run Vitest unit suite
run: npm run test:unit

# ---------------------------------------------------------------------------
# COVERAGE GATE A — PHPUnit COVERAGE RATCHET (PCOV clover line coverage).
# Fails a PR that drops backend coverage below tests/.coverage-baseline.json
# `phpunit` minus tolerance. Inherits continue-on-error from unit-gating so a
# red unit suite records-but-does-not-block. Seeds on first --update run when
# the baseline is null. See TESTING-CI-ROLLOUT.md "Coverage ratchet".
# ---------------------------------------------------------------------------
phpunit-coverage-ratchet:
name: PHPUnit coverage ratchet (${{ inputs.app-id }})
runs-on: codeberg-medium
container:
image: php:8.3-cli
continue-on-error: false
steps:
- name: Install base tooling
run: |
apt-get update
apt-get install -y --no-install-recommends \
git curl ca-certificates gnupg jq unzip zip \
libzip-dev libpng-dev python3
# Node is required by actions/checkout@v4 (a JS action) which runs
# inside this php:8.3-cli container; the stock image ships no node.
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y --no-install-recommends nodejs
docker-php-ext-install -j"$(nproc)" zip gd
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: Ensure a coverage driver (PCOV)
run: |
if ! php -m | grep -qiE 'pcov|xdebug'; then
(pecl install pcov && docker-php-ext-enable pcov) \
|| echo "WARN: could not install pcov — coverage step may report no driver"
fi
php -m | grep -qiE 'pcov|xdebug' && echo "coverage driver: present" \
|| echo "coverage driver: ABSENT (ratchet will no-op; see TESTING-CI-ROLLOUT.md)"

- name: Install composer deps
run: composer install --no-interaction --no-progress --prefer-dist --ignore-platform-reqs

- name: Run unit suite WITH coverage (clover)
run: |
php -d pcov.enabled=1 -d pcov.directory=lib \
./vendor/bin/phpunit --configuration phpunit-unit.xml \
--coverage-clover coverage/clover.xml --colors=never || true
test -f coverage/clover.xml || { echo "no clover.xml (driver absent?) — skipping ratchet"; exit 0; }

- name: Coverage ratchet (fail on drop)
run: |
test -f coverage/clover.xml || exit 0
bash tests/coverage-ratchet.sh phpunit coverage/clover.xml

# ---------------------------------------------------------------------------
# COVERAGE GATE B — FRONTEND COVERAGE RATCHET (Vitest v8, src/** line coverage).
# Fails a PR that drops frontend coverage below baseline `vitest` minus
# tolerance. Seeds on first --update run when the baseline is null.
# ---------------------------------------------------------------------------
frontend-coverage-ratchet:
name: Frontend coverage ratchet (${{ inputs.app-id }})
runs-on: codeberg-medium
container:
image: node:${{ inputs.node-version }}
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: Install npm deps (+ coverage-v8)
run: |
npm ci --legacy-peer-deps || npm install --legacy-peer-deps
VITEST_VER="$(node -e "console.log(require('./node_modules/vitest/package.json').version)")"
npm install --no-save --legacy-peer-deps "@vitest/coverage-v8@${VITEST_VER}"

- name: Run Vitest coverage + ratchet (honors each app's own --coverage.include)
run: |
# Use the app's OWN coverage script so its per-app --coverage.include is
# honored (apps keep frontend JS under src/** OR js/**; hardcoding src/**
# here makes js/**-based apps measure 0 files -> "Unknown" -> ratchet exit 2).
if npm run 2>/dev/null | grep -qE '(^|[[:space:]])test:coverage-ratchet([[:space:]]|$)'; then
npm run test:coverage-ratchet
elif npm run 2>/dev/null | grep -qE '(^|[[:space:]])test:coverage([[:space:]]|$)'; then
npm run test:coverage
test -f coverage-vitest/coverage-summary.json \
&& bash tests/coverage-ratchet.sh vitest coverage-vitest/coverage-summary.json \
|| { echo "no coverage-summary.json — vitest coverage unavailable; skipping ratchet"; exit 0; }
else
echo "no frontend coverage script for this app; skipping ratchet"; exit 0
fi

# ---------------------------------------------------------------------------
# SCAFFOLD — deep e2e (Playwright tests/e2e/workflows/). Opt-in via run-e2e.
#
# TODO(nc-in-ci): wire a live Nextcloud before flipping this to gating:
# 1. Boot db + NC (openregister ships .github/docker-compose.ci.yml; add a
# sibling compose for feature apps, or reuse the OR stack + enable this
# app + its OR register/schema fixtures).
# 2. Deploy the working tree into custom_apps/<app-id> and `occ app:enable`
# <app-id> (+ openregister, the data backend).
# 3. Seed the deep-e2e fixtures (tests/e2e/workflows/*fixture*.ts seed the
# OR objects each workflow asserts on).
# 4. `npx playwright install --with-deps chromium` then
# `npm run test:e2e -- tests/e2e/workflows`.
# Until then this job documents the command and is non-gating.
# ---------------------------------------------------------------------------
e2e-deep:
name: Deep e2e (scaffold — needs NC)
if: ${{ inputs.run-e2e }}
runs-on: docker
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: TODO — boot seeded NC, then run deep e2e
run: |
echo "Deep e2e requires a live, seeded Nextcloud (see job header TODO)."
echo "Local: npm ci && npm run test:e2e:install && npm run test:e2e -- tests/e2e/workflows"
echo "Skipping in CI until the NC service container is wired."

# ---------------------------------------------------------------------------
# SCAFFOLD — Newman API-contract (tests/integration/*.postman_collection.json).
# Opt-in via run-newman.
#
# TODO(nc-in-ci): same live-NC prerequisite as e2e-deep. The runner script
# (tests/integration/run-newman.sh) is collection-self-seeding and runnable
# locally today: `bash tests/integration/run-newman.sh`. openregister uses
# the orchestrator at tests/newman/run-all.sh instead.
# ---------------------------------------------------------------------------
newman:
name: Newman API contract (scaffold — needs NC)
if: ${{ inputs.run-newman }}
runs-on: docker
steps:
- name: Checkout
uses: https://github.com/actions/checkout@v4

- name: TODO — boot NC, then run Newman
run: |
echo "Newman requires a live Nextcloud serving the app (see job header TODO)."
echo "Local: bash tests/integration/run-newman.sh # OR: bash tests/newman/run-all.sh"
echo "Skipping in CI until the NC service container is wired."
16 changes: 16 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Revisions to skip in `git blame`.
#
# Enable locally, once:
# git config blame.ignoreRevsFile .git-blame-ignore-revs
#
# GitHub reads this file automatically. Your terminal does not, until you run
# the line above.
#
# Only ever add commits that change formatting and NOTHING else. A commit listed
# here becomes invisible to blame, so a behaviour change hidden inside one would
# be very hard to find later.

# style: reformat with nextcloud/coding-standard — whitespace only
# The fleet-wide move from a PEAR-derived PHPCS ruleset (4 spaces, next-line
# braces) to Nextcloud's own standard (tabs, same-line braces).
8c0f6b88526fb3fc9d0c3a885b3392a20382c7e6
Loading
Loading