Astrel Design System
Everything the app is built from, in one place: fundamentals, components, patterns and apps. Change something here and it changes in the app. Every example is the real component, on desktop and iPhone, in dark and light.
Fundamentals
The visual base for components and screens: color, themes, spacing, layout, type, icons, motion, content and accessibility.
All fundamentals
| Name | Description | Link |
|---|---|---|
| Accessibility | What the app does for contrast, keyboard, screen reader and motion, measured in the real app. The gaps are at the bottom, so nothing is hidden. | View |
| Border width | 1px is the default. 2px only when something must stand out. | View |
| Color | The app only uses these ramps. Every color is solid. Only the steps the app really uses are listed. Used: how often the color is used in the app styles, directly or through a theme token. | View |
| Content | How the app talks. Short sentences, plain words, and the same word for the same thing. These rules come from the texts in the app. | View |
| Effects | Small states: dimmed, hover and aspect ratio. | View |
| Fonts | The five choices from Settings. | View |
| Icons | An icon always sits in a square box. Large standalone icons (empty state, logo, document icon) have their own size. | View |
| Layers | Which element sits above which other element. There are five layers, one token per role. A new component picks the layer that fits its role, never a number. Inside one layer, the element added to the document later sits on top. | View |
| Layout | The breakpoint and the grid: columns, gutters and margins. | View |
| Motion | Fast for direct response (0.12 s), medium for opening and closing (0.2 s), slow only for loading. Motion is never decoration. | View |
| Radius | Every rounded corner in the app has the same radius. Only fully round shapes are different. | View |
| Shadow | Shadow shows how high something floats above the page. The higher, the larger the shadow. Whatever opens above the page always gets the default shadow. | View |
| Spacing | All distances are multiples of 4px. Also fixed container sizes. | View |
| Themes | Components only use these names. | View |
| Typography | Every text has a role. The role sets size, line height and weight, on desktop and on iPhone. | View |
Components
The building blocks for screens, with sizes and all states.
All components
| Name | Description | Link |
|---|---|---|
| Accordion | Headings that open and close their content. People read only what they need. | View |
| Badge | A small number or dot on the corner of an icon. It says that something is new or waits for you. | View |
| Breadcrumb | The path to the current document, in the top bar. | View |
| Button | Text buttons, icon buttons and options with icon and text, with all states. | View |
| Checkbox | Box with a check. The same box as the checklist in the editor. | View |
| Content switcher | Text only, no icons. | View |
| File uploader | A zone to drag a file into, or to choose one. | View |
| Input field | Field with all states. | View |
| Input group | A field with text or a button fixed to its side. The text or button belongs to the value. | View |
| Link | Text that goes somewhere or does something, and the arrow link above a page. | View |
| List item | A choice in a list: slash menu, mentions, move, items, search results, blocks and icons. | View |
| Menu | Rows with icon, divider and danger. | View |
| Modal | A window on top of the document for one task or one piece of information. | View |
| Notification | Success, error and info. | View |
| Progress bar | Thin bar at the top while something loads. | View |
| Radio | One choice out of a few. Use radios when people should see all choices at once. | View |
| Search | Search field with all states. Only the field: the results belong to the Search pattern. | View |
| Select | Select field with all states. | View |
| Skeleton | Gray bars while a page loads. | View |
| Spinner | A turning circle for a short wait. | View |
| Structured list | Rows for settings, the log, the trash and the history of a document. | View |
| Tabs | Switch between views of the same page. | View |
| Tag | A small label that shows while you drag a block. | View |
| Textarea | Field for text over several lines. | View |
| Toggle | A switch with a knob that turns one setting on or off. | View |
| Tooltip | A short text next to an element, on hover and focus. | View |
| Tree view | Branch and leaf nodes in a tree, with arrow, icon and more button. | View |
Breadcrumb
The path to the current document, in the top bar. It only shows from the second level, without icons.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Path
text --fs-body 16px, space between items --sp-2 8px, separator /
| Fill | Text | |
|---|---|---|
| Parent | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Parent hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Current document | none | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Separator | none | --gray-50 #A8A8A6--gray-70 #5E5E5C |
Textarea
Field for text over several lines. The user can make it taller.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Field
width 100%, at least --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-60 #838381 |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-10 #F7F7F5--gray-100 #202020 | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Progress bar
Thin bar at the top of the screen while something loads. It only shows when loading takes longer than 0.2 seconds.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Bar
--bw-2 2px high, full width, at the top of the window
| Fill | |
|---|---|
| Hidden | none |
| Loading | --accent |
Spinner
A turning circle for a short wait, for example while a cover uploads.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Circle
--btn-s wide and high, line --bw-2 2px, one turn every --dur-4
| Line | Top | |
|---|---|---|
| Turning | --gray-60 #838381 | --gray-0 #FFFFFF |
Skeleton
Gray bars with a light streak that stand in for text while a page loads. Hidden for screen readers.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Line
--sp-4 16px high, radius --r 6px, streak every --dur-5
| Fill | |
|---|---|
| Loading | --bg3 with a light streak --hover |
Tabs
Switch between views of the same page. One tab is active. The arrow keys, Home and End move between tabs.
Anatomy
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Tab
--btn-l 44px high, text --fs-body 16px, space inside --sp-5 24px to the sides, line under the active tab --bw-2 2px
| Text | Line under | |
|---|---|---|
| Default | --muted | none |
| Hover | --text | none |
| Active | --text | --accent |
| Focus | --muted | none |
| Inactive | --off-fg | none |
Tooltip
A short text next to an element, on hover and on keyboard focus. Not on a touch screen. Esc closes it. Never put an action or a link in it.
Anatomy
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Bubble
at most --sz-4 220px wide, text --fs-small, space inside --sp-1 4px and --sp-2 8px, radius --r 6px, 8px from the element, shows after 400ms
| Fill | Text | |
|---|---|---|
| Shown | --text | --bg |
File uploader
A zone to drag a file into, or to choose one with a button. It shows busy, done and error.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Zone
full width, space inside --sp-6 32px and --sp-5 24px, radius --r 6px, line --bw-1 1px
| Fill | Border | Icon | |
|---|---|---|---|
| Default | --bg2 | --line-strong dashed | --muted |
| Drag over | --accent-soft | --accent dashed | --muted |
| Busy | --bg2 | --line-strong solid | spinner |
| Done | --bg2 | --line-strong solid | --accent |
| Error | --bg2 | --danger | --danger |
Patterns
Reusable solutions for common screens, built from components.
All patterns
| Name | Description | Link |
|---|---|---|
| Carousel | A row of images or GIFs to scroll through. | View |
| Empty states | What you see when there is nothing yet. | View |
| Forms | Label, field, message and main button at the bottom. A field is at most --sz-7 380px wide. | View |
| Loading | What the app shows while it loads. | View |
| Login | Logo, title, explanation, fields and main button. | View |
| Settings | Built from rows, select fields and buttons. | View |
| States | What a screen or control looks like when it is empty, loading, inactive, locked or broken. The same state looks the same everywhere. | View |
Apps
What only one app needs. Every app is built from the same tokens, colors, atoms and components.
Astrel
| Name | Description | Link |
|---|---|---|
| Editor blocks | Headings, lists, quote, card, columns, table, file and table of contents. | View |
| Find | Search field and buttons to step through results. | View |
| Kanban board | Columns with cards to move around. | View |
| Logo | The Astrel planet: where it is used, how large it is and what color it has. | View |
| New page | Add cover and icon, title, toolbar and empty editor. | View |
| Sticky note | A colored note inside a page, with buttons to duplicate and delete it. | View |
| Text toolbar | Text styles at the selection, in a panel and above the keyboard. | View |
| Trash | Row with two small buttons. | View |
| Sidebar | Search, pages, Trash and Settings. On iPhone it slides in as a drawer. | View |
| Dialogs | Windows for a task: history, export, move and choose an icon. | View |
| Global header | The top bar on desktop and on iPhone. | View |
| Search | Results and empty state. | View |
| Page layout | A sidebar and one column of text. Where the edges are and how wide the text gets. | View |
Tag
A small label that shows while you drag a block.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Tag
| Fill | Text | Border | |
|---|---|---|---|
| Chip above the block | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | none |
| On the dragged copy | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | none |
List item
A choice in a list: slash menu, mentions, move, items, search results, blocks and icons.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Slash item
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Mention item
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Move item
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Document link
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Search result
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Block item
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Selected | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
Icon cell
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Selected | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-50 #5996F8 | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Link
Text that goes somewhere or does something, and the arrow link above a page.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Link
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Back link
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Link in text
Sizes and states
Per component: what changes per state. Bold differs from Default.
Document link in text
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Document is gone | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
File link in text
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Structured list
Rows for settings, the log, the trash and the history of a document.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Setting row
| Fill | Text | Border | |
|---|---|---|---|
| With text and button | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Title and button | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Log | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Link row
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Item row
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Version row
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| With preview | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Search
Search field with all states. Only the field: the results belong to the Search pattern.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Search
| Fill | Text | Border | |
|---|---|---|---|
| Enabled | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 |
| Focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --blue-70 #0D59D3--blue-50 #5996F8 |
| Filled | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Button
Text buttons, icon buttons and options with icon and text, with all states.
Do and don’t
Text button
A button names the action and never has an icon. Variants: primary, secondary, tertiary, ghost and danger. Sizes: large (L, --btn-l), medium (M, --btn-m) and small (S, --btn-s). States: default, hover, focus, pressed, inactive.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Primary
--btn-w 104px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | Effect | |
|---|---|---|---|---|---|
| Default | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | none |
| Hover | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | brightness(1.06) |
| Focus | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 | none |
| Pressed | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none | none |
Secondary (default)
width to content, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Tertiary
--btn-w 104px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Hover | --blue-30 #B6D1FC--blue-90 #113369 | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Focus | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Ghost
--btn-w 104px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Danger
--btn-w 104px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --red-70 #D3170D--red-50 #F86159 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --red-70 #D3170D--red-50 #F86159 | none | none |
| Focus | none | --red-70 #D3170D--red-50 #F86159 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Hover and focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --red-70 #D3170D--red-50 #F86159 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Large (L)
--btn-w 104px wide, --btn-l 44px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Medium (M)
--btn-w 104px wide, --btn-m 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Small (S)
width to content, --btn-s 28px high, text --fs-small 14px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Primary
--btn-w 104px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | Effect | |
|---|---|---|---|---|---|
| Default | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | none |
| Hover | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | brightness(1.06) |
| Focus | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 | none |
| Pressed | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 | --blue-70 #0D59D3--blue-50 #5996F8 | none | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none | none |
Secondary (default)
width to content, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Tertiary
--btn-w 104px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Hover | --blue-30 #B6D1FC--blue-90 #113369 | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Focus | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --blue-20 #D8E6FD--blue-100 #0F213D | --blue-70 #0D59D3--blue-30 #B6D1FC | none | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Ghost
--btn-w 104px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Danger
--btn-w 104px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --red-70 #D3170D--red-50 #F86159 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --red-70 #D3170D--red-50 #F86159 | none | none |
| Focus | none | --red-70 #D3170D--red-50 #F86159 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Hover and focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --red-70 #D3170D--red-50 #F86159 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Large (L)
--btn-w 104px wide, --btn-l 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Medium (M)
--btn-w 104px wide, --btn-m 36px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Small (S)
width to content, --btn-s 28px high, text --fs-small 14px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
Icon button
Only an icon, always with title and label. Square at the height of a button.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Icon button (default)
36px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Block button
24px wide, 24px high, text --fs-small 14px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Toolbar button
34px wide, 34px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Back
36px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Close
36px wide, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Icon button (default)
44px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Block button
24px wide, 24px high, text --fs-small 14px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Toolbar button
34px wide, 34px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Back
44px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Close
44px wide, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Options with icon and text
A list of actions where every item has an icon.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Chip
width to content, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | none |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-0 #FFFFFF | none | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | none |
| Inactive | --gray-0 #FFFFFF--gray-110 #191919 | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Object bar
width to content, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Chip
width to content, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | none |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-0 #FFFFFF | none | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | none |
| Inactive | --gray-0 #FFFFFF--gray-110 #191919 | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Object bar
width to content, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Pressed | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Buttons in the app
The smaller buttons for the editor, the sidebar and the find bar.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Cover button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | none |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-0 #FFFFFF | none | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-0 #FFFFFF | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Image add button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Image control
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Carousel dot
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
| Current | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
Object bar button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Table button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Table edge button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Table menu button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Sidebar bottom button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Fold button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
App name
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
New document button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Find button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Hover | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | none |
| Focus | rgb(107, 107, 107) | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-0 #FFFFFF | --blue-70 #0D59D3--blue-50 #5996F8 |
Lightbox close
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-0 #FFFFFF | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-0 #FFFFFF | none | none |
| Focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-0 #FFFFFF | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Color swatch
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --red-70 #D3170D--red-50 #F86159 | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-0 #FFFFFF--gray-110 #191919 | --red-70 #D3170D--red-50 #F86159 | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --red-70 #D3170D--red-50 #F86159 | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
Format button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Hover | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Focus | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B | --blue-70 #0D59D3--blue-50 #5996F8 |
Document icon button
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Checkbox
Box with a check. The same box as the checklist in the editor.
Sizes and states
The size and what changes per state. Bold differs from Default. The box has the same size on desktop and iPhone.
Checkbox
--ic-2 20px wide and high, border --bw-1 1px, radius --r 6px, check --ic-1 16px
| Fill | Border | |
|---|---|---|
| Default | none | --gray-60 #838381 |
| Hover | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Focus | none | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px |
| Checked | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Read-only | none | --gray-40 #D0D0CE--gray-80 #3A3A3A |
| Read-only, checked | none | --gray-40 #D0D0CE--gray-80 #3A3A3A |
Checkbox
--ic-2 20px wide and high, border --bw-1 1px, radius --r 6px, check --ic-1 16px
| Fill | Border | |
|---|---|---|
| Default | none | --gray-60 #838381 |
| Hover | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Focus | none | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px |
| Checked | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Read-only | none | --gray-40 #D0D0CE--gray-80 #3A3A3A |
| Read-only, checked | none | --gray-40 #D0D0CE--gray-80 #3A3A3A |
Content switcher
Text only, no icons.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Not selected
width to content, 38px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Pressed | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Selected
width to content, 38px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Pressed | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Not selected
width to content, 46px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Pressed | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Selected
width to content, 46px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Pressed | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Modal
A window on top of the document for one task or one piece of information. An overlay covers the document behind the window.
Anatomy
Passive
Shows information. No main action, only a close button.
Transactional
Needs an action to finish. Cancel and a main action.
Danger
Transactional with a red main button, for actions that delete or cannot be undone.
Sizes
Measures
Space inside the window. Blue is the space between parts.
Do and don’t
Behavior
Lightbox
Sizes and states
Per component: what changes per state. Bold differs from Default.
Lightbox
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-0 #FFFFFF--gray-110 #191919 | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Notification
Toasts that go away by themselves, and inline notifications that stay in the document. Success, error, warning and info. See also Notifications.
Toast anatomy
Inline notification anatomy
Inline notification
Sizes and states
Per component: what changes per state. Bold differs from Default.
Inline notification
| Fill | Text | Border | |
|---|---|---|---|
| Error | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --red-70 #D3170D--red-50 #F86159 |
| Warning | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --orange-70 #D3630D--orange-50 #F89E59 |
| Success | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --green-70 #158449--green-50 #31D87F |
| Info | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
Select
Select field with all states.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Select field
width to content, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Select field
width to content, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Hover | --gray-20 #EFEFED--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | none |
| Focus | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | none | none |
Input field
Field with all states.
Anatomy
Validation
Label, field and a message under it. The message has an icon and words, so it does not depend on color. The field gets a colored border too.
Rules
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Field
width to content, --btn-h 36px high, text --fs-body 16px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-60 #838381 |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-10 #F7F7F5--gray-100 #202020 | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Invalid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --red-70 #D3170D--red-50 #F86159 |
| Warning | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --orange-70 #D3630D--orange-50 #F89E59 |
| Valid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --green-70 #158449--green-50 #31D87F |
| Read-only | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Password field
width to content, --btn-h 36px high, the button --btn-h 36px wide
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Inactive | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Show password button
icon --ic-1
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Helper text
text --fs-small 14px, space above --sp-2 8px
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
| Error | none | --red-70 #D3170D--red-50 #F86159 | none |
Field
width to content, --btn-h 44px high, text --fs-body 17px, radius --r 6px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-60 #838381 |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-10 #F7F7F5--gray-100 #202020 | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Invalid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --red-70 #D3170D--red-50 #F86159 |
| Warning | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --orange-70 #D3630D--orange-50 #F89E59 |
| Valid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --green-70 #158449--green-50 #31D87F |
| Read-only | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Password field
width to content, --btn-h 44px high, the button --btn-h 44px wide
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Inactive | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Show password button
icon --ic-1
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Focus | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Helper text
text --fs-small 14px, space above --sp-2 8px
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
| Error | none | --red-70 #D3170D--red-50 #F86159 | none |
Radio
One choice out of a few. Use radios when people should see all choices at once.
Rules
Sizes and states
The size and what changes per state. Bold differs from Default. The size is the same on desktop and iPhone.
Radio
--ic-2 20px wide and high, border --bw-2 2px, round. The dot is half of the inside.
| Fill | Border | Dot | |
|---|---|---|---|
| Default | none | --gray-60 #838381 | none |
| Hover | none | --blue-70 #0D59D3--blue-50 #5996F8 | none |
| Focus | none | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px | none |
| Selected | none | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive, selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C |
| Read-only | none | --gray-40 #D0D0CE--gray-80 #3A3A3A | none |
| Read-only, selected | none | --gray-40 #D0D0CE--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Radio group
legend --fw-bold, between the choices --sp-3 12px, between the box and the words --sp-3 12px
| Text | |
|---|---|
| Legend | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Choice | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Choice, inactive | --gray-50 #A8A8A6--gray-70 #5E5E5C |
Radio
--ic-2 20px wide and high, border --bw-2 2px, round. The dot is half of the inside.
| Fill | Border | Dot | |
|---|---|---|---|
| Default | none | --gray-60 #838381 | none |
| Hover | none | --blue-70 #0D59D3--blue-50 #5996F8 | none |
| Focus | none | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px | none |
| Selected | none | --blue-70 #0D59D3--blue-50 #5996F8 | --blue-70 #0D59D3--blue-50 #5996F8 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B | none |
| Inactive, selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-30 #E0E0DE--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C |
| Read-only | none | --gray-40 #D0D0CE--gray-80 #3A3A3A | none |
| Read-only, selected | none | --gray-40 #D0D0CE--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Radio group
legend --fw-bold, between the choices --sp-3 12px, between the box and the words --sp-3 12px
| Text | |
|---|---|
| Legend | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Choice | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Choice, inactive | --gray-50 #A8A8A6--gray-70 #5E5E5C |
Badge
A small number or dot on the corner of an icon. It says that something is new or waits for you.
Rules
--danger) is only for things that need action now.Sizes and states
The size and what changes per state. Bold differs from Default. The size is the same on desktop and iPhone.
Badge
at least --ic-1 16px high and wide, padding --sp-1 4px, round, text --fsc-xs bold. On an icon: top right, with a ring of the document color --bw-2 2px
| Fill | Text | |
|---|---|---|
| Count | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 |
| Danger | --red-70 #D3170D--red-50 #F86159 | --gray-0 #FFFFFF--gray-110 #191919 |
Dot
--sp-2 8px wide and high, round
| Fill | |
|---|---|
| Default | --blue-70 #0D59D3--blue-50 #5996F8 |
| Danger | --red-70 #D3170D--red-50 #F86159 |
Badge
at least --ic-1 16px high and wide, padding --sp-1 4px, round, text --fsc-xs bold. On an icon: top right, with a ring of the document color --bw-2 2px
| Fill | Text | |
|---|---|---|
| Count | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 |
| Danger | --red-70 #D3170D--red-50 #F86159 | --gray-0 #FFFFFF--gray-110 #191919 |
Dot
--sp-2 8px wide and high, round
| Fill | |
|---|---|
| Default | --blue-70 #0D59D3--blue-50 #5996F8 |
| Danger | --red-70 #D3170D--red-50 #F86159 |
Accordion
Headings that open and close their content. People read only what they need.
Rules
--btn-l 44px high.Sizes and states
The size and what changes per state. Bold differs from Default. The size is the same on desktop and iPhone.
Heading
at least --btn-l 44px high, padding --sp-2 8px and --sp-3 12px, chevron --ic-1 16px turns 90 degrees in --dur-1
| Fill | Text | Chevron | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | none + outline --blue-70 #0D59D3 2px insidenone + outline --blue-50 #5996F8 2px inside | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
Content
left aligned with the heading text, padding --sp-4 16px at the bottom. A line --bw-1 1px --gray-90 between the headings
| Text | |
|---|---|
| Default | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Heading
at least --btn-l 44px high, padding --sp-2 8px and --sp-3 12px, chevron --ic-1 16px turns 90 degrees in --dur-1
| Fill | Text | Chevron | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | none + outline --blue-70 #0D59D3 2px insidenone + outline --blue-50 #5996F8 2px inside | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Inactive | none | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
Content
left aligned with the heading text, padding --sp-4 16px at the bottom. A line --bw-1 1px --gray-90 between the headings
| Text | |
|---|---|
| Default | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Input group
A field with text or a button fixed to its side. The text or button belongs to the value.
Rules
Sizes and states
The size and what changes per state. Bold differs from Default. The size is the same on desktop and iPhone.
Input group
as high as a field, text --fs-body, radius --r 6px, text or button padding --sp-3 12px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-60 #838381 |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
| Invalid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --red-70 #D3170D--red-50 #F86159 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Text or button part
| Fill | Text | Border | |
|---|---|---|---|
| Text | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 one line to the field |
| Button | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 one line to the field |
Input group
as high as a field, text --fs-body, radius --r 6px, text or button padding --sp-3 12px
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-60 #838381 |
| Hover | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --blue-70 #0D59D3--blue-50 #5996F8 |
| Invalid | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --red-70 #D3170D--red-50 #F86159 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C | --gray-30 #E0E0DE--gray-90 #2B2B2B |
Text or button part
| Fill | Text | Border | |
|---|---|---|---|
| Text | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 one line to the field |
| Button | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-60 #838381 one line to the field |
Status indicators
A status shows the state of one thing: saved or not, working or broken. Icon, words and color always go together.
Kinds and colors
Each kind has its own icon shape. That is how the kind is clear without color.
| Kind | Icon | Color | Use for |
|---|---|---|---|
| Success | circle-check | --success #158449--success #31D87F | Something worked or is done. |
| Error | circle-xmark | --danger #D3170D--danger #F86159 | Something failed and needs action. |
| Warning | triangle-exclamation | --warning #D3630D--warning #F89E59 | Something may go wrong. Look at it soon. |
| Info | circle-info | --info #0D59D3--info #5996F8 | Good to know. No action needed. |
| Pending | clock | --muted #5E5E5C--muted #A8A8A6 | Something is busy or waiting. |
| Neutral | circle | --muted #5E5E5C--muted #A8A8A6 | Not started, a draft or not known. |
Rules
Sizes and states
The size and the colors per kind. Bold differs from Success.
Status
icon --ic-1 16px, text --fs-body, between icon and text --sp-2 8px
| Icon | Text | |
|---|---|---|
| Success | --green-70 #158449--green-50 #31D87F | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Error | --red-70 #D3170D--red-50 #F86159 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Warning | --orange-70 #D3630D--orange-50 #F89E59 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Info | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Pending | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Neutral | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Status
icon --ic-1 16px, text --fs-body, between icon and text --sp-2 8px
| Icon | Text | |
|---|---|---|
| Success | --green-70 #158449--green-50 #31D87F | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Error | --red-70 #D3170D--red-50 #F86159 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Warning | --orange-70 #D3630D--orange-50 #F89E59 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Info | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Pending | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Neutral | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-80 #3A3A3A--gray-40 #D0D0CE |
Overflow content
What happens when text is longer than the space it has.
Rules
Common actions
The actions people use most. Each one has one icon and one word, everywhere.
Actions
| Action | Icon | Word | Where |
|---|---|---|---|
| Add | plus | Add …, New document | Sidebar, blocks, cover |
| Delete | trash-can | Delete | Document menu, blocks, rows, columns, tables, cover. Red. |
| Duplicate | clone | Duplicate | Document menu, block menu |
| Move | arrow-up | Up, Down | Document menu, block menu |
| Change icon | icons | Change icon | Document menu |
| History | clock-rotate-left | History | Document menu |
| Export | file-export | Export | Document menu. Saves a file. |
| Find | magnifying-glass | Find | Document menu |
| Lock | lock | Lock now | Document menu |
| Remove lock | lock-open | Remove password | Lock menu |
| Password | key | Set password, Change password | Lock menu |
| More | ellipsis | More options | Top bar. Opens the document menu. |
| Close | xmark | Close | Windows, sidebar |
| Back | chevron-left | Back | Settings, top bar |
| Settings | gear | Settings | Sidebar |
Rules
--danger), with the trash-can icon.Read-only states
A value that people can read and copy but not change. This is not the same as inactive.
Read-only or inactive
| Read-only | Inactive | |
|---|---|---|
| Looks | Normal text, no fill, a quiet border | Gray text and fill (--off-fg, --off-bg) |
| Focus | Yes, with the normal focus ring | No. Tab skips it. |
| Copy the text | Yes | No |
| Screen reader | Says: read only | Says: unavailable |
| Use when | People may look but not change: a shared link, a value from the system | The action is not possible now, but may be later |
Rules
Notifications
Tell people what happened, in the right place and in the right size.
| Kind | Use when | Stays | Example |
|---|---|---|---|
| Toast | The result of something the person did | 3 seconds, 6 for an error. A toast with progress stays until it is done. | Uploading: photo.png... |
| Inline notification | A message about this document or this part of a document, maybe with buttons | Until the person fixes it | Changed on another device |
| Helper text | One field | While the field has the problem | Use at least 10 characters. |
| Modal | A decision is needed before going on | Until answered | Delete this document? |
| Status | The state of one item | While it is true | Saved |
Rules
Disclosures
Content that opens and closes. The heading stays, the content shows or hides.
Kinds
| Kind | Use for | Where |
|---|---|---|
| Accordion | A few sections of text that people may skip | Not used in the app yet |
| Tree view | Documents inside documents | Sidebar |
| Group | Navigation groups | The menu of this Design System |
Rules
--dur-1. With reduced motion it does not move.Toggle
A switch with a knob that turns one setting on or off. The change works at once, without a save button.
Sizes and states
The size and what changes per state. Bold differs from Default. The toggle has the same size on desktop and iPhone.
Toggle
--sp-7 40px wide, --ic-3 24px high, round. Knob --ic-2 20px, slides --dur-1 from left to right.
| Track | Knob | |
|---|---|---|
| Off (default) | --gray-60 #838381 | --gray-0 #FFFFFF--gray-110 #191919 |
| Hover | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-0 #FFFFFF--gray-110 #191919 |
| Focus | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px | --gray-0 #FFFFFF--gray-110 #191919 |
| On | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 |
| On, hover | --blue-70 #0D59D3 + ring --blue-20 2px--blue-50 #5996F8 + ring --blue-100 2px | --gray-0 #FFFFFF--gray-110 #191919 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C |
| Read-only | --gray-40 #D0D0CE--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Read-only, on | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-0 #FFFFFF--gray-110 #191919 |
Toggle
--sp-7 40px wide, --ic-3 24px high, round. Knob --ic-2 20px, slides --dur-1 from left to right.
| Track | Knob | |
|---|---|---|
| Off (default) | --gray-60 #838381 | --gray-0 #FFFFFF--gray-110 #191919 |
| Hover | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-0 #FFFFFF--gray-110 #191919 |
| Focus | --gray-60 #838381 + outline --blue-70 2px--gray-60 #838381 + outline --blue-50 2px | --gray-0 #FFFFFF--gray-110 #191919 |
| On | --blue-70 #0D59D3--blue-50 #5996F8 | --gray-0 #FFFFFF--gray-110 #191919 |
| On, hover | --blue-70 #0D59D3 + ring --blue-20 2px--blue-50 #5996F8 + ring --blue-100 2px | --gray-0 #FFFFFF--gray-110 #191919 |
| Inactive | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-50 #A8A8A6--gray-70 #5E5E5C |
| Read-only | --gray-40 #D0D0CE--gray-80 #3A3A3A | --gray-80 #3A3A3A--gray-40 #D0D0CE |
| Read-only, on | --gray-70 #5E5E5C--gray-50 #A8A8A6 | --gray-0 #FFFFFF--gray-110 #191919 |
Tree view
Branch and leaf nodes in a tree, with arrow, icon and more button.
Tree nodes
Sizes and states
Per component: what changes per state. Bold differs from Default.
Leaf node
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Branch node, closed
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Branch node, open
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Favorite
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
| Selected | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-80 #3A3A3A--gray-40 #D0D0CE | none |
Link row
A row with icon and text, without arrow.
Sizes and states
Per component: what changes per state. Bold differs from Default.
Sidebar row
| Fill | Text | Border | Outline | |
|---|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Hover | --gray-20 #EFEFED--gray-90 #2B2B2B | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | none |
| Focus | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none | --blue-70 #0D59D3--blue-50 #5996F8 |
Carousel
A row of images or GIFs to scroll through.
Kanban board
Columns with cards to move around.
Dialogs
Windows for a task: history, export, move and choose an icon.
History
Empty state in a wide window.
Export
List of options and explanation.
Move
List of pages.
Choose icon
Search field and grid.
Editor blocks
Headings, lists, quote, card, columns, table, file and table of contents.
Empty states
What you see when there is nothing yet.
Overview
Welcome (no document yet)
Logo, title, text and main button, centred. --sp-4 between title and text, --sp-6 between logo and title, --sp-5 between text and button.
Trash empty
What you see when the trash is empty.
Empty lists
Sizes and states
Per component: what changes per state. Bold differs from Default.
Empty search
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
Empty suggestions
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
Empty history
| Fill | Text | Border | |
|---|---|---|---|
| Default | none | --gray-70 #5E5E5C--gray-50 #A8A8A6 | none |
Find
Search field and buttons to step through results.
Forms
Label, field, message and main button at the bottom. A field is at most --sz-7 380px wide.
Example
Measures
A field is at most 380px wide. Blue is the space between parts.
Do and don’t
Global header
The top bar on desktop and on iPhone.
Top bar
Menu, back and forward, breadcrumbs, favorite, more and save.
Top bar iPhone
The top bar on iPhone with menu, breadcrumbs, favorite and more.
Loading
What the app shows while it loads.
Login
Logo, title, explanation, fields and main button.
Overview
Parts
Components
Measurements
Login screen with logo
Locked
Logo, title, field and main button, centred with --sp-4 between, and --sp-5 above the main button. Same structure as Welcome and Set up.
New page
Add cover and icon, title, toolbar and empty editor.
Search
Results and empty state.
Settings
Built from rows, select fields and buttons.
Overview
None
Heading, rows with select field, rows with arrow and buttons in a row.
Devices
Row with a button.
Log
Download at the top, then rows.
Sidebar
Search, pages, Trash and Settings. On iPhone it slides in as a drawer.
None
Search, pages, Trash and Settings.
Sidebar as drawer
On iPhone the sidebar slides in from the left.
States
What a screen or control looks like when it is empty, loading, inactive, locked or broken. The same state looks the same everywhere.
Empty
An icon, then a short text that says what happens next. No button. Examples: Trash empty, Search without result and History.
Loading
Grey lines in the shape of the content, never a spinner in the document. The lines pulse slowly. With reduced motion they stand still.
Inactive
Fill --off-bg and text --off-fg. No hover and no focus. The cursor is the default arrow.
Read-only
The value can be read, selected and copied, but not changed. It keeps the normal text color. See Read-only states.
Locked
A locked document shows no content, only the lock screen. See Locked.
Error
Red text under the field in --danger, with words that say what to do. Not color alone. Errors that are not about one field appear as a toast, see Toasts.
Examples
Sticky note
A colored note inside a page, with buttons to duplicate and delete it.
Sizes and states
Per component: the size and what changes per state. Bold differs from Default.
Plain
width of the document or free (floating), padding --sp-4, radius --r. Notes have dark text (--gray-90) in both themes
| Fill | Text | Border | |
|---|---|---|---|
| Default | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-30 #E0E0DE--gray-90 #2B2B2B |
| Focus | --gray-10 #F7F7F5--gray-100 #202020 | --gray-80 #3A3A3A--gray-40 #D0D0CE | --gray-70 #5E5E5C--gray-50 #A8A8A6 |
Note yellow
| Fill | Text | Border | |
|---|---|---|---|
| Default | --yellow-30 #FCEDB6 | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
| Focus | --yellow-30 #FCEDB6 | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
Note pink
| Fill | Text | Border | |
|---|---|---|---|
| Default | --red-30 #FCB9B6 | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
| Focus | --red-30 #FCB9B6 | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
Note green
| Fill | Text | Border | |
|---|---|---|---|
| Default | --green-30 #A9EFCA | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
| Focus | --green-30 #A9EFCA | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
Note blue
| Fill | Text | Border | |
|---|---|---|---|
| Default | --blue-30 #B6D1FC | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
| Focus | --blue-30 #B6D1FC | --gray-90 #2B2B2B | --gray-30 #E0E0DE |
Text toolbar
Text styles at the selection, in a panel and above the keyboard.
Format bar at selection
Floating bar with text styles above selected text.
Format panel
Text style, block and color.
Toolbar above the keyboard
Six equal buttons and close.
Trash
Row with two small buttons.
Color
Every color runs from 0 (lightest) to 100 (darkest). Gray also has step 110, the background in dark. Every color is solid. The small number under a color is how often the app uses it.
Gray
Blue
Red
Orange
Yellow
Green
Transparency
Only these two may be see-through: the shadow under menus and windows (20% in light, 40% in dark), and the layer behind a window.
Contrast
How readable text is on its background. Ratio 7 or more is AAA, 4.5 or more is AA, 3 or more is only for large text. Ratios are calculated from the real colors.
Themes
Components only use these names.
| Name | Used for | Light | Dark |
|---|---|---|---|
| bg | Document | gray-0 | gray-110 |
| bg2 | Sidebar, cards | gray-10 | gray-100 |
| bg3 | Raised surface | gray-20 | gray-90 |
| text | Text | gray-80 | gray-40 |
| muted | Gray text, at least 4.5 : 1 contrast on every surface | gray-70 | gray-50 |
| line | Borders | gray-30 | gray-90 |
| hover | Hover | gray-20 | gray-90 |
| bg3-hover | Hover on a field with the bg3 background (select) | gray-30 | gray-80 |
| hover-pop | Hover in menus and windows | gray-20 | gray-80 |
| accent | Accent: fill, links, focus | blue-70 | blue-50 |
| danger | Error: text and danger button | red-70 | red-50 |
| accent-link | Accent as text: links and tertiary button | blue-70 | blue-30 |
| accent-text | Text on accent and on the danger button | gray-0 | gray-110 |
| field-line | Edge of a field | gray-60 | gray-60 |
| pop | Menu and popup | gray-0 | gray-90 |
| code-bg | Code background | gray-20 | gray-100 |
| inline-code | Code text | red-60 | red-60 |
| text-red | Text color red | red-50 | red-50 |
| text-orange | Text color orange | orange-70 | orange-70 |
| text-yellow | Text color yellow | yellow-70 | yellow-70 |
| text-green | Text color green | green-60 | green-60 |
| text-blue | Text color blue | blue-60 | blue-60 |
| text-gray | Text color gray | gray-60 | gray-60 |
| mark-yellow | Highlight yellow | yellow-30 | yellow-30 |
| mark-green | Highlight green | green-20 | green-20 |
| mark-blue | Highlight blue | blue-30 | blue-30 |
| mark-red | Highlight red | red-20 | red-20 |
| mark-gray | Highlight gray | gray-30 | gray-30 |
Radius
Every rounded corner in the app has the same radius. Only fully round shapes are different.
Measurements
Border width
1px is the default. 2px only when something must stand out.
Shadow
Shadow shows that something floats above the page. There are two: the default shadow for everything that opens or floats, and a larger one for what you drag.
Measurements
Shadows only use these two. The color is always --shade: 20% black in light, 40% black in dark.
Layers
Which element sits above which other element. There are five layers, one token per role. A new component picks the layer that fits its role, never a number. Inside one layer, the element added to the document later sits on top.
Effects
Small states: dimmed, hover and aspect ratio.
Spacing
All distances are multiples of 4px. Also fixed container sizes.
Measurements
Do and don’t
Space above elements in a document
Every element in a document has the same optical space above it as a heading 2: about 40px on desktop and 38px on iPhone, measured from the text above to the first line or edge of the element. This goes for headings 1 and 3, intro text, quote, lists, task list, divider, image, table, card, columns, carousel, table of contents and a line with only a document link or file. Only body text keeps its own space.
Spacing scale
Every step, from smallest to largest.
Container sizes
Fixed widths and minimum heights for surfaces that do not grow with their content: menus, windows and the document itself. Further down are sizes that scale with text or screen.
Fixed sizes
From small to large. The larger the step, the more it is a whole screen or window.
Relative to the text
Space in document content scales with the font size.
Relative to the screen
Height and width as a part of the screen. Dvh is the visible height on a phone.
Percentages
Shape of the loading animation.
Icons
An icon always sits in a square box. Large standalone icons (empty state, logo, document icon) have their own size.
Measurements
12px
16px
20px
24px
32px
Icon box sizes
Every icon sits in a square box. The box sets the position. In rows and buttons the glyph is as large as the text (14px on desktop, 17px on iPhone).
Motion
Fast for direct response (0.12 s), medium for opening and closing (0.2 s), slow only for loading. Motion is never decoration.
Time
Easing
Pressing and rotating
Loading bar
Fonts
The five choices from Settings.
Typography
Every text has a role. The role sets size, line height and weight, on desktop and on iPhone.
Desktop interface
Everything the app itself shows.
--fs-title 36px · line height --lh-title 44px · weight --fw-bold 600Page title and large heading on the login screen. 9x used
--fs-head 20px · line height --lh-head 26px · weight --fw-bold 600Window title, heading in Settings, heading in panel. 9x used
--fs-body 16px · line height --lh-body 24px · weight --fw-normal 400All text of the app itself: buttons, fields, rows, menus. 144x used
--fs-body 16px · line height --lh-body 24px · weight --fw-bold 600Emphasis: active row, button text, labels. 37x used
--fs-small 14px · line height --lh-small 21px · weight --fw-normal 400Explanation, labels above lists, meta and save status. 28x used
Desktop document content
Text you type in a document. Scales with the font size in Settings.
--fsc-h1 1.875 em · line height --lhc-2 1.3 · weight --fw-bold 600 · 30px at base --fs-page-d 16pxMain heading in a document. 1x used
--fsc-h2 1.5 em · line height --lhc-2 1.3 · weight --fw-bold 600 · 24px at base --fs-page-d 16pxSubheading in a document. 1x used
--fsc-h3 1.25 em · line height --lhc-3 1.4 · weight --fw-bold 600 · 20px at base --fs-page-d 16pxSmall heading in a document. 1x used
--fsc-q 1.25 em · line height --lhc-5 1.6 · weight --fw-normal 400 · 20px at base --fs-page-d 16pxQuote and intro text. 1x used
--fs-page-d 16px · line height --lhc-6 1.7 · weight --fw-normal 400Running text in a document. 14x used
iPhone interface
Everything the app itself shows.
--fs-title 28px · line height --lh-title 34px · weight --fw-bold 600Page title and large heading on the login screen. 9x used
--fs-head 20px · line height --lh-head 26px · weight --fw-bold 600Window title, heading in Settings, heading in panel. 9x used
--fs-body 17px · line height --lh-body 26px · weight --fw-normal 400All text of the app itself: buttons, fields, rows, menus. 141x used
--fs-body 17px · line height --lh-body 26px · weight --fw-bold 600Emphasis: active row, button text, labels. 47x used
--fs-body 17px · line height --lh-small 21px · weight --fw-normal 4004x used
--fs-small 14px · line height --lh-small 21px · weight --fw-normal 400Explanation, labels above lists, meta and save status. 29x used
iPhone document content
Text you type in a document. Scales with the font size in Settings.
--fsc-h1-m 1.6 em · line height --lhc-2 1.3 · weight --fw-bold 600 · 27px at base --fs-page-m 17pxMain heading in a document. 1x used
--fsc-h2-m 1.35 em · line height --lhc-2 1.3 · weight --fw-bold 600 · 23px at base --fs-page-m 17pxSubheading in a document. 1x used
--fsc-h3-m 1.15 em · line height --lhc-3 1.4 · weight --fw-bold 600 · 20px at base --fs-page-m 17pxSmall heading in a document. 1x used
--fsc-q-m 1.1 em · line height --lhc-5 1.6 · weight --fw-normal 400 · 19px at base --fs-page-m 17pxQuote and intro text. 1x used
--fs-page-m 17px · line height --lhc-5 1.6 · weight --fw-normal 400Running text in a document. 14x used
Weight
Text is normal or bold. Light is only for the document title in the Source Serif font.
Relative text sizes
For text in documents. Scales with the font size in Settings.
Line height in documents
Letter spacing
Base for document content
Layout
The breakpoint and the grid. Every app places its content on the same grid.
Breakpoint
Grid
Every screen is divided into columns with a space between them. Content takes whole columns. Resize the window to see the columns change.
| iPhone | Desktop | |
|---|---|---|
| Screen width | up to 820px | above 820px |
| Columns | --cols 4 | --cols 12 |
| Gutter | --gutter --sp-4 16px | --gutter --sp-5 24px |
| Margin | --margin --sp-4 16px | --margin --sp-6 32px |
Rules
Page layout
How Astrel places its screens: a sidebar and one column of text in the middle. The grid and the breakpoint are on the Layout page.
Measurements
Desktop
iPhone
Screens and windows
Width of the text column
Measured in the app, with the sidebar open on desktop.
| Screen width | Layout | Text column |
|---|---|---|
| 390px | iPhone | 358px |
| 600px | iPhone | 568px |
| 820px | iPhone | 788px |
| 821px | Desktop | 369px |
| 1000px | Desktop | 548px |
| 1280px | Desktop | 708px |
| 1600px and wider | Desktop | 708px |
Known gap
From 821px to about 1160px wide the 96px padding next to the sidebar makes the text column narrow: 369px at 821px. A smaller padding in this range would give the text more room.
Logo
The Astrel planet, drawn with one line. The color is always the main color of the theme. The logo is never stretched, never filled and never has a shadow.
Accessibility
What the app does for contrast, keyboard, screen reader and motion, measured in the real app. The gaps are at the bottom, so nothing is hidden.
Contrast
Contrast ratio of the color pairs, in dark and light. Normal text needs 4.5. The edge of a field needs 3. All colors come from the existing color scales.
| Pair | Dark | Light | Result |
|---|---|---|---|
| Text on the document | 11.4 | 11.4 | Passes |
| Secondary text (--muted) | 7.4 | 6.5 | Passes |
| Error text (--danger) | 5.7 | 5.4 | Passes |
| Accent as text, for example links (--accent-link) | 11.3 | 6.2 | Passes |
| Text on accent: primary button, checked checkbox | 6.0 | 6.2 | Passes |
| Text on the danger button | 5.7 | 5.4 | Passes |
| Edge of a field (--field-line) against the document | 4.6 | 3.8 | Passes (needs 3) |
| Accent text on grey fills (--bg2, --bg3) and on the tertiary button | 10.5, 9.1 and 10.4 | 5.8, 5.4 and 4.9 | Passes |
| Inactive text on inactive fill | 2.2 | 2.1 | Inactive controls are exempt |
Focus
Keyboard
Screen reader
Touch targets
Motion
Skip link
The link is the first thing a keyboard user reaches. It is the accent color, so it is easy to see.
Known gaps
Found while measuring. Decide which to fix next.
Content
How the app talks. Short sentences, plain words, and the same word for the same thing. These rules come from the texts in the app.
Voice
Words
Use one word for one thing, everywhere.
| Use | Do not use | Note |
|---|---|---|
| Document | Note, document | Everything you write is a document. A document can have items. |
| Trash | Bin, recycle bin | |
| Log in, log out | Sign in, sign out | Two words as a verb. Log out device, not Sign out device. |
| Delete | Erase | The thing is gone for good: document, row, column, block. |
| Remove | Delete | Take something off something else: a password, a link, a favorite. |
| Cancel | No, Back | The button that closes a window without doing anything. |
Buttons and menu items
Messages
Empty states
Numbers
Changelog
Version 1.13.0. The Design System and the app share one version number.
How the Design System and the app work together
1.13.0, 9 November 2026
A kanban board for pages.
1.12.1, 5 November 2026
Tile is removed, and the labels match the app.
1.12.0, 5 November 2026
A grid for every app, and examples built from the real components.
1.11.1, 5 November 2026
The anatomy and measures examples now match their numbers and captions.
1.11.0, 4 November 2026
Sidebar, Dialogs, Global header and Search moved to Apps, and the examples no longer name an app.
1.10.0, 4 November 2026
A new section for what only one app needs, and text and highlight colors that come from tokens.
1.9.0, 30 October 2026
One look for icon buttons, one corner radius, one space above every element, and undo and redo that also bring back deleted blocks.
1.8.2, 23 October 2026
The Design System shows more with pictures: measurements, anatomy, do and don’t and a searchable icon grid.
1.8.1, 22 October 2026
Tighter layout in the Design System, a lighter shadow and a rule that every window has body copy.
--sp-5 24px everywhere, as in a modal. Login was 16px, the welcome screen 32px.--sp-6 32px around the title, text and buttons.--accent-tint. On the welcome screen there is more space between the logo and the title, and between the text and the button.--sz-7 380px wide. In the examples of Input field, Search, Select, Input group and Accordion, the fields now fill the width in four equal columns on a large screen, two on a small one.--accent-tint: the lightest blue in light theme and the darkest blue in dark theme.--shadow is now 0 4px 12px, --shadow-drag is 0 8px 20px, and --shade is 20% black in light and 40% in dark. The example on the Shadow page now shows the real shadow.1.8.0, 21 October 2026
Four new components, validation, four kinds of inline notification and six new patterns, after a look at Carbon and Bootstrap.
--success, --warning and --info, for light and dark.1.7.9, 21 October 2026
Login in a window, colored toasts, a tooltip with an arrow and an icon overview.
1.7.8, 20 October 2026
Nine new components.
1.7.7, 20 October 2026
Source Sans.
1.7.6, 20 October 2026
Undo and redo in the top bar.
1.7.5, 20 October 2026
One delete button, no Stable label, stricter build.
1.7.4, 19 October 2026
Delete button on the sticky note.
1.7.3, 19 October 2026
Tabs follow the sections of a page. Examples at real size.
1.7.2, 19 October 2026
Page header, theme button and no horizontal scroll.
1.7.1, 19 October 2026
Calmer pages in the Design System.
1.7.0, 19 October 2026
No more loose parts in the app. Everything is a component.
1.6.0, 19 October 2026
Loose parts of the app become components.
1.5.3, 19 October 2026
Better navigation on the phone.
1.5.2, 19 October 2026
Search gets a clear button.
1.5.1, 19 October 2026
Better contrast in the dark theme.
1.5.0, 19 October 2026
Fundamentals follow Carbon.
1.4.0, 19 October 2026
More components, and the states are now shown.
1.3.0, 19 October 2026
Components and patterns follow Carbon.
1.2.0, 19 October 2026
More components in the library.
1.1.0, 19 October 2026
The style guide became the Design System.
1.0.1, 19 October 2026
Small change.
1.0.0, 18 October 2026
The first version for launch.