# Sprint 13 — SimulationFormPage : layout en 3 tabs (Red Team / SOC / Tâche C2) **Base** : `sprint/12-i18n-fr` (PR #14 ouverte, pas encore mergée). Sprint 13 enchaîne directement. **Worktree** : `.claude/worktrees/sprint-13-sim-tabs/` (dédié — conforme à `feedback_worktree_per_sprint`). **Branch** : `sprint/13-sim-tabs`. **Scope** : frontend uniquement. Backend intouché. Aligné sur le pattern Tabs du sprint 11 (EngagementDetailPage 3→2 tabs) appliqué à SimulationFormPage. --- ## Décisions binding (lockées par user) 1. **Mode création** : 3 tabs visibles mais SOC + Tâche C2 **désactivés** (`aria-disabled="true"`, non-clickables, opacité réduite). Pas de banner ni d'empty-state — juste tab disabled. 2. **Tab SOC** : désactivé tant que la sim n'est pas en `review_required` (ou plus). Force l'opérateur à passer par le RT pour avancer (Mark for review depuis sticky bar RT). 3. **Sticky bar entièrement contextuelle** par tab : - **RT tab** : `[Save, Mark for review]` (et `[Delete]` global, voir plus bas) - **SOC tab** : `[Save SOC, Close]` - **C2 tab** : aucune sticky bar — actions inline (`Execute via C2`, `Import C2 history`) déjà dans le tab content 4. **Count pill sur tab Tâche C2** : nombre exact de tâches C2 (depuis le hook `useSimulationC2Tasks` existant). Caché si 0 ou en mode création. ## Décisions secondaires (à appliquer par défaut) - **Default active tab** : Red Team (premier opérateur surface). - **Wiring URL** : `useHashTab('red-team')` (réutilise sprint 11). Hashes : `#red-team`, `#soc`, `#c2`. - **Delete + Reopen** : pas mentionnés dans la sticky bar contextuelle user. Décision team-lead : - **Delete** sur le tab **RT** (action destructrice côté RT — c'est l'auteur). - **Reopen** sur le tab **SOC** (cohérent avec Close, même actor flow). Visible quand status `done`. - **AlertBanner** (sprint 12) : `Done banner` reste visible au-dessus des tabs (status info, pas tab-spécifique). `SOC-blocked banner` disparaît (remplacé par le mécanisme de tab désactivé). - **C2TasksPanel** (sprint 8) : déplace son rendering DANS le panel du tab C2. Plus en-dessous de la 2-col. - **Header** (back link, title, status badge) : reste **au-dessus** des tabs, intouché. ## Contraintes constantes - Primary `#024ad8` Electric Blue intouchée. - Brutalisme intact : `rounded-none` (exceptions documentées), zéro `transition-*`, zéro `shadow-*`. - DESIGN.md amendments additives uniquement (sub-section "Sub-page tabs with disabled state" si besoin). - Tous les nouveaux labels passent par `i18n/fr.json` (cf. sprint 12) — pas de string EN hardcodée. - `pnpm build` MANDATORY avant push (leçon `feedback_css_apply_tokens`). --- ## Task 1 — Extend Tabs primitive : support `disabled` per item **File** : `frontend/src/components/Tabs.tsx` Current `TabItem` : ```tsx interface TabItem { id: T; label: string; count?: number; } ``` Target : ```tsx interface TabItem { id: T; label: string; count?: number; disabled?: boolean; } ``` Comportement quand `disabled` : - `