Icons
Syntara draws its own icons: curvy and minimal, one stroke weight, colour from the text around them. 243 drawings in @syntara/icons, and every outline icon also has a duotone twin — 480 React components in all.
IconCheckA curved check, not two straight strokes meeting at a corner.IconChevronRightA rounded tip. Every chevron and arrowhead shares it.IconBellArc shoulders instead of corners.IconSettingsScalloped, not toothed.IconCreditCardBox corners of 4.5, 3.25, 2.5. Never sharp.
The style
- Grid
- 24px, drawing inside the central 20
- Stroke
- 1.5round caps and joins, from
--syntara-icon-stroke - Set
- 243drawings in 11 groups, 480 components with the duotone twins
- Curves over corners. An arc or a curve wherever a corner would do: rounded chevron tips, arc shoulders and handles, scalloped mechanical shapes.
- Only the strokes you need. No inner detail lines, decorative ticks or shading. Most icons are three paths or fewer.
- Colour follows the text. Every icon draws in
currentColorand sizes to1.25em, so it matches the label beside it. - Quiet by default. Icons are
aria-hiddenunless you give one anaria-label; then it’s announced as an image.
Why Syntara draws its own instead of using an off-the-shelf set: ADR-014. The full spec sits at the top of create-icon.tsx.
Usage
import { IconBell } from '@syntara/icons';
// Decorative next to text (the default): hidden from assistive tech, sized to the text.
<Button><IconBell aria-hidden /> Notify me</Button>
// On its own, it needs a name.
<IconBell aria-label="Notifications" size={20} />Duotone
Every outline icon has a duotone twin: the same drawing, untouched, with a tint layer painted behind it. The tint isn’t drawn a second time — it’s derived from the outline’s own subpaths, so the two layers can’t drift apart. 237 twins, named Icon<Name>Duotone.
One token controls the second tone: --syntara-icon-tint, defaulting to color-mix(in oklab, currentColor 16%, transparent). So duotone still follows the text colour like every other icon — it works on any surface and inside a solid button with no setup — and a theme, a tenant or one component can set the token to make the tint a real colour.
import { IconBellDuotone } from '@syntara/icons';
// Works with no setup: the tint is the text colour at 16%.
<IconBellDuotone size={32} />
/* Make the second tone your own — one token, anywhere above the icon. */
.promo { --syntara-icon-tint: var(--syntara-color-accent-muted-bg); }Duotone is a fill style, so 54 of the 237 have no tint: a check, an arrow, a chevron and the other bare strokes enclose no area, and there is nothing to fill. Their twins exist and render exactly like the outline, so you can move a whole product to duotone in one import change without a missing export. Why the set gained a second style, and what was rejected: ADR-036.
All icons
480 icons, shown at 24px with a 1.50 stroke. Click one to copy its import.
Core12
Navigation28
Status28
Objects29
Health28
Commerce28
Media28
Travel28
System28
Filled6
Duotone237
Copies the import line