Colors
Product color tokens from
design-system/Product-Colors.json. All live-preview swatches use var() and swap automatically with dark mode. Base tones from Base-Tones.json are available via the toggle below.Text
--text-primary
Purple 10
--text-secondary
NC 40
--text-tertiary
NC 60
--text-disabled
NC 80
--text-contrast
White
Primary & Secondary
--primary
Purple 40
--primary-dark
Purple 30
--primary-light
Purple 60
--primary-lighter
Purple 80
--purple-90
Purple 90
--secondary-cyan
Cyan 50
--secondary-cyan-dark
Cyan 10
--secondary-blue-light
Blue 80
--secondary-green-light
Green 80
--secondary-green
Green 50
--secondary-warm
NW 80
--accent-yellow
YE 80
--accent-green
GE 90
Backgrounds
--bg-0
NC 100
--bg-1
NC 98
--bg-2
NC 95
--bg-3
NC 90
--bg-4
NC 80
--bg-viewport
canvas
--bg-surface
sheets
--border
dividers
--border-light
subtle
Semantic
--danger
Error
--warning
Warn
--success
Success
Component Aliases
Tokens that reference other tokens. Swap automatically in dark mode.
--bubble-user-bg
user bubble
--bubble-agent-bg
agent bubble
--bubble-social-bg
social bubble
--widget-flight-bg
flight
--widget-calendar-bg
calendar
--widget-email-bg
email
--widget-news-bg
news
Toggle "Dark" in the header to see all preview components respond to the dark theme live.
Base Tones
Purple
Cyan
Blue
Green
Yellow Energy
Green Energy
Neutral Warm
Neutral Cool
Neutral Gray
Typography
System sans-serif:
-apple-system, BlinkMacSystemFont, 'SF Pro Text'Type Scale
Display
Good morning, Alice
size44px
weight400
tracking−2px
lh46px
usedGreeting
Body
How can I help you today?
size17px
weight400
tracking−0.408px
lh22px
usedBubble body
Title 3
Messages
size16px
weight600
usedNav title · Section header
Title 2
Flight cancellation!
size15px
weight600
tracking−0.408px
usedCard title
Headline
Alice Adams
size14px
weight500
lh20px
usedList name · Row label · Filter pill
Body Small
Your SEA → JFK flight on Dec 18 was cancelled.
size13px
weight400
lh18px
usedList preview · Sender · Account email
Caption
Just Now
size12px
weight500
lh16px
usedTimestamp · Date pill · Widget label
Label
Personal Agent
size10px
weight400
lh16px
usedNav subtitle · Avatar name
Icons
All SVG assets from
/assets/. Canvas size shown below each name. Usage counts are generated by node scripts/process-icons.js.Icon Library
24 × 24
Sub-24
Avatars
Two types: image (user photo fills the circle) and agent (colored background + Continua mark). Both use
border-radius: 50%.Agent Avatar
Personal
settings
56px
settings
56px
Personal
nav
48px
nav
48px
Personal
list / card
36px
list / card
36px
Social
bubble
30px
bubble
30px
Image Avatar
Alice
settings
56px
settings
56px
Alice
tab active
32px
tab active
32px
Alice
tab inactive
32px
tab inactive
32px
Bob
list / nav
48px
list / nav
48px
Bob
bubble
30px
bubble
30px
Carol
list / nav
48px
list / nav
48px
Carol
bubble
30px
bubble
30px

Ski Trip
group photo
48px
group photo
48px
Brand Marks
Logotype and agent avatar variants.
Continua Mark
(dark bg)
Status Bar Mobile only
Always frozen at 8:33. Sits at the top of every screen inside a
.top-bar frosted glass wrapper.Status Bar
Time left, signal / wifi / battery right. Frosted white background.
Home Indicator Mobile only
iOS safe-area bar. Appears at the bottom of all tab-bar screens.
Home Indicator
Tab Bar / Site Nav Tab bar: Mobile · Site nav: Desktop
Primary navigation. Mobile uses a 60px bottom tab bar; desktop uses an 88px top site header with horizontal links. Same tabs — different form factor.
Chat Input Mobile + Desktop
Primary text and voice input at the bottom of all chat screens. Combines a growing textarea, an attachment button (+), and a mic/send toggle. The input field border turns primary on focus; the mic icon swaps to send when text is present.
Input Bar — Interactive
Type in the field or tap a state chip to see how the component responds. Icon spans are replaced by inline SVGs at build time via
npm run build:icons.Mic (icon-mic) swaps to Send (icon-send) when textarea has text. The send button uses --fill-1 (accent) as its fill color. Attachment button always visible.
Message List Items
Tappable rows in the Messages screen. Two variants: agent (tinted bg) and standard.
Agent Row (selected / tinted)
Always first. Subtle purple gradient indicates the primary agent thread.
Personal Agent Chat
Just Now
Some conversational thread that is about this long and wraps to two lines, we should always
Standard Row
Group chats and 1:1 DMs. White background, border-bottom divider.

The Ski Trip
Just Now
I can't believe how much snow we got! I'm already looking forward to our next trip.
Bob Blevins
Yesterday
Yeah, Alta was epic! I'm already checking flights for Snowbird in March.
Carol Cairns
Yesterday
Totally! I'm ready to hit the slopes again. Maybe Aspen next time?
Chat Bubbles
Five distinct bubble types. All share the same base padding (14px 16px), border-radius (16px), and font (17px/400, tracking -0.408px, lh 22px).
Agent — gray
Robin's messages in the 1:1 agent chat. No avatar inline.
First things first — What do you want to call me?
OK — so who do I have the pleasure of working for?
User / Alice — primary
Outgoing messages, right-aligned.
I'll call you Robin
I'm Alice Adams
Social Agent — lavender (with header)
Group chat AI agent messages. Shows sender + timestamp header row.
Group Person — gray (with header)
Other humans in a group chat. When consecutive from same sender: hide avatar (opacity 0).
Bob Blevins12:51PM
Wow this is amazing, I can't wait to learn more about this.
Carol Cairns12:51PM
Seriously, this is so cool. Let's get planning.
Action Confirmation — check + label
Confirms a completed agent action. No arrow = not tappable.
Agent name changed to Robin
Action with Arrow — tappable
Spinner while the agent works; check + chevron when done and tappable.
Tapping opens the linked document. Chevron only appears once the action completes.
Permission Picker
A stacked single-select radio card group used as an agent response. Supports N options. The outer container clips children with greater rounding than the items themselves, creating a connected-card visual rhythm. After selection the picker locks — subsequent taps are ignored.
Level 1: Ask me everything
Agent will always whisper before sharing any info or taking action
Level 2: Keep me in the loop
Agent auto-shares low stakes info like availability preferences. Whispers for booking, purchases, or calendar changes.
Level 3: Just get it done
Agent shares freely, executes routine actions. Whispers only when there is a conflict or ambiguity.
Click an option to change selection. Use the state toggle above to preview the locked (post-submission) state.
Permission Picker — Locked (after selection)
Once the user submits a choice, the picker receives perm-picker--locked. Pointer events are suppressed; selection is preserved visually.
Level 1: Ask me everything
Agent will always whisper before sharing any info or taking action
Level 2: Keep me in the loop
Agent auto-shares low stakes info like availability preferences. Whispers for booking, purchases, or calendar changes.
Level 3: Just get it done
Agent shares freely, executes routine actions. Whispers only when there is a conflict or ambiguity.
Tokens used: --component-perm-picker-background · --component-perm-picker-option-background · --radius-lg · --spacing-3 · --spacing-4 · --spacing-1 · --text-primary · --text-secondary · --primary · --bg-0 · --text-tertiary
Chat Meta
Non-message elements that appear inline in the chat stream.
Date Pill
Separates messages by day. Centered in stream.
Today Nov 23rd
System Pill
Automated events, e.g. members added to group.
Bob Blevins and Carol Cairns were added to the chat
Pinned Item
Sticky row between nav bar and chat content. Group chats only.
The Ski Trip Itinerary
Tapping opens the pinned document. Shown only when an itinerary/doc exists.
Greeting Block
Sticky at the top of the home feed. Large greeting + subtitle with primary-colored action count.
Greeting + Subtitle
Good Morning Alice
You have 5 actions to review, and something else to put here for two lines.
Filter Pills
Horizontally scrollable. Square add button, then labelled pills. Active pill is primary-filled.
Filter Bar
Click any pill to toggle it active. "+" opens filter editor (stub). Row scrolls horizontally when pills overflow.
Action Cards
Home feed cards. Gradient variant for AI agent actions, neutral variant for info widgets.
Action Card — Gradient (agent)
Primary card type. Avatar left, title + subtitle center, arrow right. Purple gradient border.
Flight cancellation!
Your SEA → JFK flight on Dec 18 was cancelled. I found 3 alternatives.
Mom's birthday in 9 days
Last year you sent flowers. Want options under $75?
Package delivered
Your order arrived at 2:34 PM.
Entire card is tappable. Arrow confirms navigability.
Widgets
Two fixed-size cards displayed side by side. Weather (gray-blue) and Flight Status (light blue).
Widget — Neutral (solo)
No border, flat --bg-2 background. Used for non-agent info blocks like weather.
Light Rain
48°
Seattle
Widget Row — Weather + Flight
Account Block
Profile row at the top of Settings. Avatar, name, email, sign-out.
Account Block
Alice Adams
aadams@gmail.com
"Sign Out" is destructive — red color is the signal. Should confirm before acting.
Settings Rows
Three variants of the same row component: internal navigation (chevron), external link (outbound arrow), destructive action (danger red).
Settings Row
Click a variant chip to switch.
Chrome Extension
Gmail
Agent Personality
Danger rows require a confirmation dialog before executing.
Pinned Item
Button
Primary interactive control. 4 variants × 3 sizes. Border-radius: 12px. Heights: 44px (L) · 36px (M) · 32px (S).
Button L — 44px
Default size. 15px/600. 20px horizontal padding.
h: 44px · radius: 12px · padding: 0 20px · font: 15px/600 · secondary border: 1px var(--color-bg-3)
Button M — 36px
Medium size. 14px/600. 16px horizontal padding.
h: 36px · radius: 12px · padding: 0 16px · font: 14px/600
Button S — 32px
Small size. 13px/600. 14px horizontal padding.
h: 32px · radius: 12px · padding: 0 14px · font: 13px/600
Form Input
Text input for forms and settings. Includes label, placeholder, focus ring, and error states.
⚠ Created by LLM, needs human confirmation
Form Input — States
This field is required.
Toggle / Switch
Binary on/off control. Used in settings and preferences.
⚠ Created by LLM, needs human confirmation
Toggle — On / Off
Badge
Small status indicator. Used for notification counts, status labels, and metadata tags.
⚠ Created by LLM, needs human confirmation
Badge — Variants
New
Active
Review
3
Inactive
Toast / Snackbar
Ephemeral system feedback. Auto-dismisses after 3–5s. Used for confirmations and errors.
⚠ Created by LLM, needs human confirmation
Toast — Variants
Memory saved
Something went wrong
Message sent
Progress / Loading
Linear and circular progress indicators for async operations.
⚠ Created by LLM, needs human confirmation
Progress Bar
60% complete
Indeterminate
Skeleton Loader
Animated content placeholder shown while data loads. Mirrors real layout structure.
⚠ Created by LLM, needs human confirmation
Skeleton — Message List Item
Empty State
Shown when a list or view has no content. Includes icon, message, and optional CTA.
⚠ Created by LLM, needs human confirmation
Empty State
No messages yet
Start a conversation and Continua will be here.
Presence Indicator
Real-time status dot overlaid on avatars. Online, away, busy, offline.
⚠ Created by LLM, needs human confirmation
Presence — States
Search Bar
Full-width search input used on the Messages screen (messages search) and Memory screen. Two variants: rounded-rect on white bg (messages) and flat on tinted bg (memory).
Messages Search Bar
White background, border, rounded rect (16px). Appears below the nav bar in the Messages screen. Filters the list live.
Memory Search Bar
Tinted bg-2 background, no distinct white fill. Appears at the top of the Memory settings screen.
Segmented Control
Inline selector for switching between 2–4 exclusive options. Used for view modes and filters.
⚠ Created by LLM, needs human confirmation
Segmented Control — 3 Options