Skip to content

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 before nm.
  • <n> tracks counts 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 trip carries an empty sub-label resource.
  • Boating (lifecycle.md): Continue trip reads Continue boating while the open trip is a Boating trip, and Start new trip reads New boating trip while Settings → Activity Type is Boating. The two are independent: an open Sailing trip with the setting on Boating shows Continue trip and New boating trip. Resume track keeps 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 Menu2 items without colours.
  • In a Boating trip (lifecycle.md) the picker leaves out MOTORSAIL and SAIL: ENGINE → MOORING → ANCHOR → BUOY → SHORELINE → ADRIFT. This applies to every picker of the trip (new trip, Continue trip, while recording). For Start new trip the 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 stored SAIL) focuses ENGINE.
  • Opened during recording (BACK or the action menu), the picker focuses the first item (ENGINE), not the current state.

Wear OS

  • ENGINE, MOTORSAIL and SAIL show 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_1 open 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.

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 ENGINE instead 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.