|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| import Box from "@mui/material/Box";
|
| import { useGame } from "../store.js";
|
| import { INK, ORANGE } from "../theme.js";
|
|
|
| export default function TouchOverlay() {
|
| const touchMode = useGame((s) => s.touchMode);
|
| const entered = useGame((s) => s.entered);
|
| const menuOpen = useGame((s) => s.menuOpen);
|
| const visible = touchMode && entered && !menuOpen;
|
|
|
| return (
|
| <Box
|
| id="touch-ui"
|
| sx={{
|
| display: visible ? "block" : "none",
|
| // Floating-stick zone: sits BELOW the back button in z so its tap
|
| // still lands; the resting stick inside marks the zone when idle.
|
| "& #touch-zone": {
|
| position: "fixed",
|
| left: 0,
|
| right: "50%",
|
| top: "30%",
|
| bottom: 0,
|
| zIndex: 9,
|
| touchAction: "none",
|
| },
|
| "& #touch-stick": {
|
| position: "absolute",
|
| left: "1.3rem",
|
| bottom: "2rem",
|
| width: "8.2rem",
|
| height: "8.2rem",
|
| borderRadius: "50%",
|
| border: "1px solid rgba(255, 255, 255, 0.18)",
|
| background: "rgba(8, 8, 12, 0.4)",
|
| pointerEvents: "none", // the zone owns the pointer
|
| },
|
| "& #touch-stick .nub": {
|
| position: "absolute",
|
| left: "50%",
|
| top: "50%",
|
| width: "3.6rem",
|
| height: "3.6rem",
|
| margin: "-1.8rem 0 0 -1.8rem",
|
| borderRadius: "50%",
|
| border: "1px solid rgba(255, 255, 255, 0.35)",
|
| background: "rgba(255, 255, 255, 0.14)",
|
| pointerEvents: "none",
|
| },
|
| "& #touch-stick.live": { borderColor: "rgba(255, 122, 47, 0.55)" },
|
| "& #touch-stick.live .nub": {
|
| background: "rgba(255, 122, 47, 0.45)",
|
| borderColor: ORANGE,
|
| },
|
| "& #touch-btns": {
|
| position: "fixed",
|
| right: "1.3rem",
|
| bottom: "2.2rem",
|
| zIndex: 12,
|
| width: "9.4rem",
|
| height: "8.4rem",
|
| },
|
| "& .capwrap": {
|
| position: "absolute",
|
| display: "flex",
|
| flexDirection: "column",
|
| alignItems: "center",
|
| gap: "0.3rem",
|
| },
|
| "& .cap-a": { right: 0, top: 0 },
|
| "& .cap-b": { left: 0, bottom: 0 },
|
| "& #touch-btns button": {
|
| appearance: "none",
|
| width: "4.2rem",
|
| height: "4.2rem",
|
| borderRadius: "50%",
|
| border: "1px solid rgba(255, 255, 255, 0.22)",
|
| background: "rgba(8, 8, 12, 0.5)",
|
| color: "rgba(255, 255, 255, 0.85)",
|
| font: "inherit",
|
| fontSize: "1.3rem",
|
| fontWeight: 700,
|
| cursor: "pointer",
|
| touchAction: "none",
|
| userSelect: "none",
|
| WebkitUserSelect: "none",
|
| },
|
| "& #touch-btns button.down": {
|
| background: ORANGE,
|
| borderColor: ORANGE,
|
| color: INK,
|
| },
|
| "& .capwrap span": {
|
| fontSize: "0.55rem",
|
| fontWeight: 600,
|
| letterSpacing: "0.18em",
|
| textTransform: "uppercase",
|
| color: "rgba(255, 255, 255, 0.45)",
|
| },
|
| }}
|
| >
|
| <div id="touch-zone">
|
| <div id="touch-stick">
|
| <div className="nub" />
|
| </div>
|
| </div>
|
| <div id="touch-btns">
|
| <div className="capwrap cap-a">
|
| <button type="button" id="touch-a" aria-label="Kick">A</button>
|
| <span>Kick</span>
|
| </div>
|
| <div className="capwrap cap-b">
|
| <button type="button" id="touch-b" aria-label="Quack">B</button>
|
| <span>Quack</span>
|
| </div>
|
| </div>
|
| </Box>
|
| );
|
| }
|
|
|