- Node 18+
- Dev server:
PORT=3003 npm run dev - Build:
npm run buildanpm start - Statické hostování exportu:
npm run buildanpm run serve:out(http://localhost:4000)
src/app– App Router, stránky a layoutsrc/components– UI komponenty (např.contact-form.tsx)src/components/ui– elementy (Button, Input, Textarea, Label, Card, Section, Container, Spinner)src/app/api/contact/route.ts– serverové odeslání na Discord webhook (envDISCORD_WEBHOOK_URL)public/– statická aktiva (logo, ikony, team avatary vpublic/team/)src/content/*.yaml– YAML data (služby, tým, kontakty)
Formulář volá serverovou route POST /api/contact (validace Zod + rate‑limit 1/3s per IP), která odešle zprávu na Discord webhook z prostředí serveru. Nastavte proměnnou prostředí DISCORD_WEBHOOK_URL v prostředí nasazení. Pro lokální test můžete použít .env.local.
Poznámka k GitHub Pages: output: 'export' = čistě statické hostování – API route se zde nespouští. V tomto prostředí formulář automaticky použije mailto: fallback. Pro serverové odesílání použijte např. Vercel/Netlify/Workers nebo vlastní backend.
src/content/services.yamlasrc/content/team.yamlse validují proti schématům vsrc/lib/yaml.ts(Zod). Nevalidní položky se ignorují. Exportované typy:Service,TeamMember.
- Lint:
npm run lint - Testy:
npm run test - Typecheck:
npm run typecheck - Format (Prettier):
npm run format - Clean:
npm run clean - Analyzer bundlu:
npm run analyze - Release (semver + CHANGELOG):
npm run release
Husky + lint-staged spouští ESLint (fix), related testy a typecheck. SVG v public/ se optimalizují přes SVGO.
- Tmavý, minimalistický vzhled s červeným akcentem (ThinkPad inspirováno)
- Písmo: IBM Plex Sans/Mono (Next Fonts)
- Element-first: používejte komponenty z
src/components/uimísto ad-hoc tříd
Button:{ variant: 'primary'|'secondary'|'ghost', size: 'sm'|'md', loading?: boolean, leftIcon?, rightIcon? }Input,Textarea,Label: přístupné vstupy se sjednoceným stylemCard,CardHeader,CardContent: boxy pro obsahSection,Container: layout sekcí a max-width wrapperSpinner: inline indikátor načítání
- Používejte centrální import ikon přes
Icons:import { Icons } from '@/components/ui'; function Example() { return <Icons.IconMail size={18} />; }
- Přímé importy z
@tabler/icons-reactjsou lintem zakázané (viz ESLint pravidlono-restricted-imports).
© 2025 ThinkHome. Všechna práva vyhrazena.