Unitpost

Brand & interface system

Patterns

Pages are compositions of the kit

A list page, a detail page, a settings section, an empty state and an error state each have one shape. Copy the shape; fill in the resource.

List page

Title and one-line subtitle on the left, the single primary action on the right. Below: filters (line tabs) left, search right. The table sits in an outline card and spans the full width; status is a Badge, numbers are right-aligned and tabular, row actions live at the end of the row. With no rows, the table is replaced by an EmptyState that repeats the primary action.

Domains

Send from your own address.

DomainStatusSent (30d)Added
acme.comVerified12,7572 mo ago
mail.acme.comPending02 h ago
news.acme.comVerified3,1023 wk ago
List pagemirrors /dashboard/email/domains

Detail page

The object's name as the title (mono when it is a machine value), one meta line under it, secondary actions on the right. A meta grid of overline label + value comes first, then one filled DetailSection per topic. Anything destructive is last, in a destructive-tone card.

acme.com

Verified · added 2 months ago

Status
Verified
Region
EU (Frankfurt)
Sent (30d)
12,757
Bounce rate
0.4%

DNS records

Three records keep sending authenticated.
TypeHostStatus
TXTacme.comSPF ok
CNAMEup._domainkey.acme.comDKIM ok
TXT_dmarc.acme.comDMARC ok
Danger zone
Deleting stops sending from this domain immediately. This can't be undone.
Detail pagemirrors /dashboard/email/domains/[id]

Settings section

One filled Card per topic: title + description in the header, fields with labels above, Save right-aligned in the footer. Fields are h-8 pills; a two-column grid on wide screens collapses to one.

Workspace
Your internal workspace name and default sender.
Settings sectionmirrors /dashboard/settings

Empty and error states

Icon tile, a title that names what's missing, one sentence of why it matters, at most two actions (the first repeats the page's primary action). Errors say what happened and offer Retry.

No domains yet

Verify a domain to send from your own address.

EmptyState

Couldn't load contacts

The request timed out. Your data is safe.

ErrorState

No contacts yet

Add contacts to manage, segment, and reach your audience.

EmptyState with a secondary action