fix(ui): mobile composer layout#1381
Conversation
|
Nice mobile composer rework. Two genuine pressure points (titlebar safe-area in non-installed shells, composer crowding on phone widths) handled separately rather than mashed into one fix — that's the right shape. A few observations from skimming the diff against current
A few things worth checking in review:
Self-contained frontend change, no API or CLI surface touched, no |
|
Thanks for the detailed review — pushed a small follow-up in
Local verification passed: |
|
Thanks for this — the structure here is solid (scoped to What we'll need before flipping to merge-queue:
Code-level notes (none blocking, but worth addressing in the same push):
Once the screenshots are posted I'll re-review and flip to the merge queue. Thank you for the careful scoping with |
|
Added visual validation for the mobile composer update. The summary image covers the requested states:
Also confirmed:
|
|
Released as part of v0.50.253 — thanks @starship-s! This PR was merged into the v0.50.253 release batch via #1391 alongside two other contributor fixes (#1342 by @bergeouss). Full CHANGELOG entry: https://github.com/nesquena/hermes-webui/blob/master/CHANGELOG.md. Pre-release verification:
Closing this PR — the change is live on master and tagged. |
…titlebar safe-area (nesquena#1381)
…ktop view (CSS specificity)
The .composer-mobile-config-btn{display:none} base rule was at line 896 but
.icon-btn{display:flex} (the button's other class) was at line 941 — equal
specificity, but later in source wins. Result: the button was visible at
desktop widths, sandwiched between the workspace and model chips.
Bumping the base rule's selector to .icon-btn.composer-mobile-config-btn
gives it specificity 0,0,2,0 (vs .icon-btn at 0,0,1,0), so it always wins
the cascade. The two narrow-viewport rules already use !important and remain
unaffected — desktop hides cleanly, mobile shows correctly.
Verified via Agent Browser CDP: 1440x900 desktop now shows the standard
chips only (no extra config button); iPhone 14 mobile shows the new compact
config btn at 44x44 with the panel toggling correctly. Screenshots:
/tmp/may2-shots/desktop-final.png, mobile-{closed,open}-final.png
…egacy phones Pulls in the extra commit pushed to PR nesquena#1381 after our initial absorb. Adds a @media (max-width: 340px) block that compacts gutters (composer-wrap padding, composer-footer gap, composer-left gap) without shrinking the 44px touch targets. Plus its regression test. Verified with apply --check failed but actual apply succeeded — the failure was due to context drift from our earlier CSS specificity fix; the new lines landed at the correct location. test_mobile_layout.py: 47 tests passing.
… + nesquena#1381 + 2 Opus follow-ups)
…titlebar safe-area (nesquena#1381)
…ktop view (CSS specificity)
The .composer-mobile-config-btn{display:none} base rule was at line 896 but
.icon-btn{display:flex} (the button's other class) was at line 941 — equal
specificity, but later in source wins. Result: the button was visible at
desktop widths, sandwiched between the workspace and model chips.
Bumping the base rule's selector to .icon-btn.composer-mobile-config-btn
gives it specificity 0,0,2,0 (vs .icon-btn at 0,0,1,0), so it always wins
the cascade. The two narrow-viewport rules already use !important and remain
unaffected — desktop hides cleanly, mobile shows correctly.
Verified via Agent Browser CDP: 1440x900 desktop now shows the standard
chips only (no extra config button); iPhone 14 mobile shows the new compact
config btn at 44x44 with the panel toggling correctly. Screenshots:
/tmp/may2-shots/desktop-final.png, mobile-{closed,open}-final.png
…egacy phones Pulls in the extra commit pushed to PR nesquena#1381 after our initial absorb. Adds a @media (max-width: 340px) block that compacts gutters (composer-wrap padding, composer-footer gap, composer-left gap) without shrinking the 44px touch targets. Plus its regression test. Verified with apply --check failed but actual apply succeeded — the failure was due to context drift from our earlier CSS specificity fix; the new lines landed at the correct location. test_mobile_layout.py: 47 tests passing.
… + nesquena#1381 + 2 Opus follow-ups)

Thinking Path
What Changed
standalone/fullscreendisplay modes.Why It Matters
Screenshots
Before: crowded composer controls on mobile, with overlapping touch highlights.
After: mobile config panel with workspace/model/reasoning/context controls available.
After: normal mobile composer state.
Verification
Targeted mobile layout coverage:
python -m pytest tests/test_mobile_layout.py -qResult:
42 passedSyntax / hygiene checks:
node --check static/ui.jsnode --check static/panels.jsgit diff --checkRisks / Follow-ups
Model Used