feat(portal-admin): skeleton app per ADR-0020
First step of the admin track. Scaffold the second Angular SPA in
the workspace alongside `portal-shell`, with the architectural
decisions from the v1 ADRs already wired so subsequent feature PRs
can drop straight into modules.
What lands:
- App generated via `nx g @nx/angular:application` (with the
matching e2e project skeleton). Standalone, zoneless-ready,
prefix `app`, scss component styles, css root stylesheet, no SSR.
- Tags `scope:portal-admin, type:app` so module-boundary lint
treats `portal-admin` distinctly from `portal-shell` and only
allows it to depend on `scope:portal-admin` + `scope:shared`
libs.
- Tailwind v4 wired (`.postcssrc.json` + `@import 'tailwindcss'`),
class-based dark mode (`@custom-variant dark ...`), brand palette
imported from `libs/shared/tokens/src/brand-tokens.css` —
identical visual baseline to portal-shell. ADR-0016 a11y baseline
applies; ADR-0017 perf budget relaxed to **500 KB gzip initial**
per ADR-0020 §"Performance budgets".
- i18n configured to mirror portal-shell (per ADR-0019): sourceLocale
`en`, target `fr`, baseHref `/{locale}/` per locale,
`@angular/localize/init` polyfill, `localize: ["en", "fr"]` on
production, `i18nMissingTranslation: "error"` so CI blocks any PR
that adds a marker without translating it. Seed `messages.fr.xlf`
carries the four marked strings used by the placeholder page +
skip-link + route title.
- Skeleton home page at `/` with a placeholder `<h1>`, intro
paragraph, and a small "Skeleton — coming soon" status chip in
the brand-accent palette. Marked for i18n.
- Skip-link landmark (WCAG 2.4.1) at the App level, with the same
styling as portal-shell (component-scoped scss).
- Wildcard catch-all route bounces unknown paths to home, same
defensive pattern as PR #96 on portal-shell.
- Dev server on port **4300** (vs 4200 for portal-shell) so both
can run in parallel during cross-app development.
- `serve-static` target without `spa: true` — locale-prefixed
routing in production will be handled by the reverse proxy (per
ADR-0019), same as portal-shell since PR #92.
Production build: 62 KB gzip initial per locale (vs the 500 KB
relaxed budget). Both `dist/apps/portal-admin/browser/{en,fr}/`
emitted with the right `<html lang>` and `<base href>`.
Out of scope (each its own follow-up PR):
- Admin app shell (header / sidebar / footer with "Admin" badge).
- OpenTelemetry tracing setup (will register as
`service.name=portal-admin` per ADR-0012).
- `environment.ts` wiring (per ADR-0018) for the admin's own BFF
endpoints.
- BFF `AdminModule` + `AdminRoleGuard` + first `/api/admin/me`
smoke route (per ADR-0020 §"Auth").
- First functional module (CMS / menu / users / audit viewer).
CLAUDE.md picks up the second app in its naming + commands sections.
This commit is contained in:
@@ -32,7 +32,7 @@ These constraints were set by the project lead at kickoff. They apply to every c
|
||||
The structural, security, observability, and quality choices are recorded as ADRs and summarized below. Any change to these requires updating the corresponding ADR.
|
||||
|
||||
- **Workspace:** Nx monorepo with the `apps` preset, managed by pnpm — see [ADR-0002](docs/decisions/0002-adopt-nx-monorepo-apps-preset.md).
|
||||
- **Naming:** workspace `apf-portal`; apps `portal-shell` (frontend) and `portal-bff` (backend); libs `feature-<name>` and `shared-<scope>` — see [ADR-0003](docs/decisions/0003-workspace-and-app-naming-convention.md).
|
||||
- **Naming:** workspace `apf-portal`; apps `portal-shell` (end-user SPA), `portal-admin` (admin SPA, skeleton in place — see ADR-0020), and `portal-bff` (backend); libs `feature-<name>` and `shared-<scope>` — see [ADR-0003](docs/decisions/0003-workspace-and-app-naming-convention.md).
|
||||
- **Frontend (`portal-shell`):** Angular at the latest LTS major — standalone APIs, zoneless change detection, Signals, **CSR only (no SSR)**, Vitest, SCSS — see [ADR-0004](docs/decisions/0004-frontend-stack-angular-csr-zoneless-signals.md).
|
||||
- **Backend (`portal-bff`):** NestJS at the latest stable major, mounted on the Express adapter (Fastify adapter swappable later) — see [ADR-0005](docs/decisions/0005-backend-stack-nestjs.md).
|
||||
- **Persistence:** PostgreSQL (latest stable major) via Prisma — see [ADR-0006](docs/decisions/0006-persistence-postgresql-prisma.md).
|
||||
@@ -60,7 +60,7 @@ If asked to "build", "test", or "run" anything, first verify whether the workspa
|
||||
|
||||
## Commands once the workspace exists
|
||||
|
||||
App-scoped — `<app>` is one of `portal-shell`, `portal-bff`:
|
||||
App-scoped — `<app>` is one of `portal-shell`, `portal-admin`, `portal-bff`:
|
||||
|
||||
```bash
|
||||
pnpm nx serve <app> # dev server
|
||||
|
||||
Reference in New Issue
Block a user