open-design/skills/motion-frames/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

222 lines
8.2 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>Reach every country — Charlotte &amp; Vine</title>
<style>
:root {
--paper: #f3eee5;
--ink: #1a1816;
--muted: #7a766c;
--accent: #c0563b;
--serif: 'Cormorant Garamond', 'Iowan Old Style', Georgia, serif;
--mono: ui-monospace, 'JetBrains Mono', monospace;
}
* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; }
body { background: var(--paper); color: var(--ink); font: 14px/1.5 -apple-system, system-ui, sans-serif; overflow: hidden; }
main {
position: relative;
width: 100vw;
height: 100vh;
background:
radial-gradient(circle at 50% 50%, rgba(26,24,22,0.04), transparent 70%),
radial-gradient(circle, rgba(26,24,22,0.10) 1px, transparent 1.4px) 0 0 / 28px 28px,
var(--paper);
overflow: hidden;
}
.chrome { position: absolute; left: 36px; right: 36px; font: 10px/1.4 var(--mono); color: var(--muted); letter-spacing: 0.18em; text-transform: uppercase; }
.chrome.top { top: 28px; display: flex; justify-content: space-between; align-items: center; }
.chrome.top .right { display: flex; align-items: center; gap: 22px; }
.chrome.top .rule { width: 60px; height: 1px; background: var(--ink); opacity: 0.6; }
.chrome.bot { bottom: 28px; display: flex; justify-content: space-between; align-items: center; }
.stage {
position: absolute;
inset: 0;
display: grid;
place-items: center;
}
.composition {
position: relative;
width: min(78vh, 78vw);
aspect-ratio: 1 / 1;
}
.ring {
position: absolute;
inset: 0;
border-radius: 50%;
border: 1px solid rgba(26,24,22,0.45);
animation: spin 60s linear infinite;
}
.ring.r2 {
inset: 4%;
border-color: rgba(26,24,22,0.30);
animation-duration: 90s;
animation-direction: reverse;
}
.ring.r3 {
inset: 10%;
border-color: rgba(26,24,22,0.22);
border-style: dashed;
animation-duration: 180s;
}
.ring.r4 {
inset: 18%;
border-color: rgba(26,24,22,0.12);
animation-duration: 36s;
}
.ring-labels { position: absolute; inset: 0; animation: spin 60s linear infinite; }
.ring-labels span {
position: absolute;
left: 50%; top: 50%;
font: 12px/1 var(--serif);
font-style: italic;
color: var(--ink);
letter-spacing: 0.02em;
transform-origin: 0 0;
white-space: nowrap;
}
.ring-labels span.l1 { transform: rotate(-12deg) translate(0, -49vh); }
.ring-labels span.l2 { transform: rotate(34deg) translate(0, -49vh); }
.ring-labels span.l3 { transform: rotate(78deg) translate(0, -49vh); }
.ring-labels span.l4 { transform: rotate(132deg) translate(0, -49vh); }
.ring-labels span.l5 { transform: rotate(178deg) translate(0, -49vh); }
.ring-labels span.l6 { transform: rotate(224deg) translate(0, -49vh); }
.ring-labels span.l7 { transform: rotate(266deg) translate(0, -49vh); }
.ring-labels span.l8 { transform: rotate(312deg) translate(0, -49vh); }
.ring-labels span i { display: inline-block; transform: rotate(0deg); /* counter rotation handled inside */ }
.globe {
position: absolute;
inset: 22%;
border-radius: 50%;
animation: spin 38s linear infinite reverse;
transform-style: preserve-3d;
}
.globe svg { width: 100%; height: 100%; display: block; }
.focal-dot {
position: absolute;
left: 50%; top: 50%;
width: 7px; height: 7px;
background: var(--accent);
border-radius: 50%;
transform: translate(-50%,-50%);
animation: pulse 2.6s ease-in-out infinite;
box-shadow: 0 0 0 0 rgba(192,86,59,0.35);
}
.meta-tl { position: absolute; top: 96px; left: 56px; font: 10px/1.5 var(--mono); color: var(--muted); letter-spacing: 0.18em; text-transform: uppercase; }
.meta-tl b { display: block; color: var(--ink); margin-bottom: 4px; letter-spacing: 0.12em; }
.issue { position: absolute; top: 96px; right: 56px; font: 9px/1.3 var(--mono); color: var(--muted); letter-spacing: 0.18em; text-align: right; text-transform: uppercase; }
.issue .num { font: 18px/1 var(--serif); font-style: italic; color: var(--ink); display: block; letter-spacing: 0; margin-bottom: 4px; }
.headline {
position: absolute;
bottom: 80px;
left: 0; right: 0;
text-align: center;
font: 38px/1.1 var(--serif);
letter-spacing: -0.005em;
animation: type-in 1.4s cubic-bezier(.2,.7,.2,1) both;
}
.headline .em { font-style: italic; color: var(--ink); }
.headline .accent { font-style: italic; color: var(--accent); padding-left: 4px; padding-right: 4px; }
.baseline { position: absolute; bottom: 56px; left: 36px; right: 36px; height: 1px; background: rgba(26,24,22,0.25); }
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(192,86,59,0.45); transform: translate(-50%,-50%) scale(1); }
50% { box-shadow: 0 0 0 18px rgba(192,86,59,0); transform: translate(-50%,-50%) scale(1.25); }
}
@keyframes type-in {
from { opacity: 0; letter-spacing: 0.06em; }
to { opacity: 1; letter-spacing: -0.005em; }
}
@media (max-width: 900px) {
.meta-tl { left: 20px; }
.issue { right: 20px; }
.headline { font-size: 28px; }
}
</style>
</head>
<body>
<main data-od-id="stage">
<div class="chrome top">
<div>ANTHROPIC LABS — APR 17 · 2026</div>
<div class="right"><div class="rule"></div><div>HOW IT WORKS</div></div>
</div>
<div class="meta-tl">
<b>27 · CHARLOTTE × VINE</b>
19 · 2026
</div>
<div class="issue">
<span class="num">175</span>
LANGUAGES HAPPENING
</div>
<div class="stage">
<div class="composition" data-od-id="composition">
<div class="ring r1"></div>
<div class="ring r2"></div>
<div class="ring r3"></div>
<div class="ring r4"></div>
<div class="globe" data-od-id="globe">
<svg viewBox="0 0 200 200" aria-hidden="true">
<defs>
<radialGradient id="globeShade" cx="35%" cy="32%" r="78%">
<stop offset="0%" stop-color="#fffaf0"/>
<stop offset="60%" stop-color="#ece6da"/>
<stop offset="100%" stop-color="#cfc8b9"/>
</radialGradient>
</defs>
<circle cx="100" cy="100" r="92" fill="url(#globeShade)" stroke="rgba(26,24,22,0.35)" stroke-width="0.7"/>
<g fill="none" stroke="rgba(26,24,22,0.40)" stroke-width="0.7">
<ellipse cx="100" cy="100" rx="92" ry="20"/>
<ellipse cx="100" cy="100" rx="92" ry="48"/>
<ellipse cx="100" cy="100" rx="92" ry="78"/>
<ellipse cx="100" cy="100" rx="20" ry="92"/>
<ellipse cx="100" cy="100" rx="48" ry="92"/>
<ellipse cx="100" cy="100" rx="78" ry="92"/>
</g>
<g fill="rgba(26,24,22,0.28)" stroke="rgba(26,24,22,0.55)" stroke-width="0.6">
<path d="M 64 70 Q 78 58 96 64 L 110 78 Q 102 92 88 96 L 70 92 Q 60 84 64 70 Z"/>
<path d="M 116 70 Q 138 64 156 80 Q 152 96 138 100 Q 124 96 116 86 Z"/>
<path d="M 54 110 Q 72 110 84 124 Q 80 142 64 150 Q 50 138 54 110 Z"/>
<path d="M 102 118 Q 124 112 146 126 Q 142 144 120 152 Q 102 144 102 118 Z"/>
<path d="M 84 36 Q 98 32 112 38 L 108 50 Q 96 56 84 50 Z"/>
<path d="M 80 158 Q 96 156 110 162 L 104 174 Q 90 174 80 168 Z"/>
</g>
</svg>
</div>
<div class="focal-dot"></div>
</div>
</div>
<div class="ring-labels" data-od-id="ring-labels" aria-hidden="true">
<!-- positioned around the outer ring; co-rotates with .ring -->
</div>
<div class="headline" data-od-id="headline">
<span class="em">Reach</span> every <span class="accent">country.</span>
</div>
<div class="baseline"></div>
<div class="chrome bot">
<div>SIGNAL · LIVE</div>
<div>BROADCASTING / 0001</div>
</div>
</main>
</body>
</html>