:root { color-scheme: dark; font-family: ui-monospace, "Cascadia Mono", "SFMono-Regular", Menlo, Consolas, monospace; --bg: #090711; --panel: #1d1230; --panel-deep: #110a20; --edge: #674990; --ink: #f6efff; --muted: #b7a8ca; --aqua: #43ead2; --p1: #ffd33d; --p2: #41b6ff; --plant: #45b86b; --plant-dark: #176638; --success: #72e48c; --warning: #ffad38; --vision: #37c9ff; --error: #ff647a; --pause: #9b8cff; --disconnect: #ff9f43; --cell: 40px; --shadow: #040207; } * { box-sizing: border-box; } html, body { margin: 0; min-height: 100%; background: var(--bg); color: var(--ink); } body { overflow-x: hidden; background-image: radial-gradient(circle at 50% -20%, #33194c 0, transparent 42%), linear-gradient(#090711dd, #090711f5), repeating-linear-gradient(0deg, transparent 0 3px, #ffffff05 3px 4px); } button, input { font: inherit; } button, a { -webkit-tap-highlight-color: transparent; } button { color: inherit; } [hidden] { display: none !important; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } #app { min-height: 100dvh; width: min(1180px, 100%); margin: 0 auto; padding: max(12px, env(safe-area-inset-top)) max(12px, env(safe-area-inset-right)) max(12px, env(safe-area-inset-bottom)) max(12px, env(safe-area-inset-left)); } .topbar { position: relative; z-index: 20; min-height: 54px; display: flex; align-items: center; gap: 12px; border-bottom: 2px solid #342347; } .brand { color: var(--ink); text-decoration: none; font-weight: 1000; font-size: clamp(1.1rem, 3vw, 1.45rem); letter-spacing: .14em; text-shadow: 3px 3px 0 #000; } .brand span { color: var(--aqua); } .connection-pill { margin-left: auto; display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: .72rem; text-transform: uppercase; letter-spacing: .05em; } .signal { width: 9px; height: 9px; border-radius: 50%; background: var(--warning); box-shadow: 0 0 10px var(--warning); } .connection-pill[data-state="online"] .signal { background: var(--success); box-shadow: 0 0 10px var(--success); } .connection-pill[data-state="offline"] .signal { background: var(--disconnect); box-shadow: 0 0 10px var(--disconnect); } .icon-button { width: 38px; height: 38px; padding: 8px; border: 1px solid var(--edge); background: var(--panel-deep); cursor: pointer; } .icon-button svg { width: 100%; height: 100%; color: var(--aqua); } .details-panel { position: absolute; z-index: 30; top: 60px; right: max(12px, env(safe-area-inset-right)); display: grid; gap: 6px; width: min(300px, calc(100% - 24px)); padding: 14px; border: 2px solid var(--edge); background: #120b21f5; box-shadow: 6px 6px 0 var(--shadow); font-size: .8rem; } .details-panel span { color: var(--muted); } .details-panel a { color: var(--aqua); } .screen { min-height: calc(100dvh - 90px); animation: screen-in .28s steps(5, end); } .welcome-screen { display: grid; grid-template-columns: minmax(260px, 1fr) minmax(320px, 500px); align-items: center; gap: clamp(24px, 6vw, 90px); padding: 5vh 4vw; } .hero-art { position: relative; min-height: 330px; display: grid; place-items: center; color: var(--aqua); } .hero-art svg { width: min(100%, 460px); filter: drop-shadow(10px 10px 0 #030204); animation: hover 2.4s steps(4, end) infinite; } .pixel-bush { position: absolute; width: 76px; height: 56px; background: var(--plant); box-shadow: 18px -18px 0 var(--plant), 36px 0 0 var(--plant), 18px 18px 0 var(--plant-dark); image-rendering: pixelated; opacity: .8; } .bush-one { left: 3%; bottom: 12%; transform: scale(.8); } .bush-two { right: 4%; top: 12%; transform: scale(.55); } .panel { border: 2px solid var(--edge); background: linear-gradient(145deg, #25163a, var(--panel)); box-shadow: 7px 7px 0 var(--shadow); } .welcome-panel { padding: clamp(22px, 4vw, 42px); } .eyebrow { margin: 0 0 8px; color: var(--aqua); text-transform: uppercase; letter-spacing: .12em; font-size: .72rem; } h1, h2, p { text-wrap: balance; } h1, h2 { margin: 0; text-transform: uppercase; line-height: 1.04; text-shadow: 3px 3px 0 #000; } h1 { font-size: clamp(2rem, 6vw, 4.6rem); } h1 span { color: var(--warning); } h2 { font-size: 1rem; letter-spacing: .06em; } p { color: var(--muted); line-height: 1.55; } label { display: block; margin: 24px 0 7px; color: var(--ink); font-size: .8rem; font-weight: 800; text-transform: uppercase; } input { width: 100%; min-height: 50px; border: 2px solid var(--edge); border-radius: 0; outline: 0; background: #0c0815; padding: 0 14px; color: var(--ink); } input:focus { border-color: var(--aqua); box-shadow: 0 0 0 3px #43ead229; } .button-row { display: flex; gap: 10px; margin-top: 12px; } .button { min-height: 48px; padding: 0 17px; border: 2px solid var(--aqua); border-radius: 0; background: #0f2026; cursor: pointer; font-weight: 900; text-transform: uppercase; box-shadow: 4px 4px 0 var(--shadow); } .button:hover:not(:disabled) { background: #164049; } .button:active:not(:disabled) { transform: translate(3px, 3px); box-shadow: 1px 1px 0 var(--shadow); } .button:disabled { opacity: .4; cursor: not-allowed; } .button.primary { background: var(--aqua); color: #051411; } .button.primary:hover:not(:disabled) { background: #87f6e6; } .button.pending, .dpad button.pending, .drop-key.pending { animation: pending .5s steps(2, end) infinite; } .text-button { margin-top: 20px; border: 0; background: transparent; color: var(--muted); text-decoration: underline; cursor: pointer; } .lobby-screen { padding: clamp(28px, 5vw, 70px) 2vw; } .section-heading { display: flex; align-items: end; justify-content: space-between; gap: 18px; margin-bottom: 24px; } .section-heading h1 { font-size: clamp(1.8rem, 5vw, 3.8rem); } .phase-chip { padding: 9px 12px; border: 1px solid var(--warning); color: var(--warning); background: #2b220b; font-size: .72rem; text-transform: uppercase; } .lobby-grid { display: grid; grid-template-columns: 1.4fr .8fr; gap: 18px; } .lobby-grid .panel { padding: 22px; } .roster-panel { grid-row: span 2; } .player-card { display: grid; grid-template-columns: 54px 1fr 12px; align-items: center; gap: 13px; margin-top: 16px; padding: 14px; border: 1px solid #51386e; background: #100a1b; } .player-card.player-one { border-left: 5px solid var(--p1); } .player-card.player-two { border-left: 5px solid var(--p2); } .avatar { width: 46px; height: 46px; display: grid; place-items: center; border: 2px solid currentColor; background: #0b0712; font-weight: 1000; } .avatar svg { width: 82%; height: 82%; } .player-one .avatar, .identity.player-one .avatar { color: var(--p1); } .player-two .avatar, .identity.player-two .avatar { color: var(--p2); } .player-two .avatar { border-style: dashed; } .player-card strong, .player-card small, .identity strong, .identity small, .stat small, .stat strong { display: block; } .player-card small, .identity small, .stat small { margin-top: 4px; color: var(--muted); font-size: .66rem; } .status-dot { width: 10px; height: 10px; background: var(--error); } .player-card.online .status-dot { background: var(--success); box-shadow: 0 0 9px var(--success); } .observer-panel svg { width: 46px; height: 46px; color: var(--p2); } .observer-panel strong { color: var(--p2); font-size: 1.7rem; } .launch-button { width: 100%; margin-top: 10px; } .match-screen { position: relative; height: calc(100dvh - 78px); min-height: 520px; overflow: hidden; padding-top: 84px; } .player-status { position: absolute; z-index: 8; inset: 10px 0 auto; display: grid; grid-template-columns: minmax(190px, 1.4fr) repeat(3, minmax(120px, .7fr)); gap: 7px; } .identity, .stat { min-height: 68px; display: flex; align-items: center; gap: 10px; padding: 8px 12px; border: 1px solid #543a72; background: #171027eb; backdrop-filter: blur(8px); } .identity .avatar { flex: 0 0 46px; } .stat svg { width: 29px; height: 29px; flex: 0 0 29px; color: var(--aqua); } .stat strong { font-size: .75rem; } .vision-active { border-color: var(--warning); box-shadow: inset 0 0 18px #ffd65a22; } .vision-active svg { color: var(--warning); animation: eye-pulse 1s steps(3, end) infinite; } .compass-stat[data-direction]:not([data-direction="none"]) { border-color: var(--aqua); } #compass-arrow { transition: transform .15s steps(3, end); } .map-shell { position: absolute; inset: 84px 0 0; overflow: hidden; outline: 0; border: 2px solid #2f2041; background-color: #050408; background-image: radial-gradient(circle at center, #161024 0, #050408 72%); touch-action: none; user-select: none; } .map-shell:focus-visible { border-color: var(--aqua); } .unknown-message { position: absolute; inset: 0; display: grid; place-content: center; justify-items: center; gap: 12px; padding: 24px; color: var(--muted); text-align: center; } .unknown-message svg { width: 54px; height: 54px; color: var(--aqua); animation: radar 1.8s linear infinite; } .maze { position: absolute; left: 50%; top: 50%; display: grid; transform: translate(calc(-50% + var(--map-offset-x, 0px)), calc(-50% + var(--map-offset-y, 0px))); } .cell { position: relative; width: var(--cell); height: var(--cell); background: #11131a; border: 4px solid transparent; } .cell.wall-n { border-top-color: var(--plant); box-shadow: inset 0 3px 0 var(--plant-dark); } .cell.wall-e { border-right-color: var(--plant); } .cell.wall-s { border-bottom-color: var(--plant); } .cell.wall-w { border-left-color: var(--plant); } .cell::after { content: ""; position: absolute; inset: 7px; background: #1c1b27; opacity: .55; } .cell.trampled-n::before, .cell.trampled-e::before, .cell.trampled-s::before, .cell.trampled-w::before { content: ""; position: absolute; z-index: 2; background: repeating-linear-gradient(90deg, #254d2d 0 4px, #6f8d43 4px 7px); opacity: .9; } .cell.trampled-n::before { left: 4px; right: 4px; top: -3px; height: 6px; } .cell.trampled-e::before { top: 4px; right: -3px; bottom: 4px; width: 6px; } .cell.trampled-s::before { right: 4px; bottom: -3px; left: 4px; height: 6px; } .cell.trampled-w::before { top: 4px; bottom: 4px; left: -3px; width: 6px; } .cell.bush-impact { z-index: 5; animation: bush-resist .34s steps(3, end); } .cell.bush-stage-2 { filter: saturate(1.25); } .cell.bush-stage-3 { filter: brightness(1.2) saturate(1.4); } .cell.bush-stage-4 { filter: brightness(1.35) saturate(1.65); } .object, .pawn { position: absolute; z-index: 3; inset: 16%; display: grid; place-items: center; } .object svg, .pawn svg { width: 100%; height: 100%; } .object-key { color: var(--p1); } .object-key[data-owner="two"] { color: var(--p2); } .object-key::after { content: ""; position: absolute; right: -4px; bottom: -4px; width: 8px; height: 8px; border: 2px solid currentColor; border-radius: 50%; background: #090711; } .object-key[data-owner="two"]::after { border-radius: 0; transform: rotate(45deg); } .object-exit { inset: 8%; background: #0b0911; } .object-exit[data-owner="one"] { color: var(--p1); } .object-exit[data-owner="two"] { color: var(--p2); } .object-exit[data-owner="two"]::after { content: ""; position: absolute; inset: 6%; border: 2px dashed currentColor; } .object-exit[data-open="1"] { background: #72e48c35; animation: exit-open .8s steps(2, end) infinite; } .object-compass { color: var(--aqua); border: 2px dashed currentColor; border-radius: 50%; } .object-landmark { color: var(--plant); font-size: 1.15rem; text-shadow: 2px 2px #000; } .object-vision { color: var(--vision); border-radius: 50%; background: #37c9ff30; box-shadow: 0 0 10px var(--vision); animation: artifact 1.2s steps(4, end) infinite; } .pawn { inset: 12%; padding: 5%; border: 3px solid currentColor; background: #0b0712; box-shadow: 3px 3px 0 #000; animation: pawn-in .16s steps(2, end); } .pawn-self { color: var(--p1); } .match-screen.player-two-mode .pawn-self { color: var(--p2); } .pawn-opponent { color: var(--p2); } .match-screen.player-two-mode .pawn-opponent { color: var(--p1); } .pawn-owner-two { border-style: dashed; } .wall-bump { position: absolute; inset: 0; z-index: 6; border: 0 solid transparent; pointer-events: none; } .wall-bump.show { border-color: var(--error); } .maze.impact-north { animation: impact-north .28s steps(3, end); } .maze.impact-east { animation: impact-east .28s steps(3, end); } .maze.impact-south { animation: impact-south .28s steps(3, end); } .maze.impact-west { animation: impact-west .28s steps(3, end); } .maze.rate-limited { filter: brightness(.48) blur(2px); transition: filter .12s linear; } [data-reduced-motion="true"] .maze[class*="impact-"] { animation: none; } [data-reduced-motion="true"] .maze.rate-limited { transition: none; } [data-reduced-motion="true"] .wall-bump.show { border-width: 4px; } [data-reduced-motion="true"] .wall-bump.impact-north { border-top-color: var(--error); } [data-reduced-motion="true"] .wall-bump.impact-east { border-right-color: var(--error); } [data-reduced-motion="true"] .wall-bump.impact-south { border-bottom-color: var(--error); } [data-reduced-motion="true"] .wall-bump.impact-west { border-left-color: var(--error); } .avatar-control { position: absolute; z-index: 8; left: var(--player-focal-x, 50%); top: var(--player-focal-y, 50%); width: 96px; height: 96px; margin: -48px; padding: 0; border: 0; border-radius: 50%; background: transparent; cursor: grab; touch-action: none; user-select: none; } .avatar-control:active, .avatar-control.active { cursor: grabbing; } .avatar-handle { position: absolute; left: 50%; top: 50%; width: 52px; height: 52px; display: grid; place-items: center; border: 3px solid currentColor; border-radius: 50%; background: transparent; color: var(--p1); box-shadow: 4px 4px 0 #000, 0 0 0 3px #43ead236; font-size: 1.25rem; font-weight: 1000; transform: translate(-50%, -50%); transition: transform .12s steps(3, end); } .player-two-mode .avatar-handle { color: var(--p2); } .avatar-control.active .avatar-handle { transition: none; } .avatar-player-icon { width: 74%; height: 74%; } .avatar-direction-icon { position: absolute; width: 19px; height: 19px; right: -13px; top: -13px; display: none; padding: 2px; border: 1px solid currentColor; background: #08050b; color: var(--aqua); } .avatar-control[data-direction] .avatar-direction-icon { display: block; } .avatar-control[data-direction="north"] .avatar-direction-icon { transform: rotate(0deg); } .avatar-control[data-direction="east"] .avatar-direction-icon { transform: rotate(90deg); } .avatar-control[data-direction="south"] .avatar-direction-icon { transform: rotate(180deg); } .avatar-control[data-direction="west"] .avatar-direction-icon { transform: rotate(270deg); } .avatar-control[data-speed="fast"] .avatar-handle { box-shadow: 4px 4px 0 #000, 0 0 0 4px var(--aqua), 0 0 18px #43ead299; } .avatar-control[data-speed="slow"] .avatar-handle { box-shadow: 4px 4px 0 #000, 0 0 0 3px #43ead270; } .child-controls { position: absolute; z-index: 12; inset: auto 0 12px; display: flex; align-items: end; justify-content: space-between; padding: 0 16px; pointer-events: none; } .child-controls > * { pointer-events: auto; } .access-controls { position: absolute; z-index: 14; top: 92px; right: 8px; display: grid; gap: 6px; } .access-button { width: 42px; height: 42px; display: grid; place-items: center; border: 2px solid var(--aqua); border-radius: 50%; background: #102a30e8; color: var(--aqua); box-shadow: 3px 3px 0 #020506; } .access-button svg { width: 24px; height: 24px; } .access-button[aria-pressed="true"] { color: var(--warning); border-color: var(--warning); } .onboarding { position: absolute; z-index: 30; inset: 0; display: grid; place-items: center; padding: 18px; background: #08050bd9; } .onboarding-card { width: min(340px, 92%); padding: 20px; border: 3px solid var(--aqua); background: var(--panel-deep); box-shadow: 7px 7px 0 #020103; text-align: center; } .onboarding-icon { width: 104px; height: 104px; color: var(--aqua); animation: guide-hand 1.2s ease-in-out infinite; } .onboarding-card h2 { margin: 12px 0 6px; font-size: 1.35rem; } .onboarding-card p { min-height: 42px; margin: 0; color: var(--muted); } .onboarding-dots { display: flex; justify-content: center; gap: 8px; margin: 10px; } .onboarding-dots span { width: 10px; height: 10px; border: 2px solid var(--aqua); border-radius: 50%; } .onboarding-dots .active { background: var(--aqua); } #onboarding-next { min-width: 108px; min-height: 52px; border: 2px solid var(--aqua); background: var(--aqua); color: #05201c; } #onboarding-skip { display: block; margin: 12px auto 0; border: 0; background: transparent; color: var(--muted); text-decoration: underline; } [data-reduced-motion="true"] * { animation-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .01ms !important; } @media (prefers-reduced-motion: reduce) { * { animation-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .01ms !important; } } .drop-key { position: fixed; z-index: 12; right: max(22px, env(safe-area-inset-right)); top: max(166px, calc(env(safe-area-inset-top) + 150px)); width: 78px; height: 78px; display: grid; grid-template-columns: 26px 1fr; place-content: center; align-items: center; border: 3px solid var(--warning); background: #392c0d; color: var(--warning); box-shadow: 5px 5px 0 #050301; cursor: pointer; } .drop-key svg { width: 25px; height: 25px; } .drop-key strong { font-size: 1.2rem; } .drop-key span { grid-column: 1 / -1; font-size: .56rem; text-transform: uppercase; } .drop-key:disabled { opacity: .48; } .dpad { position: fixed; z-index: 16; right: max(18px, env(safe-area-inset-right)); bottom: max(18px, env(safe-area-inset-bottom)); display: grid; grid-template-columns: repeat(3, 58px); grid-template-rows: repeat(3, 58px); gap: 5px; touch-action: none; user-select: none; -webkit-user-select: none; } .dpad button { min-width: 58px; min-height: 58px; border: 2px solid var(--aqua); background: #102a30df; color: var(--aqua); box-shadow: 4px 4px 0 #020506; cursor: pointer; touch-action: none; user-select: none; -webkit-user-select: none; } .dpad button.active, .dpad button:active { transform: translate(3px, 3px); border-style: dashed; box-shadow: 1px 1px 0 #020506; } .dpad button:disabled { border-color: var(--edge); background: #171027c9; color: var(--muted); opacity: .55; cursor: not-allowed; } .dpad button.pending { outline: 3px solid var(--warning); outline-offset: -5px; } .dpad button:first-child { grid-column: 2; } .dpad button:nth-child(2) { grid-column: 1; grid-row: 2; } .dpad-center { grid-column: 2; grid-row: 2; display: grid; place-items: center; border: 2px solid #3b2951; background: #0d0915d9; color: #5a4174; pointer-events: none; } .dpad button:nth-child(4) { grid-column: 3; grid-row: 2; } .dpad button:last-child { grid-column: 2; grid-row: 3; } .message-rail { position: fixed; top: max(4px, env(safe-area-inset-top)); z-index: 45; left: 50%; width: min(620px, calc(100% - 20px)); transform: translateX(-50%); padding: 8px 14px; border: 2px solid var(--warning); background: #191020f2; color: var(--ink); box-shadow: 4px 4px 0 #020104; font-size: .76rem; text-align: center; pointer-events: none; } .message-rail.error { border-color: var(--error); } .message-rail.success { border-color: var(--success); } .modal { position: fixed; z-index: 50; inset: 0; display: grid; place-items: center; padding: 18px; background: #050308dc; backdrop-filter: blur(5px); } .modal-card { width: min(440px, 100%); padding: 30px; border: 3px solid var(--aqua); background: #130b22; text-align: center; box-shadow: 9px 9px 0 #020103; animation: modal-in .28s steps(4, end); } .modal-card > svg { width: 54px; height: 54px; color: var(--aqua); } .modal-card h2 { font-size: clamp(1.5rem, 7vw, 2.7rem); } .countdown { color: var(--warning); font-size: clamp(5rem, 24vw, 10rem); font-weight: 1000; line-height: 1; text-shadow: 7px 7px 0 #000; animation: count .65s steps(2, end) infinite; } .observer-screen { height: calc(100dvh - 78px); min-height: 678px; overflow: hidden; padding-top: 92px; } .observer-toolbar { position: absolute; z-index: 8; inset: 8px 0 auto; min-height: 76px; display: grid; grid-template-columns: 1fr auto auto; align-items: center; gap: 18px; padding: 9px 12px; border: 1px solid var(--edge); background: #171027eb; } .observer-toolbar h1 { font-size: clamp(1.15rem, 2.8vw, 2.1rem); } .observer-toolbar .eyebrow { margin-bottom: 3px; } .observer-players { display: flex; align-items: center; gap: 12px; color: var(--muted); font-size: .72rem; } .observer-players span { padding: 7px; border: 1px solid #51386e; } .observer-players .player-one { border-color: var(--p1); } .observer-players .player-two { border-color: var(--p2); border-style: dashed; } .observer-players svg { width: 16px; height: 16px; vertical-align: middle; } .zoom-controls { display: flex; gap: 5px; } .zoom-controls button { min-width: 42px; min-height: 38px; border: 1px solid var(--aqua); background: #102a30; color: var(--aqua); cursor: pointer; } .observer-stage { position: absolute; inset: 92px 0 0; overflow: hidden; border: 2px solid #2f2041; background: #050408; cursor: grab; touch-action: none; user-select: none; } .observer-stage.dragging { cursor: grabbing; } .observer-maze { position: absolute; left: 50%; top: 50%; display: grid; transform-origin: center; will-change: transform; } .observer-maze .cell { width: 8px; height: 8px; border-width: 1px; } .observer-maze .cell::after { inset: 2px; } .observer-maze .object { inset: 5%; } .observer-maze .object-key::after { display: none; } .observer-maze .object-landmark { font-size: 6px; } .observer-maze .pawn { inset: -30%; z-index: 5; padding: 1px; border-width: 1px; box-shadow: 1px 1px 0 #000; } .observer-maze .pawn-player-one { color: var(--p1); } .observer-maze .pawn-player-two { color: var(--p2); } .observer-requirement { display: none; position: absolute; inset: 92px 0 0; place-content: center; justify-items: center; gap: 12px; padding: 24px; color: var(--muted); text-align: center; border: 2px solid var(--edge); background: var(--panel-deep); } .observer-requirement svg { width: 58px; height: 58px; color: var(--p2); } .observer-requirement strong { color: var(--ink); font-size: 1.2rem; text-transform: uppercase; } @media (max-width: 1023px), (max-height: 767px) { .observer-toolbar { grid-template-columns: 1fr; } .observer-toolbar > :not(:first-child) { display: none; } .observer-stage { display: none; } .observer-requirement { display: grid; } } @media (max-width: 720px) { :root { --cell: 46px; } html, body { height: 100%; overflow: hidden; } #app { height: 100dvh; min-height: 0; overflow: hidden; padding: max(8px, env(safe-area-inset-top)) max(8px, env(safe-area-inset-right)) max(8px, env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left)); } .welcome-screen { grid-template-columns: 1fr; padding: 28px 2px; } .hero-art { display: none; } .welcome-panel { padding: 22px 18px; } .button-row { flex-direction: column; } .lobby-grid { grid-template-columns: 1fr; } .lobby-screen { padding: 18px 2px; } .lobby-grid { gap: 10px; } .lobby-grid .panel { padding: 14px; } .lobby-screen .section-heading { margin-bottom: 12px; } .player-card { margin-top: 8px; padding: 8px; } .roster-panel { grid-row: auto; } .section-heading { align-items: start; flex-direction: column; } .match-screen { height: calc(100dvh - 70px); min-height: 0; padding-top: 82px; } .player-status { grid-template-columns: 1.25fr repeat(3, .75fr); inset: 6px 0 auto; } .identity, .stat { min-width: 0; min-height: 72px; padding: 5px; flex-direction: column; justify-content: center; text-align: center; gap: 1px; } .identity .avatar { flex-basis: 34px; width: 34px; height: 34px; font-size: 1.4rem; } .identity strong { max-width: 88px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .62rem; } .identity small, .stat small { font-size: .48rem; } .stat strong { font-size: .54rem; } .stat svg { width: 27px; height: 27px; flex-basis: 27px; } .map-shell { inset: 82px 0 0; } .child-controls { bottom: max(14px, env(safe-area-inset-bottom)); padding: 0 10px; } .drop-key { position: relative; top: auto; right: auto; bottom: auto; width: 78px; height: 78px; } .access-controls { top: 88px; right: 8px; } .dpad { right: max(12px, env(safe-area-inset-right)); bottom: max(12px, env(safe-area-inset-bottom)); grid-template-columns: repeat(3, 62px); grid-template-rows: repeat(3, 62px); gap: 5px; } .dpad button { min-width: 62px; min-height: 62px; font-size: 1.3rem; } .connection-pill { font-size: .58rem; } .connection-pill #connection-text { max-width: 145px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } @media (min-width: 721px) and (max-width: 980px) { :root { --cell: 34px; } .player-status { grid-template-columns: 1.2fr repeat(3, .7fr); } } @media (orientation: landscape) and (max-height: 620px) { .topbar { min-height: 44px; } .match-screen { height: calc(100dvh - 68px); padding-top: 64px; } .player-status { inset: 5px 98px auto 0; } .identity, .stat { min-height: 55px; } .map-shell { inset: 64px 0 0; } .drop-key { top: 76px; right: 14px; width: 70px; height: 70px; } .dpad { right: max(12px, env(safe-area-inset-right)); bottom: max(8px, env(safe-area-inset-bottom)); grid-template-columns: repeat(3, 52px); grid-template-rows: repeat(3, 52px); } .dpad button { min-width: 52px; min-height: 52px; } } @media (hover: none) and (pointer: coarse) and (max-height: 720px) { .drop-key { top: auto; bottom: max(14px, env(safe-area-inset-bottom)); } } @keyframes screen-in { from { opacity: 0; transform: translateY(10px); } } @keyframes hover { 50% { transform: translateY(-8px); } } @keyframes pending { 50% { filter: brightness(1.8); } } @keyframes eye-pulse { 50% { transform: scale(1.15); } } @keyframes radar { to { transform: rotate(360deg); } } @keyframes artifact { 50% { transform: scale(.75); box-shadow: 0 0 18px var(--warning); } } @keyframes exit-open { 50% { outline: 3px solid var(--success); } } @keyframes pawn-in { from { transform: scale(.6); } } @keyframes bush-resist { 50% { transform: translateX(3px) rotate(1deg); } } @keyframes impact-north { 50% { transform: translate(calc(-50% + var(--map-offset-x, 0px)), calc(-50% + var(--map-offset-y, 0px) - 10px)); } } @keyframes impact-east { 50% { transform: translate(calc(-50% + var(--map-offset-x, 0px) + 10px), calc(-50% + var(--map-offset-y, 0px))); } } @keyframes impact-south { 50% { transform: translate(calc(-50% + var(--map-offset-x, 0px)), calc(-50% + var(--map-offset-y, 0px) + 10px)); } } @keyframes impact-west { 50% { transform: translate(calc(-50% + var(--map-offset-x, 0px) - 10px), calc(-50% + var(--map-offset-y, 0px))); } } @keyframes bump { 0%, 100% { opacity: 0; } 20%, 75% { opacity: 1; transform: translateX(-50%) translateX(4px); } 45% { transform: translateX(-50%) translateX(-4px); } } @keyframes modal-in { from { opacity: 0; transform: scale(.82); } } @keyframes count { 50% { transform: scale(1.08); } } @keyframes guide-hand { 50% { transform: translate(18px, -12px); } }