Files
hyperframes/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html
T
WaterrrForeverandClaude Opus 4.8 d0f0ec29e7 feat(skills): frame-preset library + shared audio engine (foundation) (#1632)
* feat(hyperframes-creative): add frame-preset library

Add a library of ready-made visual frame presets (claude, biennale-yellow,
blockframe, blue-professional, bold-poster, broadside, capsule, cartesian,
cobalt-grid, coral, creative-mode, daisy-days, editorial-forest, …), each with
a FRAME.md spec, a frame-showcase.html, and a per-preset caption-skin.html.
Registered in the creative design-spec so workflows can remix a preset onto
brand tokens.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(hyperframes-media): shared TTS/BGM/SFX audio engine

Add a shared audio engine under hyperframes-media (scripts/audio.mjs + lib/
tts.mjs, bgm.mjs, sfx.mjs, heygen.mjs) plus a bundled SFX pack and manifest.
Workflows resolve this engine by path (../../hyperframes-media/scripts/
audio.mjs) for text-to-speech, background music, and sound effects, so audio
is authored once and reused across skills instead of duplicated per workflow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(skills): gate render on user review; refresh router, core, general-video

- hyperframes-cli: render is now user-gated — preview opens Studio (the timeline
  editor where the user can hand-edit anything, not just watch); never
  auto-render once checks pass, pause at preview and render only after approval.
- hyperframes (router): tighten the entry SKILL.md description + routing.
- hyperframes-core: rewrite SKILL.md and add script-format.md + storyboard-format.md
  references for the script-driven authoring architecture.
- general-video: tidy the fallback-workflow description and routing table.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* style(hyperframes-creative): reformat frame-preset showcase HTML

Run the HTML formatter over the frame-showcase.html files (indentation,
self-closing void tags, one CSS declaration per line). Formatting only — no
content or markup changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(hyperframes-media): correct wait-bgm field mapping and guard credential parse

Two correctness fixes from review (#1632):

- wait-bgm.mjs read audioMeta.bgm_path / audioMeta.bgm_enabled, but audio.mjs
  writes the path nested as bgm.path and the flag as bgm_pending. The detached
  generate path (Lyria/MusicGen) therefore always saw an empty path and exited
  status: disabled, silently dropping the music track even while generation was
  running. Read audioMeta.bgm?.path and gate on bgm_pending.
- heygenCredential() had an unguarded JSON.parse despite documenting that it
  never throws — a malformed ~/.heygen credentials file crashed the engine at
  startup instead of degrading to no-credential. Wrap the parse and return null.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(hyperframes): add router tag to entry skill metadata

Fold the router metadata tag into the foundation rewrite of the entry SKILL.md.
This file is owned by this PR (the full router rewrite); keeping the tag tweak
here — instead of a separate edit on the pre-rewrite version in another PR —
avoids a guaranteed merge conflict between the two.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 22:49:10 +08:00

1269 lines
36 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>Coral</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=Bebas+Neue&family=Inter:wght@300;400;600;700&display=swap"
rel="stylesheet"
/>
<style id="ds-tokens">
:root {
--coral: #e85d5d;
--coral-dark: #d44a4a;
--cream: #f5f0e8;
--cream-dark: #e8e0d4;
--ink: #1a1a1a;
--gray: #6b6b6b;
--light-gray: #b0b0b0;
--white: #ffffff;
--display: "Bebas Neue", sans-serif;
--body: "Inter", sans-serif;
--hatch: repeating-linear-gradient(
45deg,
transparent,
transparent 20px,
rgba(0, 0, 0, 0.06) 20px,
rgba(0, 0, 0, 0.06) 40px
);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
background: #0e0e0e;
}
body {
background: var(--cream);
color: var(--ink);
font-family: var(--body);
-webkit-font-smoothing: antialiased;
}
.beb {
font-family: var(--display);
text-transform: uppercase;
}
.eyebrow {
font-family: var(--body);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 4px;
font-size: 13px;
color: var(--coral);
}
/* doc rhythm */
section {
padding: 120px 100px;
position: relative;
}
.sec-head {
display: flex;
align-items: flex-end;
gap: 24px;
margin-bottom: 64px;
border-bottom: 3px solid rgba(26, 26, 26, 0.15);
padding-bottom: 24px;
}
.sec-head .num {
font-family: var(--display);
font-size: 64px;
line-height: 0.8;
color: var(--coral);
}
.sec-head h2 {
font-family: var(--display);
font-size: 64px;
line-height: 0.8;
letter-spacing: 2px;
}
.sec-head .sp {
flex: 1;
}
.sec-head .tag {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 3px;
font-size: 12px;
color: var(--gray);
}
/* COVER — region split */
.cover {
min-height: 100vh;
display: grid;
grid-template-rows: 38% 62%;
}
.cover .top {
background: var(--coral);
position: relative;
overflow: hidden;
padding: 56px 64px;
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.cover .top::before {
content: "";
position: absolute;
inset: 0;
background: var(--hatch);
pointer-events: none;
}
.cover .top .brand {
font-family: var(--display);
font-size: 40px;
letter-spacing: 6px;
color: var(--ink);
position: relative;
z-index: 2;
}
.cover .top .meta {
text-align: right;
position: relative;
z-index: 2;
}
.cover .top .meta .ml {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 3px;
font-size: 12px;
color: var(--ink);
opacity: 0.7;
}
.cover .top .meta .mf {
font-family: var(--display);
font-size: 38px;
letter-spacing: 2px;
color: var(--ink);
margin-top: 4px;
}
.cover .top .bignum {
position: absolute;
right: 48px;
bottom: -70px;
font-family: var(--display);
font-size: 340px;
line-height: 0.7;
color: rgba(0, 0, 0, 0.12);
z-index: 1;
}
.cover .bot {
background: var(--cream);
padding: 64px;
display: flex;
flex-direction: column;
justify-content: center;
}
.cover h1 {
font-family: var(--display);
font-size: clamp(80px, 13vw, 190px);
line-height: 0.88;
letter-spacing: 4px;
color: var(--ink);
}
.cover h1 em {
font-style: normal;
color: var(--coral);
}
.cover .rule {
height: 3px;
background: rgba(26, 26, 26, 0.15);
margin: 40px 0 28px;
max-width: 900px;
}
.cover .strap {
font-family: var(--body);
font-weight: 300;
font-size: 24px;
line-height: 1.5;
color: var(--gray);
max-width: 760px;
}
.cover .strap b {
font-weight: 600;
color: var(--ink);
}
/* PALETTE */
.swatches {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0;
border: 1px solid rgba(26, 26, 26, 0.12);
}
.sw {
padding: 0;
}
.sw .chip {
height: 160px;
border-bottom: 1px solid rgba(26, 26, 26, 0.12);
}
.sw:not(:last-child) {
border-right: 1px solid rgba(26, 26, 26, 0.12);
}
.sw .meta {
padding: 22px 24px;
}
.sw .name {
font-family: var(--display);
font-size: 30px;
letter-spacing: 2px;
}
.sw .hex {
font-family: var(--body);
font-size: 13px;
letter-spacing: 1px;
color: var(--gray);
margin-top: 4px;
}
.sw .role {
font-size: 13px;
line-height: 1.5;
color: var(--gray);
margin-top: 12px;
}
.palette-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.palette-row + .palette-row .sw .chip {
border-top: 0;
}
/* TYPE */
.type-row {
display: grid;
grid-template-columns: 260px 1fr;
border-bottom: 1px solid rgba(26, 26, 26, 0.12);
align-items: center;
}
.type-row .lbl {
padding: 28px 0;
}
.type-row .tok {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 2px;
font-size: 13px;
}
.type-row .meta {
font-size: 12px;
color: var(--gray);
margin-top: 8px;
line-height: 1.6;
}
.type-row .spec {
padding: 28px 0 28px 40px;
border-left: 1px solid rgba(26, 26, 26, 0.12);
overflow: hidden;
}
/* COMPONENTS */
.comp-note {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 2px;
font-size: 12px;
color: var(--gray);
margin-bottom: 18px;
}
.comp-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 28px;
margin-bottom: 56px;
}
.span3 {
grid-column: span 3;
}
.span4 {
grid-column: span 4;
}
.span6 {
grid-column: span 6;
}
.c-card {
background: var(--white);
border-top: 5px solid var(--coral);
padding: 32px;
height: 100%;
}
.c-card .ico {
width: 48px;
height: 48px;
background: var(--coral);
color: var(--white);
font-family: var(--display);
font-size: 24px;
display: grid;
place-items: center;
margin-bottom: 24px;
}
.c-card .t {
font-family: var(--display);
font-size: 34px;
letter-spacing: 1px;
line-height: 1.05;
}
.c-card .x {
font-size: 14px;
line-height: 1.6;
color: var(--gray);
margin-top: 14px;
}
.c-card .stat {
font-family: var(--display);
font-size: 48px;
color: var(--coral);
margin-top: 24px;
line-height: 1;
}
.c-side {
background: var(--white);
border-left: 4px solid var(--coral);
padding: 20px 24px;
margin-bottom: 18px;
}
.c-side .v {
font-family: var(--display);
font-size: 44px;
letter-spacing: 1px;
line-height: 1;
}
.c-side .l {
font-family: var(--body);
font-size: 12px;
letter-spacing: 1px;
color: var(--gray);
margin-top: 6px;
}
.c-accent {
width: 80px;
height: 4px;
background: var(--coral);
}
.timeline {
position: relative;
height: 120px;
margin-top: 20px;
}
.timeline .line {
position: absolute;
top: 20px;
left: 0;
right: 0;
height: 4px;
background: var(--ink);
}
.timeline .pt {
position: absolute;
top: 12px;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--coral);
border: 4px solid var(--cream);
}
.timeline .lab {
position: absolute;
top: 44px;
font-family: var(--display);
font-size: 22px;
letter-spacing: 1px;
transform: translateX(-50%);
}
.infobar {
background: var(--cream-dark);
display: flex;
justify-content: space-between;
align-items: center;
padding: 28px 36px;
}
.infobar .bt {
font-family: var(--display);
font-size: 44px;
letter-spacing: 2px;
}
.infobar .bm {
font-family: var(--body);
font-size: 12px;
letter-spacing: 2px;
text-transform: uppercase;
color: var(--gray);
}
/* COMPOSITIONS */
.gallery {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
}
.fw .flabel {
display: flex;
gap: 14px;
align-items: baseline;
margin-bottom: 16px;
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 2px;
font-size: 12px;
color: var(--gray);
}
.fw .flabel b {
color: var(--ink);
letter-spacing: 1px;
}
.frame {
aspect-ratio: 16/9;
container-type: size;
position: relative;
overflow: hidden;
background: var(--cream);
box-shadow: 0 2px 0 rgba(26, 26, 26, 0.1);
}
.frame .hatch {
position: absolute;
inset: 0;
background: var(--hatch);
pointer-events: none;
z-index: 1;
}
.frame .z {
position: relative;
z-index: 2;
}
/* f1 cover region split */
.f1 {
display: grid;
grid-template-rows: 36% 64%;
}
.f1 .t {
background: var(--coral);
position: relative;
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 2.6cqw 3cqw;
}
.f1 .t .brand {
font-family: var(--display);
font-size: 2cqw;
letter-spacing: 0.4cqw;
color: var(--ink);
}
.f1 .t .mf {
font-family: var(--display);
font-size: 1.9cqw;
letter-spacing: 0.1cqw;
color: var(--ink);
}
.f1 .t .bn {
position: absolute;
right: 2cqw;
bottom: -3cqw;
font-family: var(--display);
font-size: 16cqw;
line-height: 0.7;
color: rgba(0, 0, 0, 0.12);
}
.f1 .b {
background: var(--cream);
padding: 0 3cqw;
display: flex;
flex-direction: column;
justify-content: center;
}
.f1 .b h3 {
font-family: var(--display);
font-size: 8.5cqw;
line-height: 0.86;
letter-spacing: 0.3cqw;
color: var(--ink);
}
.f1 .b h3 em {
font-style: normal;
color: var(--coral);
}
.f1 .b .ey {
font-family: var(--body);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.3cqw;
font-size: 0.95cqw;
color: var(--coral);
margin-bottom: 1.2cqw;
}
/* f2 feature stat — coral full + giant numeral */
.f2 {
background: var(--coral);
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 7cqw;
}
.f2 .bn {
position: absolute;
right: 3cqw;
top: -2cqw;
font-family: var(--display);
font-size: 34cqw;
line-height: 0.8;
color: rgba(0, 0, 0, 0.12);
z-index: 1;
}
.f2 .ey {
font-family: var(--body);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.3cqw;
font-size: 1cqw;
color: var(--ink);
margin-bottom: 1.4cqw;
}
.f2 h3 {
font-family: var(--display);
font-size: 7cqw;
line-height: 0.9;
letter-spacing: 0.2cqw;
color: var(--ink);
}
.f2 .x {
font-family: var(--body);
font-weight: 300;
font-size: 1.5cqw;
line-height: 1.5;
color: var(--ink);
max-width: 44cqw;
margin-top: 1.6cqw;
}
/* f3 quote — coral panel + ink panel */
.f3 {
display: grid;
grid-template-columns: 40% 60%;
}
.f3 .l {
background: var(--coral);
position: relative;
overflow: hidden;
display: flex;
align-items: flex-start;
padding: 3cqw;
}
.f3 .l .mark {
font-family: var(--display);
font-size: 24cqw;
line-height: 0.6;
color: rgba(0, 0, 0, 0.35);
}
.f3 .r {
background: var(--ink);
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 5cqw;
}
.f3 .r .q {
font-family: var(--body);
font-weight: 300;
font-size: 2.6cqw;
line-height: 1.35;
color: var(--cream);
}
.f3 .r .acc {
width: 4cqw;
height: 0.25cqw;
background: var(--coral);
margin: 2.4cqw 0 1.4cqw;
}
.f3 .r .at {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.25cqw;
font-size: 0.95cqw;
color: var(--cream);
}
.f3 .r .ro {
font-family: var(--body);
font-size: 0.85cqw;
letter-spacing: 0.05cqw;
color: var(--light-gray);
margin-top: 0.4cqw;
}
/* f4 closing — cream + coral band */
.f4 {
background: var(--cream);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
position: relative;
}
.f4 .ey {
font-family: var(--body);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.4cqw;
font-size: 1cqw;
color: var(--coral);
margin-bottom: 1.6cqw;
}
.f4 h3 {
font-family: var(--display);
font-size: 9cqw;
line-height: 0.86;
letter-spacing: 0.3cqw;
color: var(--ink);
}
.f4 .acc {
width: 5cqw;
height: 0.25cqw;
background: var(--coral);
margin-top: 2.4cqw;
}
.f4 .band {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 8cqw;
background: var(--coral);
overflow: hidden;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 4cqw;
}
.f4 .band::before {
content: "";
position: absolute;
inset: 0;
background: var(--hatch);
}
.f4 .band span {
position: relative;
font-family: var(--display);
font-size: 2.2cqw;
letter-spacing: 0.2cqw;
color: var(--ink);
}
/* PRINCIPLES */
.dos {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
}
.do-card {
padding: 40px;
}
.do-card.do {
background: var(--ink);
color: var(--cream);
}
.do-card.dont {
background: var(--white);
border-top: 5px solid var(--coral);
}
.do-card h4 {
font-family: var(--display);
font-size: 40px;
letter-spacing: 2px;
margin-bottom: 24px;
}
.do-card.do h4 {
color: var(--coral);
}
.do-card ul {
list-style: none;
}
.do-card li {
font-size: 16px;
line-height: 1.55;
padding-left: 26px;
position: relative;
margin-bottom: 14px;
}
.do-card li::before {
position: absolute;
left: 0;
font-family: var(--display);
font-size: 18px;
}
.do-card.do li::before {
content: "+";
color: var(--coral);
}
.do-card.dont li::before {
content: "\2715";
color: var(--coral);
}
.do-card.dont li {
color: var(--gray);
}
.foot {
padding: 64px 100px;
background: var(--ink);
color: var(--cream);
display: flex;
justify-content: space-between;
align-items: center;
}
.foot .l {
font-family: var(--display);
font-size: 30px;
letter-spacing: 3px;
}
.foot .r {
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 3px;
font-size: 12px;
color: var(--light-gray);
}
@media (max-width: 1100px) {
.gallery {
grid-template-columns: 1fr;
}
.swatches,
.palette-row {
grid-template-columns: 1fr 1fr;
}
}
</style>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Bebas+Neue&display=swap"
/>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
/>
<style id="ft-override">
:root {
--primary: #f5f0e8 !important;
--secondary: #1a1a1a !important;
--tertiary: #6b6b6b !important;
--accent: #e85d5d !important;
--f-disp: "Bebas Neue", sans-serif !important;
--f-body: "Inter", sans-serif !important;
--coral: #e85d5d !important;
--cream: #f5f0e8 !important;
--ink: #1a1a1a !important;
--gray: #6b6b6b !important;
--display: "Bebas Neue", sans-serif !important;
--body: "Inter", sans-serif !important;
--coral-dark: #d44a4a !important;
--cream-dark: #e8e0d4 !important;
--light-gray: #b0b0b0 !important;
--white: #ffffff !important;
}
</style>
</head>
<body>
<!-- COVER -->
<section class="cover" style="padding: 0">
<div class="top">
<div class="brand">Coral</div>
<div class="meta">
<div class="ml">Frame System</div>
<div class="mf">Vol. 01 / 1920×1080</div>
</div>
<div class="bignum">01</div>
</div>
<div class="bot">
<h1>Solid planes,<br /><em>hard edges.</em></h1>
<div class="rule"></div>
<div class="strap">
<b>A bold magazine-poster system in motion.</b> Three surfaces — coral fire, ink black,
warm cream — meeting at hard color edges, animated by Bebas Neue caps and a constant 45°
hatch.
</div>
</div>
</section>
<!-- PALETTE -->
<section>
<div class="sec-head">
<span class="num">01</span>
<h2>Palette</h2>
<span class="sp"></span><span class="tag">Three surfaces + ink + neutrals</span>
</div>
<div class="swatches palette-row">
<div class="sw">
<div class="chip" style="background: var(--coral)"></div>
<div class="meta">
<div class="name">Coral</div>
<div class="hex">#E85D5D</div>
<div class="role">The signature — accent and full-region environment.</div>
</div>
</div>
<div class="sw">
<div class="chip" style="background: var(--coral-dark)"></div>
<div class="meta">
<div class="name">Coral Dark</div>
<div class="hex">#D44A4A</div>
<div class="role">Gradient stop + chart comparison series.</div>
</div>
</div>
<div class="sw">
<div class="chip" style="background: var(--cream)"></div>
<div class="meta">
<div class="name">Cream</div>
<div class="hex">#F5F0E8</div>
<div class="role">The warm canvas — magazine paper.</div>
</div>
</div>
<div class="sw">
<div class="chip" style="background: var(--ink)"></div>
<div class="meta">
<div class="name">Black</div>
<div class="hex">#1A1A1A</div>
<div class="role">Strongest surface; quote + statement grounds.</div>
</div>
</div>
</div>
<div class="swatches palette-row" style="border-top: 0">
<div class="sw">
<div class="chip" style="background: var(--cream-dark)"></div>
<div class="meta">
<div class="name">Cream Dark</div>
<div class="hex">#E8E0D4</div>
<div class="role">Subtle region differentiation; info bars.</div>
</div>
</div>
<div class="sw">
<div class="chip" style="background: var(--gray)"></div>
<div class="meta">
<div class="name">Gray</div>
<div class="hex">#6B6B6B</div>
<div class="role">Body paragraphs, labels, meta.</div>
</div>
</div>
<div class="sw">
<div class="chip" style="background: var(--light-gray)"></div>
<div class="meta">
<div class="name">Light Gray</div>
<div class="hex">#B0B0B0</div>
<div class="role">Tertiary text on ink surfaces.</div>
</div>
</div>
<div class="sw">
<div
class="chip"
style="background: var(--white); box-shadow: inset 0 0 0 1px rgba(26, 26, 26, 0.12)"
></div>
<div class="meta">
<div class="name">White</div>
<div class="hex">#FFFFFF</div>
<div class="role">Card fills against coral or cream.</div>
</div>
</div>
</div>
</section>
<!-- TYPOGRAPHY -->
<section style="background: var(--cream-dark)">
<div class="sec-head">
<span class="num">02</span>
<h2>Typography</h2>
<span class="sp"></span><span class="tag">Bebas Neue + Inter</span>
</div>
<div class="type-row">
<div class="lbl">
<div class="tok">hero-title</div>
<div class="meta">Bebas Neue · 120px · 4px track<br />uppercase always · line 0.9</div>
</div>
<div class="spec">
<span class="beb" style="font-size: 104px; letter-spacing: 4px; line-height: 0.9"
>Coral Fire</span
>
</div>
</div>
<div class="type-row">
<div class="lbl">
<div class="tok">jumbo-feature</div>
<div class="meta">Bebas Neue · up to 200px · 12px track</div>
</div>
<div class="spec">
<span class="beb" style="font-size: 120px; letter-spacing: 12px; color: var(--coral)"
>2026</span
>
</div>
</div>
<div class="type-row">
<div class="lbl">
<div class="tok">section-headline</div>
<div class="meta">Bebas Neue · 80px · 2px track</div>
</div>
<div class="spec">
<span class="beb" style="font-size: 72px; letter-spacing: 2px">Hard Color Edges</span>
</div>
</div>
<div class="type-row">
<div class="lbl">
<div class="tok">body-light</div>
<div class="meta">Inter · weight 300 · pull-quote voice</div>
</div>
<div class="spec">
<p style="font-weight: 300; font-size: 28px; line-height: 1.5; max-width: 760px">
The voice break — Inter Light takes over when content needs to feel personal rather than
declarative.
</p>
</div>
</div>
<div class="type-row" style="border-bottom: 0">
<div class="lbl">
<div class="tok">section-label</div>
<div class="meta">Inter · 700 · 4px track · uppercase</div>
</div>
<div class="spec"><span class="eyebrow">Fig. 02 — Type Specimen</span></div>
</div>
</section>
<!-- COMPONENTS -->
<section>
<div class="sec-head">
<span class="num">03</span>
<h2>Components</h2>
<span class="sp"></span><span class="tag">Flat · hard edges · coral borders</span>
</div>
<div class="comp-note">Column cards — white fill, 5px coral top border, 48px icon square</div>
<div class="comp-grid">
<div class="span4">
<div class="c-card">
<div class="ico">A</div>
<div class="t">Region Split</div>
<div class="x">Solid color planes meet at a hard edge. The boundary is the layout.</div>
<div class="stat">01</div>
</div>
</div>
<div class="span4">
<div class="c-card">
<div class="ico">B</div>
<div class="t">Diagonal Hatch</div>
<div class="x">A 45° 6%-opacity overlay gives coral regions texture without depth.</div>
<div class="stat">45°</div>
</div>
</div>
<div class="span4">
<div class="c-card">
<div class="ico">C</div>
<div class="t">Wallpaper Numeral</div>
<div class="x">Oversized Bebas at 12% opacity sits behind a region's title.</div>
<div class="stat">12%</div>
</div>
</div>
</div>
<div class="comp-grid">
<div class="span4">
<div class="comp-note">Sidebar tiles — 4px coral left border</div>
<div class="c-side">
<div class="v">240%</div>
<div class="l">Output Lift</div>
</div>
<div class="c-side">
<div class="v">3.4×</div>
<div class="l">Faster Cuts</div>
</div>
<div class="c-side" style="margin-bottom: 0">
<div class="v">12K</div>
<div class="l">Frames Shipped</div>
</div>
</div>
<div class="span4">
<div class="comp-note">Accent rule + info bar</div>
<div class="c-accent" style="margin-bottom: 28px"></div>
<div class="infobar">
<span class="bt">Coverage</span><span class="bm">Coral · Ink · Cream</span>
</div>
<div style="margin-top: 28px" class="comp-note">Card icon</div>
<div
class="ico"
style="
width: 48px;
height: 48px;
background: var(--coral);
color: #fff;
font-family: var(--display);
font-size: 24px;
display: grid;
place-items: center;
"
>
</div>
</div>
<div class="span4">
<div class="comp-note">Timeline — ink line, coral nodes, cream halo</div>
<div class="timeline">
<div class="line"></div>
<div class="pt" style="left: 4%"></div>
<div class="lab" style="left: 6%">Plan</div>
<div class="pt" style="left: 34%"></div>
<div class="lab" style="left: 36%">Block</div>
<div class="pt" style="left: 64%"></div>
<div class="lab" style="left: 66%">Set</div>
<div class="pt" style="left: 92%"></div>
<div class="lab" style="left: 90%">Ship</div>
</div>
</div>
</div>
</section>
<!-- COMPOSITIONS -->
<section style="background: var(--cream-dark)">
<div class="sec-head">
<span class="num">04</span>
<h2>Frame Compositions</h2>
<span class="sp"></span><span class="tag">True 16:9 · cqw scaled</span>
</div>
<div class="gallery">
<div class="fw">
<div class="flabel"><b>Region-Split Cover</b><span>· identity · coral / cream</span></div>
<div class="frame f1">
<div class="t">
<div class="brand">Coral</div>
<div class="mf">Vol. 01</div>
<div class="bn">01</div>
</div>
<div class="b">
<div class="ey">Frame System</div>
<h3>Solid planes,<br /><em>hard edges.</em></h3>
</div>
</div>
</div>
<div class="fw">
<div class="flabel">
<b>Feature Stat</b><span>· coral environment · wallpaper numeral</span>
</div>
<div class="frame f2">
<div class="bn">240</div>
<div class="z">
<div class="ey">By The Numbers</div>
<h3>Two hundred<br />forty percent.</h3>
<p class="x">
Output lift across the system — the figure carries the region while the hatch gives
it texture.
</p>
</div>
</div>
</div>
<div class="fw">
<div class="flabel">
<b>Quote Layout</b><span>· coral panel + ink panel · giant mark</span>
</div>
<div class="frame f3">
<div class="l"><div class="mark">&ldquo;</div></div>
<div class="r">
<div class="q">Bebas declares.<br />Inter explains.</div>
<div class="acc"></div>
<div class="at">The System Voice</div>
<div class="ro">Typographic Principle</div>
</div>
</div>
</div>
<div class="fw">
<div class="flabel">
<b>Closing Plate</b><span>· closer · cream + coral band · centered</span>
</div>
<div class="frame f4">
<div class="ey">Coral — Frame System</div>
<h3>Meet at<br />the edge.</h3>
<div class="acc"></div>
<div class="band"><span>Thank You</span><span>2026</span></div>
</div>
</div>
</div>
</section>
<!-- PRINCIPLES -->
<section>
<div class="sec-head">
<span class="num">05</span>
<h2>Frame Rules</h2>
<span class="sp"></span><span class="tag">Flat · hard-edge · coral</span>
</div>
<div class="dos">
<div class="do-card do">
<h4>Do</h4>
<ul>
<li>Compose as multi-surface region splits — coral, ink, cream at hard edges.</li>
<li>Set every Bebas element uppercase with 112px letter-spacing.</li>
<li>Render eyebrows in coral on cream/ink, in ink on coral.</li>
<li>Apply the 45° hatch at 6% opacity on coral regions.</li>
<li>Fill underweight coral regions with a 12%-opacity wallpaper numeral.</li>
</ul>
</div>
<div class="do-card dont">
<h4>Don't</h4>
<ul>
<li>Never render Bebas in sentence case or without tracking.</li>
<li>No fourth surface; no drop shadows, elevations, or rounded rectangles.</li>
<li>No white headlines on coral — Bebas on coral is always ink.</li>
<li>No gray headlines; gray is body and meta only.</li>
<li>Don't pair Bebas with a different body sans than Inter.</li>
</ul>
</div>
</div>
</section>
<!-- CAPTIONS — preview of caption-skin.html (the preset's lower-third karaoke look) -->
<style>
/* mirrors caption-skin.html; the skin's --cap-* vocab mapped to this preset's tokens */
.capdemo {
--cap-ink: var(--ink);
--cap-canvas: var(--cream);
--cap-accent: var(--coral);
--cap-accent-2: var(--coral-dark);
}
.capdemo .stage {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 16.67cqh;
display: flex;
align-items: center;
justify-content: center;
z-index: 4;
}
.capdemo .pill {
max-width: 80cqw;
padding: 1.4cqw 3cqw 1.6cqw;
background: var(--cap-canvas);
border: 1px solid var(--cap-ink);
border-radius: 0;
}
.capdemo .line {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.1em 0.3em;
font-family: var(--display);
font-weight: 400;
text-transform: uppercase;
font-size: 3.6cqw;
line-height: 1.04;
letter-spacing: 0.06em;
}
.capdemo .w {
display: inline-block;
padding: 0 0.12em;
color: color-mix(in srgb, var(--cap-ink) 40%, var(--cap-canvas));
}
.capdemo .w.spoken {
color: var(--cap-ink);
}
.capdemo .w.active {
color: var(--cap-ink);
background: var(--cap-accent);
box-shadow: 0 0 0 0.1em var(--cap-accent);
}
.capdemo .bandline {
position: absolute;
left: 0;
right: 0;
bottom: 16.67cqh;
border-top: 1px dashed rgba(26, 26, 26, 0.28);
z-index: 3;
}
.capdemo .bandtag {
position: absolute;
right: 3cqw;
bottom: calc(16.67cqh + 0.7cqw);
font-family: var(--body);
font-weight: 600;
text-transform: uppercase;
font-size: 0.85cqw;
letter-spacing: 0.1cqw;
color: var(--gray);
z-index: 4;
}
</style>
<section>
<div class="sec-head">
<span class="num">06</span>
<h2>Captions</h2>
<span class="sp"></span><span class="tag">Lower-third · Karaoke</span>
</div>
<div class="gallery">
<div class="fw">
<div class="flabel"><b>Active line</b><span>· spoken · current · upcoming</span></div>
<div class="frame capdemo">
<div class="hatch" style="background: var(--hatch); opacity: 0.5"></div>
<div class="bandline"></div>
<div class="bandtag">caption band · 16.7%</div>
<div class="stage">
<div class="pill">
<div class="line">
<span class="w spoken">Built</span>
<span class="w spoken">for</span>
<span class="w active">teams</span>
<span class="w">who</span>
<span class="w">ship.</span>
</div>
</div>
</div>
</div>
</div>
<div class="fw">
<div class="flabel"><b>Settled line</b><span>· all spoken · fill cleared</span></div>
<div class="frame capdemo">
<div class="stage">
<div class="pill">
<div class="line">
<span class="w spoken">Ship</span>
<span class="w spoken">faster</span>
<span class="w spoken">today.</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<div class="foot">
<span class="l">Coral</span>
<span class="r">Frame Showcase · Atoms Sacred · Composition Free</span>
</div>
<template id="__bundler_thumbnail">
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<rect width="100" height="100" fill="#F5F0E8" />
<rect width="100" height="42" fill="#E85D5D" />
<rect x="20" y="60" width="60" height="9" fill="#1A1A1A" />
<rect x="20" y="74" width="38" height="9" fill="#E85D5D" />
</svg>
</template>
</body>
</html>