Adds reverse engineering docs and adds new aidlc feature for front-end development

This commit is contained in:
2026-06-16 23:25:22 +02:00
parent 95d986790e
commit 73025c5a84
15 changed files with 994 additions and 0 deletions
@@ -0,0 +1,125 @@
# API Documentation
## REST APIs
### Authentication
#### POST /auth/login
- **Method**: POST
- **Path**: `/auth/login`
- **Purpose**: Authenticate a user and receive JWT tokens
- **Authorization**: Anonymous
- **Request**: `{ "email": string, "password": string }`
- **Response**: `{ "accessToken": string, "refreshToken": string, "expiresAt": datetime, "user": { "id": guid, "email": string, "naam": string, "role": string } }`
#### POST /auth/refresh
- **Method**: POST
- **Path**: `/auth/refresh`
- **Purpose**: Refresh an access token using a valid refresh token
- **Authorization**: Anonymous
- **Request**: `{ "accessToken": string, "refreshToken": string }`
- **Response**: Same as `/auth/login`
#### POST /auth/revoke
- **Method**: POST
- **Path**: `/auth/revoke`
- **Purpose**: Revoke a refresh token (logout)
- **Authorization**: Bearer JWT required
- **Request**: `"<refreshToken>"` (string body)
- **Response**: 204 No Content
---
### Setup
#### GET /setup/status
- **Method**: GET
- **Path**: `/setup/status`
- **Purpose**: Check if the system has been initialized (first owner created)
- **Authorization**: Anonymous
- **Response**: `{ "initialized": boolean }`
#### POST /setup/owner
- **Method**: POST
- **Path**: `/setup/owner`
- **Purpose**: Create the initial Owner account (only usable when system is not yet initialized)
- **Authorization**: Anonymous
- **Request**: `{ "email": string, "password": string }`
- **Response**: `{ "message": string }`
---
### Users
#### POST /users/invite
- **Method**: POST
- **Path**: `/users/invite`
- **Purpose**: Invite a new user by email with a specified role
- **Authorization**: Bearer JWT, Policy: AdminOnly
- **Request**: `{ "email": string, "role": string }`
- **Response**: `{ "inviteLink": string }`
#### POST /users/complete-setup
- **Method**: POST
- **Path**: `/users/complete-setup`
- **Purpose**: Complete account setup using an invitation token
- **Authorization**: Anonymous
- **Request**: `{ "token": string, "password": string }`
- **Response**: `{ "message": string }`
#### GET /users/validate-invitation
- **Method**: GET
- **Path**: `/users/validate-invitation?token={token}`
- **Purpose**: Validate an invitation token before showing the setup form
- **Authorization**: Anonymous
- **Response**: `{ "valid": boolean, "email": string, "role": string }` or error
---
### Availability
#### GET /availability/status
- **Method**: GET
- **Path**: `/availability/status`
- **Purpose**: Get current system availability status
- **Authorization**: Anonymous
- **Response**: `{ "status": "Available|Maintenance|Unavailable", "checkedAt": datetime, "message": string }`
#### POST /availability/admin/status
- **Method**: POST
- **Path**: `/availability/admin/status`
- **Purpose**: Update the system availability status
- **Authorization**: Bearer JWT, Policy: OwnerOnly
- **Request**: `{ "newStatus": "Available|Maintenance|Unavailable", "reason": string }`
- **Response**: 200 OK or 400 Bad Request
---
## Authorization Policies
| Policy | Required Role | Description |
|--------|--------------|-------------|
| `OwnerOnly` | Owner | Full system access including availability management |
| `AdminOnly` | Owner or Admin | User management access |
## Data Models
### AuthResponse
- `accessToken` — short-lived JWT (e.g. 15 min)
- `refreshToken` — long-lived opaque token
- `expiresAt` — access token expiry datetime
- `user` — authenticated user info
### ApplicationUser (returned in auth responses)
- `id` — Guid
- `email` — string
- `naam` — string (display name)
- `role` — string (Owner / Admin / User)
- `isActive` — boolean
### Invitation
- `token` — string (URL-safe token)
- `email` — string
- `role` — string
- `expiryDate` — datetime
- `isUsed` — boolean
@@ -0,0 +1,123 @@
# System Architecture
## System Overview
SlpModularCms is a modular, ASP.NET Core-based CMS platform. The backend is structured as a monolith-with-modules: a single API host (`SlpModularCms.Api`) that dynamically loads feature modules at startup. Each module is self-contained and registers its own services and HTTP middleware. Persistence is handled via Entity Framework Core with SQL Server. Authentication uses JWT Bearer tokens with refresh token rotation.
The frontend is a React SPA (to be built) that communicates with the API via REST/JSON. The example app (from ZIP) provides the design foundation: Vite + React Router v7 + shadcn/ui + Tailwind CSS v4 with primary color `#ac0000`.
## Architecture Diagram
```
+--------------------------------------------------+
| Client Layer |
| +--------------------------------------------+ |
| | React SPA (SlpModularCms.Frontend) | |
| | Vite + React Router v7 + shadcn/ui | |
| | Tailwind CSS v4 (#ac0000 theme) | |
| +--------------------------------------------+ |
+---------------------------+----------------------+
| HTTP REST / JSON
+---------------------------v----------------------+
| API Layer |
| +--------------------------------------------+ |
| | SlpModularCms.Api (ASP.NET Core) | |
| | - JWT Bearer Auth Middleware | |
| | - CORS, Swagger/OpenAPI | |
| | - Module registration pipeline | |
| +--------------------------------------------+ |
| |
| +------------------+ +---------------------+ |
| | Identity Module | | Availability Module | |
| | - AuthController| | - AvailabilityCtrl | |
| | - SetupCtrl | | - PersistentService | |
| | - UsersCtrl | | - CircuitBreaker | |
| +------------------+ +---------------------+ |
+---------------------------+----------------------+
|
+---------------------------v----------------------+
| Core Layer |
| +--------------------------------------------+ |
| | SlpModularCms.Core | |
| | - ApplicationDbContext (EF Core) | |
| | - Domain Entities | |
| | - Identity Services (Auth, Setup, Invite) | |
| | - IModule interface + ModuleInfo | |
| +--------------------------------------------+ |
+---------------------------+----------------------+
|
+---------------------------v----------------------+
| Data Layer |
| +--------------------------------------------+ |
| | SQL Server Database | |
| | - ASP.NET Identity tables | |
| | - RefreshTokens | |
| | - Invitations | |
| | - GlobalAvailabilityState | |
| +--------------------------------------------+ |
+--------------------------------------------------+
```
## Component Descriptions
### SlpModularCms.Api
- **Purpose**: Web API host and application entry point
- **Responsibilities**: Bootstrap, module loading, middleware pipeline, CORS, Swagger
- **Dependencies**: SlpModularCms.Core, SlpModularCms.Modules.Identity, SlpModularCms.Modules.Availability
- **Type**: Application
### SlpModularCms.Core
- **Purpose**: Shared domain layer
- **Responsibilities**: Domain entities, EF Core DbContext, authentication services, module interface
- **Dependencies**: EF Core, ASP.NET Identity, SQL Server provider
- **Type**: Shared Library
### SlpModularCms.Modules.Identity
- **Purpose**: Identity and user management module
- **Responsibilities**: HTTP endpoints for auth, setup, and user invitation flows
- **Dependencies**: SlpModularCms.Core
- **Type**: Application Module
### SlpModularCms.Modules.Availability
- **Purpose**: System availability tracking module
- **Responsibilities**: Exposes system status, allows owners to update it, caches with circuit breaker
- **Dependencies**: SlpModularCms.Core
- **Type**: Application Module
### SlpModularCms.Frontend (To Be Built)
- **Purpose**: Admin SPA for CMS management
- **Responsibilities**: Login, dashboard, user management, CMS content management, availability status display
- **Dependencies**: SlpModularCms.Api (REST)
- **Type**: Frontend Application
## Data Flow
```
Login Flow:
Browser -> POST /auth/login -> AuthController
-> AuthService.AuthenticateAsync()
-> PasswordHasher validates credentials
-> JwtService generates access + refresh tokens
-> Returns {accessToken, refreshToken}
Invite Flow:
Admin -> POST /users/invite -> UsersController
-> InvitationService.CreateInvitationAsync()
-> Stores Invitation entity with token
-> Returns invite link
New User Setup:
User -> POST /users/complete-setup -> UsersController
-> InvitationService.CompleteInvitationAsync()
-> Sets password, activates account
```
## Integration Points
- **External APIs**: None currently
- **Databases**: SQL Server (via EF Core)
- **Third-party Services**: None currently
## Infrastructure Components
- **Deployment Model**: Single API process + React SPA (separate deploy or static files)
- **Authentication**: JWT Bearer tokens (HS256 or RS256 based on JwtSettings config)
- **Database Migrations**: EF Core Code-First migrations in SlpModularCms.Core/Migrations/
@@ -0,0 +1,68 @@
# Business Overview
## Business Context Diagram
```
+--------------------------------------------------+
| SlpModularCms Platform |
| |
| +-----------+ +-----------+ +-----------+ |
| | Identity | | CMS | |Availability| |
| | Module | | Module | | Module | |
| | (Auth + | | (Content | | (System | |
| | Users) | | Mgmt) | | Status) | |
| +-----------+ +-----------+ +-----------+ |
| |
| +-------------------------------------------+ |
| | Core / Shell | |
| | (Domain entities, DbContext, Module I/F) | |
| +-------------------------------------------+ |
+--------------------------------------------------+
| |
v v
[Admin Frontend] [External Clients]
(React SPA) (API consumers)
```
## Business Description
- **Business Description**: SlpModularCms is a modular Content Management System (CMS) platform. It provides a REST API backend for managing CMS content, users, and system availability. The platform uses role-based access control (Owner, Admin, User) and supports a modular plugin architecture so that features can be added as independent modules.
- **Business Transactions**:
- **User Authentication**: Login with email/password, receive JWT access + refresh token pair; refresh tokens for continued sessions; revoke tokens on logout.
- **System Initialization**: First-time setup — create initial Owner account before normal operations can begin.
- **User Invitation**: Admins and Owners invite new users by email; new users complete their account setup via an invitation link.
- **System Availability Management**: Owners can update the system availability status (Available / Maintenance / Unavailable); anyone can query current status.
- **CMS Content Management**: (Planned — module structure is in place but CMS-specific content modules are not yet implemented.)
- **Business Dictionary**:
- **Owner**: Highest-privilege role; can manage users, modules, and system availability.
- **Admin**: Can manage users and CMS content within their scope.
- **User**: Standard access; can use CMS features but cannot manage system settings.
- **Module**: An independently deployable feature unit that integrates into the CMS shell.
- **Invitation**: A time-limited token sent to a new user allowing them to create their account.
- **Availability Status**: Available | Maintenance | Unavailable — represents the operational state of the system.
## Component Level Business Descriptions
### SlpModularCms.Api
- **Purpose**: ASP.NET Core Web API host — the entry point for all HTTP requests.
- **Responsibilities**: Bootstraps the application, registers modules, configures middleware (auth, CORS, Swagger), exposes REST endpoints.
### SlpModularCms.Core
- **Purpose**: Shared domain core — entities, DbContext, interfaces, services, and migrations.
- **Responsibilities**: Defines domain entities (ApplicationUser, ApplicationRole, Invitation, RefreshToken, GlobalAvailabilityState), persistence (EF Core + SQL Server), and shared service contracts.
### SlpModularCms.Modules.Identity
- **Purpose**: Authentication and user management module.
- **Responsibilities**: Implements AuthController (login/refresh/revoke), SetupController (initial owner creation), UsersController (invite, complete-setup, validate-invitation).
### SlpModularCms.Modules.Availability
- **Purpose**: System availability / health status module.
- **Responsibilities**: Implements AvailabilityController (get status, update status), caches status in-memory with circuit breaker, persists status changes to the database.
### SlpModularCms.Core.Tests
- **Purpose**: Unit tests for the Core layer.
- **Responsibilities**: Tests for exception classes, invitation service logic, identity services.
### SlpModularCms.Modules.Availability.Tests
- **Purpose**: Unit/integration tests for the Availability module.
- **Responsibilities**: Tests for availability service logic and controller behavior.
@@ -0,0 +1,34 @@
# Code Quality Assessment
## Test Coverage
- **Overall**: Fair — unit tests exist for Core and Availability modules
- **Unit Tests**: Present for Core.Tests and Modules.Availability.Tests
- **Integration Tests**: Not observed in current structure
- **Frontend Tests**: None (example app has no test files)
## Code Quality Indicators
- **Linting**: Not explicitly configured (no .editorconfig or eslint config seen in backend; frontend likely uses Vite defaults)
- **Code Style**: Consistent — clean C# with XML doc comments on public interfaces and entities
- **Documentation**: Good for core interfaces and entities (XML doc comments); controllers have minimal comments
- **Naming**: Follows .NET conventions (PascalCase classes/methods, camelCase parameters)
## Technical Debt
- Auth context in example React app uses `localStorage` for user state (security concern — no httpOnly cookies)
- Example app auth-context simulates login locally without real API calls (will need to be replaced with actual API integration)
- No CORS configuration confirmed in backend (needs verification for SPA integration)
- `AvailabilityController.UpdateStatus` uses a direct service cast (`as PersistentAvailabilityService`) which couples controller to implementation
- No OpenAPI/Swagger spec currently integrated (would help frontend integration)
## Patterns and Anti-patterns
### Good Patterns
- Module pattern provides clear separation of concerns between features
- JWT refresh token rotation is properly implemented
- Authorization policies are well-defined (OwnerOnly, AdminOnly)
- EF Core used consistently for persistence
- Service interfaces (IAuthService, IInvitationService, ISetupService) for testability
### Anti-patterns
- Direct implementation cast in `AvailabilityController` (should use extended interface instead)
- Example React app uses localStorage-based auth (acceptable for prototype, not production)
- Example React app `auth-context` hardcodes mock users (must be replaced with real API calls)
@@ -0,0 +1,108 @@
# Code Structure
## Build System
- **Type**: .NET SDK (MSBuild / dotnet CLI)
- **Configuration**: `SlpModularCms.sln` — solution file referencing all projects
- **Target Framework**: `net10.0`
## Project Structure
```
SlpModularCms/
+-- src/
| +-- SlpModularCms.Api/ # API host
| | +-- Extensions/
| | | +-- ServiceCollectionExtensions.cs # DI setup (JWT, Identity, EF, Auth)
| | +-- Infrastructure/ # Global exception handler
| | +-- Properties/launchSettings.json
| | +-- Program.cs # App startup and module loading
| | +-- appsettings.json
| | +-- appsettings.local.json # Local dev overrides
| |
| +-- SlpModularCms.Core/ # Shared core
| | +-- Availability/
| | | +-- AvailabilityOptions.cs # Circuit breaker config
| | | +-- AvailabilityStatus.cs # Enum: Available, Maintenance, Unavailable
| | +-- Data/
| | | +-- ApplicationDbContext.cs # EF Core DbContext
| | +-- Exceptions/ # Custom exception types
| | +-- Identity/
| | | +-- Authorization/ # Policy handlers
| | | +-- Entities/
| | | | +-- ApplicationUser.cs # IdentityUser<Guid> + IsActive + CreatedAt
| | | | +-- ApplicationRole.cs # IdentityRole<Guid>
| | | | +-- RefreshToken.cs # Refresh token entity
| | | | +-- Invitation.cs # Invite entity with expiry
| | | | +-- GlobalAvailabilityState.cs # Persisted system status
| | | +-- Models/ # DTOs/request-response models
| | | +-- Services/
| | | +-- AuthService.cs # JWT generation + token validation
| | | +-- InvitationService.cs # Invite creation + completion
| | | +-- SetupService.cs # Initial owner creation
| | +-- Migrations/ # EF Core migrations
| | +-- Modules/
| | +-- IModule.cs # Module interface (Name, Version, RegisterServices, UseModule)
| | +-- ModuleInfo.cs # Module metadata record
| |
| +-- SlpModularCms.Modules.Identity/ # Identity feature module
| | +-- Controllers/
| | +-- AuthController.cs # /auth/* endpoints
| | +-- SetupController.cs # /setup/* endpoints
| | +-- UsersController.cs # /users/* endpoints
| |
| +-- SlpModularCms.Modules.Availability/ # Availability feature module
| | +-- Controllers/
| | | +-- AvailabilityController.cs # /availability/* endpoints
| | +-- Middleware/ # Availability check middleware
| | +-- Services/
| | +-- PersistentAvailabilityService.cs # Reads/writes status to DB + cache
| |
| +-- SlpModularCms.Core.Tests/ # Core unit tests
| +-- SlpModularCms.Modules.Availability.Tests/ # Availability unit tests
|
+-- aidlc-docs/ # AI-DLC workflow documentation
```
## Key Classes/Modules
### Core Domain Entities
- `ApplicationUser` — extends `IdentityUser<Guid>` with `IsActive`, `CreatedAt`, `Naam`
- `ApplicationRole` — extends `IdentityRole<Guid>`
- `RefreshToken` — linked to user; has `Token`, `ExpiryDate`, `IsRevoked`, `IsActive`
- `Invitation` — linked to user (invitee); has `Token`, `ExpiryDate`, `IsUsed`, `Role`
- `GlobalAvailabilityState` — singleton-ish entity storing `Status`, `Message`, `LastUpdatedAt`, `UpdatedBy`
### Core Services
- `IAuthService` / `AuthService``AuthenticateAsync`, `RefreshTokenAsync`, `RevokeTokenAsync`
- `IInvitationService` / `InvitationService``CreateInvitationAsync`, `CompleteInvitationAsync`, `ValidateInvitationAsync`
- `ISetupService` / `SetupService``IsSystemInitializedAsync`, `CreateInitialOwnerAsync`
- `IAvailabilityService` / `PersistentAvailabilityService``IsAvailableAsync`, `UpdateStatusAsync`
### Module System
- `IModule` — interface: `RegisterServices(IServiceCollection)`, `UseModule(IApplicationBuilder)`
- Modules discovered at startup and invoked in sequence
## Design Patterns
### Module Pattern
- **Location**: `SlpModularCms.Core/Modules/`, `SlpModularCms.Api/Program.cs`
- **Purpose**: Allows features to be developed, tested, and deployed independently
- **Implementation**: Each module class implements `IModule` and is registered in the API host
### Repository Pattern via EF Core
- **Location**: `ApplicationDbContext` used directly in services
- **Purpose**: Centralized persistence with Entity Framework
### JWT with Refresh Token Rotation
- **Location**: `AuthService.cs`, `AuthController.cs`
- **Purpose**: Stateless auth with token refresh capability
## Critical Dependencies
### ASP.NET Core Identity
- **Version**: .NET 10 built-in
- **Usage**: User/Role management, password hashing
- **Purpose**: Provides authentication primitives
### Entity Framework Core
- **Version**: .NET 10 built-in
- **Usage**: Data persistence with SQL Server provider
- **Purpose**: ORM for all domain entities
@@ -0,0 +1,23 @@
# Component Inventory
## Application Packages
- `SlpModularCms.Api` — Web API host; bootstraps application, registers modules, exposes HTTP endpoints
- `SlpModularCms.Modules.Identity` — Identity module: authentication, setup, user invitation controllers
- `SlpModularCms.Modules.Availability` — Availability module: system status tracking controllers and services
## Shared Packages
- `SlpModularCms.Core` — Core domain: entities, DbContext, services, module interface, migrations
## Test Packages
- `SlpModularCms.Core.Tests` — Unit tests for Core layer (exceptions, identity services)
- `SlpModularCms.Modules.Availability.Tests` — Unit tests for Availability module
## Frontend (To Be Built)
- `SlpModularCms.Frontend` — React SPA; admin panel for CMS management
## Total Count
- **Total Packages**: 6 (5 existing .NET + 1 new frontend)
- **Application**: 3 (Api, Modules.Identity, Modules.Availability)
- **Shared**: 1 (Core)
- **Test**: 2 (Core.Tests, Modules.Availability.Tests)
- **Frontend**: 1 (to be built)
@@ -0,0 +1,112 @@
# Dependencies
## Internal Dependencies
```
SlpModularCms.Api
+-- SlpModularCms.Core (compile)
+-- SlpModularCms.Modules.Identity (compile)
+-- SlpModularCms.Modules.Availability (compile)
SlpModularCms.Modules.Identity
+-- SlpModularCms.Core (compile)
SlpModularCms.Modules.Availability
+-- SlpModularCms.Core (compile)
SlpModularCms.Core.Tests
+-- SlpModularCms.Core (test)
SlpModularCms.Modules.Availability.Tests
+-- SlpModularCms.Modules.Availability (test)
+-- SlpModularCms.Core (test)
SlpModularCms.Frontend (to be built)
+-- SlpModularCms.Api (runtime via REST HTTP)
```
### Dependency Details
#### SlpModularCms.Api depends on SlpModularCms.Core
- **Type**: Compile
- **Reason**: Needs ApplicationDbContext, entities, DI extensions, module registration
#### SlpModularCms.Api depends on SlpModularCms.Modules.Identity
- **Type**: Compile
- **Reason**: Registers Identity module and its HTTP controllers
#### SlpModularCms.Api depends on SlpModularCms.Modules.Availability
- **Type**: Compile
- **Reason**: Registers Availability module and its HTTP controllers
#### SlpModularCms.Modules.Identity depends on SlpModularCms.Core
- **Type**: Compile
- **Reason**: Uses domain entities (ApplicationUser, Invitation), services (IAuthService), and DbContext
#### SlpModularCms.Modules.Availability depends on SlpModularCms.Core
- **Type**: Compile
- **Reason**: Uses GlobalAvailabilityState, AvailabilityStatus, AvailabilityOptions
## External Dependencies (Backend)
### Microsoft.AspNetCore.Identity
- **Version**: .NET 10 built-in
- **Purpose**: User and role management, password hashing
- **License**: MIT
### Microsoft.EntityFrameworkCore + SqlServer provider
- **Version**: .NET 10 built-in
- **Purpose**: Data persistence
- **License**: MIT
### Microsoft.AspNetCore.Authentication.JwtBearer
- **Version**: .NET 10 built-in
- **Purpose**: JWT authentication middleware
- **License**: MIT
### Microsoft.IdentityModel.Tokens
- **Version**: .NET 10 built-in
- **Purpose**: JWT token creation and validation
- **License**: MIT
## External Dependencies (Frontend — from package.json)
### react + react-dom
- **Version**: 18.3.1
- **Purpose**: Core UI framework
- **License**: MIT
### react-router
- **Version**: 7.13.0
- **Purpose**: Client-side routing
- **License**: MIT
### @radix-ui/* (multiple packages)
- **Version**: Various (1.x2.x)
- **Purpose**: shadcn/ui component primitives
- **License**: MIT
### tailwindcss
- **Version**: 4.1.12
- **Purpose**: Utility-first CSS framework
- **License**: MIT
### lucide-react
- **Version**: 0.487.0
- **Purpose**: Icon library
- **License**: ISC
### recharts
- **Version**: 2.15.2
- **Purpose**: Charts and data visualization
- **License**: MIT
### react-hook-form
- **Version**: 7.55.0
- **Purpose**: Form state management
- **License**: MIT
### sonner
- **Version**: 2.0.3
- **Purpose**: Toast notifications
- **License**: MIT
@@ -0,0 +1,16 @@
# Reverse Engineering Metadata
**Analysis Date**: 2026-06-16T20:30:00Z
**Analyzer**: AI-DLC (Junie)
**Workspace**: K:\Development\Projects\SlpModularCms
**Total Files Analyzed**: ~35 (backend .cs files) + ~60 (frontend .tsx/.ts files from ZIP)
## Artifacts Generated
- [x] business-overview.md
- [x] architecture.md
- [x] code-structure.md
- [x] api-documentation.md
- [x] component-inventory.md
- [x] technology-stack.md
- [x] dependencies.md
- [x] code-quality-assessment.md
@@ -0,0 +1,56 @@
# Technology Stack
## Backend
### Programming Languages
- C# 14.0 — All backend packages
### Frameworks
- ASP.NET Core 10.0 — Web API framework
- ASP.NET Core Identity — User/role management, password hashing
- Entity Framework Core 10.0 — ORM for SQL Server persistence
### Infrastructure
- SQL Server — Primary database
- JWT Bearer Authentication — Stateless auth with refresh tokens
### Build Tools
- .NET 10 SDK / dotnet CLI — Build, test, publish
- MSBuild — Underlying build engine
### Testing Tools
- xUnit (inferred from project conventions) — Unit testing framework
- Moq or similar (inferred) — Mocking in unit tests
---
## Frontend (Example App — ZIP file basis)
### Programming Languages
- TypeScript — All frontend code
### Frameworks
- React 18.3.1 — UI framework
- React Router v7 (7.13.0) — Client-side routing
- Tailwind CSS v4 (4.1.12) — Utility-first CSS framework
- shadcn/ui (via Radix UI) — Accessible component primitives
### UI Component Libraries
- Radix UI — Headless component primitives (accordion, dialog, dropdown, etc.)
- lucide-react (0.487.0) — SVG icon library
- recharts (2.15.2) — Charts and data visualization
- MUI / Material UI (7.3.5) — Additional UI components
### State / Data
- react-hook-form (7.55.0) — Form state management
- sonner (2.0.3) — Toast notifications
- next-themes (0.4.6) — Dark/light theme support
### Build Tools
- Vite 6.3.5 — Build tool and dev server
- pnpm — Package manager (pnpm-workspace.yaml present)
- PostCSS — CSS processing
### Theme
- Primary color: `#ac0000` (deep red)
- Mode: Light + dark via CSS custom properties