DESIGN.md inspired by Loom
White canvas, Charlie Display sans, and a confident Atlassian blue pill — async video that feels like a calm, friendly workspace.
Compare to…
- bg
#ffffff - bg-soft
#f8f8f8 - bg-muted
#f0f1f2 - surface
#ffffff - surface-blue
#e9f2fe - surface-violet
#f8eefe - text AAA · 14.3
#292a2e - text-heading
#101214 - text-strong
#1e1f21 - text-secondary
#505258 - text-tertiary
#6c6f77 - text-muted
#8c8f97 - text-faint — · 2.0
#b7b9be - brand AA · 5.2
#1868db - brand-hover
#1558bc - brand-active
#123263 - brand-soft
#e9f2fe - brand-tint
#cfe1fd - brand-mid
#4d8ced - brand-outline
#a3c3f1 - on-brand
#ffffff - accent-violet
#d8a0f7 - accent-violet-soft
#f8eefe - accent-violet-mid
#bf63f3 - accent-violet-deep
#964ac0 - accent-record
#ff613d - accent-record-soft
#ff613d20 - link
#1868db - link-hover
#1558bc - selected-bg
#e9f2fe - disabled
#b7b9be - border — · 1.3
#e4e2e7 - border-soft
#f1f0f3 - border-strong — · 1.3
#dddee1 - border-input
#b7b9be - border-brand
#1868db - success-bg
#efffd6 - success-text
#4c6b1f - success-solid
#94c748 - warning-bg
#fff5d4 - warning-text
#8a5700 - warning-solid
#ffc716 - danger-bg
#ff613d20 - danger-text
#c77b00 - danger-solid
#ff613d - info-bg
#e9f2fe - info-text
#1558bc
- step-0 0px
- step-1 4px
- step-2 8px
- step-3 12px
- step-4 16px
- step-5 24px
- step-6 32px
- step-7 48px
- step-8 64px
- step-9 96px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - pill
9999px
Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.
- background → bg
- foreground → text
- primary → brand
- primary-foreground → on-brand
- accent → accent-violet
- muted → text-muted
- border → border
- ring → brand
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
name: Loom
tagline: White canvas, Charlie Display sans, and a confident Atlassian blue pill — async video that feels like a calm, friendly workspace.
updated_at: 2026-05-29T21:44:31.560Z
published_at: 2026-05-29T21:44:31.560Z
author: webdesignhot
source_url: https://www.loom.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [saas, ai, media]
tags: [light, sans, friendly, blue, productivity, soft]
preview_swatch: ['#ffffff', '#1868db', '#d8a0f7']
related: [descript, notion, linear]
description: 'Loom''s marketing site is calm, friendly productivity software rendered in a clean white canvas (`#ffffff`), the custom Charlie Display + Charlie Text sans family, and one confident Atlassian-inherited blue (`#1868db`, the `--thd-color-blue-70`) carried on full-pill CTAs. After the Atlassian acquisition Loom''s palette converged on Atlassian''s tokenized blue (the `--thd-color-*` design-token namespace exposes a full 10-step blue, violet, grey, yellow, green ladder), so the page reads as enterprise-grade trust rather than indie-creator playfulness. Headlines land in Charlie Display at ~63px / 700 in near-black `#101214`; body copy sits in Charlie Text at 16px / 1.55 in a softer grey-near-black `#292a2e`. The signature secondary accent is a soft violet `#d8a0f7` (`--thd-color-violet-30`) used for AI / Rovo surfaces, and a hot coral `#ff613d` record dot signals the act of recording. Where Descript ships beauty-editorial cream-pink and Runway ships chrome-on-black, Loom ships the reassuring white-and-blue of a tool your whole company already trusts — friendly enough for a creator, calm enough for IT to approve. CTAs are full-pill (9999px radius) — the rounded, approachable shape is the whole register: nothing sharp, nothing aggressive, just "press record and send."'
# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
background: bg
foreground: text
primary: brand
primary-foreground: on-brand
accent: accent-violet
muted: text-muted
border: border
ring: brand
colors:
# Primary
bg: '#ffffff' # white page canvas (rgb 255,255,255)
bg-soft: '#f8f8f8' # grey-10, softest panel wash
bg-muted: '#f0f1f2' # grey-20, nested section band
surface: '#ffffff' # raised white card on white — defined by border, not fill
surface-blue: '#e9f2fe' # blue-10, soft-blue feature surface / secondary CTA bg
surface-violet: '#f8eefe' # violet-10, AI / Rovo surface wash
text: '#292a2e' # grey-100, primary body copy (soft near-black)
text-heading: '#101214' # black — headlines, leans true-black
text-strong: '#1e1f21' # black-neutral, emphasized copy
text-secondary: '#505258' # grey-80, secondary copy
text-tertiary: '#6c6f77' # grey-70, captions / metadata
text-muted: '#8c8f97' # grey-50, helper / placeholder
text-faint: '#b7b9be' # grey-40, disabled microcopy
# Brand (Atlassian-inherited blue ladder)
brand: '#1868db' # blue-70, primary CTA + links (--thd-color-button-fr)
brand-hover: '#1558bc' # blue-80, hover / pressed
brand-active: '#123263' # blue-90, active / deep press
brand-soft: '#e9f2fe' # blue-10, soft hover wash / chip bg
brand-tint: '#cfe1fd' # blue-20, mid tint
brand-mid: '#4d8ced' # blue-50, mid-bright accent
brand-outline: '#a3c3f1' # --thd-color-button-ol, outline-button border
on-brand: '#ffffff' # white label on blue
# Accent (violet — AI / Rovo layer)
accent-violet: '#d8a0f7' # violet-30, signature secondary accent
accent-violet-soft: '#f8eefe' # violet-10, soft violet wash
accent-violet-mid: '#bf63f3' # violet-50, brighter violet
accent-violet-deep: '#964ac0' # violet-70, deep violet
accent-record: '#ff613d' # --thd-color-record, coral record dot
accent-record-soft: '#ff613d20' # 12% coral wash behind record state
# Interactive
link: '#1868db' # blue-70 links in body
link-hover: '#1558bc' # blue-80 on hover
selected-bg: '#e9f2fe' # blue-10 selected nav / row state
disabled: '#b7b9be' # grey-40 disabled control text
# Borders
border: '#e4e2e7' # --thd-color-light-border, default hairline
border-soft: '#f1f0f3' # --thd-color-border-grey, quietest separation
border-strong: '#dddee1' # grey-30, emphasized separation
border-input: '#b7b9be' # grey-40, input resting border
border-brand: '#1868db' # blue-70, focused / active border
# Semantic
success-bg: '#efffd6' # green-10 wash
success-text: '#4c6b1f' # green-80
success-solid: '#94c748' # green-40, solid success
warning-bg: '#fff5d4' # yellow-10 wash
warning-text: '#8a5700' # yellow-80
warning-solid: '#ffc716' # yellow-30, solid warning
danger-bg: '#ff613d20' # 12% coral wash
danger-text: '#c77b00' # darkest amber-leaning danger text fallback
danger-solid: '#ff613d' # coral, used for record + destructive
info-bg: '#e9f2fe' # blue-10 wash
info-text: '#1558bc' # blue-80
typography:
display:
family: '"Charlie Display", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif'
weights: [500, 600, 700]
opentype-features: ['liga', 'kern']
body:
family: '"Charlie Text", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif'
weights: [400, 500, 600]
opentype-features: ['liga', 'kern']
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, monospace'
weights: [400, 500]
opentype-features: ['tnum', 'zero']
scale:
display-hero: { size: 80, weight: 700, lineHeight: 1.0, tracking: '-0.03em', family: display }
display-lg: { size: 63, weight: 700, lineHeight: 1.05, tracking: '-0.02em', family: display }
h1: { size: 44, weight: 700, lineHeight: 1.1, tracking: '-0.018em', family: display }
h2: { size: 32, weight: 700, lineHeight: 1.2, tracking: '-0.012em', family: display }
h3: { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
h4: { size: 20, weight: 600, lineHeight: 1.3, tracking: '0', family: display }
h5: { size: 18, weight: 600, lineHeight: 1.35, tracking: '0', family: body }
eyebrow: { size: 13, weight: 600, lineHeight: 1.4, tracking: '0.06em', family: body, transform: uppercase }
body-lg: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-medium: { size: 16, weight: 500, lineHeight: 1.55, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
label: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
button: { size: 16, weight: 600, lineHeight: 1.0, tracking: '0', family: body }
code: { size: 14, weight: 400, lineHeight: 1.55, tracking: '0', family: mono }
radius:
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
pill: 9999
spacing:
base: 4
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96]
layout:
page-width: 1280
prose-width: 720
site-gutter: 'clamp(20px, 5vw, 64px)'
header-height: 64
grid-columns: 12
section-rhythm: '80-128px'
components:
button-primary:
background: '#1868db'
text: '#ffffff'
padding: '12px 20px'
radius: 9999
border: 'none'
font: 'Charlie Text 600 / 16px'
hover-bg: '#1558bc'
active-bg: '#123263'
use: 'Primary action — full-pill blue CTA, the brand''s defining button (Get Loom for free)'
button-secondary:
background: '#e9f2fe'
text: '#101214'
padding: '12px 20px'
radius: 9999
border: 'none'
font: 'Charlie Text 600 / 16px'
hover-bg: '#cfe1fd'
use: 'Soft-blue twin — pale blue fill, near-black label (Contact Sales)'
button-outline:
background: 'transparent'
text: '#1868db'
padding: '12px 20px'
radius: 9999
border: '1px solid #a3c3f1'
font: 'Charlie Text 600 / 16px'
hover-bg: '#e9f2fe'
use: 'Outlined tertiary — blue text + blue-tint border, soft-blue hover wash'
button-ghost:
background: 'transparent'
text: '#292a2e'
padding: '8px 12px'
radius: 9999
border: 'none'
font: 'Charlie Text 500 / 16px'
hover-text: '#1868db'
use: 'Quiet quaternary — nav links, footer, inline actions'
card:
background: '#ffffff'
border: '1px solid #e4e2e7'
radius: 12
padding: '24px'
shadow: 'none'
use: 'Default feature card — white fill, defined by hairline border not shadow'
card-soft:
background: '#f8f8f8'
border: 'none'
radius: 16
padding: '24px'
use: 'Grey-wash surface card for nested feature blocks'
card-blue:
background: '#e9f2fe'
border: 'none'
radius: 16
padding: '24px'
use: 'Soft-blue feature surface — highlights, integrations, plan callouts'
input:
background: '#ffffff'
border: '1px solid #b7b9be'
radius: 8
padding: '10px 12px'
font: 'Charlie Text 400 / 16px'
placeholder-color: '#8c8f97'
focus-ring: '0 0 0 2px rgba(24, 104, 219, 0.30)'
focus-border: '#1868db'
use: 'Form fields, search, email capture'
badge-soft-blue:
background: '#e9f2fe'
text: '#1558bc'
padding: '4px 10px'
radius: 9999
font: 'Charlie Text 500 / 13px'
use: 'Soft-blue chip for status / NEW / plan labels'
badge-violet:
background: '#f8eefe'
text: '#964ac0'
padding: '4px 10px'
radius: 9999
font: 'Charlie Text 500 / 13px'
use: 'AI / Rovo chip — violet wash signals the intelligence layer'
badge-record:
background: '#ff613d20'
text: '#ff613d'
padding: '4px 10px'
radius: 9999
font: 'Charlie Text 600 / 13px'
use: 'Recording-state chip — coral dot + label, the act-of-recording signal'
nav-link:
background: 'transparent'
text: '#292a2e'
padding: '8px 12px'
font: 'Charlie Text 500 / 16px'
hover-text: '#1868db'
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
ease-entrance: 'cubic-bezier(0, 0, 0.2, 1)'
duration-fast: 150
duration-standard: 240
duration-slow: 320
duration-page: 420
reduced-motion: 'respects prefers-reduced-motion: reduce — transitions become opacity-only, durations halved'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
none: 'none'
ambient: 'rgba(16, 18, 20, 0.04) 0 1px 2px'
card: 'rgba(16, 18, 20, 0.06) 0 2px 8px'
raised: 'rgba(16, 18, 20, 0.08) 0 4px 16px'
popover: 'rgba(16, 18, 20, 0.10) 0 8px 24px -4px'
modal: 'rgba(16, 18, 20, 0.14) 0 16px 48px -8px'
ring: '0 0 0 2px rgba(24, 104, 219, 0.30)'
accessibility:
contrast-text-on-bg: 12.4 # #292a2e on #ffffff — AAA at all sizes
contrast-heading-on-bg: 18.1 # #101214 on #ffffff — AAA at all sizes
contrast-on-brand: 4.8 # #ffffff on #1868db — AA at all sizes / AAA at large
contrast-secondary-on-bg: 7.6 # #505258 on #ffffff — AAA at body sizes
contrast-muted-on-bg: 3.3 # #8c8f97 on #ffffff — AA large only (placeholders/helper)
focus-ring: '2px solid #1868db with 2px offset, plus 30% blue glow ring'
reduced-motion-honored: true
keyboard-nav: 'visible focus on every interactive surface; tab order matches visual flow'
prose-line-length: 'capped at ~720px for comfortable reading'
dark-mode: null # marketing surface is light-only; the in-product editor ships its own dark theme
---
## 1. Visual Theme & Atmosphere
Loom's marketing site is the visual definition of *calm, trustworthy productivity software*. The canvas is plain white (`#ffffff`) — no cream, no gradient mesh, no dark slab — and onto it Loom places one confident blue (`#1868db`), the custom Charlie sans family, and an abundance of breathing room. The page never raises its voice. Headlines land in **Charlie Display** at roughly 63px / weight 700 in near-black `#101214`; body copy sits in **Charlie Text** at 16px / 1.55 in a slightly softer grey-near-black `#292a2e`. The single loudest move on the page is the blue full-pill CTA — "Get Loom for free" — and even that is friendly rather than aggressive, its 9999px radius making it read as a soft capsule rather than a hard button.
The defining context is the **Atlassian acquisition**. Loom is now an Atlassian product, and its palette has converged on Atlassian's tokenized design system: the page exposes a full `--thd-color-*` token namespace with a 10-step blue ladder (`blue-10` `#e9f2fe` → `blue-100` `#1c2b42`), parallel violet, grey, yellow, and green ladders, and named semantic tokens. This is enterprise-grade chromatic discipline — every color on the page is a rung on a defined scale, not a one-off hex. The result reads as institutional trust: this is a tool your whole company already uses, IT has already approved, and the brand color is the same calm blue you see across Jira and Confluence. Loom traded indie-creator playfulness for the reassurance of being part of a platform.
The third register is **the record signal**. Loom is, at its core, the button you press to start recording your screen. The brand reserves a hot coral `#ff613d` (the `--thd-color-record` token) for exactly this — the record dot, recording-state chips, the live indicator. It is the one warm, urgent color in an otherwise cool palette, and it appears only when something is being captured. Alongside it, a soft violet `#d8a0f7` (`--thd-color-violet-30`) marks the AI / Rovo intelligence layer — auto-titles, summaries, transcripts. So the page has a clean three-part chromatic grammar: **blue for action and trust, violet for AI, coral for recording.** Each color means one thing.
Where Descript ships beauty-editorial cream-pink + serif display, and Runway/Pika ship chrome-on-black for cinematic AI, Loom ships the friendly white-and-blue of a workspace tool. The pill-shaped everything — CTAs, chips, badges, avatars — is the entire emotional register: nothing sharp, nothing intimidating, just rounded, approachable surfaces that say "press record and send." It is software designed to feel like it requires no learning curve.
Atmospheric vocabulary that captures the feeling: *calm-white, Atlassian-blue, friendly-pill, Charlie-sans, record-coral, Rovo-violet, tokenized-trust, async-video, workspace-reassurance, no-learning-curve, breathing-room, enterprise-approachable.* Every surface lands like a clean product screenshot — bright, legible, unhurried, and quietly confident that you already know how to use it.
**Key Characteristics**
- Plain white `#ffffff` canvas — no cream, no gradient, no dark slab; brightness is the brand
- Custom **Charlie Display** headlines at ~63px / 700 in near-black `#101214`
- Custom **Charlie Text** body at 16px / 1.55 in soft grey-near-black `#292a2e`
- One confident **Atlassian blue** `#1868db` for all primary action and links
- **Full-pill** (9999px) CTAs, chips, badges — the rounded, approachable shape is the register
- Soft-blue secondary CTA `#e9f2fe` with near-black label — calm, never competing with primary
- Signature **violet** `#d8a0f7` for the AI / Rovo intelligence layer only
- Hot **coral** `#ff613d` reserved exclusively for the record signal
- Fully **tokenized** palette — every color is a rung on a defined 10-step ladder
- Borders define cards, not shadows — `#e4e2e7` hairlines over white
- Generous whitespace, 80–128px section rhythm — unhurried, screenshot-clean
- Three-color grammar: blue = action, violet = AI, coral = recording — each means one thing
## 2. Color Palette & Roles
### Primary
- **bg** `#ffffff` [→ canvas]: white page canvas, the brand's brightness. RGB (255, 255, 255). Never tinted — the cleanness is the point.
- **text** `#292a2e` [→ `--thd-color-grey-100`]: primary body copy, a soft near-black warmer and gentler than `#000`.
- **text-heading** `#101214` [→ `--thd-color-black`]: headlines, leans true-black for maximum presence against white.
- **bg-soft** `#f8f8f8` [→ `--thd-color-grey-10`]: softest panel wash for nested sections.
- **bg-muted** `#f0f1f2` [→ `--thd-color-grey-20`]: deeper grey band for alternating section emphasis.
### Brand (Atlassian Blue Ladder)
- **brand** `#1868db` [→ `--thd-color-blue-70` / `--thd-color-button-fr`]: primary CTA, links, focus border. The defining chromatic move.
- **brand-hover** `#1558bc` [→ `--thd-color-blue-80`]: hover / pressed state, one step deeper.
- **brand-active** `#123263` [→ `--thd-color-blue-90`]: active / deep-press state.
- **brand-soft** `#e9f2fe` [→ `--thd-color-blue-10`]: soft hover wash, secondary CTA fill, chip background.
- **brand-tint** `#cfe1fd` [→ `--thd-color-blue-20`]: mid tint for hover-on-soft states.
- **brand-mid** `#4d8ced` [→ `--thd-color-blue-50`]: mid-bright accent for illustration / data viz.
- **brand-outline** `#a3c3f1` [→ `--thd-color-button-ol`]: outline-button border color.
- **on-brand** `#ffffff` [→ `--thd-color-white`]: white label on blue. The high-contrast action pair.
### Accent (Violet AI Layer + Coral Record)
- **accent-violet** `#d8a0f7` [→ `--thd-color-violet-30`]: signature secondary accent, marks AI / Rovo surfaces.
- **accent-violet-soft** `#f8eefe` [→ `--thd-color-violet-10`]: soft violet wash background for AI feature blocks.
- **accent-violet-mid** `#bf63f3` [→ `--thd-color-violet-50`]: brighter violet for emphasis within the AI layer.
- **accent-violet-deep** `#964ac0` [→ `--thd-color-violet-70`]: deep violet for violet-on-soft text.
- **accent-record** `#ff613d` [→ `--thd-color-record`]: hot coral record dot — the one warm, urgent color.
- **accent-record-soft** `#ff613d20` [→ `--thd-color-record-20`]: 12% coral wash behind recording-state chips.
The accent layer is **strictly meaning-bound**: violet only ever means "AI / Rovo," coral only ever means "recording / live." Neither is decorative. Using violet for a generic highlight or coral for a CTA breaks the chromatic grammar that lets users read color as state.
### Interactive
- **link** `#1868db` [→ `--thd-color-blue-70`]: blue links in body copy, often underlined on hover.
- **link-hover** `#1558bc` [→ `--thd-color-blue-80`]: deeper blue on hover.
- **selected-bg** `#e9f2fe` [→ `--thd-color-blue-10`]: selected nav item / active row, soft-blue wash.
- **disabled** `#b7b9be` [→ `--thd-color-grey-40`]: disabled control text and icons.
### Neutral Scale (Grey Ladder)
- **grey-10** `#f8f8f8` — softest wash / page-soft surface.
- **grey-20** `#f0f1f2` — section band.
- **grey-30** `#dddee1` — strong separator / divider.
- **grey-40** `#b7b9be` — input resting border, disabled text.
- **grey-50** `#8c8f97` — helper text, placeholders.
- **grey-70** `#6c6f77` — captions, metadata.
- **grey-80** `#505258` — secondary body copy.
- **grey-90** `#3b3d42` — strong secondary copy.
- **grey-100** `#292a2e` — primary body text.
- **black** `#101214` — headings; **black-neutral** `#1e1f21` — emphasized copy.
The grey ladder is **cool-neutral with a faint blue undertone** — it sits comfortably under the blue brand color without ever picking up warmth. Loom never uses a warm grey; a beige or taupe neutral would crack the clean, cool, screenshot-bright temperature.
### Surface & Borders
- **surface-0 (page)** `#ffffff` white.
- **surface-1 (soft)** `#f8f8f8` grey-10 nested panel.
- **surface-2 (band)** `#f0f1f2` grey-20 section band.
- **surface-blue** `#e9f2fe` blue-10 feature surface.
- **surface-violet** `#f8eefe` violet-10 AI surface.
- **border** `#e4e2e7` [→ `--thd-color-light-border`]: default hairline — the primary card-definition device on white.
- **border-soft** `#f1f0f3` [→ `--thd-color-border-grey`]: quietest separation, internal dividers.
- **border-strong** `#dddee1` [→ `--thd-color-grey-30`]: emphasized separator.
- **border-input** `#b7b9be` [→ `--thd-color-grey-40`]: input resting border.
- **border-brand** `#1868db` [→ `--thd-color-blue-70`]: focused / active border.
### Shadow Colors
Loom's depth language is **borders first, shadows second**. On the white canvas, cards are defined primarily by a hairline `#e4e2e7` border; shadows are reserved for genuinely floating elements (popovers, dropdowns, modals) and are soft, neutral black-tinted (`rgba(16, 18, 20, 0.06)` to `0.14`), never colored. The brand never uses blue- or violet-tinted shadows; that would muddy the crisp white temperature. Product screenshots typically float on a subtle ambient shadow with the in-product UI shown at native fidelity — Loom trusts the product's own polish rather than wrapping it in a decorative frame.
### Semantic
- **success** — bg `#efffd6` (green-10 wash), text `#4c6b1f` (green-80), solid `#94c748` (green-40).
- **warning** — bg `#fff5d4` (yellow-10 wash), text `#8a5700` (yellow-80), solid `#ffc716` (yellow-30).
- **danger / destructive** — bg `#ff613d20` (12% coral wash), solid `#ff613d` (the record coral, reused for destructive). Note: Loom's destructive color is the *same coral as the record dot* — the urgent warm hue does double duty as "live" and "careful."
- **info** — bg `#e9f2fe` (blue-10 wash), text `#1558bc` (blue-80). Info reuses the brand blue, reinforcing the single-brand-system discipline.
The notable choice: there is no separate "error red" — the coral record token doubles as the destructive color, and info reuses the brand blue. Semantic colors are drawn from the existing token ladders rather than introducing new hues, which keeps the whole page chromatically coherent.
## 3. Typography Rules
### Font Family
- **Display**: `"Charlie Display", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif` — Atlassian's custom display sans, used at weight 500 / 600 / 700. The face for all headlines.
- **Body**: `"Charlie Text", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif` — Atlassian's custom text sans, optimized for paragraph reading, used at 400 / 500 / 600.
- **Mono**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, monospace` — pragmatic system mono stack for code and tabular data.
- **OpenType features**: `liga`, `kern` on both Charlie faces; `tnum`, `zero` on mono for code and stats.
Charlie Display and Charlie Text are a **matched display/text pair from the same family** — Display is tuned for large sizes (tighter spacing, more contrast), Text for small-size legibility (open apertures, generous spacing). This is the Atlassian house typography, shared across the platform, which is itself part of the "you already trust this" signal.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | Charlie Display | 80px | 700 | 1.0 | -0.03em | Largest hero variant |
| Display LG | Charlie Display | 63px | 700 | 1.05 | -0.02em | The canonical Loom hero (measured ~63px) |
| H1 | Charlie Display | 44px | 700 | 1.1 | -0.018em | Page / major section title (measured ~44px H2 on site) |
| H2 | Charlie Display | 32px | 700 | 1.2 | -0.012em | Major section |
| H3 | Charlie Display | 24px | 600 | 1.25 | -0.005em | Sub-section |
| H4 | Charlie Display | 20px | 600 | 1.3 | 0 | Card heading |
| H5 | Charlie Text | 18px | 600 | 1.35 | 0 | Inline emphasis (switches to text face) |
| Eyebrow | Charlie Text | 13px | 600 | 1.4 | 0.06em | Uppercase section pre-label |
| Body Large | Charlie Text | 18px | 400 | 1.55 | 0 | Lede paragraph |
| Body | Charlie Text | 16px | 400 | 1.55 | 0 | Default body copy |
| Body Medium | Charlie Text | 16px | 500 | 1.55 | 0 | Emphasized body |
| Body Small | Charlie Text | 14px | 400 | 1.5 | 0 | Captions, sidebars |
| Label | Charlie Text | 13px | 500 | 1.4 | 0 | UI labels, form labels |
| Caption | Charlie Text | 12px | 500 | 1.4 | 0.02em | Metadata, timestamps |
| Button | Charlie Text | 16px | 600 | 1.0 | 0 | CTA copy |
| Code | Mono | 14px | 400 | 1.55 | 0 | Inline + block |
### Principles
- **One family, two optical sizes.** Charlie Display for headings, Charlie Text for body — same designer's intent, two optical cuts. This single-family approach is calmer than a serif/sans contrast and reinforces the "consistent platform" feel.
- **Headlines at 700, never lighter.** Loom's display weight is bold (700) — the confidence comes from weight, not size or color. Headlines stay near-black `#101214`, body steps down to `#292a2e`.
- **Negative tracking scales with size.** -0.03em at 80px, -0.02em at 63px, -0.018em at 44px, easing to 0 at 20px and below. Large type is optically tightened; body type sits at natural spacing.
- **Body at 16px / 1.55.** The web-standard 16px with a generous 1.55 line-height — comfortable, unremarkable, designed to disappear so the product screenshots carry the story.
- **Two-tone heading/body split.** Headings are true-near-black `#101214`; body is the softer `#292a2e`. The ~2-step grey difference creates hierarchy without changing size or weight.
- **Eyebrows in uppercase Charlie Text 600 / 0.06em.** Short section pre-labels are the only uppercase, tracked-out element — everything else is sentence case.
- **No italics in the system.** Loom's voice is plain and direct; emphasis comes from weight (500 / 600), not slant.
- **Mono only for code and stats.** The system mono stack appears in code blocks and tabular numbers (`tnum`), never as a decorative accent.
## 4. Component Stylings
### Buttons
All Loom buttons are **full-pill (9999px radius)** — the rounded capsule shape is the brand's defining component signature.
**Primary (Blue Pill)**
- Background: `#1868db`. Text: `#ffffff`, Charlie Text 600 / 16px.
- Padding: `12px 20px`. Radius: `9999px` (full pill). No border.
- Hover: bg → `#1558bc`; transition `240ms ease-standard`.
- Active: bg → `#123263`.
- Use: Primary CTA — *Get Loom for free, Start recording, Get started.*
**Secondary (Soft-Blue Pill)**
- Background: `#e9f2fe` blue-10. Text: `#101214` near-black, Charlie Text 600 / 16px.
- Padding: `12px 20px`. Radius: `9999px`. No border.
- Hover: bg → `#cfe1fd` blue-20.
- Use: Twin to primary — *Contact Sales, View pricing.* Calm, never competes with the blue primary.
**Outline (Tertiary)**
- Background: transparent. Text: `#1868db` blue. Border: `1px solid #a3c3f1` (blue-tint outline). Radius: `9999px`.
- Same padding (12×20), font (Charlie Text 600 / 16px).
- Hover: bg → `#e9f2fe` soft-blue wash.
- Use: Lower-emphasis actions in feature sections, secondary nav.
**Ghost (Quiet)**
- Background: transparent. Text: `#292a2e`. No border.
- Padding: `8px 12px`. Charlie Text 500 / 16px.
- Hover: text → `#1868db` blue.
- Use: Nav links, footer, inline secondary actions.
### Cards
**Default Card**
- Background: `#ffffff`. Border: `1px solid #e4e2e7` hairline. Radius: `12px`. Padding: `24px`.
- Shadow: none — the border does the work.
- Hover: subtle `rgba(16,18,20,0.06) 0 2px 8px` shadow lifts the card off white.
- Use: Default feature card — defined by border, not fill.
**Soft Card**
- Background: `#f8f8f8` grey-10. Border: none. Radius: `16px`. Padding: `24px`.
- Use: Nested feature blocks, testimonials — the grey wash separates it from the white page without a border.
**Blue Feature Card**
- Background: `#e9f2fe` blue-10. Border: none. Radius: `16px`. Padding: `24px`.
- Use: Highlights, integration callouts, plan-comparison emphasis blocks. Pairs with the blue brand.
**Violet AI Card**
- Background: `#f8eefe` violet-10. Border: none. Radius: `16px`. Padding: `24px`.
- Use: Rovo / AI feature surfaces only — the violet wash flags the intelligence layer.
### Badges, Tags, Pills
All pill-shaped (9999px radius), small, sentence-case or short-label.
**Soft-Blue Chip** — bg `#e9f2fe`, text `#1558bc` blue-80, padding `4px 10px`, Charlie Text 500 / 13px. Status / NEW / plan labels.
**Violet AI Chip** — bg `#f8eefe`, text `#964ac0` violet-70, padding `4px 10px`, Charlie Text 500 / 13px. Marks AI / Rovo features.
**Record Chip** — bg `#ff613d20` (12% coral), text `#ff613d` coral, padding `4px 10px`, Charlie Text 600 / 13px, with a leading coral dot. The recording-state / live signal.
**Eyebrow Label** — no chrome, just type. Charlie Text 600 / 13px / uppercase / 0.06em tracking, color `#6c6f77` grey-70. Sits above section headlines.
### Inputs / Forms
- Background: `#ffffff`. Border: `1px solid #b7b9be` grey-40. Radius: `8px`. Padding: `10px 12px`.
- Font: Charlie Text 400 / 16px. Placeholder: `#8c8f97` grey-50.
- Focus: `0 0 0 2px rgba(24, 104, 219, 0.30)` blue glow ring, border → `#1868db`.
- Error: border → `#ff613d` coral, helper text in coral below.
- Helper: caption 12px grey-70 below the field.
### Navigation
- Header height `64px`. Background `#ffffff` white (becomes opaque-white with a subtle bottom hairline + shadow on scroll).
- Logo: Loom wordmark + mark, near-black `#101214`.
- Nav links: Charlie Text 500 / 16px, color `#292a2e`, padding `8px 12px`. Hover → `#1868db` blue. Dropdown mega-menus on `Products` / `Solutions`.
- Right-side CTA pair: ghost "Sign in" + blue pill "Get Loom for free".
- Mobile: right-aligned hamburger, full-screen sheet with stacked links and the blue CTA pinned at the bottom.
### Optional Components
**Dropdown / Mega-menu** — bg `#ffffff`, border `1px solid #e4e2e7`, radius `12px`, shadow `rgba(16,18,20,0.10) 0 8px 24px -4px`, padding `16px`. Multi-column with section headers in Charlie Text 600 / 13px.
**Code Block** — Mono 14px, bg `#f8f8f8` grey-10, radius `8px`, padding `16px`, border `#e4e2e7`. Inline code: bg `#f0f1f2`, padding `2px 6px`, radius `4px`.
**Tooltip** — bg `#101214` near-black, text `#ffffff`, radius `8px`, padding `8px 12px`, font Charlie Text 500 / 13px.
**Modal** — bg `#ffffff`, radius `16px`, shadow `rgba(16,18,20,0.14) 0 16px 48px -8px`, max-width `560px`. Backdrop overlay `rgba(0,0,0,0.5)` (the `--thd-color-overlay` token).
**Video Player Chrome** — Loom's signature artifact: a rounded `12px` player with the coral record indicator, soft controls, and a pill-shaped share bar. On the marketing page, demo players sit on an ambient shadow over white.
## 5. Layout Principles
### Spacing System
- **Base unit**: 4px.
- **Scale**: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96 — a clean 4px-based scale with no fractional steps.
- **Density observation**: Loom runs comfortable, unhurried spacing. Headlines float in generous margin; feature cards sit on 24px internal padding and 24–32px gaps. The page never feels cramped.
### Grid & Container
- **Page max width**: `1280px`. Standard SaaS width; content stays centered with white margins beyond.
- **Site gutter**: `clamp(20px, 5vw, 64px)`.
- **Prose width**: capped ~`720px` for comfortable reading.
- **Grid**: 12 columns with 24px gutters. Hero blocks span full width; feature rails span 4–6 columns; integration grids run 3-up or 4-up.
- **Hero treatment**: centered or left-aligned Charlie Display headline, supporting body, blue pill CTA + soft-blue secondary, with a product video / screenshot floating below or beside on ambient shadow.
### Whitespace Philosophy
The white canvas runs edge to edge, broken only by occasional grey-10 (`#f8f8f8`) or blue-10 (`#e9f2fe`) section bands for rhythm. Section gutters run **80–128px** between major blocks; minor blocks sit on 48–64px gaps; intra-section spacing uses 16–32px. The page is structured as a sequence of clean, bright spreads — hero, social proof, feature blocks, AI/Rovo section (violet-washed), use-case grid, testimonial, pricing, footer — each sitting on white or a soft tonal band.
### Section Cadence
- Hero (white + Charlie Display + blue pill + product video) → Logo wall / social proof (grey-10 band) → Feature blocks (white, alternating image-left/image-right) → AI / Rovo section (violet-10 washed) → Use-case grid (3-up cards) → Testimonial (soft card with quote) → Pricing (white, blue-10 highlighted plan) → Footer (white or grey-10, multi-column links).
- Tonal bands (grey-10, blue-10, violet-10) provide rhythm; there are no dark bands on the marketing surface.
- Product videos / screenshots appear repeatedly as the primary visual anchor — Loom shows the product more than it describes it.
## 6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Tiny inline chips, decorative ticks |
| Standard (sm) | 4px | Inline code, small tags, checkboxes |
| Comfortable (md) | 8px | Inputs, dropdown items, small buttons |
| Relaxed (lg) | 12px | Cards, video player chrome, dropdowns |
| Large (xl) | 16px | Soft/blue/violet feature cards, modals |
| Pill | 9999px | CTAs, chips, badges, avatars — the brand signature |
Loom's signature radii: **9999px full-pill CTAs / 12px cards / 8px inputs / 16px feature surfaces.** The full-pill on every actionable element is the single strongest shape decision — it sets the friendly, soft, approachable register. Rectangular content surfaces (cards, players) use the comfortable 12–16px ladder so they read as modern-soft without going fully round. Mixed radii within a single primitive are avoided.
## 7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | Flat — no shadow | Default page surface, hero, body sections |
| 1 | Hairline border (`#e4e2e7`) | Default cards, inputs, dividers |
| 2 | `rgba(16,18,20,0.04) 0 1px 2px` ambient | Subtle lift on screenshots |
| 3 | `rgba(16,18,20,0.06) 0 2px 8px` | Card hover, raised tiles |
| 4 | `rgba(16,18,20,0.10) 0 8px 24px -4px` | Dropdowns, popovers, mega-menus |
| 5 | `rgba(16,18,20,0.14) 0 16px 48px -8px` | Modals, dialogs |
### Shadow Philosophy
Loom's depth comes from **borders first, soft neutral shadows second**. On the white canvas, most cards are defined by a `#e4e2e7` hairline rather than a shadow — flat and clean. Shadows are reserved for genuinely floating UI (popovers, dropdowns, modals) and product screenshots, and they are always soft, diffuse, and neutral black-tinted (`rgba(16,18,20,*)`). The brand never uses colored shadows (no blue or violet glow except on focus rings) and never uses hard drop shadows — both would crack the crisp, bright, screenshot-clean temperature. Product videos float on a barely-there ambient shadow that lets the product's own polish carry the elevation.
## 8. Interaction & Motion
### Easing Curves
- `ease-standard`: `cubic-bezier(0.4, 0, 0.2, 1)` — Material-style; default for hover, focus, color transitions.
- `ease-emphasized`: `cubic-bezier(0.2, 0, 0, 1)` — punchier; modal enter, hero reveal.
- `ease-entrance`: `cubic-bezier(0, 0, 0.2, 1)` — decelerate-in; below-fold fade-ups.
### Duration Buckets
- **Fast (150ms)** — color transitions, focus rings, link hovers.
- **Standard (240ms)** — button hover, card hover, dropdown reveal.
- **Slow (320ms)** — modal enter/exit, section fade-in.
- **Page (420ms)** — route transitions, hero reveal sequences.
### Per-Component Micro-States
- **Button hover (blue pill)**: bg `#1868db` → `#1558bc`; transition `240ms ease-standard`. No scale, no lift.
- **Button hover (soft-blue)**: bg `#e9f2fe` → `#cfe1fd`.
- **Card hover**: subtle `rgba(16,18,20,0.06) 0 2px 8px` shadow fades in; no border change.
- **Link hover**: color `#1868db` → `#1558bc` over 150ms; underline may appear.
- **Input focus**: 2px blue glow ring (`rgba(24,104,219,0.30)`) fades in over 150ms; border darkens to blue.
- **Record indicator**: coral dot pulses gently when live — the one deliberately animated brand element.
### Page Transitions
Friendly, restrained reveal: hero text and product video fade in over 420ms with a small 16px translate-up; below-fold sections use `IntersectionObserver` to fade up at ~85% viewport, 320ms, with the `ease-entrance` curve. Loom favors subtle, professional motion — nothing bouncy, nothing dramatic.
### Reduced Motion
`@media (prefers-reduced-motion: reduce)` — all transitions become opacity-only, durations halved. Translate fade-ups, the record-dot pulse, and any scroll-triggered reveals are disabled; sections snap to final state.
## 9. Accessibility & A11y
### Contrast Pairs
- **`#292a2e` text on `#ffffff` bg**: 12.4:1 — AAA at all sizes (primary body).
- **`#101214` heading on `#ffffff` bg**: 18.1:1 — AAA at all sizes (headlines).
- **`#505258` secondary on `#ffffff` bg**: 7.6:1 — AAA at body sizes.
- **`#ffffff` text on `#1868db` blue button**: 4.8:1 — AA at all sizes, AAA at large (≥18px / ≥14px bold). The blue is calibrated to clear AA for button labels.
- **`#1558bc` text on `#e9f2fe` soft-blue chip**: 6.9:1 — AAA at body sizes.
- **`#964ac0` violet on `#f8eefe` chip**: 5.4:1 — AA at body sizes.
- **`#8c8f97` muted on `#ffffff` bg**: 3.3:1 — AA at large only; reserved for placeholders and helper text, never body copy.
### Focus Indicators
- Default focus ring: `0 0 0 2px rgba(24, 104, 219, 0.30)` blue glow plus a `#1868db` border, with 2px offset.
- The exposed `--tw-ring-color: rgba(59,130,246,.5)` confirms a blue translucent ring as the system default.
- All interactive surfaces have a visible focus state — no `outline: none` without a replacement.
### ARIA Patterns
- **Navigation**: `<nav aria-label="Main">` with skip-link to main content; mega-menus use `aria-expanded` / `aria-controls`.
- **Disclosure**: `<button aria-expanded aria-controls>` for collapsible FAQ and feature sections.
- **Dialog**: `role="dialog" aria-modal="true" aria-labelledby` with focus trap and Esc-to-close.
- **Video player**: native `<video>` controls or a custom player with `aria-label` on play/pause/share, captions track, and keyboard scrubbing.
- **Live regions**: `aria-live="polite"` for form validation; the recording indicator should announce state changes.
### Keyboard Navigation
- Tab order matches visual flow: skip-link → nav → hero CTA → main content → footer.
- All buttons, links, inputs reachable via Tab; modals and mega-menus trap focus until dismissed.
- `Esc` closes modals, dropdowns, and the mobile menu sheet.
- Video players support Space (play/pause) and arrow-key scrubbing.
### Screen Reader Hints
- Product screenshots and demo videos have descriptive alt text / captions explaining the in-product flow shown.
- Color-coded states (violet = AI, coral = recording) carry a text label or icon, never color alone.
- Icon-only buttons (share, settings, record) have `aria-label`.
- The Loom wordmark uses `aria-label="Loom"`.
### Reduced Motion
Honored via the global media query. The record-dot pulse, fade-ups, and scroll reveals become opacity-only or are disabled; durations halve.
## 10. Responsive Behavior
### Breakpoints
| Name | Width | Use |
|---|---|---|
| Mobile | < 640px | Single column, full-bleed sections, ~36px hero |
| Tablet | 640–1024px | 2-column rails, ~48px hero |
| Desktop | 1024–1280px | Full 12-col grid, ~63px hero, 720px prose |
| Wide | 1280–1536px | Site max width hits |
| Ultra | > 1536px | Page locks to 1280, gutters expand |
### Touch Targets
- Minimum tap target: 44×44px (WCAG AAA).
- Buttons: 44px minimum height on mobile (the pill shape keeps comfortable thumb-room).
- Nav link tap area: 44×44px even when visual padding is smaller.
### Collapsing Strategy
- **Header**: full nav with mega-menus at ≥1024px; right-aligned hamburger sheet below.
- **Hero**: ~63px display → ~48px → ~36px across breakpoints. Charlie Display scales down smoothly.
- **Feature blocks**: side-by-side image+text at desktop stack to image-over-text at mobile.
- **Use-case grid**: 3-up / 4-up at desktop, 2-up at tablet, 1-up at mobile.
- **Body width**: ~720px → fluid 90vw at mobile.
- **Section spacing**: 128px → 96px → 64px across sizes.
### Image & Video Behavior
- Product videos use lazy-loaded posters with `aspect-ratio` enforced to prevent layout shift.
- Screenshots use `srcset` 1x/2x; eager on hero, lazy below the fold.
- The video player preserves its 12px radius and controls at all sizes; full-width on mobile.
### Container Queries
Used inside feature cards to switch icon position (icon-left vs icon-top) when card width crosses ~320px, and inside the pricing table to switch from columns to stacked plan cards.
## 11. Content & Voice
### Tone
**Friendly, clear, low-friction.** Loom writes the way a helpful colleague talks — direct, encouraging, never jargony or urgent. The voice centers the core promise: recording and sharing a video is faster and warmer than writing a long message. It is confident (backed by Atlassian-scale trust) but stays approachable and human, the opposite of enterprise-stiff.
### Microcopy Patterns
- **Button verbs**: "Get Loom for free," "Start recording," "Get started," "Contact Sales," "Watch a demo." Sentence case, never all-caps, never urgent.
- **Error messages**: "Something went wrong — try again, or [contact support]." Calm, low-stakes, solution-oriented.
- **Success confirmations**: "Recording saved." "Link copied." Brief and immediate.
- **Loading / processing states**: "Processing your video…" "Generating transcript…" — context-specific, AI-aware where relevant.
### Empty States
What they say: explain the state and offer the next step. *"No Looms yet. Record your first video to get started."*
What they don't say: "Oops!", "Whoops!", apologetic exclamations. Empty states are normal moments, not failures.
### CTA Verb Conventions
- Primary on hero: "Get Loom for free," "Start recording," "Get started"
- Secondary: "Contact Sales," "Watch a demo," "See pricing"
- Footer: "Read the blog," "Help center," "Sign in," "Download"
The brand never uses "Sign up now!" or scarcity-driven urgency. The pitch is ease and trust ("free," "in seconds"), not pressure.
## 12. Dark Mode & Theming
**Light-only on the marketing surface — no dark variant.** The white canvas is the brand's brightness signal; a dark marketing site would lose the clean, trustworthy, screenshot-bright register that distinguishes Loom. The blue, violet, and coral accents are all calibrated against white; porting them to dark would require re-keying contrast across the entire token system.
The **in-product editor and recorder ship their own dark theme** — the token namespace already includes dark rungs (`grey-100` `#292a2e`, `black-neutral` `#1e1f21`, `blue-100` `#1c2b42`, `violet-100` `#35243f`) and `*-dark` semantic mappings, so a dark theme is fully supported at the product layer. That dark theme is documented at the product level, not on the marketing surface. When product screenshots show the dark editor, they sit on the white marketing canvas as artifacts, preserving the page-level brightness.
If a downstream surface needs a dark companion of the marketing system, the rule would be: keep blue, violet, and coral at full saturation; swap white for `#1e1f21` (black-neutral); lift cards to `#292a2e` (grey-100); and use `border-grey` at low opacity for hairlines. The token ladders already support this, but it is not currently shipped on the marketing site.
## 13. Lineage & Influences
Loom's design DNA is **calm, tokenized, enterprise-friendly productivity software** — and since the 2023 Atlassian acquisition, that DNA has explicitly merged with Atlassian's design system. The `--thd-color-*` token namespace, the Charlie Display / Charlie Text family, and the confident `#1868db` blue are all inherited from or aligned with the Atlassian platform. Loom now reads as "part of the workspace you already trust" rather than a standalone creator tool. The white canvas, single-blue discipline, and full-pill components place it firmly in the modern-SaaS-trust tradition — closer to Linear's clarity and Stripe's restraint than to the playful, indie register of early Loom.
What it inherits: Atlassian's tokenized color ladders and Charlie typeface family (the platform-trust signal); the modern-SaaS convention of one confident brand blue on a clean white canvas (Dropbox, Calendly, Zoom lineage); the full-pill CTA shape that softens the enterprise register into something friendly. What it borrows from contemporaries: Linear's whitespace discipline and screenshot-forward layout; Stripe's hairline-border restraint over heavy shadows; Notion's calm, human microcopy voice. What it rejects: dark canvases, gradient meshes, neon AI aesthetics, and creator-playful illustration — Loom chose institutional calm over indie personality.
**Named influences:**
- **Atlassian Design System** — The parent platform: tokenized color ladders, Charlie typeface family, the `#1868db` blue, and the trust signal of platform consistency. *https://atlassian.design*
- **Linear** — Whitespace discipline, screenshot-forward layout, calm modern-SaaS clarity. *https://linear.app*
- **Stripe** — Hairline-border restraint and soft neutral shadows over heavy elevation. *https://stripe.com*
- **Notion** — Calm, human, low-friction microcopy voice for a productivity tool. *https://www.notion.com*
- **Dropbox / Calendly** — The modern convention of one confident brand color on a clean white canvas for trust-forward SaaS. *https://www.dropbox.com*
- **Material Design** — The `cubic-bezier(0.4, 0, 0.2, 1)` standard easing and translucent ring focus conventions. *https://m3.material.io*
## 14. Do's and Don'ts
### Do
- **Do** keep the canvas pure white `#ffffff` — the brightness is the trust signal. No cream, no gradient.
- **Do** use one confident blue `#1868db` for all primary action and links — discipline over variety.
- **Do** make every actionable element a full pill (9999px). The rounded capsule is the brand fingerprint.
- **Do** set headlines in Charlie Display at 700, near-black `#101214`; body in Charlie Text 400 at softer `#292a2e`.
- **Do** reserve violet `#d8a0f7` exclusively for AI / Rovo surfaces — it is a meaning, not a decoration.
- **Do** reserve coral `#ff613d` exclusively for the record / live signal — the one warm, urgent color.
- **Do** define cards with a `#e4e2e7` hairline border, not a shadow. Borders first.
- **Do** pull every color from the token ladder (blue-10…100, grey-10…100, etc.) — no one-off hexes.
- **Do** keep the secondary CTA soft-blue `#e9f2fe` with a near-black label — calm, never competing with primary.
- **Do** let product videos and screenshots carry the story; show the product more than you describe it.
### Don't
- **Don't** introduce a dark canvas on the marketing surface; white is the brand's brightness.
- **Don't** use violet or coral as a generic accent — they are bound to AI and recording respectively.
- **Don't** make the CTA any color but blue; the soft-blue and outline variants are the only alternates.
- **Don't** square off the CTAs. A rectangular button breaks the friendly full-pill register.
- **Don't** use colored shadows (blue/violet glow) except on the focus ring; shadows are soft neutral black.
- **Don't** use a warm grey neutral. The grey ladder is cool with a faint blue undertone.
- **Don't** add a serif or a third type family. Charlie Display + Charlie Text + mono is the system.
- **Don't** use heavy drop shadows for elevation; borders and soft diffuse shadows are the depth language.
- **Don't** shout in the copy ("Sign up now!", scarcity). The voice is friendly and low-friction.
- **Don't** invent off-ladder hexes; every color should map to a `--thd-color-*` token rung.
## 15. Agent Prompt Guide
### Quick Color Reference
```
bg: #ffffff
bg-soft: #f8f8f8
text: #292a2e
text-heading: #101214
brand-blue: #1868db
brand-blue-hover: #1558bc
brand-soft: #e9f2fe
accent-violet: #d8a0f7
accent-record: #ff613d
border: #e4e2e7
on-brand: #ffffff
```
### Example Component Prompts
1. **"Create a hero in Loom style — pure white `#ffffff` canvas, ~63px headline in Charlie Display at weight 700 in near-black `#101214` with `-0.02em` tracking, 18px Charlie Text lede in soft grey `#292a2e` at 1.55 line-height, a primary full-pill CTA in blue `#1868db` with white label plus a soft-blue `#e9f2fe` secondary pill 'Contact Sales', and a product video floating below on a soft ambient shadow."**
2. **"Design a feature card in Loom style — white `#ffffff` background, 12px radius, 1px `#e4e2e7` hairline border, 24px interior padding, 20px Charlie Display 600 heading in `#101214`, 16px Charlie Text 400 body in `#292a2e`, no shadow at rest, gentle `rgba(16,18,20,0.06) 0 2px 8px` shadow on hover."**
3. **"Build a full-pill primary button in Loom style — blue `#1868db` background, white label in Charlie Text 600 / 16px, `12px 20px` padding, 9999px radius, hover to `#1558bc`, active to `#123263`, no border, no scale on hover."**
4. **"Compose an AI / Rovo feature surface in Loom style — soft violet `#f8eefe` background, 16px radius, 24px padding, a small violet pill chip (bg `#f8eefe`, text `#964ac0`) reading 'AI', heading in Charlie Display 600 `#101214`, body in Charlie Text `#292a2e`. Use violet only here — it signals the intelligence layer."**
5. **"Render a recording-state chip in Loom style — full-pill, 12% coral background `#ff613d20`, coral text `#ff613d`, a leading coral dot, Charlie Text 600 / 13px, label 'Recording'. Coral is reserved for the live / record signal only."**
6. **"Create the primary nav in Loom style — 64px white header, Loom wordmark in near-black, links in Charlie Text 500 / 16px (`#292a2e`, hover `#1868db`), mega-menu dropdowns on Products and Solutions, right-aligned ghost 'Sign in' + blue full-pill 'Get Loom for free'. Opaque white with a bottom hairline on scroll."**
### Iteration Guide
1. **Start with pure white, not cream or grey.** If the bg has any tint, you've drifted toward Descript (cream) or a dark-SaaS register. White brightness is the entry ticket.
2. **One blue, everywhere it acts.** `#1868db` for primary CTA and links. Resist adding a second action color — the discipline is the brand.
3. **Make everything a pill.** CTAs, chips, badges, avatars at 9999px radius. A square button collapses the friendly register instantly.
4. **Charlie Display 700 for headlines, Charlie Text 400 for body.** Same family, two optical sizes; confidence comes from weight, not from a serif or a louder color.
5. **Two-tone the type color.** Headings near-black `#101214`, body softer `#292a2e`. The small grey step does the hierarchy work.
6. **Bind violet and coral to meaning.** Violet `#d8a0f7` only for AI/Rovo; coral `#ff613d` only for recording. If either appears decoratively, you've broken the grammar.
7. **Borders before shadows.** Define cards with a `#e4e2e7` hairline; reserve soft neutral shadows for floating UI only.
8. **Calm the verbs.** "Get Loom for free," "Start recording" — friendly and concrete. Drop any urgency or scarcity language.
---
*Theme-toggle audit: score=0, signals=[none]*
1. Visual Theme & Atmosphere
Loom’s marketing site is the visual definition of calm, trustworthy productivity software. The canvas is plain white (#ffffff) — no cream, no gradient mesh, no dark slab — and onto it Loom places one confident blue (#1868db), the custom Charlie sans family, and an abundance of breathing room. The page never raises its voice. Headlines land in Charlie Display at roughly 63px / weight 700 in near-black #101214; body copy sits in Charlie Text at 16px / 1.55 in a slightly softer grey-near-black #292a2e. The single loudest move on the page is the blue full-pill CTA — “Get Loom for free” — and even that is friendly rather than aggressive, its 9999px radius making it read as a soft capsule rather than a hard button.
The defining context is the Atlassian acquisition. Loom is now an Atlassian product, and its palette has converged on Atlassian’s tokenized design system: the page exposes a full --thd-color-* token namespace with a 10-step blue ladder (blue-10 #e9f2fe → blue-100 #1c2b42), parallel violet, grey, yellow, and green ladders, and named semantic tokens. This is enterprise-grade chromatic discipline — every color on the page is a rung on a defined scale, not a one-off hex. The result reads as institutional trust: this is a tool your whole company already uses, IT has already approved, and the brand color is the same calm blue you see across Jira and Confluence. Loom traded indie-creator playfulness for the reassurance of being part of a platform.
The third register is the record signal. Loom is, at its core, the button you press to start recording your screen. The brand reserves a hot coral #ff613d (the --thd-color-record token) for exactly this — the record dot, recording-state chips, the live indicator. It is the one warm, urgent color in an otherwise cool palette, and it appears only when something is being captured. Alongside it, a soft violet #d8a0f7 (--thd-color-violet-30) marks the AI / Rovo intelligence layer — auto-titles, summaries, transcripts. So the page has a clean three-part chromatic grammar: blue for action and trust, violet for AI, coral for recording. Each color means one thing.
Where Descript ships beauty-editorial cream-pink + serif display, and Runway/Pika ship chrome-on-black for cinematic AI, Loom ships the friendly white-and-blue of a workspace tool. The pill-shaped everything — CTAs, chips, badges, avatars — is the entire emotional register: nothing sharp, nothing intimidating, just rounded, approachable surfaces that say “press record and send.” It is software designed to feel like it requires no learning curve.
Atmospheric vocabulary that captures the feeling: calm-white, Atlassian-blue, friendly-pill, Charlie-sans, record-coral, Rovo-violet, tokenized-trust, async-video, workspace-reassurance, no-learning-curve, breathing-room, enterprise-approachable. Every surface lands like a clean product screenshot — bright, legible, unhurried, and quietly confident that you already know how to use it.
Key Characteristics
- Plain white
#ffffffcanvas — no cream, no gradient, no dark slab; brightness is the brand - Custom Charlie Display headlines at ~63px / 700 in near-black
#101214 - Custom Charlie Text body at 16px / 1.55 in soft grey-near-black
#292a2e - One confident Atlassian blue
#1868dbfor all primary action and links - Full-pill (9999px) CTAs, chips, badges — the rounded, approachable shape is the register
- Soft-blue secondary CTA
#e9f2fewith near-black label — calm, never competing with primary - Signature violet
#d8a0f7for the AI / Rovo intelligence layer only - Hot coral
#ff613dreserved exclusively for the record signal - Fully tokenized palette — every color is a rung on a defined 10-step ladder
- Borders define cards, not shadows —
#e4e2e7hairlines over white - Generous whitespace, 80–128px section rhythm — unhurried, screenshot-clean
- Three-color grammar: blue = action, violet = AI, coral = recording — each means one thing
2. Color Palette & Roles
Primary
- bg
#ffffff[→ canvas]: white page canvas, the brand’s brightness. RGB (255, 255, 255). Never tinted — the cleanness is the point. - text
#292a2e[→--thd-color-grey-100]: primary body copy, a soft near-black warmer and gentler than#000. - text-heading
#101214[→--thd-color-black]: headlines, leans true-black for maximum presence against white. - bg-soft
#f8f8f8[→--thd-color-grey-10]: softest panel wash for nested sections. - bg-muted
#f0f1f2[→--thd-color-grey-20]: deeper grey band for alternating section emphasis.
Brand (Atlassian Blue Ladder)
- brand
#1868db[→--thd-color-blue-70/--thd-color-button-fr]: primary CTA, links, focus border. The defining chromatic move. - brand-hover
#1558bc[→--thd-color-blue-80]: hover / pressed state, one step deeper. - brand-active
#123263[→--thd-color-blue-90]: active / deep-press state. - brand-soft
#e9f2fe[→--thd-color-blue-10]: soft hover wash, secondary CTA fill, chip background. - brand-tint
#cfe1fd[→--thd-color-blue-20]: mid tint for hover-on-soft states. - brand-mid
#4d8ced[→--thd-color-blue-50]: mid-bright accent for illustration / data viz. - brand-outline
#a3c3f1[→--thd-color-button-ol]: outline-button border color. - on-brand
#ffffff[→--thd-color-white]: white label on blue. The high-contrast action pair.
Accent (Violet AI Layer + Coral Record)
- accent-violet
#d8a0f7[→--thd-color-violet-30]: signature secondary accent, marks AI / Rovo surfaces. - accent-violet-soft
#f8eefe[→--thd-color-violet-10]: soft violet wash background for AI feature blocks. - accent-violet-mid
#bf63f3[→--thd-color-violet-50]: brighter violet for emphasis within the AI layer. - accent-violet-deep
#964ac0[→--thd-color-violet-70]: deep violet for violet-on-soft text. - accent-record
#ff613d[→--thd-color-record]: hot coral record dot — the one warm, urgent color. - accent-record-soft
#ff613d20[→--thd-color-record-20]: 12% coral wash behind recording-state chips.
The accent layer is strictly meaning-bound: violet only ever means “AI / Rovo,” coral only ever means “recording / live.” Neither is decorative. Using violet for a generic highlight or coral for a CTA breaks the chromatic grammar that lets users read color as state.
Interactive
- link
#1868db[→--thd-color-blue-70]: blue links in body copy, often underlined on hover. - link-hover
#1558bc[→--thd-color-blue-80]: deeper blue on hover. - selected-bg
#e9f2fe[→--thd-color-blue-10]: selected nav item / active row, soft-blue wash. - disabled
#b7b9be[→--thd-color-grey-40]: disabled control text and icons.
Neutral Scale (Grey Ladder)
- grey-10
#f8f8f8— softest wash / page-soft surface. - grey-20
#f0f1f2— section band. - grey-30
#dddee1— strong separator / divider. - grey-40
#b7b9be— input resting border, disabled text. - grey-50
#8c8f97— helper text, placeholders. - grey-70
#6c6f77— captions, metadata. - grey-80
#505258— secondary body copy. - grey-90
#3b3d42— strong secondary copy. - grey-100
#292a2e— primary body text. - black
#101214— headings; black-neutral#1e1f21— emphasized copy.
The grey ladder is cool-neutral with a faint blue undertone — it sits comfortably under the blue brand color without ever picking up warmth. Loom never uses a warm grey; a beige or taupe neutral would crack the clean, cool, screenshot-bright temperature.
Surface & Borders
- surface-0 (page)
#ffffffwhite. - surface-1 (soft)
#f8f8f8grey-10 nested panel. - surface-2 (band)
#f0f1f2grey-20 section band. - surface-blue
#e9f2feblue-10 feature surface. - surface-violet
#f8eefeviolet-10 AI surface. - border
#e4e2e7[→--thd-color-light-border]: default hairline — the primary card-definition device on white. - border-soft
#f1f0f3[→--thd-color-border-grey]: quietest separation, internal dividers. - border-strong
#dddee1[→--thd-color-grey-30]: emphasized separator. - border-input
#b7b9be[→--thd-color-grey-40]: input resting border. - border-brand
#1868db[→--thd-color-blue-70]: focused / active border.
Shadow Colors
Loom’s depth language is borders first, shadows second. On the white canvas, cards are defined primarily by a hairline #e4e2e7 border; shadows are reserved for genuinely floating elements (popovers, dropdowns, modals) and are soft, neutral black-tinted (rgba(16, 18, 20, 0.06) to 0.14), never colored. The brand never uses blue- or violet-tinted shadows; that would muddy the crisp white temperature. Product screenshots typically float on a subtle ambient shadow with the in-product UI shown at native fidelity — Loom trusts the product’s own polish rather than wrapping it in a decorative frame.
Semantic
- success — bg
#efffd6(green-10 wash), text#4c6b1f(green-80), solid#94c748(green-40). - warning — bg
#fff5d4(yellow-10 wash), text#8a5700(yellow-80), solid#ffc716(yellow-30). - danger / destructive — bg
#ff613d20(12% coral wash), solid#ff613d(the record coral, reused for destructive). Note: Loom’s destructive color is the same coral as the record dot — the urgent warm hue does double duty as “live” and “careful.” - info — bg
#e9f2fe(blue-10 wash), text#1558bc(blue-80). Info reuses the brand blue, reinforcing the single-brand-system discipline.
The notable choice: there is no separate “error red” — the coral record token doubles as the destructive color, and info reuses the brand blue. Semantic colors are drawn from the existing token ladders rather than introducing new hues, which keeps the whole page chromatically coherent.
3. Typography Rules
Font Family
- Display:
"Charlie Display", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif— Atlassian’s custom display sans, used at weight 500 / 600 / 700. The face for all headlines. - Body:
"Charlie Text", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif— Atlassian’s custom text sans, optimized for paragraph reading, used at 400 / 500 / 600. - Mono:
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, monospace— pragmatic system mono stack for code and tabular data. - OpenType features:
liga,kernon both Charlie faces;tnum,zeroon mono for code and stats.
Charlie Display and Charlie Text are a matched display/text pair from the same family — Display is tuned for large sizes (tighter spacing, more contrast), Text for small-size legibility (open apertures, generous spacing). This is the Atlassian house typography, shared across the platform, which is itself part of the “you already trust this” signal.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | Charlie Display | 80px | 700 | 1.0 | -0.03em | Largest hero variant |
| Display LG | Charlie Display | 63px | 700 | 1.05 | -0.02em | The canonical Loom hero (measured ~63px) |
| H1 | Charlie Display | 44px | 700 | 1.1 | -0.018em | Page / major section title (measured ~44px H2 on site) |
| H2 | Charlie Display | 32px | 700 | 1.2 | -0.012em | Major section |
| H3 | Charlie Display | 24px | 600 | 1.25 | -0.005em | Sub-section |
| H4 | Charlie Display | 20px | 600 | 1.3 | 0 | Card heading |
| H5 | Charlie Text | 18px | 600 | 1.35 | 0 | Inline emphasis (switches to text face) |
| Eyebrow | Charlie Text | 13px | 600 | 1.4 | 0.06em | Uppercase section pre-label |
| Body Large | Charlie Text | 18px | 400 | 1.55 | 0 | Lede paragraph |
| Body | Charlie Text | 16px | 400 | 1.55 | 0 | Default body copy |
| Body Medium | Charlie Text | 16px | 500 | 1.55 | 0 | Emphasized body |
| Body Small | Charlie Text | 14px | 400 | 1.5 | 0 | Captions, sidebars |
| Label | Charlie Text | 13px | 500 | 1.4 | 0 | UI labels, form labels |
| Caption | Charlie Text | 12px | 500 | 1.4 | 0.02em | Metadata, timestamps |
| Button | Charlie Text | 16px | 600 | 1.0 | 0 | CTA copy |
| Code | Mono | 14px | 400 | 1.55 | 0 | Inline + block |
Principles
- One family, two optical sizes. Charlie Display for headings, Charlie Text for body — same designer’s intent, two optical cuts. This single-family approach is calmer than a serif/sans contrast and reinforces the “consistent platform” feel.
- Headlines at 700, never lighter. Loom’s display weight is bold (700) — the confidence comes from weight, not size or color. Headlines stay near-black
#101214, body steps down to#292a2e. - Negative tracking scales with size. -0.03em at 80px, -0.02em at 63px, -0.018em at 44px, easing to 0 at 20px and below. Large type is optically tightened; body type sits at natural spacing.
- Body at 16px / 1.55. The web-standard 16px with a generous 1.55 line-height — comfortable, unremarkable, designed to disappear so the product screenshots carry the story.
- Two-tone heading/body split. Headings are true-near-black
#101214; body is the softer#292a2e. The ~2-step grey difference creates hierarchy without changing size or weight. - Eyebrows in uppercase Charlie Text 600 / 0.06em. Short section pre-labels are the only uppercase, tracked-out element — everything else is sentence case.
- No italics in the system. Loom’s voice is plain and direct; emphasis comes from weight (500 / 600), not slant.
- Mono only for code and stats. The system mono stack appears in code blocks and tabular numbers (
tnum), never as a decorative accent.
4. Component Stylings
Buttons
All Loom buttons are full-pill (9999px radius) — the rounded capsule shape is the brand’s defining component signature.
Primary (Blue Pill)
- Background:
#1868db. Text:#ffffff, Charlie Text 600 / 16px. - Padding:
12px 20px. Radius:9999px(full pill). No border. - Hover: bg →
#1558bc; transition240ms ease-standard. - Active: bg →
#123263. - Use: Primary CTA — Get Loom for free, Start recording, Get started.
Secondary (Soft-Blue Pill)
- Background:
#e9f2feblue-10. Text:#101214near-black, Charlie Text 600 / 16px. - Padding:
12px 20px. Radius:9999px. No border. - Hover: bg →
#cfe1fdblue-20. - Use: Twin to primary — Contact Sales, View pricing. Calm, never competes with the blue primary.
Outline (Tertiary)
- Background: transparent. Text:
#1868dbblue. Border:1px solid #a3c3f1(blue-tint outline). Radius:9999px. - Same padding (12×20), font (Charlie Text 600 / 16px).
- Hover: bg →
#e9f2fesoft-blue wash. - Use: Lower-emphasis actions in feature sections, secondary nav.
Ghost (Quiet)
- Background: transparent. Text:
#292a2e. No border. - Padding:
8px 12px. Charlie Text 500 / 16px. - Hover: text →
#1868dbblue. - Use: Nav links, footer, inline secondary actions.
Cards
Default Card
- Background:
#ffffff. Border:1px solid #e4e2e7hairline. Radius:12px. Padding:24px. - Shadow: none — the border does the work.
- Hover: subtle
rgba(16,18,20,0.06) 0 2px 8pxshadow lifts the card off white. - Use: Default feature card — defined by border, not fill.
Soft Card
- Background:
#f8f8f8grey-10. Border: none. Radius:16px. Padding:24px. - Use: Nested feature blocks, testimonials — the grey wash separates it from the white page without a border.
Blue Feature Card
- Background:
#e9f2feblue-10. Border: none. Radius:16px. Padding:24px. - Use: Highlights, integration callouts, plan-comparison emphasis blocks. Pairs with the blue brand.
Violet AI Card
- Background:
#f8eefeviolet-10. Border: none. Radius:16px. Padding:24px. - Use: Rovo / AI feature surfaces only — the violet wash flags the intelligence layer.
Badges, Tags, Pills
All pill-shaped (9999px radius), small, sentence-case or short-label.
Soft-Blue Chip — bg #e9f2fe, text #1558bc blue-80, padding 4px 10px, Charlie Text 500 / 13px. Status / NEW / plan labels.
Violet AI Chip — bg #f8eefe, text #964ac0 violet-70, padding 4px 10px, Charlie Text 500 / 13px. Marks AI / Rovo features.
Record Chip — bg #ff613d20 (12% coral), text #ff613d coral, padding 4px 10px, Charlie Text 600 / 13px, with a leading coral dot. The recording-state / live signal.
Eyebrow Label — no chrome, just type. Charlie Text 600 / 13px / uppercase / 0.06em tracking, color #6c6f77 grey-70. Sits above section headlines.
Inputs / Forms
- Background:
#ffffff. Border:1px solid #b7b9begrey-40. Radius:8px. Padding:10px 12px. - Font: Charlie Text 400 / 16px. Placeholder:
#8c8f97grey-50. - Focus:
0 0 0 2px rgba(24, 104, 219, 0.30)blue glow ring, border →#1868db. - Error: border →
#ff613dcoral, helper text in coral below. - Helper: caption 12px grey-70 below the field.
Navigation
- Header height
64px. Background#ffffffwhite (becomes opaque-white with a subtle bottom hairline + shadow on scroll). - Logo: Loom wordmark + mark, near-black
#101214. - Nav links: Charlie Text 500 / 16px, color
#292a2e, padding8px 12px. Hover →#1868dbblue. Dropdown mega-menus onProducts/Solutions. - Right-side CTA pair: ghost “Sign in” + blue pill “Get Loom for free”.
- Mobile: right-aligned hamburger, full-screen sheet with stacked links and the blue CTA pinned at the bottom.
Optional Components
Dropdown / Mega-menu — bg #ffffff, border 1px solid #e4e2e7, radius 12px, shadow rgba(16,18,20,0.10) 0 8px 24px -4px, padding 16px. Multi-column with section headers in Charlie Text 600 / 13px.
Code Block — Mono 14px, bg #f8f8f8 grey-10, radius 8px, padding 16px, border #e4e2e7. Inline code: bg #f0f1f2, padding 2px 6px, radius 4px.
Tooltip — bg #101214 near-black, text #ffffff, radius 8px, padding 8px 12px, font Charlie Text 500 / 13px.
Modal — bg #ffffff, radius 16px, shadow rgba(16,18,20,0.14) 0 16px 48px -8px, max-width 560px. Backdrop overlay rgba(0,0,0,0.5) (the --thd-color-overlay token).
Video Player Chrome — Loom’s signature artifact: a rounded 12px player with the coral record indicator, soft controls, and a pill-shaped share bar. On the marketing page, demo players sit on an ambient shadow over white.
5. Layout Principles
Spacing System
- Base unit: 4px.
- Scale: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96 — a clean 4px-based scale with no fractional steps.
- Density observation: Loom runs comfortable, unhurried spacing. Headlines float in generous margin; feature cards sit on 24px internal padding and 24–32px gaps. The page never feels cramped.
Grid & Container
- Page max width:
1280px. Standard SaaS width; content stays centered with white margins beyond. - Site gutter:
clamp(20px, 5vw, 64px). - Prose width: capped ~
720pxfor comfortable reading. - Grid: 12 columns with 24px gutters. Hero blocks span full width; feature rails span 4–6 columns; integration grids run 3-up or 4-up.
- Hero treatment: centered or left-aligned Charlie Display headline, supporting body, blue pill CTA + soft-blue secondary, with a product video / screenshot floating below or beside on ambient shadow.
Whitespace Philosophy
The white canvas runs edge to edge, broken only by occasional grey-10 (#f8f8f8) or blue-10 (#e9f2fe) section bands for rhythm. Section gutters run 80–128px between major blocks; minor blocks sit on 48–64px gaps; intra-section spacing uses 16–32px. The page is structured as a sequence of clean, bright spreads — hero, social proof, feature blocks, AI/Rovo section (violet-washed), use-case grid, testimonial, pricing, footer — each sitting on white or a soft tonal band.
Section Cadence
- Hero (white + Charlie Display + blue pill + product video) → Logo wall / social proof (grey-10 band) → Feature blocks (white, alternating image-left/image-right) → AI / Rovo section (violet-10 washed) → Use-case grid (3-up cards) → Testimonial (soft card with quote) → Pricing (white, blue-10 highlighted plan) → Footer (white or grey-10, multi-column links).
- Tonal bands (grey-10, blue-10, violet-10) provide rhythm; there are no dark bands on the marketing surface.
- Product videos / screenshots appear repeatedly as the primary visual anchor — Loom shows the product more than it describes it.
6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Tiny inline chips, decorative ticks |
| Standard (sm) | 4px | Inline code, small tags, checkboxes |
| Comfortable (md) | 8px | Inputs, dropdown items, small buttons |
| Relaxed (lg) | 12px | Cards, video player chrome, dropdowns |
| Large (xl) | 16px | Soft/blue/violet feature cards, modals |
| Pill | 9999px | CTAs, chips, badges, avatars — the brand signature |
Loom’s signature radii: 9999px full-pill CTAs / 12px cards / 8px inputs / 16px feature surfaces. The full-pill on every actionable element is the single strongest shape decision — it sets the friendly, soft, approachable register. Rectangular content surfaces (cards, players) use the comfortable 12–16px ladder so they read as modern-soft without going fully round. Mixed radii within a single primitive are avoided.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | Flat — no shadow | Default page surface, hero, body sections |
| 1 | Hairline border (#e4e2e7) | Default cards, inputs, dividers |
| 2 | rgba(16,18,20,0.04) 0 1px 2px ambient | Subtle lift on screenshots |
| 3 | rgba(16,18,20,0.06) 0 2px 8px | Card hover, raised tiles |
| 4 | rgba(16,18,20,0.10) 0 8px 24px -4px | Dropdowns, popovers, mega-menus |
| 5 | rgba(16,18,20,0.14) 0 16px 48px -8px | Modals, dialogs |
Shadow Philosophy
Loom’s depth comes from borders first, soft neutral shadows second. On the white canvas, most cards are defined by a #e4e2e7 hairline rather than a shadow — flat and clean. Shadows are reserved for genuinely floating UI (popovers, dropdowns, modals) and product screenshots, and they are always soft, diffuse, and neutral black-tinted (rgba(16,18,20,*)). The brand never uses colored shadows (no blue or violet glow except on focus rings) and never uses hard drop shadows — both would crack the crisp, bright, screenshot-clean temperature. Product videos float on a barely-there ambient shadow that lets the product’s own polish carry the elevation.
8. Interaction & Motion
Easing Curves
ease-standard:cubic-bezier(0.4, 0, 0.2, 1)— Material-style; default for hover, focus, color transitions.ease-emphasized:cubic-bezier(0.2, 0, 0, 1)— punchier; modal enter, hero reveal.ease-entrance:cubic-bezier(0, 0, 0.2, 1)— decelerate-in; below-fold fade-ups.
Duration Buckets
- Fast (150ms) — color transitions, focus rings, link hovers.
- Standard (240ms) — button hover, card hover, dropdown reveal.
- Slow (320ms) — modal enter/exit, section fade-in.
- Page (420ms) — route transitions, hero reveal sequences.
Per-Component Micro-States
- Button hover (blue pill): bg
#1868db→#1558bc; transition240ms ease-standard. No scale, no lift. - Button hover (soft-blue): bg
#e9f2fe→#cfe1fd. - Card hover: subtle
rgba(16,18,20,0.06) 0 2px 8pxshadow fades in; no border change. - Link hover: color
#1868db→#1558bcover 150ms; underline may appear. - Input focus: 2px blue glow ring (
rgba(24,104,219,0.30)) fades in over 150ms; border darkens to blue. - Record indicator: coral dot pulses gently when live — the one deliberately animated brand element.
Page Transitions
Friendly, restrained reveal: hero text and product video fade in over 420ms with a small 16px translate-up; below-fold sections use IntersectionObserver to fade up at ~85% viewport, 320ms, with the ease-entrance curve. Loom favors subtle, professional motion — nothing bouncy, nothing dramatic.
Reduced Motion
@media (prefers-reduced-motion: reduce) — all transitions become opacity-only, durations halved. Translate fade-ups, the record-dot pulse, and any scroll-triggered reveals are disabled; sections snap to final state.
9. Accessibility & A11y
Contrast Pairs
#292a2etext on#ffffffbg: 12.4:1 — AAA at all sizes (primary body).#101214heading on#ffffffbg: 18.1:1 — AAA at all sizes (headlines).#505258secondary on#ffffffbg: 7.6:1 — AAA at body sizes.#fffffftext on#1868dbblue button: 4.8:1 — AA at all sizes, AAA at large (≥18px / ≥14px bold). The blue is calibrated to clear AA for button labels.#1558bctext on#e9f2fesoft-blue chip: 6.9:1 — AAA at body sizes.#964ac0violet on#f8eefechip: 5.4:1 — AA at body sizes.#8c8f97muted on#ffffffbg: 3.3:1 — AA at large only; reserved for placeholders and helper text, never body copy.
Focus Indicators
- Default focus ring:
0 0 0 2px rgba(24, 104, 219, 0.30)blue glow plus a#1868dbborder, with 2px offset. - The exposed
--tw-ring-color: rgba(59,130,246,.5)confirms a blue translucent ring as the system default. - All interactive surfaces have a visible focus state — no
outline: nonewithout a replacement.
ARIA Patterns
- Navigation:
<nav aria-label="Main">with skip-link to main content; mega-menus usearia-expanded/aria-controls. - Disclosure:
<button aria-expanded aria-controls>for collapsible FAQ and feature sections. - Dialog:
role="dialog" aria-modal="true" aria-labelledbywith focus trap and Esc-to-close. - Video player: native
<video>controls or a custom player witharia-labelon play/pause/share, captions track, and keyboard scrubbing. - Live regions:
aria-live="polite"for form validation; the recording indicator should announce state changes.
Keyboard Navigation
- Tab order matches visual flow: skip-link → nav → hero CTA → main content → footer.
- All buttons, links, inputs reachable via Tab; modals and mega-menus trap focus until dismissed.
Esccloses modals, dropdowns, and the mobile menu sheet.- Video players support Space (play/pause) and arrow-key scrubbing.
Screen Reader Hints
- Product screenshots and demo videos have descriptive alt text / captions explaining the in-product flow shown.
- Color-coded states (violet = AI, coral = recording) carry a text label or icon, never color alone.
- Icon-only buttons (share, settings, record) have
aria-label. - The Loom wordmark uses
aria-label="Loom".
Reduced Motion
Honored via the global media query. The record-dot pulse, fade-ups, and scroll reveals become opacity-only or are disabled; durations halve.
10. Responsive Behavior
Breakpoints
| Name | Width | Use |
|---|---|---|
| Mobile | < 640px | Single column, full-bleed sections, ~36px hero |
| Tablet | 640–1024px | 2-column rails, ~48px hero |
| Desktop | 1024–1280px | Full 12-col grid, ~63px hero, 720px prose |
| Wide | 1280–1536px | Site max width hits |
| Ultra | > 1536px | Page locks to 1280, gutters expand |
Touch Targets
- Minimum tap target: 44×44px (WCAG AAA).
- Buttons: 44px minimum height on mobile (the pill shape keeps comfortable thumb-room).
- Nav link tap area: 44×44px even when visual padding is smaller.
Collapsing Strategy
- Header: full nav with mega-menus at ≥1024px; right-aligned hamburger sheet below.
- Hero: ~63px display → ~48px → ~36px across breakpoints. Charlie Display scales down smoothly.
- Feature blocks: side-by-side image+text at desktop stack to image-over-text at mobile.
- Use-case grid: 3-up / 4-up at desktop, 2-up at tablet, 1-up at mobile.
- Body width: ~720px → fluid 90vw at mobile.
- Section spacing: 128px → 96px → 64px across sizes.
Image & Video Behavior
- Product videos use lazy-loaded posters with
aspect-ratioenforced to prevent layout shift. - Screenshots use
srcset1x/2x; eager on hero, lazy below the fold. - The video player preserves its 12px radius and controls at all sizes; full-width on mobile.
Container Queries
Used inside feature cards to switch icon position (icon-left vs icon-top) when card width crosses ~320px, and inside the pricing table to switch from columns to stacked plan cards.
11. Content & Voice
Tone
Friendly, clear, low-friction. Loom writes the way a helpful colleague talks — direct, encouraging, never jargony or urgent. The voice centers the core promise: recording and sharing a video is faster and warmer than writing a long message. It is confident (backed by Atlassian-scale trust) but stays approachable and human, the opposite of enterprise-stiff.
Microcopy Patterns
- Button verbs: “Get Loom for free,” “Start recording,” “Get started,” “Contact Sales,” “Watch a demo.” Sentence case, never all-caps, never urgent.
- Error messages: “Something went wrong — try again, or [contact support].” Calm, low-stakes, solution-oriented.
- Success confirmations: “Recording saved.” “Link copied.” Brief and immediate.
- Loading / processing states: “Processing your video…” “Generating transcript…” — context-specific, AI-aware where relevant.
Empty States
What they say: explain the state and offer the next step. “No Looms yet. Record your first video to get started.” What they don’t say: “Oops!”, “Whoops!”, apologetic exclamations. Empty states are normal moments, not failures.
CTA Verb Conventions
- Primary on hero: “Get Loom for free,” “Start recording,” “Get started”
- Secondary: “Contact Sales,” “Watch a demo,” “See pricing”
- Footer: “Read the blog,” “Help center,” “Sign in,” “Download”
The brand never uses “Sign up now!” or scarcity-driven urgency. The pitch is ease and trust (“free,” “in seconds”), not pressure.
12. Dark Mode & Theming
Light-only on the marketing surface — no dark variant. The white canvas is the brand’s brightness signal; a dark marketing site would lose the clean, trustworthy, screenshot-bright register that distinguishes Loom. The blue, violet, and coral accents are all calibrated against white; porting them to dark would require re-keying contrast across the entire token system.
The in-product editor and recorder ship their own dark theme — the token namespace already includes dark rungs (grey-100 #292a2e, black-neutral #1e1f21, blue-100 #1c2b42, violet-100 #35243f) and *-dark semantic mappings, so a dark theme is fully supported at the product layer. That dark theme is documented at the product level, not on the marketing surface. When product screenshots show the dark editor, they sit on the white marketing canvas as artifacts, preserving the page-level brightness.
If a downstream surface needs a dark companion of the marketing system, the rule would be: keep blue, violet, and coral at full saturation; swap white for #1e1f21 (black-neutral); lift cards to #292a2e (grey-100); and use border-grey at low opacity for hairlines. The token ladders already support this, but it is not currently shipped on the marketing site.
13. Lineage & Influences
Loom’s design DNA is calm, tokenized, enterprise-friendly productivity software — and since the 2023 Atlassian acquisition, that DNA has explicitly merged with Atlassian’s design system. The --thd-color-* token namespace, the Charlie Display / Charlie Text family, and the confident #1868db blue are all inherited from or aligned with the Atlassian platform. Loom now reads as “part of the workspace you already trust” rather than a standalone creator tool. The white canvas, single-blue discipline, and full-pill components place it firmly in the modern-SaaS-trust tradition — closer to Linear’s clarity and Stripe’s restraint than to the playful, indie register of early Loom.
What it inherits: Atlassian’s tokenized color ladders and Charlie typeface family (the platform-trust signal); the modern-SaaS convention of one confident brand blue on a clean white canvas (Dropbox, Calendly, Zoom lineage); the full-pill CTA shape that softens the enterprise register into something friendly. What it borrows from contemporaries: Linear’s whitespace discipline and screenshot-forward layout; Stripe’s hairline-border restraint over heavy shadows; Notion’s calm, human microcopy voice. What it rejects: dark canvases, gradient meshes, neon AI aesthetics, and creator-playful illustration — Loom chose institutional calm over indie personality.
Named influences:
- Atlassian Design System — The parent platform: tokenized color ladders, Charlie typeface family, the
#1868dbblue, and the trust signal of platform consistency. https://atlassian.design - Linear — Whitespace discipline, screenshot-forward layout, calm modern-SaaS clarity. https://linear.app
- Stripe — Hairline-border restraint and soft neutral shadows over heavy elevation. https://stripe.com
- Notion — Calm, human, low-friction microcopy voice for a productivity tool. https://www.notion.com
- Dropbox / Calendly — The modern convention of one confident brand color on a clean white canvas for trust-forward SaaS. https://www.dropbox.com
- Material Design — The
cubic-bezier(0.4, 0, 0.2, 1)standard easing and translucent ring focus conventions. https://m3.material.io
14. Do’s and Don’ts
Do
- Do keep the canvas pure white
#ffffff— the brightness is the trust signal. No cream, no gradient. - Do use one confident blue
#1868dbfor all primary action and links — discipline over variety. - Do make every actionable element a full pill (9999px). The rounded capsule is the brand fingerprint.
- Do set headlines in Charlie Display at 700, near-black
#101214; body in Charlie Text 400 at softer#292a2e. - Do reserve violet
#d8a0f7exclusively for AI / Rovo surfaces — it is a meaning, not a decoration. - Do reserve coral
#ff613dexclusively for the record / live signal — the one warm, urgent color. - Do define cards with a
#e4e2e7hairline border, not a shadow. Borders first. - Do pull every color from the token ladder (blue-10…100, grey-10…100, etc.) — no one-off hexes.
- Do keep the secondary CTA soft-blue
#e9f2fewith a near-black label — calm, never competing with primary. - Do let product videos and screenshots carry the story; show the product more than you describe it.
Don’t
- Don’t introduce a dark canvas on the marketing surface; white is the brand’s brightness.
- Don’t use violet or coral as a generic accent — they are bound to AI and recording respectively.
- Don’t make the CTA any color but blue; the soft-blue and outline variants are the only alternates.
- Don’t square off the CTAs. A rectangular button breaks the friendly full-pill register.
- Don’t use colored shadows (blue/violet glow) except on the focus ring; shadows are soft neutral black.
- Don’t use a warm grey neutral. The grey ladder is cool with a faint blue undertone.
- Don’t add a serif or a third type family. Charlie Display + Charlie Text + mono is the system.
- Don’t use heavy drop shadows for elevation; borders and soft diffuse shadows are the depth language.
- Don’t shout in the copy (“Sign up now!”, scarcity). The voice is friendly and low-friction.
- Don’t invent off-ladder hexes; every color should map to a
--thd-color-*token rung.
15. Agent Prompt Guide
Quick Color Reference
bg: #ffffff
bg-soft: #f8f8f8
text: #292a2e
text-heading: #101214
brand-blue: #1868db
brand-blue-hover: #1558bc
brand-soft: #e9f2fe
accent-violet: #d8a0f7
accent-record: #ff613d
border: #e4e2e7
on-brand: #ffffff
Example Component Prompts
-
“Create a hero in Loom style — pure white
#ffffffcanvas, ~63px headline in Charlie Display at weight 700 in near-black#101214with-0.02emtracking, 18px Charlie Text lede in soft grey#292a2eat 1.55 line-height, a primary full-pill CTA in blue#1868dbwith white label plus a soft-blue#e9f2fesecondary pill ‘Contact Sales’, and a product video floating below on a soft ambient shadow.” -
“Design a feature card in Loom style — white
#ffffffbackground, 12px radius, 1px#e4e2e7hairline border, 24px interior padding, 20px Charlie Display 600 heading in#101214, 16px Charlie Text 400 body in#292a2e, no shadow at rest, gentlergba(16,18,20,0.06) 0 2px 8pxshadow on hover.” -
“Build a full-pill primary button in Loom style — blue
#1868dbbackground, white label in Charlie Text 600 / 16px,12px 20pxpadding, 9999px radius, hover to#1558bc, active to#123263, no border, no scale on hover.” -
“Compose an AI / Rovo feature surface in Loom style — soft violet
#f8eefebackground, 16px radius, 24px padding, a small violet pill chip (bg#f8eefe, text#964ac0) reading ‘AI’, heading in Charlie Display 600#101214, body in Charlie Text#292a2e. Use violet only here — it signals the intelligence layer.” -
“Render a recording-state chip in Loom style — full-pill, 12% coral background
#ff613d20, coral text#ff613d, a leading coral dot, Charlie Text 600 / 13px, label ‘Recording’. Coral is reserved for the live / record signal only.” -
“Create the primary nav in Loom style — 64px white header, Loom wordmark in near-black, links in Charlie Text 500 / 16px (
#292a2e, hover#1868db), mega-menu dropdowns on Products and Solutions, right-aligned ghost ‘Sign in’ + blue full-pill ‘Get Loom for free’. Opaque white with a bottom hairline on scroll.”
Iteration Guide
- Start with pure white, not cream or grey. If the bg has any tint, you’ve drifted toward Descript (cream) or a dark-SaaS register. White brightness is the entry ticket.
- One blue, everywhere it acts.
#1868dbfor primary CTA and links. Resist adding a second action color — the discipline is the brand. - Make everything a pill. CTAs, chips, badges, avatars at 9999px radius. A square button collapses the friendly register instantly.
- Charlie Display 700 for headlines, Charlie Text 400 for body. Same family, two optical sizes; confidence comes from weight, not from a serif or a louder color.
- Two-tone the type color. Headings near-black
#101214, body softer#292a2e. The small grey step does the hierarchy work. - Bind violet and coral to meaning. Violet
#d8a0f7only for AI/Rovo; coral#ff613donly for recording. If either appears decoratively, you’ve broken the grammar. - Borders before shadows. Define cards with a
#e4e2e7hairline; reserve soft neutral shadows for floating UI only. - Calm the verbs. “Get Loom for free,” “Start recording” — friendly and concrete. Drop any urgency or scarcity language.
Theme-toggle audit: score=0, signals=[none]
Drop loom into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add loom npx agentkit init --design loom