Skip to content

Phone app bar for Tabs and ⋮, and an input bar below the output - #438

Merged
powerfooI merged 4 commits into
powerfooI:mainfrom
IvoryHeart:mobile-app-bar
Oct 18, 2026
Merged

powerfooI merged 4 commits into
powerfooI:mainfrom
IvoryHeart:mobile-app-bar

Conversation

@IvoryHeart

@IvoryHeart IvoryHeart commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Closes #435. This PR now includes the input bar from #437, which it supersedes, so the proposal lands as one change.

Summary

On phones, three floating capsules and the floating Type button sit over the terminal output. This PR moves the controls into an app bar and puts input in a bar below the output, following Android and iOS conventions.

App bar (first commit)

  • Tabs in the app bar shows the focused workspace's tab count. The count turns red when another agent in that workspace is blocked on the user.
  • ⋮ opens a menu that shows the same controls as labelled 48px rows: Terminal, Files and Changes first, then Commits, Annotations, History, Ranger and Workspaces. Choosing a row, the backdrop or Close dismisses it.
  • On phones the capsules no longer float, and the brand name and version give their space to the app bar; the logo stays.
  • The markup and handlers of the existing navs are reused unchanged. Only their presentation moves into the menu.

Input bar (second commit)

  • Message…: a full-width field. It opens Composer and focuses the draft within the tap, so the keyboard comes up in one tap, as Raise the keyboard from Type in one tap #436 made the Type button do. With an unsent draft it reads Continue draft… (aria: "Open terminal input, unsent draft"), replacing the old draft dot.
  • Terminal button beside it: opens Direct, through the dock's existing focus handoff.
  • In flow, not floating: .terminal-main becomes a column on phones, so the bar never covers terminal text.
  • During a long-press selection: the bar hides but keeps its height (data-reserved, visibility: hidden). Without that, xterm resizes and the selection is lost.
  • Sizes: buttons are 48px and scale with --ui-scale, like the existing touch targets.
  • App.tsx loses the floating Type button and the draft state that only it used; mobile-nav.css loses its styles. The desktop coarse-pointer keyboard button is unchanged.

Back (third commit)

The ⋮ menu is a popup layer for the system Back hook from #433, like the tab sheet: the phone's Back closes it first.

The initial JS budget goes from 804 to 805 KiB (804.3 KiB with this change). FEATURES.md describes both bars and the Back order.

Follow-ups if you take this: the collapse toggle and its drag placement have no role on phones any more, and could be removed in a separate PR.

Tests

TerminalView.inputMode.test.ts, new test "the phone input bar opens Composer with its draft focused, or Direct". It checks:

  • the label
  • Message opens Composer with the draft focused, saves Composer mode, and keeps stdin blocked
  • the unsent-draft label and aria text
  • Direct opens Direct with the terminal focused

The app bar has no new automated tests; per CONTRIBUTING, UI was checked in a browser.

Validation

  • On this branch, rebased on main after Close mobile layers with the phone's Back #433: bun run format:check, bun run lint, bun run typecheck, bun run typecheck:bun and bun run build:site pass. bun run test:quick: 3731 pass, 0 fail.
  • Headless Chrome at 412×915 (mobile layout) against a real Herdr backend, on each part before combining:
    • no floating capsules; Tabs shows the count and opens the tab sheet; ⋮ lists all eight controls at 48px; choosing Files opens Files and closes the menu
    • the terminal ends where the input bar begins, and Message opens the dock with focus in the draft
  • The same layout ships in a Roamgate-derived app and was tried on a physical phone there. This branch has not been tried on a device.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AWodzpMyqdBcX25EE9HhDG

@github-actions github-actions Bot added the enhancement New feature or request label Oct 16, 2026
@IvoryHeart IvoryHeart changed the title Move phone Tabs and view controls into the app bar Phone app bar for Tabs and ⋮, and an input bar below the output Oct 16, 2026
IvoryHeart and others added 3 commits October 18, 2026 00:17
On phones, three floating capsules (views, Ranger/Tabs/Workspaces, and
Terminal/Files/Changes) and a collapse toggle sat over the terminal
output. The app bar now holds Tabs, with the workspace's tab count turning
red when another agent is blocked on the user, and a ⋮ button. ⋮ opens a
menu that shows the same controls as labelled 48px rows; choosing one, the
backdrop or Close dismisses it. The capsules no longer float, and the
brand name and version yield their space to the app bar.

The initial JS budget rises from 802 to 804 KiB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AWodzpMyqdBcX25EE9HhDG
On phones, the floating Type button sat over the bottom-right of the
terminal output and opened the dock without the keyboard. It becomes a
messaging-style bar in the terminal's layout, below the output: a full-
width Message field opens Composer with its draft focused, so one tap
raises the keyboard, and a terminal button beside it opens Direct. The
bar never covers output, names an unsent draft (Continue draft...), and
during a long-press selection it stays hidden but keeps its height, so
xterm does not resize and drop the selection. Its targets are 48px and
scale with the UI. The other floating controls are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AWodzpMyqdBcX25EE9HhDG
The ⋮ menu is a popup layer like the tab sheet, so the phone's Back
closes it before the input dock or a mobile view. Combined with the
system Back hook, the initial JS budget rises to 805 KiB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AWodzpMyqdBcX25EE9HhDG
Keep one Message editor in the global bottom bar with Direct, Tabs and More.
Preserve pane-scoped drafts and caret, explicit input authorization, IME and
upload locks, one-touch Insert/Send, and guarded Direct upload destinations.

Match the Tabs and More popups, hide input tools on secondary pages without
resetting them, and fill the mobile Commits page without duplicating bottom
safe-area space. Retain desktop layout and honest non-Git diagnostics.

Migrate the legacy floating-row test to the unified editor's outside-pointer
blur contract while checking draft, caret and IME-lock preservation.

Manual validation: Chrome against the isolated backend, narrow/landscape and
80-150% UI scales, modeled safe area and short viewport; the preview was
accepted by the user. Native iOS keyboard, IME and picker acceptance was not
independently completed.
@powerfooI
powerfooI merged commit 99ef5d7 into powerfooI:main Oct 18, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mobile design proposal: an app bar for Tabs and ⋮, and an input bar in flow

2 participants