Skip to main content
Pricing

Status Indicator

Free

A coloured dot paired with a text label to communicate the current state of a user, service, or entity. Four semantic states: Online (green), Offline (grey), Away (amber), and Busy (red). Always requires a text label — colour alone is never sufficient.

10 variants

Status
Active

Variants

VariantDescriptionWhen to use
OnlineGreen dot with "Online" label indicating active availability.Use when a user or service is currently active and available.
OfflineGrey dot with "Offline" label indicating unavailability.Use when a user or service is disconnected or inactive.
AwayAmber dot with "Away" label indicating temporary absence.Use when a user is idle or temporarily unavailable.
BusyRed dot with "Busy" label indicating the user should not be disturbed.Use when a user is in a meeting, focused, or otherwise occupied.
Custom

Usage Guidelines

Do

Always include a text label alongside the coloured dot.

Don't

Use colour alone without a text label — this fails colour-blind users.

Do

Use semantic colours consistently — green for online, grey for offline, amber for away, red for busy.

Don't

Invent custom status colours outside the four standard variants.

Do

Place status indicators near the entity they describe (next to a name or avatar).

Don't

Show status indicators without explaining what they mean in your product context.

Do

Update status in real-time when possible.

Don't

Use status indicators for non-presence data — use Badge instead.

Code

HTML
<span class="lex-status-indicator lex-status-indicator--online">
  <span class="lex-status-indicator__dot" aria-hidden="true"></span>
  <span class="lex-status-indicator__label">Online</span>
</span>

<span class="lex-status-indicator lex-status-indicator--away">
  <span class="lex-status-indicator__dot" aria-hidden="true"></span>
  <span class="lex-status-indicator__label">Away</span>
</span>

<span class="lex-status-indicator lex-status-indicator--busy">
  <span class="lex-status-indicator__dot" aria-hidden="true"></span>
  <span class="lex-status-indicator__label">Busy</span>
</span>

<span class="lex-status-indicator lex-status-indicator--offline">
  <span class="lex-status-indicator__dot" aria-hidden="true"></span>
  <span class="lex-status-indicator__label">Offline</span>
</span>
CSS Custom Properties
.lex-status-indicator {
  display: inline-flex;
  align-items: center;
  gap: var(--lex-status-gap, 6px);
}

.lex-status-indicator__dot {
  width: var(--lex-status-dot-size, 8px);
  height: var(--lex-status-dot-size, 8px);
  border-radius: 50%;
  flex-shrink: 0;
}

.lex-status-indicator--online .lex-status-indicator__dot {
  background: var(--lex-status-online-color, var(--lex-color-success));
}

.lex-status-indicator--offline .lex-status-indicator__dot {
  background: var(--lex-status-offline-color, var(--lex-text-muted));
}

.lex-status-indicator--away .lex-status-indicator__dot {
  background: var(--lex-status-away-color, var(--lex-color-warning));
}

.lex-status-indicator--busy .lex-status-indicator__dot {
  background: var(--lex-status-busy-color, var(--lex-color-error));
}

.lex-status-indicator__label {
  font-size: var(--lex-status-font-size, 13px);
  color: var(--lex-status-label-color, var(--lex-text-secondary));
}
React
// Using Lexicon CSS classes with React

export function UserPresence({ status }: { status: 'online' | 'offline' | 'away' | 'busy' }) {
  return <StatusIndicator status={status} />;
}

Design Tokens

TokenValue (dark)Value (light)CSS property
--lex-status-dot-sizesize
--lex-status-online-colorcolor
--lex-status-offline-colorcolor
--lex-status-away-colorcolor
--lex-status-busy-colorcolor

Accessibility

  • The coloured dot must be supplemented with a text label — never rely on colour alone.
  • Use aria-hidden="true" on the dot since the label provides the information.
  • If used without a visible label (e.g., on an avatar), provide the status via aria-label on the parent.
  • Ensure dot colours meet 3:1 contrast against the background (WCAG 1.4.11 non-text contrast).

Keyboard Interactions

N/AStatus indicators are non-interactive and do not receive keyboard focus.