diff --git a/docs/ui-ux-audit-2026-04-20.md b/docs/ui-ux-audit-2026-04-20.md new file mode 100644 index 0000000..1bb1562 --- /dev/null +++ b/docs/ui-ux-audit-2026-04-20.md @@ -0,0 +1,87 @@ +# Audit UI/UX transverse - 2026-04-20 + +## Périmètre audité + +Front React complet sous `src/components`: +- `agents/*` +- `projects/*` +- `tickets/*` +- `trackers/*` +- `settings/*` +- `layout/*` + +## Incohérences détectées (avant refactor) + +1. Boutons d'action dupliqués avec variations de couleurs et de tailles selon les pages (`bg-blue-600`, `bg-gray-900`, `bg-red-100`, etc.). +2. Champs de formulaire répétés avec plusieurs variantes de classes (`input`, `select`, `textarea`) non centralisées. +3. Cartes/blocs de contenu dupliqués (`rounded-lg border border-gray-200 bg-white p-4`) avec petites divergences de spacing. +4. Alertes (`error`, `warning`, `success`, `info`) construites page par page avec des styles proches mais non unifiés. +5. Badges de statut ticket réimplémentés dans plusieurs pages avec logique dupliquée et couverture de statuts non homogène. + +## Composants réutilisés sur plusieurs pages + +### 1) Boutons (multi-pages) + +Usage sur: +- Agents: `AgentList`, `AgentForm` +- Projets: `ProjectForm`, `ProjectDashboard`, `ProjectGraylog`, `ProjectLiveAgent`, `ProjectModules`, `ProjectTasks` +- Tickets: `TicketList`, `TicketDetail` +- Trackers: `TrackerConfig`, `TrackerList`, `FilterBuilder` +- Settings: `SettingsPage` +- Layout: `WindowControls`, `NotificationCenter` +- UI: `ConfirmModal` + +Unification appliquée: +- Ajout de `buttonClass()` dans [`src/components/ui/primitives.ts`](/home/leclere/Projets/IA/orchai/src/components/ui/primitives.ts) +- Variantes centralisées: `primary`, `secondary`, `danger`, `dangerSoft`, `neutralDark`, `success`, `ghost` +- Tailles centralisées: `xs`, `sm`, `md`, `icon` + +### 2) Formulaires (input/select/textarea + labels) + +Usage sur: +- `AgentForm`, `ProjectForm`, `SettingsPage`, `TrackerConfig`, `ProjectGraylog`, `ProjectLiveAgent`, `ProjectTasks`, `TicketDetail`, `FilterBuilder` + +Unification appliquée: +- `labelClass`, `inputClass`, `textAreaClass` dans [`src/components/ui/primitives.ts`](/home/leclere/Projets/IA/orchai/src/components/ui/primitives.ts) +- Remplacement des classes inline répétées par ces styles partagés. + +### 3) Cartes de contenu + +Usage sur: +- `ProjectDashboard`, `ProjectGraylog`, `ProjectLiveAgent`, `ProjectModules`, `ProjectTasks`, `TrackerConfig`, `TrackerList`, `TicketList`, `TicketDetail`, `AgentList` + +Unification appliquée: +- `cardClass` / `cardContentClass` dans [`src/components/ui/primitives.ts`](/home/leclere/Projets/IA/orchai/src/components/ui/primitives.ts) +- Réemploi des mêmes classes de surface sur les pages. + +### 4) Alertes (erreur/succès/warning/info) + +Usage sur: +- `AgentForm`, `AgentList`, `ProjectForm`, `ProjectGraylog`, `ProjectLiveAgent`, `ProjectModules`, `ProjectTasks`, `SettingsPage`, `TrackerConfig`, `TicketDetail` + +Unification appliquée: +- `noticeClass(tone, compact)` dans [`src/components/ui/primitives.ts`](/home/leclere/Projets/IA/orchai/src/components/ui/primitives.ts) +- Tons standards: `error`, `success`, `warning`, `info`. + +### 5) Badges de statut ticket + +Usage sur: +- `TicketList`, `TicketDetail`, `ProjectDashboard` + +Unification appliquée: +- Nouveau composant [`src/components/ui/TicketStatusBadge.tsx`](/home/leclere/Projets/IA/orchai/src/components/ui/TicketStatusBadge.tsx) +- Mapping de statuts mutualisé via `ticketStatusClass()` +- Suppression des mappings locaux dupliqués dans les pages tickets/dashboard. + +## Méthode de génération commune + +Oui, pour les composants réutilisés multi-pages identifiés, la génération du style passe désormais par une couche commune: +- `primitives.ts` pour les patterns UI transverses +- `TicketStatusBadge.tsx` pour les badges de statuts ticket + +Cela réduit la divergence visuelle et simplifie les évolutions de design futures. + +## Limites / reste à harmoniser + +1. Certaines zones très contextuelles (ex: bulles de conversation live, badges de session archivée, blocs de diff) conservent des styles spécifiques, volontairement. +2. Une seconde passe peut encore factoriser quelques micro-patterns (ex: tabs, badges non-ticket, liens d'action inline) si nécessaire. diff --git a/src/components/agents/AgentForm.tsx b/src/components/agents/AgentForm.tsx index 8af623e..9f437f4 100644 --- a/src/components/agents/AgentForm.tsx +++ b/src/components/agents/AgentForm.tsx @@ -3,6 +3,14 @@ import { useNavigate, useParams } from "react-router-dom"; import { createAgent, getAgent, improveAgentPrompt, updateAgent } from "../../lib/api"; import { getErrorMessage } from "../../lib/errors"; import type { AgentRole, AgentTool } from "../../lib/types"; +import { + buttonClass, + inputClass, + labelClass, + noticeClass, + pageTitleClass, + textAreaClass, +} from "../ui/primitives"; export default function AgentForm() { const navigate = useNavigate(); @@ -76,36 +84,36 @@ export default function AgentForm() { return (