Files
airship/CONTROLS.md
T
Nayan 45261f147e feat(overlay): declare every command once, and generate the reference from it
Chords were string literals at each `keys.bind` call site, so the only thing
that knew a command existed was the line that bound it. Twenty-seven of the
thirty-three shortcuts appeared nowhere in the product or the docs, five menu
rows showed Mac glyphs to Windows users, and one advertised `⌘Z` for a feature
`⌘Z` has never run. The only reference was six hand-written rows in `README.md`,
and its copy under `apps/cli/` had already drifted.

`keys/catalog.ts` is the declaration: chord, title, sentence, mode, surface, and
where a scoped command applies. A binding supplies only `run`, `when` and
`within`. `CommandId` is a union, so a mistyped id is a compile error rather
than a shortcut that quietly never fires.

Three surfaces read it. `keys/shortcuts-panel.ts` is the `?` sheet, grouped and
marking what is live right now; `keys/palette.ts` is `⌘K`; and `MenuItem.command`
renders a menu row's chord so nothing spells one by hand — `catalog.test.ts`
fails any `hint:` literal that looks like a keystroke.

`scripts/gen-controls.mjs` is the fourth reader. It imports the `.ts` catalog
directly under `--experimental-strip-types`, which is why that module may
contain no value imports, and writes `CONTROLS.md` plus the short table in
`README.md`. `keys/controls-doc.test.ts` byte-compares the committed files
against the same renderers, so drift fails the suite even on a Node that cannot
strip types.

The tooltip chip moves with it. It used to be found by matching the tip's own
*text* against a binding's label — elegant until someone reworded a tip, at
which point the chip vanished with nothing failing. A control now names its
command with `data-key`.
2026-08-16 13:05:37 +05:30

116 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- Generated from packages/overlay/src/keys/catalog.ts by scripts/gen-controls.mjs. Do not edit. -->
# Controls
Every keyboard shortcut and pointer gesture in the Airship editor.
Press `?` in the editor for the same list with whatever is live right now
highlighted, or `⌘K` to search the commands and run one.
A shortcut never fires while you are typing, with one exception: a field's
own `⌘↵`. On Safari the browser keeps `⌘+` and `⌘-` for its own zoom, so
the editor also answers to a plain `+` and `-`.
## Edit
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Undo | ⌘Z | Ctrl+Z | edit mode | Step back through your pending direct-manipulation edits. |
| Redo | ⌘⇧Z or ⌘Y | Ctrl+Shift+Z or Ctrl+Y | edit mode | Step forward again through edits you have undone. |
| Delete element | ⌫ or Del | Backspace or Del | edit mode | Remove the selected element. |
| Duplicate | ⌘D | Ctrl+D | edit mode | Copy the selected element in place. |
| Edit text | ↩ or T | Enter or T | edit mode | Edit the selected element's text in place. |
| Nudge | ← → ↑ ↓ | ← → ↑ ↓ | edit mode | Move the selected element one pixel. |
| Nudge by ten | ⇧ ← → ↑ ↓ | ⇧ ← → ↑ ↓ | edit mode | Move the selected element ten pixels. |
## Selection
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Deselect | Esc | Esc | edit mode | Clear the selection. |
| Move | V | V | edit mode | Hover highlights and clicks select. The default. |
| Inspect | I | I | edit mode | Hover reads out an element's specs instead of selecting it. |
## View
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Zoom in | ⌘= or = | Ctrl+= or = | canvas only | Zoom in a step, centred on the canvas. On Safari, use + rather than ⌘+. |
| Zoom out | ⌘- or - | Ctrl+- or - | canvas only | Zoom out a step. On Safari, use − rather than ⌘−. |
| Zoom to 100% | ⌘0 or ⇧0 | Ctrl+0 or Shift+0 | canvas only | Return the canvas to actual size. |
| Zoom to fit | ⇧1 | Shift+1 | canvas only | Fit every frame on screen. |
| Zoom to selection | ⇧2 | Shift+2 | canvas only | Fill the canvas with the current selection. |
| Hand tool | H | H | view mode, canvas only | Drag anywhere to move the canvas, leaving the page beneath untouched. |
| Put the Hand down | Esc | Esc | view mode, canvas only | Put the Hand down and go back to pointing. |
## Frames
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Add a frame | F | F | canvas only | Open the device picker and place a new frame on the canvas. |
| Delete frame | ⌫ or Del | Backspace or Del | view mode, canvas only | Remove the active frame from the canvas. |
| Bring frame forward | ↑ | ↑ | on a frame's handle | Move the frame up the stack, so it covers the ones it overlaps. |
| Send frame backward | ↓ | ↓ | on a frame's handle | Move the frame down the stack, behind the ones it overlaps. |
## Agent
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Send | ⌘↩ | Ctrl+Enter | anywhere | Send the description and the pending edits to the agent. |
| Add comment | ⌘↩ | Ctrl+Enter | in a comment | Attach the comment to the diff line it is anchored on. |
| Next change | → | → | on the change strip | Move to the next pending change on the composer's strip. |
| Previous change | ← | ← | on the change strip | Move to the previous pending change. |
| First change | Home | Home | on the change strip | Jump to the first pending change. |
| Last change | End | End | on the change strip | Jump to the last pending change. |
| Drop the change you are on | ⌫ or Del | Backspace or Del | on the change strip | Discard the pending change you are on. |
## Help
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Keyboard shortcuts | ? | ? | anywhere | Every shortcut and gesture, grouped, with what is live right now. |
| Command palette | ⌘K | Ctrl+K | anywhere | Search everything the editor can do right now, and run it. |
## Menus
| Command | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Close the menu | Esc | Esc | in an open menu | Close the open menu. |
| Next option | ↓ | ↓ | in an open menu | Move down the open menu. |
| Previous option | ↑ | ↑ | in an open menu | Move up the open menu. |
| First option | Home | Home | in an open menu | Jump to the first option. |
| Last option | End | End | in an open menu | Jump to the last option. |
| Choose option | ↩ | Enter | in an open menu | Take the option you are on. |
| Close the device menu | Esc | Esc | in the device menu | Close the frame's device menu. |
| Next result | ↓ | ↓ | in the palette | Move down the results. |
| Previous result | ↑ | ↑ | in the palette | Move up the results. |
| Run result | ↩ | Enter | in the palette | Run the result you are on. |
| Close the palette | Esc | Esc | in the palette | Clear the search, then close. |
## Mouse and trackpad
| Gesture | macOS | Windows / Linux | Where | |
| --- | --- | --- | --- | --- |
| Pan the canvas | Wheel / two-finger | Wheel / two-finger | canvas only | Two fingers or a wheel move the canvas under you. |
| Zoom at the cursor | ⌘-wheel / pinch | Ctrl-wheel / pinch | canvas only | Zooms toward the pointer, not the middle of the screen. |
| Pan without the Hand | Space-drag | Space-drag | canvas only | Hold space and drag, from anywhere, without changing tool. |
| Pan with the middle button | Middle-drag | Middle-drag | canvas only | The middle button pans, whatever tool is armed. |
| Scroll a frame | Wheel over the selected frame | Wheel over the selected frame | view mode, canvas only | A selected frame keeps the wheel to its own ends, so the canvas never lurches sideways. |
| Select an element | Click | Click | edit mode | Hover highlights, click selects. |
| Marquee-select | Drag from empty space | Drag from empty space | edit mode | Drag from empty space to band-select several elements. |
| Edit text in place | Double-click | Double-click | edit mode | Opens the caret in the element itself, not in a field beside it. |
| Open the element menu | Right-click | Right-click | edit mode | Verbs for the element you clicked, which it selects first. |
| Measure spacing | ⌥-hover | Alt-hover | edit mode | Hold Alt and hover to read the distance to the element under the pointer. |
| Move or resize a frame | Drag the title or a grip | Drag the title or a grip | view mode, canvas only | Drag a frame by its title; drag a grip to resize it. |
| Restack frames | Drag a row in the frame list | Drag a row in the frame list | view mode, canvas only | Drag a row in the frame list to change which frame is in front. |
| Jump the camera | Press or drag the minimap | Press or drag the minimap | view mode, canvas only | Press anywhere on the minimap to jump there, and keep dragging to keep moving. |
| Scrub a number | Drag a field's glyph | Drag a field's glyph | edit mode | Drag a field's glyph sideways. Shift for ten at a time, Alt for a tenth. |
| Re-dock a panel | Double-click a panel header | Double-click a panel header | anywhere | Double-click a floating panel's header to put it back against the edge. |
| Scroll the pending changes | Wheel over the strip | Wheel over the strip | anywhere | A vertical wheel scrolls the strip sideways, because a mouse has no sideways. |
## In any field
- Enter commits the field you are in; Esc reverts it.
- ↑ and ↓ step a number field. Shift for ten at a time, Alt for a tenth.
- A shortcut never fires while you are typing, except a field's own submit — ⌘↵ on a Mac, Ctrl+Enter elsewhere.