···27272828 /// Eye mood baseline offset from center. Positive = eyes higher.
2929 pub mood: i32,
3030+ /// Horizontal offset for both eyes. Positive = glance right, negative = left.
3131+ #[serde(default)]
3232+ pub glance: i32,
3033 pub left_eye: EyeState,
3134 pub right_eye: EyeState,
3235···8083 let left_eye_row = clamp_to_body(eye_baseline - c.left_eye.offset, c.height);
8184 let right_eye_row = clamp_to_body(eye_baseline - c.right_eye.offset, c.height);
82858383- // Eyes sit at ~1/3 and ~2/3 across the body width.
8484- let left_eye_col = c.width / 3;
8585- let right_eye_col = c.width - 1 - (c.width / 3);
8686+ // Eyes sit at ~1/3 and ~2/3 across the body width, shifted by glance.
8787+ // Clamped to stay within the body after corner rounding.
8888+ let base_left_col = c.width as i32 / 3 + c.glance;
8989+ let base_right_col = (c.width as i32 - 1 - c.width as i32 / 3) + c.glance;
9090+ let left_eye_col = base_left_col.clamp(1, c.width as i32 - 2) as usize;
9191+ let right_eye_col = base_right_col.clamp(1, c.width as i32 - 2) as usize;
86928793 // ── Arm positions ───────────────────────────────────────────────────
8894 // Arms default to one row below the lower eye.