# `apps/web-angular` — Primary frontend

Angular 19 Standalone + Signals + Tailwind + Angular Material + Transloco (TH+EN). The premium-theme tokens drive every visual surface via CSS variables.

## Run

```bash
pnpm install                              # from repo root
pnpm --filter @loma-portal/web-angular dev
# → http://localhost:4200
```

## Layout

```
src/
├── app/
│   ├── app.component.{ts,html,scss}      Router shell
│   ├── app.config.ts                     provideHttpClient(withInterceptors([...])) + Transloco + Toastr + SW
│   ├── app.routes.ts                     Lazy-loaded routes + guards
│   ├── core/
│   │   ├── constants/                    api-endpoints, local-storage, role, permission, route
│   │   ├── guards/                       auth, permission, unsaved-changes
│   │   ├── i18n/                         Transloco HTTP loader
│   │   ├── interceptors/                 api, auth, error, loading, correlation-id
│   │   ├── models/                       api-response, paged-response, current-user, lookup,
│   │   │                                 problem-details, auth-tokens
│   │   ├── services/                     auth, current-user, loading, toast, permission,
│   │   │                                 base-api, theme, i18n
│   │   └── utils/                        form, validation, date, string, file
│   ├── features/
│   │   ├── auth/login/                   Login screen (Reactive Forms + Material)
│   │   ├── dashboard/                    Dashboard shell with widgets
│   │   └── errors/                       403 + 404
│   └── shared/components/                page-header, section-card, loading, empty-state,
│                                         status-badge, glass-card, data-table,
│                                         confirm-dialog, breadcrumbs
├── assets/i18n/                          en.json + th.json
├── environments/                         environment.ts + environment.production.ts
└── styles.scss                           Tailwind layers + design-tokens CSS imports
```

## Backend bindings

Phase 3 ships the foundation. Until Phase 4 lands the real .NET API, the login screen submits to `/api/auth/login` and renders the toast error path. Wire a real backend by:

1. `docker compose up -d` to bring up Postgres/Redis.
2. Start the .NET API (Phase 4) on port 5080.
3. Use the seeded admin user printed by Phase 5's `prisma db seed`.
