Menus¶
| Garmin | Wear OS | Apple Watch | |
|---|---|---|---|
| Status | ✅ | 🟡 | ⏳ |
| Code | source/StartMenu.mc, source/ActionMenu.mc, source/ConsentView.mc (ConsentMenu), source/VesselStateMenu.mc, source/settings/SettingsMenu.mc, resources/resources.xml |
wear/…/presentation/SailEverApp.kt (StartList, picker, discard, consent, settings), wear/…/presentation/TrackingScreen.kt (ControlsPage), wear/…/presentation/Menus.kt (MenuScreen) |
— |
Verified against code: 2026-10-19
Purpose¶
The menus let the sailor start and end tracks, change the vessel state and reach settings and pairing. They are lists of short labels, each with an optional sub-label below it.
Lifecycle effects of each item are in lifecycle.md. How menus are opened and scrolled is in input.md. Vessel state definitions, labels and colours: ../shared/vessel-state.md.
Look¶
All menus use the platform's own list component. Labels are English literals; the UI is not localised.
Garmin¶
WatchUi.Menu2 with a title. Each item is a label with an optional sub-label. Menus open with the first item focused unless stated otherwise. UP / DOWN move the focus, START selects, BACK closes the menu.
Wear OS¶
A Wear Material 3 list (TransformingLazyColumn): a list header with the title, then one button per item with the sub-label as its secondary line (one line each, cut with an ellipsis). The system clock (TimeText) shows on top, except on the Controls page. The crown scrolls the list. Swipe right closes it (in-app swipe-back, input.md).
A menu with a preselected item (vessel state picker, settings value pickers) works like a focused Garmin menu: the preselected item is highlighted with the filled primary button colours, the crown moves the highlight one item per crown event, a tap picks any item, and a stem button picks the highlighted item.
An item with a colour shows its label and sub-label in that colour on a tonal button.
Apple Watch¶
⏳ SwiftUI lists in a NavigationStack (port plan).
Start menu¶
Title: SailEver. Shown after the splash and after a discard. Items top to bottom; hidden items take no space.
| # | Label | Sub-label | Shown when |
|---|---|---|---|
| 1 | Upload tracks |
Pair device first when not paired; otherwise <n> files - storage <p>% when the queue uses 75 % of its budget or more; otherwise <n> files local |
At least one file waits for upload (discard files do not count) |
| 2a | Resume track |
<d>nm (in progress) with the paused track's distance; Track in progress when that distance is 0 |
A trip exists and its last track is paused |
| 2b | Continue trip |
<n> track, <d>nm (one track) or <n> tracks, <d>nm |
A trip exists and no track is paused |
| 3 | Start new trip |
none | Always |
| 4 | Pair device |
Link to sailever.com |
Not paired |
| 4 | Unpair device |
Forget device token |
Paired |
| 5 | Settings |
Alerts & auto-stats |
Always |
On Garmin, a Boating trip changes the labels of Continue trip and Start new trip (see Garmin below).
Formats:
<n>: whole number.<p>: whole percent of the queue budget (../shared/track-sync.md).<d>: nautical miles, one decimal below 100 (95.5), no decimals from 100 (134). No space beforenm.<n> trackscounts the trip's stopped tracks;<d>is the trip distance booked so far.
What each item does: lifecycle.md. Upload tracks, Pair device and Unpair device: sync-and-pairing.md. Without consent, Pair device and Upload tracks (while unpaired) open the privacy consent first. Unpair device also clears the consent.
The Upload tracks and pairing items refresh when the menu becomes visible again (Garmin) or every 2 s while shown (Wear OS), so a finished upload or a 401 shows without restarting the app.
Garmin¶
Start new tripcarries an empty sub-label resource.- Boating (lifecycle.md):
Continue tripreadsContinue boatingwhile the open trip is a Boating trip, andStart new tripreadsNew boating tripwhileSettings→Activity TypeisBoating. The two are independent: an open Sailing trip with the setting on Boating showsContinue tripandNew boating trip.Resume trackkeeps its label. Sub-labels don't change. Both labels refresh when the start menu is shown again.
Wear OS¶
The start menu asks for the location and notification permissions when they are missing (lifecycle.md).
Apple Watch¶
⏳ Same items (port plan: Upload tracks only while files are left, Start new trip, Pair device / Unpair device, Settings). The resume item follows this spec (Resume track / Continue trip).
Action menu (Garmin) / Controls page (Wear OS)¶
The track's controls, reachable only while a track records. Title: Activity. It opens at the first item every time.
| Item | Action |
|---|---|
Stats |
Opens the two-page stats summary |
Pause Track |
Pauses the track: Garmin opens the pause view, Wear OS goes to the background (lifecycle.md) |
Stop Track |
Wear OS: opens the stop confirmation first. Stops the track; save view or app end (lifecycle.md) |
Discard Track |
Opens the discard confirmation |
Vessel State |
Garmin only: opens the vessel state picker (Wear OS: picker page, swipe left on the instruments) |
Touch Lock |
Wear OS only: locks touch input (input.md) |
Garmin¶
Opened with START on the Dashboard or Environment view (input.md). A Menu2:
| # | Label | Sub-label |
|---|---|---|
| 1 | Stats |
— |
| 2 | Pause Track |
— |
| 3 | Stop Track |
— |
| 4 | Discard Track |
— |
| 5 | Vessel State |
Current state label in capitals, e.g. SAIL |
BACK closes the menu and returns to the instrument page. After picking a vessel state from here, both the picker and the action menu close.
Wear OS¶
The Controls page is the left page of the recording screen, reached by swiping right (input.md). It has no clock and no swipe-to-close; swiping left returns to the instruments.
| # | Label | Sub-label | Colour |
|---|---|---|---|
| 1 | Pause Track |
— | default |
| 2 | Stop Track |
Live track time H:MM:SS |
default |
| 3 | Stats |
— | default |
| 4 | Touch Lock |
Hold 2 s to unlock |
default |
| 5 | Settings |
Alerts, stats, screen |
default |
| 6 | Discard Track |
— | Engine red 0xFF5555 |
Settings opens the same settings menu as the start menu (alerts-and-auto-stats.md); swiping back out of it returns to the instruments. The track keeps recording, and changes apply at once.
The vessel state is not on the Controls page: it has its own page right of the instruments (Vessel state picker).
Apple Watch¶
⏳ A Controls page left of the instruments, as on Wear OS, with Water Lock in place of Touch Lock: Pause, Stop, Stats, Vessel state, Water Lock, Discard (port plan).
Vessel state picker¶
Title: Select Vessel State. One item per vessel state, labels and order as in ../shared/vessel-state.md (ENGINE first).
No sub-labels. Picking a state applies it at once; there is no confirm step.
| Opened from | Preselected | After picking | Leaving without a pick |
|---|---|---|---|
Start new trip |
ENGINE |
New trip and its first track start | Start menu, trip unchanged |
Continue trip |
Previous track's state (ENGINE if none) |
Next track of the trip starts | Start menu |
Recording: BACK or Vessel State item (Garmin); swipe left, state header tap or stem (Wear OS) |
See platform | State changes, a new state period starts (../shared/vessel-state.md); back to the instrument page | Back to where it was opened |
Garmin¶
- Plain
Menu2items without colours. - In a Boating trip (lifecycle.md) the picker leaves out
MOTORSAILandSAIL:ENGINE→MOORING→ANCHOR→BUOY→SHORELINE→ADRIFT. This applies to every picker of the trip (new trip,Continue trip, while recording). ForStart new tripthe type is the one the new trip will get (the setting); otherwise the open trip's. A preselected state that is left out (an old storedSAIL) focusesENGINE. - Opened during recording (BACK or the action menu), the picker focuses the first item (
ENGINE), not the current state.
Wear OS¶
ENGINE,MOTORSAILandSAILshow in their state accents; the stationary states in the default colour.- During recording the picker is a page right of the instruments (swipe left), without a clock: a plain list like the Controls page, opening at its first item every time, with no preselected state. Swipes and the crown scroll it; a tap picks a state and scrolls back to the instruments; swiping right leaves the state unchanged.
- The state header tap and
STEM_1open the same list as a screen of its own, current state preselected. After a pick, the app returns to the instruments.
Apple Watch¶
⏳ Picker with the previous state preselected. Double Tap opens it and a second Double Tap confirms the highlighted state; no blind cycling through states (port plan).
Stop confirmation¶
Wear OS only (Garmin stops at once, parity.md P12). Title: Stop Track?
| # | Label | Action |
|---|---|---|
| 1 | No, Cancel |
Closes the dialog, back to the instruments; the track keeps recording |
| 2 | Yes, Stop |
Stops the track (lifecycle.md) |
Both in the default colour. Swipe right acts like No, Cancel.
Discard confirmation¶
Title: Discard Track?
| # | Label | Action |
|---|---|---|
| 1 | No, Cancel |
Closes the dialog, back to the action menu / Controls page; the track keeps recording |
| 2 | Yes, Discard |
Discards the track and opens the start menu (lifecycle.md) |
The safe choice comes first and has the focus.
Garmin¶
BACK acts like No, Cancel.
Wear OS¶
Yes, Discard is engine red 0xFF5555. Swipe right acts like No, Cancel.
Privacy consent¶
Opened in place of the pairing view while there is no consent (sync-and-pairing.md, which also has the question's text and layout).
Title: Privacy
| # | Label | Action |
|---|---|---|
| 1 | No |
Stores nothing, sends nothing; back to the start menu |
| 2 | Yes |
Stores the consent, registers the device if needed, opens the pairing view |
The safe choice comes first.
Garmin¶
The consent view shows the question; START or a tap opens this menu. BACK (on the view or in the menu) acts like No.
Wear OS¶
The question is the list's text under the title, above the two items. Swipe right acts like No.
Settings¶
Settings in the start menu opens the settings menu. Its tree, value formats and storage: alerts-and-auto-stats.md.
Known deviations¶
- Garmin picker during recording focuses
ENGINEinstead of the current state. Wear OS preselects the current state (header tap, stem button; not on the swipe-left picker page). Garmin is behind (parity.md P1). - Action menu order differs. Garmin: Stats, Pause, Stop, Discard, Vessel State. Wear OS: Pause, Stop, Stats, Touch Lock, Settings, Discard, with a live timer under Stop; the vessel state is its own page. The order is an open product decision (parity.md P5); until it is made, each platform keeps its order as listed above.