design-recipe — the distilled craft playbook (read on EVERY build)
This is the short, always-read version of design-taste-frontend.md. Follow it as
written; open the full playbook only where this file explicitly defers to it. Every
rule here exists because the default LLM output violates it.
1. Typography
- Display:
text-4xl md:text-6xl tracking-tighter leading-noneas the base scale.text-6xl md:text-7xlONLY when the headline is 3-5 words. A 4-line hero headline is a font-size error, not a copy-length error. - Body:
text-base leading-relaxed max-w-[65ch]. - Fonts: pick from these pairings —
Geist+Geist Mono,Satoshi+JetBrains Mono,Cabinet Grotesk+Inter Tight,Outfit+IBM Plex Mono,GT Walsheim/PP Neue Montreal+ a mono. Inter as display is banned unless the brief explicitly wants neutral/Linear/public-sector. - Serif is very discouraged as default. "Creative/premium brief = serif" is the
most-tested AI tell. Serif ONLY when the brief names one, or the brand is
genuinely editorial/luxury/heritage AND you write the justification into the
design brief.
FrauncesandInstrument Serifare banned as defaults. "Heritage" means an actual editorial/luxury/legacy institution — a business being a few years old ("est. 2015") or in a traditional trade (barber, bakery, tailor) does NOT qualify by itself; those default to sans like everything else. - Emphasis inside a headline: italic or bold of the SAME family. Never inject a serif word into a sans headline for "visual interest."
- Italic display words with descenders (
y g j p q):leading-[1.1]minimum +pb-1reserve, or the descender clips.
2. Color
- Exactly ONE accent color, saturation < 80% by default, locked page-wide. A rose-accented site does not get a teal badge in the footer.
- Neutral base (zinc/slate/stone family — pick warm OR cool, never both), no pure
#000000(use off-black/zinc-950), no neon glows, no AI-purple gradient slop. - Banned default palette families (gate-checked; overridable only by the
user's explicit brand colors): (1) graphite/near-black + orange/amber/ember
accent (
#ff5c1a #ff6b35 #e8590c #f97316 #ea580c #d9480fon#0a0a0a-family grounds — the single most common AI reach for "bold/technical"), (2) near-black + neon cyan/blue/green accent (#00e5ff #22d3ee #00ff88 #4ade80 #3b82f6-glow on dark), (3) the beige+brass family below, (4) AI purple/violet glow (#8b5cf6 #a855f7 #7c3aedgradients), (5) whatever palette family your PREVIOUS build in this chat used — consecutive builds must not share a palette family. - Premium-consumer palette ban: for cookware/wellness/artisan/luxury/DTC
briefs, the beige-cream + brass/clay/oxblood + espresso family is BANNED as the
default reach. Banned default hexes: backgrounds
#f5f1ea #f7f5f1 #fbf8f1 #efeae0 #ece6db #faf7f1 #e8dfcb; accents#b08947 #b6553a #9a2436 #9c6e2a #bc7c3a #7d5621; text#1a1714 #1a1814 #1b1814. Rotate instead: Cold Luxury (silver/chrome/smoke), Forest (deep green + bone + amber), Black & Tan, Cobalt + Cream, Terracotta + Slate, Olive + Brick + Paper, or monochrome + one saturated pop. Beige+brass is allowed only when the brief literally names those colors. This rotation list is examples, not a menu: don't default to the first item (Forest + amber is over-picked and heading toward becoming the new AI tell). Derive the palette from the brief's actual material world first; reach for the list only to escape a banned family. - One theme per page. Dark page = ALL sections dark. No warm-paper section sandwiched into a zinc-950 page. Tint-shifts within the family are fine.
3. Hero discipline (hard rules)
- Hero fits the initial viewport: headline max 2 lines desktop, subtext max 20
words / 3-4 lines, CTA visible without scrolling. Top padding cap
pt-24. - Max 4 text elements: (0-1) eyebrow OR brand strip, (1) headline, (1) subtext,
(1) CTA row (1 primary + max 1 secondary). BANNED inside the hero: tagline under
the CTAs, trust micro-strip, pricing teaser, feature bullets, avatar rows,
version labels (
BETA,v2.0), "Brand · No. 01" micro-meta. Logo walls go in their own section BELOW the hero. - The hero needs a real visual (the Phase 1 generated asset). Text + gradient blob is a placeholder, not a hero. Div-built fake product UI (fake task list, fake terminal, fake dashboard) is the #1 LLM tell — use a real screenshot, generated image, real component preview, or nothing.
- Anti-center bias: unless the brief is editorial/manifesto, prefer split 50/50, left-content/right-asset, or asymmetric composition over the centered stack.
4. Layout rules (page-wide)
- Section-layout-repetition ban: each layout family (3-col cards, split text+image, full-width quote, bento…) appears at most ONCE per page; 6+ sections need ≥4 distinct families. Max 2 consecutive image/text zigzag splits.
- Eyebrow ration: max 1 eyebrow per 3 sections (hero counts). Mechanical check:
count
uppercase trackinglabels; if count > ceil(sections/3), fail. Prefer dropping the eyebrow — the headline alone is enough. - No 3-column equal feature cards (the generic identical-trio row). Use 2-col zigzag (≤2 in a row), asymmetric grid, or horizontal scroll.
- Bento: exactly as many cells as content items (no blank filler tiles), and 2-3 cells need real visual variation (image / brand gradient / pattern / tint) — not 6 white-on-white text cards.
- Split-header ban: "left giant headline + right floating small paragraph" as a section header is banned by default; stack vertically instead.
- Cards ONLY where elevation means hierarchy — otherwise
border-t,divide-y, or negative space. One corner-radius scale for the whole page (all-sharp OR all-soft 12-16px OR all-pill; mixed only with a written rule). - Nav: single line at desktop, height ≤80px.
- Mobile collapse declared explicitly per multi-column section — no "Tailwind handles it."
- Use
h-dvh/min-h-dvh, noth-screen(mobile URL-bar breakage).
5. Copy rules
- Headline ≤8 words; sub-paragraph ≤25 words; per section one visual OR one CTA.
- Em-dash (
—) and en-dash-as-separator (–) are COMPLETELY banned anywhere visible: headlines, body, quotes, captions, buttons. Use period, comma, colon, parentheses, or hyphen. Zero tolerance — one—on the page is a gate failure. - One label per CTA intent page-wide. "Get in touch" + "Contact us" + "Let's talk" on one page = fail; pick one and reuse it in nav/hero/footer.
- CTA text fits one line at desktop (≤3 words for primary).
- No filler verbs (Elevate / Seamless / Unleash / Next-Gen / Revolutionize), no
startup-slop names (Acme, Nexus, SmartFlow), no "Jane Doe" testimonials, no
fake-precise invented MARKETING stats (
92% faster,4.1× ROI,10k+ teams) unless labeled mock. Carve-out: invented PRODUCT FACTS (prices, spec values, batch counts, dimensions) are required content for a fictional-brand brochure — keep them plausible and internally consistent; the ban targets performance/social-proof claims, not catalog data. No performative-craftsman labels ("Field notes", "Quietly trusted by"), no section numbering (001 · Capabilities), no scroll cues ("Scroll to explore"), no locale/weather strips, no version footers on marketing pages, no pills/tags overlaid on photos, no decorative status dots. - Quotes: max 3 lines, real typographic quotes, attribution = name + role.
- Copy self-audit before ship: re-read every visible string; rewrite anything grammatically broken, referent-unclear, or "LLM trying to sound thoughtful." Plain functional copy beats cute copy.
6. Motion rules
- ONE signature/hero effect per page (from the design brief), plus motivated reveals. Before adding any animation, answer "what does this communicate?" (hierarchy / narrative / feedback / state). "It looked cool" = drop it.
- Spring physics (
type: "spring", stiffness: 100, damping: 20) over linear easing. Magnetic/cursor physics viauseMotionValue/useTransform, neveruseState. - Animate only
transform+opacityon the hot path. prefers-reduced-motionfallback on every animated element (mandatory).- No custom mouse cursors — EXCEPT spectacle tier, where the brief-mandated custom cursor is part of the tier contract. No infinite loops on informational sections.
- If motion can't be finished properly in scope, ship a clean static page instead of half-wired ScrollTriggers.
7. Interactive states & forms
- Implement full cycles, not just the happy state: skeleton loaders shaped like the final layout (no generic spinners), composed empty states, inline error states.
:activetactile feedback:-translate-y-[1px]orscale-[0.98].- Bespoke chrome: no site-wide shared button style. Each CTA from the
brief's inventory is its own component with its own interaction identity
(see
image-to-code.md). A page of identical pills is a gate failure. - Button contrast check: every button label ≥ WCAG AA against its own background (ghost buttons over photos need a scrim/stroke). White-on-white CTA is a gate failure.
- Forms: label ABOVE input, error BELOW, never placeholder-as-label; placeholder/ helper/focus states pass AA contrast.
8. Images & icons
- Priority: (1) generated bespoke assets (Phase 1 — always available in this environment, so picsum/stock is NOT an acceptable final state), (2) real brand URLs from the brief, (3) clearly-labeled TODO slots + tell the user.
- Even minimalist sites need 2-3 real images. Pure-text is incomplete, not minimal.
- Logo walls: real SVG marks (Simple Icons CDN /
simple-icons), logos ONLY (no category captions under each logo). Invented brands get an invented inline-SVG monogram, not a styled<span>. - Icons: generated set first. The site's visible icons come from the
Higgsfield-generated custom icon set (
asset-system.md§4) — one consistent stroke style in the brand palette. Library icons (Phosphor / Radix / Tabler; Lucide on request) are the fallback for dense functional UI (forms, tables, 20+ tiny glyphs). Never mix the two sets in one visual zone. No hand-rolled decorative SVG illustrations.
9. Where the full playbook still wins
Open design-taste-frontend.md for: the three dials + use-case presets (§1),
design-system briefs like "make it feel like Notion/Stripe" (§2), canonical
animation skeletons — sticky-stack, horizontal-pan, scroll-reveal (§5), dark-mode
token protocol (§8), the complete AI-tells list (§9), and the pattern vocabulary
(§10). When this recipe and the full playbook disagree, the recipe wins.