open-design/skills/social-carousel/example.html
Zakaria a46764fb1b
Some checks failed
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
first-commit
2026-05-04 14:58:14 -04:00

220 lines
9.8 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Three posts. One beat. — social carousel</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet" />
<style>
:root {
--stage: #0a0a0a;
--stage-2: #141414;
--paper: #f4ede0;
--serif: 'Instrument Serif', 'Iowan Old Style', Georgia, serif;
--mono: 'IBM Plex Mono', ui-monospace, monospace;
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
background:
radial-gradient(ellipse 80% 50% at 50% -10%, rgba(255,255,255,0.04), transparent 70%),
var(--stage);
color: #f4ede0;
font: 14px/1.5 -apple-system, system-ui, sans-serif;
}
.stage {
max-width: 1280px; margin: 0 auto; padding: 60px 32px 80px;
}
.stage-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; margin-bottom: 36px; }
.stage-head h1 { margin: 0; font: italic 700 36px/1 var(--serif); letter-spacing: -0.005em; }
.stage-head h1 em { font-style: normal; }
.stage-head h1 .dot { color: #a4a09a; }
.stage-head .lede { margin: 8px 0 0; font: 11px/1.6 var(--mono); color: rgba(244,237,224,0.5); letter-spacing: 0.06em; max-width: 60ch; text-transform: uppercase; }
.stage-head .badge { font: 10.5px/1 var(--mono); padding: 7px 10px; border: 1px solid rgba(244,237,224,0.3); color: rgba(244,237,224,0.7); letter-spacing: 0.18em; flex-shrink: 0; }
.row { display: flex; gap: 22px; justify-content: center; align-items: stretch; flex-wrap: wrap; }
.card {
width: clamp(280px, 30vw, 380px);
aspect-ratio: 1 / 1;
border-radius: 14px;
border: 1px solid rgba(255,255,255,0.06);
box-shadow: 0 30px 60px rgba(0,0,0,0.45);
position: relative;
overflow: hidden;
color: #ffffff;
}
.card .scrim {
position: absolute; inset: 0;
background:
linear-gradient(180deg, rgba(0,0,0,0) 40%, rgba(0,0,0,0.55) 100%);
pointer-events: none;
}
.card .top { position: absolute; top: 18px; left: 18px; right: 18px; display: flex; justify-content: space-between; align-items: flex-start; }
.card .brand { display: inline-flex; align-items: center; gap: 6px; padding: 6px 9px; background: rgba(255,255,255,0.10); backdrop-filter: blur(6px); border-radius: 999px; }
.card .brand .name { font: italic 700 13px/1 var(--serif); }
.card .brand .dot { width: 5px; height: 5px; background: var(--paper); border-radius: 50%; opacity: 0.9; }
.card .index { font: 11px/1.4 var(--mono); color: rgba(255,255,255,0.85); letter-spacing: 0.16em; text-align: right; padding: 6px 10px; background: rgba(0,0,0,0.30); backdrop-filter: blur(4px); border-radius: 4px; }
.card .lockup { position: absolute; left: 22px; right: 22px; bottom: 78px; }
.card .lockup h2 { margin: 0; font: 700 60px/1 var(--serif); letter-spacing: -0.005em; color: #ffffff; }
.card .lockup h2 em { font-style: italic; }
.card .lockup h2 .accent { font-style: italic; }
.card .footer { position: absolute; left: 22px; right: 22px; bottom: 22px; display: flex; justify-content: space-between; align-items: center; }
.card .footer .caption { font: 10.5px/1.4 var(--mono); color: rgba(255,255,255,0.85); letter-spacing: 0.14em; text-transform: uppercase; max-width: 70%; }
.card .loop { font: 10.5px/1 var(--mono); padding: 6px 8px; border: 1px solid rgba(255,255,255,0.55); border-radius: 4px; color: rgba(255,255,255,0.85); letter-spacing: 0.18em; }
/* Card 1 — dawn meadow, blue sky */
.card.c1 {
background:
linear-gradient(180deg, #5b8cb6 0%, #92aebd 32%, #b0a679 50%, #6f8a4d 70%, #2a4a2a 100%),
#4a6a8a;
}
.card.c1 .figure {
position: absolute; left: 50%; top: 56%;
width: 80px; height: 200px;
transform: translate(-50%, 0);
background:
radial-gradient(ellipse 30px 14px at 50% 30%, #2a1f15 0%, #2a1f15 60%, transparent 70%),
linear-gradient(180deg, #2a1f15 0%, #4a3018 22%, #6a3a1a 60%, transparent 100%);
filter: drop-shadow(0 6px 8px rgba(0,0,0,0.35));
clip-path: polygon(35% 0%, 65% 0%, 78% 26%, 70% 60%, 70% 100%, 30% 100%, 30% 60%, 22% 26%);
opacity: 0.92;
}
/* Card 2 — forest dusk, warm orange center */
.card.c2 {
background:
radial-gradient(ellipse 80% 50% at 50% 100%, #f49255 0%, #c95a30 35%, transparent 60%),
radial-gradient(ellipse 80% 80% at 50% 90%, rgba(255,180,120,0.5), transparent 60%),
linear-gradient(180deg, #1c2a25 0%, #2a3a30 30%, #4a3a26 70%, #2a1a14 100%);
}
.card.c2 .trees {
position: absolute; left: 0; right: 0; top: 0; bottom: 0;
}
.card.c2 .trees::before, .card.c2 .trees::after {
content: ''; position: absolute; bottom: 0; width: 50%; height: 70%;
background:
radial-gradient(circle at 20% 90%, #0f1a14 6px, transparent 7px),
radial-gradient(circle at 50% 88%, #0f1a14 8px, transparent 9px),
radial-gradient(circle at 80% 92%, #0f1a14 6px, transparent 7px);
}
.card.c2 .trees::before { left: 0; background:
linear-gradient(180deg, transparent 0%, transparent 30%, rgba(15,26,20,0.85) 30%, #0f1a14 100%);
mask: radial-gradient(ellipse 60% 90% at 50% 100%, black 70%, transparent 100%);
}
.card.c2 .trees::after { right: 0; background:
linear-gradient(180deg, transparent 0%, transparent 36%, rgba(15,26,20,0.85) 36%, #0f1a14 100%);
mask: radial-gradient(ellipse 60% 90% at 50% 100%, black 70%, transparent 100%);
}
.card.c2 .figure {
position: absolute; left: 52%; top: 56%; width: 56px; height: 130px;
transform: translate(-50%, 0);
background: linear-gradient(180deg, #2a1810 0%, #4a2818 100%);
clip-path: polygon(40% 0%, 60% 0%, 70% 22%, 70% 56%, 65% 100%, 35% 100%, 30% 56%, 30% 22%);
filter: drop-shadow(0 4px 6px rgba(0,0,0,0.4));
}
/* Card 3 — pink ridge / mountain */
.card.c3 {
background:
linear-gradient(180deg, #1b1e3a 0%, #4a3956 28%, #c9627e 60%, #d57f86 75%, #b8d2d8 100%);
}
.card.c3 .ridge {
position: absolute; inset: 0;
background:
linear-gradient(180deg, transparent 60%, rgba(60,30,40,0.4) 80%, rgba(40,20,30,0.7) 100%);
}
.card.c3 .ridge::before {
content: ''; position: absolute; left: 0; right: 0; bottom: 24%;
height: 30%;
background:
linear-gradient(180deg, #b3526a 0%, #7a3148 100%);
clip-path: polygon(0% 60%, 12% 30%, 22% 50%, 36% 18%, 50% 40%, 60% 22%, 72% 48%, 86% 26%, 100% 50%, 100% 100%, 0% 100%);
}
.card.c3 .ridge::after {
content: ''; position: absolute; left: 0; right: 0; bottom: 0;
height: 32%;
background: linear-gradient(180deg, #2a1f2a 0%, #1a1018 100%);
clip-path: polygon(0% 50%, 8% 20%, 18% 38%, 30% 8%, 44% 32%, 56% 12%, 68% 36%, 82% 18%, 100% 40%, 100% 100%, 0% 100%);
}
.card.c3 .figure {
position: absolute; right: 18%; bottom: 14%; width: 30px; height: 56px;
background: #1a0d12;
clip-path: polygon(35% 0%, 65% 0%, 75% 30%, 60% 100%, 40% 100%, 25% 30%);
filter: drop-shadow(0 4px 4px rgba(0,0,0,0.4));
}
@media (max-width: 1180px) {
.row { flex-direction: column; align-items: center; }
.card { width: min(96vw, 480px); }
.card .lockup h2 { font-size: 56px; }
}
</style>
</head>
<body>
<div class="stage" data-od-id="stage">
<div class="stage-head">
<div>
<h1>Three posts<span class="dot">.</span> One <em>beat</em><span class="dot">.</span></h1>
<p class="lede">1080×1080 · cinematic video loops · minimal type. Drop into Instagram, LinkedIn, or X — each post stands on its own or runs as a three-part series.</p>
</div>
<span class="badge">SERIES · 01 → 03</span>
</div>
<div class="row" data-od-id="cards">
<article class="card c1" data-od-id="card-1">
<div class="figure"></div>
<div class="scrim"></div>
<div class="top">
<div class="brand"><span class="dot"></span><span class="name">Jerrod Lew</span></div>
<div class="index">01 · ONWARDS</div>
</div>
<div class="lockup"><h2>onwards<em>.</em></h2></div>
<div class="footer">
<div class="caption">Man, walking forward — close.</div>
<div class="loop">1× LOOP</div>
</div>
</article>
<article class="card c2" data-od-id="card-2">
<div class="trees"></div>
<div class="figure"></div>
<div class="scrim"></div>
<div class="top">
<div class="brand"><span class="dot"></span><span class="name">Jerrod Lew</span></div>
<div class="index">02 · TO THE NEXT ONE</div>
</div>
<div class="lockup"><h2><span class="accent">to the</span><br/><em>next one.</em></h2></div>
<div class="footer">
<div class="caption">Woman, stepping into frame.</div>
<div class="loop">1× LOOP</div>
</div>
</article>
<article class="card c3" data-od-id="card-3">
<div class="ridge"></div>
<div class="figure"></div>
<div class="scrim"></div>
<div class="top">
<div class="brand"><span class="dot"></span><span class="name">Jerrod Lew</span></div>
<div class="index">03 · LOOKING AHEAD</div>
</div>
<div class="lockup"><h2>looking<br/><em>ahead.</em></h2></div>
<div class="footer">
<div class="caption">Woman, overlooking the city.</div>
<div class="loop">1× LOOP</div>
</div>
</article>
</div>
</div>
</body>
</html>