Commit Graph

2 Commits

Author SHA1 Message Date
Julien Gautier c144cdcbd5 feat(portal-shell): app-shell layout with collapsable sidebar
CI / commits (pull_request) Successful in 1m39s
CI / scan (pull_request) Successful in 1m51s
CI / check (pull_request) Successful in 2m10s
CI / a11y (pull_request) Successful in 1m9s
CI / perf (pull_request) Successful in 2m7s
Switch the SPA from header+main+footer to a fixed header above a
sidebar/main split. The sidebar carries grouped navigation, can be
collapsed to an icon-only rail (state persisted in localStorage), and
hosts the accessibility-statement links the footer used to own. Adds
brand palette tokens (primary teal #12546c, accent orange #f7a919) as
Tailwind v4 @theme entries, an <app-icon> façade over lucide-angular
so the future icomoon sprite migration is a single-file change, and
the APF logo asset under public/logos/.

Menu data is static for v1 — items point to '#' placeholders, with the
Dashboard entry routerLink-bound so the active-state styling is
visible on the home page. The MenuItem shape already carries an
optional requiredPermissions field so the permission-aware filter (to
land alongside the auth flow per ADR-0009) plugs in without
restructuring. WCAG-relevant choices preserved: skip-link, role/aria
landmarks, aria-current="page" on active links, aria-expanded on the
toggle, prefers-reduced-motion respected on width transitions, and a
44px minimum hit-target on every interactive element (ADR-0016).

Footer component removed — its links migrated to the sidebar bottom.
2026-05-11 00:17:15 +02:00
Julien Gautier bea5e1954f chore: generate portal-shell and portal-bff apps per ADR-0004 / ADR-0005
Add the @nx/angular, @nx/nest, @nx/vite, @nx/eslint plugins, then
generate the two apps. Adjust the empty-template tsconfig.base.json
to be Angular-compatible (drop project references and customConditions
that the empty-template defaults to but Angular doesn't support; keep
the strict-TS extensions from ADR-0004).

apps/portal-shell (Angular 21):
- standalone APIs, routing, SCSS, esbuild
- vitest-angular as unitTestRunner, playwright for e2e
- strict mode
- tags scope:portal-shell, type:app
- app.config.ts wired with provideZonelessChangeDetection() per
  ADR-0004 (Angular 21 + Nx 22 generates without zone.js by default)

apps/portal-bff (NestJS 11):
- Express adapter (default per ADR-0005)
- Jest as unitTestRunner
- tags scope:portal-bff, type:app
- main.ts wired with a global ValidationPipe configured
  whitelist + forbidNonWhitelisted + transform per ADR-0005
- Phase-2 security additions (helmet, CORS, sessions, CSRF, rate
  limit, auth guards, error filter) deferred to their respective
  ADRs - placeholder comment in main.ts

Workspace dependencies: class-validator + class-transformer added
(required by NestJS ValidationPipe at runtime). Nx-generated
.gitignore additions (.angular, __screenshots__) merged into ours.
.vscode/extensions.json and launch.json added by Nx are kept (do not
override our existing settings.json).
2026-04-30 16:12:42 +02:00