diff --git a/styles.css b/styles.css
index 8fc3abd..4bc0478 100644
--- a/styles.css
+++ b/styles.css
@@ -2131,3 +2131,192 @@ textarea:focus {
justify-self: end;
}
}
+
+/* Lock chrono and cube to the visual viewport to avoid iOS bottom gaps. */
+body[data-page="chrono"],
+body[data-page="cube"] {
+ position: fixed;
+ inset: 0;
+ width: 100%;
+ min-height: var(--app-viewport-height, 100dvh);
+ height: var(--app-viewport-height, 100dvh);
+ max-height: var(--app-viewport-height, 100dvh);
+ overflow: hidden;
+ overscroll-behavior: none;
+}
+
+body[data-page="chrono"] .chrono-stage,
+body[data-page="cube"] .cube-shell {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ min-width: 0;
+ margin: 0;
+ min-height: 100%;
+ height: 100%;
+ max-height: 100%;
+ display: grid;
+ grid-template-rows: auto auto minmax(0, 1fr);
+ gap: 0.55rem;
+ padding:
+ calc(var(--phase-top-offset) + 0.55rem)
+ calc(var(--safe-right) + 0.5rem)
+ calc(var(--safe-bottom) + 0.55rem)
+ calc(var(--safe-left) + 0.5rem);
+ overflow: hidden;
+}
+
+body[data-page="chrono"] .faceoff-board,
+body[data-page="cube"] .faceoff-board {
+ min-height: 0;
+ height: 100%;
+ align-self: stretch;
+}
+
+body[data-page="chrono"] .status-strip {
+ flex: 0 0 auto;
+}
+
+body[data-page="chrono"] .player-zone,
+body[data-page="chrono"] .phase-spine {
+ min-height: 0;
+ display: flex;
+}
+
+body[data-page="chrono"] .zone-inner {
+ flex: 1 1 auto;
+ min-height: 0;
+ display: grid;
+ grid-template-rows: auto minmax(0, 1fr) auto;
+}
+
+body[data-page="chrono"] .zone-button {
+ min-height: 0;
+ height: 100%;
+ flex: 1 1 auto;
+}
+
+body[data-page="chrono"] .phase-spine {
+ align-items: stretch;
+}
+
+body[data-page="chrono"] .spine-button {
+ width: 100%;
+}
+
+@media (max-width: 900px) {
+ body[data-page="chrono"] .chrono-stage,
+ body[data-page="cube"] .cube-shell {
+ grid-template-rows: auto auto minmax(0, 1fr);
+ gap: 0.35rem;
+ padding:
+ calc(var(--phase-top-offset) + 0.45rem)
+ calc(var(--safe-right) + 0.45rem)
+ calc(var(--safe-bottom) + 0.45rem)
+ calc(var(--safe-left) + 0.45rem);
+ }
+
+ body[data-page="chrono"] .phase-header,
+ body[data-page="cube"] .phase-header {
+ grid-template-columns: minmax(0, 1fr) auto;
+ gap: 0.35rem;
+ padding: 0.5rem 0.55rem;
+ }
+
+ body[data-page="chrono"] .phase-title,
+ body[data-page="cube"] .phase-title {
+ display: none;
+ }
+
+ body[data-page="chrono"] .brand-link-logo,
+ body[data-page="cube"] .brand-link-logo {
+ justify-self: start;
+ }
+
+ body[data-page="chrono"] .utility-button,
+ body[data-page="cube"] .utility-button {
+ justify-self: end;
+ }
+
+ body[data-page="chrono"] .status-strip,
+ body[data-page="cube"] .status-strip {
+ gap: 0.3rem;
+ }
+
+ body[data-page="chrono"] .status-card,
+ body[data-page="cube"] .status-card {
+ min-height: 3rem;
+ padding: 0.3rem 0.2rem;
+ border-radius: 18px;
+ }
+
+ body[data-page="chrono"] .status-card span,
+ body[data-page="cube"] .status-card span {
+ font-size: 0.62rem;
+ }
+
+ body[data-page="chrono"] .status-card strong,
+ body[data-page="cube"] .status-card strong {
+ font-size: 0.9rem;
+ }
+
+ body[data-page="chrono"] .faceoff-board,
+ body[data-page="cube"] .faceoff-board {
+ grid-template-columns: 1fr;
+ grid-template-rows: minmax(0, 1fr) auto minmax(0, 1fr);
+ gap: 0.35rem;
+ }
+
+ body[data-page="chrono"] .phase-spine,
+ body[data-page="cube"] .phase-spine {
+ display: block;
+ }
+
+ body[data-page="chrono"] .phase-spine .spine-card,
+ body[data-page="cube"] .phase-spine .spine-card {
+ display: none;
+ }
+
+ body[data-page="chrono"] .zone-inner,
+ body[data-page="cube"] .zone-inner {
+ padding: 0.5rem;
+ gap: 0.4rem;
+ border-radius: 20px;
+ }
+
+ body[data-page="chrono"] .zone-head h2,
+ body[data-page="cube"] .zone-head h2 {
+ font-size: 0.92rem;
+ }
+
+ body[data-page="chrono"] .zone-stats strong,
+ body[data-page="cube"] .zone-stats strong {
+ font-size: 0.86rem;
+ }
+
+ body[data-page="chrono"] .zone-stats span,
+ body[data-page="cube"] .zone-stats span {
+ font-size: 0.72rem;
+ }
+
+ body[data-page="chrono"] .seat-tag,
+ body[data-page="cube"] .seat-tag {
+ padding: 0.22rem 0.55rem;
+ font-size: 0.62rem;
+ }
+
+ body[data-page="chrono"] .zone-button,
+ body[data-page="cube"] .zone-button {
+ padding: 0.75rem;
+ border-radius: 22px;
+ font-size: clamp(1.22rem, 7vw, 1.75rem);
+ }
+
+ body[data-page="chrono"] .spine-button,
+ body[data-page="cube"] .spine-button {
+ min-height: 2.7rem;
+ padding: 0.6rem;
+ border-radius: 18px;
+ font-size: 0.9rem;
+ }
+}