Design system/Foundations
Icons
Every icon in the app comes from one source: the paths map in components/icons.tsx, where each is a stroke drawn on a 24px grid and rendered with <Icon>.
In codecomponents/icons.tsx
Library
Every icon is shown here. Search, then tap one to copy its name.
119 icons
Structure
An icon takes the color of the text around it, so it's correct in every theme and every state. Its size matches the text next to it: 13 next to small text, 15 in a page header pill, 16 in a field.
viewBox 0 0 24 24strokeWidth 1.7round / roundcurrentColor12 · 13 · 15 · 16 · 20import { Icon, paths } from "@/components/icons";
<Icon d={paths.calendar} size={15} />Rules
Do
Add a new icon to paths and read it from there.
Don't
An inline <svg> in the middle of a component; no one will ever find it again.
Do
An icon alone in a button has aria-label and title.
Don't
An icon-only button that a screen reader announces as just "button."
Do
A directional arrow with .rtl-flip.
Don't
Two separate icons for left and right.
Size in each place
size 16 · strokeWidth 1.715px.page-head-actions .btn svg14px16pxList arrow 15px15px · opacity 0.817px@media (hover: none)20px≤ 720px14px · strokeWidth 2.4- <Icon> doesn't set aria-hidden on its own. An icon next to a label is decorative; an icon alone in a button should get its name from the button's aria-label.
- Mirroring is done only with a class: [dir="rtl"] .rtl-flip { transform: scaleX(-1) }.
Related pages