Foundations
Foundations
What is shared by the whole app and the site: the logo, colors, typography, spacing, grid, radii, shadows, borders, icons and motion.
Logo
The symbol on three backgrounds



| Background | Version | File |
|---|---|---|
| Light | Color | ember-symbole.png |
| Dark | Color | ember-symbole.png |
| Ember orange | White, a single color | ember-symbole-blanc.png |
Assembly: the EmberLogo component
Live preview
Ember.
Ember.

| Size | Symbol | "Ember." word | Usage |
|---|---|---|---|
sm | 32 px | font-satoshi text-xl font-bold text-neutral-900 | Site header, app rail |
md | 40 px | font-satoshi text-2xl font-bold text-neutral-900 | Sign-up dialog |
lg | 64 px | none | Footer (symbol only) |
hero | 72 px | none | App home (symbol only, 56 or 72 px) |
Clear space and minimum size
Clear space

x = half the logo height, on each side.
Minimum size
24 px tall on screen
48 pxMinimum height: 24 px on screen, 8 mm in print.
Usage
Do

Do: Place the symbol on a plain background, in the color version on light and dark.

Do: Use the white version on Ember orange.
Don't

Don't: Change the symbol's colors.

Don't: Stretch or squash the symbol.

Don't: Add a shadow or an effect.

Don't: Place it on a busy background or a photo.
Files
| File | Contents |
|---|---|
ember-symbole.png | Color symbol, 622 × 571 px, transparent background |
ember-symbole-blanc.png | White symbol, 622 × 571 px, transparent background |
ember-kit-media.zip | Both symbols, the palette (text, JSON, CSS) and the presentation texts |
| App icons | icon-192.png, icon.png (512), icon-1024.png, apple-icon.png, favicon-root.ico |
| Sharing images | og-brand-fr.png, og-brand-en.png |
Brand colors
ember from 50 to 950, the same in the app and on the site. Click a color to copy its value.ember-50
#fff9f5 · RGB 255 249 245
Chip backgrounds, card icon, selected state
ember-100
#fff2e8 · RGB 255 242 232
Highlighted plan background, work halo
ember-200
#ffe4d1 · RGB 255 228 209
Chip borders
ember-300
#ffcfa3 · RGB 255 207 163
Border hover
ember-400
#ffb374 · RGB 255 179 116
Drag-and-drop border
ember-500
#ff8c42 · RGB 255 140 66
Logo orange: large buttons, active menu underline, timeline, chips, theme color
ember-600
#f97316 · RGB 249 115 22
Large button hover
ember-700
#ea580c · RGB 234 88 12
Small buttons (12 px and below), focus ring
ember-800
#c2410c · RGB 194 65 12
Small button hover, orange text, chips
ember-900
#9a3412 · RGB 154 52 18
Orange text hover
ember-950
#7c2d12 · RGB 124 45 18
Very dark orange text
Use of orange
| Role | Classes |
|---|---|
| Large button (14 px text and up) | bg-ember-500 text-white hover:bg-ember-600 |
| Small button (13 px text and below) | bg-ember-700 text-white hover:bg-ember-800 |
| Orange text | text-ember-800, hover text-ember-900 |
| Button background | ember-500 for a large one, ember-700 for a small one, white text, never ember-800 at rest |
| Orange chip | border-ember-200 bg-ember-50 text-ember-800 |
| Orange without text | logo, timeline, chips, gauges, menu underline: ember-500 |
| Focus ring | ring-2 ring-ember-700 ring-offset-2 |
ember-800 and ember-900.Gradients
bg-gradient-orange
#ff8c42, #f97316, #ea580c
bg-gradient-orange-light
#fff9f5, #ffe4d1, #ffcfa3
bg-gradient-dark
#1c1917, #292524, #44403c
bg-gradient-subtle
#fafaf9, #f5f5f4, #fff9f5
App dark mode
| Token | Light | Dark |
|---|---|---|
| ember-50 | #fff9f5 | rgb(43 29 19) |
| ember-100 | #fff2e8 | rgb(58 38 21) |
| ember-200 | #ffe4d1 | rgb(87 54 26) |
Dark mode only redefines the backgrounds, borders, rings and gradients of these three tints. Oranges from 300 to 950 and texts do not change. The site has no dark mode: its brand surface is light.
Neutrals
neutral is the only gray: a warm gray, from 50 to 950. No cool gray mixes with it.neutral-50
#fafaf9 · RGB 250 250 249
Composer background, chat frames, calm site sections
neutral-100
#f5f5f4 · RGB 245 245 244
User bubble, segmented track, hovers
neutral-200
#e7e5e4 · RGB 231 229 228
Standard border
neutral-300
#d6d3d1 · RGB 214 211 209
Secondary button border, code block frame
neutral-400
#a8a29e · RGB 168 162 158
Placeholder text only
neutral-500
#78716c · RGB 120 113 108
Captions, resting icons
neutral-600
#57534e · RGB 87 83 78
Secondary text, resting segment
neutral-700
#44403c · RGB 68 64 60
Navigation links, neutral button text
neutral-800
#292524 · RGB 41 37 36
Chat text, bubbles
neutral-900
#1c1917 · RGB 28 25 23
Headings and main text
neutral-950
#0c0a09 · RGB 12 10 9
High-contrast headings, black button
App dark mode values
| Token | Light | Dark, text | Dark, background |
|---|---|---|---|
| neutral-50 | #fafaf9 | #1c1c1c | #1c1c1c |
| neutral-100 | #f5f5f4 | #2e2e2e | #2e2e2e |
| neutral-200 | #e7e5e4 | #3a3a3a | #3a3a3a |
| neutral-300 | #d6d3d1 | #4a4a4a | #4a4a4a |
| neutral-400 | #a8a29e | #8f8f8f | #5a5a5a |
| neutral-500 | #78716c | #a3a3a3 | #6b6b6b |
| neutral-600 | #57534e | #bdbdbd | #4a4a4a |
| neutral-700 | #44403c | #d4d4d4 | #3a3a3a |
| neutral-800 | #292524 | #e5e5e5 | #2a2a2a |
| neutral-900 | #1c1917 | #f2f2f2 | #0f0f0f |
| neutral-950 | #0c0a09 | #fafafa | #0a0a0a |
| Dark surface | Value | Note |
|---|---|---|
| Page | #141414 | Text #f2f2f2; a very dark gray, never deep black |
| Shell (rail, bar) | #1a1a1a | data-theme-dark="shell" |
| Panels, cards, menus, composer | #262626 | White background rewritten, with variants from 95% to 60% |
| Border | #3a3a3a | |
| Prose text | #d4d4d4 · #f2f2f2 · #a3a3a3 | Body, headings, captions; rules #3a3a3a |
State colors
The four sets
Success success
success-50
#ecfdf5 · RGB 236 253 245
success-200
#a7f3d0 · RGB 167 243 208
success-500
#10b981 · RGB 16 185 129
success-700
#047857 · RGB 4 120 87
success-800
#065f46 · RGB 6 95 70
Warning warning
warning-50
#fffbeb · RGB 255 251 235
warning-200
#fde68a · RGB 253 230 138
warning-500
#f59e0b · RGB 245 158 11
warning-700
#b45309 · RGB 180 83 9
warning-800
#92400e · RGB 146 64 14
Error danger
danger-50
#fef2f2 · RGB 254 242 242
danger-200
#fecaca · RGB 254 202 202
danger-500
#ef4444 · RGB 239 68 68
danger-700
#b91c1c · RGB 185 28 28
danger-800
#991b1b · RGB 153 27 27
Info info
info-50
#f0f9ff · RGB 240 249 255
info-200
#bae6fd · RGB 186 230 253
info-500
#0ea5e9 · RGB 14 165 233
info-700
#0369a1 · RGB 3 105 161
info-800
#075985 · RGB 7 89 133
Usage
Success
Text success-800, background success-50, border success-200.
7.29:1 · AAA
Warning
Text warning-800, background warning-50, border warning-200.
6.84:1 · AA
Error
Text danger-800, background danger-50, border danger-200.
7.60:1 · AAA
Info
Text info-800, background info-50, border info-200.
7.09:1 · AAA
| Usage | Classes |
|---|---|
| Message (alert, banner) | rounded-xl border border-{role}-200 bg-{role}-50 px-4 py-3 text-{role}-800 |
| Text alone on white | text-{role}-700 |
| Status dot or icon | bg-{role}-500 or text-{role}-500 |
| Field error | border-danger-700, message text-sm text-danger-700 with role="alert" |
| Destructive button | bg-danger-700 text-white hover:bg-danger-800 |
| Module statuses | available success-500, limited access warning-500, preview neutral-400, planned neutral-300 |
| App dark mode | positive #6ee7b7, negative #fda4af |
Measured contrasts
White text on oranges (buttons)
| Preview | Pair | Ratio | Level | Usage |
|---|---|---|---|---|
| white #ffffff on ember-500 #ff8c42 | 2.31:1 | brand choice | Large button | |
| white #ffffff on ember-600 #f97316 | 2.80:1 | brand choice | Large button hover | |
| white #ffffff on ember-700 #ea580c | 3.56:1 | brand choice | Small button | |
| white #ffffff on ember-800 #c2410c | 5.18:1 | AA | Small button hover |
Orange used as text
| Preview | Pair | Ratio | Level | Usage |
|---|---|---|---|---|
| ember-800 #c2410c on white #ffffff | 5.18:1 | AA | Reference orange text | |
| ember-800 #c2410c on ember-50 #fff9f5 | 4.96:1 | AA | Orange chip | |
| ember-800 #c2410c on ember-100 #fff2e8 | 4.71:1 | AA | Highlighted plan | |
| ember-900 #9a3412 on white #ffffff | 7.31:1 | AAA | Orange text hover | |
| ember-700 #ea580c on white #ffffff | 3.56:1 | large text | Focus ring (indicator, 3:1 required) |
Neutrals
| Preview | Pair | Ratio | Level | Usage |
|---|---|---|---|---|
| neutral-900 #1c1917 on white #ffffff | 17.49:1 | AAA | Headings and main text | |
| neutral-800 #292524 on white #ffffff | 15.17:1 | AAA | Chat text | |
| neutral-800 #292524 on neutral-50 #fafaf9 | 14.52:1 | AAA | Chat frames | |
| neutral-700 #44403c on white #ffffff | 10.27:1 | AAA | Navigation links | |
| neutral-600 #57534e on white #ffffff | 7.63:1 | AAA | Secondary text | |
| neutral-600 #57534e on neutral-100 #f5f5f4 | 6.99:1 | AA | Resting segment | |
| neutral-500 #78716c on white #ffffff | 4.80:1 | AA | Captions, resting icons | |
| neutral-500 #78716c on neutral-50 #fafaf9 | 4.59:1 | AA | Captions on calm frame | |
| neutral-400 #a8a29e on white #ffffff | 2.52:1 | fail | Placeholder text only | |
| white #ffffff on neutral-900 #1c1917 | 17.49:1 | AAA | Black button |
State colors
| Preview | Pair | Ratio | Level | Usage |
|---|---|---|---|---|
| success-800 #065f46 on success-50 #ecfdf5 | 7.29:1 | AAA | Success message | |
| success-700 #047857 on white #ffffff | 5.48:1 | AA | Success text | |
| warning-800 #92400e on warning-50 #fffbeb | 6.84:1 | AA | Warning message | |
| warning-700 #b45309 on white #ffffff | 5.02:1 | AA | Warning text | |
| danger-800 #991b1b on danger-50 #fef2f2 | 7.60:1 | AAA | Error message | |
| danger-700 #b91c1c on white #ffffff | 6.47:1 | AA | Error text | |
| info-800 #075985 on info-50 #f0f9ff | 7.09:1 | AAA | Info message | |
| info-700 #0369a1 on white #ffffff | 5.93:1 | AA | Info text | |
| white #ffffff on danger-700 #b91c1c | 6.47:1 | AA | Destructive button |
App dark mode
| Preview | Pair | Ratio | Level | Usage |
|---|---|---|---|---|
| #f2f2f2 on #141414 | 16.46:1 | AAA | Text on the page | |
| #f2f2f2 on #262626 | 13.52:1 | AAA | Text on a panel | |
| #d4d4d4 on #262626 | 10.21:1 | AAA | Prose text | |
| #bdbdbd on #262626 | 8.06:1 | AAA | dark neutral-600 | |
| #a3a3a3 on #141414 | 7.30:1 | AAA | Dark neutral-500 on the page | |
| #a3a3a3 on #262626 | 6.00:1 | AA | Dark neutral-500 on a panel | |
| ember-500 #ff8c42 on #262626 | 6.54:1 | AA | Orange text on dark panel | |
| #6ee7b7 on #262626 | 9.93:1 | AAA | Dark success | |
| #fda4af on #262626 | 8.00:1 | AAA | Dark error |
Typography
Aa
Satoshi
Logo and headings
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 & ? ! €
Class
font-satoshi. Local files in woff2 (weights 500 and 700) and otf; weight 700 is preloaded. Weights used: Bold 700 and Medium 500.Aa
Inter
Interface and body text
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 & ? ! €
Class
font-sans, loaded bynext/fontin both products (variable--font-inter,display: swap). Weights used: Regular 400, Medium 500, Semibold 600.
| Family | Role | Class | Weights |
|---|---|---|---|
| Satoshi | Logo, headings | font-satoshi | 500, 700 |
| Inter | Interface, text | font-sans | 400, 500, 600 |
| Mono | Code | font-mono | 400, 500 |
Site scale
site-container.ts and tested. Each sample below uses the actual constant: resize the window to see the switch from phone to desktop.Page H1
Fund, create, prospect.
- Phone
- 40 px
- Desktop
- 56 px (md)
- Weight
- Satoshi 700
- Line height
- 1.04 then 1.02
- Tracking
- -0.02em
max-w-[900px]
Product, Solutions, Pricing H1
Fund, create, prospect.
- Phone
- 40 px
- Desktop
- 64 px
- Weight
- Satoshi 700
- Line height
- 1.04 then 1.02
- Tracking
- -0.02em
Section H2
Fund, create, prospect.
- Phone
- 32 px
- Desktop
- 44 px
- Weight
- Satoshi 700
- Line height
- 1.08
- Tracking
- -0.02em
H3 (cards, questions)
Fund, create, prospect.
- Phone
- 24 px
- Desktop
- 28 px
- Weight
- Satoshi 700
- Line height
- 1.2
- Tracking
- -0.02em
Module card title
Fund, create, prospect.
- Phone
- 20 px
- Desktop
- 20 px
- Weight
- Satoshi 700
Price (Pricing)
0 €
- Phone
- 56 px
- Desktop
- 56 px
- Weight
- Satoshi 700
- Line height
- 1
- Tracking
- -0.045em, tabular figures
Page header subtitle
Tell us what is blocking you, Ember takes care of it.
- Phone
- 17 px
- Desktop
- 20 px
- Weight
- 400
- Line height
- 1.5
- Tracking
- neutral-600
Inner page intro
An inner page starts with a short intro.
- Phone
- 17 px
- Desktop
- 20 px
- Weight
- 400
- Line height
- 1.6
- Tracking
- neutral-600, max-w-[720px]
FAQ question
How long does the live session last?
- Phone
- 18 px
- Desktop
- 18 px
- Weight
- Satoshi 500
- Line height
- 28 px
FAQ answer
One hour, and not a minute of theory.
- Phone
- 16 px
- Desktop
- 16 px
- Weight
- 400
- Line height
- 1.65
- Tracking
- neutral-600
Navigation link
Solutions
- Desktop
- 15 px
- Weight
- 500
- Tracking
- neutral-700
Mega menu entry
Fund Your Growth
A sourced financing file.
- Desktop
- title 15 px, text 13 px
- Weight
- Satoshi 500
- Line height
- 24 / 20 px
Eyebrow (menu, columns)
Resources
- Phone
- 11 px
- Desktop
- 11 px
- Weight
- 600, uppercase
- Line height
- 20 px
- Tracking
- +0.12em, neutral-500
Reference for all eyebrows
Button
Start for free
- Phone
- 16 px (inherited) or 15 px
- Weight
- 600
Footer link
FAQ
- Phone
- 15 px
- Weight
- 400
- Line height
- 24 px
- Tracking
- neutral-600
Legal notice
Terms of use
- Phone
- 12 px
- Weight
- 400
- Tracking
- neutral-500
The home H1 is 40 px, 56 px from md and 64 px from lg, centered from md, max-w-[900px]. Pages checked at 768 px keep the phone scale up to 1,024 px thanks to SITE_H1_TABLET_OVERRIDE and SITE_H2_TABLET_OVERRIDE.
Text formatting rules
- No orphan word:
h1toh4intext-wrap: balanceandhyphens: manual,pandliintext-wrap: pretty(#2573). Utility.text-balance, also available in the app. - Smoothing:
-webkit-font-smoothing: antialiasedin both apps. - Two-step headings (Solutions pages): the audience on its line, the promise below, non-breaking spaces before ":" and between the first two words.
- Markdown emphasis: italic; quotes add no quotation marks.
Interface scale
| Role | Size | Preview | Classes |
|---|---|---|---|
| Eyebrow, column label | 11 px | Resources | text-[11px] font-semibold uppercase tracking-[0.12em] text-neutral-500 |
| Caption, chip, small button | 12 px | Edited yesterday | text-xs |
| Dense text: table, email header, menu | 13 px | Subject: meeting | text-[13px] |
| Interface (default), button | 14 px | Save | text-sm |
| Messages, navigation and footer links | 15 px | Here is the plan proposed for your decision. | text-[15px] leading-relaxed |
| Body, fields on phones | 16 px | Write a one-pager | text-base |
| FAQ question | 18 px | How long does the live session last? | font-satoshi text-[18px] font-medium |
| Card, dialog, screen section title | 20 px | New file | font-satoshi text-xl font-bold |
| Screen title | 24 then 30 px | Second Brain | font-satoshi text-2xl font-bold md:text-[30px] |
| App home title | 30 px | What shall we build together? | font-satoshi text-3xl font-bold tracking-tight |
| Code | 13 px, line height 1.6 | const total = 12; | font-mono text-[13px] leading-[1.6] |
SITE_H1, SITE_H2, SITE_H3. Eyebrows: a single letter spacing, tracking-[0.12em]. Headings: tracking-[-0.02em]. Forbidden sizes: 8, 9, 10 px and half pixels.Spacing
1 = 4 px, 2 = 8 px, 4 = 16 px, 16 = 64 px.The scale
- p-14 px
- p-28 px
- p-312 px
- p-416 px
- p-624 px
- p-832 px
- p-1248 px
- p-1664 px
- p-28112 px
h-[18px] w-[18px].Gutters
SITE_CONTAINER = mx-auto w-full max-w-[1280px] px-4 sm:px-6 lg:px-12: 16 px on phones, 24 px on tablets, 48 px on desktop.Phone
< 640 px
Tablet
640 to 1,023 px
Desktop
≥ 1,024 px
Vertical rhythm of sections
SITE_SECTION_Y = 'py-16 md:py-28': 64 px on phones, 112 px from 768 px, for every public page section. Page header: pt-14 md:pt-20.Preview at scale: top and bottom margin of a section
Padding
Live preview, measured padding
Site card, phone: p-6
Site card, desktop: md:p-8
Pricing card: p-5 sm:p-6
App card: p-4
Alert: px-4 py-3
| Surface | Padding |
|---|---|
| Site: card | p-6 md:p-8 |
| Site: pricing card | p-5 sm:p-6 |
| Site: choice card | p-5 |
| Site: mega menu column | p-6 |
| App: card | p-4 (p-3 for a dense card) |
| App: alert | px-4 py-3 |
| App: composer | row px-2.5 py-2 gap-1.5; frame px-4 md:px-8 pt-3 |
App screen
| Element | Value |
|---|---|
| Screen margins | px-4 md:px-8 |
| Gap between blocks | space-y-6 (24 px) |
| Inside a card | p-4 (16 px) |
| Page title | font-satoshi text-2xl font-bold md:text-[30px] |
| Section title | font-satoshi text-xl font-bold |
Grid and breakpoints
Breakpoints
To scale
| Threshold | Usage |
|---|---|
xs | Small phones (app) |
sm | 24 px gutter, page header buttons at their natural size |
md | One column becomes two, 44 px section titles |
lg | Desktop threshold: full header menu, expanded app rail, compact targets |
xl | Four-column pricing grid |
2xl | Large screens |
Mobile rule
| Subject | Phone (< 640) | Tablet (640 to 1,023) | Desktop (≥ 1,024) |
|---|---|---|---|
| Gutter | 16 px | 24 px | 48 px |
| H1 | 40 px | 40 px | 56 to 64 px |
| H2 | 32 px | 32 px | 40 to 44 px |
| H3 | 24 px | 24 px | 28 px |
| Rhythm between sections | 64 px | 64 px | 112 px |
| Page header primary button | full width (w-full sm:w-auto) | at its natural size | at its natural size |
| Touch targets | 44 px | 44 px | at least 40 px |
- Full header menu from 1,024 px; below that, a full-screen mobile menu.
- Card grids in one column below 768 px; no cropped image.
Containers and reading widths
Site container, 1,280 px at most
| Where | Value |
|---|---|
| Site content | SITE_CONTAINER: 1,184 px usable |
| Full-width sections beyond 1,920 px | SITE_CONTAINER_WIDE: max-w-[1440px] |
| Long text, intros, answers | max-w-[680px] |
| Headings | max-w-[900px] |
| Conversation thread and composer (app) | max-w-3xl |
| Bubbles (app) | 85% (user), 92% (assistant) |
| Pricing grid | md:grid-cols-2 xl:grid-cols-4 |
| Footer | md:grid grid-cols-4 gap-8 |
Radii
rounded
4 px
Inline code
rounded-lg
8 px
Small controls, menu entries, burger button
rounded-xl
12 px
Buttons, fields, app cards, icon badges
rounded-2xl
16 px
Dialogs, floating menus, empty states
rounded-3xl
24 px
Site cards, composer, panels
rounded-full
full
Chips, round icon buttons, segmented controls
rounded-[calc(1.5rem-1px)]. Every rectangular button is rounded-xl; rounded-full is reserved for round icon buttons, chips and segmented controls.Shadows and elevations
The levels
- 0
Flat
none
Buttons, cards, chips, segmented controls, cookie banner
- 1
shadow-menu
0 8px 24px rgba(0,0,0,0.06)
Menus, popovers, toasts
- 2
shadow-modal
0 18px 48px rgba(41,37,36,0.08)
Dialogs, mobile sheets, viewers
- 3
shadow-footer
0 20px 60px rgba(88,48,20,0.12)
Site footer card
Tokens
The active thumb of a segmented control is border border-neutral-200 bg-white, without shadow. Active dictation carries ring-4 ring-danger-500/20.
Borders
Card
border border-neutral-200
1 px neutral-200; hover ember-500 (site) or neutral-300 (app)
Field
border border-neutral-200
1 px neutral-200; focus ember-700
Secondary button
border border-neutral-300
1 px neutral-300
Empty state
border-dashed border-neutral-300
1 px dashes
Underlined tab
border-b-2 border-ember-500
Active: 2 px ember-500
Selection
border-2 border-ember-500
Highlighted plan: 2 px ember-500
Site header: transparent bottom border, then neutral-200 after 24 px of scrolling. Dark mode: the light border becomes #3a3a3a. No pale orange border.
Icons
lucide-react, with a stroke of 2, using the h-* w-*syntax. Brand icons (LinkedIn, X, YouTube) are dedicated components.Most used
- Loader2
- X
- Check
- Sparkles
- FileText
- ArrowRight
- ChevronDown
- Plus
- Minus
- ArrowUp
- ArrowDown
- Square
- Search
- Globe
- Menu
- Sun
- Moon
- CheckCircle2
Sizes
Live preview, real sizes
| Size | Classes | Usage |
|---|---|---|
| 12 px | h-3 w-3 | Chip icons, attachment spinner |
| 14 px | h-3.5 w-3.5 | In 12 px text, language chevron |
| 16 px | h-4 w-4 | Default size: buttons, menus, composer |
| 18 px | h-[18px] w-[18px] | App rail, pricing features |
| 20 px | h-5 w-5 | 44 px icon buttons, burger, close, social, card icon |
Stroke
Live preview, stroke of 2
The stroke is lucide's default: 2. No explicit strokeWidth.
Icon badge
Live preview
h-11 w-11 rounded-xl bg-ember-50 text-ember-800 + 20 px icon
h-9 w-9 rounded-lg bg-neutral-50 text-ember-800 + 16 px icon
Motion
Replayable demos
Durations
Same distance, same curve: only the duration changes.
Cascade
40 ms step, 240 ms ceiling, 6 px rise over 280 ms (motion-fade-up).
Hover and press of a filled button
On hover: 2 px lift and 1.02 scale-up over 280 ms. On press: 0.98 over 150 ms. Never a shadow. Move the pointer over it or press.
--motion-lift-y: -2px · --motion-lift-scale: 1.02 · --motion-press-scale: 0.98
Tokens
Tailwind classes
duration-fast duration-base ease-motion motion-reduce:transition-noneMotion templates
| Template | Effect |
|---|---|
.transition-interactive | Color, background, border, transform, opacity, filter at --motion-fast |
.hover-lift | Filled buttons: on hover with a real pointer, translateY(-2px) scale(1.02) over 280 ms; on press scale(0.98) over 150 ms; never a shadow; excluded when disabled |
.motion-fade-up | Entrance with a 6 px rise |
.motion-reveal-word | Word by word: 8 px and 6 px blur |
.motion-dialog-in | Dialog: scale 0.97 |
.motion-sheet-in | Mobile sheet: 12 px |
.motion-pop-in | Menu: 150 ms |
.motion-backdrop-in | Backdrop |
.motion-brand-in | Logo entrance: 360 ms |
.motion-delayed-in | Fade after 300 ms: discreet loading |
.motion-curtain | Height expansion, from 0fr to 1fr |
| Site | rotating chevron, sliding menu underline, grid-rows accordions, segmented thumb: all at 280 ms; mega menu: opens after 120 ms, closes after 200 ms |
CTA highlight
| Element | Value |
|---|---|
| Class | ember-primary-cta-highlight |
| Shine | 42% band, white gradient at 100° (peak 68%), skewX(-18°). Crosses between 4% and 20% of a 4 s ease-in-out loop, max opacity 0.88 |
| Halo | inset 0 0 13px rgb(255 255 255 / 48%), opacity from 0.18 to 0.52 over 2.5 s |
| Disabled | Animation off |
| Reduced motion | Shine frozen (width 100%, opacity 0.12), halo at 0.24 |
| Buttons concerned | Only three: "Start for free" in the header, "Choose Pro" and "Build my team" |
Reduced motion
- All entrances are cut, transitions drop to 0.01 ms, no movement on hover or press. Incognito mode keeps a 200 ms fade, confetti is hidden, slides switch with a 120 ms fade.
motion-reduce:transition-nonein all transition classes; CTA shine frozen;motion-safe:animate-hero-rise.scroll-behavior: smoothonhtml.