Comms / health strip
A persistent strip that carries link state, signal strength, and platform health for whatever scope the operator is addressing. Visible whenever a platform is live.
Live
Four scopes, four densities of the same idea. Status colours follow semantic tokens — success for a clean link, warning for degraded, danger for lost.
Anatomy
Platform scope is rich and single-row; group / swarm / mission collapse to an aggregated summary. Both share the same monospace, the same status-token palette, and the same compact strip silhouette so the strip reads the same regardless of scope.
Four-bar reading coloured by link status. Greyed bars indicate empty slots.
LINK · DEGRADED · LOST. Coloured by semantic token. Always present even when LOST.
X / Y LINK at group, swarm, and mission scope. Degraded and lost surface as separate counts in their semantic colours.
At group and swarm scope (≤12 platforms), a small dot per platform shows individual status. Mission scope drops the pips for legibility.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| scope | Scope | — | Selects single-row platform view vs aggregated summary. See Command contexts for the type definition. |
| platform | PlatformLink | — | Required when scope="platform". The single platform's link state. |
| platforms | PlatformLink[] | — | Required when scope is group / swarm / mission. Leave lost platforms in the list with status: "lost" rather than removing them — the operator's spatial map stays stable. |
| className | string | — | Forwarded to the root container. |
Types
PlatformLinkPer-platform link and health state. Derive from your link layer; the strip doesn't poll or fetch. Polling cadence is the consumer's call — 500ms–1s is typical for command-post surfaces.
interface PlatformLink {
id: string; // operator-visible identifier, e.g. "UGV-04"
signal: 0 | 1 | 2 | 3 | 4; // bars, derived from RSSI / link quality
battery?: number; // percentage, 0-100; omit if not applicable
gpsLock?: boolean; // omit if platform has no GPS dependency
status: "good" | "degraded" | "lost"; // your link-quality classifier
}Wiring
Read-only — the strip renders whatever you pass in. Derive PlatformLink values from your link layer and re-render on a cadence that matches your surface.
// single-platform
<CommsHealthStrip
scope="platform"
platform={{
id: "UGV-04",
signal: 4,
battery: 78,
gpsLock: true,
status: "good",
}}
/>// aggregated
<CommsHealthStrip
scope="group"
platforms={liveFleet.map(toLinkState)}
/>Behavioural rule
Comms always visible
A degraded link is information the operator needs before deciding anything. The strip is persistent for every connected platform and is never collapsed into a settings panel or tucked behind a tab.
Accessibility
| Live region | The strip carries `role="status"` and `aria-live="polite"`. Screen readers announce link transitions without interrupting the operator. |
|---|---|
| Labels | Platform-scope strip uses an `aria-label` of the form `Comms for {id}: {status}`. Aggregated strip describes the summary count and health percent. |
| Decorative parts | Signal bars, dividers, and per-platform pips are `aria-hidden`. The textual link label and counts carry the meaning. |
| Colour and meaning | Status colour is never the only signal — every state also carries a text label (LINK / DEGRADED / LOST). Operators with colour-vision differences still read state. |
JavaFX
Ships in the PRIZM JavaFX library for thick-client C3 apps as Rc3CommsHealthStrip (extends HBox). Run the gallery to see it natively.
import design.prizm.fx.rc3.Rc3CommsHealthStrip;
Rc3CommsHealthStrip()| Member | Type | Default | Description |
|---|---|---|---|
| Scope | enum | — | PLATFORM shows a single rich row; group / swarm / mission show an aggregated summary. |
| LinkStatus | enum | — | GOOD / DEGRADED / LOST — drives colour + link label. |
| PlatformLink | record(String id, int signal, Integer battery, boolean gpsLock, LinkStatus status) | — | One platform's link state; battery may be null. |
| setScope | (Scope) → void | — | Switches between single and aggregated views. |
| setPlatform | (PlatformLink) → void | — | The single platform at PLATFORM scope. |
| setPlatforms | (List<PlatformLink>) → void | — | Aggregated scopes; per-platform pips show at group / swarm when ≤ 12. |
Status uses the success / warning / danger tokens — no Ember. Honours behavioural invariant 2. Mirrors components/rc3/comms-health-strip.tsx.
Usage
Place the strip where it stays in primary attention — top edge of the operator panel, the canvas footer, or the active-platform chip. Never collapse into a settings panel, never tuck behind a tab, never gate behind a hover. Status colour follows semantic tokens — do not retint with Ember; comms is status, not identity.