Files
hyperframes/skills/hyperframes-creative/frame-presets/broadside/FRAME.md
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

16 KiB
Raw Blame History


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 (400900) 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 36× everything else; nothing competes.

  • Silence — declarative frames read 4555% empty; the stat grid is the one dense exception.

  • Restraintone 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's vw 1:1).

  • Vertical: 1080×1920 (9:16). Square: 1080×1080 (1:1).

  • Safe area: pad-x/pad-y 5.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 700900) 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; 34 → h1; 5+ → h2. Broadside packs only ONE display moment per frame.
  • Barlow display is lowercase, weight 700900, 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 12 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 24 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 ~4555% 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.