+ );
+}
diff --git a/src/index.css b/src/index.css
index a32c152..763ef06 100644
--- a/src/index.css
+++ b/src/index.css
@@ -391,6 +391,77 @@ canvas {
letter-spacing: 0.03em;
}
+.game-state-hud {
+ position: fixed;
+ top: 18px;
+ right: 18px;
+ z-index: 20;
+ display: grid;
+ gap: 12px;
+ width: min(320px, calc(100vw - 36px));
+ padding: 14px;
+ border: 1px solid rgba(255, 255, 255, 0.18);
+ border-radius: 18px;
+ background: rgba(4, 7, 13, 0.78);
+ box-shadow: 0 18px 60px rgba(0, 0, 0, 0.35);
+ color: #f8fafc;
+ backdrop-filter: blur(16px);
+}
+
+.game-state-hud__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+
+.game-state-hud__header span,
+.game-state-hud__detail {
+ color: rgba(248, 250, 252, 0.68);
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.game-state-hud__header strong {
+ font-size: 16px;
+ letter-spacing: -0.03em;
+ text-transform: uppercase;
+}
+
+.game-state-hud__detail {
+ margin: 0;
+ text-transform: none;
+}
+
+.game-state-hud__states,
+.game-state-hud__actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.game-state-hud button {
+ min-height: 32px;
+ padding: 0 10px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.08);
+ color: #f8fafc;
+ font-size: 12px;
+ font-weight: 700;
+ cursor: pointer;
+}
+
+.game-state-hud button:hover,
+.game-state-hud button:focus-visible,
+.game-state-hud button.is-active {
+ border-color: rgba(125, 211, 252, 0.75);
+ background: rgba(125, 211, 252, 0.18);
+ outline: none;
+}
+
/* Editor page */
.editor-container {
position: fixed;
diff --git a/src/managers/stores/useGameStore.ts b/src/managers/stores/useGameStore.ts
index 6d0e8fd..78e683e 100644
--- a/src/managers/stores/useGameStore.ts
+++ b/src/managers/stores/useGameStore.ts
@@ -1,7 +1,14 @@
import { create } from "zustand";
export type MainGameState = "intro" | "bike" | "pylone" | "ferme" | "outro";
-export type MissionStep = "locked" | "inspect" | "repair" | "done";
+export type MissionStep =
+ | "locked"
+ | "waiting"
+ | "inspected"
+ | "fragmented"
+ | "scanning"
+ | "repairing"
+ | "done";
export interface IntroState {
dialogueAudio: string | null;
@@ -39,31 +46,54 @@ interface GameActions {
setPyloneState: (pylone: Partial