Warm Editorial — sections
The last chapter of the page, inverted so it reads as an ending. A display-size sign-off, three link columns, and a bottom rule carrying the legal text.
Paste this into Claude, Cursor or Copilot — or point the agent at
https://ui-deploy.com/r/warm-editorial/footer/prompt.md
# Editorial Footer — Warm Editorial
Paste this whole file into Claude, Cursor or Copilot.
---
## What to build
The closing chapter of the page, on an **inverted surface** so it reads as an
ending rather than as one more section.
Two columns on top: a display-size sign-off with a pill CTA on the left, three
link columns on the right. Below them a hairline rule carrying the copyright and
the legal links. Top corners rounded 28px; the bottom runs to the page edge.
---
## Tokens
```css
:root{
--accent:#A38A6A;
--invert-bg:#151210; --invert-bg2:#1E1A17; --invert-border:#2E2822;
--invert-text:#EDE7DD; --invert-text2:#A79E92; --invert-text3:#8A8177;
--radius:28px; --radius-pill:999px;
--font-display:'Inter Tight',system-ui,sans-serif;
--font-body:'Inter',system-ui,sans-serif;
--ease:cubic-bezier(.22,.61,.36,1);
}
[data-theme="dark"]{
--accent:#B39B7C;
/* In dark mode the footer LIFTS one step. It does not flip to cream. */
--invert-bg:#1E1A17; --invert-bg2:#262119; --invert-border:#40382F;
--invert-text:#EDE7DD; --invert-text2:#A79E92; --invert-text3:#8A8177;
}
```
---
## Rules — these are not preferences
1. **Redefine the tokens locally, do not restyle the children.**
```css
.we-footer{ --bg:var(--invert-bg); --text:var(--invert-text); /* … */ }
```
Every element inside then works unchanged. Overriding each child's colour by
hand is how inverted sections drift out of sync with the rest of the theme.
2. **In dark mode the footer does not become cream.** It lifts one step to
`#1E1A17`. A cream band at the bottom of a dark page is a flashbang. This is
the same rule that governs the featured pricing card and `.chapter-invert`.
3. **The sign-off ends with a full stop** and stays under ~16ch so it wraps into
two or three strong lines.
4. **Contact entries are real `mailto:` and `tel:` links**, not plain text.
5. **Each link column is a `<nav>` with its own `aria-label`.** Three unlabelled
navs in a row are useless to a screen reader.
6. **Link text needs `overflow-wrap:anywhere`** — an email address will otherwise
push its column wider than the grid at 320px.
7. Section rhythm: the footer is always the last block, and it is always inverted.
Never place two inverted sections back to back.
8. `:focus-visible` sets `outline` only.
---
## Reference implementation
See `code.html`. No JavaScript.
Paste this whole file into Claude, Cursor or Copilot.
The closing chapter of the page, on an inverted surface so it reads as an ending rather than as one more section.
Two columns on top: a display-size sign-off with a pill CTA on the left, three link columns on the right. Below them a hairline rule carrying the copyright and the legal links. Top corners rounded 28px; the bottom runs to the page edge.
:root{
--accent:#A38A6A;
--invert-bg:#151210; --invert-bg2:#1E1A17; --invert-border:#2E2822;
--invert-text:#EDE7DD; --invert-text2:#A79E92; --invert-text3:#8A8177;
--radius:28px; --radius-pill:999px;
--font-display:'Inter Tight',system-ui,sans-serif;
--font-body:'Inter',system-ui,sans-serif;
--ease:cubic-bezier(.22,.61,.36,1);
}
[data-theme="dark"]{
--accent:#B39B7C;
/* In dark mode the footer LIFTS one step. It does not flip to cream. */
--invert-bg:#1E1A17; --invert-bg2:#262119; --invert-border:#40382F;
--invert-text:#EDE7DD; --invert-text2:#A79E92; --invert-text3:#8A8177;
}
#1E1A17. A cream band at the bottom of a dark page is a flashbang. This is the same rule that governs the featured pricing card and .chapter-invert.mailto: and tel: links, not plain text.<nav> with its own aria-label. Three unlabelled navs in a row are useless to a screen reader.overflow-wrap:anywhere — an email address will otherwise push its column wider than the grid at 320px.:focus-visible sets outline only.See code.html. No JavaScript.
<!-- Warm Editorial — Editorial footer
Requires tokens.css. Inverted so the page reads as ended. -->
<footer class="we-footer">
<div class="we-footer-in">
<div class="we-footer-top">
<div class="we-footer-sign">
<p class="we-footer-eyebrow"><span aria-hidden="true"></span>Get in touch</p>
<p class="we-footer-say">Come in, or write first. Either works.</p>
<a class="we-footer-cta" href="#book">
Book a visit
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M5 12h14"/><path d="M13 6l6 6-6 6"/>
</svg>
</a>
</div>
<div class="we-footer-cols">
<nav class="we-footer-col" aria-label="Studio">
<p class="we-footer-h">Studio</p>
<a href="#approach">Approach</a>
<a href="#services">Services</a>
<a href="#team">Practitioners</a>
<a href="#journal">Journal</a>
</nav>
<nav class="we-footer-col" aria-label="Visit">
<p class="we-footer-h">Visit</p>
<a href="#hours">Opening hours</a>
<a href="#rates">Rates</a>
<a href="#faq">Questions</a>
<a href="#access">Accessibility</a>
</nav>
<div class="we-footer-col">
<p class="we-footer-h">Contact</p>
<a href="mailto:hello@example.com">hello@example.com</a>
<a href="tel:+441234567890">+44 1234 567 890</a>
<p class="we-footer-addr">14 Fairholt Street<br>London SW7 1EG</p>
</div>
</div>
</div>
<div class="we-footer-bottom">
<p>© 2026 Atelier Recovery Studio</p>
<div class="we-footer-legal">
<a href="#privacy">Privacy</a>
<a href="#terms">Terms</a>
</div>
</div>
</div>
</footer>
<style>
/* The footer redefines the tokens locally, so nothing inside needs to know
it is on an inverted surface. */
.we-footer{
--bg:var(--invert-bg);
--bg2:var(--invert-bg2);
--border:var(--invert-border);
--text:var(--invert-text);
--text2:var(--invert-text2);
--text3:var(--invert-text3);
background:var(--bg);color:var(--text);
border-radius:var(--radius) var(--radius) 0 0;
}
.we-footer-in{max-width:76rem;margin:0 auto;padding:64px 20px 28px}
.we-footer-top{
display:grid;gap:48px;
grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);
padding-bottom:48px;
}
.we-footer-eyebrow{
display:flex;align-items:center;gap:7px;margin:0 0 16px;
font-family:var(--font-display);font-size:11.5px;font-weight:600;
letter-spacing:.16em;text-transform:uppercase;color:var(--text3);
}
.we-footer-eyebrow span{width:5px;height:5px;border-radius:50%;background:var(--accent);flex:0 0 5px}
/* Display sign-off — ends with a full stop, like every display line here. */
.we-footer-say{
font-family:var(--font-display);font-weight:600;
font-size:clamp(26px,3.4vw,42px);line-height:1.05;letter-spacing:-.03em;
color:var(--text);margin:0 0 28px;max-width:16ch;
}
.we-footer-cta{
display:inline-flex;align-items:center;gap:8px;height:48px;padding:0 22px;
border-radius:var(--radius-pill);background:var(--text);color:var(--bg);
font-family:var(--font-body);font-size:14px;font-weight:500;text-decoration:none;
transition:opacity .2s var(--ease);
}
.we-footer-cta svg{width:16px;height:16px}
.we-footer-cta:hover{opacity:.85}
.we-footer-cols{
display:grid;gap:32px;
grid-template-columns:repeat(auto-fit,minmax(min(100%,140px),1fr));
}
.we-footer-col{display:flex;flex-direction:column;gap:11px;min-width:0}
.we-footer-h{
margin:0 0 5px;font-family:var(--font-display);font-size:11px;font-weight:600;
letter-spacing:.16em;text-transform:uppercase;color:var(--text3);
}
.we-footer-col a{
font-family:var(--font-body);font-size:14px;color:var(--text2);
text-decoration:none;overflow-wrap:anywhere;
transition:color .2s var(--ease);
}
.we-footer-col a:hover{color:var(--text)}
.we-footer-addr{margin:0;font-size:14px;line-height:1.6;color:var(--text2)}
.we-footer-bottom{
display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
gap:12px 24px;padding-top:24px;border-top:1px solid var(--border);
}
.we-footer-bottom p{margin:0;font-size:12.5px;color:var(--text3)}
.we-footer-legal{display:flex;gap:20px}
.we-footer-legal a{font-size:12.5px;color:var(--text3);text-decoration:none}
.we-footer-legal a:hover{color:var(--text2)}
.we-footer a:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
@media (max-width:760px){
.we-footer-top{grid-template-columns:minmax(0,1fr);gap:40px}
.we-footer-in{padding:48px 20px 24px}
}
@media (prefers-reduced-motion:reduce){.we-footer *{transition:none}}
</style>
Needs tokens.css on the page.