- // ── Top bar ──────────────────────────────────────────────────────
-
-
{move || if is_bot_game {
- t_string!(i18n, vs_bot_label).to_owned()
- } else {
- t_string!(i18n, room_label, id = room_id.as_str())
- }}
-
-
-
-
-
{t!(i18n, quit)}
-
-
- // ── Opponent score (above board) ─────────────────────────────────
-
-
- // ── Status bar — full width, above board (§10b) ──────────────────
-
- {move || {
- if let Some(ref reason) = pause_reason {
- return String::from(match reason {
- PauseReason::AfterOpponentRoll => t_string!(i18n, after_opponent_roll),
- PauseReason::AfterOpponentGo => t_string!(i18n, after_opponent_go),
- PauseReason::AfterOpponentMove => t_string!(i18n, after_opponent_move),
- });
- }
- let n = staged_moves.get().len();
- if is_move_stage {
- t_string!(i18n, select_move, n = n + 1)
- } else {
- String::from(match (&stage, is_my_turn, &turn_stage) {
- (SerStage::Ended, _, _) => t_string!(i18n, game_over),
- (SerStage::PreGame, _, _) => t_string!(i18n, waiting_for_opponent),
- (SerStage::InGame, true, SerTurnStage::RollDice) => t_string!(i18n, your_turn_roll),
- (SerStage::InGame, true, SerTurnStage::HoldOrGoChoice) => t_string!(i18n, hold_or_go),
- (SerStage::InGame, true, _) => t_string!(i18n, your_turn),
- (SerStage::InGame, false, _) => t_string!(i18n, opponent_turn),
- })
- }
- }}
-
-
- // ── Contextual sub-prompt (§8a) ──────────────────────────────────
- {move || {
- let hint: String = if waiting_for_confirm {
- t_string!(i18n, hint_continue).to_owned()
- } else if is_move_stage {
- t_string!(i18n, hint_move).to_owned()
- } else if is_my_turn && turn_stage_for_sub == SerTurnStage::HoldOrGoChoice {
- t_string!(i18n, hint_hold_or_go).to_owned()
- } else {
- String::new()
- };
- (!hint.is_empty()).then(|| view! {
{hint}
})
- }}
-
- // ── Board + side panel ───────────────────────────────────────────
-
-
-
- // ── Side panel (scoring panels only) ─────────────────────────
-
- {my_scored_event.map(|event| view! {
-
- })}
- {opp_scored_event.map(|event| view! {
-
- })}
-
-
-
- // ── Action buttons below board (§10c) ────────────────────────────
-
- {waiting_for_confirm.then(|| view! {
-
- })}
- // Fallback Go button when no scoring panel (e.g. after reconnect)
- {show_hold_go.then(|| view! {
-
- })}
- {move || {
- // Show the empty-move button only when (0,0) is a valid
- // first or second move given what has already been staged.
- let staged = staged_moves.get();
- let show = is_move_stage && staged.len() < 2 && (
- valid_seqs_empty.is_empty() || match staged.len() {
- 0 => valid_seqs_empty.iter().any(|(m1, _)| m1.get_from() == 0),
- 1 => {
- let (f0, t0) = staged[0];
- valid_seqs_empty.iter()
- .filter(|(m1, _)| {
- m1.get_from() as u8 == f0
- && m1.get_to() as u8 == t0
- })
- .any(|(_, m2)| m2.get_from() == 0)
- }
- _ => false,
- }
- );
- show.then(|| view! {
-
- })
- }}
-
-
- // ── Player score (below board) ────────────────────────────────────
-
-
- // ── Game-over overlay ─────────────────────────────────────────────
- {stage_is_ended.then(|| {
- let opp_name_end_clone = opp_name_end.clone();
- let winner_text = move || if winner_is_me {
- t_string!(i18n, you_win).to_owned()
- } else {
- t_string!(i18n, opp_wins, name = opp_name_end_clone.as_str())
- };
- view! {
-
-
-
{t!(i18n, game_over)}
-
{winner_text}
-
- {my_name_end}
-
- {format!("{my_holes_end} — {opp_holes_end}")}
-
- {opp_name_end.clone()}
-
-
-
- {is_bot_game.then(|| view! {
-
- })}
-
-
-
- }
- })}
-
- // ── Hole toast (§6a) — board-centered overlay when a hole is won ──
- {hole_toast_info.map(|(holes_total, bredouille)| view! {
-
-
"Trou !"
-
{format!("{holes_total} / 12")}
- {bredouille.then(|| view! {
-
"× 2 bredouille"
- })}
-
- })}
-
- }
-}
diff --git a/client_web/src/components/login_screen.rs b/client_web/src/components/login_screen.rs
deleted file mode 100644
index 1f70887..0000000
--- a/client_web/src/components/login_screen.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-use futures::channel::mpsc::UnboundedSender;
-use leptos::prelude::*;
-
-use crate::app::NetCommand;
-use crate::i18n::*;
-
-#[component]
-pub fn LoginScreen(error: Option