The UI at a glance
Everything outside /login, /invite, and the full-screen operation console renders
inside the shell — a tactical layout with four persistent zones.
The four zones
1. Top bar (.tac-topbar)
Pinned to the top, always visible.
- Menu button — hamburger on mobile, chevron on desktop. Collapses the left nav.
- Brand — ARGUS logo + wordmark. Click to return to
/. - Page title — current route’s translated title (e.g.
app.overview,app.operations), driven fromroute.data.titleviaActivationEndevents. - System status chip —
ONLINE/OFFLINE. - Theme toggle — light ↔ dark.
- Notifications bell — unread-count badge, capped at
99+. - Avatar + name + callsign chip — opens the profile dropdown (org name, role badge, Profile, Settings, About, Help, Sign out).
2. Left navigation (.tac-sidebar)
Collapsible rail. Remembers its state in localStorage under sar.sidebar.collapsed. On
mobile (≤768px) it becomes a swipe-to-close overlay drawer.
- MAIN — Overview, Operations (with a live count badge), Mapping.
- TOOLS — Profile, Settings, Teams, Joystick Debug (desktop-only, shown when WebHID / WebSerial / Gamepad is present).
- ADMIN — admin-only.
/admin/org,/admin/users,/admin/assets,/admin/venues,/admin/dji,/admin/webhooks,/admin/workflows,/admin/roles,/admin/subscription. - SYSTEM — About, Help.
Each item gates on PermissionService — if you can’t view Operations the link doesn’t
render at all.
3. Right content area (.tac-content)
<router-outlet>. Everything under the shell route lands here. The Operation Console
(/ops/:id/live) is a separate top-level route that replaces the shell with a full-viewport
tile grid.
4. Floating overlays
- Help FAB (
<app-help-fab>) — bottom-right. Popover with help centre, shortcuts, FAQ. - Tour overlay (
<app-tour-overlay>) — guided-tour spotlight. - Notification panel + profile dropdown mount near the top bar with backdrops.
Key routes
| URL | What it is |
|---|---|
/ | Dashboard — your home |
/operations | The list of operations you can access |
/operations/new | Create-operation wizard |
/operations/:id | Mission detail |
/operations/:id/edit | Edit (owner / admin only) |
/ops/:id/live | Operation Console — full-screen live view |
/teams | Teams you belong to |
/mapping | Mapping — ODM photogrammetry |
/profile | Your profile |
/settings | Theme, audio, input |
/admin/org | Organisation management (admin+) |
/admin/users | Users + invites (manager+) |
/admin/assets | Asset inventory (admin+) |
/admin/venues | Venues / indoor sites (admin / venue_creator) |
/admin/dji | DJI Docks (admin+) |
/admin/webhooks | Webhooks (admin+) |
/admin/workflows | Workflows (admin+) |
/admin/roles | Custom roles (superadmin only) |
/admin/subscription | Plan + billing (superadmin only) |
/help | In-app help centre |
/about | Build info |
Legacy /missions redirects to /operations for compatibility.
Themes
Today: light and dark (theme-light / theme-dark on <html>, toggled by
ThemeService, persisted under sar.theme). Default is dark. A third tactical variant
for night command posts is aspirational — the service is currently a two-state toggle.
Switch from the top-bar theme icon or Settings → Theme.
Keyboard shortcuts
Full list: Keyboard shortcuts. Shell essentials:
- Esc — close profile dropdown / notification panel (wired in shell via
@HostListener('document:keydown.escape')). - Alt+1 — Dashboard.
- Alt+2 — Operations.
- Alt+H — Help.
- ? — shortcuts overlay.
- / — focus global search.
/, ?, and Alt+N are documented in the shortcuts reference but rely
on per-surface binding — aspirational at the shell level until a global shortcut
service ships. Inside the Operation Console the full flight control set (Space
hover, T takeoff, L land, M PTT) is live.
Language
English + Spanish. I18nService picks: saved preference (sar.lang) → browser → English.
Switch from Settings → Profile or the avatar menu.
Offline behaviour
The status chip flips to OFFLINE on navigator.onLine + Firestore disconnect.
- Reads continue from the Firestore local cache for anything already loaded.
- Writes (mission edits, chat, flags) are queued by the Firestore SDK and flush on reconnect.
- The Operation Console requires live TACLINK; on disconnect it shows a banner and auto-retries — see TACLINK connection.