Keyboard equivalents¶
How every map action can be done without a mouse.
The model, its sequence diagram and its reference implementation are written in Phase 3. Version 0 gathers the requirements it must satisfy.
Requirements cited¶
| SRD | Requirement |
|---|---|
| NFR-13 | The interface is operable by keyboard; every map action (dragging a track, drawing an annotation, measuring) has a keyboard or form-based equivalent; themes, including high contrast, are honoured. |
Model¶
Written so far for annotations and for moving, rotating, shearing and stretching tracks; the rest of the map follows in Phase 3.
| Map action | Without a pointer |
|---|---|
| Draw a line, area, circle, ellipse, label or marker | Tab to the map's Draw an annotation toolbar, Enter on a kind; the arrow keys pan the map under the cross in its middle, Space places a point there, Enter finishes, Backspace removes the last, Escape cancels. Or Add annotation… and type the positions (annotations, items 1 to 6). |
| Drag a corner, centre, radius, axis or label | Tab to its handle; the arrow keys move it 5 pixels (25 with Shift); the run of presses is one step when they stop, on Enter, or when the keyboard moves on (presses made while it is saved follow as the next step); Escape puts it back. Or type the change on its properties form. |
| Add a corner between two | Arrow keys on the handle between them. |
| Remove a corner | Delete or Backspace on its handle. |
| Drag a track, or its fixes in the time window | Tab to the selected track's move handle; the arrow keys move it 5 pixels (25 with Shift), and the run of presses is one step, as for an annotation's handle. Whole track and Time window are buttons on the map. Or Move track… and type the distance and bearing (track operations, item 11). |
| Rotate a track | Tab to its rotate handle; Right and Up turn it 1° clockwise, Left and Down anticlockwise, 10° with Shift; one step for the run. The pivot handle moves with the arrow keys. Or Rotate track…, with the pivot and angle typed. |
| Shear or stretch a track | Tab to a diamond beside the first or last fix. Shearing, the arrow keys move it 5 pixels (25 with Shift), the other end held; stretching (Stretch on the map), Up and Right make it 0.1 kn faster, Down and Left slower, 1 kn with Shift. One step for the run. Or Shear track… (course and speed made good) and Stretch track… (speed) (track operations). |
| Split or merge tracks | Split track at current time… and Merge selected tracks on the outline's context menu (Shift+F10 or the menu key; press and hold on a touch screen), in VS Code and the playground alike; there is no map gesture for either. |
| Right-click a fix (or press and hold it on a touch screen) to colour, label or comment on it | Fixes: colour, label or comment… on the outline's context menu: the fix list, a list to type in (a time finds a fix), then the action. In the fix list, in both: Up and Down move along the list, Enter or Space chooses (track operations, item 3). |
| Move a single fix | Zoomed in far enough that its fixes have rings, Tab to a fix's ring; the arrow keys move it 5 pixels (25 with Shift), one step for the run. Or Move a fix… and type the position (track operations, items 5 and 6). |
| Set how often tracks are labelled, marked with a symbol and given a direction arrow; a fix always showing its label or symbol | Select the tracks in the outline (Enter, Ctrl+Shift+Enter to add), then Frequencies: labels, symbols and arrows… on the outline's menu or the Command Palette: three lists, one after the other, an interval typed in any (in the playground, a form of three choosers, Tab between them). A fix's own: Fixes: colour, label or comment…, then Always show its time label or Always show its symbol (Time label and Symbol in the playground's fix list) (labels, symbols and arrows). There is no map gesture. |
| Plot a track over the ground or by dead reckoning | Choosing as it is imported, from a list; afterwards Plot over the ground or by dead reckoning… on the outline's menu; there is no map gesture. |
| Check jumps on the map, or a smoothing preview | Find and remove jumps… lists each jump, ticked, in a list read by screen readers; Smooth track… says how many fixes would move and the most any would, in words, before Apply (track operations, items 1 and 2). |
| Choose the Tote's tracks | Primary and Add in the Tote are lists; Delete on a secondary removes it. A track's menu in the outline (Shift+F10 or the menu key; press and hold on a touch screen) has Set as Tote primary, Add to Tote and Remove from Tote (Tote). There is no map gesture. |
| Choose a narrative entry, a note or a period to move current time to it; read along while playing | The Timeline is a list: Up, Down, Page Up, Page Down, Home and End move through it, Enter or Space moves current time to the entry, F2 changes a narrative entry, Delete deletes it, N adds one, / searches; Ctrl+Z undoes the plot's last step from the Timeline except in its text boxes (the search box and the form), where it undoes the typing (Timeline and narrative). The entry on the map beside its track needs no gesture. |
Click a cut's line to select it and see its choices (keep either bearing, ambiguous again), or Alt-click one of an ambiguous cut's lines to keep it; right-click (or press and hold) a cut for its menu; read a cut's bearings by pointing at it |
A sensor's menu in the Outline (Shift+F10 or the menu key; press and hold on a touch screen): Ambiguous bearings: keep port or starboard…, then Keep port bearing, Keep starboard bearing or Make ambiguous again, then The cut at the current time, Cuts in the time window, Selected cuts or All cuts, each saying how many cuts it holds; one step. Cut at current time… on the same menu says the bearings and sides of the cut the map emphasises and opens its menu (keep either bearing, ambiguous again, select it): move current time to reach any cut. The Command Palette has both. The playground has the same menus. A cut row's menu also has Keep port: selected cuts, Keep starboard: selected cuts and Make ambiguous again: selected cuts, in both. A sensor's details in the Outline say how many cuts are ambiguous and resolved (sensors and bearings). The choices beside a clicked cut are buttons: Tab between them, Enter to choose, Escape back to the map. |
| Set a towed array's offset astern | Towed array offset… on a sensor's menu in the Outline, or the Command Palette: type the distance (0 for at the ship), then choose worm in the hole or plain; one step. In the playground, a sensor row's menu. |
| Choose a run of a sensor's cuts, or a TMA solution's leg or position, with the pointer (click, Shift-click a range, Ctrl-click to add) | The Outline is a tree, one tab stop (product owner, 27 Oct 2026): Up and Down move the keyboard; Right opens a sensor to its cuts, a solution to its legs and a leg to its positions, or goes into one open; Left closes it or goes to its parent; Home, End, Page Up, Page Down; Shift with the arrows extends the selection (a run of cuts); Enter or Space selects, with Ctrl adds or takes away, with Shift selects from the anchor; Ctrl+A every row shown. A position selected moves current time to it. Each row says its level, its place and how many share it (Cut at 09:46:00Z, 236.3° to starboard or 142.3° to port, not yet resolved). In VS Code, the native tree's keys (TMA solutions). |
| Act on what is selected in the Outline: split a leg before or after a position, keep a side of cuts, leave them out of a solution or count them in, hide, show or delete them, make a solution of them | The Tools' entries for the Outline's selection: Tab to them (the Tools panel in the playground; the Tools view in VS Code, or the Command Palette, or the row's menu with Shift+F10), Enter on one. A disabled one says why beside it, read with it. One step each (TMA solutions). |
| Make a solution's first guess by two clicks on the map, on the first and last cuts' lines | TMA solution from cuts… in the Tools: the first guess's form in Bearings (range along the first cut's bearing, course, speed; Debrief's defaults filled in), which takes the keyboard first and says what each field means as it is typed. One step either way. |
| Drag a box with Select bearings on over a run of a towed array's dots in the Bearings plot, keeping the side boxed, or making resolved cuts ambiguous again | No keys of its own (product owner, 28 Oct 2026): select the run in the Outline (the sensor opened, Shift with the arrows), then Keep port, Keep starboard or Make ambiguous again in the Tools, the same one step (TMA solutions). The toggle is a button (aria-pressed), and the result is said in the status line. |
| Pop Bearings out onto a second monitor, and bring it back; drag its window there | Pop out in the Bearings view's title bar (Tab to it, Enter), or Debrief: Pop out Bearings into a new window in the Command Palette: Bearings opens as an editor in a window of its own (or an editor tab, where VS Code cannot open the window). Moving the window to the other monitor is the operating system's (on Windows Win+Shift+Right; on most Linux desktops Super+Shift with an arrow; maximise with Win+Up or Super+Up). Bring Bearings back to the panel and Focus the popped-out Bearings are in the Command Palette, and the panel's placeholder has both as buttons; closing the editor (Ctrl+W, or Ctrl+F4) brings it back too. In the playground, the same buttons; the window is a browser window, closed as any is (TMA solutions). |
| Click a cut's dot in the Bearings plot to leave it out of the RMS, or count it again | Space or Delete on the cut chosen in the plot, or Leave out of Contact 1 solution and Count in Contact 1 solution in the Tools for the cuts selected in the Outline; one step. |
| Click in the bearings plot to pick a manoeuvre's time | In the Outline, the solution's leg opened to its positions, the arrows to the position, Enter (current time moves to it), then Split before or Split after in the Tools; or Up and Down in the plot to the cut and S. On the map, This leg under What changes, then the track's drags and their keys: the leg dragged is the one current time is in until a leg is clicked or tapped on the map. |
| Choose which catalogue item supplies a period of a track; take new data; confirm or refuse a platform | Coverage: Tab to a period's list, pick with ↑ ↓ (no step yet) and press Enter or Set, the keyboard's way for clicking a source's bar; Take, Not now, Same platform, Not this platform, Unlink and Reviewed are buttons. In VS Code's Catalogues, an item's or a track's menu (Shift+F10 or the menu key) has the same. There is no map gesture (Collation). |
| Export the map as an image; find the plot an image came from; leave an earlier revision shown read-only | Export image… (the Command Palette, the map's title bar, the Outline's menu): a list of sizes, two tick boxes (Space), then the save dialog. Find source of image…: a list, then the open dialog or the ID typed and Enter. On the map, Tab to Go to latest and Enter. In the playground, the Export image panel's lists, tick box and buttons, Enter in its ID box. There is no map gesture (Exported images). |
| Follow a walkthrough | VS Code's Get Started page, its own keyboard; in the playground, the Walkthroughs panel: a list to choose one, each step a button that opens it, its button the step's own. Every step says its keyboard equivalent (Walkthroughs). |
| Rearrange the browser's panels: drag a tab to another group, or to a group's edge to split it | Tab moves through the layout group by group, each group's tab then what its panel holds; ← → along a tab strip, Enter or Space to bring a panel to the front; Shift+F10, the menu key or the group's ⋯ opens the panel's menu: Move to left: Outline, Catalogue for each other group, Move to a group of its own, Reset layout (browser layout). The top bar's Import…, Export and Try open with Enter, and Escape closes them. |
| In the time controller: drag the scrubber; drag the time window's band to move it, or an edge to resize it; click the overview strip to move current time (outside the window, the window moves to it) | Tab to the scrubber: the arrow keys step current time (Page Up, Page Down ten steps; Home, End the window's ends). Tab to the band: the arrow keys move the window, Shift and the arrow keys resize it; or to an edge, whose arrow keys move that end. Enter on current time to type a time and go there; the window's details (Enter on Window) take its ends typed, and Whole plot. Space plays and pauses from any of them (time controller; product owner, 28 Oct 2026). |
| Clear the selection | Escape on the map; or Clear selection on the Outline's toolbar. |
| Hide or show, colour, select all, select children or clear the selection with the Outline toolbar's icons | The toolbar is one Tab stop before the tree (product owner, 28 Oct 2026): ← and → move along it, Home and End to its ends, Enter or Space presses; a button that cannot act is still reached, its reason read with it. Colour opens its swatches with the keyboard on them: ← → choose, Enter colours, Tab to Custom to type #rrggbb, Escape closes. In VS Code, the Outline view's title bar (Tab to it from the view, or the Command Palette: Hide selected on map, Colour selected…, Select all in the Outline, Select children, Clear selection), the colour a QuickPick (selection). |
| Pan, zoom | Arrow keys, and + and -, with the map focused. |
Reference implementation¶
vscode/webview/mapedit.ts (keys while drawing and on handles) and vscode/webview/drawing.ts; vscode/webview/trackmap.ts and vscode/webview/trackedit.ts for a track's handles. The playground tests vscode/test/play/drawing.mjs and vscode/test/play/tracks.mjs place a marker, change an area, move and rotate a track, vscode/test/play/shear.mjs shears and stretches one, and vscode/test/play/fixdrag.mjs moves a single fix, from the keyboard alone; vscode/test/play/tote.mjs chooses the Tote's tracks from the keyboard and by press and hold; vscode/test/play/narrative.mjs reads, chooses, adds, changes and deletes narrative entries from the keyboard; vscode/test/play/sensors.mjs keeps a side of a sensor's cuts in the window from the keyboard. vscode/test/play/tma.mjs opens a sensor to its cuts in the Outline and chooses a run of them, makes a solution by form, and checks the tree's levels, places and keys, from the keyboard; vscode/test/unit/outline.test.ts holds every key and click of the tree.