SPA em React 18 + TypeScript, Vite, TailwindCSS. Tema: preto (#0B0B0B), dourado (#C6A75E), branco (#FFFFFF).
- React, TypeScript, Vite
- TailwindCSS, React Router, Axios
- React Hook Form, Context API (auth)
- JWT no localStorage, interceptor Axios
components/ui: Button, Input, Select, Card, Modal, Badge, Tablecomponents/layout: Layout, Sidebar, Navbarpages/auth: Login, Registerpages/client: Dashboard, Appointments, History, Schedulepages/admin: Dashboard, Barbers, Services, Appointments, Clientspages/barber: Dashboard, Appointments, Availabilityservices: api, authService, clientService, barberService, adminService, appointmentService, serviceServicecontext: AuthContext (role, isBarber)routes: ProtectedRoute (allowedRoles, requireBarber para painel do barbeiro)
Roles: apenas ROLE_ADMIN e ROLE_CLIENT. Barbeiros são admins com isBarber=true; o menu e as rotas /barber/* são exibidos só para eles. Registro público cria apenas clientes.
cp .env.example .env
npm install
npm run devAcesse http://localhost:5173. Com VITE_API_URL vazio, o proxy do Vite envia /api para o backend em 6060.
VITE_API_URL: URL base da API. Vazio = mesmo origin (proxy em dev). Em produção: ex.https://api.americobarber.com
npm run buildPara produção, defina VITE_API_URL no .env com a URL base da API.