0d3f037672
Three byte-identical copies of the stable 0..=51 card-id helper (suit_index*13 + rank-1) lived in feedback_anim_plugin, radial_menu, and solitaire_wasm. The WASM copy's own comment notes it MUST match the engine for cross-platform replay parity — exactly the kind of invariant a single source of truth should enforce. Add `solitaire_core::card::card_to_id(&Card) -> u32` and have all three call sites import it. No behaviour change (same formula). cargo test --workspace and cargo clippy --workspace --all-targets -- -D warnings pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>