A launch site for a co-branded football and rugby jersey, told as a guided visit through a city hall. A full-screen entry gate over aerial footage opens onto a pinned facade that shrinks into a frame, then three chapters (arcades, council room, gallery) where arched windows grow to fill the screen. The look is museum-formal: cream marble, gold wide-tracked serif, slate panels and a calligraphic script for the motto.
Rebuild: design-inspiration-rebuilds/culture-education/capitolium (fictional content, generated images, open-source fonts; installed with the optional design-inspiration-rebuilds skill). Run it with npm install && npm run dev.
Design Tokens
| Role | Value |
|---|---|
| Cream (page, marble base) | #f0e3cf |
| Gold (wordmark, accents) | #c3a677 |
| Slate (text, panels) | #58595b |
| Ink (overlay, dark chapter) | #1d1a17 |
:root {
--cream: #f0e3cf; --gold: #c3a677; --slate: #58595b; --ink: #1d1a17;
--ease: cubic-bezier(.65, .05, 0, 1);
}
- Type: a condensed uppercase grotesque for headings (
-0.02emtracking, ~100px mega, 24px subheads), a wide-tracked high-contrast serif for the wordmark (.26em, gold), a text serif for body, and a formal copperplate script for the motto (original: Edwardian Script; substitute: Pinyon Script). Small labels are uppercase at.16emtracking. - Surfaces: cream marble texture on light sections, flat slate and near-black on dark ones, a thin
gold frame around slate blocks. Arched tops (
border-radius: 999px 999px 0 0) on every photo. - Wordmark band: a sticky double-ruled strip with the site name and the chapter name on both sides.
Motion Spec
| What | Trigger | Animation | Duration / easing | Rebuild file |
|---|---|---|---|---|
| Smooth scroll | always (stopped at gate and menu) | Lenis { lerp: .09, smoothWheel } driven by gsap.ticker |
— | src/scroll.js |
| Entry gate | click "Entrer" | gate lifts off yPercent: -100, content fades up; chrome drops in |
1.4s cubic-bezier(.65,.05,0,1) |
src/gate.js |
| Gate backdrop | always | slow scale 1 → 1.1 drift | 24s alternate | src/style.css |
| Facade to frame | scroll through 320vh | text fades in, then photo clip-path inset(0) → inset(22% 30%) onto cream |
scrubbed 0.6 | src/intro.js |
| Arch grow | pinned scroll | centre arch scales to 94vw, sides slide off, giant script word rises | scrubbed 0.8, power2.inOut |
src/chapter1.js |
| Horizontal panels | pinned scroll | track translates by scrollWidth - innerWidth |
scrubbed 0.8 | src/chapter1.js |
| Text reveal | enters at 88% | SplitText line masks, yPercent: 105 → 0 |
1.1s power3.out, stagger .1 |
src/reveals.js |
| Image reveal | enters at 88% | clip-path inset(100% 0 0 0) → open, inner scale 1.3 → 1 |
1.3s custom curve | src/reveals.js |
| Jerseys on plinths | enters at 85% | rise 120px + fade, plinths follow | 1.4s power3.out, stagger .2 |
src/reveals.js |
| Menu | burger click | circle clip-path from top centre; links slide up | .9s power3.out, links stagger .07 |
src/nav.js |
| Chapter pill | scroll into chapter | bottom pill slides in and swaps its label | .8s custom curve | src/nav.js |
Key excerpts
Entry gate lift: src/gate.js
gsap.timeline({ defaults: { ease: 'cubic-bezier(.65,.05,0,1)' } })
.to('.gate__inner', { opacity: 0, y: -40, duration: 0.7 })
.to(gate, { yPercent: -100, duration: 1.4 }, 0.15)
.add(() => {
document.body.classList.remove('locked');
lenis?.start();
onEnter();
}, '>-0.2');
Facade shrinks into a frame: src/intro.js
const tl = gsap.timeline({ defaults: { ease: 'none' },
scrollTrigger: { trigger: '.intro', start: 'top top', end: 'bottom bottom', scrub: 0.6 } });
tl.fromTo('#introTxt', { opacity: 0, y: 30 }, { opacity: 1, y: 0, duration: 0.22 })
.to('#introTxt', { opacity: 0, duration: 0.15 }, 0.5)
.fromTo('#introImg', { clipPath: 'inset(0% 0% 0% 0%)' },
{ clipPath: 'inset(22% 30% 22% 30%)', ease: 'power2.inOut', duration: 0.4 }, 0.45);
Arch grows to fill the screen: src/chapter1.js
gsap.timeline({ defaults: { ease: 'power2.inOut' }, scrollTrigger: {
trigger: '#arches', start: () => `top ${bandH()}`, end: '+=140%', pin: true, scrub: 0.8 } })
.to('.arch--l', { xPercent: -160, opacity: 0, duration: 1 }, 0)
.to('.arch--r', { xPercent: 160, opacity: 0, duration: 1 }, 0)
.to(c, { scale: () => (innerWidth * 0.94) / c.offsetWidth,
transformOrigin: '50% 100%', duration: 1.2 }, 0)
.fromTo('#giant', { opacity: 0, yPercent: 60 }, { opacity: 1, yPercent: 0, duration: 0.8 }, 0.9);
Pinned horizontal track: src/chapter1.js
gsap.to(track, { x: () => -(track.scrollWidth - innerWidth), ease: 'none', scrollTrigger: {
trigger: track, start: () => `top ${bandH()}`,
end: () => '+=' + (track.scrollWidth - innerWidth),
pin: true, scrub: 0.8, invalidateOnRefresh: true } });
Line-mask text reveal: src/reveals.js
SplitText.create(el, { type: 'lines', mask: 'lines', autoSplit: true, onSplit: (s) =>
gsap.from(s.lines, { yPercent: 105, duration: 1.1, ease: 'power3.out', stagger: 0.1,
scrollTrigger: { trigger: el, start: 'top 88%', once: true } }) });
prefers-reduced-motion: smooth scroll, pins, reveals and the backdrop drift are off; the gate is a plain
button and the horizontal track stacks vertically.
Why Award-Worthy
- A ritual entrance. The gate frames the site as a place you enter, not a page you land on, and sets the formal tone before any content appears.
- One shape repeated. The arch is the photo frame, the card mask and the grow transition, so a single motif ties architecture, product and motion together.
- Restrained palette, rich type. Cream, gold and slate only; the wide serif, condensed grotesque and script each have one job.
- Chapters as navigation. The sticky wordmark band and the bottom pill always say where you are in the story.
- Product as monument. Jerseys stand on plinths like exhibits, which justifies the museum tone.
Anti-patterns it avoids: no carousels, no parallax confetti, no bright accent colours, no generic fade-up reveals; scroll-driven moments always end on a readable resting frame.
Credits
- Original: collabcapitolium.fr by Supercolor. Design and content are the intellectual property of their creators.
- Recognition: Awwwards Site of the Day, Developer Award.
- This study is an independent clean-room analysis. The rebuild uses fictional clubs, AI-generated images and open-source fonts; it contains no original code, assets or copy.