From 2c94e4f3aaabe5a58347233449eaff049cb7d112 Mon Sep 17 00:00:00 2001 From: Tetardtek Date: Tue, 24 Mar 2026 23:54:06 +0100 Subject: [PATCH] =?UTF-8?q?refacto:=20migration=20Tailwind=20=E2=80=94=20c?= =?UTF-8?q?omposants=20(6=20fichiers)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RarityBadge, RarityDot → Tailwind classes - MonsterCard → flex/text-rpg-* classes - CreateCharacter → full Tailwind (max-w, grid, gap) - Onboarding → Tailwind + responsive grid-cols-1 mobile - CombatViews (Log+Multi+History) → Tailwind - NotFoundPage → full Tailwind - Pattern posé : couleurs dynamiques en style, layout en classes --- frontend/src/components/CombatViews.tsx | 56 +++++++---------- frontend/src/components/CreateCharacter.tsx | 30 +++++---- frontend/src/components/MonsterCard.tsx | 13 ++-- frontend/src/components/Onboarding.tsx | 68 +++++---------------- frontend/src/components/RarityBadge.tsx | 18 +++--- frontend/src/pages/NotFoundPage.tsx | 32 +++------- 6 files changed, 77 insertions(+), 140 deletions(-) diff --git a/frontend/src/components/CombatViews.tsx b/frontend/src/components/CombatViews.tsx index 85f399b..0d1fea0 100644 --- a/frontend/src/components/CombatViews.tsx +++ b/frontend/src/components/CombatViews.tsx @@ -4,31 +4,31 @@ import { Trophy, Skull } from 'lucide-react'; export function CombatLogView({ result }: { result: CombatResult }) { const won = result.winner === 'player'; return ( -
-
+
+
{won - ?
- + ?
+ Victoire ! +{result.rewards.xp} XP +{result.rewards.gold} or
- :
- + :
+ Défaite… Retour à l'auberge
} {result.rewards.loot && ( -
+
🎁 Loot : {result.rewards.loot.name} ×{result.rewards.loot.quantity}
)} {result.rewards.levelUp && ( -
+
🎉 LEVEL UP ! Niveau {result.rewards.newLevel} — +{result.rewards.statPointsGained} points de stats
)}
-

+

Log — {result.rounds.length} tour{result.rounds.length > 1 ? 's' : ''}

@@ -37,15 +37,11 @@ export function CombatLogView({ result }: { result: CombatResult }) { const cls = line.includes('CRITIQUE') ? 'log-crit' : line.includes('esquive') ? 'log-crit' : line.includes('HP') ? 'log-system' - : i === 0 ? 'log-player' - : 'log-monster'; + : i === 0 ? 'log-player' : 'log-monster'; return
[T{r.round}] {line}
; }) )} - {won - ?
══ Victoire ══
- :
══ Défaite ══
- } +
══ {won ? 'Victoire' : 'Défaite'} ══
); @@ -54,30 +50,24 @@ export function CombatLogView({ result }: { result: CombatResult }) { export function MultiCombatView({ result }: { result: MultiCombatResult }) { const t = result.totals; return ( -
-
-
0 ? '#e84040' : '#3ddc84' }}> - {t.losses > 0 ? : } +
+
+
0 ? 'text-rpg-red' : 'text-rpg-green'}`}> + {t.losses > 0 ? : } {result.count} combat{result.count > 1 ? 's' : ''} — {t.wins}V / {t.losses}D
-
+
+{t.xp} XP +{t.gold} Or - {t.goldLost > 0 && −{t.goldLost} Or} + {t.goldLost > 0 && −{t.goldLost} Or}
{t.levelsGained > 0 && ( -
- 🎉 {t.levelsGained} level up{t.levelsGained > 1 ? 's' : ''} ! -
+
🎉 {t.levelsGained} level up{t.levelsGained > 1 ? 's' : ''} !
)} {t.loot.length > 0 && ( -
- 🎁 Loot : {t.loot.reduce((sum, l) => sum + l.quantity, 0)} matériaux -
+
🎁 Loot : {t.loot.reduce((sum, l) => sum + l.quantity, 0)} matériaux
)} {t.losses > 0 && ( -
- Série interrompue par une défaite -
+
Série interrompue par une défaite
)}
@@ -86,11 +76,11 @@ export function MultiCombatView({ result }: { result: MultiCombatResult }) { export function HistoryEntry({ h }: { h: CombatLog }) { return ( -
- +
+ {h.winner === 'player' ? '✓' : '✗'} {h.monster.name} - + {h.winner === 'player' ? `+${h.xpEarned}xp +${h.goldEarned}or${h.lootQuantity > 0 ? ` 🎁×${h.lootQuantity}` : ''}` : `${h.totalRounds} tours` diff --git a/frontend/src/components/CreateCharacter.tsx b/frontend/src/components/CreateCharacter.tsx index 0b06cc9..514a923 100644 --- a/frontend/src/components/CreateCharacter.tsx +++ b/frontend/src/components/CreateCharacter.tsx @@ -25,45 +25,43 @@ export function CreateCharacter() { }; return ( -
-
-

Créer ton personnage

-

+

+
+

Créer ton personnage

+

{remaining > 0 ? `${remaining} point${remaining > 1 ? 's' : ''} à répartir` : 'Tous les points répartis'}

setName(e.target.value)} - style={{ marginBottom: '1rem' }} maxLength={30} /> -
+
{STATS.map(s => ( -
- {STAT_LABELS[s]} -
- - {pts[s]} - +
+ {STAT_LABELS[s]} +
+ + {pts[s]} +
))}
- {mut.isError &&

{(mut.error as Error).message}

} + {mut.isError &&

{(mut.error as Error).message}

}
); diff --git a/frontend/src/components/MonsterCard.tsx b/frontend/src/components/MonsterCard.tsx index b695d2d..0ddac59 100644 --- a/frontend/src/components/MonsterCard.tsx +++ b/frontend/src/components/MonsterCard.tsx @@ -7,24 +7,23 @@ export function MonsterCard({ m, selected, onSelect, playerLevel }: { return (
-
- {m.name} - +
+ {m.name} + Niv. {m.minLevel}–{m.maxLevel}
-
+
❤️ {m.hp} ⚔️ {m.attack} 🛡️ {m.defense} ⭐ {m.xpReward} XP 💰 {m.goldMin}–{m.goldMax}
- {tooHard &&
Niveau trop élevé
} + {tooHard &&
Niveau trop élevé
}
); } diff --git a/frontend/src/components/Onboarding.tsx b/frontend/src/components/Onboarding.tsx index e83338f..a51f840 100644 --- a/frontend/src/components/Onboarding.tsx +++ b/frontend/src/components/Onboarding.tsx @@ -3,84 +3,48 @@ import { useNavigate } from 'react-router-dom'; import { Swords, Scroll, Hammer, BookOpen, ChevronRight } from 'lucide-react'; const STEPS = [ - { - icon: Scroll, - title: 'Accepte une quête', - desc: 'Les quêtes te guident dans ton aventure et donnent le plus d\'XP. Commence par les quêtes des Marais.', - cta: 'Voir les quêtes', - to: '/quests', - }, - { - icon: Swords, - title: 'Combats un monstre', - desc: 'Chaque combat coûte 5 endurance. Tu gagneras de l\'XP, de l\'or et des matériaux pour crafter.', - cta: 'Aller au combat', - to: '/combat', - }, - { - icon: Hammer, - title: 'Craft ton équipement', - desc: 'Avec les matériaux droppés, fabrique des armes et armures plus puissantes que celles de la boutique.', - cta: 'Voir l\'artisanat', - to: '/craft', - }, - { - icon: BookOpen, - title: 'Consulte le guide', - desc: 'Le guide contient tout : bestiaire, recettes, zones, forge. Accessible depuis le bouton 📖 en bas de la sidebar.', - cta: 'Ouvrir le guide', - to: '/guide', - }, + { icon: Scroll, title: 'Accepte une quête', desc: 'Les quêtes te guident et donnent le plus d\'XP. Commence par les Marais.', cta: 'Voir les quêtes', to: '/quests' }, + { icon: Swords, title: 'Combats un monstre', desc: 'Chaque combat coûte 5 endurance. Tu gagneras XP, or et matériaux.', cta: 'Aller au combat', to: '/combat' }, + { icon: Hammer, title: 'Craft ton équipement', desc: 'Avec les matériaux droppés, fabrique des armes plus puissantes.', cta: 'Voir l\'artisanat', to: '/craft' }, + { icon: BookOpen, title: 'Consulte le guide', desc: 'Bestiaire, recettes, zones, forge — tout est dans le guide.', cta: 'Ouvrir le guide', to: '/guide' }, ]; export function Onboarding({ level, onDismiss }: { level: number; onDismiss: () => void }) { const navigate = useNavigate(); const [dismissed, setDismissed] = useState(false); - // Ne montrer que pour les joueurs niveau 1-3 if (level > 3 || dismissed) return null; return ( -
-
-

- Bienvenue, aventurier ! -

+
+
+

Bienvenue, aventurier !

-

+

Voici les premières étapes pour bien démarrer ton aventure dans les Marais.

-
+
{STEPS.map((step, i) => { const Icon = step.icon; return ( -
-

- - Zone inconnue — coordonnées introuvables +

+ Zone inconnue — coordonnées introuvables

);