Quiet Sky · application system · v2.0

Quiet Sky, inside the product.

Every product screen, component, CTA and text style — specified in light and dark, built from semantic tokens, and proved on this page. Flip the theme in the sidebar and the whole document re-renders.

22remap rules
9product surfaces
106icons, one family
2themes, one source

The application design system for ai.com — every product screen, component, CTA, and text style, standardized on Quiet Sky and specified in light and dark. Foundations (tokens, type, spacing, motion) are canonical from design-system.html v1.0 and consumed here unchanged; everything else is the product layer built on top of them.

This page is its own proof. Flip the theme toggle in the sidebar — every demo, mock, and table re-renders because every component consumes semantic tokens only. Components marked Canonical come from v1.0; Extended are new product components derived under the system's rules; Remap flags a correction of the current UI.

The five rules, product edition

  • One color carries the brand. Cyan, three readings. No gradients, no violet, no second hue — the purple "AI" family is deleted.
  • The accent means something. Live dots, agent presence, active states, links. Never decoration, never a button fill.
  • Flat night surfaces. Product dark mode has no aurora, no glow — those belong to marketing.
  • The dot is the agent. Agents are accent-dot circles with a pulsing halo — never letter squares, never sparkles.
  • Trust is visible. Checkpoints, verified-done, Stop — components, not badges.

Deleted from the product

  • Purple/violet accents, sparkle icons, gradient text, gradient thumbnails.
  • Colored usernames, letter-square avatars, the "ai" badge.
  • Green / orange / gold / blue ad-hoc state colors — every state maps to accent, danger, mint, or neutrals.
  • Monospace in UI chrome (paths, secrets, metric chips). Italic placeholders.
  • Black rectangles, white rectangles, and green fills as buttons — pills only.
Audit → law

The remap.

Every visual violation found in the July 2026 product screenshots, with its binding Quiet Sky replacement. This table is the migration checklist — when all rows are cleared, the product is on Quiet Sky.

#Where seenCurrentQuiet Sky replacement
R1Priorities, Today's Brief, sparkles, selected day, "Discuss" linksPurple/violet as the "AI" colorDelete the violet family. Agent presence = the dot system: --accent pips, --accent-tint fills, --accent-text labels. Sparkle glyphs retired.
R2Skills & Apps heroPink→purple gradient headlineTitle 1 in --text-1. Gradient text does not exist anywhere.
R3Calendar eventGreen "Join call" fillPrimary pill. Live-ness = glowing pip + "Live" ds-label--ok, never a green button.
R4DM / Room timelinesSlack-style colored usernamesNames in --text-1 600. Identity = avatar + name, never name color.
R5Discover tabOrange "Update available" chipds-label--accent. Orange is not a system color.
R6Priority advisory lineOrange warning text--text-2 + neutral pip. Danger only for destructive/stop. Urgency is copy + placement, not paint.
R7Sidebar logo, user avatarCrimson square markai·com wordmark — ink text + accent dot. Human avatars become circles.
R8Communication HealthGold/brown meterds-meter: accent fill, danger past warn threshold only.
R9Wiki, dashboards, meeting linksDefault blue hyperlinks--accent-text, 500–600, underline on hover.
R10Wiki paths, Vault secrets, metric chipsMonospace + red inline-code in chromeOnest. Source refs = neutral chips. Monospace only inside authored code blocks in content.
R11"Today 9 PM" chipRed/pink date chipNeutral chip; accent + live pip only when happening now. Danger is never a time color.
R12Knowledge graphRainbow node paletteConcept = accent · Synthesis = ink · Source = hollow neutral · Service = mint. No new hues.
R13Agent avatarsLetter squares + "ai" badgeds-ava--agent: accent dot circle, pulsing halo. Attribution "mika · Maya's agent" is structural.
R14App cardsDark thumbnails, purple gradients--surface-2 wells, --r-inner, glyph or live preview. No gradients.
R15All CTAsFour button systems (black rect, white rect, green fill, black pill)One system: ds-btn pills — primary / ghost / quiet / deny, sizes lg·md·sm.
R16All tab rowsThree competing tab patternsTwo by rule: segmented ds-tabs for views of the same data; underline ds-tabs-line for sections. Never mixed in one row.
R17Priority card actionsIcon-only actions in accent purpleQuiet icon buttons, --text-3 at rest, tooltip + aria-label required.
R18Notifications, modalsFlat sheets, mixed padding--surface-1 + --r-frame + --shadow-card, hairline headers, ds-input search.
R19Danger zoneOrange "Delete account"--danger row + checkpoint-pattern confirm (the one sanctioned danger fill).
R20Whole productLight mode onlyBoth themes via semantic tokens, data-theme + prefers-color-scheme bootstrap.
R21"No recap yet"Italic gray placeholderDesigned empty state: one sentence + one action. Italics don't exist in the system.
R22Sidebar active itemFloating white card--accent-tint fill + --accent-text. Hover = --fill. No shadows in the rail.
App shell

One chrome for every screen.

Rail → main → optional right panel, all on --bg, separated by hairlines. The product is one continuous surface — never a dark sidebar beside a light canvas.

260px on --bg with a right hairline. Active = accent tint + accent text; hover = quiet fill. Agents are dot avatars; people carry presence pips; the only card is the feedback card. Collapses to an icon rail at 1024, a five-slot tab bar at 640.

Command Center
Calendar
Workflows
Skills & Apps
Knowledge
Agents
aibot
Extract task summary…
Get current time
See all chats (15)
People · 10
Ppeter.choi
Ssanjaypramod
Rooms
announcements
shipping-week
Share feedbackHelp us improve ai.com
Jjeetzandawala
Command Center
Calendar
Workflows
Skills & Apps
Knowledge
Agents
aibot
Get current time
Rooms
shipping-week
client-updates3
Jjeetzandawala
ElementSpec
GeometryFixed 260 · --bg · right 1px --border · padding 16/12 · logo row 56px · user row 56px pinned with top hairline
Nav rows34px · 13.5/500 --text-2 · icon 18 in --text-3 · radius --r-tight · hover --fill + text-1 · active --accent-tint + --accent-text 600
Section headersMicro label 11/700 +0.08em uppercase --text-3 · 24px top margin · trailing quiet + button · People/Rooms collapsible
Agents20px dot avatar (halo animates while working) + handle 13.5/600 · chat sublist 30px rows indented 30 · active chat accent-tint
People / Rooms20px circular avatar + presence pip (6px --ok filled = online, hollow = away) · unread room = name 600 text-1 + accent pip · counts = ds-count
Responsive1024: icon rail 64px, labels in tooltips · 640: bottom tab bar — Brief · Rooms · Agent · Approvals · More (56px + safe-area)

Page headers & the two tab patterns Extended Remap R15 · R16

One header pattern: [title or view-tabs] ——— [meta] [one primary action]. 60px, bottom hairline. And exactly two tab patterns: segmented pills switch views of the same data; underline tabs switch sections or documents. Never both in one row.

Light
Updated 5h ago

Calendar

Dark
Updated 5h ago

Calendar

PatternAnatomyUse forNever
ds-tabs (segmented)--fill pill container, 3px pad · items 13/600, 6×14, active = --surface-1 + hairline inset + text-1Priority/People · Yours/Discover · All/DMs/Mentions · type filtersSection navigation; more than 5 items
ds-tabs-line (underline)Items 13.5/600 --text-2, 20px gap · active = text-1 + 2px --accent underlineBrowse/Sources/Search/Ask agent · Files/Apps/Skills/Activity/PinsFiltering the same list; pairing with segmented in one row
Header60px · title Title-1 22–26/700 or view tabs, not both · right: caption meta + max one primary pillEvery main surfaceTwo primaries; stacked toolbars

Popovers, modals & sheets Extended Remap R18

Popover: --surface-1 (or --glass + blur 14 when floating over content), radius --r-frame, --shadow-card, hairline header, max-height 60vh. Modal: centered, 960 two-pane (nav 240 on --surface-3) or 520 single; scrim rgba(10,13,18,0.4) both themes; Esc closes, focus is trapped and returned. Mobile sheet: radius 20 20 0 0, grabber 36×4, verbs stack full-width, Deny never collapses into a menu. Full demos: Settings and Notifications.

Components

The product library.

Every product component in both themes, built strictly from semantic tokens. Buttons, chips, labels, checkpoints, bubbles, panels, inputs, meters and toasts are canonical from v1.0 and appear here only where a product surface composes them.

Priority card & reply rows Extended Remap R1 · R6 · R11 · R17

The Command Center stack. Collapsed cards are one 15/600 line with quiet icon actions (tooltips required, --text-3 at rest — never accent). Expanded body nests on --surface-3 with a neutral time chip, provenance line, neutral advisory, and one primary verb. The date lockup replaces the purple date badge.

Light

Your priorities today

Fri31Jul

Lock in tonight's 1:1 with Aaron

AK/JZ sync at 9 PM — no agenda, Aaron unconfirmedToday 9 PM

Your 1:1 with Aaron Kurzak is at 9 PM with no agenda. Aaron hasn't confirmed attendance.

Calendar AK/JZ sync — no agenda, Aaron unconfirmed
Risk of a no-show or an unproductive sync.

Unblock Sid on Slack auth today

Only Your priorities today is visible to your manager.
Dark
Awaiting reply 2
Rayna hasn't replied about AIC messages 0d
Hristo hasn't replied about Slack workflows 0d
Add
PartSpec
Card--surface-1 · --border · --r-card · --shadow-soft · 10–12px stack gap · head 13×16 padding
HeadlineTitle 3 15/600, one line · chevron quiet button leads · three quiet icon actions trail (thumbs, discuss) with tooltips
Expanded bodyNested --surface-3 + --r-inner, inset left 42 to align under headline · item 14/600 + checkbox 18 (--r-tight, accent when checked) + neutral time chip
Advisory13.5 --text-2 with neutral pip — never orange, never danger unless destructive
Footer"Sources ▾" quiet sm · one primary md verb · "Discuss" quiet sm. One primary per card, always.
Reply rowCheckbox · statement 14/600 · age chip sm · snooze + hide quiet icons · done = check on + text-3 strikethrough
DigestIntro paragraph above the stack: 15/1.6 --text-2, names and times 600 --text-1, max-width 720

Today's Brief Extended Remap R1

The brief joins the checkpoint family — tinted because it carries meaning. Accent tint + accent border, dot-led eyebrow (no sparkle), body 13.5 with 600 emphasis, then neutral chips on translucent surface so they read on the tint.

Light
Today's brief

One 30-minute commitment anchors the day: the Command Centre daily sync at 10:30–11:00. Use the clear morning to prepare your priorities, then keep the long afternoon block protected for focused product work.

1 meeting at 10:30Heads-down 09:00–10:30Heads-down 11:00–18:00
Dark
Today's brief

One 30-minute commitment anchors the day: the Command Centre daily sync at 10:30–11:00. Use the clear morning to prepare your priorities, then keep the long afternoon block protected.

1 meeting at 10:30Heads-down 09:00–10:30

Calendar — day strip & event card Extended Remap R1 · R3

Selected day = accent tint (was purple). Join call is a primary pill — live-ness is announced by the glowing pip and the "Live" mint label, never by a green button. Attendee presence uses --ok pips (filled = yes/joined, hollow = awaiting). "Agent prepped" leads with the dot, not a sparkle.

Light
Sun26
Mon27
Tue28
Wed29
Thu30
Fri31
Sat1
10:30
Command Centre daily sync
tom.kwok@crypto.com · 37 attendees
Agent prepped for this
10:30 – 11:00
Live
37 guests · 24 yes, 1 no, 12 awaiting
Tom Kwok (Organizer)
Jeffrey Chan
Silas Choi
+29 more
Dark
Thu30
Fri31
Sat1
Sun2
Mon3
Tue4
Wed5
10:30
Command Centre daily sync
tom.kwok@crypto.com · 37 attendees
Agent prepped for this
Live

Call history rows Extended Remap R15 · R21

Two-column rows inside one hairline-divided panel. "Untitled call" renders as a placeholder (500, --text-3, upright — italics don't exist). The empty recap is a designed state with its action. The chip-button row uses ghost sm buttons in sentence case.

Call ended Wed, Jul 15, 4:58 PM · 2 mins
dev-matrix-w0.sunbeam brief status check-in review
1 person
No actionable outcome identified from the brief status check-in review meeting.
Call ended Fri, Jul 24, 2:09 PM · 5 mins
Untitled call
S1 person
No recap yet.

People & communication health Extended Remap R8

Attention is an accent ring on the avatar — never gold. Relationship states come from the closed label vocabulary: Cooling (neutral) · Needs attention (accent) · Strengthening (ok). The health meter is the system meter: accent, danger past threshold.

Light
Engineering
HRhristo
Product
ANandre SIsid
andre.matsudaNeeds attention

Andre hasn't messaged in 6 days — you drive 88% of the chat. Principal product designer; last contact 6 days ago.

Dark
Communication health
PersonYou / themReplyLast active
rayna
75/25
19mToday
andre
88/12
—6d ago

Meter flips to danger past the 85% one-sidedness threshold — the only non-accent meter state.

Timeline — rooms, DMs & the agent thread Extended Remap R4 · R9 · R13

One message language, two densities. Room timeline: flat rows, 26px circular avatars, names in --text-1 600 (never colored), grouped messages indent 36px. Agents are dot avatars with structural attribution. Agent thread: the canonical v1.0 bubble conversation — shown here composed with steps, working line and checkpoint.

Light · room timeline
Jun 5
J
jeetzandawala
send the 4 messages again
S
sanjaypramod
hello! how has your day been?
i heard you were working on the notification center
👍 1+
mika· Maya's agent
Meeting started — join wrk-atrc-wbr
1 replyLast reply May 6 at 11:15 AM
sanjaypramod left · 15:16
Dark · agent thread
What time is it?
Agent
It's Monday, June 29th — 6:09 AM in UTC. Ask me for any other timezone.
✓ Checked your workspace timezone ○ Set a reminder for later today
↳What time is it in New York?
↳Show me the current date
Needs you — nothing sends until you approve
6 drafts ready to send via Gmail. From Workflow · invoice chaser · run 7.
PartSpec
Room row26px circular avatar · name 13.5/600 --text-1 + timestamp 11.5 --text-3 · body 14/400, line-height 1.55 · grouped: 4px gap, 36px inset, no avatar
Agent attributionDot avatar + "mika · Maya's agent" caption. The "ai" badge and letter squares are retired (R13).
DividersDay: centered caption between hairlines · system lines ("left · 15:16"): centered caption, no bubble
Thread summary22px avatar + "1 reply" 12.5/600 --accent-text + last-reply caption · hover --fill, radius --r-tight
ReactionsChip sm (emoji + count) · own = accent tint + accent border · "+" ghost chip on hover
Follow-ups"↳" + suggestion 13.5 --text-2 in a ghost pill row · trailing quiet edit icon · Enter sends, edit opens in composer
Links / codeLinks --accent-text 500, hover underline · literal code only: --surface-2 well, mono 12 — every other "chip" is Onest on --fill (R10)
Message chromeWorking line + Stop, steps, checkpoint, verified-done: canonical v1.0, unchanged

Composer Extended

One composer everywhere — Rooms, DMs, agent chat, the create hero. Surface-1 well, strong border, accent focus ring; quiet-icon toolbar; circular primary send. Placeholder names the destination.

Light
Message #shipping-week
Dark
Draft the launch recap for @aibot

Send activates (full opacity) only when content exists. Toolbar: 28px hit areas, active format = --accent-text.

Skills, apps & the create hero Extended Remap R2 · R5 · R14 · R15

The hero headline is Title 1 in --text-1 — the gradient is gone. Skill rows set names in Onest 600 (even kebab handles), type tags from the label vocabulary, and one primary sm pill for Add/Update. App thumbnails are surface-2 wells — no dark islands, no gradient art.

Create apps & skills for your team

Tell us about your idea and goals, or start from an example.

Our team collects customer feedback but it ends up scattered in emails and docs…
Incident response trackerInteractive team calendarTask management board
Light · list rows
exchange-volume-dashboard Skill Private
Works in chat · Built · by jeetzandawala · v1.0.0 · 0 added
aibot-sessions-viewer App Update available
Opens a screen · 16 added
Browse agent sessions, inspect steps, and replay outcomes.
us-index-tracker Dashboard
Live panel · simon.poon · 9 added
Dark · app cards
Preview
finance-calculatorPersonal
google-calendar-panelPersonal

Hover lifts −4px, shadow-soft → shadow-card. Thumbnails: --surface-2, 16:9, glyph or live preview.

Knowledge — tree, document & graph Extended Remap R9 · R10 · R12

Wiki links are accent-text; source refs are neutral Onest chips (never monospace paths); the graph obeys the four-role node law — Concept accent · Synthesis ink · Source hollow · Service mint — with edges on --border-strong. Flip the theme: the graph re-renders because the roles are tokens.

Concepts
Rewards VaultConcept
12-word Recovery PhraseConcept
24-hour Withdrawal LockConcept
Wiki IndexSynthesis

Wiki index

Synthesis  wiki/index

Concepts

  • Rewards Vault rewards-vault — where users check the distribution status of redeemed experiences.
  • Diamonds diamonds — the in-app rewards currency spent in Mission Rewards.
  • Travel Rule travel-rule — jurisdiction-dependent compliance requirements for crypto deposits.
Graph10 nodes
Concept Synthesis Source Service

Settings Extended Remap R10 · R16 · R19 · R22

Two-pane modal: nav on --surface-3 with accent-tint active states; grouped field rows; connector rows with mint "Connected" checks; Vault names in Onest 600 with masked dots; a danger zone whose destructive row is the only danger text on the page — confirmed via the checkpoint pattern.

Destructive confirm follows the checkpoint anatomy: statement + consequences + verbs [Delete — the one sanctioned danger-filled pill] [Cancel ghost]. Appearance pane hosts the Light/Dark/Auto segmented control.

Notifications Extended Remap R13 · R18

Popover anchored to the rail bell: frame radius, card shadow, hairline header with a quiet "Mark all read", segmented filter, rows with unread accent pips on --surface-3. Agent actors get dot avatars; previews strip markdown artifacts.

Notifications
P
peter.choi

testing in dev

aibot

The button timed out — you can add your Braze credentials via the Vault tab directly. You'll need two values…

jeetz_aibot

Done. The exchange-volume morning briefing cron job has been cancelled and removed.

Notifications
aibot

Usage limit reached. Please subscribe.

S
sanjaypramod

Sent a message

Icons Extended

One family: 1.5px stroke, round caps (Lucide-compatible). Sizes 14 inline · 16 buttons/meta · 18 nav · 20 headers. Color --text-3 at rest in chrome, --text-2 in content, hover/active --text-1; accent only when the icon is the state signal. The sparkle glyph is retired platform-wide — the agent's mark is the dot.

Page specs

The nine surfaces.

Every product screen assembled from the shell and library above. The mocks below follow the global theme — flip the toggle to review each page in dark. Each spec ends with the corrections applied against the July 2026 screenshots.

E1–E2 · Command Center Remap R1 · R6 · R11 · R15 · R17 · R22

Command Center
Calendar
Workflows
Skills & Apps
Knowledge
Agents
aibot
Rooms
announcements
Updated 5h ago

Your 9 PM with Aaron has no agenda and he hasn't confirmed — ping him now. Sid also needs your auth guidance. Two replies are waiting: Hristo on workflows and Rayna on AIC.

Your priorities today

Fri31Jul

Lock in tonight's 1:1 with Aaron

AK/JZ sync at 9 PM — no agenda, Aaron unconfirmedToday 9 PM

Your 1:1 with Aaron Kurzak is at 9 PM with no agenda. Aaron hasn't confirmed attendance.

Risk of a no-show or an unproductive sync.

Unblock Sid on Slack auth today

Only Your priorities today is visible to your manager.
Awaiting reply · 2
Rayna hasn't replied about AIC messages0d
Hristo hasn't replied about Slack workflows0d
Add
ZoneSpecCorrections applied
HeaderSegmented tabs left, "Updated 5h ago" + refresh right (C2)Pill/plain hybrid → one segmented control (R16)
ContentColumn max 720–760 centered · digest → priorities panel → privacy footer → awaiting-reply → add rowPurple accents → dot system (R1) · orange risk → neutral advisory (R6) · red date chip → neutral (R11)
People tabDigest → team grid (accent attention rings) → focus person card → health table (D6)Gold meter → accent/danger meter (R8) · "Reach out" rect → primary pill (R15)

E3 · Calendar Remap R1 · R3 · R15 · R21

Calendar

Earlier
Call ended Wed, Jul 15, 4:58 PM · 2 mins
dev-matrix-w0.sunbeam status check-in
1 person
No actionable outcome identified from the status check-in review meeting.
Call ended Fri, Jul 24, 2:09 PM · 5 mins
Untitled call
No recap yet.
Wed29
Thu30
Fri31
Sat1
Sun2
Mon3
Tue4
Today's brief

One 30-minute commitment anchors the day: the daily sync at 10:30. Keep the afternoon block protected.

1 meetingHeads-down 11–18
Morning · 1
10:30
Command Centre daily sync
Agent prepped
Live

Corrections: purple brief/selected-day → accent tint (R1) · green Join call → primary pill + Live label (R3) · italic "No recap yet" → designed empty state (R21) · black "New call" pill absorbed into the one primary system (R15).

E4 · Skills & Apps Remap R2 · R5 · R14 · R15 · R16

Layout: create hero (D10) centered at top → panel with segmented [Yours | Discover] → toolbar (search ds-input + Import skill ghost; Discover adds Sort select + grid/list toggle) → filter tabs (All / Skills / Apps / Dashboards) + "77 items" caption → skill rows or card grid. All CTAs are pills; type tags come from the label vocabulary; names in Onest 600. Corrections: gradient headline → Title 1 ink (R2) · orange update chips → accent labels (R5) · black rects → primary sm pills (R15) · dark-pill filter → segmented tabs (R16) · gradient thumbnails → surface-2 wells (R14). Components rendered in the library above.

E6–E7 · Chat surfaces — agent DM, human DM, Rooms Remap R4 · R9 · R10 · R13

aibot
Jun 29
J
jeetzandawala
what time is it?
aibot· your agent
It's Monday, June 29th — 6:09 AM in UTC. Full dashboard: app.datadoghq.com/dashboard/3bc
↳What time is it in New York?
↳Set a reminder for later today
Message aibot

Corrections: green/orange usernames → text-1 600 with structural attribution (R4) · "ai" badge and letter squares → dot avatars (R13) · blue links and link boxes → accent-text links (R9) · monospace metric chips in agent output → neutral Onest chips; literal code only in surface-2 wells (R10). Rooms use the identical timeline with thread summaries, reactions, and system lines (library demo).

E5 · Knowledge — E8 · Settings — E9 · Notifications Remap R9 · R10 · R12 · R16 · R18 · R19 · R22

Knowledge: page header (Title 1 + subtitle) → underline tabs (Browse / Sources / Search / Ask agent) → recent-changes bar → the three-pane layout in D11: tree 280 · document ≤760 · graph 380. Settings: the two-pane modal in D12 — Account fields, Appearance (theme control), Connectors, Vault, Admin. Notifications: the popover in D13 anchored to the rail bell. All three are fully specified and rendered in the component library; their corrections are listed there.

Writing & CTAs

One voice, verb-first.

Copy is part of the system. These rules bind every button, label, timestamp, and empty state in the product.

RuleStandardExamples
CaseSentence case everywhere — buttons, labels, tabs, titles. Micro labels uppercase via CSS only. Proper nouns keep their case."Mark all read" · "New call" · "Import skill" · "Ask agent"
CTAsVerb-first and concrete; one primary verb per view; Deny/destructive text-only and last. Never OK / Submit / Yes."Approve & send" · "Ping Aaron + add agenda" · "Reach out" · "Generate recap"
Agent voiceFirst person, plain, evidence first. No exclamation-mark enthusiasm in system copy."Six drafts ready. I read 132 issues."
TimestampsToday 7:45 · this week Tue 8:42 · older Jul 15 · relative only in meta ("Updated 5h ago", "38d"). Never absolute + relative in one line."Fri, Jul 24, 2:09 PM · 5 mins"
Empty statesOne designed sentence + one action; dashed border container; never italic, never bare."No recap yet." + Generate recap
ErrorsPlain sentence in danger: what happened + next step. No codes in UI copy."That doesn't look like a complete address."
NamesHandles lowercase as authored; agent attribution "mika · Maya's agent"; rooms #lowercase-kebab.jeetzandawala · #shipping-week

The label vocabulary Extended

A closed list — new labels require design review. Rank: solid > accent > ok > neutral > danger.

P0 Needs you Needs attention Update available Live Verified Awaiting reply Draft Private Preview Call ended Skill App Dashboard Synthesis Cooling Stopped
Dark mode & accessibility

Flat night, visible focus.

Dark mode is a token swap, not a redesign — if a component needed dark-specific fixes, it was consuming primitives and must be corrected.

Dark mode law

  • Flat night surfaces only: #0A0D12 / #0D1117 / #12161F. No aurora, glow, or grain inside the app shell — those are marketing.
  • data-theme on <html>; default honors prefers-color-scheme; user choice persists. Both themes declare color-scheme.
  • What flips by rule: primary pill ink→white · accent lifts to #5FD4F2 (raw cyan is too thin on night) · danger lifts to #FF7A87 · shadows become ring + black recipes.
  • Photos and avatars never invert; app thumbnails sit on --surface-2 in both themes.

Accessibility non-negotiables

  • Focus is always visible: 2px --focus-ring, offset 2, both themes. Modals trap focus; Esc closes; popovers return focus.
  • text-3 fails AA — metadata only, never the sole carrier of meaning. Accent-text only at 600–700 weight.
  • Pips, meters, and working bars always pair with text; color and motion never carry state alone.
  • Checkpoint verbs keyboard-operable in DOM order; pending checkpoints announced to AT. Icon-only buttons carry aria-label + tooltip.
  • Touch ≥44×44; row taps full-bleed; prefers-reduced-motion collapses every animation.
Pair≈ RatioVerdict
Ink on canvas / Night ink on night18:1 / 17:1AAA — headings, names, values
Muted on canvas / night6.5:1 / 7:1AA all sizes — the body pair
Faint (text-3)3.3:1Fails AA small — decorative metadata only
Accent deep on white4.2:1600–700 weight labels and links only
Accent night on night11:1AA — why the accent lifts on dark

Migration order

1 · Ship tokens.css + Onest + theme bootstrap.  2 · Replace the four button systems with ds-btn (R15).  3 · Delete the violet family, gradients, and sparkles; land the dot agent avatar (R1, R2, R13).  4 · Normalize tabs, sidebar states, links, monospace (R16, R22, R9, R10).  5 · Components per Part D; pages signed off per Part E.  6 · Turn on dark mode — if 1–5 used semantic tokens honestly, it's a switch, not a project.

Part H · time

Waiting is a designed state.

Every surface can be waiting on a model, a tool call, or a person. What the user sees is chosen by how long the wait is expected to be — not by what is convenient to build.

The loading ladder Extended

Expected waitShowNever
< 120msNothing — render the result.A flash of skeleton; it reads as a bug
120ms – 1sThe destination's skeleton.A spinner
1s – 10sSkeleton + a working line naming the task ("Reading 132 issues…").An indeterminate bar with no words
> 10sWorking line + Stop pill + ds-steps.Blocking the whole surface
StreamingStream into place; the cursor is a ds-pip--live.A percentage you cannot honour

A spinner never appears alone. If you cannot describe the work, you cannot ask someone to wait for it. And a skeleton never breathes for more than ten seconds — past that it has become a lie, and the surface escalates to a working line with a Stop.

Skeletons Extended

Skeletons mirror the real layout — same line count, same widths, same avatar sizes — because the jump on load is the defect, not the skeleton. One opacity breath at 1.6s, rows staggered 60ms. No sweeping shimmer: the system has no gradients, and a diagonal sweep on near-black reads as a rendering artifact.

Light
Reading 132 issues…
Dark
Reading 132 issues…

Optimistic — and the one thing that never is

ActionOptimisticOn failure
Send a messageBubble at 60% opacity, no timestampGains a --danger hairline + "Retry"
Check an itemCheckbox fills, title strikes throughReverts with a toast naming the reason
ReactChip appears in accent-tintChip removes itself; no toast
Approve a checkpointNever.—

Approvals, denials and Stop are never optimistic. A checkpoint that looks approved before the server agrees is a trust failure — and trust is the thing this product sells.

Part I · layering

One scale, no raw numbers.

Ad-hoc z-index values are how a popover ends up under a sticky header. The scale is closed; components consume the token.

TokenValueWhat sits here
--z-base0Page content
--z-raised100Sticky page and table headers, the composer bar
--z-rail200Sidebar rail, right panel
--z-popover300Dropdowns, menus, pickers, notifications
--z-drawer400Mobile sheets, side drawers
--z-scrim500The modal backdrop
--z-modal600Modals, the command palette
--z-toast700Toasts — above modals, so a confirmation stays visible
--z-tooltip800Tooltips — last, because they attach to whatever has focus

The innermost open layer owns the scroll lock and restores position on close; nested overlays never double-lock. Focus enters on open, is trapped for modal-class layers, and returns to the trigger. Esc closes the topmost layer and nothing else.

Part J · input

It is called Command Center. It behaves like one.

Every shortcut below is discoverable from ⌘/ and from the palette — a shortcut that exists only in the docs does not exist.

The command palette Extended

Top-anchored at 14vh, not centred — the list grows downward and centring makes it jump. Selection moves with ↑ ↓; hover sets selection too, so pointer and keyboard always agree. No results offers "Ask your agent instead" — the palette is a front door to the agent, not a dead end.

Esc
Do
Approve the pending checkpointA
Review agent approvals⌘⇧A
Go to
Command CenterG C
WorkflowsG W
↑↓ move · ⏎ run · ⌘. stop the agent
Esc
Do
Approve the pending checkpointA
Review agent approvals⌘⇧A
Go to
Command CenterG C
WorkflowsG W
↑↓ move · ⏎ run · ⌘. stop the agent

The keyboard map

KeyDoesWhere
⌘KOpen the command paletteEverywhere
⌘/Shortcuts sheetEverywhere
⌘.Stop the agentAnywhere an agent is working
G then C W A K LGo to Command Center · Workflows · Skills & Apps · Knowledge · CalendarEverywhere
J KMove through the focused listLists, timelines, notifications
E / SHide / snooze the focused rowPriorities, awaiting reply
A R DApprove · Review · DenyThe focused checkpoint
⌘⏎ / ⇧⏎Send / newlineComposer

A shortcut never fires while a text field has focus except ⌘-combinations. Single-letter shortcuts require the list to hold focus, not the page.

Density Extended

Two densities, one set of components. Density changes space only — never type size, never radius, never stroke. Set with data-density="compact" on the app root. Compact is for tables, rooms and long lists on large screens; never the default on touch, where 44px is the floor.

 Comfortable (default)Compact
Row height44px36px
Section gap24px16px
Card padding16–18px12–14px
Table cell11px 18px7px 14px

Drag & reorder

Only two things reorder: priority items and workflow steps. Everything else sorts. The row lifts to --shadow-card at 0.98 scale; a 2px accent line marks the drop position. The keyboard equivalent is mandatory — Space picks up, ↑ ↓ move, Space drops, Esc cancels, announced through a live region.

Ping Aaron + add agenda
Unblock Sid on Slack auth
Part K · data

What one colour does to a chart.

Quiet Sky has one accent and no gradients. That is not a limitation to work around — it decides the chart system.

The law

  • Magnitude is one hue. The cyan ramp, light → dark. The default for every chart in the product.
  • Identity is position and direct labels — not colour. Two or three series get ramp steps plus an end-label each.
  • Beyond three series: small multiples, or fold the tail into "Other". Never a generated hue.
  • Status colours are reserved. Mint and danger are state, never series 2, and always ship with an icon and a word.

Which means

  • There is no diverging ramp — there is no second hue to build one from. Polarity is two stacked fills with a 2px gap, both labelled.
  • There is no amber. Orange was deleted, so "warning" is copy and placement, not paint.
  • There is no pie chart. Three or more parts are bars.
  • Never a dual-axis chart. Two scales become two charts, or index to a common base.

The ramps — validated, not chosen Extended

Both ramps pass the ordinal checks — monotone lightness, adjacent ΔL ≥ 0.06, light-end contrast ≥ 2:1 against that mode's own surface, single hue. The dark steps are selected, not inverted — they were derived against #0D1117 and validated there, rather than computed from the light hexes. What does flip is the anchor: --chart-5 is always the largest value and always carries the most contrast against its surface — darkest on canvas, brightest on night. Get that backwards and "most" becomes the least visible mark on the chart. For two series use --chart-4 and --chart-2, not the ends, where one of the pair goes dim in one theme.

Light · on --bg #FBFBFD
123 45
Dark · on --surface-1 #0D1117
123 45

Charts

Bars capped at 24px thick with a 4px rounded data-end square at the baseline · lines 2px with an end-marker ringed 2px in the surface colour · hairline solid grid, never dashed · values at the tip and the line-end only, never on every point · text wears text tokens, never the data colour.

Light
Requests by connector
Last 30 days
Slack 412 Gmail 338 Calendar 214 Linear 156 Notion 92 0 110 220 330 440
Dark
Requests by connector
Last 30 days
Slack 412 Gmail 338 Calendar 214 Linear 156 Notion 92 0 110 220 330 440
Light
Where the work went
Monthly, 12 months
88 44 Aug Nov Feb May Jul 96 72 48 24 0
Handled by agent Escalated
Dark
Where the work went
Monthly, 12 months
88 44 Aug Nov Feb May Jul 96 72 48 24 0
Handled by agent Escalated

Every chart ships a hover layer and a table view behind a quiet toggle — that is the accessibility contract, and it is also what people copy into a document.

Stat tiles, meters, stacks

Light
Handled by agent
88%
12 pts
Median first reply
19m
4m slower
You / them · #shipping-week
75 / 25
PR H+7 11 in the room
Dark
Handled by agent
88%
12 pts
Median first reply
19m
4m slower
You / them · #shipping-week
75 / 25
PR H+7 11 in the room

A delta chip always carries an arrow and a number — never colour alone. Avatar stacks cap at four faces with a 2px surface ring each; the overflow is a +N chip, and an agent is never folded into the overflow — you must always be able to see that an agent is in the room.

Part L · sound

The same rule as the accent.

The sound identity is part of this system, not a side project — and like cyan, it only fires where it carries meaning. QuietSkySound.play(name).

SoundFires whenTier
signatureFirst launch of a session, and nowhere elseattention
sendYou send a messageambient
tapA human message arrives in the room you are looking atambient
pingA DM arrivesambient
mentionYou are mentionedattention
checkpointThe agent needs youattention
doneA verified-done strip landsattention
liveA call starts, or a workflow begins a runambient
callEndA call endsambient
stoppedYou pressed Stopattention
errorAn action failedattention

Silent

  • Never on hover, scroll, typing, focus change or navigation.
  • Never for something you are already looking at — an arriving message in the focused room plays tap; the same message while you are typing in it plays nothing.
  • Never two sounds inside 400ms. The later wins.
  • Muted entirely during a call except stopped and error.

Always

  • Attention-tier is off until the user opts in; ambient respects the OS setting.
  • A sound never carries information alone. Every sound accompanies a visible change — it is a second channel, never the only one.
  • Print (Part M): force light, drop the rail and all hover chrome, and print each chart's table view beneath it.

ai.com · Quiet Sky application design system v2.0 · August 2026 · Internal · Foundations: design-system.html v1.0 (canonical) · Audit source: product screenshots, July 2026 · Terminology per the ratified glossary: Workflows (formerly Routines). Parts H–M added August 2026 — time & loading, layering, input, data & charts, sound, print; chart ramps validated against each mode’s own surface. Companion doc: app-design-system.md.