Comms (Next)
Comms shows one lane per radio channel and marks which speakers are talking on it over time. The layout names the lanes and the speakers. The data service supplies, for each lane, a series channel whose value at each instant is the list of speakers active on that lane.
Use it for radio or intercom occupancy in crew training, where the question is who was on which net and when. It supports playback, so the lanes follow the realm clock when the page or the widget shows playback controls.
Summary
| Value | |
|---|---|
| Layout id | Comms |
| Widget config | commsItem |
| Channel shape | series (value is a string array of speaker names) |
| Playback | Yes, optional |
| Realm filter | No |
| Dual column | No |
Migration status
migrated, full layout and dataservice reference: tools/arbex/reference/next/Comms.json. See Dataservice migration status.
Layout
| Field | Required | Description |
|---|---|---|
name, titleContent | Yes | Widget instance name and panel title |
channels | Yes | One data service channel id per lane, in display order |
commsItem.channels | Yes | The display label for each lane. Same length and order as channels. |
commsItem.nodes[] | Yes | The speakers: { text, color, strokeColor }. text must match the strings that appear in the series samples. Doubles as the legend. |
enablePlaybackControls | No | Show a playback bar on this widget |
shouldRenderTitle, tooltipContent, shouldRenderTooltip | No | Panel chrome |
Schema: #/$defs/CommsItemSchema in heat-layout-schema.json.
Layout column example
{
"component": "Comms",
"colspan": 12,
"configuration": {
"name": "crew-comms",
"titleContent": "Comms",
"shouldRenderTitle": true,
"enablePlaybackControls": true,
"channels": ["comms-primary", "comms-secondary"],
"commsItem": {
"channels": ["Primary", "Secondary"],
"nodes": [
{ "text": "Commander", "color": "#EE7127", "strokeColor": "#642F10" },
{ "text": "Gunner", "color": "#0B5370", "strokeColor": "#05232F" },
{ "text": "Driver", "color": "#8D2260", "strokeColor": "#3B0E28" }
]
}
}
}Data contract
| Shape | Payload |
|---|---|
series | data[] of { "timeMs": number, "value": string[] }. Each value lists the nodes[].text entries active on that lane at that instant. An empty array means the lane is silent. |
Each lane is its own channel. The widget reads the sample current at the playback time for every channel in channels and pairs it with the label at the same index in commsItem.channels.
Channel example
{
"id": "comms-primary",
"name": "comms-primary",
"groupId": "comms",
"shape": "series",
"data": [
{ "timeMs": 0, "value": ["Commander", "Gunner"] },
{ "timeMs": 1000, "value": ["Gunner"] },
{ "timeMs": 2000, "value": [] }
]
}Behaviour notes
- Clicking a speaker in the legend hides that speaker on every lane. Clicking again shows them.
- A speaker name in a sample that has no matching
nodes[].textis not drawn. - When every lane has no sample at the current time, the widget shows its empty state.
- Comms is often nested inside a Modal so that several vignettes can be compared through the modal’s own realm picker.
Related
- Next components index
- Layout reference
- ComposableChart: a
ranges_laneslice is the alternative for comms drawn as intervals on a shared time axis - RAG:
tools/arbex/rag/reference/components/Comms.md - Reference:
tools/arbex/reference/next/Comms.json