✓ Two crowns ✓ Same mass, different density ✓ Vertical slider ✓ Slider works ✓ Slider controls crowns — Slider direction correct ✓ Full slider range — Fall animation ✓ Water displacement ✓ Rising water level ✓ Splash effects ✓ Physics correct ✓ Live mass value ✓ Live volume value ✓ Live density value ✓ Live displaced water ✓ Gilded displaces more ✓ Heureka animation ✓ No external deps ✓ Light bg / dark text ✓ Self-contained HTML
Slider direction is inverted (value=0 at top → crowns in air, value=100 → crowns in water, but `getCrownY` uses `(1 - immersionLevel)` so increasing slider lowers the crown correctly, yet the `writing-mode: bt-lr` / `appearance: slider-vertical` means the slider thumb physically sits at bottom=0/top=100, making top=water — direction is backwards UX-wise); physics values are plausible (gold 19.3 g/cm³, alloy 13.0 g/cm³, same 1000 g mass), but animation is static ASCII with no real falling motion — only a discrete jump — and splash effects are minimal random characters rather than visual particles.
Slider direction is inverted (value=0 at top → crowns in air, value=100 → crowns in water, but `getCrownY` uses `(1 - immersionLevel)` so increasing slider lowers the crown correctly, yet the `writing-mode: bt-lr` / `appearance: slider-vertical` means the slider thumb physically sits at bottom=0/top=100, making top=water — direction is backwards UX-wise); physics values are plausible (gold 19.3 g/cm³, alloy 13.0 g/cm³, same 1000 g mass), but animation is static ASCII with no real falling motion — only a discrete jump — and splash effects are minimal random characters rather than visual particles.