fix button widths on mobile
This commit is contained in:
@@ -3413,6 +3413,33 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
|
|||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
:root { --header-h: 58px; }
|
:root { --header-h: 58px; }
|
||||||
.container { padding-inline: 0.9rem; }
|
.container { padding-inline: 0.9rem; }
|
||||||
|
/* Owner report 2026-09-08: the hamburger "won't extend" on a real
|
||||||
|
phone while the same width in a desktop browser works. The page
|
||||||
|
opts into `viewport-fit=cover` (the <meta>), so on notched phones
|
||||||
|
the layout viewport runs UNDER the status bar / Dynamic Island —
|
||||||
|
and this bar (58px, toggle tap zone y≈7–51px) sits entirely in the
|
||||||
|
system top-edge zone: visually under the battery/signal icons, and
|
||||||
|
in the region where a real device does not reliably deliver taps
|
||||||
|
to the page (desktop emulation has no system top zone, so it works
|
||||||
|
there — the device-only failure). Pad the bar DOWN by the top
|
||||||
|
safe-area inset: the header surface still fills the notch region
|
||||||
|
(that is the point of viewport-fit=cover) but every control — the
|
||||||
|
#nav-toggle first — lands in the reliably tappable area, and the
|
||||||
|
dropdown's top:100% follows the taller bar automatically. The
|
||||||
|
.app-header rule doubles as the document viewer's row-1 bar (the
|
||||||
|
same class), so the viewer's hamburger is covered by the same
|
||||||
|
rule. env() resolves to 0 on every non-notch surface (desktop,
|
||||||
|
headless, no-island phones) — byte-identical rendering there. */
|
||||||
|
.app-header {
|
||||||
|
height: calc(var(--header-h) + env(safe-area-inset-top, 0px));
|
||||||
|
padding-top: env(safe-area-inset-top, 0px);
|
||||||
|
}
|
||||||
|
/* The share toast rests just under the bar — the bar is taller by
|
||||||
|
the same inset on notched phones, so the offset must carry it too
|
||||||
|
(the toast would otherwise tuck under the padded bar). */
|
||||||
|
.toast {
|
||||||
|
top: calc(var(--header-h) + 0.75rem + env(safe-area-inset-top, 0px));
|
||||||
|
}
|
||||||
/* Phase 14: the New chat pill joins the header — tighten the bar so
|
/* Phase 14: the New chat pill joins the header — tighten the bar so
|
||||||
brand + nav + pill fit at 360px without horizontal overflow (the
|
brand + nav + pill fit at 360px without horizontal overflow (the
|
||||||
brand text may ellipsize as the designated squeeze target). */
|
brand text may ellipsize as the designated squeeze target). */
|
||||||
|
|||||||
@@ -251,6 +251,35 @@ def test_mobile_block_renders_the_44px_toggle() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_mobile_block_pads_the_bar_for_the_top_safe_area() -> None:
|
||||||
|
"""Owner report 2026-09-08: on a real notched phone (the page opts
|
||||||
|
into `viewport-fit=cover`) the whole 58px bar — including the
|
||||||
|
#nav-toggle tap zone (y≈7–51px) — sat under the status bar /
|
||||||
|
Dynamic Island system top-edge zone, where a device does not
|
||||||
|
reliably deliver taps to the page (desktop emulation has no such
|
||||||
|
zone, so the menu only "broke" on the phone). The ≤640px block
|
||||||
|
must pad the bar down by the top safe-area inset (explicit 0
|
||||||
|
fallback — the house `env(..., 0)` pattern, so non-notch surfaces
|
||||||
|
render byte-identical) and grow the height by the same amount
|
||||||
|
(border-box: the control row keeps its 58px). The share toast's
|
||||||
|
under-bar offset must carry the same inset."""
|
||||||
|
mobile = _media_block(_css(), "@media (max-width: 640px)")
|
||||||
|
header = _rule_block(mobile, ".app-header")
|
||||||
|
assert "padding-top: env(safe-area-inset-top, 0px)" in header, (
|
||||||
|
"the mobile bar must pad down by the top safe-area inset "
|
||||||
|
"(the viewport-fit=cover contract)"
|
||||||
|
)
|
||||||
|
assert "height: calc(var(--header-h) + env(safe-area-inset-top, 0px))" in header, (
|
||||||
|
"the bar height must grow by the same inset (border-box keeps "
|
||||||
|
"the control row at --header-h)"
|
||||||
|
)
|
||||||
|
toast = _rule_block(mobile, ".toast")
|
||||||
|
assert (
|
||||||
|
"top: calc(var(--header-h) + 0.75rem + env(safe-area-inset-top, 0px))"
|
||||||
|
in toast
|
||||||
|
), "the toast's under-bar offset must carry the same inset"
|
||||||
|
|
||||||
|
|
||||||
def test_mobile_block_turns_the_nav_into_the_dropdown() -> None:
|
def test_mobile_block_turns_the_nav_into_the_dropdown() -> None:
|
||||||
"""The closed (default) mobile nav is the invisible, non-interactive
|
"""The closed (default) mobile nav is the invisible, non-interactive
|
||||||
dropdown panel: absolute edge-to-edge under the sticky .app-header
|
dropdown panel: absolute edge-to-edge under the sticky .app-header
|
||||||
|
|||||||
Reference in New Issue
Block a user