Barrier + panel bọc trong Stack — render TRONG cây widget (trên Flame).
Không tự bọc Positioned.fill: nơi gọi (vd _Overlay trong
game_screen.dart) chịu trách nhiệm định vị full-screen, để có thể lồng
trong AnimatedSwitcher (Positioned chỉ hợp lệ khi cha trực tiếp là
Stack, còn AnimatedSwitcher bọc mỗi child qua FadeTransition).
A9: panel scale+fade vào thay vì snap hiện tức thì (TweenAnimationBuilder
tự chạy 1 lần lúc mount vì tween bắt đầu từ giá trị mặc định 0).
Slot overlay LUÔN mount (không bọc if bên ngoài) — cho phép animate cả
vào lẫn ra. panel null nghĩa là ẩn (barrier fade ra, panel biến mất
qua AnimatedSwitcher); barrier tách riêng khỏi AnimatedSwitcher của
panel để tránh double-dim khi cross-fade giữa 2 dialog liên tiếp.