-
- {TASK_STATUS_LABEL[task.status]}
-
-
{task.kind}
-
-
+ {/* #69 — status + kind + Cancel + Retry overflow a phone row. On narrow
+ screens the status/kind pair keeps the first line and the two actions
+ wrap onto a second, right-aligned one; `sm` restores the single row. */}
+
+
+
+ {TASK_STATUS_LABEL[task.status]}
+
+ {task.kind}
+
+
+
+
+
{message &&
{message}
}
diff --git a/frontend/src/shared/styles/theme.css b/frontend/src/shared/styles/theme.css
index e48ebb0..8775763 100644
--- a/frontend/src/shared/styles/theme.css
+++ b/frontend/src/shared/styles/theme.css
@@ -60,12 +60,28 @@
height: 100%;
}
+ /* #69 — phone viewports. `height: 100%` resolves against the *large* viewport,
+ so a mobile browser's collapsing URL bar leaves the last ~60px of the app
+ under the toolbar and makes xterm's fit() overshoot. `100dvh` tracks the
+ *dynamic* viewport instead. Desktop is unaffected: there the dynamic and
+ large viewports are identical, so this resolves to the same height. */
+ @supports (height: 100dvh) {
+ html,
+ body,
+ #root {
+ height: 100dvh;
+ }
+ }
+
body {
margin: 0;
background-color: var(--color-canvas);
color: var(--color-content);
font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
+ /* Phones: never rubber-band the whole document — the app owns its own
+ scroll containers, and an overscrolling body detaches the fixed shell. */
+ overscroll-behavior-y: none;
}
/* A consistent focus ring across the kit (keyboard accessibility). */