open-design/skills/motion-frames/example.html
Tom Huang 6f6bf31dd2
Refactor project name from "Open Claude Design" to "Open Design" (#1)
* Refactor project name from "Open Claude Design" to "Open Design"

- Updated project name in package.json, package-lock.json, and README files.
- Changed CLI commands and references from "ocd" to "od".
- Adjusted file structure references in documentation and code to reflect new naming conventions.
- Enhanced .gitignore to include new runtime data files.
- Updated metadata in LICENSE file to match new project name.

* Add contributing guidelines in English and Chinese

- Introduced CONTRIBUTING.md and CONTRIBUTING.zh-CN.md to provide clear instructions for contributors.
- Outlined contribution types, local setup instructions, and merging criteria for skills and design systems.
- Enhanced README files to reference the new contributing guidelines.
2026-04-28 16:03:35 +08:00

221 lines
8.2 KiB
HTML
Raw 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>