Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/web-viewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ From `md` width up, the project tabs run across the header or down the page's le

The terminal toolbar can add a pane, show panes as a grid or tabs (from `md` width up; below it the panel is always tabbed and the control is hidden, since a split grid would give each pane fewer columns than a command line needs), maximize the terminal panel, claim sizing for this screen, show or hide the on-screen key bar, and open a message form for the active pane. The key-bar toggle remains in the terminal toolbar. A project has up to 8 panes. Pane order and zoom are shared while the session runs; they are not restored after the session ends. A PTY has one size, so the client whose most recent key/paste/click/touch/wheel interaction claimed sizing determines the grid rendered by every client. A new connection, browser resize, focus change, or reconnect leaves the current owner in place; the terminal toolbar's sizing button remains available for manual recovery.

On phones and other narrow layouts, the bottom navigation switches among `Repo`, `Content`, and `Terminal`. Swiping the row of terminal tabs scrolls it and tapping a tab switches to it; to reorder by touch, rest a finger on a tab until it dims, then drag (a mouse still drags at once). Touch-dragging a terminal scrolls it; the key bar supplies Escape, Tab, arrows, and control keys when a soft keyboard cannot. A soft keyboard opening does not resize the panes: the PTY keeps its grid and the pane shows the part of it around the cursor — the bottom of a full screen, the top of a terminal just opened — so a full-screen program is not made to repaint from the top every time the keyboard comes and goes. Layout changes made while the keyboard is up are applied once it closes. Its `Ctrl` button is a latch for the next typed character. The keyboard-bar preference is stored in the browser, so it can be changed from the terminal toolbar. The shortcut leader key is stored in the browser too, and can be rebound or switched off from the shortcut sheet.
On phones and other narrow layouts, the bottom navigation switches among `Repo`, `Content`, and `Terminal`. Swiping the row of terminal tabs scrolls it and tapping a tab switches to it; to reorder by touch, rest a finger on a tab until it dims, then drag (a mouse still drags at once). Scrolling a list, the content pane or a terminal back to its top does not trigger the browser's pull-to-refresh; pulling down on the header or another fixed bar still refreshes. Touch-dragging a terminal scrolls it; the key bar supplies Escape, Tab, arrows, and control keys when a soft keyboard cannot. A soft keyboard opening does not resize the panes: the PTY keeps its grid and the pane shows the part of it around the cursor — the bottom of a full screen, the top of a terminal just opened — so a full-screen program is not made to repaint from the top every time the keyboard comes and goes. Layout changes made while the keyboard is up are applied once it closes. Its `Ctrl` button is a latch for the next typed character. The keyboard-bar preference is stored in the browser, so it can be changed from the terminal toolbar. The shortcut leader key is stored in the browser too, and can be rebound or switched off from the shortcut sheet.

The message form (the pencil in the terminal toolbar, or the leader followed by `m`) exists because xterm's hidden input field drops and repeats characters from an IME on iPadOS, which makes Korean typed straight into a pane unreliable; an ordinary text field composes it correctly. Send writes the message into the active pane and presses Return, so it runs at once; Cmd/Ctrl+Return does the same from the keyboard, and Return alone adds a line. When the program has turned on bracketed paste, a multi-line message goes in as one paste rather than one command per line. Clear empties the field. A draft is kept per pane for the life of the page, so closing the form does not lose it. The TUI has no such form: it reads keys from the host terminal, whose IME already composes.

Expand Down

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions viewer-ui/dist/index.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions viewer-ui/src/styles/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,17 @@ html {
}
}

/* Android browsers reload the page when a pull-down reaches the top of the
document, and a scroll region that hits its own top hands the rest of the
gesture to the document. Contained there, scrolling a list or the terminal
back to its start can no longer reload the viewer; a pull on the header or
another fixed bar still reaches the document and refreshes as before. */
.overflow-auto,
.overflow-y-auto,
.xterm-viewport {
overscroll-behavior-y: contain;
}

body {
margin: 0;
background: var(--color-ink-950);
Expand Down
Loading