Open demo

CSS code

HTML
<div><span class="lbl">Oversized type with a rotating word that plays once</span>
<section class="ed ed-studio" aria-labelledby="ed-studio-title">
  <nav class="ed-nav" aria-label="Fold and Field">
    <a class="ed-logo" href="#">Fold & Field</a>
    <ul><li><a href="#">Work</a></li><li><a href="#">Studio</a></li><li><a href="#">Journal</a></li></ul>
    <a class="ed-cta" href="#">Start a project</a>
  </nav>
  <div class="ed-body">
    <h1 class="ed-big" id="ed-studio-title"><span>We shape</span><span class="ed-sr">brands, products and spaces</span><span class="ed-rot" aria-hidden="true"><span><span>brands</span><span>products</span><span>spaces</span><span>brands</span></span></span><span>people remember.</span></h1>
    <div class="ed-foot">
      <p>An independent design studio in Lisbon and Leeds. Since 2014 we have launched 140 brands for companies that would rather be remembered than merely noticed.</p>
      <div class="ed-links"><a class="ed-btn solid" href="#">Selected work <span aria-hidden="true">→</span></a><a class="ed-btn" href="#">Our process</a></div>
      <p class="ed-status"><i aria-hidden="true"></i>Booking from February 2027</p>
    </div>
  </div>
</section></div>

<div><span class="lbl">Serif headline with a line reveal and a pausable ticker</span>
<section class="ed ed-marrow" aria-labelledby="ed-marrow-title">
  <nav class="ed-nav" aria-label="Marrow">
    <a class="ed-logo" href="#">Marrow</a>
    <ul><li><a href="#">Projects</a></li><li><a href="#">Approach</a></li><li><a href="#">People</a></li></ul>
    <a class="ed-cta" href="#">Contact</a>
  </nav>
  <div class="ed-grid">
    <div>
      <p class="ed-kicker"><span>Brand studio</span><span>Est. 2011</span></p>
      <h2 class="ed-serif" id="ed-marrow-title"><span class="ed-line"><span>Quiet work</span></span><span class="ed-line"><span>for <em>loud</em></span></span><span class="ed-line"><span>markets.</span></span></h2>
      <p class="ed-lede">Marrow builds identities, packaging and websites for food, drink and hospitality brands that need to stand out on a crowded shelf without shouting.</p>
      <div class="ed-links"><a class="ed-btn solid" href="#">See the projects <span aria-hidden="true">→</span></a><a class="ed-btn" href="#">Read the approach</a></div>
    </div>
    <figure class="ed-fig">
      <img src="https://images.unsplash.com/photo-1518005020951-eccb494ad742?auto=format&fit=crop&w=900&q=80" alt="Curved white and blue facade of a modern building seen from below" width="900" height="1125">
      <figcaption><span>Harbour Line, wayfinding</span><span>2026</span></figcaption>
    </figure>
  </div>
  <div class="ed-ticker">
    <div class="ed-tape">
      <div class="ed-track">
        <ul aria-label="Services"><li>Brand strategy</li><li>Identity</li><li>Packaging</li><li>Websites</li><li>Motion</li><li>Editorial</li></ul>
        <ul aria-hidden="true"><li>Brand strategy</li><li>Identity</li><li>Packaging</li><li>Websites</li><li>Motion</li><li>Editorial</li></ul>
      </div>
    </div>
    <label class="ed-pause"><input type="checkbox">Pause<span class="ed-sr"> the services ticker</span></label>
  </div>
</section></div>
CSS
/* Editorial and agency heroes: oversized type with text that animates once on load.
   The rotating word plays through in under five seconds and stops; screen readers get the full sentence from
   visually hidden text. The service ticker loops, so it has a visible pause control. Under prefers-reduced-motion
   nothing moves: the first word shows, lines appear in place and the ticker becomes a static list. */
.ed{--ed-bg:#f4efe6;--ed-ink:#141210;--ed-muted:#4a443d;--ed-accent:#b42318;--ed-line:#d9cfc0;--ed-radius:28px;
  --ed-serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,serif;
  position:relative;overflow:hidden;border-radius:var(--ed-radius);background:var(--ed-bg);color:var(--ed-ink);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;line-height:1.5}
.ed :where(h1,h2,p,ul,figure,figcaption){margin:0;padding:0}
.ed a{color:inherit;text-decoration:none}
.ed :is(a,input):focus-visible{outline:3px solid var(--ed-accent);outline-offset:4px;border-radius:4px}
.ed-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.ed-nav{display:flex;align-items:center;gap:28px;padding:26px 40px;font-size:.94rem}
.ed-logo{font-weight:800;letter-spacing:-.02em;font-size:1.1rem}
.ed-nav ul{display:flex;gap:26px;margin-left:auto;list-style:none}
.ed-nav ul a{border-bottom:1px solid transparent}
.ed-nav ul a:hover{border-bottom-color:currentColor}
.ed-cta{padding:9px 18px;border-radius:999px;background:var(--ed-ink);color:var(--ed-bg);font-weight:700}
.ed .ed-cta{color:var(--ed-bg)}
/* 1. rotating word */
.ed-studio .ed-body{padding:40px 40px 48px}
.ed-big{font-size:clamp(3rem,9.6vw,8.4rem);line-height:.92;letter-spacing:-.055em;font-weight:800}
.ed-big > span{display:block}
.ed-rot{display:block;height:1.3em;margin:-.1em 0 -.08em;overflow:hidden;font-family:var(--ed-serif);font-style:italic;font-weight:500;letter-spacing:-.03em;color:var(--ed-accent);line-height:1.3}
.ed-rot span{display:block}
.ed-rot > span{animation:ed-rotate 4.6s cubic-bezier(.7,0,.3,1) .4s 1 both}
@keyframes ed-rotate{0%,18%{transform:translateY(0)}28%,46%{transform:translateY(-25%)}56%,74%{transform:translateY(-50%)}84%,100%{transform:translateY(-75%)}}
.ed-foot{display:grid;grid-template-columns:1fr 1fr auto;align-items:end;gap:32px;margin-top:48px;padding-top:28px;border-top:1px solid var(--ed-line)}
.ed-foot p{max-width:440px;font-size:1.06rem;color:var(--ed-muted)}
.ed-links{display:flex;flex-wrap:wrap;gap:12px}
.ed-btn{display:inline-flex;align-items:center;gap:10px;min-height:52px;padding:0 24px;border-radius:999px;font-weight:700;border:1.5px solid var(--ed-ink);transition:background-color .2s,color .2s}
.ed-btn.solid{background:var(--ed-ink);color:var(--ed-bg)}
.ed .ed-btn.solid{color:var(--ed-bg)}
.ed-btn.solid:hover{background:var(--ed-accent);border-color:var(--ed-accent)}
.ed-btn:not(.solid):hover{background:var(--ed-ink);color:var(--ed-bg)}
.ed-foot .ed-status{display:flex;color:var(--ed-ink);align-items:center;gap:10px;font-size:.88rem;font-weight:600;white-space:nowrap}
.ed-status i{width:10px;height:10px;border-radius:50%;background:#15803d;box-shadow:0 0 0 0 rgba(21,128,61,.5);animation:ed-pulse 1.6s ease-out 3}
@keyframes ed-pulse{to{box-shadow:0 0 0 12px rgba(21,128,61,0)}}
/* 2. line reveal + ticker */
.ed-marrow{--ed-bg:#ecebe4;--ed-ink:#1c1917;--ed-muted:#44403c;--ed-accent:#3f6212;--ed-line:#cfcdc2}
.ed-grid{display:grid;grid-template-columns:7fr 5fr;gap:40px;align-items:end;padding:28px 40px 44px}
.ed-kicker{display:flex;gap:14px;font-size:.8rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--ed-muted)}
.ed-kicker span + span::before{content:"/";margin-right:14px;color:var(--ed-line)}
.ed-serif{margin-top:22px;font-family:var(--ed-serif);font-size:clamp(2.9rem,7.2vw,6.2rem);line-height:.98;letter-spacing:-.035em;font-weight:500}
.ed-serif em{color:var(--ed-accent)}
.ed-line{display:block;overflow:hidden;padding-bottom:.06em}
.ed-line > span{display:block;animation:ed-up .9s cubic-bezier(.2,.7,.1,1) both}
.ed-line:nth-child(2) > span{animation-delay:.12s}
.ed-line:nth-child(3) > span{animation-delay:.24s}
@keyframes ed-up{from{transform:translateY(105%)}}
.ed-lede{margin-top:26px;max-width:470px;font-size:1.08rem;color:var(--ed-muted)}
.ed-marrow .ed-links{margin-top:30px}
.ed-marrow .ed-btn.solid:hover{background:var(--ed-accent);border-color:var(--ed-accent)}
.ed-fig img{display:block;width:100%;height:auto;aspect-ratio:4/5;object-fit:cover;border-radius:4px}
.ed-fig figcaption{display:flex;justify-content:space-between;gap:12px;margin-top:10px;font-size:.82rem;color:var(--ed-muted)}
.ed-ticker{position:relative;display:flex;align-items:center;border-top:1px solid var(--ed-line);background:var(--ed-ink);color:var(--ed-bg)}
.ed-tape{flex:1;min-width:0;overflow:hidden}
.ed-track{display:flex;width:max-content;animation:ed-scroll 28s linear infinite}
.ed-track ul{display:flex;list-style:none}
.ed-track li{padding:18px 0;font-family:var(--ed-serif);font-size:1.5rem;font-style:italic;white-space:nowrap}
.ed-track li::after{content:"✳";margin:0 26px;font-style:normal;font-size:1rem;vertical-align:middle;color:#bef264}
@keyframes ed-scroll{to{transform:translateX(-50%)}}
.ed-pause{display:flex;align-items:center;gap:8px;flex:none;align-self:stretch;padding:0 22px;border-left:1px solid #44403c;font-size:.82rem;font-weight:600;cursor:pointer}
.ed-pause input{width:16px;height:16px;margin:0;accent-color:#bef264}
.ed-pause input:focus-visible{outline-color:#bef264}
.ed-ticker:has(.ed-pause input:checked) .ed-track{animation-play-state:paused}
@media (max-width:767px){
  .ed-nav{padding:20px 22px}
  .ed-nav ul{display:none}
  .ed-cta{margin-left:auto}
  .ed-studio .ed-body{padding:24px 22px 32px}
  .ed-foot{grid-template-columns:1fr;align-items:start;gap:22px}
  .ed-grid{grid-template-columns:1fr;padding:20px 22px 32px}
  .ed-fig img{aspect-ratio:16/10}
  .ed-track li{font-size:1.2rem;padding:14px 0}
  .ed-pause{padding:0 14px}
}
@media (prefers-reduced-motion:reduce){
  .ed *{transition:none!important}
  .ed-rot > span,.ed-line > span,.ed-status i{animation:none}
  .ed-track{animation:none;width:auto}
  .ed-track ul{flex-wrap:wrap;padding:0 22px}
  .ed-track ul + ul,.ed-pause{display:none}
}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Oversized type with a rotating word that plays once</span>
<section class="ed ed-studio" aria-labelledby="ed-studio-title">
  <nav class="ed-nav d-flex align-items-center" aria-label="Fold and Field">
    <a class="ed-logo" href="#">Fold & Field</a>
    <ul class="nav ms-auto d-none d-md-flex"><li class="nav-item"><a class="nav-link" href="#">Work</a></li><li class="nav-item"><a class="nav-link" href="#">Studio</a></li><li class="nav-item"><a class="nav-link" href="#">Journal</a></li></ul>
    <a class="btn ed-btn solid ed-cta ms-auto ms-md-0" href="#">Start a project</a>
  </nav>
  <div class="ed-body">
    <h1 class="ed-big" id="ed-studio-title"><span>We shape</span><span class="visually-hidden">brands, products and spaces</span><span class="ed-rot" aria-hidden="true"><span><span>brands</span><span>products</span><span>spaces</span><span>brands</span></span></span><span>people remember.</span></h1>
    <div class="ed-foot row align-items-end">
      <div class="col-md"><p>An independent design studio in Lisbon and Leeds. Since 2014 we have launched 140 brands for companies that would rather be remembered than merely noticed.</p></div>
      <div class="col-md"><div class="ed-links d-flex flex-wrap"><a class="btn ed-btn solid" href="#">Selected work <span aria-hidden="true">→</span></a><a class="btn ed-btn" href="#">Our process</a></div></div>
      <div class="col-md-auto"><p class="ed-status d-flex align-items-center"><i aria-hidden="true"></i>Booking from February 2027</p></div>
    </div>
  </div>
</section></div>

<div><span class="lbl">Serif headline with a line reveal and a pausable ticker</span>
<section class="ed ed-marrow" aria-labelledby="ed-marrow-title">
  <nav class="ed-nav d-flex align-items-center" aria-label="Marrow">
    <a class="ed-logo" href="#">Marrow</a>
    <ul class="nav ms-auto d-none d-md-flex"><li class="nav-item"><a class="nav-link" href="#">Projects</a></li><li class="nav-item"><a class="nav-link" href="#">Approach</a></li><li class="nav-item"><a class="nav-link" href="#">People</a></li></ul>
    <a class="btn ed-btn solid ed-cta ms-auto ms-md-0" href="#">Contact</a>
  </nav>
  <div class="ed-grid row align-items-end">
    <div class="col-md-7">
      <p class="ed-kicker d-flex"><span>Brand studio</span><span>Est. 2011</span></p>
      <h2 class="ed-serif" id="ed-marrow-title"><span class="ed-line"><span>Quiet work</span></span><span class="ed-line"><span>for <em>loud</em></span></span><span class="ed-line"><span>markets.</span></span></h2>
      <p class="ed-lede">Marrow builds identities, packaging and websites for food, drink and hospitality brands that need to stand out on a crowded shelf without shouting.</p>
      <div class="ed-links d-flex flex-wrap"><a class="btn ed-btn solid" href="#">See the projects <span aria-hidden="true">→</span></a><a class="btn ed-btn" href="#">Read the approach</a></div>
    </div>
    <div class="col-md-5">
      <figure class="figure ed-fig d-block m-0">
        <img class="figure-img" src="https://images.unsplash.com/photo-1518005020951-eccb494ad742?auto=format&fit=crop&w=900&q=80" alt="Curved white and blue facade of a modern building seen from below" width="900" height="1125">
        <figcaption class="figure-caption d-flex justify-content-between"><span>Harbour Line, wayfinding</span><span>2026</span></figcaption>
      </figure>
    </div>
  </div>
  <div class="ed-ticker d-flex align-items-center">
    <div class="ed-tape">
      <div class="ed-track d-flex">
        <ul aria-label="Services"><li>Brand strategy</li><li>Identity</li><li>Packaging</li><li>Websites</li><li>Motion</li><li>Editorial</li></ul>
        <ul aria-hidden="true"><li>Brand strategy</li><li>Identity</li><li>Packaging</li><li>Websites</li><li>Motion</li><li>Editorial</li></ul>
      </div>
    </div>
    <label class="ed-pause d-flex align-items-center"><input class="form-check-input" type="checkbox">Pause<span class="visually-hidden"> the services ticker</span></label>
  </div>
</section></div>
CSS
/* Editorial and agency heroes in Bootstrap 5: .nav, .btn, the grid, .figure, .form-check-input and .visually-hidden.
   The rotating word plays once in under five seconds; the looping ticker has a visible pause checkbox; under
   prefers-reduced-motion nothing moves. */
.ed{--ed-bg:#f4efe6;--ed-ink:#141210;--ed-muted:#4a443d;--ed-accent:#b42318;--ed-line:#d9cfc0;--ed-radius:28px;
  --ed-serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,serif;
  overflow:hidden;border-radius:var(--ed-radius);background:var(--ed-bg);color:var(--ed-ink)}
.ed a{color:inherit;text-decoration:none}
.ed :is(a,.btn,.form-check-input):focus-visible{outline:3px solid var(--ed-accent);outline-offset:4px;box-shadow:none}
.ed-nav{gap:28px;padding:26px 40px;font-size:.94rem}
.ed-logo{font-weight:800;letter-spacing:-.02em;font-size:1.1rem}
.ed-nav .nav{--bs-nav-link-padding-x:13px;--bs-nav-link-padding-y:0;--bs-nav-link-font-size:.94rem;--bs-nav-link-color:var(--ed-ink);--bs-nav-link-hover-color:var(--ed-ink)}
.ed-nav .nav-link:hover{text-decoration:underline;text-underline-offset:4px}
.ed-btn{--bs-btn-padding-x:24px;--bs-btn-font-weight:700;--bs-btn-border-radius:999px;--bs-btn-border-width:1.5px;--bs-btn-color:var(--ed-ink);--bs-btn-border-color:var(--ed-ink);
  --bs-btn-hover-color:var(--ed-bg);--bs-btn-hover-bg:var(--ed-ink);--bs-btn-hover-border-color:var(--ed-ink);--bs-btn-active-color:var(--ed-bg);--bs-btn-active-bg:var(--ed-ink);--bs-btn-active-border-color:var(--ed-ink);
  display:inline-flex;align-items:center;gap:10px;min-height:52px;transition:background-color .2s,color .2s}
.ed-btn.solid{--bs-btn-color:var(--ed-bg);--bs-btn-bg:var(--ed-ink);--bs-btn-hover-bg:var(--ed-accent);--bs-btn-hover-border-color:var(--ed-accent);--bs-btn-active-bg:var(--ed-accent);--bs-btn-active-border-color:var(--ed-accent)}
.ed-btn.ed-cta{--bs-btn-padding-x:18px;--bs-btn-padding-y:9px;--bs-btn-font-size:.94rem;min-height:0}
.ed .ed-btn{color:var(--bs-btn-color)}
.ed .ed-btn:hover{color:var(--bs-btn-hover-color)}
.ed-studio .ed-body{padding:40px 40px 48px}
.ed-big{margin:0;font-size:clamp(3rem,9.6vw,8.4rem);line-height:.92;letter-spacing:-.055em;font-weight:800}
.ed-big > span{display:block}
.ed-rot{display:block;height:1.3em;margin:-.1em 0 -.08em;overflow:hidden;font-family:var(--ed-serif);font-style:italic;font-weight:500;letter-spacing:-.03em;color:var(--ed-accent);line-height:1.3}
.ed-rot span{display:block}
.ed-rot > span{animation:ed-rotate 4.6s cubic-bezier(.7,0,.3,1) .4s 1 both}
@keyframes ed-rotate{0%,18%{transform:translateY(0)}28%,46%{transform:translateY(-25%)}56%,74%{transform:translateY(-50%)}84%,100%{transform:translateY(-75%)}}
.ed-foot{--bs-gutter-x:32px;--bs-gutter-y:0;row-gap:22px;margin-top:48px;padding-top:28px;border-top:1px solid var(--ed-line)}
.ed-foot p{max-width:440px;margin:0;font-size:1.06rem;color:var(--ed-muted)}
.ed-links{gap:12px}
.ed .ed-status{gap:10px;font-size:.88rem;font-weight:600;white-space:nowrap;color:var(--ed-ink)}
.ed-status i{width:10px;height:10px;border-radius:50%;background:#15803d;animation:ed-pulse 1.6s ease-out 3}
@keyframes ed-pulse{from{box-shadow:0 0 0 0 rgba(21,128,61,.5)}to{box-shadow:0 0 0 12px rgba(21,128,61,0)}}
.ed-marrow{--ed-bg:#ecebe4;--ed-ink:#1c1917;--ed-muted:#44403c;--ed-accent:#3f6212;--ed-line:#cfcdc2}
.ed-grid{--bs-gutter-x:40px;--bs-gutter-y:0;row-gap:40px;padding:28px 20px 44px;margin:0}
.ed-kicker{gap:14px;margin:0;font-size:.8rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--ed-muted)}
.ed-kicker span + span::before{content:"/";margin-right:14px;color:var(--ed-line)}
.ed-serif{margin:22px 0 0;font-family:var(--ed-serif);font-size:clamp(2.9rem,7.2vw,6.2rem);line-height:.98;letter-spacing:-.035em;font-weight:500}
.ed-serif em{color:var(--ed-accent)}
.ed-line{display:block;overflow:hidden;padding-bottom:.06em}
.ed-line > span{display:block;animation:ed-up .9s cubic-bezier(.2,.7,.1,1) both}
.ed-line:nth-child(2) > span{animation-delay:.12s}
.ed-line:nth-child(3) > span{animation-delay:.24s}
@keyframes ed-up{from{transform:translateY(105%)}}
.ed-lede{margin:26px 0 0;max-width:470px;font-size:1.08rem;color:var(--ed-muted)}
.ed-marrow .ed-links{margin-top:30px}
.ed-marrow .ed-btn.solid{--bs-btn-hover-bg:var(--ed-accent);--bs-btn-hover-border-color:var(--ed-accent)}
.ed-fig .figure-img{width:100%;height:auto;aspect-ratio:4/5;object-fit:cover;border-radius:4px;margin-bottom:10px}
.ed-fig .figure-caption{gap:12px;font-size:.82rem;color:var(--ed-muted)}
.ed-ticker{border-top:1px solid var(--ed-line);background:var(--ed-ink);color:var(--ed-bg)}
.ed-tape{flex:1;min-width:0;overflow:hidden}
.ed-track{width:max-content;animation:ed-scroll 28s linear infinite}
.ed-track ul{display:flex;margin:0;padding:0;list-style:none}
.ed-track li{padding:18px 0;font-family:var(--ed-serif);font-size:1.5rem;font-style:italic;white-space:nowrap}
.ed-track li::after{content:"✳";margin:0 26px;font-style:normal;font-size:1rem;vertical-align:middle;color:#bef264}
@keyframes ed-scroll{to{transform:translateX(-50%)}}
.ed-pause{gap:8px;flex:none;align-self:stretch;margin:0;padding:0 22px;border-left:1px solid #44403c;font-size:.82rem;font-weight:600;cursor:pointer}
.ed-pause .form-check-input{width:16px;height:16px;margin:0;float:none;--bs-border-color:#a8a29e;background-color:transparent}
.ed-pause .form-check-input:checked{background-color:#bef264;border-color:#bef264;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%231c1917' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}
.ed-pause .form-check-input:focus-visible{outline-color:#bef264}
.ed-ticker:has(.ed-pause input:checked) .ed-track{animation-play-state:paused}
@media (max-width:767.98px){
  .ed-nav{padding:20px 22px}
  .ed-studio .ed-body{padding:24px 22px 32px}
  .ed-grid{--bs-gutter-x:0;padding:20px 22px 32px}
  .ed-fig .figure-img{aspect-ratio:16/10}
  .ed-track li{font-size:1.2rem;padding:14px 0}
  .ed-pause{padding:0 14px}
}
@media (prefers-reduced-motion:reduce){
  .ed *{transition:none!important}
  .ed-rot > span,.ed-line > span,.ed-status i{animation:none}
  .ed-track{animation:none;width:auto}
  .ed-track ul{flex-wrap:wrap;padding:0 22px}
  .ed-track ul + ul,.ed-pause{display:none!important}
}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#4b5567] uppercase">Oversized type with a rotating word that plays once</span>
<section class="overflow-hidden rounded-[28px] bg-[#f4efe6] leading-normal text-[#141210]" aria-labelledby="ed-studio-title">
  <nav class="flex items-center gap-7 px-[22px] py-5 text-[.94rem] md:px-10 md:py-[26px]" aria-label="Fold and Field">
    <a class="rounded text-[1.1rem] font-extrabold tracking-[-.02em] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318]" href="#">Fold & Field</a>
    <ul class="ml-auto hidden gap-[26px] md:flex"><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318]" href="#">Work</a></li><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318]" href="#">Studio</a></li><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318]" href="#">Journal</a></li></ul>
    <a class="ml-auto rounded-full bg-[#141210] px-[18px] py-[9px] font-bold text-[#f4efe6] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318] md:ml-0" href="#">Start a project</a>
  </nav>
  <div class="px-[22px] pt-6 pb-8 md:px-10 md:pt-10 md:pb-12">
    <h1 class="text-[clamp(3rem,9.6vw,8.4rem)] leading-[.92] font-extrabold tracking-[-.055em]" id="ed-studio-title"><span class="block">We shape</span><span class="sr-only">brands, products and spaces</span><span class="-mt-[.1em] -mb-[.08em] block h-[1.3em] overflow-hidden font-editorial leading-[1.3] font-medium tracking-[-.03em] text-[#b42318] italic" aria-hidden="true"><span class="block motion-safe:animate-rotate-words"><span class="block">brands</span><span class="block">products</span><span class="block">spaces</span><span class="block">brands</span></span></span><span class="block">people remember.</span></h1>
    <div class="mt-12 grid grid-cols-1 items-start gap-[22px] border-t border-[#d9cfc0] pt-7 md:grid-cols-[1fr_1fr_auto] md:items-end md:gap-8">
      <p class="max-w-[440px] text-[1.06rem] text-[#4a443d]">An independent design studio in Lisbon and Leeds. Since 2014 we have launched 140 brands for companies that would rather be remembered than merely noticed.</p>
      <div class="flex flex-wrap gap-3"><a class="inline-flex min-h-[52px] items-center gap-2.5 rounded-full border-[1.5px] border-[#141210] bg-[#141210] px-6 font-bold text-[#f4efe6] transition-[color,background-color,border-color,text-decoration-color] duration-200 hover:border-[#b42318] hover:bg-[#b42318] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318] motion-reduce:transition-none" href="#">Selected work <span aria-hidden="true">→</span></a><a class="inline-flex min-h-[52px] items-center gap-2.5 rounded-full border-[1.5px] border-[#141210] px-6 font-bold transition-[color,background-color,border-color,text-decoration-color] duration-200 hover:bg-[#141210] hover:text-[#f4efe6] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#b42318] motion-reduce:transition-none" href="#">Our process</a></div>
      <p class="flex items-center gap-2.5 text-[.88rem] font-semibold whitespace-nowrap"><i class="size-2.5 rounded-full bg-[#15803d] motion-safe:animate-status" aria-hidden="true"></i>Booking from February 2027</p>
    </div>
  </div>
</section></div>

<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#4b5567] uppercase">Serif headline with a line reveal and a pausable ticker</span>
<section class="overflow-hidden rounded-[28px] bg-[#ecebe4] leading-normal text-[#1c1917]" aria-labelledby="ed-marrow-title">
  <nav class="flex items-center gap-7 px-[22px] py-5 text-[.94rem] md:px-10 md:py-[26px]" aria-label="Marrow">
    <a class="rounded text-[1.1rem] font-extrabold tracking-[-.02em] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212]" href="#">Marrow</a>
    <ul class="ml-auto hidden gap-[26px] md:flex"><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212]" href="#">Projects</a></li><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212]" href="#">Approach</a></li><li><a class="rounded border-b border-transparent hover:border-current focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212]" href="#">People</a></li></ul>
    <a class="ml-auto rounded-full bg-[#1c1917] px-[18px] py-[9px] font-bold text-[#ecebe4] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212] md:ml-0" href="#">Contact</a>
  </nav>
  <div class="grid grid-cols-1 items-end gap-10 px-[22px] pt-5 pb-8 md:grid-cols-[7fr_5fr] md:px-10 md:pt-7 md:pb-11">
    <div>
      <p class="flex gap-3.5 text-[.8rem] font-bold tracking-[.14em] text-[#44403c] uppercase"><span>Brand studio</span><span class="before:mr-3.5 before:text-[#cfcdc2] before:content-['/']">Est. 2011</span></p>
      <h2 class="mt-[22px] font-editorial text-[clamp(2.9rem,7.2vw,6.2rem)] leading-[.98] font-medium tracking-[-.035em]" id="ed-marrow-title"><span class="block overflow-hidden pb-[.06em]"><span class="block motion-safe:animate-line-up">Quiet work</span></span><span class="block overflow-hidden pb-[.06em]"><span class="block motion-safe:animate-line-up motion-safe:[animation-delay:.12s]">for <em class="text-[#3f6212]">loud</em></span></span><span class="block overflow-hidden pb-[.06em]"><span class="block motion-safe:animate-line-up motion-safe:[animation-delay:.24s]">markets.</span></span></h2>
      <p class="mt-[26px] max-w-[470px] text-[1.08rem] text-[#44403c]">Marrow builds identities, packaging and websites for food, drink and hospitality brands that need to stand out on a crowded shelf without shouting.</p>
      <div class="mt-[30px] flex flex-wrap gap-3"><a class="inline-flex min-h-[52px] items-center gap-2.5 rounded-full border-[1.5px] border-[#1c1917] bg-[#1c1917] px-6 font-bold text-[#ecebe4] transition-[color,background-color,border-color,text-decoration-color] duration-200 hover:border-[#3f6212] hover:bg-[#3f6212] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212] motion-reduce:transition-none" href="#">See the projects <span aria-hidden="true">→</span></a><a class="inline-flex min-h-[52px] items-center gap-2.5 rounded-full border-[1.5px] border-[#1c1917] px-6 font-bold transition-[color,background-color,border-color,text-decoration-color] duration-200 hover:bg-[#1c1917] hover:text-[#ecebe4] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#3f6212] motion-reduce:transition-none" href="#">Read the approach</a></div>
    </div>
    <figure>
      <img class="block aspect-[16/10] h-auto w-full rounded object-cover md:aspect-[4/5]" src="https://images.unsplash.com/photo-1518005020951-eccb494ad742?auto=format&fit=crop&w=900&q=80" alt="Curved white and blue facade of a modern building seen from below" width="900" height="1125">
      <figcaption class="mt-2.5 flex justify-between gap-3 text-[.82rem] text-[#44403c]"><span>Harbour Line, wayfinding</span><span>2026</span></figcaption>
    </figure>
  </div>
  <div class="group flex items-center border-t border-[#cfcdc2] bg-[#1c1917] text-[#ecebe4]">
    <div class="min-w-0 flex-1 overflow-hidden">
      <div class="flex w-max group-has-checked:[animation-play-state:paused] motion-safe:animate-ticker motion-reduce:w-auto">
        <ul class="flex motion-reduce:flex-wrap motion-reduce:px-[22px]" aria-label="Services"><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Brand strategy</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Identity</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Packaging</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Websites</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Motion</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Editorial</li></ul>
        <ul class="flex motion-reduce:hidden" aria-hidden="true"><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Brand strategy</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Identity</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Packaging</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Websites</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Motion</li><li class="ticker-item py-3.5 font-editorial text-[1.2rem] whitespace-nowrap italic md:py-[18px] md:text-[1.5rem]">Editorial</li></ul>
      </div>
    </div>
    <label class="flex flex-none cursor-pointer items-center gap-2 self-stretch border-l border-[#44403c] px-3.5 text-[.82rem] font-semibold motion-reduce:hidden md:px-[22px]"><input class="m-0 size-4 accent-[#bef264] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#bef264]" type="checkbox">Pause<span class="sr-only"> the services ticker</span></label>
  </div>
</section></div>
CSS
/* One-shot word rotation (under five seconds), line reveal, a looping ticker and one status pulse.
   Every animation is wrapped in motion-safe: in the markup, so prefers-reduced-motion leaves the text still. */
@theme {
  --font-editorial: "Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,serif;
  --animate-rotate-words: rotate-words 4.6s cubic-bezier(.7,0,.3,1) .4s 1 both;
  --animate-line-up: line-up .9s cubic-bezier(.2,.7,.1,1) both;
  --animate-ticker: ticker 28s linear infinite;
  --animate-status: status 1.6s ease-out 3;
  @keyframes rotate-words{0%,18%{transform:translateY(0)}28%,46%{transform:translateY(-25%)}56%,74%{transform:translateY(-50%)}84%,100%{transform:translateY(-75%)}}
  @keyframes line-up{from{transform:translateY(105%)}}
  @keyframes ticker{to{transform:translateX(-50%)}}
  @keyframes status{from{box-shadow:0 0 0 0 rgba(21,128,61,.5)}to{box-shadow:0 0 0 12px rgba(21,128,61,0)}}
}
@utility ticker-item {
  &::after{content:"✳";margin:0 26px;font-style:normal;font-size:1rem;vertical-align:middle;color:#bef264}
}

About this set

Two heroes for studios and agencies where the type is the design. Rotating word hero sets We shape, then a word in red italic serif, then people remember in huge letters; the word changes from brands to products to spaces and back to brands, then stops. The whole cycle lasts under five seconds, so it never needs a pause control, and screen readers get the sentence brands, products and spaces from visually hidden text while the moving words are hidden from them. A footer row adds a short studio description, two buttons and a booking status with a dot that pulses three times. Line reveal hero sets a three-line serif headline whose lines slide up from behind a mask on load, next to a tall project photo with a caption, and ends in a ticker of services that scrolls continuously. Because the ticker loops, it has a visible Pause checkbox that stops it through :has(). Under prefers-reduced-motion the first word shows, the lines appear in place and the ticker becomes a still list without the pause control.

What’s included

  • Rotating word that plays once in under five seconds
  • Line-by-line headline reveal with a mask
  • Services ticker with a visible pause checkbox, no JavaScript
  • Full sentence for screen readers in visually hidden text
  • Everything still under prefers-reduced-motion

Accessibility

The rotating words are hidden from screen readers and replaced by visually hidden text with the full sentence. The looping ticker has a labelled Pause checkbox, its duplicate copy is hidden from screen readers and the services list has a name. All links and the checkbox show a 3px focus outline, and every animation stops under prefers-reduced-motion.

Customise it

Change --ed-bg, --ed-ink, --ed-accent and --ed-serif on .ed, as .ed-marrow does. To change the words, edit the four spans in .ed-rot and keep the first and last the same; the keyframes move by 25 percent per word. In Tailwind the animations are defined in @theme as --animate-rotate-words, --animate-line-up and --animate-ticker.