diff --git a/assets/main.css b/assets/main.css index 048a92a..24574bc 100644 --- a/assets/main.css +++ b/assets/main.css @@ -1,22 +1,28 @@ /* App-wide styling */ +html, body, #main { + margin: 0; + padding: 0; + height: 100%; +} body { background-color: #efeffc; color: #000000; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - margin: 20px; } main { margin: auto; max-width: 40rem; - justify-content: center; + justify-content: space-between; display: flex; flex-direction: column; + height: 100%; } table { border-collapse: collapse; border-spacing: 0; + margin: 3rem 0; } tr { @@ -26,6 +32,16 @@ tr { td { border: 1px solid gray; text-align: center; + padding: 2px; +} + +#controls { + margin: 3rem 0; + display: flex; +} + +#controls > * { + flex: 1 1 auto; } .number { diff --git a/src/main.rs b/src/main.rs index 669dc7c..3a89f71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,16 +15,20 @@ impl State { if self.rows.is_empty() { self.rows.push(Vec::new()); } - let row = match self.rows.last_mut() { - Some(row) if row.len() > 1 && row.last().copied() == Some(5) => { - self.rows.push(Vec::new()); - self.rows.last_mut().unwrap() - } - Some(row) => row, - None => unreachable!(), - }; + let row = self.rows.last_mut().unwrap(); row.push(rand::thread_rng().gen_range(1..=6)); } + + pub fn row_finished(&self) -> bool { + match self.rows.last() { + Some(row) => row.len() > 1 && row.last().copied() == Some(5), + None => true, + } + } + + pub fn new_row(&mut self) { + self.rows.push(Vec::new()); + } } fn main() { @@ -34,7 +38,7 @@ fn main() { #[component] fn App() -> Element { let mut rows = use_signal(State::default); - let snow = true; + let snow = false; rsx! { document::Link { rel: "icon", href: FAVICON } document::Link { rel: "stylesheet", href: MAIN_CSS } @@ -49,16 +53,33 @@ fn App() -> Element { tr { th { colspan: 100, "Game 1" } } - for row in &rows().rows { + for row in &rows.read().rows { tr { for number in &row { td { class: "number", "{number}" } } + td { + class: "number", + colspan: (19 - row.len()).to_string() + } + td { + class: "number", + b { + {row.iter().copied().sum::<u8>().to_string()} + } + } } } } } - button { onclick: move |_| rows.write().roll(), "Roll" } + div { + id: "controls", + if rows.read().row_finished() { + button { onclick: move |_| rows.write().new_row(), "Start new row" } + } else { + button { onclick: move |_| rows.write().roll(), "Roll" } + } + } } if snow { Snow {}