Colors
All tokens come from a single CSS-variables block defined in the shell. Use semantic names (--green for success, --rose for error) not raw hex.
Brand
Semantic
Neutrals
Typography
DM Serif Display for hero headlines and donor-portal accents · DM Sans for everything else · Lora for the donor-facing portal logo.
Buttons
Primary for the one most-important action per surface · ghost for secondary · rose for destructive · success for confirm.
.btn .btn-primary · .btn .btn-ghost · .btn .btn-rose
Form inputs
All form fields share the same border-radius and focus halo. Always pair with an UPPERCASE label above and an optional help message below.
.lbl .fld · .fld:focus · .fld.error
Chips & tags
Use to label state (Active / Lapsed), gift type (Cash / DAF), or filter selections. Always semantic — green = good, amber = caution, rose = bad, blue = info, purple = AI.
Status chips
.tag.green · .tag.amber · .tag.rose · etc.
Gift type chips
Badges
Smaller than chips, all caps, for phase indicators and feature flags.
Avatars
Initial-based circles · color derived from constituent type or hashed from name. 4 sizes: xs (20) · sm (28) · md (36) · lg (56).
Alerts & banners
Inline messages with a leading icon, bold title, and supporting text. 5 variants: info · success · warn · danger · ai.
.alert.info · .alert.success · .alert.warn · .alert.danger · .alert.ai
Modals & dialogs
Atlas uses three modal patterns: confirmation dialog (centered, short), info modal (centered, scrollable), and slide-over drawer (right edge, full task flows like Log activity / Add task / Invite user).
Confirmation dialog
Disconnect QuickBooks?
Atlas will stop syncing immediately and the nightly export will not run tonight. Existing data stays.
Info modal · used for documentation pop-ups
Why we ask for your address
The IRS requires your name and mailing address on every tax receipt over $250.
Slide-over drawer · already used across 6 screens
.scrim + .drawer + .drawer-head + .drawer-body + .drawer-foot
Toasts
Bottom-right corner notification. Auto-dismiss after 5 seconds. Use for "you've done something" feedback (gift saved, email sent, audit-log fired).
Empty states
When a list is empty by design (no tasks today, no pending duplicates). Always explain why, and what the user can do.
You're all caught up!
No tasks due today. Take a moment to log activities from yesterday or plan tomorrow.
+ Plan a taskNo pending duplicates
Atlas hasn't flagged any matches above 75% confidence. Last scan was 14 minutes ago — runs every time a new constituent is created.
View resolved (42)Loading states
Use skeleton blocks for predictable content (lists, tables, cards), and the centered spinner only for unpredictable async (sync to GiveCentral, sending email).
Skeleton
.skel.circle · .skel.short · .skel.med · .skel.long · .skel.tall