OpsWarden visual contract¶
This document defines the visual rules shared by the web and desktop clients.
Canonical values live in client-web/app/globals.css; shared components consume
semantic roles instead of choosing colors screen by screen.
Primary palette — 5 colors¶
| Color | Primary role |
|---|---|
#15161A |
Control-room background |
#1B1C20 |
Surfaces, fields and secondary actions |
#E7E7EA |
Primary text and high-priority content |
#FBC02D |
OpsWarden accent, focus and primary action |
#C62828 |
Destructive actions and danger |
Hover variants are derived from these same roles. Operational state and severity colors are not additional brand colors: they only encode live meaning and are always paired with text or an icon.
Semantic roles¶
| Role | Tokens | Usage |
|---|---|---|
| Primary action | --action-primary* |
Main constructive action in a page or dialog |
| Secondary action | --action-secondary* |
Cancel, close, go back or choose an alternative |
| Destructive action | --action-danger* |
Delete, remove, ban, leave or irreversibly cancel |
| Success | --feedback-success |
Operation completed successfully |
| Warning | --feedback-warning |
Risk or required attention without a failure |
| Danger | --feedback-danger |
Error, blocked operation or critical state |
Button has exactly four variants: primary, secondary, danger and
ghost. Alert has info, success, warning and danger. An action must
never use a message color, and a message must never look like a button. Incident
states, Release states and severities use their --st-* and --sev-* tokens
alongside text and an icon.
Hierarchy and surfaces¶
- One primary action leads each decision area.
- Secondary actions appear before destructive actions in dialogs.
surfaceholds primary content;surface-subtlegroups supporting details.- Screens use the shared
Button,IconButton,Alert,Dialog,ConfirmDialog,FormField,ActionMenuandOperationalTablecomponents. PageContentowns the loading, error, empty and ready states.- Responsive layouts preserve labels and action hierarchy; only the table/list or modal/sheet presentation changes.
Sensitive-action and dark-pattern audit¶
ConfirmDialog requires an explicit intent. It places initial focus on the
cancel action, uses distinct labels, closes with Escape and never preselects the
risky action.
| Persistent flow | Protection |
|---|---|
| Delete an account | Named resource, destructive intent and typed DELETE |
| Delete a team | Named team, stated consequences and typed DELETE |
| Leave a team | Named team, stated loss of access and destructive confirmation |
| Transfer Manager | Named recipient, stated role change and standard confirmation |
| Kick or ban a member | Named member, stated consequence and destructive confirmation |
| Delete an Incident | Named Incident, typed DELETE and destructive confirmation |
| Cancel a Release | Named Release, explicit “keep” choice and destructive confirmation |
| Delete a rule | Named rule, stated future impact and preserved history |
| Disconnect a service | Named service and a clear description of removed data |
Immediately reversible operations—filters, status changes, reactions, non-Manager role changes, rule activation and Incident/Release links—add no artificial friction. Removing a step while creating a Release destroys no persisted data. Signing out is a secondary action, not a deletion.
These safeguards are verified by design-tokens.test.ts,
destructive-actions.test.ts, Button.test.tsx, Alert.test.tsx and
ConfirmDialog.test.tsx.