MystFlo design foundations — one core, per-surface dialects
The single design-system file. Tabs below are variations of this one language —
not separate documents. Core 1–7 stay the locked
token/type/row language. Core 0 + Mark / Website / Email /
Social / Motion are the Brand V3 design-system contract (2026-08-18) —
agents designing now must use this kit. Production pixels roll out platform-first
(shell + Pulse, then Playbook), website and email later. Per-page build
mockups stay in Design HQ — those are contracts, not the system.
Rules: kit design-canon.md U12/U13 · tokens: mystflo-playbook.md §3
· agent brief: design-foundations-agent-brief.md.
black & white luxurywhite/gray glows onlystatus + lantern = needs youflat hairline rowssingle-theme darkV3 design-system contract — see § Core 0
Layout tiers (BINDING, 2026-07-22): every mockup depicts
mobile 375px first, then tablet ~768px (added 2026-07-22), then
desktop. A surface that passes desktop but fails a smaller tier is a
FAIL — there is no desktop-only pass. These three are samples of a
continuum, not the only three states that exist — § Core 7 is the fluid/
stepwise contract for everything in between (U8).
§ Core — shared by every surface
Tokens, opacity ladder, type ramp, row anatomy, badges, buttons,
icons, motion discipline. Identical on platform, website, and everything after. A surface
that invents a color, a glow, or an alpha outside this ladder has left the language.
§ Core 0 is the V3 design-system contract (2026-08-18).
Production apply is sequenced — do not invent a second kit.
Surface visuals are the Mark / Website / Email / Social / Motion tabs in this file.
Core 0 · Design-system contract — the micrographic kit
Peyton: good for now (2026-08-18). Tokens live in playbook §3; this tab is the drawing. Core 1–7 remain the locked type/row language. Email and Social tabs use these devices, they do not invent new ones. Production UI still rolls out platform-first.
The mark — this is the icon
One plant. Dotted leaf behind (your double), solid leaf in front (you),
joined by the stem and the graft ring. That link is the story — do not
crop it off. The same drawing is the favicon, the header icon, the app
icon, and the charge inside the Seal. A single leaf is only the Thread
outcome, never the logo. Always one ink, always drawn — never filled, never metallic.
MystFlo
Wordmark lockup: the Mark to the left of italic Myst + roman Flo, Georgia. Same plant at 16px as at 96px. Ink only — never lantern, never orange.
Size ladder — the same plant at every size
96 · brand
40 · header
24 · favicon
16 · local icon
The kit — every device, one family
A printer’s case, not an icon set. If a surface needs a new shape, it is wrong — reuse one of these.
Mark — the icon
The whole plant. Favicon, header, app icon, empty states. Never crop the stem.
Leaf
Outcome only — the end of the Thread. Not the logo.
Not yet
Halfway
Done
Seal — one circle, three statuses
Same ring. Empty = not started. Half-arc = running. The Mark pressed inside = done. The stem stays — that is the join.
Stem
Vertical vein. Timeline, story spine, section rule.
Node · you
Filled. Founder is present, decided, or acting.
Node · graft
Open ring. The hand-off. Not lesser — the join.
Node · double
Dotted ring. Assistant present. Same size as you.
Node · lantern
Gold fill. Needs you — one per view, never on AI.
Edge · you
Solid 2px left rule. Founder-owned ledger rows.
Edge · double
Dotted 2px left rule. Assistant-authored rows.
Thinking
Three nodes on the thread. Double is drafting.
Thread — the Continuation
Solid (you) → graft node → dotted (double) → outcome leaf. Replaces every plain divider on website, email, and social.
Thread as progress — the Seal is the head
The line fills. The circle rides it: idle at 0, half-arc at the live point, pressed at 100. Not a second progress bar. Not a lantern dot.
Where each device lives
Device
Platform
Website
Email
Social
Mark
Header · favicon · app icon · empty
Nav lockup
Masthead + sign-off
Corner crop
Thread
Under every top-level title
Under the hero · section rule (replaces the old curve)
Rule under the header
Rule under the eyebrow
Seal
Run status + progress head · confirm = pressed
How-it-works + footer (pressed)
Colophon = pressed
Done frame = pressed
Nodes
Pulse feed · thinking · “Your call”
How-it-works steps
Folio plate dot
You / hand-off / double row
Stem
Run detail only
—
—
Story timeline
Edge
Active rail · playbook rows
—
Ledger you vs double
—
Leaf
Thread outcome only
Thread end only
Thread end only
Done frame only
The Double Law
Solid = the founder
Anything the founder did, decided, or is doing now
Filled node = a human is present
The primary leaf, the first arch of the M, the hours they work
Dotted = their double
Same shape, dash 1.5 / 4.5, ~70% opacity — never a second color
A dotted ring is their double — same size as a filled dot, not lesser
Lantern gold — the one product color, semantic “needs you”
Distinct from --amber (status / pending). Gold is an address, not a status. One gold moment per view. Never on AI output, never on the logo.
Aa
--lantern
#D4AF6D
on black · ~11:1 · primary action, “Your call”
Aa
--lantern-ink
#8A6B33
on white (email) · 4.6:1
●
--lantern-faint / --lantern-dim
12% wash · 55% caption
held-for-approval row wash
Mist Law + motion is earned
Structure is always drawn complete; mist (opacity) decides how much you see; working nodes always burn through. Hover/focus clears the veil. Decoration never moves — work does (Seal spinner, Thread progress, thinking nodes, one-shot stamp). prefers-reduced-motion holds a static fallback.
Sign-off gate: the kit above as the only drawn family · the Mark (whole plant) as the icon and favicon ·
Double Law as binding rule · Lantern as the product's third color (“needs you” only) ·
Mist Law as rendering rule · signal orange #FF4A2D stays marketing-only.
Until signed, do not ship these tokens into designSystem.ts or the playbook.
Core 1 · Color tokens + opacity ladder
Ground + text opacity ladder
Pure black ground, white text. Five opacity steps — never an arbitrary alpha outside this ladder.
Aa
--bg / --fg
#000 / #fff
page ground · primary text
Aa
--fg-70
rgba(255,255,255,.70)
secondary label, row value
Aa
--fg-55
rgba(255,255,255,.55)
action link, statusline
Aa
--fg-40
rgba(255,255,255,.40)
caption, eyebrow, muted
Aa
--fg-30
rgba(255,255,255,.30)
inline meta, footnote, sidebar eyebrow
Hairlines (borders)
--hairline-subtle
rgba(255,255,255,.06)
row dividers, list borders
--hairline
rgba(255,255,255,.10)
default border, panel/frame edge
--hairline-strong
rgba(255,255,255,.15)
hover edge, emphasis divider
Surfaces
--surface
rgba(255,255,255,.04)
base panel / .glass-surface
--surface-el
rgba(255,255,255,.06)
elevated / active nav tint
--hover
rgba(255,255,255,.08)
hover state
glow.white
rgba(255,255,255,.20–.25)
hover aura — WHITE ONLY, never colored
Status — success / warning / error vocabulary (C12, 2026-07-20)
Emerald is the platform's positive/success signal (credits, confirmation ticks, connected/healthy) — not money-only. Neutral money stays monochrome. Amber carries status + pending; red is errors only.
+$50
--emerald
#34c07c
success signal — credits, ticks, connected/healthy
●
--amber
#d9a23b
status dot (wallet low, pending)
●
--amber-badge
#eab308
PREVIEW badge, warning badge
●
--red
#e5484d
errors only
Status — production badge palette (designSystem.ts / index.css)
The broader badge-label system used across the platform (Pulse status, Connects health). Different hex from the C12 amber/emerald pair above — both are real, scoped to different surfaces.
●
colors.success
#22c55e
badge-label--active/success/connected
●
colors.warning
#eab308
badge-label--paused/warning/reconnect
●
colors.destructive
#ef4444
badge-label--error
●
colors.info
#3b82f6
rare — informational only, not a status
Proposed — Lantern (not a status; see § Core 0)
Awaiting sign-off. If adopted, this is the only non-status color in the product. It does not replace --amber.
●
--lantern
#D4AF6D
“needs you” — one moment per view
●
--lantern-ink
#8A6B33
same meaning, on white
Rule: every value above is a token. Two status palettes
coexist by design — the C12 amber/emerald/red trio is scoped to money + success
signals, the green/amber/red/blue set is the general badge-label system used
everywhere else. Never introduce a third palette.
Lantern, if signed off, is not a fourth status palette — it is an address.
Core 2 · Full type ramp specimen
Sans is Geist, mono is Geist Mono in-app — system fonts stand in here.
Assistants that do the work. A Brain that makes them yours.
body 16px · 400 · lh 1.6
Faithful chrome this round.
small 14px · 400
On-Brand Support run
row label 13px · 300–400
Warn me below
label 13px · 500
Explore
nav 13–14px · 300 · tracking-wide
Add funds
button 14px · 500
Never expires · refundable anytime
caption 12px · fg-40
Jul 18
meta (inline, same line as label) 11.5px · fg-30
price_per_run
code 13px · mono · 400
Money / KPI (T1124 tier lock)
The 200-weight thin focal is reserved for THE single wallet-balance number — never reused for a KPI. Usage numbers stay weight 500.
$41.20
money focal 40–44px · 200 -0.02em · tabular-nums
588 ↑ 18%
usage KPI 26px · 500 — NEVER 200 tabular-nums
Two eyebrows exist on purpose: the global 13px eyebrow
(playbook / most sections) and the 10.5px dense-head eyebrow used only inside
billing/usage-style tabbed pages where vertical space is tight. Same role, different
scale for a denser context — don't merge them.
No per-row leading icons. Rows carry label + inline meta
+ right-aligned value only. If a row needs a leading icon to be understood, the row
needs better copy, not an icon.
Core 4 · Badges, pills, chips
Platform badges (header)
MemberPreview
Two different axes, two different colors — Member (white) is the founder's status, Preview (amber) is the platform's status. Never conflate.
Status badges (badge-label system)
● Active● Paused● Error
A single colored dot/tint carries severity — never a loud filled block competing with the row's real content.
height 20px · padding 0 8px · radius 6px · 10px/500 — every tag on a card shares this geometry; variants change color only, never size.
One signal, one home: a founder-status badge, a
platform-status badge, a severity badge, and a supplementary tag never overlap in
meaning on the same surface.
Core 5 · Buttons, selects, checkboxes — with hover/focus states
Primary button (white fill)
Add fundsdefault
Add fundshover — white aura + translateY(-1px)
Add fundsfocus — 2px ring rgba(255,255,255,.40)
Default control height is h-9 (36px) / px-3.5 — the oversized default was retired 2026-06-20. Radius 0.75rem in-app, black text on white, 13.5–14px/500. (The website dialect rounds its buttons to full pills — see § Website.)
Text action link
Removedefault — fg-55
Removehover — fg
Turn on →emphasized (next-state) variant
Row actions are always text links, never boxed buttons — a boxed button on every row reads noisy against a flat list.
Select
$10 ▾default
$10 ▾hover — hairline-strong border
$10 ▾focus — 2px ring
Checkbox
Offunchecked — hairline border box
Emailchecked — white fill, black check
One primary action per surface. If two buttons compete
for equal visual weight, the design isn't done — everything else recedes to a text
link, a select, or a chip.
Real production glyphs (lucide-react in code) render as thin 1.5px strokes at 15–16px, currentColor only — these CSS boxes stand in for that shape without an external icon font. No fills, no multi-color icon sets.
Motion discipline (shell-language #6 — one entrance)
Each surface gets ONE shared entrance stagger — tier-ordered rise (translateY 8→0, ≤240ms per element, ~80ms apart), GPU-only transforms, no ad-hoc motion. Every animation is prefers-reduced-motion guarded — the reduced-motion path kills all of it. Hover motion is limited to translateY(-1px/-2px) + aura; nothing loops decoratively.
Proposed — Mist Law + motion is earned (§ Core 0)
The structure is always drawn complete; opacity veils it at rest; hover/focus clears the veil. Working nodes stay lit. The Seal, Thread, and nodes animate only while the system is working (spinner, progress, thinking, one-shot stamp) — decoration never loops.
White/gray glows only, on hover, earned (not decorative default)
Emerald = success signal (C12): credits, confirmation ticks, connected/healthy
Flat hairline rows, border-top on the list, border-bottom per row
Two connection verbs only: Connect/Connected/Reconnect/Pending
Quiet active nav state — tint + lit 2px left-edge thread
Mockups at 375px + ~768px + desktop, every state drawn
Never
Emoji as UI icons, anywhere
Colored glows (blue, purple, green auras etc.)
Green/red used as generic "good/bad" outside status signals
Boxed/glass card wrapping a group of flat rows
Per-row leading icons in a flat list
Solid-white active nav pill (retired 2026-07-20)
"Verify / Recheck / Manage / Validate" as a button verb
A desktop-only pass — smaller tier fails = FAIL
Monochrome money: the only color that touches a dollar
amount is emerald, and only for money coming IN (a top-up, a refund credit — a
success signal per C12). Every outgoing amount, every debit, and every neutral
balance figure stays monochrome — never red. Red is reserved for actual errors
(a failed charge), not for "money left the wallet."
U8 changes exactly ONE term. Floors and ceilings are the
already-approved values — type from § Core 2's ramp, spacing and radius from
playbook §3 — and are never re-declared here; if a number below disagrees with
Core 2, Core 2 wins. What's new is the middle term: a container-relative unit
(cqi, off a container-type: inline-size ancestor), never
viewport vw, so a panel sizes from the space it's given rather than
from the screen.
Name the reference container — the coefficient is meaningless without it
Every row reads ONE named container. Page rhythm (the focal,
content padding, gaps) reads the page content column — ~343px on a 375
phone, ~1000–1140px on desktop inside the rail. Component-internal sizing reads
the component's own box. Mixing them is the failure mode: a 340px card on a
1440 desktop and a 343px phone viewport are the same width and want different
padding, so anything that must differ between those two cases reads the page
column, never the box.
Display type — page column clamp(32px, 5cqi, 48px) — tops out at a 960px column, so every desktop keeps today's 48px focal
Grid / flex gap — page column clamp(12px, 2.2cqi, 24px) — gap-3 → gap-6, ceiling at the ~1100px column a real desktop actually has
Catalog grid min track — grid container clamp(260px, 26cqi, 320px) — the grid's MINIMUM track, not the card's final width; cards still fill 1fr
Every other type row § Core 2 — each row already carries its floor/ceiling pair; convert in place, coefficient = 100 × ceiling ÷ the column width where it should top out
Radius — NOT fluid 0.5 / 0.75 / 1 / 1.25rem — stays the token step. Corner geometry is a brand constant like the 1px hairline and the 9999px pill; a nested sheet whose corner differs from its parent's reads sloppy, not deliberate
Do
Let the container's clamp() do the sizing between 375, 768, and desktop
Size a component from its own container (container-type: inline-size), not the viewport
Reserve breakpoints for real structure changes — rail↔drawer, row↔stack, a dropped grid column
Never
Hand-author a third fixed width for tablet instead of letting the container scale
Reflow or restructure at an untested width the mockup didn't draw
Use viewport vw for a component that lives inside a sheet, card, or split panel
Write a cqi coefficient without naming which container it reads
Scale a radius, a hairline, or a pill — corner and line geometry are constants
Unaffected: locked-scale marketing visuals (§ Website
dialect) keep their own rule — one composition scales as a single frozen unit via a
shared --u multiplier. U8 governs ordinary content layout, not composed
graphics or diagrams.
§ Platform dialect — dark glass app
The app-only chrome: rail/shell specifics and sheet chrome. Everything
else the platform does is § Core. Proposed below: the
micrographic kit on Pulse (the main page), the playbook, and a few shared components.
Locked 1:1 build mockups stay in Design HQ — these crops show placement, not a rebuild.
Page content stays visible behind the dim — the masthead is never covered (amendment C1).
Add funds
Never expires · refundable anytime
✕
"Do something" → bottom sheet. Glass rgba(12,12,12,.94) + blur, 18px top radius, drag handle, one scroll surface (C11).
MystFlo
← Billing · Wallet activity
"Go somewhere" → LEFT slide-over as the real page. #0a0a0a panel, masthead stripped, its own URL + back arrow.
Tap to return
Tap-intent rule (LOCKED):do something
(complete-and-dismiss task) → bottom SHEET over the dimmed content region —
the header stays fully visible. Go somewhere (destination with its own
URL) → LEFT slide-over as the real page with a 64px "tap to return" peek edge.
Short confirm (1 message + 1–2 buttons) → small centered dialog. Mobile:
everything full-width, sheets stay sheets. The sheet band is the platform-wide
standard: full-width sticky glass band, full-width hairline, 44×44 ✕ at the real
gutter corner, title 14px mobile / 16px desktop semibold + optional one-line
subtitle. Spec: playbook §3 Modal Patterns.
The section in context — siblings around it, the current one lit. The surface you're already on, live and never covered.
Right 60% · work pane
Customer questions & policies
The destination content — a detail sheet, an ask-sheet, or a report. Prose measure lands natively at 60% of 1180px (≈708px), no re-cap needed.
Detail-sheet-as-split (LOCKED 2026-07-26): a
detail/edit sheet renders as this 40/60 split at ≥1024px instead of a
floating dialog — same geometry as every "go somewhere" destination.
LEFT 40% is always the page pane (--split-page, the
surface you're already on) — RIGHT 60% is always the work pane
(--split-work, the destination / active content) — one axis,
never mirrored per-surface. Seam: one --split-seam hairline on
the page pane's right edge, --split-shadow cast rightward onto
the work pane. Both panes are opaque, self-defining colors (page is the
darker of the pair) — never an additive wash, which is how two different
hosts once rendered the same declaration as two different greys and
inverted which pane read as nearer. Chrome: no grab handle (a split can't be
dragged down), panes rise flush with no radius and no reveal gap (a docked
workspace, not a floating card). Below 1024px: full-screen stacked, no
split.
Platform · Proposed — de-boxed list, one gold moment
Your assistants
Two running. One is waiting on you.
WhatsApp Support
Answers customer questions on WhatsApp, day and night.
Active 142 runs
Invoice Chaser
Drafted 3 firm-but-kind reminders. Won't send without you.
Your call 3 drafts held
Booking Concierge
Takes bookings from Instagram DMs straight into your calendar.
Active 61 runs
Proposed: no gray glass cards. Hairline-divided list on black.
The Seal’s half-arc means a double is running. Lantern still means needs you.
Green on the word “Active” stays — the circle is how far, not a second status color.
Platform · Proposed — where the kit sits in the app
Every page — the Mark in the header (the whole plant). Nothing else at rest.Pulse (home) — Thread under the title · nodes on the feed · lantern on the one thing that needs you · thinking while a double drafts.Playbook — Thread as the zone rule · Edge you/double on sections · Seal when confirmed · lantern on “confirm this draft”.Empty — the full Mark, once. Done — the Seal, once.
The mark is not a watermark. If a screen is working, you see Thread, nodes, Edge — not a leaf in the corner of every card.
Platform · Proposed — Pulse, the main page
Home after sign-in. Feed of you vs your doubles. One gold row.
MystFlo
$41.20
This morning
Pulse
Two doubles running. One is waiting on you.
You approved a booking reply
09:12
Your double sent 14 follow-ups
09:40
Invoice Chaser — 3 drafts held. Your call.
WhatsApp Support answered 6 guests
10:02
Booking Concierge is halfway…
Same page, first-run empty. This is the only time the full Mark appears on Pulse.
MystFlo
Nothing running yet.
Hire your first double. You teach it once — it keeps the line moving.
Pulse placement: the Mark in the masthead (every page) — the whole plant, stem included. Thread under the
page title — not a hairline. Feed rows use Node · you / Node · double. One lantern node, one gold
wash. Thinking sits on the thread while a double drafts. Empty Pulse gets the Mark once, then
never again. Green status stays on the word “Active,” not on a second colored dot.
Platform · Proposed — Playbook (Brain)
The founder’s book. Edge tells you who wrote the row. Seal means you confirmed it.
MystFlo
Brain
Your playbook
You confirmed the voice. Your double drafted the rest.
What your assistants say for you
Voice
Sounds like you
detail →
Offers
Retreat + 1:1
detail →
FAQ
3 drafts held
confirm →
What only you see
Prices
You typed these
detail →
Competitors
Researched overnight
detail →
Opened section — 40/60 idea, kit on both panes. Left is the book. Right is the draft to confirm.
MystFlo
FAQ · draft
“Do you take last-minute bookings?”
Your double wrote this from your site. Confirm and it becomes the voice they send.
Yes — if the date is still open. I’ll send what’s left and hold it for 24 hours. After that it goes back on the list.
After confirm, this row earns the Seal.
Playbook placement: the Mark in the masthead — same plant as Pulse, stem included.
Thread under the title, same as Pulse — one language. Zone labels stay eyebrows, not cards.
Solid Edge + Seal = you confirmed. Dotted Edge = the double drafted. Lantern only on the
confirm action. This is how the book gets beautiful without becoming a second brand.
Platform · Proposed — shared components
Header lockup — every page
MystFlo
Replaces the bare wordmark. The whole Mark — stem and graft — at every size.
Active rail — Edge, not a pill
Pulse
Brain
The 2px left thread already locked on the rail IS Edge · you. Do not add a leaf per item.
Page title + Thread
Connects
Every top-level page. Replaces the hairline under H1.
Loader — Thinking
Assistant drafting. Not a spinner unless a run is live — then Seal (Motion tab).
Seal — not yet · halfway · done
Queued
Running
Done
Same circle on the assistant list and on the run Thread. Pressed once at the end. Does not loop.
Empty — Mark, once
First-run Pulse, first-run Playbook, no assistants. After that, the Mark leaves the page.
Stem — activity spine
You wrote it
Hand-off
Double sent it
Done
Assistant-run detail, not the home feed. Home uses nodes in a list.
Your call — lantern node
3 drafts held
One gold moment per view. Never on a running double. Never on the logo.
What we will not do: leaf icons on every nav item, a Thread
under every row, a Seal on every success toast, gold on the wordmark, or a second
illustration language inside a sheet. The kit is small on purpose. Design HQ stays the
1:1 contract — this tab is the placement map for when Peyton signs the kit off.
§ Website dialect — marketing, kit applied
Same kit as Mark, Pulse, Email, Social. Nav gets the Mark (the whole plant). The hero
sits on the Thread, not the old wavy line-accent. How-it-works uses the nodes. Footer
presses the Seal with the Mark inside. Type ramp, grain, and pill CTAs stay — those are the dialect, not a
second drawing language.
Website 1 · Hero — Mark in the nav, Thread under the claim
MystFlo
AssistantsPricingJoin the waitlist
On-demand business assistants
Assistants that do the work.A Brain that makes them yours.
People already book and pay you — it just lives in your head and a messy inbox. Hand the work off, job by job.
See the assistantsHow it works
No signup — click through it live.
Same page at 375. Mark in the nav. Thread before the CTA. No second illustration.
MystFlo
On-demand business assistants
Assistants that do the work.
Hand the work off, job by job.
See the assistants
What stays: gradient-mesh + grain, pill CTA, clamped hero type.
What changes: the Mark in the nav (whole plant), Thread under the claim instead of a hairline
or the old curve. Material recipe is still verbatim from globals.css — the kit
sits on top of it, it does not replace it.
Dialect difference: marketing display sizes are viewport-clamped
and the body register drops to weight 300 — lighter and airier than the app's 400. The type
DISCIPLINE (one focal owns the display scale, siblings step down, sentence case) is § Core
and unchanged.
Fine-line surfaces (restraint pass — the website's own hairline values)
The website runs FINER hairlines than the app: --hairline rgba(255,255,255,.07) (app: .10), --hairline-strong .12 (app: .15), over near-transparent fills --surface-faint .02 → hover .04. Editorial structure, not glass blocks.
.surface-hairline
bg .02 · border .07 · radius 1rem
hover
bg .04 · border .12
The Thread — replaces the old line-accent curve
Same Continuation as Pulse and email: solid (you) → graft → dotted (your double) → outcome leaf. The old sweeping curve (.line-accent) is retired — it was a second drawing language. Place the Thread under the hero and at section breaks only, never between every block.
How it works — nodes for who, Seal for how far
You teach it once
Hand-off
Your double keeps the line moving
Not yet → halfway → pressed. Same circle as Pulse. Do not invent a new loop graphic.
Footer colophon
MystFlo
Mark + wordmark on the left. Seal on the right — the same plant, pressed. Not a second logo.
Catalog badges (.badge-type — one matched geometry)
AIAutoBetaSoonWhatsApp
9px/600 caps, 3px 8px, pill — AI is the lit one (white .15 fill + 8px white glow), everything else steps down in the same geometry. App chips (.card-tag) are ported verbatim from the platform so the "apps used" row reads as the same system.
Section rhythm + motion
Rhythm: sections breathe at 72px mobile → --space-4xl 72px / --space-5xl 96px desktop; the hero owns tighter padding so eyebrow → headline → subline → CTA land inside the first viewport. Motion: hero-fade-up (0.6s, translateY 16→0) and the flow-rise entrance stagger (240ms per element, ~80ms apart, tier-ordered eyebrow → headline → subline → CTA) — the website's implementation of shell-language #6. All of it killed under prefers-reduced-motion.
Locked-scale marketing visuals (BINDING): hi-fi product
mockups and infographic diagrams (.mk-* mockups, the .ce-* connect loop) are ONE locked
composition that scales as a whole via container-query units — never per-element
responsive reflow. Full mechanism + rationale: playbook §3 "Marketing Visuals —
Locked-Scale". This is why the website never drops wires/animation on mobile — the
composition carries them at every size, just smaller.
§ Social & Marketing dialect — proposed, kit applied
Same devices as the Mark tab, cropped for a thumbnail. One focal line.
Black ground. The kit is the graphic — no extra illustration, no orange, no second style.
Black-and-white luxury — mono card, pure black ground
Type discipline — ONE focal per asset, sentence case
Voice: playbook §2 "Social" tone row — real, relatable
One composition, scaled whole (locked-scale)
Changes at feed scale
Heavier focal contrast — the thumbnail must survive a busy timeline
Tighter crop — less air than the site's editorial breath
Focal type sits LARGER relative to the frame than any app/site tier
Hairline detail simplifies — .06 hairlines vanish at thumbnail size
Never a new icon, emoji, gradient, or Title Case to “read at 1x”
Boundary: feed scale may crop and enlarge. It may not invent.
Signal orange stays marketing-only and is not on these frames. When a real grid ships, these
four compositions are the starting templates — not a new style.
§ Email — proposed shell, kit applied
White, quiet. The same kit as Mark, in ink. Mark lockup (the whole plant), Thread under
the header, Edge on the ledger (solid = you · dotted = your double), Mark sign-off.
One bronze action. Not a per-template mockup — the shell every Resend template would inherit.
MystFlo
Receipt — TX.0042
Your assistant is live.
WhatsApp Support just finished setup and is now answering customers for you. Here's everything it's configured to do — you can change any of it from your dashboard.
You named itWhatsApp Support
Your double finished setupToday, 09:41
StateActive
PlanStarter
— Peyton, MystFlo
On white: Lantern deepens to --lantern-ink #8A6B33 (4.6:1).
The mark, Thread, Edge, and Seal stay ink — never gold. Production Resend cannot ship inline SVG
(Outlook); this page is the look. Live chrome uses a hosted leaf PNG + an #e8e8e8
hairline stand-in for the Thread, and CSS left-rules for Edge.
§ Motion — proposed, earned only
Decoration never moves. Work does. The Seal is the status circle — empty, half, pressed —
and the head of the progress Thread. Nodes still say who. Lantern still means needs you, never “halfway.”
Seal statuses
Not yet
Halfway · running
Done · pressed
Thread as progress — the Seal rides the line
0 — not started
Halfway — the double is on it
Done — the join, pressed. The fill is complete. No loop.
ST-01 Running
Half-arc on the same ring. The live state — not a second spinner.
ST-02 Progress
Thread fills. Seal is the head. Never a lantern dot.
ST-03 Thinking
Three nodes on the line — drafting, before a run has a percent.
ST-04 Done
Pressed once. No loop.
Law: nodes = who. Seal = how far. Lantern = needs you.
Do not paint the halfway arc gold. prefers-reduced-motion holds the static frame
of whatever state the run is in — never an empty spinner.