Warm Editorial — sections
The gradient is anchored to the copy in the lower left instead of darkening the whole frame. The photograph keeps its brightness, the text still clears contrast, and the buttons use the fixed photo variants rather than theme tokens.
Paste this into Claude, Cursor or Copilot — or point the agent at
https://ui-deploy.com/r/warm-editorial/hero-anchored/prompt.md
# Anchored Hero — Warm Editorial
Paste this whole file into Claude, Cursor or Copilot.
---
## What to build
A full-bleed photographic hero with the copy anchored bottom-left: eyebrow,
display headline, lead paragraph, two buttons.
The thing that makes it work is the gradient. It is **anchored to the text** —
opaque where the copy sits, fully transparent by 68% up the frame. The photograph
keeps its own brightness; only the part carrying words is darkened.
---
## Tokens
```css
:root{
--accent:#A38A6A;
--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; }
```
The hero sits on a photograph, so most of its colours are fixed rather than
themed. That is intentional — see rule 2.
---
## Rules — these are not preferences
1. **Anchor the gradient, never blanket the image.**
```css
background:linear-gradient(to top,
rgba(21,18,16,.88) 0%, rgba(21,18,16,.45) 32%, transparent 68%);
```
A flat `rgba(0,0,0,.5)` over the whole photo is the single most common way
this component gets ruined. For a centred hero, darken both ends and leave
the middle open instead.
2. **The buttons do not use theme tokens.** Fixed `#fff` / `#1B1613` and a
white-alpha outline. With `--text` the label turns bone-white in dark mode
and disappears against the white pill.
3. **The headline ends with a full stop.** `Restore your body with calm,
structured recovery.` — house style, deliberate.
4. **Scale the display type with `clamp()`**, not breakpoint jumps.
`clamp(36px, 6.4vw, 84px)`, line-height `.98`, tracking `-.035em`.
5. **Lead paragraph stops at ~58ch.**
6. **Corners are 28px** — the hero is a rounded panel inside the container, not
a bleed to the window edge.
7. Below 400px the buttons stack full width. Nothing scrolls horizontally at 320px.
8. Give the image real `alt` text and explicit dimensions.
---
## Reference implementation
See `code.html`. Replace the Unsplash URL with your own photograph — natural light,
warm white rooms, calm portraits. High-saturation or blue-toned images fight this
palette and will look wrong no matter how good the code is.
Paste this whole file into Claude, Cursor or Copilot.
A full-bleed photographic hero with the copy anchored bottom-left: eyebrow, display headline, lead paragraph, two buttons.
The thing that makes it work is the gradient. It is anchored to the text — opaque where the copy sits, fully transparent by 68% up the frame. The photograph keeps its own brightness; only the part carrying words is darkened.
:root{
--accent:#A38A6A;
--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; }
The hero sits on a photograph, so most of its colours are fixed rather than themed. That is intentional — see rule 2.
rgba(0,0,0,.5) over the whole photo is the single most common way this component gets ruined. For a centred hero, darken both ends and leave the middle open instead.#fff / #1B1613 and a white-alpha outline. With --text the label turns bone-white in dark mode and disappears against the white pill.clamp(), not breakpoint jumps. clamp(36px, 6.4vw, 84px), line-height .98, tracking -.035em.alt text and explicit dimensions.See code.html. Replace the Unsplash URL with your own photograph — natural light, warm white rooms, calm portraits. High-saturation or blue-toned images fight this palette and will look wrong no matter how good the code is.
<!-- Warm Editorial — Anchored hero
Requires tokens.css. The gradient is anchored to the text, not laid over
the whole photograph. -->
<section class="we-hero">
<img class="we-hero-img"
src="https://images.unsplash.com/photo-1600334089648-b0d9d3028eb2?w=1800&q=75"
alt="A treatment room filled with soft natural daylight" width="1800" height="1200">
<div class="we-hero-copy">
<p class="we-hero-eyebrow"><span aria-hidden="true"></span>01 — Nervous system downshift</p>
<h1 class="we-hero-title">Restore your body with calm, structured recovery.</h1>
<p class="we-hero-lead">
A studio built around one idea: recovery works when it is measured, repeatable
and unhurried. No noise, no upsell, no guesswork.
</p>
<div class="we-hero-actions">
<a class="we-hero-btn we-hero-btn-solid" 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>
<a class="we-hero-btn we-hero-btn-outline" href="#approach">Our approach</a>
</div>
</div>
</section>
<style>
.we-hero{
position:relative;isolation:isolate;overflow:hidden;
max-width:76rem;margin:0 auto;padding:0 20px;
border-radius:var(--radius);
min-height:clamp(440px,72vh,720px);
display:flex;align-items:flex-end;
}
.we-hero-img{
position:absolute;inset:0;z-index:-2;
width:100%;height:100%;object-fit:cover;
border-radius:var(--radius);
}
/* Anchored, not blanket. The gradient is opaque where the copy sits and fully
transparent by 68% up the frame, so the photograph keeps its own light. */
.we-hero::after{
content:'';position:absolute;inset:0;z-index:-1;
border-radius:var(--radius);
background:linear-gradient(to top,
rgba(21,18,16,.88) 0%,
rgba(21,18,16,.45) 32%,
transparent 68%);
}
.we-hero-copy{padding:40px;max-width:64ch}
.we-hero-eyebrow{
display:flex;align-items:center;gap:7px;margin:0 0 18px;
font-family:var(--font-display);font-size:11.5px;font-weight:600;
letter-spacing:.16em;text-transform:uppercase;color:#E3D6C2;
}
.we-hero-eyebrow span{
width:5px;height:5px;border-radius:50%;background:var(--accent);flex:0 0 5px;
}
/* Display headings in this language end with a full stop. It is the house
style, not a typo. */
.we-hero-title{
font-family:var(--font-display);font-weight:600;
font-size:clamp(36px,6.4vw,84px);line-height:.98;letter-spacing:-.035em;
color:#fff;margin:0 0 20px;
}
.we-hero-lead{
font-family:var(--font-body);font-size:clamp(15.5px,1.5vw,18px);line-height:1.65;
color:rgba(255,255,255,.82);margin:0 0 32px;max-width:58ch;
}
.we-hero-actions{display:flex;flex-wrap:wrap;gap:12px}
/* Fixed colours on purpose — theme tokens would turn the label bone-white in
dark mode and put white text on the white pill. */
.we-hero-btn{
display:inline-flex;align-items:center;justify-content:center;gap:8px;
height:50px;padding:0 24px;border:1px solid transparent;
border-radius:var(--radius-pill);
font-family:var(--font-body);font-size:14.5px;font-weight:500;line-height:1;
text-decoration:none;transition:background .2s var(--ease), border-color .2s var(--ease);
}
.we-hero-btn svg{width:16px;height:16px}
.we-hero-btn-solid{background:#fff;color:#1B1613}
.we-hero-btn-solid:hover{background:#F2ECE3}
.we-hero-btn-outline{border-color:rgba(255,255,255,.35);color:#fff}
.we-hero-btn-outline:hover{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.55)}
.we-hero-btn:focus-visible{outline:2px solid #fff;outline-offset:3px}
@media (max-width:768px){
.we-hero-copy{padding:28px 24px}
.we-hero{min-height:clamp(420px,80vh,620px)}
}
@media (max-width:400px){
.we-hero-actions{flex-direction:column;align-items:stretch}
.we-hero-btn{width:100%}
}
@media (prefers-reduced-motion:reduce){.we-hero-btn{transition:none}}
</style>
Needs tokens.css on the page.