Frontend Overview
The frontend is split across apps/web/ (routes and app-specific code) and shared packages:
packages/web-core/— Shared utilities (cn), hooks, auth client, validatorspackages/web-ui/— shadcn/ui component librarypackages/web-shell/— App shell, layout, settings modals, shared componentspackages/web-admin/— Global admin portal pages
All are built with React 19, Vite, and Tailwind 4.
UI Components
Section titled “UI Components”UI primitives come from shadcn/ui and live in packages/web-ui/src/. App shell and settings components are in packages/web-shell/src/. Admin pages are in packages/web-admin/src/.
To add a new shadcn component:
cd apps/webbunx shadcn@latest add buttonComponents are generated into packages/web-ui/src/ and import cn from @red/web-core/utils.
Routing
Section titled “Routing”The app uses a file-based routing convention under apps/web/src/app/routes/. Routes are wrapped in the app shell (from @red/web-shell) which provides the sidebar, header, and auth guards.
Styling
Section titled “Styling”Tailwind 4 is used for styling. The theme is configured via CSS custom properties in apps/web/src/app/index.css with full light/dark mode support. Each shared package directory is registered via @source directives so Tailwind scans them for utility classes.
Branding & Color System
Section titled “Branding & Color System”The “RED” identity is built on a crimson red primary over a warm stone neutral palette. All colors use the oklch color space for perceptual uniformity.
| Token | Light | Dark | Role |
|---|---|---|---|
--primary |
oklch(0.505 0.213 27.518) |
oklch(0.444 0.177 26.899) |
Brand red — buttons, links, active states |
--primary-foreground |
oklch(0.971 0.013 17.38) |
oklch(0.971 0.013 17.38) |
Text on primary surfaces |
--background |
oklch(1 0 0) |
oklch(0.147 0.004 49.25) |
Page background |
--foreground |
oklch(0.147 0.004 49.25) |
oklch(0.985 0.001 106.423) |
Body text |
--muted |
oklch(0.97 0.001 106.424) |
oklch(0.268 0.007 34.298) |
Subtle backgrounds |
--destructive |
oklch(0.577 0.245 27.325) |
oklch(0.704 0.191 22.216) |
Error states |
--border |
oklch(0.923 0.003 48.717) |
oklch(1 0 0 / 10%) |
Borders and dividers |
Key design decisions:
- Warm neutrals — neutral hues sit around 49–106° (stone/sand), avoiding cool blue-grays
- oklch color space — ensures consistent perceived brightness across hues
- Dark mode borders use white at 10–15% opacity rather than fixed grays, adapting naturally to any background
- Font — Outfit variable font for both headings and body text
All icons come from Lucide React:
import { Settings, Users, CreditCard } from "lucide-react"