SG-00Cover sheet · Drawing set SG · Instant ad snapshot
Rev B · Nov 2026 · after the simplificationSee where you stand, in the feed and in AI answers.
How the studio’s free snapshot looks, reads and behaves, drawn the way we would document a building: every part at 1:1, so the dimensions you read are the pixels we ship.
Headline: the start page’s own h1Drawn to the simplified studio system (docs/reference/studio-style-system.md): the colour tokens on SG-02, eight type sizes, five radii, no shadows. Contrast ratios are WCAG 2.2, computed from the values on SG-02; on-dark alphas are composited over each dark ground. Sample business: Sample Burger Co., with Competitor E and Competitor J. Prices as the live site states them.
SG-01One mark, one bar to start from.
Logo · studio top barDetail A · Logo
Drawn 2:1- 1Diamond. 13 px square turned 45°, square corners,
--accent. It stays orange on every ground. - 2Word mark. Geist 600, 17 px (
--fs-read), −0.01em, gap 10. The only 600 in the system. Ink on stone and card,--on-darkon the gradient. - 3Name. Always “RD&D Studio”. Never a person’s name beside it.
Detail B · Studio top bar
On the eras gradient · R 22Phone · under 700 px
- 1Logo in white. The bar’s padding is 16 top and bottom, 44 at the sides on desktop.
- 2Services · About · Contact. Geist 14 (
--fs-small),--on-dark-2: 4.99:1 on the top stop, 4.71 on the bottom. - 3The only call to action. Outline pill, R 999, 1.5 px
--line-on-dark,--on-darktext 6.27:1; hover takes the border to--on-dark. ↗ because it opens the start page. - 4Phones keep the logo and the pill only; the section links move to the page.
SG-02Ink on stone, one orange for action.
Token · value · role · contrastDetail C · Palette
From tokens.css · ratios WCAG 2.2| Token | Value | Role | Contrast 1 | |
|---|---|---|---|---|
| C1 · Grounds | ||||
| --bg | #e9e8e5 | Page ground, warm stone | Ground | |
| --card | #fafaf8 | Panels, the checklist card, the checks dialog | Ground | |
| --paper | #ffffff | Fields, stat tiles, the selected tab and the panel it opens | Ground | |
| --hover | #dfddd9 | Hover fills, your row in the category table, image wells | 12.42ink · 6.72ink-3 · 4.10muteNo mute text | |
| C2 · Ink | ||||
| --ink | #1e1d1b | Headings, ink pills, table rules, the rust pill’s hover | 13.75bg · 16.12cardAA | |
| --ink-3 | #4a4845 | Body copy, fix text, the other tab, the ink pill’s hover | 7.44bg · 8.72cardAA | |
| --mute | #6a6864 | Secondary text, labels, placeholders, hints, the italic phrase | 4.54bg · 5.56paperAA | |
| C3 · Lines | ||||
| --hair | #dcdad5 | Row rules, the other tab, progress track | 1.34cardDecorative | |
| --hair-2 | #cfcbc4 | Control, tile and card borders, waiting ring, other brands’ bars, disabled Buy | 1.55cardDecorative | |
| C4 · Accent · action and “working”, never a grade | ||||
| --accent | #e8743b | Marks only: logo diamond, working arc and bar, selected tab line, bullets | 2.87cardNot text | |
| --accent-ink | #ab4c1b | Orange text, field errors, the focus ring on light grounds, the rust pill | 4.53bg · 5.55white on itAA | |
| --accent-tint | #f6e1d3 | The peach offer banner, the empty ad slot, the making fill | 13.34ink · 4.40accent-inkInk text only | |
| C5 · Status lights · high, medium, low · grades only: marks, dots, chip borders and tints | ||||
| --signal-green | #2e8b57 | Grade dots A–B, chip border, done ring, the ✓ in the checks | 4.06card · 4.25white on itMark only | |
| --signal-green-tint | #dff0e6 | Grade chip A–B, pass badge | 14.23ink on itAA | |
| --signal-yellow | #d9a21b | Grade dot C, chip border, “missing” step, untraced number | 2.20card · 7.33ink on itDot + label | |
| --signal-yellow-tint | #f8edcc | Grade chip C, a number held for review | 14.42ink on itAA | |
| --signal-red | #c8372d | Grade dots D–F, chip border | 4.97card · 5.20white on itMark only | |
| --signal-red-tint | #f7dcd8 | Grade chip D–F | 12.98ink on itAA | |
| C6 · Dark grounds | ||||
| --grad-eras | #655e67 → #7f5844 → #a3491a | Top bar, studio hero, start page | 5.96on-dark · 4.71on-dark-2, lowest stopAA | |
| --grad-now | #556360 → #3e685c → #286b57 | The snapshot form | 6.29on-dark · 4.99on-dark-2AA | |
| --studio-panel | #55524d | Services and pricing panel | 7.78on-dark · 6.07on-dark-2AA | |
| --studio-card | #605d57 | Service cards, the lead (free) card included | 6.56on-dark · 5.22on-dark-2AA | |
| C7 · On dark · alphas, measured composited over each dark ground 3 | ||||
| --on-dark | #ffffff | Text and marks on dark grounds, the focus ring there | 5.96lowest, eras bottomAA | |
| --on-dark-2 | rgb(255 255 255 / .84) | Secondary text on dark: nav links, the italic phrase, ledes, placeholders | 4.71eras bottom · 6.07panelAA | |
| --line-on-dark | rgb(255 255 255 / .4) | Rules, outline pills, card and field borders on dark | 2.22–2.67on the groundsDecorative | |
| --hover-on-dark | rgb(255 255 255 / .09) | Hover fill behind on-dark text | 5.00on-dark on it, lowestOn-dark text only | |
| --field-on-dark | rgb(0 0 0 / .18) | Form fields on dark | 7.86on-dark · 6.08on-dark-2 placeholderAA | |
#655e67 → #7f5844 → #a3491a--on-dark 6.27 / 6.21 / 5.96. --on-dark-2 4.71 on the last stop.
#556360 → #3e685c → #286b57--on-dark 6.29 to 6.30. --on-dark-2 4.99 or more.
#55524d · card #605d57--on-dark-2 6.07 on the panel, 5.22 on the card.Every service card, the lead one too: --studio-card, 1 px --line-on-dark
- 1Contrast is the token as text (or white on it, where it is a fill), on the grounds it meets. 4.5:1 for text, 3:1 for marks and focus rings.
- 2Badges. AA passes at any size. Yellow: allowed only where named. Red: never text. Gray: rules and borders.
- 3On-dark tokens are white or black at an alpha. Each ratio is the alpha laid over the ground first, on every gradient stop and both studio grays; the table prints the lowest.
- 4Status-light colours never set text.
--signal-greenis 4.06:1 on card. Text on a tint stays ink.
Note · Retired in the Nov 2026 simplification
A record · not for use| Retired | Use instead |
|---|---|
| --on-grad | --on-dark |
| --on-grad-mute · --on-grad-green · --studio-mute | --on-dark-2 |
| --studio-ink-2 | --on-dark |
| --on-grad-deep | --ink |
| --studio-hair · --studio-hair-2 · --studio-field-line | --line-on-dark |
| --studio-field | --field-on-dark |
| --studio-card-lead | --studio-card |
| --ink-2 | --ink (text) · --ink-3 (ink pill hover) |
| --accent-deep | --ink (rust pill hover) |
| --accent-wash | --accent-tint |
| --green · --green-ink | --signal-green (marks) |
| --hint · --faint | --mute (text) · --hair-2 (graphics) |
The styles before this change are git tag styles-before-simplify. Sizes and radii were folded the same way: any other size to the nearest of the eight steps, any other radius to the nearest of the five.
Detail D · Status lights
The grade colours · A to FHigh
Mark #2e8b57Tint #dff0e6
A every check · B 80%+
Medium
Mark #d9a21bTint #f8edcc
C 60% to 79%
Low
Mark #c8372dTint #f7dcd8
D 40% to 59% · F under 40%
- 1Every grade letter is ink on the light’s tint, with a 1 px border in the light’s colour: 14.23:1 on green, 14.42 on yellow, 12.98 on red. Never white on the solid light: white on
--signal-greenis 4.25:1. - 2The border is the light. Ink on the tint carries the letter; the 1 px border in the light’s colour carries the grade, so the three read apart without colour on the text.
- 3Bands are the live key under the category table: “Meta ads grade A–B · C · D–F”. Text on a tint stays ink; the dot carries the colour.
SG-03Every pair measured, and the system graded.
WCAG 2.2 · AAE1 · Text on every ground
Text token × surface| Text token | --bg | --card | --paper | --accent-tint | --hover |
|---|---|---|---|---|---|
| --inkHeadlines, labels in a row | 13.75AA | 16.12AA | 16.84AA | 13.34AA | 12.42AA |
| --ink-3Body copy | 7.44AA | 8.72AA | 9.11AA | 7.22AA | 6.72AA |
| --muteSecondary, placeholders, hints | 4.54AA | 5.32AA | 5.56AA | 4.40Large | 4.10Large |
| --accent-ink 2Kickers, errors, fix numbers | 4.53AA | 5.31AA | 5.55AA | 4.40Large | 4.09Large |
On dark grounds · alphas composited over the ground
- 1The yellow cells are designed out. Orange and mute text never sit on a tint or a hover fill; your row in the table sets its secondary text in
--ink-3. Placeholders are--muteon paper, 5.56:1. - 2The lowest text pairs in use are
--accent-inkon--bg, 4.53:1, and--on-dark-2on the eras gradient’s last stop, 4.71:1. Cells print the computed ratio to two places, not the token comment.
E2 · See the checks
The system on its own lights11 of 12 of our standard
1- Contrast AA on every text pairPass
Lowest in use: accent-ink on stone 4.53:1; on dark, --on-dark-2 on the eras gradient 4.71:1
- Placeholders passPass
--mute on paper 5.56:1; --on-dark-2 in a dark field 6.08:1
- Focus rings reach 3:1Pass
2 px --accent-ink on light grounds (5.31 on card); --on-dark on dark (5.96 or more)
- One accent colourPass
Orange for marks, accent-ink for its text and the rust pill
- Lights are marks and tints onlyPass
Grade letters ink on the tint with a 1 px border in the light, 12.98:1 or more
- No shadowsPass
Depth is card on ground; the selected tab is marked by its 3 px accent top border
- Eight sizes, three weights, five radiiPass
300, 400, 500; 600 in the logo only. 22, 16, 10, 999, 50%
- No text under 11 pxPass
--fs-label is the floor: mono labels and the YOU tag
- Every number sourcedPass
Ad data, ad copy or the brand’s own site
- Every dead end has a screenPass
No website, no Facebook page, no live ads, daily limit
- Speaks as the studioPass
“We”, never a personal name
- Ink pill hover is --ink-32Fix
The start page’s Send and Continue still take the site-wide .btn hover, --ink-2
- 1Graded like a brand’s ads: A when every check passes, B at 80% or more.
- 2One open fix, listed rather than hidden: give the start page’s ink pills the
--ink-3hover the ad sample already uses.
SG-04Three families, each with one job.
Geist states · Newsreader explains · Geist Mono labelsDetail E · Type scale
Fluid sizes: min → max, each reaching its max at its own width (SG-11)| Token | Specimen, at 1440 px 1 | Spec | Use |
|---|---|---|---|
| --fs-h1 340 → 66 | See where you stand, in the feed. | Geist 300−0.04em · line 1.02. Phrase: Newsreader 300 italic | Hero headline: the studio page and the start page, on the gradient. |
| --fs-h234 → 56 | Our services | Geist 300−0.035em · line 1.05 | Page and panel titles on the studio page. |
| --fs-h324 → 32 | You launched 10 new Meta ads in the last 30 days. That’s more than Competitor E and Competitor J. | Geist 500 + 400−0.03em · bold in ink, the rest in ink-3. Stat numbers: 300, tabular | Snapshot headline, card titles, stat numbers. |
| --fs-lede19 → 22 | Enter your website. We read your live Meta ads next to your competitors’, ask AI assistants about you, and make you three new ads. | Newsreader 300line 1.45 · ink-3 | One intro under a headline; service card titles and subheads in Geist. |
| --fs-read16 → 17 | Name the dish in the first line. Pulling your live ads and your competitors’. | Geist 400 / 500line 1.55 | Fix text, checklist steps, field labels and what you type. |
| --fs-body15 | New ads in the last 30 days, and the mix of ads running now. | Geist 400line 1.5 | UI text: card intros, table rows, tab and button labels. |
| --fs-small14 | Image ad, in feed (4:5) and Stories (9:16) sizes · 3 of 3 picked | Geist 400line 1.4 | Secondary UI text: counts, hints, field errors, captions, tile labels, sources. |
| --fs-label 211 | Meta ads snapshot for Sample Burger Co. You | Geist Mono 400 4uppercase · +0.09em · the floor | Kickers, table heads, the YOU tag. Nothing smaller. |
- 1Specimens are set at their 1440 px size, the width these sheets are drawn at. Below that the clamps step down to the min. Any other size maps to the nearest step by its desktop value.
- 211 px is the floor for any text, mono or sans, on every sheet and every screen.
- 3Headline pattern: a sans statement and one italic serif phrase,
--on-dark-2on the gradient, mute on light. The snapshot’s own headline swaps the serif for weight: 500, then 400. - 4Three weights: 300 display, 400, 500. 600 only in the logo. Self-hosted on the site from @fontsource, Latin only; no Google Fonts request in production.
SG-05Soft corners, no shadows, room to breathe.
Spacing steps · five radii · no shadowsDetail F · Spacing
Bars drawn 1:1- 144 is a floor, not a look. Every control is at least 44 high on a phone; small-looking links get an invisible hit area.
- 2Gaps inside a card stay small; space between ideas is large. Sections open with the
--sectionclamp, 64 → 112. - 3Gutters: the portfolio uses
--gutter, 16 on a phone to 64 from about 1455; the studio pages use a 14 px frame plus--pad, 20 to 44 (see SG-11). Nothing scrolls sideways at 375.
Detail G · Radii
No shadows: depth is card on ground- 1Nested radii shrink inward: a 16 tile inside a 22 panel, a 10 image inside a 16 frame. Fields are 10, not pills.
- 2999 is full round at any height: 44 picks and the top bar pill, 48 buttons, 52 Send and the start button; also progress tracks and table bars.
- 3Drawn 176 wide so every corner reads at 1:1. Tabs take 16 on their top corners and open into a 22 panel. No shadows anywhere: depth is card on ground.
SG-11Phone first, then two widths.
Phone under 700 · tablet 700–999 · desktop 1000 and up · max 1440Detail J · Breakpoint ruler
Scale 1:1.72 · viewport width, px- 1Three widths, two queries. Base styles are the phone;
(min-width: 700px)adds the tablet,(min-width: 1000px)the desktop. One off-system query:(min-width: 560px)puts the no-live-ads stats 2-up. The 1100 query is the portfolio header’s only; no studio page uses it. - 2Mobile-first, two exceptions written downward:
(max-width: 699px)folds the category table,(max-width: 999px)lifts the grade chips above the tabs. - 3Gutters.
--gutter(16 up to 364, 64 from 1455; 63.4 at 1440) frames the portfolio’s.container. The studio pages don’t use it: they keep a 14 frame and pad inside with--pad, 20 up to 625, 44 from 1375. - 41440 is the cap.
--maxwstops the studio wrap growing; past it the page centres. The 14 frame sits inside the 1440, so content is 1412 at most.
D10 · The studio parts at three widths
Scale 1:3 · widths to scale, heights indicativeBrand + mix · New · Active
Brand · New · Active · Video · Multi · Image
Same six columns, wider
Bar wraps to two rows
Bar on one row
Same three, larger
Form card: form, then checklist
Still one column
Headline | form, 1.05 : 0.95, gap 48
- 1StudioBar:
navisdisplay: none, thenflexfrom 700. Padding 16 top and bottom,--padat the sides. - 2Tiles:
.numsisrepeat(2, minmax(0, 1fr)),repeat(4, …)from 700. From 1000 the intro is a two-column grid: tag, tiles, then headline and lede beside the button. - 3Topbar: under 1000
.gradestakesorder: -1so the selected tab still sits on its panel. From 1000 a three-track grid,minmax(0, 1fr) auto minmax(0, 1fr), chipsnowrap. - 4Table: the three format cells
.fhide under 700 and the mix line.fmshows in--fs-small; on the brand’s grey row it is ink-3, because mute there is 4.1:1. - 5New ads:
repeat(3, minmax(0, 1fr))with a 10 gap, no query. The bar isflex-wrap: wrap. - 6Start:
.heroBodygoes two-column at 1000;.getsgoes 3-up at 700. The checklist card is the same panel slot, shown once the form is sent.
Detail K · Fluid type
Same width scale as Detail J · px at 16 px rem| Token | Min → max | Min up to | Max from | At 390 | At 768 | At 1440 | On the studio pages |
|---|---|---|---|---|---|---|---|
| --fs-h1 | 40 → 66 | 424 | 1188 | 40 | 51.7 | 66 | Hero headline, studio page and start page |
| --fs-h2 | 34 → 56 | 678 | 1289 | 34 | 37.2 | 56 | Page and panel titles, studio page |
| --fs-h3 | 24 → 32 | 480 | 1280 | 24 | 26.9 | 32 | Snapshot headline, tile numbers, card titles |
| --fs-lede | 19 → 22 | 440 | 1040 | 19 | 20.6 | 22 | Intros under a headline; what-you-get titles |
| --fs-read | 16 → 17 | 356 | 911 | 16.1 | 16.7 | 17 | Field labels, inputs, checklist steps, logo |
- 1Each clamp has its own range. None of them runs 375 to 1440:
--fs-readis full size from 911,--fs-h2only from 1289. Past its max width a size is fixed. - 2No jumps at the breakpoints. Between its two widths a size grows in a straight line with the viewport (rem + vw), so type never steps at 700 or 1000; only layout does.
Note · Rules at every width
Checked at 375, 390, 768, 1280, 1440- 1Touch targets 44 or more on a phone. The logo, the top bar pill, grade chips, picks, “Preview in the feed”, tabs (50) and the start page’s chips all set
min-height: 44px; a link that must look small, like “Not your business?”, gets a transparent::beforehit area. One part falls short: an ad card’s Ad Library link is 32. - 2No sideways page scroll at 375. The page is a 14 frame and fluid tracks; nothing inside is wider than its column.
- 3Wide things scroll inside their own box, never the page: the AI answers grid (
.qcard) and the studio page’s logo strip (.strip) takeoverflow-x: auto. The category table folds instead, see D10.4. - 4Grid tracks are
minmax(0, 1fr), never a bare1fr, and text children getmin-width: 0. Card rows that wrap useminmax(min(100%, 240px), 1fr), so one card never outgrows a phone.
SG-12Motion that confirms, then gets out of the way.
Three curves · six durations · two working loops · one deckDetail L · Curves
x: time 0 → 1 · y: progress 0 → 1 · handles dashedcubic-bezier(.2, .7, .2, 1)Fast start, long soft landing. Everything that moves inside a page: tabs, panels, grade sets, reveals, cards in, the hero deck.cubic-bezier(.25, .8, .25, 1)Arrivals that cover the view: the new page fading up, the picture viewer opening.cubic-bezier(.4, 0, 1, 1)Departures: slow to leave, then gone. The old page fading out, the picture viewer closing.cubic-bezier(0, 0, 1, 1)The two working loops only: the checklist spinner and the snapshot record’s chase. Even speed reads as “still going”.Detail M · Durations
Tokens solid · literals in the code hatched| ms | Name | Used by |
|---|---|---|
| 150 | --dur-fast | Hover fills and borders (buttons, service cards, case-study links), the hero message dots, the old panel’s fade on a tab switch, the tab arrow’s fade |
| 260 | --dur-dialog-out | Picture viewer closing. The old page’s fade-out is the same 260, written as a literal in global.css |
| 450 | --dur | Tabs, grade sets, the new panel, the start page’s progress card arriving, hero deck cards, hero messages, pending ad pictures fading in |
| 500 | --dur-dialog-in | Picture viewer opening |
| 700 | page in (literal) | The new page fading up |
| 900 | --dur-slow | Reveal on scroll |
D11 · Dialog open and close
Case-study picture viewer · CaseStudy.astro- 1@starting-style gives the open its start;
overlayanddisplay(allow-discrete) keep the viewer on screen for the 260 it takes to close. - 2One motion for every dialog: the picture viewer, the grade-chip checks, the ad viewer and the industries dialog all take
class="motion"(global.css), so they open and close on this same timeline. Their backdrops keep their own blur (6 or 8 px) and fade with them.
D12 · Meta / AI tab switch
AuditPage.astro · ends at 600- 1Out, then in. The old audit fades for 150, then the panels swap and the new one fades up 4 px over 450, while the tabs and grades are already moving.
- 2Reduced motion:
LEAVE_MSis 0 and the tabs’ transitions are off, so the switch is instant.
D13 · Page to page
global.css · @view-transition, every page- 1A crossfade, not a slide. Only with
prefers-reduced-motion: no-preference; otherwise, and in browsers without cross-page view transitions, a plain load.
D14 · Reveal on scroll
reveal.ts · global.css · [data-reveal]- 1Once, on entry (8% visible, bottom margin −8%), then unobserved. Hidden only under
html.js; with reduced motion everything is shown at once. On the studio page: the two examples (0, 80) and the stat strip (60 apart).
D15 · Loops
Progress loops run only while work runs · one decorative loopThe doing step’s 16 px ring, top open, turns 360° every .8s linear infinite. Under reduced motion the global override runs it once in 1 ms: a still ring.
A 6 px track. Not a CSS animation: a 150 ms timer steps scaleX 12% of the way to the builder’s latest report, creeping 0.05 between reports and held at 95 until the page is ready. It moves the same with reduced motion; the % is the message.
A yellow arc (18% of the outline) laps the running tag every 1.8s linear infinite, over a fill that shows the %. Reduced motion: no lap, a solid yellow border.
Studio hero ad deck ai-services.astro · desktop only, 1000 and up · the site’s only decorative loop
- 1Six cards, one shuffle every 2600. The front card leaves down-left and fades; the rest step forward and lighten; at 650 it is repainted with the next ad and slips in at the back.
- 2It stops while the pointer is over it, while Pause is pressed (a 44 px button; it toggles to Play) and while the tab is hidden. With reduced motion it never starts and Pause is hidden.
- 3The hero message beside it runs on its own clock: every 6500 a 450 crossfade, rising 10 px. Pause holds it too; hover doesn’t, and choosing a dot hands it to the visitor for good.
- 4Pending ad frames fill with
cubic-bezier(.4, .4, .6, 1), near-even with an eased end, timed by the script to the expected wait; off with reduced motion.
Note · Rules for motion
CLAUDE.md motion rules, as built- 1Motion reveals, connects and confirms. A tab raises into its panel, a viewer rises over the page, a section arrives as you reach it. Nothing moves for decoration but the deck.
- 2Nothing loops except progress (spinner, chase, bar) while work is running, and the one hero deck with its message.
- 3Reduced motion resets every duration to 1 ms and every delay to 0, with one iteration (global.css). Reveals show at once, page crossfades are off, and dialogs appear and close instantly.
- 4Never information by motion alone. The spinner sits beside its step’s words, the bar beside its %, the chase beside “Running”; a still frame says everything.
SG-06Pills, fields and tabs, in every state.
Default · hover · focus · disabled · errorD1 · Pills and their states
R 999 · focus ring 2, offset 3: accent-ink on light, on-dark on dark| Part | Default | Hover | Focus | Disabled |
|---|---|---|---|---|
| Outlinethe call to action | Buy your new ads 1.5 ink · no fill | Buy your new ads fills ink, card text 16.12 | Buy your new ads + accent-ink ring | Never disabled |
| Rustbuying only | Buy 3 ads · $297--accent-ink · white 5.55 | Buy 3 ads · $297to --ink · white 16.84 | Buy 3 ads · $297+ accent-ink ring | Buy these adsnothing picked · ink-3 on hair-2, 5.64 |
| Inkthe quiet yes | Send--ink · card text 16.12 | Sendto --ink-3 · card text 8.72 | Send+ accent-ink ring | Never disabled |
| Togglepick an ad | Select ad B31.5 hair-2 · ink text | Select ad B3border to ink | ✓ Selectedpressed · + ring | Full at 3 of 3: taps wait |
- 1Outline · 48 high, 22 sides. “Buy your new ads →” at the top and bottom of the snapshot.
- 2Rust is for money only. Its label always states the count and the price: $99 an ad.
- 3Ink is the quiet yes: Send for the follow-up email, Continue after a missing page.
- 4Toggle · 44 high.
aria-pressed: “Select ad B3” off, “✓ Selected” on.
D2 · Fields
Website · ZIP · email · R 10That doesn’t look like a web address. Try it like yourbrand.com (no https:// needed).
Composed The ZIP and the follow-up
Thanks. We’ll write to you@yourbusiness.com about your results.
- 1Field on paper, 52 high, R 10 (
--radius-control), 1.5--hair-2, 17 px text so phones don’t zoom. Label 17/500 above, hint 14 in--mute; the placeholder is--mutetoo, 5.56:1. Never only a placeholder. - 2Focus: border to ink plus the accent-ink ring, offset 2. The example clears while you type.
- 3Error: the border and one sentence in accent-ink (5.31 on card) saying what to type. Required is an orange *, and
aria-required.
D3 · Tabs
R 16 / 22 · Meta and AI · no shadowHover, the other tab
- 1Selected is the paper panel it opens, no rule between and no shadow. A 3 px
--accenttop border and a 6 px caret mark it, so colour isn’t the only cue. - 2Other tab sits 6 lower on
--hair, Geist 500 15 in ink-3 (6.52:1). Hover:--hair-2, ink (10.42:1). - 3One line of grade chips sits beside the tabs (D6), at the right edge on desktop. Arrow keys move between tabs.
SG-07Reading the snapshot, part by part.
Checklist · stat tiles · grades · category tableD4 · Build checklist
Ring 16 · stroke 2 · gap 3 · row gap 1216Reading your website
Pulling your live ads and your competitors’
Writing your snapshot
No Facebook page: comparing you with businesses like yours nearby
Facebook page: not found
Building your snapshot 4
Reading your website
Finding your Facebook page
Pulling your live ads and your competitors’
Writing your snapshot
- 1One moving thing. Only the working step gets the bar and its percentage (ink-3, 8.72:1). The arc is decoration at 2.87:1; the number is the information.
- 2Shape changes with state: fill, open arc, ring, so colour is never the only cue. Done fills
--signal-greeninside a 3 px gap, drawn with padding, not a shadow. - 3Steps change words, not order. A missing page rewrites its row and the snapshot carries on.
- 4Announced as a live region, “Building your snapshot”; the bar is a
progressbarwith its value.
D5 · Stat tiles
Number, then what it counts · R 16Composed Four across in the snapshot header
- 1Paper tile, R 16, 18 padding. Geist 300 number at
--fs-h3, 32 at 1440; 14 px label 8 below in mute (5.56 on paper). Two across on a phone, four on desktop; the instant snapshot sets number and label on one line from 700 px. - 2A zero is a finding, not an error. It stays in the row and the headline explains it. No data at all prints an en dash.
- 3Yellow is review only. An untraced number can’t be approved, so this state never reaches a prospect.
D6 · Grade chips
A to F · three lights · R 10Meta ads (Facebook + Instagram): grade A
6 of 6 of our standard
- Running Meta ads now
12 live ads.
- At least 3 ads in rotation
You run 12. With 3 or more, there’s always a second message to compare.
- A new ad in the last 30 days
10 new in the last 30 days; newest is 3 days old.
Graded against our standard: at least 3 ads in rotation, a new one every 30 days, and AI assistants that can read you and name you. A means every check passes; F, fewer than 40%.
- 1Ink letter on the tint, 1 px border in the light’s colour. 26 square, R 10, Geist 500 15: normal text, so it needs 4.5:1. Ink on the green tint is 14.23:1; white on
--signal-greenwould be 4.25:1, so it is never used. - 2The chip opens its checks in a dialog (R 22, a 44 close) that states the standard. A passed check’s ✓ is a
--signal-greenmark; a missed one is an--accent-ink✕. E is skipped: the scale goes D to F. - 3Never orange. Orange means action. A grade is only ever green, yellow or red.
D7 · Category table
You against your categoryYour category this month
New ads in the last 30 days, and the mix of ads running now.
| Brand | New, 30 days 2 | Active | Video | Multi | Image |
|---|---|---|---|---|---|
| Sample Burger Co. You | 10 | 12 | 5 | 5 | 2 |
| Competitor E | 0 | 3 | 0 | 1 | 2 |
| Competitor J | 0 | 0 | 0 | 0 | 0 |
Meta ads grade A–BCD–Fon the same six checks as yours
- 1Your row on
--hover, with the YOU tag (mono 11, the floor, R 10). Secondary text in that row is ink-3: mute would be 4.10:1 there. - 2One bar, 10 high, R 999, scaled to the biggest new-ad count. Ink for you,
--hair-2for the rest; the number sits beside it, so the bar is never the only cue. - 3Mono 11 heads over a 1 px ink rule; numbers right-aligned and tabular. Phones fold Video · Multi · Image into one line under the name.
SG-08Fixes first, then the ads that make them.
New ads · picker · fix list · offerD8 · New ad cards and picker
4:5 previews · all three start pickedNew ads we made for you
From your own site, photos and lines. Watermarked previews: $99 an ad. All 3 are picked: tap one to leave it out.
Image ad, in feed (4:5) and Stories (9:16) sizes
✓ SelectedAnswers fix 02: Name the dish in the first line.
✓ SelectedImage ad, in feed (4:5) and Stories (9:16) sizes
Select ad B3Ad B2
Picker footer Count and price move together
Don’t like any of these? Tell us what you have in mind and we’ll make custom ads for you. Ask for custom ads →
- 1Caption says why the ad exists: the fix it answers, or its format and sizes. 14 px ink-3.
- 2Left out: the preview goes gray and the toggle returns to outline, “Select ad B3”.
- 3Making: each frame on
--hoverfills with--accent-tintfrom the bottom and names the step; the ad appears in place when it’s drawn. - 4The total follows the picks: $99 an ad, 3 ads $297. At zero the pill reads “Buy these ads” and can’t be pressed.
D9 · Fix list and offer banner
Three fixes · one offer · one cross-sellThree fixes before the holidays 4
Lead one ad with a line from your own site. None of your live ads use it yet.
Name the dish in the first line. Put it before the offer, so the food is what people read.
Retire your oldest live ad once a new one runs. Keep three or more in rotation.
Want to see how another competitor shows up? Our Local AI visibility audit asks up to 10 questions of your own, about the competitors you pick, and shows which businesses AI assistants name and what to change. See Local AI visibility →
3- 1Mono 14 number in accent-ink over a 1 px ink rule. Bold the change, then one line of why. Three, never more.
- 2The one filled orange surface.
--accent-tint, ink text 13.34:1, straight after the fixes; the rust pill (hover--ink) is the heavy placement of the page’s single action. - 3Cross-sell under the category table: bold question, plain answer, a link, no second button.
- 4Fix text is the brand’s own data; these three are sample lines for Sample Burger Co.
SG-09Every dead end, its own screen.
What happened · why · one next stepE3 · Dead-end screens
Four ways a snapshot can’t finishThe Meta snapshot reads your live Facebook and Instagram ads, so it needs a website or a Facebook page.
Get my free snapshotReading your website
Facebook page: not found
We couldn’t find your Facebook page. 1
No problem: we’ll compare you with businesses like yours nearby. If you do have a page, add it and we’ll use it.
Meta ads snapshot for Sample Burger Co.
Your live ads
No live Meta ads right now: nothing in Meta’s public Ad Library for your page at 1:20 PM. 3
Buy your new adsPulling your live ads and your competitors’
Want more snapshots?
That’s 3 snapshots today from here. Leave your email and we’ll run more for you, or check back tomorrow.
1 Anatomy. One sentence on what happened, one on why, one control. The control always moves forward: the other field, carry on without, the new ads, or email.
2 Reuse. Dead ends are built only from the parts on SG-06 and SG-07: the field, the quiet chip, the failed ring, the empty slot, the inline Send.
3 Tone. Plain and specific: “We couldn’t find your Facebook page.” No account asked for, and no new ads promised that weren’t made.
SG-10The studio speaks as “we”, and shows its working.
Three rules · say and notDetail H · Voice
Quotes are the live page’s own linesWe made new ads from your own photos and lines.The offer banner, SG-08 · D9
Leave your email and we’ll write to you about your results. We use it for nothing else.The follow-up field, SG-06 · D2
You run 12. With 3 or more, there’s always a second message to compare.The checks dialog, SG-07 · D6