diff --git a/crates/cb-render-html/src/doc.rs b/crates/cb-render-html/src/doc.rs
index fae1353..00ae0dc 100644
--- a/crates/cb-render-html/src/doc.rs
+++ b/crates/cb-render-html/src/doc.rs
@@ -467,18 +467,24 @@ fn piles_body(out: &mut String, view: &GroundView) {
/// and drawing the same thing twice is how the two drift.
fn table_svg(view: &GroundView) -> String {
let n = view.players.len().max(1);
- let (cx, cy) = (380.0f64, 300.0f64);
- let seat_r = 240.0f64;
+ // Compact on purpose. The first version was 760x620, which pushed the
+ // action cards a full screen below the Problems -- and you cannot drag
+ // between two things that are never on screen together, which made the
+ // game unplayable. Height is the constraint, not width.
+ let (cx, cy) = (380.0f64, 215.0f64);
+ let (rx, ry) = (200.0f64, 118.0f64);
+ // Seats sit OUTSIDE the table, as people do. The first version put
+ // them at 0.83 of the ellipse and they sat on it.
+ let (sx, sy) = (rx + 108.0, ry + 88.0);
let pos: Vec<(PlayerId, f64, f64)> = view
.players
.keys()
.enumerate()
.map(|(i, p)| {
- // Start at the bottom, not the top: the viewer sits nearest
- // the reader, which is where you sit at a real table.
+ // Start at the bottom: the viewer sits nearest the reader.
let a = std::f64::consts::TAU * (i as f64) / (n as f64) + std::f64::consts::FRAC_PI_2;
- (*p, cx + seat_r * a.cos(), cy + seat_r * a.sin() * 0.72)
+ (*p, cx + sx * a.cos(), cy + sy * a.sin())
})
.collect();
let find = |p: PlayerId| {
@@ -488,12 +494,22 @@ fn table_svg(view: &GroundView) -> String {
};
let mut s = String::from(
- "