feat(sprint1-step6): polish, landing page, responsive, deploy config

- Landing.jsx : écran d'accueil "Entrer dans le Marais" sur /
- Home.jsx : jeu sur /jeu, click animation float-up, sidebar responsive
- formatNumber.ts : util partagé k/M/B/T (remplace 4 copies locales)
- home.scss : rewrite classes (game-cover, click-zone, tadpole-sprite, game-sidebar)
- Responsive : sidebar fixe desktop, drawer bottom mobile (<768px)
- navbar : wildCoin → resource-counter, auth-nav stylé, dead code supprimé
- GameSync.tsx : bridge useSaveSync ↔ Zustand (câblé dans App)
- tadpole.svg : asset renommé (SantaClause-bag → tadpole)
- deploy/ : Apache vhost SPA+proxy, deploy.sh, ecosystem.config.cjs PM2
- NavBarData : Jeu → /jeu
- Cleanup : dead imports, commentaires legacy
This commit is contained in:
2026-03-20 13:41:09 +01:00
parent 307feb711f
commit 95dca420a5
15 changed files with 2729 additions and 308 deletions

View File

@@ -6,7 +6,8 @@ import "../scss/root.scss";
import PrimaryButton from "./buttons/PrimaryButton";
import Burger from "./burger";
import { useWildCoin } from "./WildCoin/WildCoinContext";
import { useGameStore } from "../store/useGameStore";
import { useAuth } from "../context/AuthContext";
import HUDON from "../../public/NavBar/HUDON.svg";
import HUDOFF from "../../public/NavBar/HUDOFF.svg";
import SnowOn from "../../public/NavBar/SnowOn.svg";
@@ -17,24 +18,20 @@ export default function Navbar({
navData,
isVisible,
setIsVisible,
toggleSnow,
setToggleSnow,
toggleRain,
setToggleRain,
}) {
Navbar.propTypes = {
isVisible: PropTypes.bool,
setIsVisible: PropTypes.function,
setToggleSnow: PropTypes.function,
toggleSnow: PropTypes.bool,
setToggleRain: PropTypes.function,
toggleRain: PropTypes.bool,
}.isRequired;
const { wildCoin } = useWildCoin();
const resources = useGameStore((s) => s.state.resources);
const { user, logout } = useAuth();
const [imageSrc, setImageSrc] = useState(HUDON);
const [snowImageSrc, setSnowImageSrc] = useState(SnowOff);
const [timerVisible, setTimerVisible] = useState(false);
const handleClickWildCoin = () => {
setTimerVisible(true);
};
const toggleHud = () => {
if (!isVisible) {
setIsVisible(true);
@@ -44,12 +41,12 @@ export default function Navbar({
setImageSrc(HUDON);
}
};
function toggleSnowBtn() {
if (toggleSnow === false) {
setToggleSnow(true);
function toggleRainBtn() {
if (toggleRain === false) {
setToggleRain(true);
setSnowImageSrc(SnowOn);
} else {
setToggleSnow(false);
setToggleRain(false);
setSnowImageSrc(SnowOff);
}
}
@@ -59,11 +56,11 @@ export default function Navbar({
className="logo"
to="/"
aria-label="Retourner à la page d'accueil"
title="Logo XmassClick"
title="Logo Clickerz"
/>
<div className="navbar">
<div className="wildCoin">
{new Intl.NumberFormat().format(wildCoin)}
<div className="resource-counter">
{new Intl.NumberFormat().format(Math.floor(resources))}
</div>
<ul className="nav-list">
{navData.map((navIndex) => {
@@ -104,6 +101,18 @@ export default function Navbar({
);
})}
</ul>
{user ? (
<div className="auth-nav">
<span className="auth-nickname">{user.nickname}</span>
<button className="auth-btn" onClick={logout} type="button">
Déconnexion
</button>
</div>
) : (
<Link className="mainLink" to="/login">
Connexion
</Link>
)}
<img
onClick={() => toggleHud()}
src={imageSrc}
@@ -111,7 +120,7 @@ export default function Navbar({
alt="boutton on"
/>
<img
onClick={() => toggleSnowBtn()}
onClick={() => toggleRainBtn()}
src={snowImageSrc}
style={{ height: "28px" }}
alt="boutton on"