Rules for the dashboard SPA in this repository, including the visual bar a page must clear. Use when implementing anything a user sees.
Scanned 8/31/2026
Install via CLI
openskills install Inebrio/Routerly---
name: frontend-conventions
description: Rules for the dashboard SPA in this repository, including the visual bar a page must clear. Use when implementing anything a user sees.
---
# Frontend conventions
Binding detail lives in `.Codex/rules/dashboard.md`. React 18, Vite 6,
TypeScript strict.
## Rules
- Functional components and hooks only. No implicit `any`.
- Every API call goes through `api.ts`. No `fetch` in a component.
- `localStorage` is touched only in `api.ts` and `AuthContext.tsx`.
- Colours come from `ThemeContext`. Never hardcode one: it breaks the other
theme, and both themes ship.
- Types come from the shared package. Never duplicate one.
- Reuse an existing component before writing a new one. Look in
`src/components/` first, every time.
- A dropdown is a `SearchableSelect`, never a native `select`. This is the
standing default, not a question to ask.
## The visual bar
A page that works but looks broken is not done. Before you report done:
- Spacing and alignment match the pages next to it.
- Both themes render correctly. Check the one you did not develop in.
- Empty state is handled and says something useful.
- Loading state exists. Error state exists and shows the real message.
- Nothing overflows or reflows at a narrower viewport.
## Verify in a browser
Build first, then navigate:
```
npm run build --workspace=packages/dashboard
```
A page you have not opened is not verified. Open it, exercise the flow a
user would, read the console, and treat a console error as a failure even
when the screen looks right.
No comments yet. Be the first to comment!