55 lines
2.7 KiB
Markdown
55 lines
2.7 KiB
Markdown
|
|
# AGENTS.md — Mega Plant
|
|||
|
|
|
|||
|
|
## Mobile checklist (Round 4 standing rule)
|
|||
|
|
|
|||
|
|
Every page must pass the mobile checklist before it is considered complete:
|
|||
|
|
|
|||
|
|
1. **No horizontal page scroll at 375px.** Individual tables may scroll inside their own container; the page itself may not.
|
|||
|
|
2. **No text under 12px on mobile.** Bump `text-[10px]` labels up.
|
|||
|
|
3. **No tap target under 44×44px.** Keep the visual size if you like — add padding to the hit area.
|
|||
|
|
4. **Wide tables scroll inside their own container** with a sticky first column and `-webkit-overflow-scrolling: touch`. Add a visible scroll affordance (e.g. right-edge fade).
|
|||
|
|
5. **Filter controls collapse** below `lg` — pills become a `<select>` dropdown. Don't stack 13 pills into 13 rows.
|
|||
|
|
6. **Verify at 375×812 and 768×1024.** Run `document.documentElement.scrollWidth > document.documentElement.clientWidth` and confirm it returns `false`. Count tap targets and text sizes. Screenshot every route.
|
|||
|
|
|
|||
|
|
If a route fails any of the above, it is not done.
|
|||
|
|
|
|||
|
|
## Build / dev
|
|||
|
|
|
|||
|
|
- `npm run dev` → port 6007 (nohup-detached: `nohup npm run dev > /tmp/plant-dev.log 2>&1 & disown`)
|
|||
|
|
- `npm run build` → 15 routes, webpack mode (PWA is webpack-only)
|
|||
|
|
- `npm run typecheck` → `npx tsc --noEmit`
|
|||
|
|
- `npm run seed` → wipe + re-import `data/source/*.json` into PocketBase. Fails loudly on any unmatched row or broken VAT.
|
|||
|
|
|
|||
|
|
## Color palette — never change
|
|||
|
|
|
|||
|
|
Coolors:
|
|||
|
|
- `#EDAE49` Sunny — orange/positive accent
|
|||
|
|
- `#D1495B` Brick Red — deficit/destructive
|
|||
|
|
- `#00798C` Notartis Seaweed — teal/stable
|
|||
|
|
- `#30638E` Lights Casual — main blue/brand
|
|||
|
|
- `#003D5B` Indigo Dye — deep navy
|
|||
|
|
|
|||
|
|
Chart marks (deeper steps of the same hues — see HANDOFF-PROMPT-3 §A.4):
|
|||
|
|
- `--color-chart-income` (light `#0090A6`, dark `#00A6BE`)
|
|||
|
|
- `--color-chart-fixed` (`#BE851F` both)
|
|||
|
|
- `--color-chart-running` (light `#C13B4D`, dark `#D94F60`)
|
|||
|
|
|
|||
|
|
## Cost model
|
|||
|
|
|
|||
|
|
- `lib/profit.ts` is the single source of truth for profit. Default `includeRunningCost: false` (matches workbook). To flip: one-line change in `lib/profit.ts`.
|
|||
|
|
- Term 1 = instalment ✅ confirmed.
|
|||
|
|
- Term 2 = insurance ✅ confirmed.
|
|||
|
|
- Term 3 = operator wages — varies per month per machine — **STILL NEEDS CLIENT INPUT**.
|
|||
|
|
|
|||
|
|
## Open questions
|
|||
|
|
|
|||
|
|
- Q1: Does profit include running cost? (default: no, matches workbook).
|
|||
|
|
- Q2: What is term 3 of the fixed-expense formula? (See Round 1/2/3 HANDOFF-PROMPT files.)
|
|||
|
|
|
|||
|
|
## PocketBase
|
|||
|
|
|
|||
|
|
- URL: `process.env.NEXT_PUBLIC_PB_URL` (env or `.env.local`)
|
|||
|
|
- Auth: `pb.collection("_superusers").authWithPassword(env)` (Round 1 §5.3)
|
|||
|
|
- Collections: `assets`, `monthly_income`, `monthly_running_costs`, `overheads`, `cost_lines`
|
|||
|
|
- `monthly_income` no longer carries `running_cost` — derive from `monthly_running_costs` at read time
|