# CLAUDE.md ## Projektová paměť Před začátkem práce si načti relevantní soubory z `memory/`: - `MEMORY.md` — tech stack, architektura, klíčové poznámky - `structure.md` — adresářová struktura, routes, API endpointy - `patterns.md` — coding konvence (frontend i backend), CSS architektura - `modules.md` — detaily modulů (attendance, offers, orders, invoices, projects, atd.) - `design-system.md` — CSS třídy, komponenty, theme tokens - `security.md` — bezpečnostní audit, auth, rate limiting Čti podle typu úkolu — nemusíš vše, ale vždy alespoň `MEMORY.md`. ## Prostředí - **Dev server:** Apache WAMP → `C:\Apache24\htdocs` - **PHP/MySQL:** v systémovém PATH (`php -v`, `mysql -u root`) - **npm:** při instalaci balíčků vždy `--legacy-peer-deps` (eslint peer conflict) - **Deploy (dev):** po každém `npm run build` smaž obsah `C:\Apache24\htdocs` a zkopíruj tam `dist/` - **DB migrace:** SQL soubory ukládej do `sql/`, aplikuj přes `mysql` příkaz ## Coding Standards ### PHP - PSR-12, `strict_types=1` vždy - Typované parametry a návratové typy povinné - Repository pattern pro DB — žádné raw SQL v controllerech - Prepared statements s `?` placeholdery, žádná string interpolace v SQL - PHPStan level 6 musí projít - `vendor/bin/phpcs` (PSR-12) musí projít bez chyb - Docblock PŘED `declare(strict_types=1)`, ne za ním ### React - Funkcionální komponenty, žádné class components (výjimka: `ErrorBoundary.jsx` - React nemá hook pro error boundaries) - Props typované přes interface, ne inline type - Žádné `any` typy - Custom hooks pro business logiku — ne inline useEffect spaghetti - Žádné vnořené ternáry — použít early return, if/else, helper funkci nebo lookup objekt - Striktní porovnání (`===`/`!==`), nikdy `==`/`!=` - API volání vždy přes `apiFetch()` z `../utils/api` — nikdy raw `fetch` (výjimka: `AuthContext.jsx` - auth vrstva používá raw `fetch`, protože `apiFetch` na ní závisí) ### Data konvence - Všechny response klíče **snake_case** (DB sloupce, PHP proměnné, JSON klíče) - `$authData['user_id']` (ne `userId`) - camelCase jen tam, kde to vyžaduje React/JS ekosystém (handlery, hooky, props, state) - Stabilní React keys: `_key` property, nikdy array index ### Error handling - API success: `{ "success": true, "data": {...} }` - API error: `{ "success": false, "error": "message" }` - PHP: `jsonResponse()`, `errorResponse()`, `successResponse()` helpery - Frontend: `alert.success()` / `alert.error()` přes `useAlert()` - Formulářová validace vždy frontend inline — viz sekce níže ### Inline validace formulářů - `has-error` class na `.admin-form-group` + `.admin-form-error` pod inputem - Error message vždy **za inputem** (ne před ním — posouvá layout) - `const [errors, setErrors] = useState({})` — validace v handleSubmit/handleSave, clear na onChange - Povinná pole: `required` class na labelu (červená hvězdička) - Detaily viz `design-system.md` ## Komentáře v kódu - Piš jako programátor, stručně a k věci - Nekomentuj zřejmé věci (`setUser(null)`, `getAccessToken()`) - Nepoužívej em dash (—), používej normální pomlčku (-) - Čeština i angličtina OK, preferuj češtinu u nových komentářů - Komentář jen když přidává info, které nejde vyčíst z kódu (důvod, workaround, gotcha) - Docblocky jen u složitějších funkcí/API endpointů - Žádné komentáře typu `// Set headers`, `// Get input` ## Kontroly před buildem Vždy spusť před `npm run build`: 1. `npx eslint src/` — 0 errors, 0 warnings 2. `vendor/bin/phpcs` — 0 errors (warnings tolerovány, ale nepotlačuj je v nastavení) 3. Build musí projít bez chyb ## Pravidla - Nikdy nečti `.env` soubory - Chrome používej pouze na výslovnou žádost uživatele - Žádné TODO/FIXME v kódu - Žádné `console.log` v kódu — ani po debugování (console.error jen s `import.meta.env.DEV` guardem) - Funkce max 50 řádků — u React komponent se počítá logika, ne JSX template - Permissions: frontend `hasPermission()` + `` guard, backend `requirePermission()`