}
}
diff --git a/src/components/character/mod.rs b/src/components/character/mod.rs
index b1b834a..d85fa08 100644
--- a/src/components/character/mod.rs
+++ b/src/components/character/mod.rs
@@ -1,8 +1,7 @@
-//! Character page blocks (route `/`): player card, prepared spells and
-//! attunements. The sidebar already carries the detailed editors (names,
-//! class/level/XP, HP, hit dice, death saves, spell slots); this module
-//! renders the page-level view of that data.
+//! Character page blocks (route `/`): prepared spells and attunements.
+//! The sidebar carries the character editors (names, class/level/XP,
+//! HP, hit dice, death saves, spell slots); this module renders the
+//! page-level view.
pub mod attunements;
-pub mod player_card;
pub mod prepared_spells;
diff --git a/src/components/character/player_card.rs b/src/components/character/player_card.rs
deleted file mode 100644
index 29129d0..0000000
--- a/src/components/character/player_card.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use crate::prelude::*;
-use leptos::prelude::*;
-
-/// Read-only player summary: portrait, name, class, level and XP.
-///
-/// The sidebar holds the editors for this data (names, about); this card
-/// presents it at the top of the character page.
-#[component]
-pub fn PlayerCard () -> impl IntoView {
- let state = expect_context::();
- let player = state.player();
-
- let image = player.image();
- let name = player.name();
- let class = player.class();
- let level = player.level();
- let xp = player.xp();
-
- // "First «alias» Last" with the optional parts dropped when empty.
- let display_name = move || {
- let n = name.get();
- let mut s = n.first.clone();
- if n.display_alias() {
- s.push_str(&format!(" «{}»", n.alias));
- }
- if n.display_last() {
- s.push_str(&format!(" {}", n.last));
- }
- s
- };
-
- view! {
-
diff --git a/src/components/sidebar/hit_points.rs b/src/components/sidebar/hit_points.rs
index 1d3df35..0e4d041 100644
--- a/src/components/sidebar/hit_points.rs
+++ b/src/components/sidebar/hit_points.rs
@@ -2,7 +2,8 @@ use crate::prelude::*;
use leptos::prelude::*;
/// Current/max HP with a fill bar, plus temp HP with its own bar.
-/// All three numbers are editable `type="number"` inputs.
+/// All three numbers are editable `type="number"` inputs; AC sits
+/// next to them and is set manually.
#[component]
pub fn HitPoints () -> impl IntoView {
let state = expect_context::();
@@ -11,6 +12,7 @@ pub fn HitPoints () -> impl IntoView {
let hp = player.hp();
let max_hp = player.max_hp();
let temp_hp = player.temp_hp();
+ let ac = player.ac();
// All three inputs parse via `utils::adjust_checked`; invalid text
// restores the previous value.
@@ -26,13 +28,16 @@ pub fn HitPoints () -> impl IntoView {
utils::adjust_checked(ev, temp_hp);
};
+ let adjust_ac = move |ev: Targeted| {
+ utils::adjust_checked(ev, ac);
+ };
+
let pc_hp = move |a: u16, b: u16| -> String {
format!("width: {}%", utils::filled_pc(a, b).min(100.))
};
-
view! {
-