* 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>
16 KiB
version: alpha name: Broadside — Frame (video / frame layer) description: > Video-first companion to Broadside's design.md. The unit is the frame (1920×1080). Atoms are identical and sacred — the two-register surface system (dark ink-black / fire-orange), massive Barlow in lowercase weight 900 treated as graphic primitive, IBM Plex Mono chrome (uppercase, 0.14em), the single fire-orange accent, the flat plane, and 1px hairline dividers. Composition + frame scale rewritten for the frame. Motion out of scope. unit: the frame — 1920×1080 primary; 9:16 and 1:1 documented principle: atoms are sacred · composition is free · numbers come from the script
colors: ink-black: "#111111" ink-black-alt: "#1A1A18" fire-orange: "#E85D26" cream: "#F0ECE5" cream-muted: "#888880" cream-hint: "#505048" border-dark: "#282826" ink-on-orange-muted: "rgba(17,17,17,0.75)" ink-on-orange-hint: "rgba(17,17,17,0.55)" ink-on-orange-faint: "rgba(17,17,17,0.40)" ink-on-orange-border: "rgba(17,17,17,0.20)"
typography:
— reading ramp —
body: { fontFamily: "Barlow", cqw: 1.2, weight: 400, lineHeight: 1.6 } lead: { fontFamily: "Barlow", cqw: 1.6, weight: 400, lineHeight: 1.5 } caption: { fontFamily: "Barlow", cqw: 0.9, weight: 400, lineHeight: 1.5 } label: { fontFamily: "IBM Plex Mono", cqw: 0.72, weight: 500, tracking: "0.14em", upper: true }
— display / hero ramp (Barlow, lowercase, negative tracking) —
h3: { fontFamily: "Barlow", cqw: 2.8, weight: 600, lineHeight: 1.2, lower: true } quote-text:{ fontFamily: "Barlow", cqw: 3.8, weight: 700, lineHeight: 1.15, tracking: "-0.02em", lower: true } h2: { fontFamily: "Barlow", cqw: 4.5, weight: 700, lineHeight: 1.1, tracking: "-0.02em", lower: true } stat-value:{ fontFamily: "Barlow", cqw: 5.5, weight: 900, lineHeight: 1.0, tracking: "-0.04em" } h1: { fontFamily: "Barlow", cqw: 7.5, weight: 800, lineHeight: 0.9, tracking: "-0.03em", lower: true } fadelist-item:{ fontFamily: "Barlow", cqw: 7.5, weight: 900, lineHeight: 1.0, tracking: "-0.03em", lower: true } quote-mark:{ fontFamily: "Barlow", cqw: 10.0, weight: 900, lineHeight: 0.6 } fadelist-title:{ fontFamily: "Barlow", cqw: 10.5, weight: 900, lineHeight: 0.9, tracking: "-0.04em", lower: true } display: { fontFamily: "Barlow", cqw: 13.0, weight: 900, lineHeight: 0.88, tracking: "-0.04em", lower: true }
spacing: pad-x: "5.5cqw" pad-y: "5.5cqw" gap-lg: "3.5cqw" gap-md: "2cqw" gap-sm: "1cqw"
components:
registers:
dark: "ground {colors.ink-black}, text {colors.cream}, accent {colors.fire-orange}"
orange: "ground {colors.fire-orange}, text {colors.ink-black}"
description: "Two surfaces only — no cream/paper register. One register per frame."
slide-chrome:
rule: "1px solid {colors.border-dark} (dark) / 20% ink (orange)"
placement: "top + bottom bars (label left, number right)"
description: "SUPPRESSED on cover/chapter/statement/quote/end — declarative frames let type fill the field."
kicker:
typography: "{typography.label}"
color: "{colors.fire-orange} (dark) / 55% ink (orange)"
description: "Uppercase mono eyebrow."
rule:
backgroundColor: "{colors.fire-orange} (dark) / {colors.ink-black} (orange)"
size: "36×2px"
description: "Stub accent bar — the system's only ornament."
broadside-num:
typography: "{typography.label}"
placement: "top-left of orange cover/chapter, low opacity"
description: "Mono catalogue numeral."
stat-card:
borderTop: "1px solid {colors.border-dark}"
typography: "{typography.stat-value} (orange on dark / ink on orange) + {typography.body} + {typography.label}"
description: "Top-border-only block, no other borders."
bullet:
marker: "orange / mono via ::before"
typography: "{typography.lead}"
description: "Capped at THREE items."
bar-track:
borderLeft: "1px solid {colors.border-dark}"
bars: "{colors.cream-hint}, one .accent {colors.fire-orange}"
typography: "{typography.label} axis"
description: "Vertical bar chart, left axis only."
compare-panel:
layout: "two equal panels split by a 1px vertical rule"
payoff: "right panel may fill {colors.fire-orange}"
description: "Before/after."
fadelist:
typography: "{typography.fadelist-item} ×3 at opacity 1.0/0.5/0.22 + {typography.fadelist-title}"
description: "Three stacked words + one oversized title opposite."
Broadside — Frame (video / frame layer)
Overview
Broadside at frame scale is a protest-poster system where type is so large it stops reading as
text and becomes graphic primitive. Barlow display at 13cqw puts a single lowercase word
nearly across the frame. The system runs in two registers: a dark ink-black ground with cream
text for documentation, and a fire-orange ground with dark ink for declaration. Fire-orange is the
only color — accent on dark, environment on orange. The plane is flat; hierarchy is weight, size,
and 1px hairlines.
Barlow carries every text role from display to body — expressive range from weight (400–900)
and size, not face contrast. IBM Plex Mono is chrome only (numbers, kickers, tags, axis labels,
the / bullet marker), always uppercase and tracked. Display is lowercase — the system's most
distinctive single decision, a deliberate inversion of the brutalist norm.
Key characteristics at frame scale:
- Two registers — dark (cream text) / orange (ink text). No cream/paper register.
- Massive lowercase Barlow 900, negative-tracked, as graphic primitive (display 13cqw).
- Fire-orange is the only color — accent on dark, full environment on orange.
- IBM Plex Mono chrome — uppercase, 0.14em; the
/bullet marker; mono catalogue numbers. - Flat plane — no shadow, no radius (save nav dots), no gradient; 1px hairlines carry structure.
- Low density — one statement per frame, bullets capped at three, chrome suppressed on declarative frames.
The Frame
Frame Craft Bar
Three eyeball tests gate every frame before any structural check:
-
Squint — exactly one display moment dominates at 3–6× everything else; nothing competes.
-
Silence — declarative frames read 45–55% empty; the stat grid is the one dense exception.
-
Restraint — one register per frame; fire-orange is the only color (accent on dark, environment on orange); one display moment; bullets capped at three.
-
Reference — aim at broadside printing / a SPACE10 report / a Wim Crouwel grid with one loud color; failure looks like a multi-accent corporate slide deck.
-
Primary: 1920×1080 (16:9). Type authored in
cqw(px ÷ 1920 × 100 = cqw; or carry the source'svw1:1). -
Vertical: 1080×1920 (9:16). Square: 1080×1080 (1:1).
-
Safe area:
pad-x/pad-y5.5cqw — deliberately tight so the massive type crowds the frame edge.
The container law (load-bearing). Every frame ground sets container-type: size; ALL
frame-relative units are cqw/cqh against it — never vw (a vw-sized frame inflates when not
full-screen). 1px hairlines stay 1px.
Colors
Tokens identical to the source, in two registers. Dark: {colors.ink-black} ground,
{colors.cream} text, {colors.fire-orange} accent (kickers, accent stat, bullet /, lead bar,
quote mark, rule stub). Orange: {colors.fire-orange} ground, {colors.ink-black} headlines +
body, with the dark-ink overlays (75/55/40/20%) as the muted tones. Choose one register per frame
and commit. No second accent color — on orange, emphasis is weight/opacity on the ink, never a
new hue. Cream text on orange does not exist (ink-on-fire is absolute).
Typography
Two ramps. The reading ramp (Barlow body 1.2cqw, mono label 0.72cqw) carries copy + chrome; the
display ramp (Barlow h2 4.5cqw → display 13cqw, weight 700–900) carries every statement.
- Legibility floor: any load-bearing line ≥ 1.4cqw; mono labels are chrome only.
- Fit-to-measure: size the headline to its length. Cap the block at ≤ 78cqw; ≤2 words →
display; 3–4 →h1; 5+ →h2. Broadside packs only ONE display moment per frame. - Barlow display is lowercase, weight 700–900, negative-tracked (−0.04em largest, −0.02em h2). Mono chrome is uppercase, 0.1em+. No italic, no underline, no uppercase display.
Depth & Surface
Flat plane, the only technique. Hierarchy from:
- Weight + size contrast — the dominant signal (900 lowercase display).
- 1px hairlines — chrome bars, stat-card top, compare divider, bar-track left, chart baseline.
- Color shift — orange on ink, ink on cream, cream-muted on cream.
- Negative space — generous, intentional empty regions.
Ceiling: no box-shadow, no elevation, no rounded surface (save nav dots), no gradient ground.
Shapes
- 0 radius everywhere except nav dots (50%). Cards, panels, tags, stat blocks, bars — sharp rectangles.
Components
- registers — the two-surface system. slide-chrome — optional hairline bars, suppressed on declarative frames.
- kicker (mono eyebrow) / rule (36×2 stub) / broadside-num (catalogue mark) — the chrome ornament set.
- stat-card (top-border only) / bullet (orange
/, max 3) / bar-track (one accent bar) / compare-panel (orange payoff) / fadelist (1.0/0.5/0.22 stack).
Frame Treatments
Recipe: ground · register · composes · focal · chrome · accent · silence · Fixed/Free · density. One statement per frame; chrome suppressed on declarative frames.
1 · Cover (identity · move: massive type · ORANGE register · left)
Ground fire-orange. Composes broadside-num, rule, kicker, display, lead. Focal a 1–2 word
Barlow display (13cqw) lowercase in ink, left-anchored, over a small ink rule stub + mono kicker; a
Barlow lead line beneath in 75% ink. Chrome mono catalogue number top-left, mono meta top-right
(no chrome bars). Accent the ink itself is the pop on orange. Silence ~45%. Fixed ink-on-fire,
lowercase 900, flat. Free the word, kicker, lead. Density low.
2 · Statement (declarative · move: type IS composition · DARK register · left)
Ground ink-black. Composes kicker, display. Focal a 2–4 word Barlow display/h1
lowercase in cream, with ONE clause inked {colors.fire-orange}. Chrome mono kicker; no bars.
Accent the orange clause. Silence ~55%. Fixed lowercase 900, one orange clause, flat.
Free the statement, which clause is orange. Density low.
3 · Stat Grid (data · move: top-border cards · DARK · the dense frame)
Ground ink-black, chrome bars present. Composes slide-chrome, kicker, 3× stat-card. Focal a
row of three top-border-only stat-cards — big Barlow-900 numeral in {colors.fire-orange}, Barlow
label, mono note. Chrome top + bottom hairline bars (label + number). Accent the orange
numerals. Silence moderate — the density exception. Fixed top-border-only cards, orange
numerals, 1px hairlines. Free figures (from script), labels. Density dense-exception.
4 · Fadelist (narrative · move: opacity stack · DARK)
Ground ink-black. Composes fadelist (3 stacked Barlow-900 words at 1.0/0.5/0.22), fadelist-title.
Focal the three-stage word stack opposite an oversized display title in {colors.fire-orange}
(before/during/after). Accent the orange title. Silence moderate. Fixed the opacity
ladder, lowercase 900. Free the three words, the title. Density low-moderate.
5 · Pull Quote (quote · move: oversized mark · DARK · left)
Ground ink-black, chrome suppressed. Composes quote-mark, quote-text, attribution. Focal a
Barlow quote-text (700, lowercase) at ≤78cqw under an oversized fire-orange quote-mark (10cqw,
line-height 0.6). Chrome mono attribution (name + role). Accent the orange quote mark. Silence
~50%. Fixed orange mark, lowercase quote. Free quote, attribution. Density low.
6 · Compare (argument · move: split + orange payoff · DARK→ORANGE)
Ground ink-black left panel + fire-orange right (payoff) panel, 1px divider. Composes compare-panel pair, kicker, h3. Focal two panels — left documents (cream on dark), right declares (ink on orange). Chrome mono panel labels. Accent the orange payoff panel. Silence moderate. Fixed ink-on-fire right panel, 1px divider, flat. Free the before/after content. Density standard.
Composition Rules
Do
- Set every Barlow display in lowercase weight 900, negative-tracked — the system's signature.
- Use fire-orange as full environment on declarative frames, the lone accent on dark.
- Keep chrome in IBM Plex Mono uppercase, 0.14em; use the
/mono bullet marker. - Cap bullets at three; one statement per frame; build hierarchy from weight, size, 1px hairlines.
- Suppress chrome bars on cover/chapter/statement/quote/end; let type fill the field.
- Lean left on most frames; the type IS the composition.
Don't
- Never uppercase Barlow display; never add a second accent color.
- Never put cream text on orange (ink-on-fire is absolute); never a cream/paper register.
- No drop shadow, no rounded surface (save nav dots), no gradient ground.
- No serif companion; chrome is never Barlow.
- Don't pack two display moments into one frame; don't blow a long line edge-to-edge — step down.
Aspect-Ratio Behavior
| Treatment | 16:9 | 9:16 | 1:1 |
|---|---|---|---|
| Cover | word left, lead below | word top, lead below | centered word |
| Statement | display left | display stacked taller | display centered |
| Stat Grid | 3 across | 3 stacked | 2+1 |
| Fadelist | stack + title side-by-side | stack over title | stack over title |
| Pull Quote | mark + quote left | mark top, quote below | centered |
| Compare | side-by-side panels | stacked (dark over orange) | stacked |
pad-x holds tight on the short edge; re-step display so the one big line stays ≤78cqw and above the
1.4cqw floor. Mono chrome stays Latin/digit-only.
Approved Entities
No real customers, logos, or vendors are defined in the source — render any such mark as a
placeholder (the dashed img-placeholder at 55cqh). The system supplies type and one color, not brands.
Numerals & Claims (hard rule)
Never invent figures, percentages, dates, or counts at frame scale. Render slots as — figure —,
{metric}, NN%. Stat-card numerals and bar heights carry placeholders until the script supplies
them. Catalogue numbers (No. 01) are decorative chrome and may be sequential.
Pre-Render Self-Audit
- Squint — exactly one display moment dominates; nothing competes.
- Silence — declarative frames ~45–55% empty; only the stat grid runs dense.
- Register — one register per frame; ink-on-fire on orange, cream on dark; no second hue.
- Type — Barlow lowercase 900 negative-tracked, fit-to-measure; mono chrome uppercase 0.14em; ≥1.4cqw floor.
- Depth — 0 shadow, 0 radius (save nav dots); 1px hairlines only.
- Bullets — capped at three, orange
/marker. - Fabrication — every numeral traces to the script, else placeholder.
Known Gaps
- Motion intentionally out of scope. frame.md specifies composition only; the source's 0.8s deck slide + per-element entry animations are deck mechanics.
- Barlow + IBM Plex Mono via Google Fonts; Noto Sans SC is the CJK fallback (the lowercase-display signal has no CJK equivalent — the two-register color system carries the identity, per the source).
- 9:16 / 1:1 are guidance; verify the one big line stays ≤78cqw and above the floor per ratio.
- Bars, compare panels, and the dashed image placeholder are CSS-only; no external imagery is required.