Design System

Status indicators

Tags, pills, and badges with locked vocabularies.

Status indicators are persistent descriptive metadata attached to entities - a program’s acquisition milestone, a build’s release tier, a system’s operational availability, a user account’s state, a territory’s tactical status. They round out the “labels on things” story that started with classification strips and notifications.

TAGS · 22px · square 2px · 15% fill + 100% stroke PROGRAM SENSITIVE FDT CONTROLLED UNCLASSIFIED SECRET PILLS · PROGRAM LIFECYCLE · rounded 14px CONCEPT EMD PHASE IN TEST LRIP FIELDED SUSTAINMENT ARCHIVED TERMINATED PILLS · OPERATIONAL AVAILABILITY ONLINE DEGRADED OFFLINE MAINTENANCE UNKNOWN PILLS · TACTICAL STATE SECURED CONTESTED DENIED UNKNOWN BADGES · count · capsule · anchored 3 12 99 NEW BETA EOL FD anchored ACTIVE dot
Kind What it describes Lifecycle
Classification strip Security / program context of a surface Structural, always visible
Notification A change that happened or needs attention Announcing (ephemeral or persistent)
System state The system is broken, empty, or waiting Replaces surface content
Status indicator The state of a specific entity - program, user, sector, record Persistent, sits on the entity

A status indicator rides with the item it describes. It’s on the program card, in the table row, next to the user’s name. It doesn’t demand action; it provides context at a glance.

Three shapes

Shape Use Primitive
Tag Dense metadata - multiple items per entity, filterable, removable in filter contexts wa-tag
Pill Singular declarative status - one per entity attribute. Medium prominence. Composed from wa-tag
Badge Small count or single-letter state, anchored to an icon or avatar wa-badge

Pick by prominence and quantity: a tag is quiet and plural, a pill is singular and declarative, a badge is attached to something else.

Tag - anatomy

  • Height: 22px
  • Padding: 2px 8px
  • Radius: 2px (square - keeps with FDT’s geometric precision)
  • Font: Inter 500 11px UC tracked 0.06em
  • Background: 15% opacity of semantic color
  • Border: 1px in full semantic color
  • Text color: in semantic color on dark backgrounds; fog-100 for danger/brand where contrast demands

Tags cluster in rows with 6px gap between them. Maximum 4 visible per entity; if more apply, collapse to +N that expands on hover.

Pill - anatomy

  • Height: 24px
  • Padding: 3px 10px
  • Radius: 12px (fully rounded - the visual distinguisher from a tag)
  • Font: Barlow Condensed 700 10px UC tracked 0.08em
  • Background: 15% opacity of semantic color
  • Border: 1px in full semantic color
  • Text color: in semantic color (caution, electric) or fog-100 (danger, brand)
  • Optional leading icon: FA Sharp Regular 10px in semantic color - for FIELDED a check, for TERMINATED an xmark

Pills are the default for program lifecycle, build tier, account state. The rounded silhouette distinguishes them at-a-glance from tags in a mixed-metadata row.

Badge - anatomy

  • Shape: circular (8–12px) for single-letter/count; capsule for short text (NEW, BETA)
  • Fill: solid semantic color
  • Font: JetBrains Mono 500 10px, fog-100 (or navy-900 on caution/success for contrast)
  • Border (optional): 2px navy-900 when the badge is anchored on top of another element (icon, avatar) so it reads as separate from the element underneath

Badges carry the least information - a count, a single letter, a three-letter label. They announce that something exists/is new, not what it is.

Standard vocabularies

The system ships a fixed set of status labels. New statuses require a design-system change, not a per-product improvisation. Consistent labels across products mean an operator reading a GRIDWATCH program list and a GHOST GRID program list sees the same words meaning the same things.

Program lifecycle - DoD acquisition milestones

Label Variant Stage
CONCEPT steel Pre-milestone A - materiel solution analysis
EMD PHASE electric Engineering & Manufacturing Development (MS-B → MS-C)
IN TEST / IOT&E caution Initial Operational Test & Evaluation
LRIP caution Low-Rate Initial Production (milestone C)
FIELDED neutral Full-rate production, in customer service
SUSTAINMENT neutral Long-term operational support, no active development
ARCHIVED steel No longer active; records preserved
TERMINATED hostile Program ended - cancelled or killed

The program status badge on a program card uses this vocabulary. A program is in exactly one stage at a time - never LRIP + FIELDED.

Software release tier

Label Variant Use
ALPHA caution Pre-beta, internal only
BETA electric External testing, feature-complete
RC electric Release candidate
GA neutral Generally available
LEGACY steel Still supported, not current
EOL hostile End of life, no further support

Applies to individual product builds, feature flags, and API versions.

Operational availability

Label Variant Use
ONLINE neutral Fully operational
DEGRADED caution Partial operation, reduced capability
OFFLINE hostile Not operational
MAINTENANCE caution Scheduled downtime
UNKNOWN steel State not yet reported

Applies to services, integrations, field systems, radio networks.

Record / account state

Label Variant Use
ACTIVE neutral Active, current
INACTIVE steel Dormant - no action needed
SUSPENDED caution Paused, recoverable
ARCHIVED steel No longer active, preserved
REVOKED hostile Access removed

Applies to users, API keys, sessions, issued credentials.

Tactical state (product-specific)

Tactical state labels are product-specific - GRIDWATCH and QRF use them differently, and they describe territory rather than entities. These extend the vocabulary, they don’t replace the above.

Label Variant Use
SECURED neutral Controlled, no active threats
CONTESTED hostile Active engagement / disputed control
DENIED caution Cannot access; no control but no active presence
UNKNOWN steel Intelligence gap; state not observed

Applies to sectors, AOs, zones. Used on the QRF sector card and GRIDWATCH overlay legends.

Composition on entities

  • Program card - program-lifecycle pill in the top-right of the card header. One pill. Classification strip at top is structural, separate from the lifecycle pill.
  • Table row - pill in a dedicated Status column, left-aligned. Count badges inline with the count value in other columns.
  • Avatar / user row - small badge bottom-right of the avatar for account state (green dot for ACTIVE, amber for SUSPENDED, red for REVOKED). Label-pill alongside the name if space permits.
  • Filter chip rows (above tables) - tags with an xmark dismiss affordance. These are the only status indicators that are interactive.
  • Menu items / feature flags - small capsule badge with NEW, BETA, or EOL anchored to the menu label.

Color and meaning

Status indicators use the same semantic palette as every other system element:

  • neutral (green) → successful, current, fully operational
  • electric (blue) → active, brand-aligned, in progress
  • caution (amber) → recoverable warning, low-rate, degraded, scheduled downtime
  • hostile (red) → failed, terminated, revoked, offline
  • steel (gray) → inactive, archived, unknown, muted

An operator reading a program list sees the green/red scan first - the label is the confirmation, not the discovery. Status indicators are designed to answer “what’s the state of this?” from five feet away.

Accessibility

  • Color never alone - every status indicator has a text label. Color reinforces; text defines.
  • Icons (where used) reinforce color but aren’t the sole signal. A check inside a green pill for FIELDED is decoration, not meaning.
  • Screen readers announce the label as body text - a pill is an inline span containing the label, no special ARIA beyond what wa-tag provides.
  • Tags with dismiss controls carry aria-label="Remove filter: {label}" on the dismiss button.
  • Badges with count values carry aria-label="{count} {item type}" on the badge container - “7 unread notifications” rather than just “7.”

Anti-patterns

  • Inventing local statuses. If a product needs a status not in the vocabulary, raise it to the design system. Do not improvise SEMI-FIELDED, IN-FIELD-TRIAL, DEPRECATED-BUT-USED because the existing list “doesn’t quite fit.” Expand the system or use the nearest approved label.
  • Multiple lifecycle indicators on one entity. A program isn’t LRIP + FIELDED. It’s one or the other. Multi-status is a sign the data model is wrong, not that you need multiple pills.
  • Using all three shapes for the same attribute. A program has a lifecycle pill, not a pill AND a tag AND a badge for the same state. Pick one shape per attribute.
  • Status indicators carrying action. A clickable TERMINATED pill that opens a termination dialog is a notification pretending to be a status. Status describes; actions go through buttons and menu items.
  • Electric-blue everywhere. When every status is electric, nothing stands out. Reserve electric for active / in-progress states (EMD PHASE, BETA, RC). Historic and archival states are neutral (current / stable) or steel (dormant / archived).
  • Animation. Status indicators describe persistent state. They don’t pulse, glow, or fade in. Animation on a status indicator reads as “this is changing” - which contradicts what a status indicator is.
  • Pill without a semantic color. A pill in steel or navy-700 with no semantic tint is just an uncolored label - use a tag or drop it. Every pill carries meaning through color.