Primary
The single ask. On a page that has one, there is no second filled button competing with it.
.btn
<div class="specrow">
<a class="btn" href="#">Request a consultation</a>
<button class="btn" type="button">Send the form</button>
</div>02 · Atoms
The parts that cannot be taken apart. Each one is rendered here by the site's own stylesheet — nothing on this page is drawn twice — so a specimen that looks wrong is a component that is wrong.
One filled button per page, and it is the thing the page is asking for. Everything else that is clickable is a link or a ghost. The filled button carries the brand's own glow; the ghost carries a hairline and nothing else.
The single ask. On a page that has one, there is no second filled button competing with it.
.btn
<div class="specrow">
<a class="btn" href="#">Request a consultation</a>
<button class="btn" type="button">Send the form</button>
</div>The secondary way out. Same height, same type, no fill and no shadow, so it never argues with the primary.
.btn.btn-ghost
Ordered ask-first. The ghost sits after the primary in the markup as well as on the page, so a keyboard meets them in the same order an eye does.
<div class="specrow">
<a class="btn" href="#">Request a consultation</a>
<a class="btn btn-ghost" href="#">Read about probate</a>
</div>
<p class="specnote">Ordered ask-first. The ghost sits after the primary in the markup as well as on the page, so a keyboard meets them in the same order an eye does.</p>Inside a hero the fill inverts: the button takes the paper and the ground keeps the green. Same class, different ground.
.hero .btn
<div class="hero" style="padding:2.5rem 0;border-bottom:0">
<div class="wrap">
<a class="btn" href="#">Request a consultation</a>
</div>
</div>Inside the intake card the button takes the card's whole width and grows to 62px, because it is the end of a form rather than an option in a row.
.intake .btn
<div class="intake" style="max-width:24rem">
<button class="btn" type="button">Request a consultation</button>
</div>A link is the brand colour and an underline. It is not a button, and the site never dresses one up as one.
The underline thickens on hover rather than appearing on it, so nothing shifts.
a
Most people arrive having meant to do this for a year. If that is you, book a first conversation or read what probate actually costs first.
<p>Most people arrive having meant to do this for a year. If that is you, <a href="#">book a first conversation</a> or read <a href="#">what probate actually costs</a> first.</p>The way out of a card or a row. The arrow moves 3px on hover, which is the only decoration the site allows itself.
.pcard-cta a .ros-cta a
<p class="ros-cta"><a href="#">Read more about Daniel<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h13M13 6l6 6-6 6"></path></svg></a></p>Set in the mono voice, because it is a piece of navigation rather than a sentence.
.postback .all-areas
<p class="all-areas"><a href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M19 12H6M11 18l-6-6 6-6"></path></svg>All practice areas</a></p>The first thing in the tab order on every page. Off screen until it is focused, then it is not subtle at all. Press Tab from the address bar to see it.
.skip
Shown here in its focused state on purpose. In the page it is positioned off screen by offset rather than hidden, so a screen reader still reaches it.
<a class="skip" href="#" style="position:static;left:auto;background:var(--bg);padding:.7rem 1rem;border:2px solid var(--focus);display:inline-block">Skip to content</a>
<p class="specnote">Shown here in its focused state on purpose. In the page it is positioned off screen by offset rather than hidden, so a screen reader still reaches it.</p>The mono voice does the labelling. If a piece of text is a fact rather than a sentence — a caption, a count, a phone number, a running number — it is set in IBM Plex Mono and it is letterspaced.
Sits above a heading and names the section. Uppercase, .16em, muted.
.eyebrow
Estate planning
<div>
<p class="eyebrow">Estate planning</p>
<h2 style="margin:0">A plan your family can actually use</h2>
</div>The same device one step smaller, used inside a section rather than above one.
.label
Eleven years of trust administration, described without naming anybody.
<div>
<span class="label">Selected matters</span>
<p style="margin:0">Eleven years of trust administration, described without naming anybody.</p>
</div>The two ranks of body text under the heading.
.lede .muted
What they want first is to be told plainly what they need, and what it costs to have it.
A second rank, still measured above 4.5 against the paper in both appearances.
<div>
<p class="lede">What they want first is to be told plainly what they need, and what it costs to have it.</p>
<p class="muted">A second rank, still measured above 4.5 against the paper in both appearances.</p>
</div>Counters and running numbers are set in the serif italic or the mono, never in the body sans, so a numeral reads as a numeral.
.ros-no .matter-n
01 / 04
03
<div class="specrow is-loose">
<div><span class="speclab">mono, in a roster row</span><p class="ros-no" style="margin:0">01 / 04</p></div>
<div><span class="speclab">serif, beside a matter</span><p class="matter-n" style="margin:0">03</p></div>
</div>A repeated call to action needs a unique name for a screen reader without gaining a visible one. Both of these are on the page right now.
.vh .hp
Request a consultation about estate planning — the parenthetical is in the markup and not on the screen.
The honeypot field uses the same idea for a different reason: .hp is moved off screen by offset and never by display:none, because a field that is not displayed is a field a bot knows to skip.
<p>Request a consultation<span class="vh"> about estate planning</span> — the parenthetical is in the markup and not on the screen.</p>
<p class="specnote">The honeypot field uses the same idea for a different reason: <code class="mono">.hp</code> is moved off screen by offset and never by <code class="mono">display:none</code>, because a field that is not displayed is a field a bot knows to skip.</p>A pill with a job. Three of them exist and they differ only in the ground they stand on: the archive filter on paper, the hero tag on a photograph, the practice tag on a dark hero.
Pressed and unpressed. It is a real button with aria-pressed, not a link pretending.
.chip
<div class="filterchips">
<button type="button" class="chip" aria-pressed="true">Everything</button>
<button type="button" class="chip" aria-pressed="false">Estate planning</button>
<button type="button" class="chip" aria-pressed="false">Probate</button>
<button type="button" class="chip" aria-pressed="false">Trust administration</button>
</div>On a photograph. Tinted out of the panel's own text colour rather than out of the brand, because the brand is not reliably legible on a moving image.
.herotag
A tag is either a link to the page that answers it or a plain label. With an href the whole pill is the target; without one it stays an li.
<div class="spec-dark-ground" style="background:var(--hero-ground);padding:1.5rem;border-radius:var(--radius-sm)">
<ul class="herotags" style="margin:0">
<li><a class="herotag" href="#">A first plan, at last</a></li>
<li><a class="herotag" href="#">A parent has died</a></li>
<li class="herotag">A new baby</li>
</ul>
</div>
<p class="specnote">A tag is either a link to the page that answers it or a plain label. With an href the whole pill is the target; without one it stays an <code class="mono">li</code>.</p>The same pill on an attorney hero, listing what that person actually does.
.aherotags
<div style="background:var(--hero-ground);padding:1.5rem;border-radius:var(--radius-sm)">
<ul class="aherotags" style="margin:0">
<li><a href="#">Trust design</a></li>
<li><a href="#">Family governance</a></li>
<li><a href="#">Probate</a></li>
</ul>
</div>Every field on the site is currently scoped to the intake card, so a specimen has to stand inside one. That scoping is a known limit and it is written down here rather than hidden: a field that is wanted anywhere else needs the selector lifted off .intake first.
A white well rather than a bordered box: no rule, a soft radius, a 1px inset shadow. 56px tall, which is a thumb.
.intake input[type=text]
<div class="intake" style="max-width:26rem">
<div class="field">
<label for="ds-name">Full name</label>
<input type="text" id="ds-name" name="name" value="Eleanor Vance">
</div>
<div class="field" style="margin-bottom:0">
<label for="ds-email">Email address</label>
<input type="email" id="ds-email" name="email" placeholder="you@example.com">
</div>
</div>The same well with our own arrow, so a long value never crowds the chevron. Nothing real is preselected, and the placeholder is styled as one.
.selectwrap .intake select
<div class="intake" style="max-width:26rem">
<div class="field" style="margin-bottom:0">
<label for="ds-reason">What brings you here</label>
<div class="selectwrap">
<select id="ds-reason" name="reason" required>
<option value="" disabled selected>Select one</option>
<option>Living trusts</option>
<option>Probate</option>
<option>Trust administration</option>
</select>
</div>
</div>
</div>Starts at 3.9rem — the old box forty percent shorter — and grows only if the person dragging it wants it to.
.intake textarea
<div class="intake" style="max-width:26rem">
<div class="field" style="margin-bottom:0">
<label for="ds-note">Anything you want us to know</label>
<textarea id="ds-note" name="note" rows="1"></textarea>
</div>
</div>Three pixels of the brand, offset by two, on everything focusable. Click into the field below and then press Tab.
:focus-visible --focus
Focus is never removed and never replaced with a colour change alone. The ring is drawn outside the element with outline-offset, so it survives on a filled control and on a transparent one.
<div class="intake" style="max-width:26rem">
<div class="field"><label for="ds-focus">Tab through these</label><input type="text" id="ds-focus"></div>
<div class="specrow"><a class="btn btn-ghost" href="#">A ghost</a><button type="button" class="chip" aria-pressed="false">A chip</button></div>
</div>
<p class="specnote">Focus is never removed and never replaced with a colour change alone. The ring is drawn outside the element with <code class="mono">outline-offset</code>, so it survives on a filled control and on a transparent one.</p>The site draws its own. Every icon is inline SVG on currentColor at 1.8 or 2 stroke, sized in ems so it grows with the text it sits in.
Set rather than drawn: two tspans in Literata, the first italic and semibold, the second regular and muted. It recolours with the appearance because it is text.
.wordmark .mark
The second form is the footer's, where the mark is a paragraph rather than a link and carries the brand square before it.
<div class="specrow is-loose">
<a class="mark" href="#" style="text-decoration:none"><svg class="wordmark" viewBox="0 0 220 28" role="img" aria-label="Wrenfield Estate Law" focusable="false"><text x="0" y="21" font-family="Literata,Georgia,serif" font-size="23"><tspan class="wm-1" font-style="italic" font-weight="600">Wrenfield</tspan><tspan class="wm-2" dx="8" font-weight="400">Estate Law</tspan></text></svg></a>
<p class="mark" style="margin:0"><span><b>Wrenfield</b> <i>Estate Law</i></span></p>
</div>
<p class="specnote">The second form is the footer's, where the mark is a paragraph rather than a link and carries the brand square before it.</p>Everything the site uses, at the size it uses it.
inline svg
<div class="specrow is-loose" style="color:var(--text)">
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg><span class="speclab" style="margin:0">chevron down</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6l6 6-6 6"></path></svg><span class="speclab" style="margin:0">chevron right</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h13M13 6l6 6-6 6"></path></svg><span class="speclab" style="margin:0">arrow right</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M3 6h18M3 12h18M3 18h18"></path></svg><span class="speclab" style="margin:0">bars</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M5 5l14 14M19 5L5 19"></path></svg><span class="speclab" style="margin:0">close</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4.2"></circle><path d="M12 2.4v2.6M12 19v2.6M4.2 4.2l1.9 1.9M17.9 17.9l1.9 1.9M2.4 12h2.6M19 12h2.6M4.2 19.8l1.9-1.9M17.9 6.1l1.9-1.9"></path></svg><span class="speclab" style="margin:0">sun</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.8A8.5 8.5 0 1 1 11.2 3a6.6 6.6 0 0 0 9.8 9.8z"></path></svg><span class="speclab" style="margin:0">moon</span></span>
<span style="display:grid;gap:.5rem;justify-items:center"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21s7-5.6 7-11a7 7 0 1 0-14 0c0 5.4 7 11 7 11z"></path><circle cx="12" cy="10" r="2.6"></circle></svg><span class="speclab" style="margin:0">pin</span></span>
</div>What a portrait slot holds until the photograph lands. Initials in the serif italic on the sunken ground, never an empty grey box and never a stock silhouette.
[data-monogram]
<div class="specrow is-loose">
<span class="whocard-media" data-monogram="DW" style="width:4.5rem;height:4.5rem"></span>
<span class="pcard-media" data-monogram="CO" style="width:9rem;max-width:9rem;margin:0"></span>
</div>The same honesty at the other sizes: a slot that has no picture yet holds its own frame and says so, so the grid never reflows when the pictures arrive.
.is-empty
<div class="specrow is-loose" style="align-items:stretch">
<span class="pa-thumb is-empty" style="width:7rem"></span>
<span class="postcard-media is-empty" style="width:14rem"></span>
</div>One drawn mark, on the confirmation page only. It draws itself in under half a second and holds still for anyone who has asked for less motion.
.thanks-mark
<p class="thanks-mark"><svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="24" cy="24" r="21"></circle><path d="M14 25l7 7 14-16"></path></svg></p>The site separates with a line far more often than with a box. There is one rule weight, and where a heavier one is wanted the same colour is used at 2px.
A hairline in --rule, a heavier one in --text for the top of a section.
--rule --rule-2
<div class="speccol">
<div><span class="speclab">1px --rule · between rows, under a bar, around a card</span><span style="display:block;height:1px;background:var(--rule)"></span></div>
<div><span class="speclab">1px --rule-2 · the quieter one, inside a panel</span><span style="display:block;height:1px;background:var(--rule-2)"></span></div>
<div><span class="speclab">2px --text · the top of a group, in the catalogue only</span><span style="display:block;height:2px;background:var(--text)"></span></div>
<div><span class="speclab">4px --accent · the top of a card</span><span style="display:block;height:4px;background:var(--accent)"></span></div>
</div>The checklist bullet: a .55rem circle in the brand, sitting on the cap height rather than centred, with a rule under every item.
.checklist
<ul class="checklist" style="margin-bottom:0">
<li>A revocable living trust, funded, with the house actually in it</li>
<li>A pour-over will, so nothing left out falls to intestacy</li>
<li>A durable power of attorney that a bank will accept</li>
</ul>