Icons
Icons are Lucide, through one wrapper, @tempio/ui/icons:
<Icon name="Settings" />, or the named export SettingsIcon, so moving a
file off lucide-react is an import swap. A glyph with a file in
packages/ui/icons/animated/, copied from the lucide-animated package (npm,
1.0.5, MIT), can play; every other glyph renders lucide-react in the same
box.
Under neutral, the theme this page opens on, an animated glyph draws its
resting frame and never plays, and every Lucide glyph draws at stroke 1.5
from the theme’s --icon-stroke. Under tempio an animated glyph plays on
hover and on a state change, at Lucide’s stroke of 2. Pick tempio above,
then hover each glyph and press Approve.
- Settings
- Search
- Send
- Copy
- Download
- Sparkles
Turn on reduced motion in your system settings and every icon above renders its static Lucide glyph instead.
When an icon plays
Under tempio, and never under neutral:
- When the pointer enters its control: the nearest button, link, menu item, tab or option, or the icon itself when it has none.
- When its
stateprop changes: a sync finishing, an approval landing, a nav item becoming active.
Each play runs 200 ms per element on the package ease-out, from ICON_MOTION
in @tempio/ui/icons/motion; a staggered glyph finishes within 1.2 s. An icon
never plays on mount and never loops. Under reduced motion it renders the
static glyph. The sync icon is the one exception to the loop rule: it turns
while a sync runs and becomes a check when the sync ends.
Coloured tiles
Each object in the app and the console wears a tile: a square at 16, 20, 24
or 32 px at a 30% corner radius, filled with the object’s colour inside a 1px
ring, with a solid white glyph. Attio’s tile glyphs are silhouettes, so a tile draws
from Phosphor’s fill weight (@phosphor-icons/react 2.1.10, MIT, through
@tempio/ui/icons/tile) while every other icon stays on Lucide. A tile is
still given the Lucide name. This draws the campaign tile:
<IconTile icon="Megaphone" tone="campaign" />The fill reads --object-campaign, which every theme sets. This page opens on
Neutral, the look the tiles were measured for.
| Tone | 16 | 20 | 24 | 32 | 56 |
|---|---|---|---|---|---|
Campaigns--object-campaign | |||||
Planner and plans--object-plan | |||||
Review--object-review | |||||
Ad library--object-library | |||||
Assets--object-creative | |||||
The agent--object-agent | |||||
Connections--object-connection | |||||
Companies--object-company | |||||
People--object-person | |||||
Deals--object-deal | |||||
Lists--object-list | |||||
Custom objects--object-object | |||||
Rules, ⌘K and toasts--tile-neutral | |||||
A record with no logo--tile-fallback |
Platforms, at 16 and 32
- Meta
- TikTok
- X
- Microsoft
Object chips, at 20 and 22
- Campaign
- Plan
- Draft
- Advertiser
- Asset
- Agent
- Connection
- Company
- Person
- Deal
- List
- Object
- Campaign
- Plan
- Draft
- Advertiser
- Asset
- Agent
- Connection
- Company
- Person
- Deal
- List
- Object
| Tone | 16 | 20 | 24 | 32 | 56 |
|---|---|---|---|---|---|
Campaigns--object-campaign | |||||
Planner and plans--object-plan | |||||
Review--object-review | |||||
Ad library--object-library | |||||
Assets--object-creative | |||||
The agent--object-agent | |||||
Connections--object-connection | |||||
Companies--object-company | |||||
People--object-person | |||||
Deals--object-deal | |||||
Lists--object-list | |||||
Custom objects--object-object | |||||
Rules, ⌘K and toasts--tile-neutral | |||||
A record with no logo--tile-fallback |
Platforms, at 16 and 32
- Meta
- TikTok
- X
- Microsoft
Object chips, at 20 and 22
- Campaign
- Plan
- Draft
- Advertiser
- Asset
- Agent
- Connection
- Company
- Person
- Deal
- List
- Object
- Campaign
- Plan
- Draft
- Advertiser
- Asset
- Agent
- Connection
- Company
- Person
- Deal
- List
- Object
- Northwind
- Bluebird
- Driftwood
- Acme
- Marlow
- Cobalt
- Tempio
- Sizes. 16 in the sidebar, the breadcrumb, record chips and the view picker; 24 for the workspace avatar and the ⌘K options; 32 in record headers. The glyph is 10, 12, 14 or 18 px, and keeps that size inside a button, a menu item or a sidebar row.
- Stand-ins. Where Phosphor has no glyph of the Lucide name, its nearest
one draws: the Planner’s Gantt bars as
ChartBarHorizontal, Review’s clipboard asClipboardText, the swipe file asBookmarks, Tracking’s radar asTarget. Every tile in the app is solid. A name the set does not know falls back to its Lucide outline, as a safety net. - Chips.
ObjectChipnames a record’s object on--object-<name>-tintinside--object-<name>-tint-ring, with its name in--object-<name>-tint-foreground. The token build holds that ink at 4.5:1 on the tint. It is 20 px tall at radius 6 for a ⌘K result, and 22 px at radius 7 for a tag in a table (size={22}). - Platforms. A platform’s tile is its own logo.
<ProviderMark logo="meta" tile={16} />draws the mark at 12 px inside a 16 px tile, or 24 inside a 32, on the page’s ground at a 30% corner radius, inside the tile ring, and shows the on-dark file in dark mode. Its name goes in text beside the tile, or inlabelwhere nothing beside it names the platform. - Labels. A tile never stands alone as the only name of a thing. White on
the green, amber and orange fills reads under 3:1, so the object’s name is
always in text beside it and the tile is decorative. Give it a
labelonly where the text beside it names something else. - Tone names are hues too. An avatar wears
campaignfor its blue. In the view picker a table or a list wearsplanfor green, a boardreviewfor orange, and a timelinecampaignfor blue. - Avatars. With
initialin place oficon, the tile draws the first letter.toneFor(id)picks one of the seven hues from the workspace’s id, so a rename keeps the colour. - The neutral tile is the grey one in ⌘K and toasts. It keeps Lucide outlines in the label ink, because Attio’s tiles there are outlines.
- The fallback tile is a record with no logo:
tone="fallback"draws the object’s solid silhouette (a building, a dollar, a person) in grey on--tile-fallback. A board card wears it unless it is given a tone.