From 9bba4729171b2f30d9246eeb4798cb1d682f7633 Mon Sep 17 00:00:00 2001 From: emilis Date: Fri, 20 Feb 2026 00:13:44 +0000 Subject: [PATCH] error enum for errorbox instead of String + setup --- Cargo.lock | 1 + style/icon.scss | 16 ++ style/main.scss | 78 +++++- style/setup.scss | 108 +++++++++ werewolves-proto/src/lib.rs | 6 +- werewolves/Cargo.toml | 1 + werewolves/src/app.rs | 19 +- werewolves/src/app/class.rs | 36 ++- werewolves/src/app/components/error.rs | 10 +- werewolves/src/app/components/icon.rs | 227 ++++++++++++++++++ werewolves/src/app/components/input/number.rs | 10 +- werewolves/src/app/components/nav.rs | 31 ++- werewolves/src/app/error.rs | 20 ++ werewolves/src/app/pages/game.rs | 3 +- werewolves/src/app/pages/game/big.rs | 189 ++++++++++++++- werewolves/src/app/pages/game/big/setup.rs | 170 +++++++++++++ werewolves/src/app/pages/game/host.rs | 8 +- werewolves/src/app/pages/game/host/players.rs | 5 +- .../app/pages/game/host/role_reveal_acks.rs | 10 +- .../src/app/pages/game/host/settings.rs | 3 +- werewolves/src/app/pages/game/player.rs | 12 +- werewolves/src/app/pages/game/player/lobby.rs | 6 +- werewolves/src/app/pages/main.rs | 11 +- werewolves/src/app/pages/signin.rs | 25 +- werewolves/src/app/pages/signup.rs | 22 +- werewolves/src/app/pages/user_settings.rs | 7 +- .../pages/user_settings/change_password.rs | 27 +-- .../app/pages/user_settings/update_profile.rs | 7 +- 28 files changed, 961 insertions(+), 107 deletions(-) create mode 100644 style/icon.scss create mode 100644 style/setup.scss create mode 100644 werewolves/src/app/components/icon.rs create mode 100644 werewolves/src/app/error.rs create mode 100644 werewolves/src/app/pages/game/big/setup.rs diff --git a/Cargo.lock b/Cargo.lock index 4923757..16849c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4061,6 +4061,7 @@ dependencies = [ "serde", "sorted-vec", "sqlx", + "thiserror 2.0.17", "tokio", "tower-http", "uuid", diff --git a/style/icon.scss b/style/icon.scss new file mode 100644 index 0000000..60dc632 --- /dev/null +++ b/style/icon.scss @@ -0,0 +1,16 @@ +.icon-fit { + height: 1em; +} + +.icon { + width: 32px; + height: 32px; + + &:hover { + filter: contrast(120%) brightness(120%); + } +} + +.icon-shrink { + flex-shrink: 1; +} diff --git a/style/main.scss b/style/main.scss index c848c32..e787bdd 100644 --- a/style/main.scss +++ b/style/main.scss @@ -5,17 +5,30 @@ $host_nav_top_pad: 10px; $host_nav_bottom_pad: 10px; $host_nav_total_height: $host_nav_height + $host_nav_top_pad + $host_nav_bottom_pad; -$wolves_color: rgba(255, 0, 0, 0.7); -$village_color: rgba(0, 0, 255, 0.7); +$red1: #f62b5a; +$red2: #ff4b50; +$green1: #47b413; +$green2: #36d450; +$yellow1: #e3c401; +$yellow2: #e9e836; +$blue1: #24acd4; +$blue2: #5dc5f8; +$magenta1: #f2affd; +$magenta2: #feabf2; +$cyan1: #13c299; +$cyan2: #24dfc4; + +$wolves_color: oklch(0.4836 0.1982 28.87); +$village_color: oklch(0.3817 0.261 264.95); $village_border: color.change($village_color, $alpha: 1.0); $wolves_border: color.change($wolves_color, $alpha: 1.0); -$intel_color: color.adjust($village_color, $hue: -30deg); +$intel_color: oklch(0.4556 0.109276 242.5749); $intel_border: color.change($intel_color, $alpha: 1.0); -$defensive_color: rgba(0, 128, 32, 0.9); //color.adjust(rgba(0, 16, 128, 0.9), $hue: -60deg); +$defensive_color: oklch(0.4509 0.077867 189.9496); $defensive_border: color.change($defensive_color, $alpha: 1.0); -$offensive_color: color.adjust($village_color, $hue: 30deg); +$offensive_color: oklch(0.4342 0.2309 298.01); $offensive_border: color.change($offensive_color, $alpha: 1.0); -$starts_as_villager_color: color.adjust($village_color, $hue: 60deg); +$starts_as_villager_color: oklch(0.4864 0.2059 346.12); $starts_as_villager_border: color.change($starts_as_villager_color, $alpha: 1.0); $damned_color: color.adjust($village_color, $hue: 45deg); $damned_border: color.change($damned_color, $alpha: 1.0); @@ -41,6 +54,8 @@ $damned_color_faint: color.change($damned_color, $alpha: 0.1); $drunk_color_faint: color.change($drunk_color, $alpha: 0.1); @import 'faction'; +@import 'setup'; +@import 'icon'; @mixin flexbox() { display: -webkit-box; @@ -57,6 +72,16 @@ body { color: white; } +.big-screen-wrapper { + margin: 0; + height: 100vh; + width: 100vw; + position: absolute; + top: 0; + left: 0; + user-select: none; +} + .error_container { position: fixed; top: 3vh; @@ -861,3 +886,44 @@ form { } } } + + +.category { + text-align: center; + display: flex; + flex-direction: column; + + &.add-list { + @media only screen and (max-width : 599px) { + width: 100%; + } + + @media only screen and (min-width : 600px) { + width: 160px; + } + + .hidden { + display: none; + } + + width: auto; + flex-wrap: wrap; + gap: 1px; + + + &>.title { + font-size: 0.5em !important; + margin-bottom: 0px !important; + cursor: pointer; + } + + .category-list { + gap: 1px; + } + } + + & .title { + text-shadow: black 1px 1px; + margin-bottom: 10px; + } +} diff --git a/style/setup.scss b/style/setup.scss new file mode 100644 index 0000000..f8ef41a --- /dev/null +++ b/style/setup.scss @@ -0,0 +1,108 @@ +.setup-screen { + .inactive { + filter: brightness(0%); + } + + margin: 2%; + font-size: 1.5em; + + .setup { + display: grid; + grid: auto-flow / 1fr 1fr 1fr; + gap: 5vw; + row-gap: 2ch; + } + +} + +.setup-category { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + gap: 0.25ch; + text-align: left; + align-items: center; + + + .title { + padding: 0.1ch; + text-align: center; + text-shadow: black 1px 1px; + width: 100%; + flex-grow: 1; + margin-bottom: 0.25ch; + font-size: 1.25em; + } + + .count { + padding: 0 0.5ch 0 0.5ch; + + &.invisible { + opacity: 0%; + } + } + + .slot { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + + .attributes { + margin-left: 10px; + align-self: flex-end; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + gap: 10px; + } + + .role { + flex-grow: 1; + text-shadow: black 1px 1px; + + width: 100%; + filter: saturate(40%); + padding: 0.25ch 0 0.25ch 1ch; + } + + .wakes { + $wakes_color: oklch(0.9195 0.1839 109.60356514768961); + border: 2px solid $wakes_color; + box-shadow: 0 0 3px $wakes_color; + } + } +} + +.qrcode { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + z-index: 100; + position: fixed; + top: 0; + left: 0; + margin: 5vw; + width: 90vw; + height: 90vh; + gap: 1cm; + + img { + height: 70%; + width: 100%; + } + + .details { + font-size: 5vw; + border: 1px solid $village_border; + background-color: color.change($village_color, $alpha: 0.3); + + text-align: center; + + &>* { + margin-top: 0.5cm; + margin-bottom: 0.5cm; + } + } +} diff --git a/werewolves-proto/src/lib.rs b/werewolves-proto/src/lib.rs index 3128cf2..cf7937c 100644 --- a/werewolves-proto/src/lib.rs +++ b/werewolves-proto/src/lib.rs @@ -125,10 +125,10 @@ macro_rules! id_impl { } impl core::str::FromStr for $name { - type Err = uuid::Error; + type Err = ::uuid::Error; - fn from_str(s: &str) -> core::result::Result { - Ok(Self(uuid::Uuid::from_str(s)?)) + fn from_str(s: &str) -> std::result::Result { + uuid::Uuid::parse_str(s).map(Self) } } }; diff --git a/werewolves/Cargo.toml b/werewolves/Cargo.toml index 60e9ab1..d9f5272 100644 --- a/werewolves/Cargo.toml +++ b/werewolves/Cargo.toml @@ -40,6 +40,7 @@ werewolves-macros.workspace = true werewolves-proto.workspace = true codee.workspace = true convert_case.workspace = true +thiserror.workspace = true sorted-vec.workspace = true [features] diff --git a/werewolves/src/app.rs b/werewolves/src/app.rs index d5f64b4..130a71d 100644 --- a/werewolves/src/app.rs +++ b/werewolves/src/app.rs @@ -10,10 +10,10 @@ pub mod components { } pub mod class; +pub mod error; pub mod storage; use codee::string::JsonSerdeCodec; -use gloo::storage::Storage; use leptos::prelude::*; use leptos_meta::{Link, MetaTags, Stylesheet, Title, provide_meta_context}; use leptos_router::{ @@ -27,7 +27,8 @@ use serde::{Deserialize, Serialize}; use crate::{ app::{ components::{ErrorBox, Nav}, - pages::{GamePage, Main, NotFound, Signin, Signup, UserSettings}, + error::WolfError, + pages::{GamePage, Main, NotFound, Signin, Signup, UserSettings, big::BigScreen}, storage::{ Stored, user::{AuthContext, AuthContextStoreFields}, @@ -96,7 +97,7 @@ pub fn App() -> impl IntoView { .then_some(auth_store.session().get().is_some()) }; let not_logged_in = move || Some(auth_store.session().get().is_none()); - let error = RwSignal::new(None); + let error: RwSignal> = RwSignal::new(None); view! { @@ -109,22 +110,25 @@ pub fn App() -> impl IntoView {