Legal / Advocatuur Design Polish Reference
Class-level workflow for refining Dutch legal/advocatuur websites to a premium standard. Use for Soleiman-like boutique law firm projects.
Two aesthetic paths are documented below — choose based on the client brief and reference inspiration:
Design Principles (shared)
- Empathy + Authority: warmth toward the client, sharpness toward the adversary
- Dark sophistication: deep navy/ink + champagne-gold accents
- Typography: editorial serif for display (Cormorant Garamond), clean sans for body (Manrope)
- No gavels/scales stock imagery; prefer real office context, desaturated photography
Path A: Classic Sharp Polish (default)
Harvey Specter / Suits aesthetic. Sharp confidence, structured and traditional premium.
| Token |
Value |
Usage |
| Navy |
#0f2644 |
Buttons, headings, brand |
| Deep ink |
#06111f |
Hero, footer, dark sections |
| Ivory |
#f5efe6 |
Backgrounds, light cards |
| Champagne |
#c9a76b |
Accents, thin rules, gold details |
| Charcoal |
#1a232e |
Body text |
| Button radius |
rounded-[4px] |
Sharp corners |
| Card radius |
rounded-[4px] |
Sharp corners |
| Shadows |
box-shadow present |
Structured card elevation |
Find/replace pattern
| Pattern |
From |
To |
| Navy |
#102b4e |
#0f2644 |
| Ink |
#071522 |
#06111f |
| Champagne |
#b9945d |
#c9a76b |
| Ivory |
#f7f2ea |
#f5efe6 |
| Button radius |
rounded-full on buttons |
rounded-[4px] |
| Card radius |
rounded-[5px] |
rounded-[4px] |
| Legal blue |
#184a78 |
#1a5276 |
| Muted text |
#43505b |
#3a4753 |
| Text muted |
#5c6873 |
#4f5d6a |
Path B: Mercury Premium Polish
Inspired by Mercury (refero.style/3172cd4d). "Authority through restraint" — lighter, airier, with extreme typography and minimal chrome.
| Token |
Value |
Usage |
| Navy deep |
#0a1628 |
Hero, footer, dark sections (not #06111f) |
| Navy card |
#0f2644 |
Section backgrounds |
| Champagne |
#d4b07a |
Single accent — CTA hover, icon accent only (not text, not borders) |
| Champagne subtle |
rgba(212, 176, 122, 0.2) |
Hover washes |
| Ivory |
#f4ede4 |
Light canvas |
| Ivory card |
#faf6f0 |
Card surface |
| Warm charcoal |
#2d3d4a |
Body text |
| Champagne wash |
rgba(212, 176, 122, 0.08) |
Subtle glow |
Typography
| Role |
Style |
| Hero display |
72px / weight 300 (font-light), tracking-[-0.04em] |
| Section heading |
56px / weight 400, tracking-[-0.03em] |
| Subheading label |
12px uppercase, track-[0.2em], font-bold |
| Body |
17px, leading-[1.7] |
| Font stack |
Cormorant Garamond (300/500/600/700) + Manrope (400/500/600/700) |
Buttons & radius
| Element |
Style |
| Primary CTA |
rounded-full (pill) |
| Secondary button |
rounded-full (pill) |
| Cards |
rounded-[4px] (keep sharp) |
| Input fields |
rounded-full |
| Tags/chips |
rounded-full |
Elevation
- No shadows on cards — use 1px borders (
border border-[#0f2644]/8) instead
- Card hover:
border-[#d4b07a]/20 + hover:bg-white (no translate)
- CTA: no shadow, let color speak
- Navy section: solid
bg-[#0a1628] instead of overlay
Section spacing
| Device |
Section padding |
Between sections |
| Mobile |
py-16 (64px) |
gap-12 |
| Tablet+ |
py-20 (80px) |
gap-16 |
| Desktop |
py-24 (96px) |
gap-20 |
Navigation
- Fade-out on scroll down, fade-in on scroll up (use
framer-motion with useScroll / useMotionValueEvent)
- Phone number as ghost button (
.border border-white/18) instead of plain text
- CTA in header is pill-shaped
Icons
- Replace Lucide static icons with Framer Motion animated SVG components for key spots (scale, heart, building, file, shield, phone, mail, check, arrow)
- If LottieFiles CDN blocks downloads (HTTP 403), do not fight it — use Framer Motion animated inline SVGs instead
- Lightweight: each icon adds ~0.5KB, no extra dependency, full color control, intersection-observer Pause/Play
Scroll progress bar
- Thin gold line (3px),
origin-left scaleX via useScroll + useSpring
- Color:
#d4b07a (single solid, not gradient)
Header fade-on-scroll pattern
const [hidden, setHidden] = useState(false);
const [atTop, setAtTop] = useState(true);
const { scrollY } = useScroll();
useMotionValueEvent(scrollY, "change", (latest) => {
const prev = scrollY.getPrevious();
setHidden(latest > 120 && latest > (prev ?? 0));
setAtTop(latest < 20);
});
<motion.header
animate={{ y: hidden ? -100 : 0, opacity: hidden ? 0 : 1 }}
transition={{ duration: 0.35, ease: "easeOut" }}
className={`... ${atTop ? "border-transparent bg-transparent" : "border-white/10 bg-[#0a1628]/90 backdrop-blur-2xl"}`}
>
Revision Workflow (shared)
- Research — Exa AI for premium legal design references (PaperStreet, Clio, Dan Gilroy, Mercury, PxlPeak intl + Onwaarts, iO Digital, Legalista NL)
- Visual audit — load live site in browser (Chrome DevTools MCP), screenshot,
vision_analyze with a specific prompt
- PRD first — document before/after, tokens, plan
- CSS tokens first — update globals.css
- Bulk replace via subagent — define ALL find/replace pairs in a structured list (color codes, radius tokens, button styles, shadow values), then dispatch a
delegate_task with file paths and list. The subagent runs every replacement in sequence. Verify with search_files afterward. Saves ~15-20 manual patch calls.
- Also update components: SiteHeader, ScrubHero, SiteFooter, TeamSection — these often have separate inline styles
- Build + preview deploy (
npm run build, then vercel --yes)
- Client review on preview URL
- Production push: GitHub auto-deploy (
git add && git commit && git push origin main) or manual vercel --prod --yes
- Verify production URL with
curl and optionally a screenshot
Research reference
Full Exa search results with URLs in references/legal-design-exa-research-2026-06.md
1---2name: legal-advocatuur-design-polish3description: Class-level workflow for refining Dutch legal/advocatuur websites to a premium standard. Two aesthetic paths: Classic Sharp (Harvey Specter / Suits) and Mercury Premium (light-weight + pill CTAs).4---56# Legal / Advocatuur Design Polish Reference78Class-level workflow for refining Dutch legal/advocatuur websites to a premium standard. Use for Soleiman-like boutique law firm projects.910Two aesthetic paths are documented below — choose based on the client brief and reference inspiration:1112## Design Principles (shared)1314- **Empathy + Authority**: warmth toward the client, sharpness toward the adversary15- **Dark sophistication**: deep navy/ink + champagne-gold accents16- **Typography**: editorial serif for display (Cormorant Garamond), clean sans for body (Manrope)17- **No gavels/scales** stock imagery; prefer real office context, desaturated photography1819---2021## Path A: Classic Sharp Polish (default)2223Harvey Specter / Suits aesthetic. Sharp confidence, structured and traditional premium.2425| Token | Value | Usage |26|-------|-------|-------|27| Navy | `#0f2644` | Buttons, headings, brand |28| Deep ink | `#06111f` | Hero, footer, dark sections |29| Ivory | `#f5efe6` | Backgrounds, light cards |30| Champagne | `#c9a76b` | Accents, thin rules, gold details |31| Charcoal | `#1a232e` | Body text |32| Button radius | `rounded-[4px]` | Sharp corners |33| Card radius | `rounded-[4px]` | Sharp corners |34| Shadows | `box-shadow` present | Structured card elevation |3536### Find/replace pattern37| Pattern | From | To |38|---------|------|-----|39| Navy | `#102b4e` | `#0f2644` |40| Ink | `#071522` | `#06111f` |41| Champagne | `#b9945d` | `#c9a76b` |42| Ivory | `#f7f2ea` | `#f5efe6` |43| Button radius | `rounded-full` on buttons | `rounded-[4px]` |44| Card radius | `rounded-[5px]` | `rounded-[4px]` |45| Legal blue | `#184a78` | `#1a5276` |46| Muted text | `#43505b` | `#3a4753` |47| Text muted | `#5c6873` | `#4f5d6a` |4849---5051## Path B: Mercury Premium Polish5253Inspired by Mercury (refero.style/3172cd4d). "Authority through restraint" — lighter, airier, with extreme typography and minimal chrome.5455| Token | Value | Usage |56|-------|-------|-------|57| Navy deep | `#0a1628` | Hero, footer, dark sections (not `#06111f`) |58| Navy card | `#0f2644` | Section backgrounds |59| Champagne | `#d4b07a` | **Single accent** — CTA hover, icon accent only (not text, not borders) |60| Champagne subtle | `rgba(212, 176, 122, 0.2)` | Hover washes |61| Ivory | `#f4ede4` | Light canvas |62| Ivory card | `#faf6f0` | Card surface |63| Warm charcoal | `#2d3d4a` | Body text |64| Champagne wash | `rgba(212, 176, 122, 0.08)` | Subtle glow |6566### Typography67| Role | Style |68|------|-------|69| Hero display | **72px / weight 300** (font-light), `tracking-[-0.04em]` |70| Section heading | 56px / weight 400, `tracking-[-0.03em]` |71| Subheading label | 12px uppercase, `track-[0.2em]`, `font-bold` |72| Body | 17px, `leading-[1.7]` |73| Font stack | Cormorant Garamond (300/500/600/700) + Manrope (400/500/600/700) |7475### Buttons & radius76| Element | Style |77|---------|-------|78| Primary CTA | `rounded-full` (pill) |79| Secondary button | `rounded-full` (pill) |80| Cards | `rounded-[4px]` (keep sharp) |81| Input fields | `rounded-full` |82| Tags/chips | `rounded-full` |8384### Elevation85- **No shadows on cards** — use 1px borders (`border border-[#0f2644]/8`) instead86- Card hover: `border-[#d4b07a]/20` + `hover:bg-white` (no translate)87- CTA: no shadow, let color speak88- Navy section: solid `bg-[#0a1628]` instead of overlay8990### Section spacing91| Device | Section padding | Between sections |92|--------|----------------|-----------------|93| Mobile | `py-16` (64px) | `gap-12` |94| Tablet+ | `py-20` (80px) | `gap-16` |95| Desktop | `py-24` (96px) | `gap-20` |9697### Navigation98- Fade-out on scroll down, fade-in on scroll up (use `framer-motion` with `useScroll` / `useMotionValueEvent`)99- Phone number as ghost button (`.border border-white/18`) instead of plain text100- CTA in header is pill-shaped101102### Icons103- Replace Lucide static icons with Framer Motion animated SVG components for key spots (scale, heart, building, file, shield, phone, mail, check, arrow)104- If LottieFiles CDN blocks downloads (HTTP 403), do not fight it — use Framer Motion animated inline SVGs instead105- Lightweight: each icon adds ~0.5KB, no extra dependency, full color control, intersection-observer Pause/Play106107### Scroll progress bar108- Thin gold line (3px), `origin-left scaleX` via `useScroll` + `useSpring`109- Color: `#d4b07a` (single solid, not gradient)110111### Header fade-on-scroll pattern112```tsx113const [hidden, setHidden] = useState(false);114const [atTop, setAtTop] = useState(true);115const { scrollY } = useScroll();116117useMotionValueEvent(scrollY, "change", (latest) => {118 const prev = scrollY.getPrevious();119 setHidden(latest > 120 && latest > (prev ?? 0));120 setAtTop(latest < 20);121});122123<motion.header124 animate={{ y: hidden ? -100 : 0, opacity: hidden ? 0 : 1 }}125 transition={{ duration: 0.35, ease: "easeOut" }}126 className={`... ${atTop ? "border-transparent bg-transparent" : "border-white/10 bg-[#0a1628]/90 backdrop-blur-2xl"}`}127>128```129130---131132## Revision Workflow (shared)1331341. **Research** — Exa AI for premium legal design references (PaperStreet, Clio, Dan Gilroy, Mercury, PxlPeak intl + Onwaarts, iO Digital, Legalista NL)1352. **Visual audit** — load live site in browser (Chrome DevTools MCP), screenshot, `vision_analyze` with a specific prompt1363. **PRD first** — document before/after, tokens, plan1374. **CSS tokens first** — update globals.css1385. **Bulk replace via subagent** — define ALL find/replace pairs in a structured list (color codes, radius tokens, button styles, shadow values), then dispatch a `delegate_task` with file paths and list. The subagent runs every replacement in sequence. Verify with `search_files` afterward. Saves ~15-20 manual patch calls.1396. **Also update components**: SiteHeader, ScrubHero, SiteFooter, TeamSection — these often have separate inline styles1407. **Build + preview deploy** (`npm run build`, then `vercel --yes`)1418. **Client review** on preview URL1429. **Production push**: GitHub auto-deploy (`git add && git commit && git push origin main`) or manual `vercel --prod --yes`14310. **Verify production URL** with `curl` and optionally a screenshot144145## Research reference146Full Exa search results with URLs in `references/legal-design-exa-research-2026-06.md`