Files
intercept/docs/superpowers/specs/2026-04-13-ui-ux-improvements-design.md
James Smith 34fb030af1 docs: add UI/UX improvements design spec
Mission Control aesthetic, maps overhaul, mode polish sprint for 12 modes,
and 5 new features (Spectrum Overview, Alerts Engine, Signal Recording,
Signal ID, Mobile PWA) — decomposed into 4 sequential sub-projects.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 16:47:30 +01:00

204 lines
11 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.
# INTERCEPT UI/UX Improvements — Design Spec
**Date:** 2026-04-13
**Status:** Approved
**Scope:** Frontend (CSS, JS, HTML) + backend stubs for new features
---
## Overview
INTERCEPT has grown to 20+ modes faster than its design system has kept pace. The goal of this initiative is to establish a "Mission Control" visual identity — tactical, ops-center, every pixel earning its place — and apply it consistently across the entire application. Work is decomposed into four sequential sub-projects, each building on the last.
## Aesthetic Direction
**Mission Control.** Dense, tactical, ops-center feel. Radar aesthetics, glowing blips, HUD overlays, tight data-rich layouts. Think NORAD or air traffic control.
**Maps:** Premium dark map base (rich land/water separation, minimal labels) with tactical chrome on top — HUD corner panels, range rings, lat/lon grid, custom markers.
**Navigation:** Keep existing sidebar structure, polish execution — density, group headers, active states, collapsible groups.
---
## Sub-Project 1: Design System Uplift + Sidebar Polish
**Goal:** Establish the Mission Control visual language as the new baseline. Every subsequent sub-project inherits from this.
### CSS Token Changes (`static/css/core/variables.css`)
| Token | Current | New | Reason |
|---|---|---|---|
| `--bg-primary` | `#0a0c10` | `#06080d` | Deeper black for richer depth |
| `--bg-secondary` | `#0f1218` | `#090c12` | Consistent depth step |
| New: `--accent-cyan-glow` | — | `rgba(74,158,255,0.15)` | Panel borders and active states |
| `--text-xs` | `10px` | `9px` | Tighter data density |
| `--text-sm` | `12px` | `11px` | Tighter data density |
| New: `--scanline` | — | `repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.03) 2px, rgba(0,0,0,0.03) 4px)` | Subtle scanline texture for visual containers |
### Sidebar (`templates/partials/nav.html`, `static/css/core/layout.css`)
- **Group headers:** Uppercase letter-spacing treatment with a fine left-border accent line.
- **Active mode button:** Replace background fill with a 3px left-border glow (`--accent-cyan` with blur) + subtle background tint.
- **Icon sizing:** Standardise all nav button icons to a consistent size (currently varies between modes).
- **Hover state:** Replace flat highlight with `--accent-cyan-glow` background.
- **Group collapse/expand:** Each nav group gets a toggle arrow. State persisted in `localStorage`. Allows users to hide groups they don't use.
### Global Panel Treatment (`static/css/core/components.css`)
- Panel headers: thin gradient top-border (`--accent-cyan` → transparent) for visual hierarchy.
- Panel indicator dots: pulse animation when active (extend existing `.panel-indicator.active` rule).
- Card backgrounds: subtle inner vignette via `box-shadow: inset 0 0 40px rgba(0,0,0,0.3)`.
- Scanline texture applied to all `.visuals-container` elements via `::after` pseudo-element.
---
## Sub-Project 2: Maps Overhaul
**Goal:** Premium map base + tactical chrome. Shared utility applied to all map-using modes.
**Affected pages:** ADS-B dashboard, AIS dashboard, Satellite dashboard, APRS, GPS, Radiosonde map.
### Tile Upgrade
- New default tile provider: **Stadia Maps "Alidade Smooth Dark"** — cleaner land/water separation, minimal label noise, free tier available (requires a free API key from stadiamaps.com; key stored in settings/env var `INTERCEPT_STADIA_KEY`).
- Add **"Tactical"** option in settings tile picker: near-black base, minimal labels, overlays do the visual work.
- Settings modal tile picker updated to include previews of each style.
### Custom Markers
Replace default Leaflet `divIcon` circles with SVG symbols:
- **Aircraft:** Rotated arrow/chevron by heading. Coloured by category: civil (`--accent-cyan`), military (`--accent-orange`), emergency (`--accent-red`). Sized by altitude band (high/mid/low).
- **Vessels:** Ship-silhouette SVG rotated by COG. Coloured by vessel type.
- **Satellites:** Simple diamond marker with pass arc overlay.
- **Selection popup:** Dark glass panel (backdrop-filter blur, `--bg-elevated` background, `--border-color` border), monospace data rows, no default Leaflet chrome.
### Tactical Overlays (shared map utility `static/js/map-utils.js`)
- **Range rings:** Dashed SVG circles at configurable NM/km intervals, label at ring edge.
- **Lat/lon grid:** Subtle graticule overlay, toggleable, 5° or 10° spacing.
- **Observer reticle:** Crosshair SVG replacing the current circle marker.
- **Flight/vessel trails:** Gradient fade — full opacity at current position, transparent at tail. Trail length configurable.
- **HUD corner panels:**
- Top-left: contact count + mode name
- Top-right: UTC clock + SDR status dot
- Bottom-right: scale bar
- Panels use `backdrop-filter: blur(8px)`, dark glass style.
### Implementation Note
Extract shared map initialisation into `static/js/map-utils.js`. Each dashboard calls `MapUtils.init(container, options)` and `MapUtils.addTacticalOverlays(map, options)`. Reduces duplication across the 6 map-using pages.
---
## Sub-Project 3: Mode Polish Sprint
**Goal:** Apply the new design system to the 12 flagged modes. Consistent structure, no mode feeling like a rough prototype.
**Flagged modes:** Pager, 433MHz Sensors, Sub-GHz, Morse/OOK, GPS, APRS, Radiosonde, WeFax, System Health, Meshtastic, VDL2, ACARS.
### Shared Treatment (all 12 modes)
- **Scan indicator:** Animated dot + status text in list header. Pattern from WiFi/Bluetooth applied universally.
- **Sort + filter controls row:** Where a list exists, add sort controls (signal/name/time) in the list header.
- **Empty states:** All modes use `components/empty_state.html` consistently with mode-specific copy.
- **Control panels:** Unified layout — label left, input right, consistent `--space-3` gaps.
- **Data rows:** 2-line row treatment — primary info on line 1, secondary metadata on line 2 (signal level, timestamp, etc.).
### Mode-Specific Highlights
**Pager, ACARS, VDL2:**
- Message rows: signal strength bar on the left edge, collapsible raw data section, relative timestamp with absolute on hover.
- Message type badge (coloured by category/priority).
**433MHz Sensors:**
- Sensor cards grouped by device type with a category header.
- Last-seen freshness indicator (green → amber → red based on age).
- Per-sensor RSSI sparkline (reuse Chart.js pattern from WiFi signal history).
**Sub-GHz, Morse/OOK, WeFax:**
- Signal visualisation panels get scanline texture + dark glass aesthetic.
- WeFax image gallery upgraded: lightbox overlay, larger thumbnails, metadata strip below each image.
**Meshtastic:**
- Chat-style message layout (sent right, received left, timestamp inline).
- Node list with signal quality bars (RSSI + SNR visualised as bar segments).
**System Health:**
- Metric cards in Grafana style: large value, small label, sparkline, status colour border.
- Process list: coloured status pill (running/stopped/error), uptime, PID.
**GPS, APRS, Radiosonde:**
- Map-centric layout using the Sub-Project 2 shared map utility (requires Sub-Project 2 complete first).
- Sub-Project 2 handles the map surface itself (tiles, markers, overlays). Sub-Project 3 handles the surrounding UI: control panel layout, telemetry sidebar panel, empty states, and scan indicator.
- These two modes should be done last in the Sub-Project 3 sprint, after Sub-Project 2 is merged.
---
## Sub-Project 4: New Features
### 4a — Spectrum Overview Dashboard (`/spectrum`)
A new full-screen dashboard showing a wideband frequency sweep (rtl_power) as a waterfall/bar chart. Colour-coded markers overlay the sweep at frequencies used by active modes. Clicking a marker navigates to that mode.
- Backend: new `/spectrum` route + SSE stream from rtl_power.
- Frontend: Chart.js frequency bar chart, mode markers as overlaid labels.
- Entry point: new nav item in Signals group, plus a link from the System Health mode.
### 4b — Alerts & Trigger Engine
Rule-based alert system evaluated server-side against SSE event streams.
- **Rule schema:** `{ event_type, condition_field, condition_op, condition_value, action_type, action_payload }`
- **Storage:** New `alerts` SQLite table in `instance/`.
- **UI:** Rule builder modal accessible from a new "Alerts" nav item. Rule list with enable/disable toggle, test button.
- **Initial event types:**
- Aircraft: callsign match, squawk code, altitude threshold, military flag
- Bluetooth: new tracker detected, specific MAC seen
- Pager: message keyword match
- AIS: vessel type, MMSI match
- **Actions:** Desktop notification, audio alert (reuse existing alert sounds), log to file.
### 4c — Signal Recording & Playback
Per-mode session recording of decoded output (not I/Q — storage/complexity deferred).
- **Record:** "Record" toggle button in each mode's control panel. Saves decoded events as timestamped JSON to `data/recordings/<mode>/<timestamp>.json`.
- **Playback:** Recording browser in a modal. Select a recording, choose playback speed (1×, 2×, 5×). Playback re-streams events through the existing SSE infrastructure via a `/playback/stream` endpoint.
- **I/Q recording:** Out of scope for this phase.
### 4d — Signal Identification
"What is this?" capability in the Listening Post (waterfall) mode.
- User selects a frequency range on the waterfall.
- Backend calls `inspectrum` (if installed) or a lightweight Python classifier against the captured I/Q segment.
- Returns: estimated modulation type, bandwidth, symbol rate, and a match against a curated known-signals database (JSON file).
- UI: result panel slides up from the bottom of the waterfall with signal details and suggested decoder.
- Graceful degradation: button is hidden if `inspectrum` is not installed.
### 4e — Mobile PWA
Installable, responsive INTERCEPT for field use.
- `static/manifest.json`: name, icons, display standalone, theme colour.
- Service worker (`static/sw.js`): cache shell assets for offline load. SSE streams remain live-only.
- **Responsive breakpoints** (`static/css/responsive.css`): sidebar collapses to bottom tab bar on `max-width: 768px`. Priority mobile views: BT Locate, WiFi Locate, GPS (field-use modes). Map-heavy modes scale gracefully. Control panels stack vertically on narrow screens.
- Home screen icons: generate from existing `favicon.svg` at 192×192 and 512×512.
---
## Implementation Order
1. Sub-Project 1 — Design System + Sidebar (foundation, ~1 week)
2. Sub-Project 2 — Maps Overhaul (high impact, ~1 week)
3. Sub-Project 3 — Mode Polish Sprint (breadth, ~2 weeks)
4. Sub-Project 4 — New Features (sequentially: Spectrum → Alerts → Recording → Signal ID → PWA)
## Out of Scope
- I/Q signal recording (deferred to a later phase)
- Backend infrastructure changes beyond what new features require
- New SDR hardware support
- Existing WiFi and Bluetooth modes (recently redesigned, not flagged)