Brand and components
Design manual
The rules of the public website, rendered by the components the pages actually use. Change a component or a token and this page and every public page change with it.
Logo and mark
Always BrandMark and BrandWordmark. Never redraw the mark, recolor it or set the name in another face.
BrandMarkBrandWordmarkAppLogoColor
Components name a role, never a value. Ember is the brand, neutrals carry text and surfaces. A dark band re-scopes every role, so one component works on both grounds.
app/assets/css/main.cssapp/app.config.tsEmber scale (primitives, main.css only)
50100200300400500600700800900950Light ground
bg-defaultbg-mutedbg-elevatedbg-accentedbg-inverted- Aa
text-highlighted - Aa
text-default - Aa
text-toned - Aa
text-muted - Aa
text-brand bg-primarybg-brand-filltext-brand-fill-deepborder-default
Dark ground
bg-defaultbg-mutedbg-elevatedbg-accentedbg-inverted- Aa
text-highlighted - Aa
text-default - Aa
text-toned - Aa
text-muted - Aa
text-brand bg-primarybg-brand-filltext-brand-fill-deepborder-default
Typography
The display face for marketing headings only, the sans for reading, mono for anything a machine reads.
--font-display--font-monoBrandHeadingsize="display"Transactional email for developers
size="section"One request. Everything after it, handled.
size="sub"Signed and sent
text-lg text-tonedThe same deliverability as the big players, at half the price. Simple API, fair pricing, no surprises.
text-sm text-muted3,000 emails a month free. No card required.
font-mono text-brandPOST /api/emailsSpacing
An 8 px grid. Bands sit 128 px apart; blocks inside a band 24 to 64 px.
8 px16 px24 px32 px48 px64 px128 pxButtons
One primary action per view. Ghost for the second path, inverse on the brand fill block.
BrandButtonSection heading
Every band opens with BrandHeading: an optional mono kicker, the title, one line of context.
BrandHeadingBrandSectionPOST /api/emails
Your first email is one request away.
Send raw HTML, or a saved template with variables. Use any language that can make an HTTP call.
Code window
Real, runnable requests only. Strings are highlighted, nothing else.
BrandCodeWindowapp/utils/brand-samples.tscurl https://sendhawk.online/api/emails \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"from": "hello@yourapp.com",
"to": "ada@example.com",
"templateId": "YOUR_TEMPLATE_ID",
"variables": { "name": "Ada" }
}'Live demo
The real lifecycle of one message. It pauses when hidden and holds still for visitors who prefer reduced motion.
BrandLiveDemoBrandHero$ curl https://sendhawk.online/api/emails \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"from": "hello@yourapp.com",
"to": "ada@example.com",
"subject": "Your sign-in code",
"text": "Your code is 428913"}'200 OK { "id": "msg_7f3a91", "status": "sent" }
- Sent+0.0 s
- Delivered+0.8 s
- Opened+2.4 s
- Clicked+3.9 s
Pipeline
Numbered steps for a process that happens in order. The rule fills as the band scrolls in.
BrandPipelineYou call the API
One endpoint, authenticated with a workspace API key.
POST /api/emailsWe check it
Suppressed addresses are skipped. Templates render with your merge tags.
{{name}}Signed and sent
From your own domain, aligned for SPF, DKIM and DMARC, through Amazon SES.
dkim=pass spf=passTracked
Deliveries, opens, clicks, bounces and complaints land in your activity log.
delivered - opened - clickedYou hear back
Every event is delivered to your webhook, signed so you can trust it.
x-sendhawk-signature
Feature index
Numbered editorial rows instead of a grid of cards.
BrandFeatureIndex- 01
Simple API
One clean endpoint. Send your first email with a single request.
- 02
Real-time logs
Every send, delivery, open and bounce - searchable in seconds.
- 03
Your own domains
Authenticate with SPF, DKIM and DMARC for your own reputation.
Pricing slider
Reads the same plan list as the pricing page. A price changes once, in app/utils/plans.ts.
BrandPricingSliderapp/utils/plans.tsusePlans- Free3,000
- Starter25,000
- Pro75,000
- Business250,000
- Scale750,000
- Enterprise1,000,000+
Closing block
Once per page, at the end: the brand fill and a single action.
BrandCtaReady to send better email?
Create a free account and send your first email today.
Start for freeFooter
Rendered by the layout on every public page. New links go here, never into a page body.
BrandFooterlayouts/default.vue