diff --git a/.agents/skills/embedded-captions/.gitignore b/.agents/skills/embedded-captions/.gitignore deleted file mode 100644 index 8700818..0000000 --- a/.agents/skills/embedded-captions/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Matting weights: the PP-MattingV2 ONNX SHIPS with the skill (committed — the -# upstream exports have no stable public download URL). Ignore any other stray -# .onnx (e.g. experimental variants) so they don't get committed by accident. -assets/*.onnx -!assets/ppmattingv2_stdc1_human_544x960.onnx - -# Stray render/test artifacts — a project's outputs must never live inside the skill. -*.mp4 -*.webm -*.log -_*.png -frames_bg/ -frames_fg/ -history/ -*_shadow/ -transcript.json -plan.json -matte.fps -safe-zones.json - -.DS_Store diff --git a/.agents/skills/embedded-captions/CATALOG.md b/.agents/skills/embedded-captions/CATALOG.md deleted file mode 100644 index 8e6d1cd..0000000 --- a/.agents/skills/embedded-captions/CATALOG.md +++ /dev/null @@ -1,91 +0,0 @@ -# THE CATALOG — one front-end, three engines behind - -This is the skill's single selection surface. **The user picks an IDENTITY from -this table; everything else (engine, compiler, authoring file) is derived by -lookup — never ask the user (or yourself) "Standard or Cinematic or Theme?"** -Those are backend names; a product has one UX even when it has several engines. - -Routing procedure (replaces any mode decision): - -1. Probe the clip (decision gate + pre-flight probes as in SKILL.md). -2. Shortlist 2–3 identities from this table by **content register + the user's - own words + scene constraints**. -3. Recommend ONE with a one-line why; the user picks. -4. Author the identity's file (last column), then render with its engine's - pipeline. Done — no category question ever surfaced. - -## Identities - -| Identity | Reading surface | Voice (one line) | Recommend for | Scene needs | Author → engine | -| ------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------- | -| `cream` | scene-embedded column flow | warm poetic light, emergence + glow | introspective, narrative, emotional monologues | dark/mid-tone warm scenes (luma < 150) | cinematic.json → make-cinematic | -| `ink` | scene-embedded column flow | letterpress pressed into bright surfaces | the bright scenes everything else washes out on | BRIGHT scenes (luma > 150) | cinematic.json → make-cinematic | -| `editorial` | scene-embedded column flow | lowercase italic serif, pen-stroke glides | fashion / beauty / lyrical / premium brand films | mid/dark scenes | cinematic.json → make-cinematic | -| `keynote` | scene-embedded column flow | confident centered slides-in-the-scene | launches, founder updates, tech explainers (mood over verbatim reading) | any mid/dark | cinematic.json → make-cinematic | -| `documentary` | scene-embedded column flow | burn-in stillness, bone on charcoal | interviews, journalism, testimony — gravitas IS the style | any | cinematic.json → make-cinematic | -| `loud` | scene-embedded, body in front | percussion type that competes with the face | hype, social reels, sport, music, motivational | any (counter-accent handles warm) | cinematic.json → make-cinematic | -| `neon` | scene-embedded column flow | captions as neon signage in the dark | neon-noir / nightlife / tech-noir / music | dark scenes | cinematic.json → make-cinematic | -| `glitch` | scene-embedded column flow | corrupted-feed RGB-split type | hacker / AI / dystopia content | mid/dark | cinematic.json → make-cinematic | -| `chrome` | scene-embedded column flow | liquid-metal hero with sheen sweeps | fashion-tech, Y2K, product-flex | mid/dark | cinematic.json → make-cinematic | -| `velocity` | scene-embedded column flow | every word arrives along its motion vector | sport, automotive, fitness, kinetic content | any mid/dark | cinematic.json → make-cinematic | -| `anchor` | verbatim lower-third rail + 1 settled climax | the quiet professional — fade-up rail that simply reads; the apex settles behind the subject with a drawn accent underline. Discipline IS the style. | explainers, tutorials, corporate, news-adjacent — **where every word must be read**; the conservative default | any (opaque rail; settle carries a soft veil) | theme.json → make-theme | -| `ordnance` | stamped verbatim rail + detonation apex | military marking system; everything has mass; the room reacts | punchy announcements, drops, "炸一点 / 像 AE 做的" asks | any (charge-dim makes its own contrast) | theme.json → make-theme | -| `terminal` | typed console panel + glyph-decode apex | the transcript is a signal log; apex decodes from noise | tech / data / AI / investigative, "终端/控制台/解码" asks | cool/dusk preferred | theme.json → make-theme | -| `neonsign` | warm tube rail + hand-written neon apex | a sign district at dusk; the apex is WRITTEN stroke by stroke | lifestyle / music / mood, "霓虹/手写" asks | dusk/dark backdrop; needs `python3` (stroke-path gen) | theme.json → make-theme | -| `stardust` | accumulating poem, condensing letters | words condense from dust and return to it | poetic / memory / science-wonder monologues | one clear column side (probe fails → fall back to `cream`) | theme.json → make-theme | -| `stomp` | full-frame takeover cards | hard-cut typographic takeover with a void before the drop | hooks, manifestos, ad openers — the words ARE the show | any (plate runs dimmed) | theme.json → make-theme | -| `lastpage` | manuscript rail + a blurred future-field | the future hangs unreadable in the room; one rack-focus reveals every faint line was the apex word | visionary thesis, prophecy-toned talks, trailers, literary content | mid/dark (the field needs air) | theme.json → make-theme | -| `scoreboard` | split-flap chyron rail + departures-board apex | stadium split-flap mechanics — body words flip-cycle wrong words on tiles before clacking onto the real one; ROW counter + odometer chip furniture; the apex is a giant departures board behind the subject that locks the word letter-by-letter under floodlights and a crowd-flash, status ticker types on | sports, transit/travel, scores, countdowns, reveals, "翻牌/记分牌/机场大屏" asks | any (board + chyron bring their own dark metal contrast) | theme.json → make-theme | -| `transit` | LED departure-strip rail + illumination-wipe apex | amber dot-matrix station PA — body words light column-by-column (L→R LED wipe + arrival flicker) on a docked departure strip whose lines page by scroll-snap; platform tag, ticking clock, ⚠ DELAYED → ● ON TIME gag; the apex panel expands behind the subject inside a chasing LED-marquee border, the word illuminates column-by-column under a PA flash + ding pulses, then pages up and collapses | travel/transit, announcements, schedules, countdowns, retro-terminal, "LED屏/车站到站/点阵屏" asks | any (LED strip + panel bring their own dark contrast) | theme.json → make-theme | -| `vhs` | camcorder OSD rail + REC-FREEZE tracking-slam apex | tape playback — permanent lens vignette + OSD furniture (▶ PLAY, ● REC, blinking green timestamp); body words carry a permanent red/cyan misregistration fringe, arrive by tracking glitch and REWIND off with flat-white echoes + scrub lines (the deck flips PLAY→REW in dead air); the apex is REC FREEZE: 1-frame white tear + head-switching noise bar, the word slams in behind the subject as three sheared tracking bands that SNAP into register, misregistration breathes through the hold under tape weave + auto-iris, then rewinds off | retro / nostalgia / found-footage / home-video, '90s tech, music & lifestyle edits, "录像带/VHS/复古/DV" asks | any (backlight-comp scrim makes its own contrast on bright skies) | theme.json → make-theme | -| `arcade` | arcade HUD rail + pixel-block boss-intro apex | 8-bit cabinet attract mode — the frame plays through CRT scanlines + a corner vignette; body words coin-pop onto a bordered HUD bar (blinking 1UP, CREDIT 01) with a 1-frame white blip each, emphasis words run a cyan→magenta palette swap, lines dissolve checkerboard; the apex is a BOSS INTRO behind the subject: the room dims, WARNING blinks twice, ~64 seeded pixel blocks fall quantized into a matrix grid over the word rect, the word flashes ON in Press Start 2P with chromatic ghost layers + a 3-frame palette strobe while letterbox bars slam in and a HI-SCORE odometer rolls top-right; everything dissolves checkerboard and the blocks drop away | gaming, retro-tech, playful hype, launches, achievement/level-up beats, "像素/街机/8-bit/打游戏" asks | any (boss dim + dark HUD bar bring their own contrast) | theme.json → make-theme | -| `dossier` | manila case-file strip + rubber-stamp apex | cold-war case file — carbon Special Elite HAMMERS onto a manila transcript strip char by char (seeded baselines + ribbon ink, every strike kicks the paper; typed case header, CONFIDENTIAL watermark, red ink circles around the evidence; pages are X-row over-struck and carriage-fed away); the apex is a RUBBER STAMP behind the subject: the footage goes sepia-archival, the stamp crushes in at −8° with a double-strike ghost + thin-ink patches, then holds DEAD STILL — sold only by a breathing paper indent — until the page is filed away with a mechanical yank | investigations, exposés, true-crime, document-driven storytelling, declassified/archival framing, "档案/卷宗/解密/盖章" asks | any (the manila strip is self-lit; the stamp brings its own sepia charge) | theme.json → make-theme | -| `laser` | beam-ignited rail + 6-beam laser-cage apex | concert laser rig in a blackout — every body word is IGNITED where a green and a magenta beam converge on it two frames early (flare pop, snap-on, single strobe on emphasis; a sweeper beam carries each line away); the apex is the drop: a 6-beam array sweeps to one hot point, the word ignites behind the subject in an additive glow stack with two controlled strobe pops, a criss-cross beam cage draws around it, the array fans out wide through the hold, then the beams sweep everything off L→R | music, nightlife, festivals, drops, hype reveals, keynote 'one more thing' beats, "激光/灯光秀/蹦迪字幕" asks | any (the concert blackout makes its own contrast, bright skies included) | theme.json → make-theme | -| `thunder` | rain-washed rail + branched-bolt strike apex | the storm is the editor — slate storm mood on the room, ambient slanted rain falling in front of the subject, and the sky "kisses" (1-frame brighten) on every body word; rail words arrive with a lit-bright lightning pop (emphasis = sheet-lightning double flash mirrored by a double sky-kiss); the apex is THE STRIKE: a hand-authored branched bolt flashes two frames before the word, the word slams in lit HARD with its shadow flipped toward the bolt, ozone under-glow breathes through the hold while the rain doubles, then everything washes downward with the rain | dramatic reveals, storm/weather content, epic hype beats, trailer-toned monologues, "雷电/闪电/暴风雨字幕" asks | any (charge-dim + radial word scrim make their own contrast, bright skies included) | theme.json → make-theme | -| `hologram` | volumetric projection plate + hologram-boot apex | every caption is LIGHT cast from an emitter — body words boot onto a scanlined projection plate with a rising sweep, a 1-frame interference glitch and a permanent cyan/magenta fringe (emphasis words drop out for 2 frames and restore brighter; lines drift in rotationY and exit by projector cut); the apex is the full volumetric boot: a desk emitter dot pops, the cone snaps wide, a seed beam fires, and the word materializes behind the subject as a 7-layer hologram with climbing interference bands — a hand passes through it before the projector cuts it back to the dot | tech / sci-fi / AI / space / imaging explainers, futuristic product reveals, "全息/投影/科幻字幕" asks | any (the apex scrim + dim make their own contrast; wants a lower frame edge for the emitter dots) | theme.json → make-theme | -| `biolume` | jellyfish glow-on rail + bioluminescent-bloom apex | deep-sea bioluminescence — the clip sinks into an abyss grade with a breathing vignette and every caption is a living light: body words GLOW ON like jellyfish (radial bloom from center while a cyan glow breathes in; emphasis words pulse a slow propulsion double-beat) across two coexisting floating rows and SINK away dimming; seeded plankton motes drift the open water and the ones ringing the apex are pulled into the bloom; the apex is the BLOOM behind the subject: a creature pre-glow double-beats and crushes to a point, the word condenses in, six luminous tendrils draw outward like filaments while caustics shimmer, cyan light spills onto the scene and spores burst past — then all the light sinks back into the deep | ocean / nature / science-wonder docs, dreamy or meditative monologues, slow night-time reveals, "深海/发光水母/水下字幕" asks | any (the abyss grade + pocket scrim make their own contrast on bright scenes) | theme.json → make-theme | -| `aurora` | iridescent sheen rail + silk-ribbon draw-on apex | polar-night elegance — two huge aurora blobs drift the sky all clip; body words are silk serif ink whose rose→teal→violet sheen drifts continuously through the letters (entrance = 2-frame flow-on + y8 settle; emphasis = one bright highlight sweep marching through the word), lines share two coexisting rows like a woven couplet and dissolve UPWARD into drifting light streaks; the apex is a SILK RIBBON: the hero word is hand-WRITTEN into the sky behind the subject stroke by stroke (script single-line font, blurred halo + bright core, a light mote riding the pen) and the aurora gradient keeps FLOWING through the drawn ribbon during the hold while a soft spill tints the sky and light motes rise past the subject — gentle, no shake | dreamy / romantic / wonder content, night-sky and travel pieces, poetry, weddings, elegant brand films, "极光/丝带/优雅手写字幕" asks | any (apex scrim + dark understroke carry contrast on bright skies; loves dusk/night) | theme.json → make-theme | -| `spectrum` | oscilloscope scope-band rail + phosphor trace-write apex | an oscilloscope is listening — a dark scope band hosts an ALWAYS-ALIVE waveform (seeded pseudo-RMS envelope: speech grows it, silence flattens it, every word arrival kicks a local burst) under VT323 phosphor lines that wipe in L→R over reserved slots with a 2-frame just-traced flash (emphasis words get a ticking frequency-readout chip, the trig LED blinks on every word); the apex is the trace itself LEAPING off the scope (surge column) to hand-WRITE the hero word in a thin phosphor script stroke, fill flicker-on, hum + breathe, then COLLAPSE to a flatline before the next spoken word — and on the FINAL word the trace explodes to max-amp chaos, flatlines to a single dot and stamps SIGNAL LOST | science / signal / audio / measurement / astronomy explainers, data-nerd content, retro-lab or synth aesthetics, "示波器/波形/信号字幕" asks | any (the scope band brings its own dark glass; the apex scrim handles bright skies); needs `python3` (stroke-path gen) | theme.json → make-theme | -| `papercut` | paper-chip craft rail + stop-motion papermat apex | stop-motion paper craft — the frame becomes an animator's table: body words are cream paper chips PLACED one by one (steps(2) drop, seeded crooked, ~5fps wobble) on a kraft strip with torn top edge, washi-taped corners and a handwritten cut&paste tag; emphasis words get a washi-tape slap, the final word is an accent-red sign-off chip, and a red paper star stands in for the hero word; the apex is a torn kraft mat slapped down behind the subject where torn-edge letter chips DROP with stepped gravity + anticipation shadows, land crooked, settle in 12fps poses, wobble at 8fps while a warm vignette charges — then the FINAL word bumps the table and everything scatters off down-right | craft/DIY, kids & family, indie product demos, behind-the-scenes, maker channels, "手工/剪纸/定格动画字幕" asks | any (kraft strip + cream chips bring their own warm contrast) | theme.json → make-theme | -| `popup` | pop-up book page rail + centerfold starburst apex | a pop-up book opens inside the frame — body words POP UP on a baseline hinge (rotationX back.out, paper overshoot, a growing back-shadow) along a cream page strip that unfolds from the bottom edge (center foldline, two alternating reading rows); emphasis words land bigger with a contact squash the page FEELS (1px strip dip), then flick-wobble with a blue paper strut leaning in behind; line exits fold flat in an L→R wave (the page closing), the whole page TILTS on the final word and the strip folds shut on the last frame; the apex is THE CENTERFOLD: blue + cream 12-point paper starbursts unfold behind the subject, the hero word pops up in three hinged clip-path segments, kraft struts lean in, backdrop + word wobble-settle TOGETHER and breathe through the hold — then the whole spread folds flat before the next sentence; a blue paper star holds the hero slot on the rail and paper confetti flicks past the subject at the pop | kids and family content, storytelling, education, greeting-card / wholesome brand spots, picture-book and craft channels, "立体书/弹出书/纸艺字幕" asks | any (the cream page strip is self-lit; the apex dusk scrim guards bright skies) | theme.json → make-theme | -| `chalkboard` | chalk-band rail + hand-written chalkwrite apex | night lecture — a worn deep-green chalk band where every word is SCRIBBLED in fast chalk (2-frame pop + steps(4) scribble reveal + dust puff at the base, seeded crooked); emphasis gets double underline dashes, the final word lands in yellow chalk, and between sentences an ERASER SWIPE smears the old words off (blurred light band, ghost smudges stay — chalk never fully erases); the apex: the band GROWS into a full blackboard behind the subject and the hero word is HAND-WRITTEN 130px tall stroke by stroke (jittered chalk nib, dust falling from the pen, blurred halo under a tight core), finished with a hand-slap dust CLAP in front of the subject + a 1-frame board shake and two violent accelerating underlines, then the halo breathes through the hold | education / explainers, science and lecture content, teacher channels, documentary asides, "黑板/粉笔/板书/老师讲课字幕" asks | any (the deep-green board brings its own contrast); needs `python3` (stroke-path gen) | theme.json → make-theme | -| `graffiti` | marker rail + spray-tagged handstyle apex | street bombing run — marker words FLICK onto the rail crooked (1-frame squeak skew, seeded rotation, back.out settle); emphasis takes alternating yellow/magenta paint + a spray-underline swoosh with overspray dots; spent lines are ROLLER-BUFFED away (gray roller sweep, wet smear lingers) and the final word lands BIG in yellow with the punch; the apex: the dusk wall dims, the can RATTLES, and the hero word is spray-TAGGED stroke by stroke behind the subject in fat yellow paint (dark under-stroke armor + blurred overspray halo + glowing nib + seeded overspray dots), paint DRIPS grow from the low points through the hold, a magenta paint splat pops at the pen-finish and the plate punches on it | street culture, hip-hop / rap, sneaker & fashion drops, urban sports, skate/BMX, rebellious brand spots, "涂鸦/喷漆/街头字幕" asks | any (the dark under-stroke armors the tag against bright skies); needs `python3` (stroke-path gen) | theme.json → make-theme | -| `brush` | washi paper-band rail + sumi-e brush-gesture apex | sumi-e study — a deckle-edged washi paper band swipes in behind a traveling brush-head shadow; body words are brush-WIPED on in a Mincho serif (clip reveal behind a per-word brush head, seeded ±1° tilt), emphasis gets a double curved ink underline, and spent lines are wiped OFF right-to-left like a wet cloth (erase brush head riding the wipe); the apex: a warm paper wash charges behind the subject and the hero word is written in ONE violent calligraphic gesture — pressure-tapered wet brush (four stacked stroke widths, blurred bleed underneath), start-SPLAT at the first pen contact with ink flecks kicking past the subject, spatter droplets ejected at the sharpest curves — then the ink BLEEDS into the paper through the hold (the work breathes) and a vermilion SEAL chop (観) stamps beside the ink with the plate punch | calm-authority explainers, craft / design / philosophy / Japan-adjacent content, tea / meditation / writing channels, elegant brand films, "水墨/毛笔/书法字幕" asks | mid/bright scene band (dark ink + its paper wash carry the contrast); needs `python3` (stroke-path gen) | theme.json → make-theme | -| `inkwater` | three-row ink rail + ink-drop bloom apex | sumi ink dropped in still water — paper-white radial washes back the text zones, Mincho-serif ink words BLEED into three fixed reading rows (blur+scale bleed over a paper-glow halo, dark blurred halo overshoots then tightens, an ink-settling hairline under each line, emphasis sheds a curling ink wisp) and spent lines re-dissolve upward like dispersing ink; the apex: a dark drop falls behind the subject, hits an invisible water surface at the word point and BLOOMS (three stacked blurred ink ellipses at counter-rotating rates + two thin ripple rings) while the world stills under a gentle vignette — the hero words resolve out of the blob on their own spoken times, breathe at the glyph edges through the hold, then re-dissolve before the next thought needs the reader | contemplative / literary / scientific-wonder narration, astronomy / nature / memory / essay films, poetry and slow-craft channels — one liquid meditative event instead of an impact, "水墨滴落/墨水字幕" asks | mid/bright scene band (dark ink + its paper washes carry the contrast) | theme.json → make-theme | -| `ransom` | cutout-chip collage rail + ransom-note slam apex | kidnapper's collage — every word is a chip clipped from a different page (cream Anton / black Inter / newsprint typewriter / accent-yellow marker, torn edges, hard offset shadows) PASTED crooked on the rail with misaligned baselines (the apex slam at low amplitude); emphasis words get a 1-frame RE-PASTE lift (shadow grows, rotation flips sign for good) and spent chips are RIPPED off one by one under 1-frame paper-tear flashes; the apex: a collage scrim darkens the sky and the hero word slams in letter by letter as a ransom note BEHIND the subject — each letter a different cutout chip, flight shadow popping tight on contact — the whole word JOLTS as the last letter lands (the plate punches with it), looms crooked through the hold, then is torn off chip by chip while the closing line speaks | true crime, mystery / thriller, heist energy, punk / DIY zine aesthetics, edgy drops, unhinged-comedy hooks, "勒索信/剪贴/拼贴字幕" asks | any (solid chip backgrounds carry their own contrast; the apex scrim guards bright skies) | theme.json → make-theme | - -## Shortlisting heuristics (identity-level, not category-level) - -- **"每个词都要被读到 / accessibility / 教程·新闻"** → rail or panel surfaces: - `anchor`, `ordnance`, `terminal` (all verbatim by construction). -- **"嵌进场景 / 电影感 / 高级"** → the column-flow ten; pick by register + scene luma - (bright → `ink`; warm dark → `cream`; fashion → `editorial`; …). Bright + must-read → `anchor`. -- **"炸 / 特效 / 酷炫 / 像 AE"** → `ordnance`, `stomp`, `terminal`, `loud` — pick by - what should explode: a word (`ordnance`), the frame (`stomp`), a decode (`terminal`), - every beat (`loud`). -- **Named worlds** → direct hits: 控制台/终端 → `terminal`; 霓虹/招牌 → `neonsign`; - 诗/星尘/记忆 → `stardust`; 军事/重击 → `ordnance`; 预言/未来/悬念揭示 → `lastpage`; -- **Scene constraints veto last**: luma > 180 kills cream/screen column looks - (→ `ink` or a rail/panel surface); dusk/dark unlocks `neon`/`neonsign`. -- **Unsure** → `anchor` (the conservative default: words read, scene safe, zero spectacle). - EXCEPTION: if the ask literally says "嵌进场景 / embed into the scene / 电影感", that signal - OUTRANKS the conservative default — go column-flow (pick by register + luma), not a rail. - -Adjacencies worth knowing (these pairs are why the old mode question was hard — -recommend by the difference, don't agonize over category): `loud` vs `ordnance` -(percussive type vs a themed world with plate reaction) · `neon` vs `neonsign` -(neon-styled captions vs a sign being written) · `cream` vs `stardust` (warm -embedded flow vs an accumulating poem with semantic dispersal) · `terminal` vs -`glitch` (a console WORLD with typed log + decode vs corrupted-feed styling on -normal captions) · `stomp` vs `loud` (every beat takes over the dead-center -frame vs energetic type that still shares the frame with the subject). - -## Rules - -- Identities are **engine-locked** — no cross combos. Opening a new combo (e.g. - another DNA under rail) is a validation event: render → user review → flip the - DNA's `deliveries.rail` flag (see dna/README.md). -- New identities join via their family's registry rules (dna/README.md for - classic, themes/README.md for themed — "any input, zero hand-fixing" bar). -- The engines' internals (Standard/Cinematic/Theme compilers, gates, layers) - are documented in their own files; this catalog is the only routing surface. diff --git a/.agents/skills/embedded-captions/SKILL.md b/.agents/skills/embedded-captions/SKILL.md deleted file mode 100644 index eadedc2..0000000 --- a/.agents/skills/embedded-captions/SKILL.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -name: embedded-captions -description: > - Add captions or subtitles to an existing single-subject talking-head video without editing the - footage. Use for plain verbatim captions, cinematic captions embedded behind the subject, VFX - captions, “炸/特效/酷炫字幕,” or a named identity from the 35-style catalog. Route by visual - identity, not by backend engine. The quiet `anchor` rail is the default; embed every word only - when the user explicitly wants a fully cinematic treatment. The workflow runs locally end to end, - including transcription and subject matting; split multi-shot footage before applying it. ---- - -**Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below. - -> **First, keep this skill fresh — confirm with the user before running:** `npx hyperframes skills update embedded-captions`. A fast no-op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them. - -# Embedded Captions - -**One catalog, picked up front** ([CATALOG.md](CATALOG.md) — 35 identities; the engines behind it are backend detail). **Standard** (default) builds a clean verbatim **rail** (lower-third subtitle carrying most text) + an **embed** climax composited _into_ the scene behind the subject at the peak. **Cinematic** is pure embed — no rail, every caption composited behind the subject (hero typography, accumulation, occlusion as the effect). **Theme** is a complete themed constitution — body paradigm × hero setpiece × front fx × plate reaction, composed from registries ([themes/README.md](themes/README.md)): `ordnance` `terminal` `neonsign` `stardust` `stomp`. Most explainer / voiceover is **Standard**; **embed is the scarce, earned peak** — embedding every word is the common mistake; Theme is for VFX-grade asks ("炸", "特效", "像 AE 做的"). - ---- - -## Runtime prerequisites - -Plugin installs use the bundled, manifest-pinned CLI for matting, transcription, -and rendering; no source checkout is required. The local preview and caption -measurement helpers also need Sharp, Puppeteer (with its Chromium browser), and -GSAP. Install these in the **caption project**, not inside the read-only plugin: - -```bash -npm install --prefix --save-dev --save-exact sharp@0.35.3 puppeteer@25.8.0 gsap@3.15.0 -``` - -Keep the project's lockfile. If these dependencies already exist, use its locked -versions instead of overwriting them. Bash and FFmpeg/ffprobe must be on PATH. -Matting and transcription may download their own models on first use. - -Rendering waits for the CLI to exit successfully before compositing. The old -`HF_TIMEOUT_S` shell watchdog is no longer used: a large partial file is not proof -that rendering finished. An explicit built-checkout argument or `HYPERFRAMES_ROOT` -selects the contributor CLI instead of the plugin pin. Cancel a stalled render normally through the CLI/terminal; -the caption helper does not force-kill or recover a render from a process snapshot. - -## Operational flow (TL;DR) - -Routed through `/hyperframes`, the intent layer confirms only the input (which clip) and **announces** the identity pick as a deferred ask — the shortlist needs the probed clip, so it stays at step 1 below; the layer's run-shape questions don't apply (the footage is untouched, there is no storyboard to review). A `BRIEF.md`, when present, carries the confirmed input and any user notes — read it first. - -The craft prose below is long; the **pipeline itself is short** — and everything deterministic is computed or compiled, never hand-written: - -1. **Decision gate** (refuse bad clips) → **pick ONE identity from [CATALOG.md](CATALOG.md)** (35 identities; engine/compiler derived by lookup — never surface a mode/category question) -2. `hyperframes init` (skip it if the project dir already exists with the video inside — `matte.cjs`/`transcribe.cjs` adopt any video in the dir as source.mp4) → **`bash scripts/prepare.sh `** (matte ∥ transcribe ∥ audio-envelope in parallel, then safe-zones v2 with scene palette/optics/lighting — one command, nothing forgotten) -3. **author a small JSON of creative choices** (read `safe-zones.json` first): Cinematic → `cinematic.json` → `make-cinematic.cjs` (derives `plan.json` and compiles it); Theme → `theme.json` → `make-theme.cjs` (rail/panel/poem/takeover paradigms; `anchor` is the quiet rail default) -4. **Visual QA**: `node scripts/preview-frames.cjs ` → faithful composite previews in ~2s/frame (no render). Check § Visual QA before paying for a render. -5. `render-and-composite.sh` → gates (timing / occlusion+hero / overflow / hand-off) → `final.mp4` - -Load-bearing rules people miss: - -- **rail (default) + embed (promotion).** `drop` (filler, not shown) / `rail` (verbatim lower-third subtitle, in front, carries most text) / `embed` (a peak word composited behind the subject). **Standard mode does both**, embedding only the peak(s). See **§ Caption model**. -- **The video is delivered UNTOUCHED (Standard/Cinematic; **Theme mode's PLATE budget is the one sanctioned exception** — register-gated reaction beats (charge-dim, punch, shake, grain) defined per theme DNA and applied AFTER the matte composite so subject+text+plate move as one frame)** — captions are the only thing added; the matte just lets the subject occlude the embed track. Never grade/recolor/scanline the footage. -- Two rulebooks: **rail → [references/rail.md](references/rail.md)** (thin), **embed craft → [references/composition-craft.md](references/composition-craft.md)** (rich, embed-only). Skim by need. - ---- - -## Caption model — rail + embed - -Every spoken phrase is one of three things: - -| | What | How it's shown | -| --------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **drop** | filler — um/uh, stutters, self-corrections | not shown | -| **rail** | the default — ordinary spoken content (verbatim) | clean lower-third subtitle, **in front**, readable. A punch word can get an inline `emphasis` highlight (accent colour / active-word pop) — it stays on the rail. | -| **embed** | a promoted peak — the headline beat | one big word composited **behind the subject** (matte occlusion), designed entrance + exit | - -**The rail carries most of the text; embed is the scarce, earned peak.** Scarcity is **per beat/block, not per clip**: ≤1 hero per block (thought), never two co-visible, ≥ a beat of air between hero windows (the compiler warns under 0.6s). A short clip → usually 1–2; a long explainer → ~one per section. Among multiple heroes, the **largest authored one is the APEX** (it alone gets the full lockup embed + width-fit raise); smaller ones are **MINOR peaks** that ride their column as oversized emphasis lines (fg, damped motion) — not every beat needs the matte showcase, which is exactly what keeps the apex an event. Embedding every word is still the common mistake. - -Rail-surface identities build exactly this (rail = `rail.html`, embed = the climax in `index.html`). Column-flow identities drop the rail and make everything embed-style — recommend them only for mood-over-verbatim asks, never for explainer / voiceover where the words must read (CATALOG.md encodes this per identity). - ---- - -## Step 0 — pick ONE identity from the CATALOG - -**One front-end, three engines behind.** The user picks an IDENTITY from [CATALOG.md](CATALOG.md) (35 entries: 10 classic + 25 themed); the engine, compiler and authoring file are derived by lookup from the catalog row. **Never surface "Standard vs Cinematic vs Theme" as a question** — those are backend names (a product has one UX even with several engines). The catalog encodes everything routing needs: reading surface, voice, recommend-for, scene needs, adjacency notes for the genuinely-close pairs (loud↔ordnance, neon↔neonsign, cream↔stardust). - -The identity pick is a **preference gate** (`../hyperframes/references/brief-contract.md` § 1): in autonomous mode ("surprise me" / "decide for me"), pick from your shortlist yourself and state the one-line why instead of asking. - -Procedure: probe the clip → shortlist 2–3 identities from the catalog → recommend ONE with a one-line why → **the user picks** (autonomous mode: you pick, stating the why) → author that identity's file. Identities are engine-locked (no cross combos; opening one is a validation event — see dna/README.md). - -**Always present your recommendation and let the user pick before you author.** Don't silently default. - -(The full identity table lives in [CATALOG.md](CATALOG.md) — single source of truth for routing. The engine docs below describe each backend's authoring contract.) - -**CATALOG.md is the whole answer space here: this workflow does not search the HyperFrames component registry.** The composition workflows run `npx hyperframes catalog` before authoring a named look; this one must not. Its engines are locked compilers that consume `cinematic.json` / `theme.json` and emit the composition themselves, so a registry item — the `caption-*` blocks included — has nothing to mount into. A registry block styles text on a designed canvas; this skill burns captions into somebody's footage through a matte. When no identity fits the ask, say so and pick the nearest, rather than reaching outside the catalog. - -**Recommendation heuristic**: use the "Shortlisting heuristics" in [CATALOG.md](CATALOG.md) — they are identity-level (e.g. "炸" shortlists ordnance/stomp/terminal/loud and picks by WHAT should explode), never category-level. Unsure → `anchor`. - -- **Cinematic** → write `cinematic.json` for a locked template, compiled by `make-cinematic.cjs`. -- **Theme** → read [themes/README.md](themes/README.md), author `theme.json`, run `scripts/render-theme.sh` (compiles + renders + plate reaction → **final_fx.mp4**). - ---- - -## Decision gate — RUN FIRST - -Probe the video and classify the scene before either mode. - -```bash -ffprobe # specs -ffmpeg -ss -i -vframes 1 sample.png # at 20/50/80% -``` - -Read the samples. Refuse if: - -- Multiple speakers / hard cuts (split & render each shot, or refuse) -- No human subject (this skill is for talking-head) -- Under 3 seconds, **no speech**, or face never clearly visible — `transcribe.cjs` warns when audio is near-silent (Whisper hallucinates words like "Thank you." over silence); **heed it and refuse** rather than caption fabricated words -- **Source already has burned-in captions / subtitles / heavy text graphics** — adding a second caption system conflicts and the footage ships untouched (no covering/inpainting). Burned text often appears only mid-clip: sample a **1fps contact sheet** (`ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png`), don't trust 3 spot frames. -- **Transcript is garbage** — non-native/heavy-accent speech can transcribe into confident gibberish. Sanity-read `transcript.json` before authoring; if it doesn't parse as language, try `WHISPER_MODEL=medium` once, else refuse (a verbatim rail of fabricated words is worse than no captions). -- Busy handheld with fast motion (matte flickers) - -### Pre-flight probes (cost nothing, prevent the worst failures) - -1. **Shot-cut probe.** Sample frames at 20%, 50%, 80%. If a different subject/scene appears, **trim the clip** before the cut. -2. **Letterbox / pillarbox probe.** Black bars on the first frame? Compute safe content rect and constrain caption placement inside it. -3. **Luminance probe.** Sample the caption region's average luminance — `under 60` → light text reads as-is, `60-180` → add the glyph scrim, `180+` → opaque text + scrim (never bare light text). **Cinematic templates are cream+`screen` and LOCKED** — use this probe to _pick a fitting identity_ (bright scenes → `ink`, or the opaque-rail `anchor` theme), never to recolour one. -4. **Identity recommendation by tone (you recommend; the user picks — see Step 0 + CATALOG.md).** explainer / interview / must-read words → rail/panel-surface identities; poetic / social / "cinematic" → column-flow identities by register; "炸 / 特效 / VFX" / named worlds → themed identities. When unsure → `anchor` (words read, scene safe) — but present a shortlist and let the user choose. - ---- - -## Pipeline — 5 steps - -``` -1. hyperframes init --non-interactive --video --skill=embedded-captions -2. bash scripts/prepare.sh # matte ∥ transcribe (parallel) → safe-zones. One command. - # → frames_fg/ transcript.json safe-zones.json -3. [AGENT STEP — the only creative step] author a small JSON; see below by mode - Cinematic: author cinematic.json → node scripts/make-cinematic.cjs - Theme: author theme.json → bash scripts/render-theme.sh (compiles + renders + plate fx) -4. node scripts/preview-frames.cjs # ~2s/frame composite previews → § Visual QA (BEFORE the render) -5. bash scripts/render-and-composite.sh # gates → final.mp4 + history/ snapshot - (Theme mode: SKIP steps 3b/5 — render-theme.sh already runs compile + render-and-composite - + _postfx.sh; the deliverable is final_fx.mp4, final.mp4 is pre-plate-reaction) -``` - -Step 1's `init` checks the installed skills against the latest on GitHub and updates the global set if any are out of date. - -Step 3 differs by mode: - -### Step 3 — Cinematic mode (pure embed) - -1. **Read `safe-zones.json` first.** Narration planes go in **`zones.hugLeft`/`hugRight`** — clean strips ABUTTING the silhouette (text far from the body reads as floating, not embedded; far corners are the fallback, not the default). The hero defaults to `heroAnchor`/`heroBands.best` (centered ON the subject, ~30–55% occluded). `recommendation:"fg"` moves NARRATION in front for legibility; **the hero stays embedded whenever `heroBands.feasible`** — hero-fg is the last resort. -2. **The DNA is the identity you picked in Step 0** (CATALOG.md) — do not re-open the choice here. Sanity-check it against the scene (bright hero band luma > 150 wants `ink`; full pick guidance lives in the catalog, covering all ten incl. neon / glitch / chrome / velocity). State your pick + why; the user decides. The DNA locks type/palette/blend/motion + hero three-act; safe-zones v2 (`palette`/`optics`/`lighting`) parameterizes it to THIS scene automatically. -3. **Author `/cinematic.json`** — `"dna": ""` + thought-BLOCKS, not raw groups: each block = lines of words (grouped 2–5 at clause boundaries) + the plane it stacks in + per-line `css` (size/weight/style only — no positions) + at most ONE line marked `"hero": true` (the promoted word; `"text"` for display form). Schema: `scripts/make-cinematic.cjs` header. -4. **Compile**: `node scripts/make-cinematic.cjs ` — lowers blocks → plan.json → index.html. Generated for you: transcript-sequenced timings, accumulate-within-block, page-flip-between-blocks, **the hero LOCKUP** (a hero block's pre-context, HERO and post-context stack as ONE bonded composition centered on the subject — reading order top→bottom = spoken order by construction; context floats in FRONT while the hero embeds BEHIND = the depth sandwich; a mass rule keeps the hero dominating its context), apex/minor hero split, **reading order by construction**, fg fallback per safe-zones. Then the gates run as usual. _(Hand-authoring plan.json directly remains possible for designs blocks can't express — then run `fill-timings.cjs` + `fit-fonts.cjs` + `make-composition.cjs` yourself.)_ - -### Step 3 — Theme mode (themed constitution) - -**Read [themes/README.md](themes/README.md) FIRST** — paradigm/setpiece registries, linkages, hard rules, and the exact `theme.json` schema. - -1. **Pick a theme DNA** by content register (each `themes/.json` has `voice` + `when`). State your pick + why; the user decides. -2. **Author `/theme.json`** — `dna`, `lines` (verbatim, transcript order; 1–5 words each — for `takeover` each line is one CARD), `minors` (emphasis words), `hero:{match}` (the climax word/phrase; leave it OUT of `lines` for embed setpieces, keep it IN for inline setpieces and panel+redact). -3. **Render**: `bash scripts/render-theme.sh ` — compiles (verbatim-completeness gate at compile time), renders both layers, composites, applies the plate reaction → `final_fx.mp4`. Use `preview-frames.cjs` between compile and render for Visual QA. - ---- - -## Visual QA — preview BEFORE you render - -`node scripts/preview-frames.cjs [t…]` composites **faithful preview frames in ~2s each** (caption layers screenshotted at seek-time + real video frame + matte occlusion + rail overlay = what the final composite will look like at that moment). Default samples = each group/climax window. A full render costs minutes — never use it to _discover_ layout problems. - -Check the previews (`/preview/sheet.png`) against this list — these are the failures the geometric gates **cannot** catch: - -1. **Washout** — light text over a bright region (window/sign/sky): unreadable → move the plane or change DNA/mode (bright scene → `ink`). -2. **Text-on-text** — captions over the scene's own text/graphics, or two caption groups colliding. -3. **Reading order** — on-screen vertical order must match spoken order; the hero must not sit below later words. -4. **Hero presence** — the climax should be BIG and visibly behind the subject (~30–55% occluded), not a floating label in a margin. -5. **Balance** — one coherent column/band, not scattered fragments; margins breathing; nothing clipped. - -Then the **5 positive checks** in [references/reference-bar.md](references/reference-bar.md) (poster test · timid test · one-glance hierarchy · scene handshake · dead-air audit) — the failure list keeps a render from being broken; the positive list is what makes it _designed_. Ship when both pass. - -**Fresh-eyes review (recommended for anything user-facing):** you have confirmation bias about your own layout. If you can spawn a subagent, give it ONLY the preview sheet + this checklist and ask for PASS/FIX verdicts per frame ("review these caption previews against the 5-point checklist; answer PASS or the specific fix per frame"). Apply fixes in cinematic.json / theme.json, recompile, re-preview — each loop costs seconds. Render once, when the previews pass. - ---- - -## The DNA registry — ten visual languages (replaces the template catalog) - -Both modes draw from **[dna/](dna/README.md)** — ten art-directed visual languages that **parameterize per scene** (accent sampled from the footage, contact shadow along the measured light direction, depth-match blur, RMS-coupled hero amplitude): - -| DNA | Register | Scene fit | Voice | -| --------------- | -------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| **cream** | premium-warm | dark/mid warm scenes | Inter + warm cream + screen; glowing emergence hero (successor of cinematic-cream) | -| **ink** | premium | **bright scenes (luma > 150)** | near-black multiply — type printed ON the wall; the bright-scene answer | -| **editorial** | editorial-luxe | introspective / fashion / poetic | Bodoni Moda, lowercase-italic hero — magazine elegance | -| **keynote** | tech-premium | product / launch | opaque white Inter 800, dead-center stillness | -| **documentary** | formal | interview / serious | burn-in reveals, no hero — gravitas IS the style | -| **loud** | loud | hype / sport / social | Anton + scene-sampled accent, single-unit slam + ripple; body ANNOUNCES in front (`bodyLayer: fg`) | -| **neon** | loud-neon | neon-noir / nightlife / tech-noir (dark scenes) | electric-cyan signage, ignition flicker, the hero powers ON like a sign | -| **glitch** | loud-neon | digital / hacker / AI | RGB-split echoes snap together on landing; machine-percussive timing | -| **chrome** | loud-luxe | Y2K / fashion-tech / music | liquid-metal gradient hero + one sheen sweep during the hold | -| **velocity** | loud-sport | sport / auto / fitness | every word arrives along its motion vector (streak+skew), hero passes with speed trails | - -Pick by `safe-zones.json` (`heroAnchor.bandLuma`, `palette.temperature`) × content register — [dna/README.md](dna/README.md) has the decision rule. Authoring: `cinematic.json` takes `"dna": ""`. - -The engine generates the **hero three-act** from the DNA (no authoring needed): co-visible captions dim (setup) → per-letter entrance with amplitude ∝ spoken loudness (impact) → breathe + glow until exit (afterglow). - -(Legacy: `plan.template:"cinematic-cream"` maps to `dna:"cream"` automatically. The retired 54-template library is archived outside this repo and is not distributed with the skill; `_motion.md` remains in-skill as the motion-verb reference catalog.) - ---- - -## Aesthetic decision — tone × shot × platform (input to the catalog shortlist, NOT a second router) - -Classify the clip on 3 axes and feed the result into CATALOG.md's shortlisting — this section never picks a mode/engine by itself: - -**Tone** (what feel does the content have?) - -- documentary | conversational | energetic | poetic | keynote | investigative | music-video - -**Shot** (what's the framing?) - -- close-up (head + shoulders) | mid-shot (torso+) | wide (full body+) | cut-montage (mixed shots) - -**Platform** (where will it play?) - -- 9:16 portrait (TikTok/IG/Shorts) | 16:9 landscape (YouTube/web) | 1:1 square | broadcast export - -Cross-reference in [references/direction-catalog.md § Classification matrix](references/direction-catalog.md) for direction language — then return to [CATALOG.md](CATALOG.md) to shortlist identities (this matrix informs the shortlist; the catalog is the only routing surface). - -## Composition craft (embed track) — read before embedding - -The full **embed-track** playbook lives in **[references/composition-craft.md](references/composition-craft.md)**: transcript role-annotation, phrase grouping, planes & clean-zone anchoring, zone coherence, climax pop & readability, edge-breathing, the occlusion 3-step judgement, and accumulation/persistence. It governs how a _promoted_ phrase sits INTO the scene — read it before authoring any embed (Cinematic `cinematic.json` or Standard `index.html`). The default **rail** track has its own, much simpler spec → **[references/rail.md](references/rail.md)**. - ---- - -## Shared knowledge - -| Doc | What | -| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | -| [references/rail.md](references/rail.md) | **The rail track** — standard lower-third subtitle spec (the default; carries most text). | -| [references/composition-craft.md](references/composition-craft.md) | **The embed-track playbook** — grouping, planes, climax pop, occlusion judgement, accumulation/persistence. Read before embedding. | -| [dna/README.md](dna/README.md) | **The DNA registry** — ten scene-parameterized visual languages; how to pick. | -| [references/reference-bar.md](references/reference-bar.md) | **The taste bar** — per-register world-class references + the 5 positive checks. | -| [references/aesthetic-principles.md](references/aesthetic-principles.md) | **The 18 rules.** Beat Veed AI on taste. Read first. | -| [references/motion-vocabulary.md](references/motion-vocabulary.md) | 10 named motion primitives + tone→timing lookup | -| [references/direction-catalog.md](references/direction-catalog.md) | 10 ship-ready aesthetics + tone×shot×platform matrix | -| [references/anti-patterns.md](references/anti-patterns.md) | Bugs already locked out (CoreML, letter-spacing reflow, etc.) | -| [references/scene-types.md](references/scene-types.md) | When a wall surface is usable (4 conditions) | -| [references/layout-heuristics.md](references/layout-heuristics.md) | Plane positioning, clean-zone selection, crown 3 conditions, pillarbox math | -| [references/typography-presets.md](references/typography-presets.md) | Font-size × column-width matrix (starting points) | -| [references/caption-grouping.md](references/caption-grouping.md) | Word → group rules (pauses, sentence boundaries) | -| [references/failure-modes.md](references/failure-modes.md) | Long tail of dev gotchas | -| [references/bespoke-vs-presets.md](references/bespoke-vs-presets.md) | Why presets fail sometimes; clone-and-tweak pattern | - -**Read the aesthetic principles and direction catalog FIRST.** Everything else is implementation detail. - ---- - -## Non-negotiables - -- **Face must never be 100%-covered continuously** — every 0.3s window, face bbox ≥30% uncovered. -- **WCAG contrast** — final render lints; fix palette if it fails. -- **Deterministic** — no `Math.random()`, no `Date.now()`, no `repeat:-1`. -- **Never grade/recolor the video.** The footage ships untouched — captions are the only addition. No full-frame scanlines / duotone / darken / vignette over the a-roll. neon-noir/CRT texture belongs _inside_ a caption element, not over the whole frame. -- **Rail-first for talking-head / explainer.** Don't embed the whole transcript — most text is the rail; embed only peaks. Embedding everything is the default mistake. -- **Embed is scarce + spaced.** ≤1 embed per sentence/beat, never two adjacent or co-visible, ≥ a beat apart, at most one `apex`. climax = per-beat peak, **not** "the single payoff of the entire clip." -- **Matte = the PERSON (hyperframes `remove-background`, u2net_human_seg, Apache-2.0).** Human segmentation by intent, but not surgically: thin offset furniture (mic boom arms) is usually excluded — captions render over it, behind the person — while large salient objects NEAR the subject (a telescope, a desk rig) can still leak into the matte and occlude captions. Objects HELD by the subject (products, phones) may drop out intermittently, letting captions pass in front. NEVER assume: sample `frames_fg/` at 2-3 timestamps before placing the hero, and prefer hero positions clear of any leaked furniture (`heroAnchor` can be skewed by leaks — cross-check against frames_bg). -- **safe-zones is PROP-BLIND — eyeball every band you use.** Zones/heroBands score _subject_ occlusion + luma only: a mic, telescope, or screen sitting inside a "clean" zone is invisible to them (and a prop leaking INTO the matte skews `heroAnchor.centerXPct` off the person). Before authoring, extract ONE frame of each band you intend to use; if a prop lives there, measure its bbox and move/shrink the plane. Two real cases shipped clean only because the agent did exactly this. (Auto prop-saliency is a known gap; zones' `peakLuma` only catches _moving_ bright objects.) -- **Captions stay on-frame.** Cinematic mode hard-gates frame-overflow; Standard mode runs `check-overflow.cjs` as a WARNING (intentional bleed is the only exception — read the warning). -- **Each caption ≥ 0.5s on screen** — shorter = unreadable. -- **Word timings must match transcript.json within 80ms** — a caption firing 500ms off-beat destroys the scene illusion. Cinematic runs `check-timing.cjs --strict` before rendering (via render-and-composite.sh); THEME mode enforces the same timings at compile time instead (make-theme's sequential transcript matcher + verbatim completeness gate — drift is a compile error). Never pack multiple transcript words into one entry (e.g. `"FUTURE OF"` or an `IT` + line-break + `ALL` stack with one start/end) — the second word inherits the first's timestamp and fires early. Split them into separate word entries with their own timings, even if you want them on the same visual line (use CSS `white-space` / natural wrap instead of `
`). Creative substitutions where caption text ≠ transcript (e.g. `"15%"` replacing `"fifteen percent"`) are supported — register them in `CREATIVE_SUBS` inside `check-timing.cjs`. -- **Group windows must envelop their words** — `group.in ≤ min(word.start)` and `group.out ≥ max(word.end)` for every group. If `group.in` is later than a word's start, the word is silently delayed until the container mounts (we've shipped 800ms lag bugs from this). The validator enforces this. -- **No two caption groups may overlap in both time AND screen region** — overlapping-in-time captions create text-on-text pileups. Options: (a) **spatial separation** — place each group in a non-overlapping vertical band so they can coexist (memory-wall cascade style); (b) **handoff** — set the earlier group's `out` ≤ the next group's `in` so only one is on screen; (c) **deliberate layered typography** — add `"allow_overlap": true` on one of the groups to silence the validator. The validator estimates each group's vertical bbox from its CSS and flags collisions. Pick (a) by default — it's what makes cinematic-cream feel like a poem accumulating, not a subtitle track replacing itself. -- **Screen-blend fails on bright backgrounds (>180 luminance).** **Cinematic** templates are cream + `screen` and that DNA is **locked** (the plan can't recolour them) → on a bright backdrop they wash out, so pick `ink` (letterpress built FOR bright surfaces) or the `anchor` theme (opaque rail surface) rather than overriding a look. -- **Don't animate `letter-spacing` or `filter:blur` on word entrance** — inline-block reflow causes line-jumps. -- **CoreML banned for matting** — the onnxruntime CoreML EP's mixed-precision partitioning corrupted face alpha (observed with the previous RVM engine; don't re-try it). Matting is CPU-only (~2 fps @1080p ≈ 2-3 min per 10s clip; budget for it on long clips). - ---- - -## Dependencies - -- **HyperFrames CLI:** plugin installs use the bundled manifest-pinned launcher. Source contributors can use a built checkout (`packages/cli/dist/cli.js`) via `HYPERFRAMES_ROOT`, the skill’s source tree, or `~/Downloads/hyperframes`. -- **Node-first; two Python touchpoints via `uvx` (no manual installs):** transcription runs WhisperX through `uvx` (word-level timings; falls back to an existing word-level `transcript.json`), and Theme's `drawon` setpiece shells `python3 scripts/gen-stroke-path.py` at compile time. Everything else runs on the toolchain hyperframes already ships: matting via the hyperframes CLI's **`remove-background`** (u2net_human_seg; weights auto-download once, ~168 MB, to `~/.cache/hyperframes/`), image/alpha math via **`sharp`**, layout/occlusion/overflow via **`puppeteer`**, plus **`ffmpeg`**. Install Sharp, Puppeteer, and GSAP in the caption project as described in **Runtime prerequisites** above. The helpers check that project first and retain checkout dependency lookup for source contributors. -- **Transcription = WhisperX via `uvx`** (word-level timings + alignment; no manual install — `transcribe.cjs` drives `uvx whisperx`). Falls back to an existing word-level `transcript.json` if present. -- **Source video** — `matte.cjs` / `transcribe.cjs` auto-resolve `source.mp4` (or glob the clip / read `hyperframes.json`), so `hyperframes init --video X.mp4` needs no manual rename. -- **fps** — `matte.cjs` extracts at the source's native rate and records `matte.fps`; `render-and-composite.sh` uses that so the matte stays frame-aligned. -- Matting weights are NOT bundled: `matte.cjs` shells the hyperframes CLI's `remove-background`, which downloads u2net_human_seg (~168 MB, Apache-2.0) once to `~/.cache/hyperframes/background-removal/models/`. First prepare on a fresh machine needs network for that one download. - -If a hard dependency is missing, STOP and ask the user — don't silently skip steps. diff --git a/.agents/skills/embedded-captions/assets/fonts/char-widths.json b/.agents/skills/embedded-captions/assets/fonts/char-widths.json deleted file mode 100644 index 55b3751..0000000 --- a/.agents/skills/embedded-captions/assets/fonts/char-widths.json +++ /dev/null @@ -1,2211 +0,0 @@ -{ - "_meta": "Measured per-char advance widths (em @100px) + fontBoundingBox ascent/descent for the bundled families in modes/standard/fonts/fonts.css. Generated once via headless-Chrome canvas measureText over the SAME woff2 faces the renderer embeds (kerning ignored, ~<=3px/word). Used by make-theme.cjs to BAKE pixel-exact word geometry at compile time so font-load timing in the render browser can never skew aim. Regenerate if fonts.css changes.", - "Anton": { - "ascent": 1.18, - "descent": 0.33, - "widths": { - "0": 0.4941, - "1": 0.3306, - "2": 0.4941, - "3": 0.4941, - "4": 0.4941, - "5": 0.4941, - "6": 0.4941, - "7": 0.4941, - "8": 0.4941, - "9": 0.4941, - "A": 0.4854, - "B": 0.4785, - "C": 0.4741, - "D": 0.4932, - "E": 0.4116, - "F": 0.3989, - "G": 0.4849, - "H": 0.499, - "I": 0.2266, - "J": 0.4663, - "K": 0.4722, - "L": 0.3975, - "M": 0.7461, - "N": 0.498, - "O": 0.4863, - "P": 0.4722, - "Q": 0.4937, - "R": 0.4766, - "S": 0.4614, - "T": 0.3955, - "U": 0.4736, - "V": 0.4692, - "W": 0.7119, - "X": 0.4839, - "Y": 0.4463, - "Z": 0.4102, - "a": 0.4834, - "b": 0.5015, - "c": 0.4912, - "d": 0.498, - "e": 0.4883, - "f": 0.2803, - "g": 0.5039, - "h": 0.5054, - "i": 0.2432, - "j": 0.2627, - "k": 0.4907, - "l": 0.248, - "m": 0.7583, - "n": 0.4985, - "o": 0.4966, - "p": 0.5015, - "q": 0.498, - "r": 0.3467, - "s": 0.4746, - "t": 0.3052, - "u": 0.499, - "v": 0.4609, - "w": 0.6963, - "x": 0.459, - "y": 0.4609, - "z": 0.3857, - ".": 0.2285, - ",": 0.2363, - "!": 0.229, - "?": 0.4922, - "'": 0.2139, - "\u2019": 0.2319, - "\"": 0.4287, - ":": 0.2417, - ";": 0.2451, - "-": 0.311, - "\u2013": 0.311, - "\u2014": 0.563, - "(": 0.291, - ")": 0.291, - "[": 0.3179, - "]": 0.3179, - "/": 0.4053, - "&": 0.52, - "%": 1.0566, - "+": 0.3555, - "#": 0.5464, - "@": 0.8643, - "*": 0.4521, - " ": 0.2344 - } - }, - "Audiowide": { - "ascent": 0.99, - "descent": 0.29, - "widths": { - "0": 0.9253, - "1": 0.3545, - "2": 0.7524, - "3": 0.7192, - "4": 0.7734, - "5": 0.7505, - "6": 0.7441, - "7": 0.6411, - "8": 0.7461, - "9": 0.7441, - "A": 0.8345, - "B": 0.8091, - "C": 0.7471, - "D": 0.8232, - "E": 0.7554, - "F": 0.7383, - "G": 0.8232, - "H": 0.8491, - "I": 0.2764, - "J": 0.7344, - "K": 0.8135, - "L": 0.7363, - "M": 0.9624, - "N": 0.8472, - "O": 0.8604, - "P": 0.8062, - "Q": 0.8604, - "R": 0.8271, - "S": 0.7783, - "T": 0.7261, - "U": 0.8335, - "V": 0.7725, - "W": 1.0024, - "X": 0.7871, - "Y": 0.7813, - "Z": 0.7134, - "a": 0.6533, - "b": 0.6904, - "c": 0.6162, - "d": 0.7002, - "e": 0.6533, - "f": 0.5503, - "g": 0.6904, - "h": 0.7031, - "i": 0.2505, - "j": 0.2505, - "k": 0.6914, - "l": 0.3135, - "m": 0.8735, - "n": 0.6963, - "o": 0.6821, - "p": 0.6904, - "q": 0.6904, - "r": 0.5454, - "s": 0.5991, - "t": 0.5635, - "u": 0.6963, - "v": 0.6753, - "w": 0.9131, - "x": 0.6953, - "y": 0.7031, - "z": 0.6011, - ".": 0.2051, - ",": 0.2251, - "!": 0.2603, - "?": 0.6655, - "'": 0.2124, - "\u2019": 0.2305, - "\"": 0.3823, - ":": 0.2432, - ";": 0.2515, - "-": 0.5713, - "\u2013": 0.5132, - "\u2014": 0.9131, - "(": 0.4272, - ")": 0.4272, - "[": 0.3652, - "]": 0.3652, - "/": 0.6592, - "&": 0.6714, - "%": 0.8662, - "+": 0.5391, - "#": 0.7295, - "@": 0.6611, - "*": 0.5425, - " ": 0.3252 - } - }, - "Baloo 2": { - "ascent": 1.08, - "descent": 0.52, - "widths": { - "0": 0.583, - "1": 0.357, - "2": 0.508, - "3": 0.506, - "4": 0.548, - "5": 0.538, - "6": 0.55, - "7": 0.458, - "8": 0.569, - "9": 0.552, - "A": 0.592, - "B": 0.599, - "C": 0.588, - "D": 0.652, - "E": 0.531, - "F": 0.517, - "G": 0.639, - "H": 0.654, - "I": 0.262, - "J": 0.385, - "K": 0.566, - "L": 0.501, - "M": 0.78, - "N": 0.66, - "O": 0.689, - "P": 0.567, - "Q": 0.69, - "R": 0.589, - "S": 0.523, - "T": 0.523, - "U": 0.649, - "V": 0.583, - "W": 0.803, - "X": 0.591, - "Y": 0.55, - "Z": 0.557, - "a": 0.499, - "b": 0.549, - "c": 0.478, - "d": 0.547, - "e": 0.519, - "f": 0.399, - "g": 0.537, - "h": 0.551, - "i": 0.241, - "j": 0.243, - "k": 0.487, - "l": 0.246, - "m": 0.816, - "n": 0.55, - "o": 0.553, - "p": 0.546, - "q": 0.546, - "r": 0.382, - "s": 0.447, - "t": 0.372, - "u": 0.55, - "v": 0.495, - "w": 0.729, - "x": 0.482, - "y": 0.489, - "z": 0.469, - ".": 0.141, - ",": 0.145, - "!": 0.25, - "?": 0.459, - "'": 0.139, - "\u2019": 0.127, - "\"": 0.27, - ":": 0.189, - ";": 0.202, - "-": 0.389, - "\u2013": 0.534, - "\u2014": 0.767, - "(": 0.254, - ")": 0.254, - "[": 0.268, - "]": 0.269, - "/": 0.305, - "&": 0.637, - "%": 0.772, - "+": 0.548, - "#": 0.667, - "@": 1, - "*": 0.299, - " ": 0.2 - } - }, - "Bangers": { - "ascent": 0.88, - "descent": 0.18, - "widths": { - "0": 0.474, - "1": 0.32, - "2": 0.467, - "3": 0.458, - "4": 0.459, - "5": 0.45, - "6": 0.478, - "7": 0.339, - "8": 0.518, - "9": 0.489, - "A": 0.433, - "B": 0.428, - "C": 0.414, - "D": 0.441, - "E": 0.341, - "F": 0.341, - "G": 0.499, - "H": 0.442, - "I": 0.2, - "J": 0.279, - "K": 0.462, - "L": 0.302, - "M": 0.619, - "N": 0.453, - "O": 0.493, - "P": 0.379, - "Q": 0.525, - "R": 0.444, - "S": 0.43, - "T": 0.362, - "U": 0.419, - "V": 0.379, - "W": 0.601, - "X": 0.411, - "Y": 0.384, - "Z": 0.431, - "a": 0.433, - "b": 0.428, - "c": 0.414, - "d": 0.441, - "e": 0.341, - "f": 0.341, - "g": 0.499, - "h": 0.441, - "i": 0.202, - "j": 0.279, - "k": 0.462, - "l": 0.302, - "m": 0.619, - "n": 0.452, - "o": 0.493, - "p": 0.379, - "q": 0.525, - "r": 0.444, - "s": 0.43, - "t": 0.362, - "u": 0.419, - "v": 0.379, - "w": 0.601, - "x": 0.411, - "y": 0.384, - "z": 0.431, - ".": 0.209, - ",": 0.197, - "!": 0.263, - "?": 0.438, - "'": 0.202, - "\u2019": 0.202, - "\"": 0.421, - ":": 0.195, - ";": 0.262, - "-": 0.36, - "\u2013": 0.36, - "\u2014": 0.52, - "(": 0.334, - ")": 0.331, - "[": 0.319, - "]": 0.313, - "/": 0.551, - "&": 0.535, - "%": 0.799, - "+": 0.33, - "#": 0.626, - "@": 0.987, - "*": 0.423, - " ": 0.195 - } - }, - "Bodoni Moda": { - "ascent": 1.13, - "descent": 0.4, - "widths": { - "0": 0.6195, - "1": 0.4345, - "2": 0.5495, - "3": 0.5205, - "4": 0.5945, - "5": 0.5, - "6": 0.5595, - "7": 0.5045, - "8": 0.5495, - "9": 0.5595, - "A": 0.772, - "B": 0.656, - "C": 0.7155, - "D": 0.726, - "E": 0.6185, - "F": 0.5985, - "G": 0.739, - "H": 0.762, - "I": 0.387, - "J": 0.45, - "K": 0.705, - "L": 0.6035, - "M": 0.8725, - "N": 0.7735, - "O": 0.75, - "P": 0.6385, - "Q": 0.75, - "R": 0.7215, - "S": 0.576, - "T": 0.6735, - "U": 0.726, - "V": 0.774, - "W": 1.0045, - "X": 0.7665, - "Y": 0.7335, - "Z": 0.577, - "a": 0.523, - "b": 0.6085, - "c": 0.5095, - "d": 0.6085, - "e": 0.5235, - "f": 0.398, - "g": 0.5955, - "h": 0.5955, - "i": 0.303, - "j": 0.305, - "k": 0.604, - "l": 0.333, - "m": 0.8605, - "n": 0.5955, - "o": 0.561, - "p": 0.6085, - "q": 0.6085, - "r": 0.442, - "s": 0.439, - "t": 0.3355, - "u": 0.598, - "v": 0.542, - "w": 0.7615, - "x": 0.577, - "y": 0.5465, - "z": 0.467, - ".": 0.1995, - ",": 0.2145, - "!": 0.3175, - "?": 0.5495, - "'": 0.1995, - "\u2019": 0.2145, - "\"": 0.3695, - ":": 0.1975, - ";": 0.2145, - "-": 0.3595, - "\u2013": 0.5405, - "\u2014": 0.7845, - "(": 0.3615, - ")": 0.3615, - "[": 0.3245, - "]": 0.3245, - "/": 0.528, - "&": 0.8035, - "%": 1, - "+": 0.5295, - "#": 0.638, - "@": 1.0095, - "*": 0.632, - " ": 0.25 - } - }, - "Caveat": { - "ascent": 0.96, - "descent": 0.3, - "widths": { - "0": 0.45, - "1": 0.45, - "2": 0.45, - "3": 0.45, - "4": 0.45, - "5": 0.45, - "6": 0.45, - "7": 0.45, - "8": 0.45, - "9": 0.45, - "A": 0.502, - "B": 0.52, - "C": 0.472, - "D": 0.578, - "E": 0.529, - "F": 0.454, - "G": 0.487, - "H": 0.563, - "I": 0.4, - "J": 0.306, - "K": 0.498, - "L": 0.426, - "M": 0.72, - "N": 0.599, - "O": 0.496, - "P": 0.464, - "Q": 0.502, - "R": 0.537, - "S": 0.486, - "T": 0.458, - "U": 0.482, - "V": 0.49, - "W": 0.72, - "X": 0.524, - "Y": 0.504, - "Z": 0.522, - "a": 0.437, - "b": 0.435, - "c": 0.355, - "d": 0.393, - "e": 0.325, - "f": 0.291, - "g": 0.355, - "h": 0.464, - "i": 0.187, - "j": 0.204, - "k": 0.365, - "l": 0.169, - "m": 0.56, - "n": 0.45, - "o": 0.353, - "p": 0.378, - "q": 0.377, - "r": 0.36, - "s": 0.341, - "t": 0.331, - "u": 0.37, - "v": 0.331, - "w": 0.517, - "x": 0.343, - "y": 0.341, - "z": 0.315, - ".": 0.198, - ",": 0.198, - "!": 0.21, - "?": 0.374, - "'": 0.117, - "\u2019": 0.117, - "\"": 0.237, - ":": 0.198, - ";": 0.198, - "-": 0.326, - "\u2013": 0.446, - "\u2014": 0.566, - "(": 0.33, - ")": 0.33, - "[": 0.33, - "]": 0.33, - "/": 0.33, - "&": 0.564, - "%": 0.6, - "+": 0.446, - "#": 0.559, - "@": 0.643, - "*": 0.363, - " ": 0.242 - } - }, - "Chakra Petch": { - "ascent": 0.99, - "descent": 0.31, - "widths": { - "0": 0.636, - "1": 0.366, - "2": 0.558, - "3": 0.587, - "4": 0.563, - "5": 0.59, - "6": 0.606, - "7": 0.506, - "8": 0.622, - "9": 0.611, - "A": 0.629, - "B": 0.654, - "C": 0.639, - "D": 0.672, - "E": 0.59, - "F": 0.56, - "G": 0.66, - "H": 0.682, - "I": 0.256, - "J": 0.564, - "K": 0.628, - "L": 0.545, - "M": 0.785, - "N": 0.681, - "O": 0.684, - "P": 0.63, - "Q": 0.684, - "R": 0.659, - "S": 0.621, - "T": 0.568, - "U": 0.684, - "V": 0.634, - "W": 0.868, - "X": 0.62, - "Y": 0.606, - "Z": 0.576, - "a": 0.559, - "b": 0.585, - "c": 0.542, - "d": 0.587, - "e": 0.568, - "f": 0.384, - "g": 0.587, - "h": 0.578, - "i": 0.253, - "j": 0.268, - "k": 0.538, - "l": 0.243, - "m": 0.845, - "n": 0.576, - "o": 0.577, - "p": 0.587, - "q": 0.58, - "r": 0.393, - "s": 0.52, - "t": 0.398, - "u": 0.575, - "v": 0.491, - "w": 0.714, - "x": 0.501, - "y": 0.577, - "z": 0.482, - ".": 0.217, - ",": 0.217, - "!": 0.254, - "?": 0.542, - "'": 0.216, - "\u2019": 0.215, - "\"": 0.38, - ":": 0.215, - ";": 0.215, - "-": 0.412, - "\u2013": 0.628, - "\u2014": 0.735, - "(": 0.322, - ")": 0.322, - "[": 0.321, - "]": 0.321, - "/": 0.484, - "&": 0.646, - "%": 0.842, - "+": 0.548, - "#": 0.697, - "@": 0.819, - "*": 0.343, - " ": 0.253 - } - }, - "Cinzel": { - "ascent": 0.98, - "descent": 0.37, - "widths": { - "0": 0.596, - "1": 0.344, - "2": 0.553, - "3": 0.503, - "4": 0.583, - "5": 0.498, - "6": 0.56, - "7": 0.502, - "8": 0.552, - "9": 0.56, - "A": 0.712, - "B": 0.586, - "C": 0.76, - "D": 0.807, - "E": 0.577, - "F": 0.541, - "G": 0.798, - "H": 0.813, - "I": 0.338, - "J": 0.324, - "K": 0.657, - "L": 0.562, - "M": 0.931, - "N": 0.841, - "O": 0.838, - "P": 0.577, - "Q": 0.837, - "R": 0.677, - "S": 0.475, - "T": 0.618, - "U": 0.785, - "V": 0.74, - "W": 0.982, - "X": 0.662, - "Y": 0.661, - "Z": 0.651, - "a": 0.663, - "b": 0.57, - "c": 0.705, - "d": 0.76, - "e": 0.546, - "f": 0.523, - "g": 0.742, - "h": 0.746, - "i": 0.336, - "j": 0.309, - "k": 0.624, - "l": 0.536, - "m": 0.878, - "n": 0.779, - "o": 0.774, - "p": 0.553, - "q": 0.777, - "r": 0.627, - "s": 0.462, - "t": 0.578, - "u": 0.7, - "v": 0.663, - "w": 0.899, - "x": 0.626, - "y": 0.64, - "z": 0.608, - ".": 0.179, - ",": 0.185, - "!": 0.23, - "?": 0.413, - "'": 0.17, - "\u2019": 0.193, - "\"": 0.315, - ":": 0.179, - ";": 0.185, - "-": 0.38, - "\u2013": 0.5, - "\u2014": 0.8, - "(": 0.338, - ")": 0.338, - "[": 0.332, - "]": 0.332, - "/": 0.406, - "&": 0.646, - "%": 0.684, - "+": 0.481, - "#": 0.536, - "@": 0.977, - "*": 0.386, - " ": 0.25 - } - }, - "Cormorant Garamond": { - "ascent": 0.92, - "descent": 0.29, - "widths": { - "0": 0.477, - "1": 0.332, - "2": 0.402, - "3": 0.389, - "4": 0.451, - "5": 0.409, - "6": 0.465, - "7": 0.429, - "8": 0.489, - "9": 0.465, - "A": 0.702, - "B": 0.558, - "C": 0.686, - "D": 0.691, - "E": 0.537, - "F": 0.509, - "G": 0.713, - "H": 0.759, - "I": 0.332, - "J": 0.322, - "K": 0.65, - "L": 0.533, - "M": 0.835, - "N": 0.727, - "O": 0.766, - "P": 0.543, - "Q": 0.766, - "R": 0.673, - "S": 0.491, - "T": 0.634, - "U": 0.698, - "V": 0.666, - "W": 0.931, - "X": 0.652, - "Y": 0.609, - "Z": 0.595, - "a": 0.419, - "b": 0.51, - "c": 0.411, - "d": 0.512, - "e": 0.408, - "f": 0.305, - "g": 0.445, - "h": 0.499, - "i": 0.273, - "j": 0.257, - "k": 0.491, - "l": 0.258, - "m": 0.763, - "n": 0.517, - "o": 0.479, - "p": 0.511, - "q": 0.488, - "r": 0.364, - "s": 0.338, - "t": 0.338, - "u": 0.493, - "v": 0.434, - "w": 0.671, - "x": 0.439, - "y": 0.435, - "z": 0.405, - ".": 0.197, - ",": 0.222, - "!": 0.247, - "?": 0.329, - "'": 0.14, - "\u2019": 0.192, - "\"": 0.283, - ":": 0.197, - ";": 0.224, - "-": 0.323, - "\u2013": 0.515, - "\u2014": 0.83, - "(": 0.309, - ")": 0.309, - "[": 0.274, - "]": 0.274, - "/": 0.341, - "&": 0.697, - "%": 0.574, - "+": 0.398, - "#": 0.526, - "@": 0.719, - "*": 0.448, - " ": 0.234 - } - }, - "Creepster": { - "ascent": 0.95, - "descent": 0.22, - "widths": { - "0": 0.457, - "1": 0.3105, - "2": 0.4355, - "3": 0.4277, - "4": 0.4219, - "5": 0.4277, - "6": 0.4141, - "7": 0.3975, - "8": 0.4287, - "9": 0.4355, - "A": 0.4453, - "B": 0.4678, - "C": 0.4307, - "D": 0.4541, - "E": 0.4199, - "F": 0.4238, - "G": 0.46, - "H": 0.457, - "I": 0.3076, - "J": 0.374, - "K": 0.4922, - "L": 0.3574, - "M": 0.6563, - "N": 0.5166, - "O": 0.4561, - "P": 0.4434, - "Q": 0.4775, - "R": 0.4629, - "S": 0.4111, - "T": 0.4082, - "U": 0.4854, - "V": 0.4297, - "W": 0.582, - "X": 0.4521, - "Y": 0.4023, - "Z": 0.3818, - "a": 0.4316, - "b": 0.4492, - "c": 0.4336, - "d": 0.4297, - "e": 0.4033, - "f": 0.3975, - "g": 0.4336, - "h": 0.4854, - "i": 0.3281, - "j": 0.3672, - "k": 0.4541, - "l": 0.3174, - "m": 0.6553, - "n": 0.5088, - "o": 0.4697, - "p": 0.4629, - "q": 0.4805, - "r": 0.459, - "s": 0.3984, - "t": 0.4502, - "u": 0.4893, - "v": 0.4531, - "w": 0.6348, - "x": 0.4619, - "y": 0.4316, - "z": 0.3916, - ".": 0.165, - ",": 0.1484, - "!": 0.2021, - "?": 0.3848, - "'": 0.1416, - "\u2019": 0.1387, - "\"": 0.2764, - ":": 0.165, - ";": 0.1514, - "-": 0.3896, - "\u2013": 0.3896, - "\u2014": 0.5732, - "(": 0.2246, - ")": 0.2266, - "[": 0.2256, - "]": 0.2217, - "/": 0.3369, - "&": 0.4648, - "%": 0.5498, - "+": 0.4014, - "#": 0.5859, - "@": 0.6865, - "*": 0.4121, - " ": 0.2354 - } - }, - "Fredoka": { - "ascent": 0.97, - "descent": 0.24, - "widths": { - "0": 0.587, - "1": 0.392, - "2": 0.598, - "3": 0.587, - "4": 0.544, - "5": 0.516, - "6": 0.536, - "7": 0.554, - "8": 0.559, - "9": 0.536, - "A": 0.704, - "B": 0.638, - "C": 0.667, - "D": 0.692, - "E": 0.623, - "F": 0.631, - "G": 0.708, - "H": 0.687, - "I": 0.217, - "J": 0.545, - "K": 0.591, - "L": 0.558, - "M": 0.825, - "N": 0.708, - "O": 0.732, - "P": 0.601, - "Q": 0.811, - "R": 0.624, - "S": 0.554, - "T": 0.664, - "U": 0.713, - "V": 0.724, - "W": 0.965, - "X": 0.694, - "Y": 0.638, - "Z": 0.575, - "a": 0.574, - "b": 0.582, - "c": 0.508, - "d": 0.586, - "e": 0.54, - "f": 0.378, - "g": 0.565, - "h": 0.535, - "i": 0.224, - "j": 0.24, - "k": 0.489, - "l": 0.281, - "m": 0.826, - "n": 0.557, - "o": 0.56, - "p": 0.574, - "q": 0.568, - "r": 0.406, - "s": 0.459, - "t": 0.376, - "u": 0.543, - "v": 0.537, - "w": 0.763, - "x": 0.494, - "y": 0.526, - "z": 0.531, - ".": 0.211, - ",": 0.225, - "!": 0.231, - "?": 0.491, - "'": 0.181, - "\u2019": 0.157, - "\"": 0.335, - ":": 0.234, - ";": 0.213, - "-": 0.426, - "\u2013": 0.556, - "\u2014": 0.686, - "(": 0.377, - ")": 0.377, - "[": 0.342, - "]": 0.342, - "/": 0.517, - "&": 0.713, - "%": 0.823, - "+": 0.537, - "#": 0.796, - "@": 0.829, - "*": 0.494, - " ": 0.254 - } - }, - "Inter": { - "ascent": 0.97, - "descent": 0.24, - "widths": { - "0": 0.6309, - "1": 0.4067, - "2": 0.6099, - "3": 0.6177, - "4": 0.646, - "5": 0.5933, - "6": 0.6201, - "7": 0.5659, - "8": 0.6187, - "9": 0.6201, - "A": 0.6899, - "B": 0.6543, - "C": 0.7305, - "D": 0.7217, - "E": 0.6011, - "F": 0.5903, - "G": 0.7461, - "H": 0.7432, - "I": 0.2686, - "J": 0.5708, - "K": 0.6719, - "L": 0.5654, - "M": 0.9033, - "N": 0.7534, - "O": 0.7646, - "P": 0.6387, - "Q": 0.7646, - "R": 0.6436, - "S": 0.6416, - "T": 0.6455, - "U": 0.7441, - "V": 0.6899, - "W": 0.9854, - "X": 0.6821, - "Y": 0.6787, - "Z": 0.6289, - "a": 0.5615, - "b": 0.6123, - "c": 0.5713, - "d": 0.6123, - "e": 0.583, - "f": 0.3701, - "g": 0.6133, - "h": 0.5913, - "i": 0.2422, - "j": 0.2422, - "k": 0.5488, - "l": 0.2422, - "m": 0.876, - "n": 0.5908, - "o": 0.5996, - "p": 0.6123, - "q": 0.6123, - "r": 0.3765, - "s": 0.5278, - "t": 0.3271, - "u": 0.5913, - "v": 0.562, - "w": 0.8184, - "x": 0.5459, - "y": 0.562, - "z": 0.5522, - ".": 0.2881, - ",": 0.2881, - "!": 0.2876, - "?": 0.5112, - "'": 0.2998, - "\u2019": 0.2607, - "\"": 0.4658, - ":": 0.2881, - ";": 0.3018, - "-": 0.46, - "\u2013": 0.5, - "\u2014": 1, - "(": 0.3647, - ")": 0.3647, - "[": 0.3647, - "]": 0.3647, - "/": 0.3604, - "&": 0.644, - "%": 0.9819, - "+": 0.6616, - "#": 0.6333, - "@": 0.9658, - "*": 0.501, - " ": 0.2813 - } - }, - "Monoton": { - "ascent": 1.16, - "descent": 0.4, - "widths": { - "0": 0.8433, - "1": 0.4263, - "2": 0.583, - "3": 0.6123, - "4": 0.6221, - "5": 0.6919, - "6": 0.7817, - "7": 0.6318, - "8": 0.8086, - "9": 0.7822, - "A": 0.9365, - "B": 0.8623, - "C": 0.8521, - "D": 0.8862, - "E": 0.7065, - "F": 0.6831, - "G": 0.9082, - "H": 0.9014, - "I": 0.3389, - "J": 0.4346, - "K": 0.8159, - "L": 0.605, - "M": 0.9209, - "N": 0.8779, - "O": 0.9336, - "P": 0.8506, - "Q": 0.938, - "R": 0.8438, - "S": 0.6821, - "T": 0.5913, - "U": 0.9053, - "V": 0.9409, - "W": 1.1616, - "X": 0.8765, - "Y": 0.7891, - "Z": 0.854, - "a": 0.832, - "b": 0.7207, - "c": 0.7368, - "d": 0.833, - "e": 0.667, - "f": 0.6255, - "g": 0.8271, - "h": 0.8306, - "i": 0.3379, - "j": 0.3936, - "k": 0.8018, - "l": 0.583, - "m": 1.168, - "n": 0.7871, - "o": 0.8335, - "p": 0.7817, - "q": 0.7881, - "r": 0.8315, - "s": 0.6831, - "t": 0.5884, - "u": 0.7959, - "v": 0.8555, - "w": 1.1299, - "x": 0.79, - "y": 0.7334, - "z": 0.7148, - ".": 0.2554, - ",": 0.2529, - "!": 0.3364, - "?": 0.6938, - "'": 0.2578, - "\u2019": 0.2515, - "\"": 0.5386, - ":": 0.2627, - ";": 0.2617, - "-": 0.4736, - "\u2013": 0.4736, - "\u2014": 0.6152, - "(": 0.4106, - ")": 0.4087, - "[": 0.3208, - "]": 0.3198, - "/": 0.4478, - "&": 1.0298, - "%": 1.5049, - "+": 0.6011, - "#": 1.0146, - "@": 1.0762, - "*": 0.6646, - " ": 0.1084 - } - }, - "Orbitron": { - "ascent": 1.01, - "descent": 0.24, - "widths": { - "0": 0.834, - "1": 0.391, - "2": 0.83, - "3": 0.826, - "4": 0.73, - "5": 0.83, - "6": 0.82, - "7": 0.66, - "8": 0.834, - "9": 0.828, - "A": 0.836, - "B": 0.832, - "C": 0.822, - "D": 0.834, - "E": 0.766, - "F": 0.723, - "G": 0.83, - "H": 0.851, - "I": 0.214, - "J": 0.78, - "K": 0.797, - "L": 0.779, - "M": 0.928, - "N": 0.832, - "O": 0.828, - "P": 0.791, - "Q": 0.884, - "R": 0.825, - "S": 0.822, - "T": 0.759, - "U": 0.828, - "V": 1.003, - "W": 1.179, - "X": 0.812, - "Y": 0.806, - "Z": 0.821, - "a": 0.694, - "b": 0.667, - "c": 0.695, - "d": 0.667, - "e": 0.692, - "f": 0.407, - "g": 0.683, - "h": 0.668, - "i": 0.208, - "j": 0.239, - "k": 0.646, - "l": 0.302, - "m": 0.978, - "n": 0.696, - "o": 0.692, - "p": 0.664, - "q": 0.664, - "r": 0.512, - "s": 0.686, - "t": 0.41, - "u": 0.695, - "v": 0.79, - "w": 1.071, - "x": 0.692, - "y": 0.685, - "z": 0.698, - ".": 0.214, - ",": 0.193, - "!": 0.22, - "?": 0.678, - "'": 0.224, - "\u2019": 0.166, - "\"": 0.372, - ":": 0.214, - ";": 0.193, - "-": 0.517, - "\u2013": 0.708, - "\u2014": 0.822, - "(": 0.277, - ")": 0.278, - "[": 0.275, - "]": 0.276, - "/": 0.521, - "&": 0.938, - "%": 0.966, - "+": 0.433, - "#": 0.797, - "@": 0.832, - "*": 0.491, - " ": 0.272 - } - }, - "Permanent Marker": { - "ascent": 1.11, - "descent": 0.32, - "widths": { - "0": 0.6865, - "1": 0.3223, - "2": 0.6504, - "3": 0.5615, - "4": 0.582, - "5": 0.5801, - "6": 0.501, - "7": 0.5762, - "8": 0.5371, - "9": 0.5293, - "A": 0.7021, - "B": 0.6865, - "C": 0.6113, - "D": 0.5889, - "E": 0.627, - "F": 0.5752, - "G": 0.7891, - "H": 0.6953, - "I": 0.5156, - "J": 0.6689, - "K": 0.7764, - "L": 0.6328, - "M": 0.9736, - "N": 0.6846, - "O": 0.7441, - "P": 0.6396, - "Q": 0.7441, - "R": 0.6465, - "S": 0.5762, - "T": 0.6074, - "U": 0.6953, - "V": 0.584, - "W": 0.9941, - "X": 0.623, - "Y": 0.4932, - "Z": 0.6641, - "a": 0.5811, - "b": 0.5732, - "c": 0.5137, - "d": 0.4971, - "e": 0.5215, - "f": 0.4551, - "g": 0.6523, - "h": 0.582, - "i": 0.3203, - "j": 0.5342, - "k": 0.6455, - "l": 0.5332, - "m": 0.8145, - "n": 0.5645, - "o": 0.6289, - "p": 0.5244, - "q": 0.625, - "r": 0.541, - "s": 0.4639, - "t": 0.4795, - "u": 0.585, - "v": 0.4854, - "w": 0.8252, - "x": 0.5068, - "y": 0.4004, - "z": 0.5479, - ".": 0.2285, - ",": 0.2041, - "!": 0.2607, - "?": 0.5566, - "'": 0.2656, - "\u2019": 0.1992, - "\"": 0.4922, - ":": 0.2412, - ";": 0.2451, - "-": 0.6094, - "\u2013": 0.5889, - "\u2014": 0.8789, - "(": 0.3613, - ")": 0.3613, - "[": 0.3877, - "]": 0.4033, - "/": 0.4014, - "&": 0.5996, - "%": 0.6436, - "+": 0.5791, - "#": 0.7031, - "@": 0.7324, - "*": 0.6738, - " ": 0.3701 - } - }, - "Press Start 2P": { - "ascent": 1, - "descent": 0, - "widths": { - "0": 1, - "1": 1, - "2": 1, - "3": 1, - "4": 1, - "5": 1, - "6": 1, - "7": 1, - "8": 1, - "9": 1, - "A": 1, - "B": 1, - "C": 1, - "D": 1, - "E": 1, - "F": 1, - "G": 1, - "H": 1, - "I": 1, - "J": 1, - "K": 1, - "L": 1, - "M": 1, - "N": 1, - "O": 1, - "P": 1, - "Q": 1, - "R": 1, - "S": 1, - "T": 1, - "U": 1, - "V": 1, - "W": 1, - "X": 1, - "Y": 1, - "Z": 1, - "a": 1, - "b": 1, - "c": 1, - "d": 1, - "e": 1, - "f": 1, - "g": 1, - "h": 1, - "i": 1, - "j": 1, - "k": 1, - "l": 1, - "m": 1, - "n": 1, - "o": 1, - "p": 1, - "q": 1, - "r": 1, - "s": 1, - "t": 1, - "u": 1, - "v": 1, - "w": 1, - "x": 1, - "y": 1, - "z": 1, - ".": 1, - ",": 1, - "!": 1, - "?": 1, - "'": 1, - "\u2019": 1, - "\"": 1, - ":": 1, - ";": 1, - "-": 1, - "\u2013": 1, - "\u2014": 1, - "(": 1, - ")": 1, - "[": 1, - "]": 1, - "/": 1, - "&": 1, - "%": 1, - "+": 1, - "#": 1, - "@": 1, - "*": 1, - " ": 1 - } - }, - "Rajdhani": { - "ascent": 0.93, - "descent": 0.35, - "widths": { - "0": 0.52, - "1": 0.322, - "2": 0.482, - "3": 0.5, - "4": 0.526, - "5": 0.489, - "6": 0.505, - "7": 0.395, - "8": 0.526, - "9": 0.505, - "A": 0.54, - "B": 0.549, - "C": 0.541, - "D": 0.556, - "E": 0.48, - "F": 0.457, - "G": 0.541, - "H": 0.572, - "I": 0.241, - "J": 0.505, - "K": 0.538, - "L": 0.451, - "M": 0.705, - "N": 0.581, - "O": 0.553, - "P": 0.526, - "Q": 0.56, - "R": 0.537, - "S": 0.555, - "T": 0.427, - "U": 0.554, - "V": 0.506, - "W": 0.797, - "X": 0.514, - "Y": 0.5, - "Z": 0.493, - "a": 0.507, - "b": 0.51, - "c": 0.399, - "d": 0.51, - "e": 0.492, - "f": 0.318, - "g": 0.51, - "h": 0.512, - "i": 0.221, - "j": 0.221, - "k": 0.443, - "l": 0.221, - "m": 0.777, - "n": 0.512, - "o": 0.5, - "p": 0.51, - "q": 0.507, - "r": 0.323, - "s": 0.433, - "t": 0.349, - "u": 0.512, - "v": 0.431, - "w": 0.686, - "x": 0.427, - "y": 0.463, - "z": 0.418, - ".": 0.194, - ",": 0.194, - "!": 0.237, - "?": 0.471, - "'": 0.186, - "\u2019": 0.181, - "\"": 0.337, - ":": 0.194, - ";": 0.194, - "-": 0.312, - "\u2013": 0.405, - "\u2014": 0.565, - "(": 0.29, - ")": 0.29, - "[": 0.297, - "]": 0.297, - "/": 0.4, - "&": 0.603, - "%": 0.724, - "+": 0.535, - "#": 0.675, - "@": 0.751, - "*": 0.404, - " ": 0.254 - } - }, - "Saira Stencil One": { - "ascent": 1.13, - "descent": 0.44, - "widths": { - "0": 0.66, - "1": 0.402, - "2": 0.614, - "3": 0.61, - "4": 0.654, - "5": 0.628, - "6": 0.662, - "7": 0.576, - "8": 0.676, - "9": 0.662, - "A": 0.687, - "B": 0.67, - "C": 0.568, - "D": 0.68, - "E": 0.616, - "F": 0.576, - "G": 0.66, - "H": 0.716, - "I": 0.33, - "J": 0.425, - "K": 0.683, - "L": 0.541, - "M": 0.885, - "N": 0.716, - "O": 0.698, - "P": 0.645, - "Q": 0.698, - "R": 0.674, - "S": 0.612, - "T": 0.581, - "U": 0.69, - "V": 0.663, - "W": 0.996, - "X": 0.678, - "Y": 0.633, - "Z": 0.618, - "a": 0.558, - "b": 0.578, - "c": 0.465, - "d": 0.578, - "e": 0.557, - "f": 0.437, - "g": 0.578, - "h": 0.588, - "i": 0.299, - "j": 0.299, - "k": 0.576, - "l": 0.299, - "m": 0.857, - "n": 0.588, - "o": 0.572, - "p": 0.578, - "q": 0.578, - "r": 0.425, - "s": 0.498, - "t": 0.427, - "u": 0.586, - "v": 0.551, - "w": 0.846, - "x": 0.566, - "y": 0.588, - "z": 0.534, - ".": 0.33, - ",": 0.33, - "!": 0.363, - "?": 0.521, - "'": 0.3, - "\u2019": 0.32, - "\"": 0.525, - ":": 0.33, - ";": 0.33, - "-": 0.379, - "\u2013": 0.48, - "\u2014": 0.88, - "(": 0.374, - ")": 0.374, - "[": 0.399, - "]": 0.399, - "/": 0.429, - "&": 0.739, - "%": 0.898, - "+": 0.54, - "#": 0.7, - "@": 0.944, - "*": 0.454, - " ": 0.26 - } - }, - "Shippori Mincho": { - "ascent": 1.16, - "descent": 0.29, - "widths": { - "0": 0.52, - "1": 0.487, - "2": 0.511, - "3": 0.523, - "4": 0.503, - "5": 0.502, - "6": 0.532, - "7": 0.545, - "8": 0.539, - "9": 0.532, - "A": 0.762, - "B": 0.716, - "C": 0.716, - "D": 0.782, - "E": 0.72, - "F": 0.686, - "G": 0.744, - "H": 0.889, - "I": 0.408, - "J": 0.437, - "K": 0.812, - "L": 0.712, - "M": 1.013, - "N": 0.825, - "O": 0.771, - "P": 0.655, - "Q": 0.8, - "R": 0.758, - "S": 0.651, - "T": 0.743, - "U": 0.815, - "V": 0.769, - "W": 1.022, - "X": 0.745, - "Y": 0.754, - "Z": 0.593, - "a": 0.55, - "b": 0.579, - "c": 0.509, - "d": 0.577, - "e": 0.543, - "f": 0.355, - "g": 0.592, - "h": 0.628, - "i": 0.317, - "j": 0.239, - "k": 0.586, - "l": 0.318, - "m": 0.956, - "n": 0.633, - "o": 0.576, - "p": 0.606, - "q": 0.57, - "r": 0.437, - "s": 0.499, - "t": 0.327, - "u": 0.604, - "v": 0.558, - "w": 0.783, - "x": 0.576, - "y": 0.557, - "z": 0.48, - ".": 0.249, - ",": 0.25, - "!": 0.288, - "?": 0.444, - "'": 0.198, - "\u2019": 0.203, - "\"": 0.389, - ":": 0.209, - ";": 0.21, - "-": 0.271, - "\u2013": 0.536, - "\u2014": 1, - "(": 0.363, - ")": 0.363, - "[": 0.438, - "]": 0.437, - "/": 0.443, - "&": 0.82, - "%": 0.938, - "+": 0.605, - "#": 0.676, - "@": 0.906, - "*": 0.441, - " ": 0.258 - } - }, - "Sora": { - "ascent": 0.97, - "descent": 0.29, - "widths": { - "0": 0.743, - "1": 0.42, - "2": 0.618, - "3": 0.614, - "4": 0.642, - "5": 0.623, - "6": 0.659, - "7": 0.574, - "8": 0.637, - "9": 0.659, - "A": 0.756, - "B": 0.68, - "C": 0.795, - "D": 0.791, - "E": 0.6, - "F": 0.56, - "G": 0.831, - "H": 0.804, - "I": 0.314, - "J": 0.64, - "K": 0.678, - "L": 0.544, - "M": 0.92, - "N": 0.849, - "O": 0.865, - "P": 0.64, - "Q": 0.865, - "R": 0.7, - "S": 0.689, - "T": 0.594, - "U": 0.789, - "V": 0.708, - "W": 1.043, - "X": 0.696, - "Y": 0.652, - "Z": 0.654, - "a": 0.575, - "b": 0.689, - "c": 0.606, - "d": 0.689, - "e": 0.612, - "f": 0.379, - "g": 0.675, - "h": 0.64, - "i": 0.308, - "j": 0.317, - "k": 0.573, - "l": 0.286, - "m": 0.968, - "n": 0.64, - "o": 0.676, - "p": 0.689, - "q": 0.689, - "r": 0.41, - "s": 0.536, - "t": 0.426, - "u": 0.628, - "v": 0.559, - "w": 0.848, - "x": 0.56, - "y": 0.547, - "z": 0.488, - ".": 0.262, - ",": 0.262, - "!": 0.296, - "?": 0.552, - "'": 0.262, - "\u2019": 0.244, - "\"": 0.43, - ":": 0.262, - ";": 0.262, - "-": 0.504, - "\u2013": 0.512, - "\u2014": 0.9, - "(": 0.376, - ")": 0.376, - "[": 0.376, - "]": 0.376, - "/": 0.344, - "&": 0.688, - "%": 0.85, - "+": 0.59, - "#": 0.692, - "@": 1.122, - "*": 0.567, - " ": 0.228 - } - }, - "Space Grotesk": { - "ascent": 0.98, - "descent": 0.29, - "widths": { - "0": 0.641, - "1": 0.418, - "2": 0.603, - "3": 0.604, - "4": 0.625, - "5": 0.599, - "6": 0.612, - "7": 0.564, - "8": 0.623, - "9": 0.612, - "A": 0.63, - "B": 0.661, - "C": 0.642, - "D": 0.663, - "E": 0.563, - "F": 0.54, - "G": 0.66, - "H": 0.656, - "I": 0.244, - "J": 0.594, - "K": 0.61, - "L": 0.546, - "M": 0.865, - "N": 0.664, - "O": 0.669, - "P": 0.601, - "Q": 0.669, - "R": 0.631, - "S": 0.613, - "T": 0.588, - "U": 0.666, - "V": 0.619, - "W": 0.875, - "X": 0.638, - "Y": 0.61, - "Z": 0.577, - "a": 0.575, - "b": 0.644, - "c": 0.598, - "d": 0.644, - "e": 0.592, - "f": 0.442, - "g": 0.642, - "h": 0.613, - "i": 0.245, - "j": 0.247, - "k": 0.538, - "l": 0.245, - "m": 0.86, - "n": 0.613, - "o": 0.618, - "p": 0.644, - "q": 0.644, - "r": 0.377, - "s": 0.527, - "t": 0.46, - "u": 0.612, - "v": 0.539, - "w": 0.801, - "x": 0.593, - "y": 0.612, - "z": 0.521, - ".": 0.253, - ",": 0.251, - "!": 0.253, - "?": 0.58, - "'": 0.251, - "\u2019": 0.251, - "\"": 0.425, - ":": 0.253, - ";": 0.253, - "-": 0.455, - "\u2013": 0.607, - "\u2014": 0.911, - "(": 0.379, - ")": 0.377, - "[": 0.335, - "]": 0.335, - "/": 0.37, - "&": 0.604, - "%": 0.772, - "+": 0.62, - "#": 0.628, - "@": 1.026, - "*": 0.52, - " ": 0.257 - } - }, - "Special Elite": { - "ascent": 0.7, - "descent": 0.3, - "widths": { - "0": 0.6108, - "1": 0.5698, - "2": 0.5737, - "3": 0.5571, - "4": 0.6123, - "5": 0.5376, - "6": 0.5884, - "7": 0.5552, - "8": 0.5986, - "9": 0.5845, - "A": 0.5498, - "B": 0.604, - "C": 0.5791, - "D": 0.6226, - "E": 0.6387, - "F": 0.6055, - "G": 0.6152, - "H": 0.6528, - "I": 0.4951, - "J": 0.541, - "K": 0.5825, - "L": 0.6025, - "M": 0.6978, - "N": 0.6279, - "O": 0.6167, - "P": 0.5532, - "Q": 0.6021, - "R": 0.6367, - "S": 0.5889, - "T": 0.5942, - "U": 0.6216, - "V": 0.6113, - "W": 0.6436, - "X": 0.582, - "Y": 0.561, - "Z": 0.5923, - "a": 0.5654, - "b": 0.5654, - "c": 0.5474, - "d": 0.603, - "e": 0.5439, - "f": 0.4731, - "g": 0.583, - "h": 0.6167, - "i": 0.5684, - "j": 0.4155, - "k": 0.6206, - "l": 0.5405, - "m": 0.6636, - "n": 0.6323, - "o": 0.5835, - "p": 0.5874, - "q": 0.5679, - "r": 0.5791, - "s": 0.5195, - "t": 0.5103, - "u": 0.6387, - "v": 0.605, - "w": 0.6787, - "x": 0.6606, - "y": 0.5928, - "z": 0.5288, - ".": 0.3496, - ",": 0.3364, - "!": 0.2764, - "?": 0.4702, - "'": 0.1963, - "\u2019": 0.2642, - "\"": 0.3521, - ":": 0.3433, - ";": 0.3286, - "-": 0.6362, - "\u2013": 0.6118, - "\u2014": 1.1138, - "(": 0.2793, - ")": 0.2817, - "[": 0.312, - "]": 0.3125, - "/": 0.5571, - "&": 0.6763, - "%": 0.667, - "+": 0.4961, - "#": 0.5547, - "@": 0.665, - "*": 0.5229, - " ": 0.293 - } - }, - "Teko": { - "ascent": 0.96, - "descent": 0.48, - "widths": { - "0": 0.39, - "1": 0.235, - "2": 0.328, - "3": 0.355, - "4": 0.363, - "5": 0.358, - "6": 0.382, - "7": 0.291, - "8": 0.389, - "9": 0.378, - "A": 0.385, - "B": 0.409, - "C": 0.377, - "D": 0.412, - "E": 0.343, - "F": 0.332, - "G": 0.382, - "H": 0.417, - "I": 0.21, - "J": 0.334, - "K": 0.384, - "L": 0.301, - "M": 0.516, - "N": 0.41, - "O": 0.393, - "P": 0.379, - "Q": 0.393, - "R": 0.396, - "S": 0.362, - "T": 0.31, - "U": 0.397, - "V": 0.364, - "W": 0.609, - "X": 0.373, - "Y": 0.361, - "Z": 0.313, - "a": 0.36, - "b": 0.36, - "c": 0.352, - "d": 0.36, - "e": 0.36, - "f": 0.222, - "g": 0.36, - "h": 0.365, - "i": 0.178, - "j": 0.178, - "k": 0.357, - "l": 0.178, - "m": 0.549, - "n": 0.365, - "o": 0.37, - "p": 0.36, - "q": 0.36, - "r": 0.238, - "s": 0.328, - "t": 0.219, - "u": 0.365, - "v": 0.317, - "w": 0.543, - "x": 0.342, - "y": 0.342, - "z": 0.292, - ".": 0.165, - ",": 0.165, - "!": 0.209, - "?": 0.342, - "'": 0.161, - "\u2019": 0.166, - "\"": 0.292, - ":": 0.165, - ";": 0.165, - "-": 0.315, - "\u2013": 0.42, - "\u2014": 0.536, - "(": 0.264, - ")": 0.264, - "[": 0.311, - "]": 0.311, - "/": 0.39, - "&": 0.462, - "%": 0.641, - "+": 0.408, - "#": 0.496, - "@": 0.696, - "*": 0.321, - " ": 0.145 - } - }, - "VT323": { - "ascent": 0.8, - "descent": 0.2, - "widths": { - "0": 0.4, - "1": 0.4, - "2": 0.4, - "3": 0.4, - "4": 0.4, - "5": 0.4, - "6": 0.4, - "7": 0.4, - "8": 0.4, - "9": 0.4, - "A": 0.4, - "B": 0.4, - "C": 0.4, - "D": 0.4, - "E": 0.4, - "F": 0.4, - "G": 0.4, - "H": 0.4, - "I": 0.4, - "J": 0.4, - "K": 0.4, - "L": 0.4, - "M": 0.4, - "N": 0.4, - "O": 0.4, - "P": 0.4, - "Q": 0.4, - "R": 0.4, - "S": 0.4, - "T": 0.4, - "U": 0.4, - "V": 0.4, - "W": 0.4, - "X": 0.4, - "Y": 0.4, - "Z": 0.4, - "a": 0.4, - "b": 0.4, - "c": 0.4, - "d": 0.4, - "e": 0.4, - "f": 0.4, - "g": 0.4, - "h": 0.4, - "i": 0.4, - "j": 0.4, - "k": 0.4, - "l": 0.4, - "m": 0.4, - "n": 0.4, - "o": 0.4, - "p": 0.4, - "q": 0.4, - "r": 0.4, - "s": 0.4, - "t": 0.4, - "u": 0.4, - "v": 0.4, - "w": 0.4, - "x": 0.4, - "y": 0.4, - "z": 0.4, - ".": 0.4, - ",": 0.4, - "!": 0.4, - "?": 0.4, - "'": 0.4, - "\u2019": 0.4, - "\"": 0.4, - ":": 0.4, - ";": 0.4, - "-": 0.4, - "\u2013": 0.4, - "\u2014": 0.4, - "(": 0.4, - ")": 0.4, - "[": 0.4, - "]": 0.4, - "/": 0.4, - "&": 0.4, - "%": 0.4, - "+": 0.4, - "#": 0.4, - "@": 0.4, - "*": 0.4, - " ": 0.4 - } - } -} diff --git a/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg b/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg deleted file mode 100644 index fe47021..0000000 --- a/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - -Font name: Hershey Script 1-stroke - -Originally prepared in 2011 and converted to SVG fonts -in 2019 by Windell H. Oskay, www.evilmadscientist.com - -Contents adapted from emergent.unpythonic.net/software/hershey - by way of "Hershey Fonts in SVG" by Marty McGuire - http://www.thingiverse.com/thing:6168 - -------------------------------------------------------------------- -The Hershey Fonts are a set of vector fonts with a liberal license. - -USE RESTRICTION: - This distribution of the Hershey Fonts may be used by anyone for - any purpose, commercial or otherwise, providing that: - 1. The following acknowledgements must be distributed with - the font data: - - The Hershey Fonts were originally created by Dr. - A. V. Hershey while working at the U. S. - National Bureau of Standards. - - The format of the Font data in this distribution - was originally created by - James Hurt - Cognition, Inc. - 900 Technology Park Drive - Billerica, MA 01821 - (mit-eddie!ci-dandelion!hurt) - 2. The font data in this distribution may be converted into - any other format *EXCEPT* the format distributed by - the U.S. NTIS where each point is described - in eight bytes as "xxx yyy:", where xxx and yyy are - the coordinate values as ASCII numbers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg b/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg deleted file mode 100644 index d6beb67..0000000 --- a/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - -Font name: Hershey Script medium - -Originally prepared in 2011 and converted to SVG fonts -in 2019 by Windell H. Oskay, www.evilmadscientist.com - -Contents adapted from emergent.unpythonic.net/software/hershey - by way of "Hershey Fonts in SVG" by Marty McGuire - http://www.thingiverse.com/thing:6168 - -------------------------------------------------------------------- -The Hershey Fonts are a set of vector fonts with a liberal license. - -USE RESTRICTION: - This distribution of the Hershey Fonts may be used by anyone for - any purpose, commercial or otherwise, providing that: - 1. The following acknowledgements must be distributed with - the font data: - - The Hershey Fonts were originally created by Dr. - A. V. Hershey while working at the U. S. - National Bureau of Standards. - - The format of the Font data in this distribution - was originally created by - James Hurt - Cognition, Inc. - 900 Technology Park Drive - Billerica, MA 01821 - (mit-eddie!ci-dandelion!hurt) - 2. The font data in this distribution may be converted into - any other format *EXCEPT* the format distributed by - the U.S. NTIS where each point is described - in eight bytes as "xxx yyy:", where xxx and yyy are - the coordinate values as ASCII numbers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.agents/skills/embedded-captions/dna/README.md b/.agents/skills/embedded-captions/dna/README.md deleted file mode 100644 index af5cdc7..0000000 --- a/.agents/skills/embedded-captions/dna/README.md +++ /dev/null @@ -1,148 +0,0 @@ -# DNA registry — pick a visual language, not a preset - -A **DNA** is a complete, art-directed visual language: typeface, palette logic, motion -grammar, and hero orchestration. It **parameterizes per scene** instead of shipping a -fixed look: the accent color is sampled from THIS scene, the contact shadow falls along -THIS scene's light, embed text blur matches THIS scene's depth-of-field, and the hero's -entrance amplitude follows how hard the word was actually spoken (RMS). - -This replaces the template grab-bag. Six deep languages × scene adaptation beats 54 -shallow presets — every render is already fitted to its footage. - -## Category lock (deliveries field, enforced by the compilers) - -Every classic DNA's **home is Cinematic (column)** — that is where all ten were -built and validated. (Standard/rail mode was retired 2026-06-12; the verbatim-rail -need is served by the `anchor` theme. The old rail combos are archived outside -this repo and are not distributed with the skill.) - -## The ten - -| DNA | Register | Scene fit | Voice | -| --------------- | -------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **cream** | premium-warm | dark / mid warm scenes (band luma < 150) | Inter, warm cream, screen blend, glowing emergence hero. The poetic default. | -| **ink** | premium | **bright scenes (band luma > 150)** | Inter, near-black, multiply blend — type reads as _printed on_ the wall. Fixes the bright-scene hole. | -| **editorial** | editorial-luxe | introspective / fashion / poetic, mid-dark | Bodoni Moda, bone, _lowercase italic hero_ — magazine elegance over shout. | -| **keynote** | tech-premium | product / launch / founder updates | Inter 800, opaque white, line-wipe reveals, hero wipes UP. Stillness = confidence. | -| **documentary** | formal | interviews, serious subject matter | Inter, bone, **burn-in reveals**, no hero. Gravitas IS the style. | -| **loud** | loud | hype / sport / music / social | Anton, scene-sampled accent hero, single-unit slam + caption-layer ripple; **body announces in front** (`bodyLayer: "fg"` — k-pop depth, deliberate). | -| **neon** | loud-neon | neon-noir / nightlife / tech-noir (dark scenes) | Orbitron + electric cyan; words flicker-ignite like tubes; the hero **powers ON** with a strobe and hums (glow 0.5). | -| **glitch** | loud-neon | digital / hacker / AI / dystopia | Space Grotesk; **RGB-split echo layers converge** as each beat lands; 0.10–0.12s machine percussion; landing bumps co-visible captions 2px. | -| **chrome** | loud-luxe | Y2K / fashion-tech / music | Audiowide cast in a **liquid-metal gradient** (background-clip:text on the word spans); one sheen sweep crosses the hero during the hold. | -| **velocity** | loud-sport | sport / automotive / fitness | Teko italic; every word arrives **along its motion vector** (streak + skew settling upright); the hero passes through with blurred speed-trail echoes and looms while held. | - -### fx fields (hero block) the engine understands - -`entrance: emergence | settle | slam | rise | wipe-up | flicker-on | streak` · -`glow` (0–0.5) · `echoes: [{dx,dy,color,opacity,blur}]` (converge-on-land duplicates) · -`sheen: true` (gradient sweep — pair with `wordCss` background-clip) · `wordCss` -(per-word treatment; required for background-clip:text, which can't clip through -composited children) · `ripple` (px — landing bump, captions only) · `loom` / `breathe` -(hold-life) · `letterBlur` · `bodyLayer` (top-level: default layer for narration lines). - -## How to pick (agent) - -1. Read `safe-zones.json` → `heroAnchor.bandLuma` + `palette.temperature`. -2. Bright band (>150) → **ink** (never fight a bright scene with cream/screen). -3. Else pick by content register: poetic/warm → **cream** · introspective/luxe → - **editorial** · product/tech → **keynote** · serious/interview → **documentary** · - hype/social → **loud**. -4. State the pick + why in one line; the user decides (SKILL.md Step 0 still applies). - -## Authoring - -- Cinematic mode: `cinematic.json` → `"dna": ""` (drop the `template` field). -- Locked per DNA: family, palette scheme, blend, motion curves, hero orchestration. -- Open per group (unchanged): size / weight / style / case / spacing + planes. -- `var(--accent)` is available in per-group CSS — it resolves to the scene-sampled accent. - -## What the engine generates from the DNA (no authoring needed) - -- **Hero three-act**: co-visible captions dim 0.35s before the hero lands (setup) → - entrance with per-letter stagger, amplitude ∝ spoken loudness (impact) → slow breathe - - glow until exit (afterglow). -- **Scene optics**: depth-match blur on embed captions, light-direction contact shadow. -- All deterministic — measured from files, no randomness. - -## Climax selection — what earns the promotion - -Pick the **payoff, not the topic**: the words you would quote when paraphrasing the -beat. "The stars were only limited by the pixel size" — the payoff is **pixel size** -(the surprising claim), not "stars" (the subject). Test: would the word alone, big on -screen, make the listener nod? A topic word makes them wait. - -- **Phrases are legal** (`match: "pixel size"` / `"skin food"`): a peak is a semantic - unit, not necessarily one token. 2–4 words max — beyond that it's a sentence, not a - peak. -- **Prefer clause-final** — nothing left dangling to place after the lift. -- **Never strand a determiner**: lifting "stars" out of "The stars…" leaves an orphan - "The" that vanishes mid-air. The compiler auto-absorbs a line-leading article into - the promoted phrase; mid-line, match the phrase including its article. -- Sizes are TARGETED by the compiler, not just floored — author sizes are hints: - - **apex = frame event**: under 88% of usable width → raised toward a 93% fill. - Std height cap = `sizeRange[1] × 1.25` (≤46cqh; formal register ×1.0) — a std apex - bursts a rail, not a body composition. Cinematic cap = `sizeRange[1]`. - - **short words fill with TRACKING**: when the height cap binds before the width - target (SHINE — 5 glyphs), the compiler letterspaces up to +0.32em until the word - owns ~88% of the width (film-title craft: HER / DUNE). Long words fill by scale, - short words by air — impact is WIDTH-led either way. - - **minor = damped beat in the apex family**: `max(3× rail, 0.55× apex-final)`, - width-capped. A peak that reads as a label is a bug. - - **lockup context is RATIO-LOCKED**: kicker/tail = `0.26× hero` (clamped - 0.05–0.085·h), recomputed after any width-fit raise. Don't hand-tune context - sizes — size the hero; the context follows like a poster system. - -## Climax placement — the lockup is the default, NOT the only composition - -A hero line takes `"placement": "subject" | "column"`: - -- **subject** (default) — the **ORBIT lockup** centered ON the subject. NOT a centered - sandwich: context anchors to the hero's EDGES like a poster kicker/tagline — - pre-context flush-left off the hero's top-left corner, post-context flush-right off - its bottom-right — so the small lines land BESIDE the head/shoulder (on the scene), - never on the face, and therefore EMBED (bg) like everything else. The eye reads a - diagonal: kicker ↘ HERO ↘ tail. Only the hero crosses the silhouette (the - matte-occlusion showcase). The context's job is reading continuity — it gets the - margins; the hero's job is the cinematic event — it gets the subject. Right when the - peak is THE dramatic moment: cream / loud / glitch / neon / velocity lean here. -- **column** — the apex stays IN its column's reading flow and BURSTS it (oversized, - full hero motion + dim/glow privileges, but composed within the sentence's home - zone; spills toward the subject naturally when oversized). Right when the content - is a continuous read and the column is the narrative's home: keynotes, tutorials, - explainers, documentary. Registers: keynote / documentary / editorial lean here. - -Applying ONE composition to every peak is monoculture — the same failure the motion -review caught. Pick per beat: a 15s explainer might run column peaks throughout and -save the subject lockup for the single apex. (A third pattern — the editorial split, -bg context upper + fg hero lower-third — lives in references/composition-craft.md and -is the next placement candidate.) - -## The motion language (five layers, each DNA answers all five) - -A DNA's animation is not a parameter tweak on a shared fade — it's a distinct physics: - -| Layer | What it governs | Where it lives | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- | -| **word entrance** | how each word materializes on its beat ({y,x,blur,scale,rot,dur,ease} or burn) | `motion.soft/present/impact` | -| **line exit** | direction + speed of leaving, optional top-to-bottom cascade | `motion.exit` ({dur,y,x,scale,ease,stagger}) | -| **hold-life** | what text does while on screen — stillness is a deliberate choice | `hero.breathe` / `hero.loom` (0 = print-still) | -| **hero orchestration** | the three-act entrance signature (emergence / settle / slam / rise / **wipe-up**) + glow / letterBlur / **ripple** | `hero.*` | -| **timing physics** | the duration & easing register everything obeys (percussive 0.15s ↔ atmospheric 0.6s) | implied by the values above — keep one family per DNA | - -Shipped signatures: cream = _light condenses_ (blur-settle, drift-up exits) · ink = -_letterpress_ (scale-press, no float, dead-still) · editorial = _the pen glides_ -(x-glide with the italic, cascade-out page turns) · keynote = _surgical reveal_ -(burn words + line wipe + hero wipe-up, exits never move) · documentary = _burn and -hold_ (motion's absence IS the language) · loud = _percussion_ (back-eased punches, -alternating tilt, hero ripple that bumps every caption — never the footage). - -Rules inherited from hyperframes motion-principles: exits faster than entrances; vary -ease families BETWEEN DNAs (not within one); `.out` enters, `.in` leaves; never two -transform tweens on one element in the same window (wipe-up is clip-path so the -afterglow scale channel stays free; loom subsumes breathe). - -## Adding a DNA - -Copy an existing `dna/.json`, change the voice, keep the schema. The engine -(`modes/cinematic/engine.html`) and both compilers consume it as-is. A DNA earns its -place by being a _distinct voice with a reason to exist_ — not a recolor. diff --git a/.agents/skills/embedded-captions/dna/chrome.json b/.agents/skills/embedded-captions/dna/chrome.json deleted file mode 100644 index 559db06..0000000 --- a/.agents/skills/embedded-captions/dna/chrome.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "chrome", - "title": "Chrome — Y2K liquid metal", - "register": "loud-luxe", - "when": "fashion-tech, music, Y2K-revival, product-flex content. The hero is cast in liquid metal — a gradient sheen sweeps across it once during the hold. Supporting lines stay cool steel.", - "font": { - "family": "Audiowide", - "weights": [400] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#e8edf2", - "blend": "normal", - "accent": "#9fb6cc", - "accent_fallback": "#9fb6cc" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "y": 6, - "scale": 1.04, - "dur": 0.3, - "ease": "power3.out" - }, - "present": { - "y": 6, - "scale": 1.06, - "dur": 0.26, - "ease": "power3.out" - }, - "impact": { - "y": 8, - "scale": 1.1, - "dur": 0.22, - "ease": "power4.out" - }, - "exit": { - "dur": 0.25, - "ease": "power2.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "settle", - "perLetter": false, - "letterStagger": 0, - "glow": 0.15, - "dimOthers": 0.4, - "breathe": 0.008, - "sheen": true, - "case": "uppercase", - "tracking": "0.02em", - "sizeRange": [0.18, 0.3], - "css": "", - "wordCss": "background: linear-gradient(105deg,#3a4350 0%,#f6fbff 20%,#8fa0b2 38%,#ffffff 50%,#2e3742 64%,#eef6fd 82%,#6b7888 100%); background-size: 220% 100%; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; text-shadow: none;" - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "signature = liquid-metal wordCss + sheen sweep (engine fx) — std ignores wordCss/fx" - } -} diff --git a/.agents/skills/embedded-captions/dna/cream.json b/.agents/skills/embedded-captions/dna/cream.json deleted file mode 100644 index cb6a924..0000000 --- a/.agents/skills/embedded-captions/dna/cream.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "cream", - "title": "Warm cream — the poetic default", - "register": "premium-warm", - "when": "dark / mid-tone warm scenes (band luma < 150): studios, evening interiors, moody interviews. Introspective, narrative, emotional content. The successor of cinematic-cream.", - "font": { - "family": "Inter", - "weights": [500, 600, 700, 900] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#fff5df", - "blend": "screen", - "accent": "scene", - "accent_fallback": "#e3c06a" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": true - }, - "filter": "contrast(1.08)", - "motion": { - "soft": { - "y": 8, - "blur": 2.5, - "dur": 0.5, - "ease": "power2.out" - }, - "present": { - "y": 6, - "blur": 1.5, - "scale": 1.03, - "dur": 0.3, - "ease": "power3.out" - }, - "impact": { - "y": 12, - "blur": 1.5, - "scale": 1.08, - "dur": 0.24, - "ease": "power4.out" - }, - "exit": { - "dur": 0.45, - "y": -8, - "ease": "sine.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "emergence", - "perLetter": true, - "letterStagger": 0.016, - "glow": 0.3, - "dimOthers": 0.45, - "breathe": 0.012, - "case": "uppercase", - "tracking": "-0.03em", - "sizeRange": [0.2, 0.34], - "letterBlur": 2.5 - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "validated", - "note": "standard-mode lineage IS cinematic-cream; validated std renders (jimeng)" - } -} diff --git a/.agents/skills/embedded-captions/dna/documentary.json b/.agents/skills/embedded-captions/dna/documentary.json deleted file mode 100644 index 4f3b6a8..0000000 --- a/.agents/skills/embedded-captions/dna/documentary.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "documentary", - "title": "Documentary — Errol Morris dignity", - "register": "formal", - "when": "interviews, serious subject matter, journalism, testimonial. Burn-in reveals (no animation), bone on charcoal, a deliberately modest hero. Gravitas IS the style — stillness, no accent color, no glow.", - "font": { - "family": "Inter", - "weights": [500, 700] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#F5EFE6", - "blend": "normal", - "accent": "#F5EFE6", - "accent_fallback": "#F5EFE6" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "reveal": "burn" - }, - "present": { - "y": 0, - "dur": 0.18, - "ease": "power1.out" - }, - "impact": { - "y": 6, - "scale": 1.03, - "dur": 0.2, - "ease": "power2.out" - }, - "exit": { - "dur": 0.15, - "ease": "power1.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "rise", - "perLetter": false, - "letterStagger": 0, - "glow": 0, - "dimOthers": 0.3, - "breathe": 0, - "case": "none", - "tracking": "-0.015em", - "sizeRange": [0.09, 0.15], - "css": "font-weight: 700;" - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "the lower-third IS documentary's home register (Errol Morris); column stays deliberately modest" - } -} diff --git a/.agents/skills/embedded-captions/dna/editorial.json b/.agents/skills/embedded-captions/dna/editorial.json deleted file mode 100644 index 1d2fa97..0000000 --- a/.agents/skills/embedded-captions/dna/editorial.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "editorial", - "title": "Editorial — serif voice, magazine cadence", - "register": "editorial-luxe", - "when": "introspective monologue, fashion / beauty, poetic or lyrical content, premium brand films on mid/dark scenes. The serif italic carries intimacy that a grotesque can't. The hero stays lowercase italic — elegance over shout.", - "font": { - "family": "Bodoni Moda", - "weights": [400, 700] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#f2ead8", - "blend": "screen", - "accent": "scene", - "accent_fallback": "#c9a36a" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": true - }, - "filter": "contrast(1.06)", - "motion": { - "soft": { - "x": -10, - "y": 0, - "dur": 0.55, - "ease": "power2.out" - }, - "present": { - "x": -8, - "y": 0, - "scale": 1.02, - "dur": 0.34, - "ease": "power2.out" - }, - "impact": { - "x": -10, - "y": 0, - "scale": 1.06, - "dur": 0.28, - "ease": "power3.out" - }, - "exit": { - "dur": 0.4, - "x": 8, - "ease": "sine.in", - "stagger": 0.07 - } - }, - "hero": { - "entrance": "emergence", - "perLetter": true, - "letterStagger": 0.022, - "glow": 0.18, - "dimOthers": 0.5, - "breathe": 0.01, - "case": "none", - "tracking": "-0.01em", - "sizeRange": [0.18, 0.3], - "css": "font-style: italic; font-weight: 700;", - "letterBlur": 1.5 - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "italic serif rail reads fine; the signature x-glide + line cascade-out exits don't exist in the std enum" - } -} diff --git a/.agents/skills/embedded-captions/dna/glitch.json b/.agents/skills/embedded-captions/dna/glitch.json deleted file mode 100644 index 851e605..0000000 --- a/.agents/skills/embedded-captions/dna/glitch.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "glitch", - "title": "Glitch — signal corruption", - "register": "loud-cyber", - "when": "digital / hacker / AI / dystopia content; anything that wants the captions to feel like a corrupted feed. RGB-split echoes snap together as each beat lands; timing is machine-percussive; nothing eases politely.", - "font": { - "family": "Space Grotesk", - "weights": [400, 700] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#eaffff", - "blend": "screen", - "accent": "#ff3df0", - "accent_fallback": "#ff3df0" - }, - "optics": { - "depthMatch": false, - "contactShadow": false, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "x": -6, - "stretchX": 1.12, - "dur": 0.12, - "ease": "power4.out" - }, - "present": { - "x": -8, - "stretchX": 1.18, - "dur": 0.11, - "ease": "power4.out" - }, - "impact": { - "x": -10, - "stretchX": 1.25, - "dur": 0.1, - "ease": "power4.out" - }, - "exit": { - "dur": 0.1, - "scale": 1.02, - "ease": "power4.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "settle", - "perLetter": false, - "letterStagger": 0, - "glow": 0.18, - "dimOthers": 0.45, - "breathe": 0, - "ripple": 2, - "case": "uppercase", - "tracking": "0.01em", - "sizeRange": [0.2, 0.32], - "css": "font-weight: 700;", - "echoes": [ - { - "dx": -5, - "dy": 0, - "color": "#22e6ff", - "opacity": 0.75 - }, - { - "dx": 5, - "dy": 1, - "color": "#ff3df0", - "opacity": 0.75 - } - ] - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "signature = RGB-split echoes converge (engine fx) — rail keeps only a tinted skin" - } -} diff --git a/.agents/skills/embedded-captions/dna/ink.json b/.agents/skills/embedded-captions/dna/ink.json deleted file mode 100644 index b6e75f5..0000000 --- a/.agents/skills/embedded-captions/dna/ink.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "ink", - "title": "Ink — printed on the scene", - "register": "premium", - "when": "BRIGHT scenes (band luma > 150): white offices, daylight, pale walls — the scenes where cream/screen washes out. Multiply blend makes the type read as printed ON the wall, picking up its texture. Confident, editorial-tech tone.", - "font": { - "family": "Inter", - "weights": [500, 700, 900] - }, - "palette": { - "scheme": "dark-on-light", - "cap_color": "#1b1714", - "blend": "multiply", - "accent": "scene", - "accent_fallback": "#9a3b2e" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": false - }, - "filter": "contrast(1.05)", - "motion": { - "soft": { - "y": 0, - "scale": 1.06, - "dur": 0.22, - "ease": "power3.out" - }, - "present": { - "y": 0, - "scale": 1.08, - "dur": 0.2, - "ease": "power3.out" - }, - "impact": { - "y": 0, - "scale": 1.12, - "dur": 0.18, - "ease": "power4.out" - }, - "exit": { - "dur": 0.22, - "ease": "power2.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "settle", - "perLetter": false, - "letterStagger": 0.014, - "glow": 0, - "dimOthers": 0.4, - "breathe": 0, - "case": "uppercase", - "tracking": "-0.035em", - "sizeRange": [0.2, 0.34] - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "rail works (scale-press→settle) but the letterpress identity wants a scene surface to press INTO" - } -} diff --git a/.agents/skills/embedded-captions/dna/keynote.json b/.agents/skills/embedded-captions/dna/keynote.json deleted file mode 100644 index 7595874..0000000 --- a/.agents/skills/embedded-captions/dna/keynote.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "keynote", - "title": "Keynote — Apple-grade confidence", - "register": "tech-premium", - "when": "product walkthroughs, launches, founder updates, tech explainers. Opaque white type, dead-center planes, few words held long. Confidence comes from mass and stillness, not motion.", - "font": { - "family": "Inter", - "weights": [400, 600, 800] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#ffffff", - "blend": "normal", - "accent": "scene", - "accent_fallback": "#8ab4ff" - }, - "optics": { - "depthMatch": true, - "contactShadow": true, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "reveal": "burn" - }, - "present": { - "reveal": "burn" - }, - "impact": { - "reveal": "burn" - }, - "lineReveal": { - "type": "wipe-x", - "dur": 0.4, - "ease": "expo.out" - }, - "exit": { - "dur": 0.3, - "ease": "power2.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "wipe-up", - "perLetter": false, - "letterStagger": 0, - "glow": 0, - "dimOthers": 0.35, - "breathe": 0, - "case": "uppercase", - "tracking": "-0.045em", - "sizeRange": [0.16, 0.3], - "css": "font-weight: 800;" - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "validated", - "note": "wipe-up maps to the std entrance enum; keynote_std validated (Shine)" - } -} diff --git a/.agents/skills/embedded-captions/dna/loud.json b/.agents/skills/embedded-captions/dna/loud.json deleted file mode 100644 index 21f572d..0000000 --- a/.agents/skills/embedded-captions/dna/loud.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "loud", - "title": "Loud — the sanctioned blast", - "register": "loud", - "when": "hype, social reels, sport, music, motivational shorts — content that WANTS the type to compete with the face (k-pop-lyric lineage; deliberately breaks 'subject wins' at the hero). Machine-gun letter staggers, slam entrances, scene-sampled saturated accent on the hero. Body lines ANNOUNCE in front of the subject (bodyLayer:fg — k-pop lyric depth); only the hero embeds behind.", - "font": { - "family": "Anton", - "weights": [400] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#ffffff", - "blend": "normal", - "accent": "scene", - "accent_fallback": "#ffd600", - "heroColor": "accent", - "accentMode": "counter" - }, - "optics": { - "depthMatch": false, - "contactShadow": true, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "y": 0, - "scale": 1.3, - "rot": 1.2, - "dur": 0.18, - "ease": "back.out(1.7)" - }, - "present": { - "y": 0, - "scale": 1.35, - "rot": 1.2, - "dur": 0.18, - "ease": "back.out(1.7)" - }, - "impact": { - "y": 0, - "scale": 1.45, - "rot": 1.5, - "dur": 0.16, - "ease": "back.out(1.9)" - }, - "exit": { - "dur": 0.14, - "scale": 0.96, - "ease": "power3.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "slam", - "perLetter": false, - "letterStagger": 0.01, - "glow": 0.25, - "dimOthers": 0.55, - "breathe": 0.016, - "case": "uppercase", - "tracking": "-0.005em", - "sizeRange": [0.26, 0.4], - "css": "-webkit-text-stroke: 2px rgba(0,0,0,0.35); paint-order: stroke fill;", - "ripple": 3, - "loom": 0.03 - }, - "css": "", - "bodyLayer": "fg", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "slam maps; bodyLayer:fg already a std-shaped hybrid; validated both" - } -} diff --git a/.agents/skills/embedded-captions/dna/neon.json b/.agents/skills/embedded-captions/dna/neon.json deleted file mode 100644 index 0cba803..0000000 --- a/.agents/skills/embedded-captions/dna/neon.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "neon", - "title": "Neon — the sign in the scene", - "register": "loud-neon", - "when": "neon-noir / nightlife / tech-noir / music content on dark scenes. The captions ARE neon signage hanging in the room: electric cyan tubes, ignition flicker, a hum of glow. The hero powers ON like a sign being lit.", - "font": { - "family": "Orbitron", - "weights": [400, 700] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#d9f7ff", - "blend": "screen", - "accent": "#22e6ff", - "accent_fallback": "#22e6ff", - "heroColor": "accent" - }, - "optics": { - "depthMatch": false, - "contactShadow": false, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "reveal": "flicker" - }, - "present": { - "reveal": "flicker" - }, - "impact": { - "reveal": "flicker" - }, - "exit": { - "dur": 0.18, - "ease": "power2.in", - "stagger": 0 - } - }, - "hero": { - "entrance": "flicker-on", - "perLetter": false, - "letterStagger": 0, - "glow": 0.5, - "dimOthers": 0.4, - "breathe": 0.01, - "case": "uppercase", - "tracking": "0.04em", - "sizeRange": [0.18, 0.3], - "css": "text-shadow: 0 0 14px rgba(34,230,255,0.65), 0 0 40px rgba(34,230,255,0.35), 0 0 80px rgba(34,230,255,0.18);" - }, - "css": ".cap { text-shadow: 0 0 10px rgba(34,230,255,0.4), 0 0 26px rgba(34,230,255,0.2); }", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "signature = flicker-on + glow layer (engine hero fx) — rail keeps only the cyan skin" - } -} diff --git a/.agents/skills/embedded-captions/dna/velocity.json b/.agents/skills/embedded-captions/dna/velocity.json deleted file mode 100644 index 8650e1d..0000000 --- a/.agents/skills/embedded-captions/dna/velocity.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "velocity", - "title": "Velocity — speed lines", - "register": "loud-sport", - "when": "sport, automotive, fitness, anything kinetic. Every word arrives ALONG its own motion vector (streak + skew settles upright); the hero passes through with speed trails behind it. Condensed italic forward lean.", - "font": { - "family": "Teko", - "weights": [400, 700] - }, - "palette": { - "scheme": "light-on-dark", - "cap_color": "#ffffff", - "blend": "normal", - "accent": "scene", - "accent_fallback": "#ffd600", - "heroColor": "accent", - "accentMode": "counter" - }, - "optics": { - "depthMatch": false, - "contactShadow": true, - "warmBloom": false - }, - "filter": "none", - "motion": { - "soft": { - "x": -22, - "skewX": -8, - "stretchX": 1.3, - "dur": 0.22, - "ease": "expo.out" - }, - "present": { - "x": -26, - "skewX": -10, - "stretchX": 1.35, - "dur": 0.2, - "ease": "expo.out" - }, - "impact": { - "x": -32, - "skewX": -12, - "stretchX": 1.45, - "dur": 0.18, - "ease": "expo.out" - }, - "exit": { - "dur": 0.16, - "x": 14, - "ease": "power3.in", - "stagger": 0.04 - } - }, - "hero": { - "entrance": "streak", - "perLetter": false, - "letterStagger": 0, - "glow": 0, - "dimOthers": 0.5, - "breathe": 0, - "loom": 0.025, - "case": "uppercase", - "tracking": "0.015em", - "sizeRange": [0.24, 0.38], - "css": "font-weight: 700; font-style: italic;", - "echoes": [ - { - "dx": -10, - "dy": 0, - "color": "#ffffff", - "opacity": 0.22, - "blur": 1 - }, - { - "dx": -20, - "dy": 0, - "color": "#ffffff", - "opacity": 0.1, - "blur": 2 - } - ] - }, - "css": "", - "deliveries": { - "home": "column", - "rail": "unvalidated", - "note": "signature = streak + trail echoes along the speed vector (engine fx) — rail loses all of it" - } -} diff --git a/.agents/skills/embedded-captions/modes/cinematic/README.md b/.agents/skills/embedded-captions/modes/cinematic/README.md deleted file mode 100644 index f78ae5b..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Cinematic mode (pure embed) — one engine, six DNAs - -> Cinematic mode compiles **[../../dna/](../../dna/README.md)** through -> **[engine.html](engine.html)** (`make-composition.cjs`). The old per-template HTML -> shells are retired — `cinematic-cream` maps to `dna: "cream"` automatically; the other -> archived templates (memory-wall / champion / portrait-header, in [\_archive/](_archive/)) -> remain as design references only. - -Use this mode for pure-embed asks (no rail): brand film, hype, social reel, showcase. -The **DNA** locks the visual language (type, palette scheme, blend, motion grammar, hero -three-act); **safe-zones v2** parameterizes it to the scene (sampled accent, light- -direction contact shadow, depth-match blur); **the agent decides layout only** (planes, -blocks, per-line typography within the DNA). - -## Workflow - -1. `bash scripts/prepare.sh ` → matte ∥ transcript ∥ envelope → safe-zones v2 -2. Pick a DNA ([../../dna/README.md](../../dna/README.md)): bright hero band → `ink`, - else by register (cream / editorial / keynote / documentary / loud). Recommend, let - the user pick. -3. Author `/cinematic.json` — `"dna": ""` + thought-blocks (schema: - `scripts/make-cinematic.cjs` header) -4. `node scripts/make-cinematic.cjs ` → plan.json → engine-compiled index.html -5. `node scripts/preview-frames.cjs ` → § Visual QA (failure checks + the 5 - positive checks in [../../references/reference-bar.md](../../references/reference-bar.md)) -6. `bash scripts/render-and-composite.sh ` → gates → final.mp4 - -## What the engine generates (never author these) - -- word timings from the transcript; accumulate-within-block / page-flip-between-blocks -- the hero hand-off + **three-act orchestration** (dim → RMS-coupled per-letter entrance - → breathe + glow), per the DNA's `hero` block -- scene tokens: `--accent` (sampled), contact shadow, depth blur -- reading order, re-slot from measured heights, hero size/collision post-pass - -## What you DON'T do - -- Override `.cap` color / blend / shadow / filter / motion curves — that's the DNA. - Scene fights the look → pick a different DNA (bright → `ink`), never recolor. -- Hand-position the hero into a clean margin (it belongs ON the subject, ~30–55% - occluded — safe-zones `heroBands.best`). -- Add full-frame grades/textures over the footage (hard rule: the video ships untouched). - -## Adding a DNA - -`dna/.json` — copy one, change the voice (see [../../dna/README.md](../../dna/README.md) -§ Adding). The engine consumes it with no code change. A DNA must be a distinct voice -with a reason to exist, not a recolor. diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md b/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md deleted file mode 100644 index a200654..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +++ /dev/null @@ -1,98 +0,0 @@ -# Template: champion - -**Look:** podcast / interview, upper-side column with intro→phrase→emph -beats building toward a center-stage CROWN that crosses the subject's body. -"Wimbledon Champion" energy. - -**Visual identity (LOCKED):** - -- 5 typography slots: intro / phrase / emph / dream / crown -- `mix-blend-mode: screen` over warm bone color (#fff5df) -- Deep text-shadow + brightness boost -- Single-caption-swap layout (caps stack at one point in the column) -- Center-stage crown crosses the subject for cinematic occlusion - -## When to apply - -✅ **Good fit:** - -- Podcast / interview style with a single seated subject -- Cluttered backdrop (bookshelf, props, dark) — screen blend reads through -- Subject roughly centered with clear clean zones on one or both sides -- Speech has a clear payoff line that can become a "crown" (1-3 short words) -- 16:9 landscape, 1920×1080 ideal - -❌ **Wrong fit:** - -- Bright/sky/window backdrop (screen blend washes out) -- Subject heavily off-center such that there's no clean column zone -- Speech has no clear climax line -- Portrait 9:16 → use `portrait-header` template instead - -## Layout decisions agent makes - -| Field | What | Example (1920×1080) | -| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| `plane.top/left/width/height` | Where the side column sits. Pick the side opposite the subject's gaze (looking room) and hug the cleanest backdrop zone. | `{top: 40, left: 40, width: 720, height: 420}` | -| `plane.rotateY` | Slight perspective into the wall. Positive for left column (recedes right), negative for right column. Keep small (3-7°). | `4` | -| `crown_top` | Y position of the crown. Should fall on the subject's chest/neck so the body occludes the middle letters. | `420` | -| `font_scale` | Multiplier on locked sizes. | `1.0` for 1920×1080 | -| `crown_enabled` | Whether to render a crown. Skip if the speech has no clean payoff line, or if the subject is too far off-center for a center crown to land. | `true` | - -### Crown placement rules - -Before enabling the crown, verify all 3 conditions: - -1. Subject body center within ±10% of frame horizontal center -2. Clean zones ≥15% of frame width on each side of subject -3. Crown text width (uppercase 140px × ~chars) > subject body width + 400px - -If any fails: disable the crown OR use a smaller font + place it in the -larger clean zone instead of center. See `references/layout-heuristics.md`. - -## Slot assignment - -| Slot | Use for | -| ------ | ---------------------------------------------------------- | -| intro | Filler / discourse markers ("you know,", "for me,", "so…") | -| phrase | Main statement clauses | -| emph | Key achievement / superlative line | -| dream | Aspirational lines, past-tense reflection | -| crown | The single climax line — center-stage payoff | - -Aim for ≤3 slots per video (excluding crown). Don't use all 4 in a 12s clip. - -## Plan.json shape - -```json -{ - "mode": "template", - "template": "champion", - "duration": 12.08, "fps": 24, "width": 1920, "height": 1080, - "plane": { - "top": 40, "left": 40, "width": 720, "height": 420, - "rotateY": 4 - }, - "crown_top": 420, - "font_scale": 1.0, - "groups": [ - { "id": "cg-0", "slot": "intro", "tone": "soft", - "in": 0.10, "out": 1.45, "words": [...] }, - { "id": "cg-1", "slot": "phrase", "tone": "soft", - "in": 1.55, "out": 4.20, "words": [...] }, - { "id": "cg-2", "slot": "emph", "tone": "present", - "in": 6.50, "out": 8.30, "words": [...] } - ], - "crown_group": { - "id": "cg-crown", "tone": "present", - "in": 10.85, "out": 12.08, - "words": [ - {"text": "Wimbledon", "start": 10.94, "end": 11.28}, - {"text": "Champion", "start": 11.38, "end": 11.84} - ] - } -} -``` - -`crown_group` always uses the crown slot — no need to specify `slot`. -Set `crown_group: null` to disable. diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html b/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html deleted file mode 100644 index 624f89f..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - -
- - -
-
{{GROUPS_HTML}}
-
{{CROWN_HTML}}
-
- - -
- - - - diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md b/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md deleted file mode 100644 index d460eaa..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +++ /dev/null @@ -1,134 +0,0 @@ -# Template: memory-wall - -**Look:** introspective monologue, italic poem stacking on a back wall, -right-aligned cascade for the climax. Sam Harris / Pico Iyer territory. - -**Visual identity (LOCKED — do not change):** - -- 4-slot typography arc: italic 600 → italic 500 hanging-indent → upright - 700 pivot → uppercase 900 climax -- `mix-blend-mode: screen` over warm-bone color (#fff4dc) -- soft text-shadow + brightness boost -- Per-word fade with subtle Y-drift (soft tone) or pop+scale (present tone) - -## When to apply - -✅ **Good fit:** - -- Talking-head with a flat back wall (acoustic foam, plain plaster, soft - bookshelf) on one side -- Single subject, fixed or near-fixed camera -- Voice-over feel: introspective, narrative, "I was thinking…" -- Mid-tone or dark backdrop (luminance < 180) - -❌ **Wrong fit:** - -- Bright window/sky backdrop → screen blend blows out -- Cluttered backdrop with text/graphics → conflicts with caption text -- Energetic / vlog / TikTok style → wrong vibe -- Multiple speakers / hard cuts → caption arc breaks - -## What agent decides per scene - -| Field | What | Example | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `plane.top/right/width/height` | Where the wall plane sits in frame. Plane should HUG the side of the wall, not float over the subject. | `{top: 90, right: 30, width: 720, height: 520}` for 1280×720 | -| `plane.rotateY` | Match the wall's perspective angle. Negative for right-side wall (text recedes left), positive for left-side wall. | `-13` for a right-side wall at slight angle | -| `plane.rotateX` | Tiny vertical tilt if wall is angled up/down. Usually 0-2 deg. | `1` | -| `font_scale` | Multiplier on the locked cap-N base sizes. Tune for frame height. | `1.0` for 1280×720, `~1.5` for 1920×1080, `~0.7` for 720p portrait | -| `groups[].slot` | Which of the 4 typography slots this group uses (1/2/3/4). Drives the arc. | See below | -| `groups[].tone` | "soft" or "present" — drives motion curve | `"soft"` for opening lines, `"present"` for pivot+climax | - -## Slot assignment rules - -Aim for ONE arc across the video: `1 → 2 → 3 → 4`. Don't repeat slots if you -can avoid it; don't skip slots without reason. - -| Slot | Use for | -| ---- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| 1 | The opener. The "I was thinking" line. Italic, soft entry. | -| 2 | The dreamy continuation / modifier. Smaller italic, hanging-indent — feels like the second half of a sentence with some staggered drift. | -| 3 | The pivot. Upright (no italic), the syntactic turn. ("but suddenly", "and then…") | -| 4 | The climax. Big uppercase 900. The payoff line. Aim for ≤4 short words so the right-aligned cascade naturally wraps to 2-3 lines. | - -If the script is longer than 4 groups, repeat slot 1 or 2 for additional -soft lines, but reserve slot 4 for the SINGLE climax. - -## Plan.json shape - -```json -{ - "mode": "template", - "template": "memory-wall", - "duration": 8.04, - "fps": 24, - "width": 1280, - "height": 720, - "plane": { - "top": 90, - "right": 30, - "width": 720, - "height": 520, - "rotateY": -13, - "rotateX": 1 - }, - "font_scale": 1.0, - "groups": [ - { - "id": "cg-0", - "slot": 1, - "tone": "soft", - "in": 0.2, - "out": 4.85, - "words": [ - { "text": "Some", "start": 0.24, "end": 0.44 }, - { "text": "memories", "start": 0.48, "end": 0.82 }, - { "text": "feel", "start": 0.92, "end": 1.14 }, - { "text": "soft", "start": 1.2, "end": 1.64 } - ] - }, - { - "id": "cg-1", - "slot": 2, - "tone": "soft", - "in": 2.55, - "out": 4.85, - "words": [ - { "text": "like", "start": 2.66, "end": 2.78 }, - { "text": "old", "start": 2.86, "end": 3.02 }, - { "text": "film", "start": 3.16, "end": 3.46 } - ] - }, - { - "id": "cg-2", - "slot": 3, - "tone": "present", - "in": 4.9, - "out": 8.04, - "words": [ - { "text": "but", "start": 5.04, "end": 5.18 }, - { "text": "suddenly", "start": 5.24, "end": 5.76 } - ] - }, - { - "id": "cg-3", - "slot": 4, - "tone": "present", - "in": 6.7, - "out": 8.04, - "words": [ - { "text": "everything", "start": 6.82, "end": 7.14 }, - { "text": "is", "start": 7.18, "end": 7.28 }, - { "text": "sharp", "start": 7.32, "end": 7.52 }, - { "text": "again", "start": 7.58, "end": 7.92 } - ] - } - ] -} -``` - -## Don't fight the template - -If the user wants different typography, different blend, or different motion: -**use Standard mode** (`../../../standard/`). Don't try to override the locked CSS — the -template's visual consistency is the whole point. diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html b/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html deleted file mode 100644 index da9cec4..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - -
- - -
-
{{GROUPS_HTML}}
-
- - -
- - - - diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md b/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md deleted file mode 100644 index efaaf0a..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +++ /dev/null @@ -1,81 +0,0 @@ -# Template: portrait-header - -**Look:** 9:16 portrait talking-head with captions on a horizontal strip -across the top of the frame, above the subject's head. Optional crown at -the bottom for shots that include the subject's waist or below. - -**Visual identity (LOCKED):** - -- 5 typography slots: intro / phrase / emph / dream / crown (centered) -- `mix-blend-mode: screen` over warm bone color (#fff5df) -- Single-caption swap (caps stack at one position in the header strip) -- Per-word fade with subtle Y-drift (soft) or pop+scale (present) - -## When to apply - -✅ **Good fit:** - -- 9:16 portrait video (1080×1920 typical) -- Single subject filling the center of the frame -- Clean band visible above the head -- Speech is relatively dense (many short phrases) — crown only for the - one true climax - -❌ **Wrong fit:** - -- Subject's head crops to the very top of frame (no header band exists) -- 16:9 landscape → use `champion` or `memory-wall` instead -- Multiple speakers / cuts - -## Layout decisions - -| Field | What | Example (1080×1920) | -| --------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | -| `header.top` | Y of the header strip. Should sit above the subject's head with ~30px breathing room. | `30` if hair top is around y=200 | -| `header.height` | Height of the strip. Bigger for longer captions / 2-line wraps. | `280` | -| `crown_top` | Y of the crown line (bottom of frame). Skip if no waist visible. | `1620` for a near-full-body shot | -| `crown_enabled` | Whether to render a bottom crown. Skip if subject body fills the lower half completely (matte will block crown anyway). | `false` for tight head-and-shoulders | -| `font_scale` | Scale multiplier on locked sizes. | `1.0` for 1080×1920 | - -## Slot assignment - -Same arc as champion: intro / phrase / emph / dream / crown. - -For portrait-header specifically, header band is narrow (one strip), so: - -- Most groups fit on 1-2 lines -- Don't use crown if it'd be hidden by the body matte (Pausch-style portraits - often need to skip crown entirely and promote the climax to `emph` in the - header instead) - -## Plan.json shape - -```json -{ - "mode": "template", - "template": "portrait-header", - "duration": 25.3, "fps": 24, "width": 1080, "height": 1920, - "header": { "top": 30, "height": 280 }, - "crown_top": 1620, - "font_scale": 1.0, - "groups": [ - { "id": "cg-0", "slot": "intro", "tone": "soft", - "in": 0.10, "out": 3.20, "words": [...] }, - { "id": "cg-1", "slot": "phrase", "tone": "soft", - "in": 3.55, "out": 5.80, "words": [...] }, - { "id": "cg-2", "slot": "emph", "tone": "present", - "in": 17.85, "out": 22.10, - "words": [ - {"text": "Time", "start": 17.94, "end": 18.26}, - {"text": "is", "start": 18.38, "end": 18.54}, - {"text": "all", "start": 18.66, "end": 18.80}, - {"text": "we", "start": 18.92, "end": 19.02}, - {"text": "have", "start": 19.12, "end": 19.38} - ]} - ], - "crown_group": null -} -``` - -Set `crown_group: null` if you've checked that a crown would be blocked by -the subject body or the shot composition. diff --git a/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html b/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html deleted file mode 100644 index 4cf2873..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - -
- - -
-
{{GROUPS_HTML}}
-
{{CROWN_HTML}}
-
- - -
- - - - diff --git a/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md b/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md deleted file mode 100644 index a490206..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +++ /dev/null @@ -1,16 +0,0 @@ -# cinematic-cream — spec - -The authoritative spec lives in [template.html](template.html)'s header comment (DNA-only: -what's LOCKED vs OPEN, the LAYOUT/planes contract, READING ORDER + hand-off, hero sizing). -Read that header before authoring plan.json. Quick contract: - -- LOCKED: Inter, soft/present motion, warm-cream palette, screen blend, shadow logic. -- OPEN per group (css field): size/weight/style/transform/spacing + position WITHIN a plane. -- LAYOUT: run scripts/safe-zones.cjs first. Narration planes HUG the silhouette — use - zones.hugLeft/hugRight (2-6% gap from the subject's edge); a plane parked in the far - corner reads as disconnected floating text, not an embed. The ONE hero stays BIG - (~0.22-0.34·h) centered ON the subject (heroAnchor / heroBands.best), target ~30-55% - occlusion. fg is the LAST resort: only when heroBands.feasible=false (no band ≤62%). - hero BIG (~0.22-0.34·h) centered ON the subject (heroAnchor), target ~30-55% occlusion. -- plan.json: groups[] with per-word transcript timings (use scripts/fill-timings.cjs), - fit via scripts/fit-fonts.cjs, compile via scripts/make-composition.cjs. diff --git a/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html b/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html deleted file mode 100644 index 318130a..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - -
- - -
{{GROUPS_HTML}}
-
- - - - diff --git a/.agents/skills/embedded-captions/modes/cinematic/engine.html b/.agents/skills/embedded-captions/modes/cinematic/engine.html deleted file mode 100644 index 3928c85..0000000 --- a/.agents/skills/embedded-captions/modes/cinematic/engine.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - - - - - -
- - -
{{GROUPS_HTML}}
-
- - - - diff --git a/.agents/skills/embedded-captions/modes/standard/_anatomy.md b/.agents/skills/embedded-captions/modes/standard/_anatomy.md deleted file mode 100644 index 74a0e9a..0000000 --- a/.agents/skills/embedded-captions/modes/standard/_anatomy.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -name: caption-template-anatomy -description: The shared, reproducible scene engine every caption template is built on — a matted talking-head with a flowing verbatim foreground caption and a single climax word, driven by one paused GSAP timeline. Read it ONCE per session (it is identical for all 54 templates); each per-template file in templates/ only overrides the style tokens + the named climax entrance/exit. -metadata: - tags: caption, talking-head, matte, occlusion, verbatim, climax, gsap, hyperframes ---- - -# Caption Template — Anatomy (the shared engine) - -A **caption template** = one complete, reproducible HyperFrames scene: - -> **the person (always in frame)** + a **flowing foreground caption** (verbatim, word-by-word, with appear **and** disappear) + a **climax word** (big, behind the speaker, with a designed entrance **and** exit) + a coherent **font / colour / motion** design. - -Every file in `templates/` is the SAME engine described here with three things swapped: (1) the **style tokens** (font, fills, accent, optional gradient/stroke), (2) the named **climax entrance** + **exit** (see `_motion.md`), (3) the **copy** (flow lines + climax word) and **scene/person**. So read this once; each template file is short. - -HyperFrames-native, so anyone can reproduce it: - -- **One paused GSAP timeline per composition**, registered to `window.__timelines[data-composition-id]`. -- All timing in **seconds**; `data-start` / `data-duration` carry the scene window. -- **Deterministic + seek-safe** only — no `Math.random()`, no `Date.now()`, no `repeat: -1` without a finite root `data-duration`, no un-seekable CSS animations. Every state is reachable by seeking the timeline to a time `t`. -- GSAP transform aliases (`x`, `y`, `scale`, `rotation`); animate `opacity`, `filter`, `clipPath`, `textShadow`, `backgroundPosition`, `letterSpacing` — never layout props (width/top/left/margin). - -For the composition contract see `hyperframes-core`; eases + the animated-property allowlist see `hyperframes-gsap`; caption grouping/positioning/exit guarantees see `hyperframes-captions`. - -## 1 · Asset prep (two CLI calls) - -```bash -# 1) The person — transparent talking-head cutout over the scene (VP9 + alpha) -bash scripts/prepare.sh # matte ∥ transcribe ∥ safe-zones (THIS skill — not remove-background) -# (a still works too: remove-background portrait.jpg -o person.png) - -# 2) The verbatim word timings that drive the flowing caption -npx hyperframes transcribe subject.mp4 --model small # → transcript.json -# shape: [{ "id":"w0","text":"Hello","start":0.0,"end":0.5 }, …] -``` - -The flow caption consumes that `transcript.json` directly (word `start`/`end` → reveal + active-word emphasis). The climax word is authored by hand (it is the headline beat, not part of the spoken transcript). In production the avatar/matte pipeline yields a pixel-perfect alpha for free — `remove-background` is the fallback for arbitrary footage. - -## 2 · The matte sandwich (HTML) - -Six layers, back-to-front. The person is layered ON TOP of the climax so they physically **occlude** it — this is what sells "behind the speaker" (blur/opacity alone reads as a flat overlay). - -```html -
- - - - -
{CLIMAX_WORD}
- - - - - - -
- - -
- -
-``` - -## 3 · Base CSS (layout · z-order · sizing) - -Caption size is in **`cqh`** (% of frame height) via a size container, so it honours broadcast spec at any resolution (~8% cap-height for a 16:9 word). The per-template file only sets the `--ff` / `--cfill` / `--cacc` tokens and any `.climax span` fill (gradient/stroke). - -```css -.stage { - position: relative; - aspect-ratio: 16/9; - overflow: hidden; - container-type: size; - background-size: cover; - background-position: center 12%; - background-color: #0a0a0e; - font-family: var(--ff); -} -.stage > * { - position: absolute; -} -.cut { - z-index: 4; - inset: 0; - width: 100%; - height: 100%; - object-fit: cover; - object-position: center 12%; - pointer-events: none; -} -.grade { - z-index: 5; - inset: 0; - pointer-events: none; - background: radial-gradient(130% 100% at 50% 26%, transparent 40%, rgba(0, 0, 0, 0.6)); -} - -/* CLIMAX — big, behind person (z1), occluded. line-height ≥1.15 so clip-reveal - entrances (inset(0)) never slice glyph tops; pad clips negative for script faces. */ -.climax { - z-index: 1; - left: 50%; - top: 37%; - transform: translate(-50%, -50%); - white-space: nowrap; - text-align: center; - line-height: 1.18; - font-family: var(--ff); - color: var(--cfill); - font-weight: 900; - font-size: 44cqh; - text-transform: uppercase; - text-shadow: - 0 2px 13px rgba(0, 0, 0, 0.6), - 0 0 48px rgba(0, 0, 0, 0.42); -} -.climax span { - display: inline-block; - opacity: 0; -} /* GSAP reveals it */ - -/* FLOW — verbatim caption, in front (z6), lower third */ -.flow { - z-index: 6; - left: 50%; - bottom: 9%; - transform: translateX(-50%); - width: 90%; - text-align: center; - line-height: 1.15; - font-family: var(--ff); - font-weight: 700; - font-size: 7.5cqh; - color: var(--cfill); -} -.flow .w { - display: inline-block; - opacity: 0; - margin: 0 0.1em; - color: var(--cfill); -} -.flow .w.act { - color: var(--cacc); -} /* the currently-spoken word */ - -/* tokens every template overrides: */ -.stage { - --ff: "Inter"; - --cfill: #fff; - --cacc: #10a37f; -} -``` - -**Legibility on busy/bright scenes:** a behind-the-person climax needs separation from the footage, not just a fill colour. For dark or gradient fills on lit scenes give the climax an outline — `-webkit-text-stroke:1px rgba(0,0,0,.5);paint-order:stroke fill` — a dark drop-shadow alone fails against highlights (e.g. a lamp). Gradient/clip fills must live on `.climax span` (the text node), never on the transformed `.climax` container, or the clip detaches and only the shadow shows. - -## 4 · One paused GSAP timeline (the loop, made seek-safe) - -The gallery used a `setInterval` loop; HyperFrames needs the same beats as **absolute-time tweens on one paused timeline**. The cycle is **FLOW line → (FLOW line) → CLIMAX in → hold → out**. Restraint is the rule: flow stays clean; the one big mood move happens only at the climax. - -```html - - -``` - -`FLOW_IN` / `FLOW_OUT` / `CLIMAX_IN` / `CLIMAX_OUT` are the named recipes in **`_motion.md`** — each returns a GSAP tween/timeline so the per-template file just picks four names. A simpler equivalent for the flow active-word _glow_ (rather than discrete reveal) is the single-driver envelope in `hyperframes-animation/rules/asr-keyword-glow.md`. - -## 5 · How to choose values - -- **SCENE_DUR** — must equal `data-duration`. Typical 6–10 s for a looping demo card. -- **WORDS grouping** — 2–4 words / line, ~380–520 ms per word (premium pacing is slower than Hormozi). Group from `transcript.json`; keep `end < next.start` (monotonic). -- **CLIMAX_AT** — place the climax _after_ the flow lines clear, on the narration's emphasis beat. -- **CLIMAX_HOLD** — **≥1 s** of settled dwell _after_ the entrance finishes (the climax is the headline beat). Entrances run 0.6–1.6 s, so e.g. hold = entranceDur + 1.0–1.6. -- **FOUT** — flow exit ≈ 0.5 s. **Exit ≈ 75 % of entry** for every element (arrival deliberate, departure swift; see `_motion.md`). -- **Climax size** — base 44 cqh; long words bleed off-frame (intended cinematic); 3-char words behind a centred subject need size + an outline so they peek. - -## Critical constraints (HyperFrames) - -- Timeline **paused**; registry key = `data-composition-id`. -- **No CSS keyframe animation** on caption elements — all motion is GSAP tweens at absolute times (seek-safe). -- No `Math.random` / `Date.now` / `repeat: -1` without a finite root `data-duration`. -- `display:inline-block` on every `.w` and the climax `span`. -- **Hard-hide** each flow group at its end time; **CLIMAX_OUT ends at `opacity:0`** (or fully-clipped) so nothing lingers. -- Gradient / `background-clip:text` / stroke fills go on `.climax span`, not the transformed `.climax`. -- `.climax` `line-height ≥ 1.15`; pad clip-reveal entrances with negative insets for script/decorative fonts. - -## Pairs with HF skills - -- `media-use` — `remove-background` (the matte) + `transcribe` (word timings). -- `hyperframes-captions` — transcript consumption, grouping, positioning, exit guarantees, `fitTextFontSize`. -- `hyperframes-animation/rules/asr-keyword-glow.md` — the verbatim active-word envelope. -- `hyperframes-gsap` — single paused timeline, transform aliases, ease palette. -- `_motion.md` (this folder) — the named flow/climax entrance + exit recipes. diff --git a/.agents/skills/embedded-captions/modes/standard/_motion.md b/.agents/skills/embedded-captions/modes/standard/_motion.md deleted file mode 100644 index cc9eeab..0000000 --- a/.agents/skills/embedded-captions/modes/standard/_motion.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -name: caption-template-motion -description: The named flow + climax entrance/exit recipes (GSAP, seek-safe) that the per-template files reference, plus the motion numerics (ease palette, exit=75% entry, climax dwell, restraint, mood→motion). Every template picks a FLOW_IN/OUT and a CLIMAX_IN/OUT from here — look up only the 2-3 recipes a template names (grep the `### name`), this is a catalog, not a read-through. -metadata: - tags: gsap, easing, entrance, exit, timing, restraint, mood-matching, captions ---- - -# Caption Template — Motion Language - -`_anatomy.md` wires four hooks onto one paused timeline: `FLOW_IN`, `FLOW_OUT`, `CLIMAX_IN`, `CLIMAX_OUT`. This file is the catalog each template picks from. Each recipe is a GSAP tween on the climax `span` (or a flow `.w`); placed at an absolute time it is fully **seek-safe**. Multi-stage looks use GSAP `keyframes:{}` (still seek-safe) — never CSS keyframes. - -## Numerics (shared) - -**Ease palette** (sanctioned — reads clean on video, stays distinct): - -| Curve | GSAP | Use | -| --------------- | --------------------------------------- | --------------------------------------------------- | -| overshoot entry | `back.out(1.4–1.7)` | confident arrivals (premium/epic/creator) | -| heavy/refined | `power3.out` | hero/secondary entrances, slides | -| general | `power2.out` | fades, scales | -| exit accel | `power2.in` | the _exit_ side of any move (departure accelerates) | -| snappy | `expo.out` | warp/fly/sonic confident snaps | -| breathing | `sine.inOut` | gentle wellness drift | -| impact thud | `back.out(1.5–2)` or a quick `expo.out` | slam/stomp/stamp landings | -| linear driver | `none` | the asr active-word envelope driver only | -| digital stutter | `steps(n)` | glitch/vhs/blink/possess/cut | - -**Forbidden:** `bounce.out`, `elastic.out` everywhere **except** the Playful cluster (explicit playfulness — KIDS drop-bounce, CANDY jelly). Elsewhere real objects decelerate; they don't bounce. Use low `back.out` for sanctioned overshoot. - -**Durations** — flow word enter 0.30–0.50 s · climax entrance 0.6–1.6 s · **exit ≈ 75 % of entry** (arrival deliberate, departure swift) · stagger 50–150 ms / word. - -**Restraint (the rule that makes it premium):** the FLOW stays clean — a tasteful reveal + the active-word accent, no effects. The big mood move + any scene effect (flash, shockwave, shake) happens **only at the CLIMAX**, then clears. Never sprinkle effects across the flow. - -**Climax dwell ≥ 1 s** after the entrance finishes — the climax is the headline beat. - -**Mood → motion** (pick an entrance whose physics match the theme): - -| Mood | Entrances | -| ------------------------------- | ---------------------------------------------------- | -| premium | deblur · rise · expose · breathe · flip | -| epic | slam · monument · fly · grandrise | -| cyber | glitch · type · scan · boot | -| horror | loom · possess · glimpse · seep (never bouncy/clean) | -| luxury | tracking-expand · hairrise | -| retro | vhs · stamp · blink · type | -| neon | ignite · buzz | -| hype | stomp · punch · slap | -| playful | jelly · dropb · scrawl · popr | -| creator | boxpop · slideup · flip · shimmer | -| ultra (flash in the type) | volt · hyper · liquid · prism · shatter · extrude | -| atelier (design) | editwipe · rise · block · vert · ink · weight | -| impact (scene effect at climax) | nuke · meteor · sonic · seismic · judge | - ---- - -## FLOW entrances / exits (per word `.w`) - -The flow caption reveals word-by-word from the transcript. The active word gets `.act` (→ `--cacc`). Exit hard-hides the group. - -- **fade-up** (premium/atelier default) — `fromTo(w,{opacity:0,y:14},{opacity:1,y:0,duration:.42,ease:'power3.out'})` -- **pop** (epic/hype) — `fromTo(w,{opacity:0,scale:.5},{opacity:1,scale:1,duration:.34,ease:'back.out(1.6)'})` -- **whip** (kinetic) — `fromTo(w,{opacity:0,x:-30,filter:'blur(10px)'},{opacity:1,x:0,filter:'blur(0)',duration:.32,ease:'expo.out'})` -- **glitch** (cyber) — `fromTo(w,{opacity:0,clipPath:'inset(45% 0 45% 0)'},{opacity:1,clipPath:'inset(0)',duration:.4,ease:'steps(6)'})` -- **type** (terminal/retro) — `fromTo(w,{opacity:0},{opacity:1,duration:.2,ease:'steps(3)'})` staggered as the cadence -- **blur-in** (horror) — `fromTo(w,{opacity:0,filter:'blur(10px)',y:'.1em'},{opacity:1,filter:'blur(0)',y:0,duration:.6,ease:'power2.out'})` -- **karaoke** (creator) — words start visible-dim; on `w.start` `set(w,{className:'w act'})` (active → `--cacc`), prior word back to spoken. The signature verbatim mechanic. -- **flow exits** — fade-up-out `to{opacity:0,y:-10}` · horror smear `to{opacity:0,x:6,skewX:10,filter:'blur(5px)'}` · all ≈0.4–0.55 s. - ---- - -## CLIMAX entrances - -Each is a `gsap.fromTo(span, {from}, {to, duration, ease})`. Where a `keyframes:{}` is shown, pass it as the 2nd arg's `keyframes`. - -### premium - -- **deblur** — `{opacity:0,scale:.96,filter:'blur(8px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:.8,ease:'power3.out'}` -- **rise** — `{opacity:0,yPercent:48}→{opacity:1,yPercent:0,duration:.9,ease:'power3.out'}` -- **expose** — `{opacity:0,filter:'brightness(3.2) blur(5px)',scale:1.05}→{opacity:1,filter:'brightness(1) blur(0)',scale:1,duration:1,ease:'power2.out'}` -- **breathe** — `{opacity:0,scale:1.09,filter:'blur(8px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:1.2,ease:'sine.out'}` -- **flip** — `{opacity:0,rotationX:93,transformPerspective:720}→{opacity:1,rotationX:0,duration:.9,ease:'power3.out'}` - -### epic - -- **slam** — `{opacity:0,scale:1.6,filter:'blur(12px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:.7,ease:'back.out(1.6)'}` (lands with a thud; overshoot ~1.03 mid) -- **monument** — `{opacity:0,scale:1.42,letterSpacing:'.12em'}→{opacity:1,scale:1,letterSpacing:'0',duration:1.3,ease:'power3.out'}` -- **fly** — `{opacity:0,scale:.3,filter:'blur(14px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:.8,ease:'expo.out'}` -- **grandrise** — `{opacity:0,yPercent:66,scale:1.05}→{opacity:1,yPercent:0,scale:1,duration:1.15,ease:'power3.out'}` - -### cyber - -- **glitch** — `{opacity:0}→{opacity:1,duration:.6,ease:'steps(8)',keyframes:{clipPath:['inset(40% 0 40% 0)','inset(0)','inset(60% 0 10% 0)','inset(0)'],x:[-8,5,-2,0],textShadow:['4px 0 #ff003c,-4px 0 #00ffd1','none']}}` -- **type** — `{opacity:1,clipPath:'inset(0 100% 0 0)'}→{clipPath:'inset(0 0 0 0)',duration:.85,ease:'steps(13)'}` (typewriter L→R) -- **scan** — `{opacity:0,scaleY:.02,filter:'brightness(2.4)'}→{opacity:1,scaleY:1,filter:'brightness(1)',duration:.75,ease:'power3.out'}` -- **boot** — `{opacity:0,scaleY:.1}→{opacity:1,scaleY:1,duration:1,ease:'steps(1)',keyframes:{opacity:[0,.6,.1,.85,.2,1]}}` (hologram power-up flicker) - -### horror (never bouncy, never clean) - -- **loom** — `{opacity:0,scale:.6,filter:'blur(17px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:1.6,ease:'power2.in',keyframes:{scale:[.6,.93,1.07,1]}}` (slowly approaches out of the dark, then a lurch closer) -- **possess** — `{opacity:0}→{opacity:1,duration:1.15,ease:'steps(1)',keyframes:{x:[0,-5,6,-4,5,-2,0],skewX:[0,9,-10,7,-5,3,0],textShadow:['none','4px 0 #c00,-4px 0 #0aa','-6px 0 #c00,6px 0 #0aa','none']}}` (materialise then violent demonic shudder) -- **glimpse** — `{opacity:0}→{opacity:1,duration:1.35,ease:'steps(1)',keyframes:{opacity:[0,1,0,0,1,0,0,1,.05,1,.15,1],x:[0,0,0,3,0,-2,0]}}` (subliminal failing-light flicker) -- **seep** — `{opacity:0,clipPath:'inset(-15% -8% 100% -8%)',filter:'blur(4px)'}→{opacity:1,clipPath:'inset(-15% -8% -15% -8%)',filter:'blur(0)',duration:1.35,ease:'power1.inOut'}` (blood seeps down into the word; negative insets so script tops aren't clipped) - -### luxury - -- **tracking** — `{opacity:0,letterSpacing:'-.05em'}→{opacity:1,letterSpacing:'.28em',duration:1.4,ease:'power3.out'}` (the most "expensive" move) -- **hairrise** — `{opacity:0,yPercent:32,letterSpacing:'.07em'}→{opacity:1,yPercent:0,letterSpacing:'0',duration:1.1,ease:'power3.out'}` - -### retro - -- **vhs** — `{opacity:0}→{opacity:1,duration:.8,ease:'steps(1)',keyframes:{x:[0,-7,6,-3,2,0],textShadow:['none','3px 0 #ff3b5c,-3px 0 #3aa0ff','none']}}` (tracking-lock jitter + chroma) -- **stamp** — `{opacity:0,scale:1.7,rotation:-5}→{opacity:1,scale:1,rotation:0,duration:.7,ease:'back.out(2)'}` (printing-stamp thud) -- **blink** — `{opacity:0}→{opacity:1,duration:.75,ease:'steps(1)',keyframes:{opacity:[0,0,1,0,1,0,1,1]}}` (8-bit blink-in) - -### neon - -- **ignite** — `{opacity:0}→{opacity:1,duration:1.3,ease:'steps(1)',keyframes:{opacity:[.2,1,.2,1,.3,1,1]}}` (tube strikes + buzzes alight; glow is a style `text-shadow`) -- **buzz** — `{opacity:0}→{opacity:1,duration:1.2,ease:'steps(1)',keyframes:{opacity:[0,.7,.1,.85,.2,1,.5,1]}}` (slower warm-up rhythm) - -### hype - -- **stomp** — `{opacity:0,scale:1.5,filter:'blur(8px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:.9,ease:'back.out(1.6)'}` -- **punch** — `{opacity:0,xPercent:-55,scale:1.1,filter:'blur(9px)'}→{opacity:1,xPercent:0,scale:1,filter:'blur(0)',duration:.6,ease:'expo.out'}` (whip from the side) -- **slap** — `{opacity:0,rotation:12,scale:1.5,filter:'blur(7px)'}→{opacity:1,rotation:0,scale:1,filter:'blur(0)',duration:.7,ease:'back.out(2)'}` (sticker/tag slap) - -### playful (bounce allowed here) - -- **jelly** — `{opacity:0,scale:.5}→{opacity:1,scale:1,duration:.8,ease:'back.out(2.2)',keyframes:{scale:[.5,1.12,.92,1.04,1],skewX:[0,0,6,-4,0]}}` -- **dropb** — `{opacity:0,yPercent:-85}→{opacity:1,yPercent:0,duration:.95,ease:'power2.out',keyframes:{yPercent:[-85,0,-22,0,-8,0]}}` (drop + multi-bounce). **❗opacity must reach 1 and stay** — declare it at the end of the keyframes. -- **scrawl** — `{opacity:0,clipPath:'inset(-12% 100% -12% 0)',rotation:-3}→{opacity:1,clipPath:'inset(-12% 0 -12% 0)',rotation:0,duration:.8,ease:'power2.out'}` (handwritten write-on, for script faces) -- **popr** — `{opacity:0,scale:.4,rotation:8}→{opacity:1,scale:1,rotation:0,duration:.6,ease:'back.out(2)'}` - -### creator - -- **boxpop** — `{opacity:0,scale:.5}→{opacity:1,scale:1,duration:.5,ease:'back.out(1.8)'}` (the active flow word's highlight box is a style) -- **slideup** — `{opacity:0,yPercent:44}→{opacity:1,yPercent:0,duration:.55,ease:'power3.out'}` -- **flip** — see premium -- **shimmer** — `{opacity:0,scale:.7,filter:'brightness(2.2)'}→{opacity:1,scale:1,filter:'brightness(1)',duration:.75,ease:'power2.out'}` - -### ultra (the flash lives in the type) - -- **volt** — `{opacity:0}→{opacity:1,duration:1.1,ease:'steps(1)',keyframes:{opacity:[0,1,.12,1,.35,1],x:[0,0,0,2,-2,0]}}` then settle to glow `text-shadow:0 0 8px #fff,0 0 22px #43f4ff,0 0 48px #1e90ff` (electric strike) -- **hyper** — `{opacity:0,scale:.05,filter:'blur(3px) brightness(3)'}→{opacity:1,scale:1,filter:'blur(0) brightness(1)',duration:.9,ease:'expo.out'}` (warp from depth) -- **liquid** — `{opacity:0,scale:.9,yPercent:6,filter:'blur(10px)'}→{opacity:1,scale:1,yPercent:0,filter:'blur(0)',duration:1,ease:'power2.out'}` + the `.climax` _container_ carries SVG `filter:url(#liquid)`; in HF drive `feDisplacementMap@scale` from the timeline (don't use SMIL — not seek-safe) -- **prism** — `{opacity:0,textShadow:'-38px 0 #ff003c,38px 0 #00ffd1',filter:'blur(5px)',scale:1.08}→{opacity:1,textShadow:'-3px 0 #ff003c,3px 0 #00ffd1',filter:'blur(0)',scale:1,duration:1,ease:'power3.out'}` (chromatic dispersion converge) -- **shatter** — `{opacity:0,scale:1.9,rotation:-3,filter:'blur(14px)'}→{opacity:1,scale:1,rotation:0,filter:'blur(0)',duration:1,ease:'back.out(1.4)',keyframes:{scale:[1.9,.9,1.06,.98,1]}}` (+ a 1-frame white `text-shadow` flash on landing) -- **extrude** — `{opacity:0,rotationY:42,scale:.9,transformPerspective:700}→{opacity:1,rotationY:-9,scale:1,duration:.9,ease:'power3.out'}` (3D turn; depth via stacked `text-shadow` in the style) - -### atelier (design-forward) - -- **editwipe** — `{opacity:1,clipPath:'inset(-15% 100% -15% 0)'}→{clipPath:'inset(-15% -4% -15% 0)',duration:.7,ease:'power4.inOut'}` (Swiss precise wipe; negative top/bottom so glyph tops aren't clipped) -- **rise** — see premium (slower, `duration:.9`) -- **block** — `{opacity:0,scaleY:0,transformOrigin:'bottom center'}→{opacity:1,scaleY:1,duration:.7,ease:'power3.out'}` (constructed/Bauhaus) -- **vert** — `{opacity:0,clipPath:'inset(0 0 100% 0)'}→{opacity:1,clipPath:'inset(0 0 0 0)',duration:.9,ease:'power2.out'}` (vertical ink-drop; `writing-mode:vertical-rl` is a style, climax sits at `left:81%`) -- **ink** — `{opacity:0,clipPath:'inset(-28% 100% -28% -4%)',filter:'blur(3px)'}→{opacity:1,clipPath:'inset(-28% -8% -28% -4%)',filter:'blur(0)',duration:.9,ease:'power2.out'}` (brush write-on; generous negative insets for the script face) -- **weight** — `{opacity:0,fontVariationSettings:"'wght' 100",letterSpacing:'.18em'}→{opacity:1,fontVariationSettings:"'wght' 900",letterSpacing:'0',duration:1,ease:'power2.out'}` (variable-font morph; needs a variable face, e.g. Inter `wght@100..900`) - -### impact (the ONE sanctioned scene effect, at the climax only) - -Each pairs the type move with a scene element (`
` / `
`) and/or a stage shake. Keep it to the climax beat. - -- **nuke** — type: `{opacity:0,scale:.3,filter:'brightness(8) blur(10px)'}→{opacity:1,scale:1,filter:'brightness(1) blur(0)',duration:1,ease:'expo.out'}` + white `.flash` `to{opacity:0}` over 0.3 s + brief stage `x` shake -- **meteor** — `{opacity:0,yPercent:-45,scale:1.12,filter:'blur(12px) brightness(2.2)'}→{opacity:1,yPercent:0,scale:1,filter:'blur(0)',duration:1,ease:'power4.in'}` (accelerate DOWN) + on-land stage shake -- **sonic** — `{opacity:0,scale:1.4,filter:'blur(8px)'}→{opacity:1,scale:1,filter:'blur(0)',duration:.9,ease:'expo.out'}` + a `.ring` scaling `0→3` opacity `1→0` -- **seismic** — `{opacity:0,scale:1.1}→{opacity:1,scale:1,duration:.9,ease:'power3.out'}` + stage `x`/`y` quake `keyframes:[3,-3,2,-2,0]` decaying -- **judge** — `{opacity:0,yPercent:-45,scale:1.12,filter:'blur(12px) brightness(2.2)'}→{opacity:1,yPercent:0,scale:1,filter:'blur(0)',duration:1,ease:'power3.out'}` (descends from above) + light-shaft `.flash` - ---- - -## CLIMAX exits - -Default is **fade** unless a template names another. **Every exit ends at `opacity:0`** (or fully-clipped) so nothing lingers — declare opacity:0 at the end even on transform/clip exits. - -- **fade** — `to{opacity:0,scale:1.03,duration:.6,ease:'power2.in'}` (premium/epic/most defaults) -- **rise-off** — `to{opacity:0,yPercent:-42,duration:.6}` · **sink** — `to{opacity:0,yPercent:16,scale:.97}` · **lift** — `to{opacity:0,yPercent:-26,letterSpacing:'.1em'}` -- **expose-off** — `to{opacity:0,filter:'brightness(3.6) blur(4px)'}` · **breathe-off** — `to{opacity:0,scale:1.08,filter:'blur(7px)'}` -- **flip-off** — `to{opacity:0,rotationX:-90}` · **fly-off** — `to{opacity:0,scale:2.5,filter:'blur(13px)'}` -- **untype** — `to{clipPath:'inset(-15% 100% -15% 0)',opacity:0,ease:'steps(11)'}` (backspace) · **scan-collapse** — `to{opacity:0,scaleY:.02}` · **power-off** — `keyframes:{opacity:[1,.3,1,.1,.5,0]}` + scaleY collapse -- **drag** (horror) — `to{opacity:0,xPercent:-40,skewX:-20,filter:'blur(11px)',duration:.55,ease:'power2.in'}` (dragged away) -- **snap** (horror) — `keyframes:{x:[0,7,-6,0],skewX:[0,-13,0],scale:[1,1.1,1.16,1.32],opacity:[1,1,1,0],textShadow:['none','8px 0 #c00,-8px 0 #0aa','none','none']}` (violent jerk then gone) -- **cut** (horror) — `keyframes:{opacity:[1,0,1,0,.8,0]},ease:'steps(1)'` (frame-drop) · **bleed** — `to{opacity:0,yPercent:50,scale:.97,filter:'blur(6px)'}` (drips down) -- **knock** — `to{opacity:0,xPercent:55,filter:'blur(9px)'}` · **peel** — `to{opacity:0,rotation:14,xPercent:42,scale:.9}` · **spin-out** — `to{opacity:0,rotation:180,scale:.3}` -- **hop** — `keyframes:{yPercent:[0,-26,120],opacity:[1,1,0]},scaleY:.7` · **popout** — `to{opacity:0,scale:.3,rotation:-10}` · **slidedown** — `to{opacity:0,yPercent:42}` · **scrawl-off** — `to{opacity:0,yPercent:-14,rotation:2}` -- **vhs-out** — `keyframes:{x:[0,-9,8,0],opacity:[1,1,0]},scaleY:.2` (tracking-lost roll) · **blink-out** — `keyframes:{opacity:[1,0,1,0,1,0,0]},ease:'steps(1)'` · **power-down** — `keyframes:{opacity:[1,.2,.7,.1,0]},ease:'steps(2)'` · **lift2** — `to{opacity:0,scale:1.12,filter:'blur(3px)'}` (stamp lift) · **shim-out** — `to{opacity:0,scale:.8,filter:'brightness(1.9)'}` -- **iris-close** — `to{opacity:0,clipPath:'circle(0% at 50% 46%)'}` (Bond) · **un-shine** — `to{opacity:0,clipPath:'inset(0 0 0 100%)',filter:'brightness(1.7)'}` · **sweep-off** — `to{opacity:1,clipPath:'inset(0 100% 0 0)'}` -- ultra family exits: **glitch-out**, **neon-out**, **hyper-out** `to{opacity:0,scale:2.6,filter:'blur(13px)'}`, **liquid-out** `to{opacity:0,yPercent:40,scale:.96,filter:'blur(9px)'}`, **prism-out** (channels split apart), **shatter-out** `to{opacity:0,scale:1.45,filter:'blur(9px)',textShadow:'7px 0 #ff003c,-7px 0 #00ffd1'}` - -## Pairs with HF skills - -- `hyperframes-gsap` — single paused timeline, transform aliases, ease list, the animated-property allowlist. -- `_anatomy.md` — where these four hooks attach. -- `hyperframes-animation/rules/asr-keyword-glow.md` — the verbatim active-word envelope for the flow. diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs b/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs deleted file mode 100644 index 5d5db24..0000000 --- a/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env node -/* - * build-fonts-css.cjs — bundle the template fonts into ONE self-contained - * fonts.css with base64 data-URI @font-face (no sub-resources, no CDN, no - * system-font dependency). This is what makes Standard/Cinematic renders - * deterministic on ANY machine: hyperframes' renderer only auto-supplies its - * ~18 CANONICAL_FONTS; every other family falls back to a generic font unless - * the HTML ships a local @font-face. (hyperframes' own font linter says exactly - * this: "Use local @font-face declarations with captured .woff2 files.") - * - * Source woff2 live in ./files/-latin--normal.woff2 (latin subset - * from @fontsource via jsdelivr). Re-run after adding/removing a font: - * node build-fonts-css.cjs - */ -const fs = require("fs"); -const path = require("path"); - -const FILES = path.join(__dirname, "files"); -const OUT = path.join(__dirname, "fonts.css"); - -// slug → exact CSS family name (must match what templates declare in font-family). -const FAMILY = { - anton: "Anton", - audiowide: "Audiowide", - inter: "Inter", - "baloo-2": "Baloo 2", - bangers: "Bangers", - "bodoni-moda": "Bodoni Moda", - caveat: "Caveat", - cinzel: "Cinzel", - "cormorant-garamond": "Cormorant Garamond", - creepster: "Creepster", - fredoka: "Fredoka", - monoton: "Monoton", - orbitron: "Orbitron", - "permanent-marker": "Permanent Marker", - "press-start-2p": "Press Start 2P", - "saira-stencil-one": "Saira Stencil One", - "shippori-mincho": "Shippori Mincho", - rajdhani: "Rajdhani", - "chakra-petch": "Chakra Petch", - sora: "Sora", - "space-grotesk": "Space Grotesk", - "special-elite": "Special Elite", - teko: "Teko", - vt323: "VT323", -}; - -const files = fs - .readdirSync(FILES) - .filter((f) => f.endsWith(".woff2")) - .sort(); -const faces = []; -let raw = 0; -const seenFamilies = new Set(); -for (const f of files) { - const m = f.match(/^(.*)-latin-(\d+)-(normal|italic)\.woff2$/); - if (!m) { - console.error(`[fonts] skip unrecognized filename: ${f}`); - continue; - } - const slug = m[1], - weight = m[2], - style = m[3]; - const family = FAMILY[slug]; - if (!family) { - console.error(`[fonts] no family mapping for slug "${slug}" (${f}) — add it to FAMILY`); - process.exit(1); - } - const buf = fs.readFileSync(path.join(FILES, f)); - raw += buf.length; - seenFamilies.add(family); - faces.push( - `@font-face {\n` + - ` font-family: '${family}';\n` + - ` font-style: ${style};\n` + - ` font-weight: ${weight};\n` + - ` font-display: block;\n` + // block (not swap): render text only once the real face is ready — measure-layout + capture see the true glyphs, never a fallback flash - ` src: url(data:font/woff2;base64,${buf.toString("base64")}) format('woff2');\n` + - `}`, - ); -} - -const header = - `/* AUTO-GENERATED by build-fonts-css.cjs — do not edit by hand.\n` + - ` ${faces.length} faces / ${seenFamilies.size} families, ${Math.round(raw / 1024)}KB raw woff2 (latin subset, base64-inlined).\n` + - ` Families: ${[...seenFamilies].sort().join(", ")}.\n` + - ` These are the template fonts NOT in hyperframes' auto-resolved set; inlining\n` + - ` them makes every render deterministic regardless of installed system fonts. */\n`; - -fs.writeFileSync(OUT, header + "\n" + faces.join("\n\n") + "\n"); -const outKb = Math.round(fs.statSync(OUT).size / 1024); -console.log(`[fonts] wrote ${OUT}`); -console.log( - `[fonts] ${faces.length} faces, ${seenFamilies.size} families, ${outKb}KB css (${Math.round(raw / 1024)}KB raw)`, -); -console.log(`[fonts] families: ${[...seenFamilies].sort().join(", ")}`); diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/anton-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/anton-latin-400-normal.woff2 deleted file mode 100644 index 69d48b9..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/anton-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/audiowide-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/audiowide-latin-400-normal.woff2 deleted file mode 100644 index adde2d4..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/audiowide-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-400-normal.woff2 deleted file mode 100644 index f18bf70..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-700-normal.woff2 deleted file mode 100644 index ceb751a..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/bangers-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/bangers-latin-400-normal.woff2 deleted file mode 100644 index 76d707c..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/bangers-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-400-normal.woff2 deleted file mode 100644 index 9750b0e..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-700-normal.woff2 deleted file mode 100644 index dbbfde5..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-400-normal.woff2 deleted file mode 100644 index fb050a6..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-700-normal.woff2 deleted file mode 100644 index e8b6ac7..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-500-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-500-normal.woff2 deleted file mode 100644 index ff49854..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-500-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-700-normal.woff2 deleted file mode 100644 index de88f23..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-400-normal.woff2 deleted file mode 100644 index 94cbeac..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-700-normal.woff2 deleted file mode 100644 index a13fb08..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-400-normal.woff2 deleted file mode 100644 index 096df0a..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-700-normal.woff2 deleted file mode 100644 index a0fd9f6..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/creepster-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/creepster-latin-400-normal.woff2 deleted file mode 100644 index e3df072..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/creepster-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-400-normal.woff2 deleted file mode 100644 index 8d91972..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-700-normal.woff2 deleted file mode 100644 index 47139ea..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-400-normal.woff2 deleted file mode 100644 index f15b025..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-italic.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-italic.woff2 deleted file mode 100644 index f4f25da..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-italic.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-normal.woff2 deleted file mode 100644 index 54f0a59..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-italic.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-italic.woff2 deleted file mode 100644 index e882c78..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-italic.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-normal.woff2 deleted file mode 100644 index d189794..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-700-normal.woff2 deleted file mode 100644 index a68fb10..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-800-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-800-normal.woff2 deleted file mode 100644 index 74a16d4..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-800-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-900-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-900-normal.woff2 deleted file mode 100644 index 4db8333..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/inter-latin-900-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/monoton-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/monoton-latin-400-normal.woff2 deleted file mode 100644 index 7450801..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/monoton-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-400-normal.woff2 deleted file mode 100644 index 1e9f626..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-700-normal.woff2 deleted file mode 100644 index 46db8dd..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/permanent-marker-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/permanent-marker-latin-400-normal.woff2 deleted file mode 100644 index 203ccae..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/permanent-marker-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/press-start-2p-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/press-start-2p-latin-400-normal.woff2 deleted file mode 100644 index 947a979..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/press-start-2p-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-500-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-500-normal.woff2 deleted file mode 100644 index 50dd0c0..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-500-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-700-normal.woff2 deleted file mode 100644 index 057c632..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/saira-stencil-one-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/saira-stencil-one-latin-400-normal.woff2 deleted file mode 100644 index e5b159c..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/saira-stencil-one-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-400-normal.woff2 deleted file mode 100644 index 8d4a5c5..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-700-normal.woff2 deleted file mode 100644 index b131313..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-400-normal.woff2 deleted file mode 100644 index 99ede34..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-700-normal.woff2 deleted file mode 100644 index 930c60f..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/sora-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-400-normal.woff2 deleted file mode 100644 index 0e63471..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-700-normal.woff2 deleted file mode 100644 index 44604a0..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/special-elite-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/special-elite-latin-400-normal.woff2 deleted file mode 100644 index 569a27e..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/special-elite-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-400-normal.woff2 deleted file mode 100644 index a4317fd..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-700-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-700-normal.woff2 deleted file mode 100644 index 2f4e44c..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/teko-latin-700-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/files/vt323-latin-400-normal.woff2 b/.agents/skills/embedded-captions/modes/standard/fonts/files/vt323-latin-400-normal.woff2 deleted file mode 100644 index fd760b5..0000000 Binary files a/.agents/skills/embedded-captions/modes/standard/fonts/files/vt323-latin-400-normal.woff2 and /dev/null differ diff --git a/.agents/skills/embedded-captions/modes/standard/fonts/fonts.css b/.agents/skills/embedded-captions/modes/standard/fonts/fonts.css deleted file mode 100644 index 1afb126..0000000 --- a/.agents/skills/embedded-captions/modes/standard/fonts/fonts.css +++ /dev/null @@ -1,401 +0,0 @@ -/* AUTO-GENERATED by build-fonts-css.cjs — do not edit by hand. - 44 faces / 24 families, 875KB raw woff2 (latin subset, base64-inlined). - Families: Anton, Audiowide, Baloo 2, Bangers, Bodoni Moda, Caveat, Chakra Petch, Cinzel, Cormorant Garamond, Creepster, Fredoka, Inter, Monoton, Orbitron, Permanent Marker, Press Start 2P, Rajdhani, Saira Stencil One, Shippori Mincho, Sora, Space Grotesk, Special Elite, Teko, VT323. - These are the template fonts NOT in hyperframes' auto-resolved set; inlining - them makes every render deterministic regardless of installed system fonts. */ - -@font-face { - font-family: "Anton"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Audiowide"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,d09GMgABAAAAADc0ABAAAAAAgqgAADbXAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9tWHIQ2BmAAg2YIAgmCcxEQCoGHYO05C4M4AAE2AiQDhmwEIAWETgeDZQwEG6xyJezYi4DuAO4uVZYwimDjyAOMd8bIQLBxAIHe/zf7/0/JjSGK7RCqPZhJwkuFFUUhkW2NQWvdYbTpdZRtP8aGt1J+2BmZ8qDz7WEiTdhQB50yJf+ZTpz2LcXU3AXiIwpKWUkcLZv/FnLw4Y1/4r1IePn9PUUHT4exwJxHj99ovmqmzeOO0kETzwB3WDFOKUE0Rps9+39UJEL1SDQLxaSSNNOtJJJJiKL9b4jcrAFXjIqILRYsS7OCIrAKahSELiBd0IigqIClocYaS3KfaJqmNVOaKWeamlaup57xLn+5/OUS85eY/F1K/7/PoFsJngTISQKnw8L0ldDbq5KqIUll7UaZmMRr69afdP5ewHOo+lQZEV+/WLAZ1i8iadJ6xOpyOUwmeAiXz3opM9nNfqzAtuLpFo9CCowq3Sg0nn63OXK3XH4oCKO3AmB63d6qragchIcMweRr0K1Kh01hGQgMSyWYax0tvL6cbISeoTkrfc6fEQ/oXmiSL8ypB6QuQ/E2KSWXdgtBmAANJdv8vbo+R7AkzcgyHAB1gIE2L+0uH/D+I7Z3Grm12vwAYMXQpcq7+bdp2c7XaN5p7wJWHCIfakNU37ECXOWlS1HTn//HM//P14xGlIw1K5OWZJTtJRqN991Y8i2g4kPsQiRpSfaRltgbAKwAqCNounO35ZUp6jQdFlWKskoZ+K9f/v/sXfVqPkm1kA1ZjpBEqc8NhP2aIeSu+UnS5EueeoqQhaFwbv4nDSlfRyiPQuIcwlnUZWgk0fzyGR4RTDmMMYc59g598/NrTfZaCdnSwjAMYZAgIiIiIbyvK/X9aP4Dc+npVQDG9mMYW6a96FuUDShIWYgKOv/3WABGiEaDOvvYXQvmgADiIHnmeeM2BJr9AkED8ryPgV8DLPRYBggYv8V/BO15XuD8Np7muZ4SDD3xBkQ4SFOsyfRBpPhCPZdS1lGT26R89w1hBvFejyAcNy5PvIEQuSpcUD3fYYwNzLrdfglSwCmlSnHG42qkMLvedC4qnvRCkOG6L0hO90PxNIPDn/iYduuCesgGpBabGvbP+6B20WNnTJdSyqSQOSa0V+het6wyVGPwtIZPU6bC3Y/fTymR+92jzseOvQ5Dx/fv9ol3NJqtf2Fkkov8zSiB2WQFgBnMMEc+An685cQzlYq4AxcV364pRYKzhfh449d9fYB5W1WCEnGKwgbOTrfySWGf3na/Z4yzWPkkxRtO/Whu0pmXHnuylOoF5oaCh3CUcDlnxXND474sT3xFtaYoytuQ9zx1LbJ4mRdediqnJI5ACOlaSx0kXZVboB6ZiSER8xMbsoQXIDFdx7SJjGMf2g1DglUzgNtcIYVVxHSKzicARQr3i8Qban3UMyhfDuT2jaMMNOaRd5zTp4Md46oKZmYR9l6o+NiQwnd89XXt/t9xqwfOsuCiVfHqwHEipbuB+lzcsip5fVYJhwtrbnMpE2QnbqveRfIgbDAhMVehJbt58P5x0FfshBGEbe9+Uulvj9nVumu8drw1mk186z4j9TlmG0uYztwH7HOfzb6ShNr1uVyrWjyza1ghyusgamMQKw4L5q24aWKXdrkX5Asf8lIFodMQZVoPX8uxOKgkkO9jwPRCIYiv/URMeGnSDuWYJwIPH0xAiERMhiKPUrx8WJICo5lvdJv+Aybb4rAUx0zgO+s8iYtukUPx9S0f1zkX2BuwkMOPOmFK/WhxtzdGGIoI4QioIg/+KscCggc0EkiCeEkSxQLG8QQ0XgIEmiNYkCjeiNL9jfYcqV6GU4WIBnspzeXPk597LJNZzFvMj+WLTKeYwh/uh4IW4h+A5ynMATHMD4ORK6QA+NE8xQIqeQuNZ4DLyiQEGkqkoUWZh+iAsNITDMMgmhdSzEENb5z0QaX5ijWsuPAjljiJMH9JhkezAHQLlGxBUiwYw0Kk2lxMC5VmYTgWjmsRMowg0yJlWZR5DcbDG/jmlACD0KISwyQkJiU1GZnlyTMFhZSPJci3RAXHfga+Ainn2gZD2W4eRgxrh/nZ2Q+0y35hDvTDjTqM4Fif6LgJJOfNz6VDPFxxlYevfMvLd37g55obAt18Gdqt35MEpRQEWDX6/JU1x8PDO1fM6mncZ/bU7t1bdulmGZ2jdjh8gezOBfHvONcH6sMdn1boG3i8qBllw/m+4ii/jzMKGlzF9uMLz0Oh8XBAecPye//fDBZirggJWNjS5RJR0zCyK1ehkoNTg0ZN3Jq16LLQYoOWW2GlVYYMW20jFH4Ji/IcXR/SBxQhJCJIWDBqoaFoFI2hcTSBJtEU+hgdhvwLjIUykVislIAIyYKzCTDlLZARYDxG9zvInygs2AK1iFrELOIWCYukRcriHjoX4gOOEBWZS4R30QZlJ1OLi1u4ep4/w5OSqeREIdWt89Al6wqxoxy+dEKuudApbvmW/PKoeYw4CZKkPK3KkCVHnio16jRoek/dZ8REJ37fX778GA5H0COakHTJIUqGKpqKTmdQTMCCLc7Ouaa8P45PgHwkcAv8LnQi4ondSIxgA5muHChKiVNVqaOvwWn7I53rdc841yXnr/DXBETPSJnmU7O+hW9V2TCveuxynThq4Jan6msuzI13It+Snwp0Cu4qZBJWRdxG54qZOAmSpDytmyFLjrwXcEVKlKmoKmrU1QBNWrTp0FVP9KcDvaH+aGkMTYKpZqi5ycIsWflab8PWd273HHTsdeLJOyB3wMrkpe1utwsK4VJFzrffkNQc+acuBawNl0uO2BFiaUReXfJYWFVwSliRmVq92qZDtz+Qj9VTZr6Wb9j6jrXn8H2hwpV0X4H8wDiZVG4UqOLM9KSk+/E1aFc5fOBkuZToCW75lvz0KC5GnARJUp6WZsiSI18VtApqqoMGTe8p+4yY6FQP+eUDXuEI3fcgLzBBBsmBolTgubjsXymv1fZy+NQJuc6EznHLJ/nlUUKMOAmSpDwNZciSI0+VGnUaNL2H9Bkx0YlLv3zKzLdXRA0JkKFCgwETFmx4L4X8KpD5ERlMd26D4CxcGx3TDRJSZKpxaGpmzFmwZOU72Z6Djly+Sdt3KSIISBCF349DBAXGaA5YKRPKieJ6KkCbnwsv5xG6kWmCzZ639JBV8IpoV6FKt+TJ8nYKuIJQmIr2ipE4CZKkPC3MkCVHnio16jRoeovZpkN3fkAcCsbQ1Mx8Tdyw/TEn4U2IzW2IxkKVbk4WgUfiUmLDfB7yi4AA/CjMU7FdGSg3ClSll56Dy33E1CgWd7ssoZsb1onZJRnekRsRKwGBQCAQCAQCm7wlbtOhu2NJhot7Y7d2hD04fPQJ1LaTOm8AoAP8AQDcEgOpA4Cbkm6pBAAAAAAAAAC4OXBzEhISUoBF4MdGkASwhbCILFFcqb0PHHKn+JXPQTSBGgu4CVal46sahLXzV6YRamf2HMa7QN6EHrSRX3kPdO8WiyH3axJM+8R8+xrXBkGFQHE15Yi5IH9bUD6A+6/EDjtOuabyZPlCfkVA2CZ69DVYjJiw1gbaevxlZ50hJI5ijRLGfIB+tRb4ZCRiLlflkDnFryUkHIHAJ8GUGOmeWOb7cbl8AQgH1pJh5EQRyqDNu7MznWddanqlf22MzKdGssnajE+ysKwkG91GybhOHNVyb620lvsI/pcG+EHYUrRo0aJFixYMDAxMQ79CqGJq1GnQ9Ba5TYeu9wj9rb3W0GjVGJ4EU83wOjY7YlafzOZJJILJqIkSI06CJKn8EO6aJxgRmSQz8iVKhiqaii5mUEzAgj3laHNJPH0dnwGJBESgXALCWFynMF6GlQtFKWkqlVqmQWkvgC5CP7tZw8IiLimIjlHPZGbm1KK0Ymwzf6VtDxe75N1Lnjr9KsMY3ol8kt8K3NOgWYgZ3kck4uHh4eHh4WFhYWGbvCArUqJcFesqqVGnoSa8pdemQ9d75P50oD3EjFaNzSbBVDPUnLkQS1a+1t6w9R1xz0HH/uedsI/QET4K0QHRzXeEA3nkoRAvdGsDInlbaOQXPI4oLKDC6pu68Dn8ZvDuuOHx53FGgYv7Un2xXPQX+YVyfDreHLNH4XvItqP6iJ1v5o2ZmNLsmZZJmzjva3tsV54ndu7S7eHj77yNbQObacvegNfzsXsw80VuyupUJSM+xZ3gYkOsCEfIgx0REYxJf9cP9eFubxv+GnZntv+175uzbWvLmrYJG6lB6Hd1pvZuY3GkbqgD1V4Vi4i8LQzqQflKspm43CFka/FH8GVk9VlknlbSMnF0rjh2xx24X3s4vMFotAzijQGdhUcYg+Eqw7GU+KljeKgYkzY+JvKBFknPSGmBtFCbzHaxSJd62Fkcu7LbPenf6VnPu9sbu9+7/oPiZA/7Hs8udvN5PxAvYelVXUNvm5r70G/o0+ew/58z8oQtpBFFPjujBCmz57KKVMNKmF7TtTtMlK/+NSThy6Tam/H7mO1NCvU66XYZ1zNIm1MukxZ5sjCzlXakFBUXsHEuL/Zjie9Lg6xyX1bQezcNm/GgpX+7jHZNnPBBEllCwGmQ3lLyaUOqeSlX6ePDgWdBclvj9pqYyyJlHCx2X0JSMnKKfkOoVzX824wwvRU3ii9gpAdwRew4KzubmmcRoedzCoSFxB6yAgF6WyRGqhHVAvVoA9oIpLdVxqxqgDDdgrmZzd9pFQU7qePBRFYyq0ZWi6unNdAacRnpolx7CddJ1xtOaB+3DbZo1haMWRfBcW9G4lKsbi9zuQquR+uazaW0S7GXYSly3Yiv9wL4oLQtK4YVtMETddmTOVyBnVJ91sA7RnDT7XYKCltsAVnZKgcRzP2T7WKVVZXGa+zaFCI7RDQNWggk9dYAVRKkbfH3QbG0xKRk5BRnKpnAxISES3H/fJ8dkMfEBDNBRc1J6n1vRgGFPhDY8gebxLCjkGMjwx0S3MEf6Ke57ommz4os4uYjlrHUT9qAtHk0A/iDarZGxg0CLBCDO8IGz9GKhnuNDhAmTAeoqH6MmZdnHaa1chJh+bl8ecFmY/w4iaojccRu7PoE7aaWSGZnK9oIlucWXdZUYS3shnLS5dvBiCKo6CDrrnUlHCXtrbIxfA89aSmCeA0Xw6GILJobSE9sswu1eTDTXxtvKZ4r9WOVuR7OUR7hSKhlgINBGv1jikKkk6bLkq4Je6YcbnOUBn5uVg81YBuTFzum87KkgUD7p/+QJwpHInC0IJ/btmUhOxYuat1lT7vmKt66Z6qEi6SLSmIVpyZaa1zHqKc0UBqNm4JqVHNje2wicdAK0dO/5MEsyJRIp4P99xIuk14qsVW8Wv/WGYk+/ZaZhkVQjULQuPt5GCqozuRF4lasSpSlQXaH0WQdQgJocY5Jp4ncZn+dSwxPobu4QgqJg3hfQp40zWZCKDugq9sRUaehMooR5m3XZjfEgRGf2HKK2a3sRuvJAGhrUOjIeGKCaeyvEn+WBlnlfq7wVqPLfPJuLOENcf90CpxkyVbej8jMo4ZzIqJo3tx9YhsojL/FrKKceKgYLvVyZVqTWyutN2nwmVEaQaPL8VJdUyeI3ARFmHxDnU/DUjz8OPRVhqoDPCS6zWMJk49uBBjceGaSenfn23iIsEYQeeSyc8OSHEjOqluzIiX1LBDY2PPDoRiPCMec8DgOBl4W4agVGj07Dty9/pxhltFloPgoPZOnh+OA2Y8Y+UjfrTCKjW56AukzN3dgbD5EBth0ssBpPvcdCfs2trJVySHmQX6RBy0ORwL53DaKjHu8SthJuv/TrN664YWz7/pHHMkUTEBAgUlISERMHLQbAQiCginIyEAQiJEshkPkngziaq2laZsJP2ap8Sf01fVoWCl5d75MXGaZi8RE0idnCgvjDTv8ZlLslk3scWGuokjcGi9Dr4ZjcLcf4+mn8CCy/g9v/ZsBvFL69TO7C/3Ov8/Ad0/AVH9J9wX1/vSBGaciJtBRu3LXz9R1NK4/l1we85jHx49HXdZfBd7nnecSfieH9A3dLxiW4dFWhf5/eRcCwWedlTaA2zBwu2kUKO64gcEHBB1zoOLsPRq1CRiePKzhBwCrdJS1hKdaDBHwXhyiIpYm+QzfzgIywDLMfiZWtLk71vo61WlBh9Qy/3sNuydgAXZhNDyMtSAazO+RxzaheOpjh4PXpgMGMOShG45Yo52VAlMYD0AW7IFRQAASFJSO3ef/2ioBf0anQ+Kl7Y2lNgjuFDpHUulOYX/057dLFtpGiiDvZwG3Gu7oNKZETJYTKwIWR4v+1ImGteaNTR8tQkWApXdiIN8UtOyeXcnkUfrKKp5AfRQsIObCJvMbFRUAiWfmD/7TQVeBpYCDALD/tkgMeOAFgV7P/heAge/1FuABQNkZmwDzQIAEyIBJPKAAk0DxI2AdGAQvGRdPMasu3T6r64uufl2/1u9zFRSOgKNhEhwLZ8BC+NB8EinwMwAGIShAz8Km20ikojj0KQQOgyPPwo18vt+Du6WnG4DP5eDvf3+jdrcfdAEAwAPVg0Om+YH6t2NG1b++MUlgiAj6+C0lxj29RDEixrCUX9j+bwPEE8ZCL3N489Hoq8Hd1BPaG7a4r9+1oVmn/2l8d1C9rHBF3XQsrant7KgyD2y0thWtXNDa3tKEXpNG9fPlz1WgWcHGTVs1b9GyY6G2rds0KNz/XnVo175IWD97Waxo8ZIlSoWWLlumXPmKFSpV7lSlWtXqNWv0Pnv2e8qk087YbL0LllrCrpxDhUpOiQJAuzsJ3mrTUYFqzZPi82IBCGef4g1UiYU+CUWDYZFTOCas9Elo2iRUIpE+yYMGi8cUVaw1kc3wwLyBA/aBzWLYYbOPaeqHyJYpH5ikwGN0x53j3PrjxLF9ZsL3AuVmcwZ9EoSD17ARYgJ21eZdoqZ/V5ietDysMceqTRrTWBASxvYJzQQiERaN/aa+cL81Ec3mhjCGSXFOdTnD2AVeEUyiDs3BQHSWPKunMt9vEq1k4thVO50wsNCcHGnSxfAZBhB4sUnYTEUVhViPOp/0oEpIwQk6w0xI2UL6JG9aXoMhEp6g6aSDG8BDqX9jPdz8/LkBAADcAwBAjQMA3itBPoCQhx4DAHUCPGF9OVQ8u9UPk8mw9DTh2arkDyCXy1dq22o5QuRuX/4BKqeny7adWJOeLQW0kLLvIKwu32Rf8VnH5UD7/PTCymcIx8dnV2obiwmkcmllnQsKKNR4PkUhkNYbV/v63g105y6KBzwbqdabCuFsWZMERK/Qdi9q1wv7t3FlEExxMOzmOlyP2wsJ+d4h6ibwBxnAX4C32u1YE7GhYytas6pH3hVH4NjG/l/93Gbn9q86Aq8wu4Uu9upbCqQ3a4crWhnSbaAQRUM2o9FeBz5tYW/ozMJDRK+3BGG7Nk/XW/38Sd8GcHTzXRRlatpOzDCLKOKCsKP4nkScU5OqjmRl2xCJJIeK30qDEaYKxbEpfqNrpEmOqgns5N6pdDyAhAUL2AyPs+uSKE44wE26MQEDmChiuLmm0vClopm1NadJ9AkEhYXgUMUXJ+t8U4oxBRUqItMtJnExhMNMwGG18e7VoYgIsKkABLzGI6lIW+6/UEsU0FPDciv+YmJEEbSLwqXPzRu9lIISLkuvsNHPwNmMsnI06MfAoTSqPxxFGNcmFMRug9iLlEtkpk1qWCIco4geBcSXtOATGnBI7CIis9/TVwb62W133vfSTWpP5+AQv/P+R/GouBB7RhEv1A9g4bYQy5SoS7RXaWMMuhGLbK0CQhhXiC2ih2pZsNKMLd9IGke1SKc9hpNjjJG5/mhVufSQLqIkIkjv+UAghZqK0v1VKVRAQsBFSUtY5uFPPuwqkb1LxGwbCLMsizWe5bokA8HySVHRax+2Y1MA4qghMNFcEiSMUZaNdYk5SyX/kjJxIcdcL1ObJbMZNRkYqnvsLk4bQFXzusyq0pUDoQysItASwlVjR1F1MKi8xFb9jfxDSWoAlGkLG5IaSBtDs16op10Vs3zf25iFtFMUGSP1RtrF2cbauij2chRaRirJbAXQoYgYdDuMIMENATPWTqZLJ3uVVhhiVAcgncusjSqyXbOsi1zAmKOcpMRK2TWUC9hcXHFchipseY1MdLGNJdI7LYiPjLKP6cFSPssYg4vRzaX2TvlxYtTuVFMbuSYnx3y+idUVf0WO+zC0vGxJZwDvbuxgxRNJjlZFJBzu2CjIueFFebmP6bsyxZPC6mKvLkhQjKGuY8t5HDY8/S7eM9cD6s7RUdp3n9KjttlCiE65tVSs10OnVhabKYn9eqmY1XWx5xQL3zglkeKJZHFcpUdcvpyhm9yeJqp4H/h64ZjXPNAkyYi5IbtT1z9Lo5jc/Zp5Tg8e4pVL+PiR3PAI5qRuVDFOcu61fUvyJGHyGxUwU5nl0hs4sncOVsYMliSxkfZ8ylECkXTjaDku6GZgd30s0KhocYnE5Biw9YwUxAD5wnMFqHonkpyaLtWjrtICBX9LnqE0F9y+YKBBY1IpHbWKiqjEpRiP3hsrTGhy1H84gjY/9LDBuOASUwLHeoVfVZhohykFc16pzVykKe3Mq+V0nwUFVdj7sOND2QXv/bL1Nc/eOd1RjaLENF0Rt3lDsTbOUYT/lfdFo0wXx8wbraERLYPkeHCeKfRcLZuUFKiwkr+9E+T2SEUcJOAQIRneX2Nr2fknuu4nowP35mLDze2w3NEyMgSIBxMVxbVIGv14mpLO0/xfrHSh39o23aF2bCVkz/NWpqsHHwulln782XIS0iChS+pwlVfo8rwvUiU27YjcYVV4UE0iPddL63Wd6PYzTURgYfWIngtuIXOrySiy0kwFV2kLYDs7EhsQqfPIokxvCjBRw35TG+NpvTpy9ZfHmeJVTooJTFk1SQh4/VE/WEeQ5bTMGigZS4qRYjHKrX1VghUFmRZuMR+GwpZdnNY9SxCOowe5N2Uz2UxCcUJwqUmUaCQCX7buc+Cm2pYTzd25U4639TWB8Tr2bszGpDKSlEjaSlHP32t5QLG8LqMGrnSnj6NJu4XbI1qqzQsNy5+07+xZwOeZFz/q5Q5GQMFz7oUNe2JClrkLxhW9s12hO38WH0ci5DeWL2QgMVCTKfJUn2pIKjgsWIsaTN07Kfm94yyqZQam+OeQ762OudD0cfRfnf52RGXYfd1N36z3LKmkk0Vx88+9SC9ZGiJzaNAwG0gG+GK3DzYNBAjEF84N55dvsthoTPeP+XeI7zHSkOak3//ujGyzW6bJBgE70x6KhIQrSMj2FBiRgJFu5HJDt8B2LzPwRjYLFWW+byXbsWEzsx/a/R965wIG2k33LeTL/Vt8YzjntNDj7OBYMuUp3iW5SSm2EAzv7RaobbmZRrmRPG71FNTSoKrl+hdXxE+xI8YcGaENRY6whWZnex/aCjkRhsqQfUZYgmRasjHlPhNjR/gxmdLwklFGUOVETcJ18ejjghywzGheFmAs07LSNf7JXkpZoOs5uCxXrrFAywao4qeuGivMBcN9TLTNTO3lyylsZ3bs75t+/djMGkZ2ZM6rXI0MkTF+oWrP3jlf/sQFwbnLLNkNvnJJzX9FUdx9ucpEzh9nhhQOcOnO7Jr+WX6wIUK08nuZIXRhaFioIs1dK4QW9FTb7C9JObkipCc2A1M6iqFOYzIUEXKrrGxXu2xGu2IYuxaG+5Urr1KrwluaAm8Uw/V98JMJlLj/K0nUjEOsh+AqP04kIvpFP18vb8MmjpkvcEAjFVnfyvMxKFsWicTe0dOYAqtQ2bQ3c103dQSBzRCPbQR13LvaYnKh1GEktlk/M4+zbB/GdozuaGKRjmRg0tKoN2bg5BUjbKQEStOqdWRRrpcLsA6z35ga94lFYikdG/eE+yHSTD/vaDPIsDyg5RZE7F/fx8OEOuQzcDoCFBId88u4fafCzUWbz1D3HAYLfNDKk/bvsJePW+5LPeAbT2DuMMnSRZUVPh7ez/vaUc5ASA3vcqcbhdrqnZOe+lmhjsYe0eveDj/0vm+iglUL72o4/VWB8VVjmNi96XoFYRGH72Pqv8oHZ9a4PQ628QXoIy1DnY9caxzaD+wMmJfB3GhnbYNeYLCu3Qg69n1jOecFh0ah92YjMdgOvy1gRdiyeTv2GH2w7TiPAGMQ6hA9j1dpJGDBfcS3pQqNqjxV21y1yf2HyvQbd4CekTCD3vjtxfg6dsou2LQT1buLYBYw7PvGd/ArasEkzDbqsZUVfoa9Fevl19bjhq620qfd79xi3HK014tJy7gOmUiZkBcQ82H2w7OnU177Pvxr3bywHX8mhhuj+lKsXP4JNkljYioCZqcw+97/WT186HOE82WNmN1eVNTOFkt6Y37RTsXJrPnz2xGJGI2i+VA5uN+eHOL74gDVt9Eiya/rYIs9bF2CdpK4o9TdVYRs8gyB8IasGupUpNdZj0jZGTsrBLh7IiF8nuWQHxEiX5NzgIZY0xzIg8sRhSRdQVL5k23FfSJ9ZXxbUFs+rVG2J7Yr3SZa7NS2UxD5rJww8tenOdz/sW2ztvQsAas+jZfLKknP5rOSonSZucZ4bitAfmotKgI8YUlr7Y6S09nXKiqzf5hFj7RSAsQqDm6hu3ilebfoROL50tIeznCHZ0i7uSD14XWXWEoQiKMtBnIweCykomcW15sDi5rFLQ0ihRvQt8GVZe0H3nwZ4QjXecFt8PWyBQdef4kQy4GcH01W61OrbdbmjI8V8B+aRmdHQb5hE2ftplDOnk2grtFkom3RLK5zLpKvjVNN54dpGODBUC9mNmuaXVR6b8+2u6aWaVXo0dSIUaZ3zTe3peSCaR5oT7aYON2qWZW9T7GpvVZlJ7PAnNIpr9/3eHjV97Xn7mC5QfBWghr3ntO1F+5YErwPgnTPdc+gF2B6AbRq8DsVryVrODI1x0kUyBEKqwlBmAJIkOv2U83hyihqvJbSXC4dqDF2x6YrYI1yLek+Eeg0Nbgd1caF1PRcKBehsu6PYkbvVTkwJEDykGsCZjzAyLdEviHlEK5DcoIcAwpNFxWvoahbeyfnnoJOpebR3SyELS8fkBpqYhemPzwCjf6LrWMp0hbGVhulg+Ug9JH6RHp3bI3vdtesKviZUR3iZJTKZS7aoOln0wCXptI8J7OTjGXQsiA1cX2MKrXWySKpT6mjU6aZRHYVAaoQE06EowdP0xN3r5NDdPJlYHrJkJdbTZG2kFptlA6Uu2PxOopGKDUQHmCIbbZLB6sN95lpVoGL2BLiiDcuzaUkyZsFCbLQ+Zx2GWJgWRAqq5ktSLUibFbTT8yKFAWjw4/K2E9XMDPpwFM32UzBa8n/gpl/2mlGTYiLYcuTw4XYbpCBKnAptNRDHbN3x1jOY1QNXk2RcTgaopP/QsAiag6IMipjkN7M0iNjQEDOHX02erG/VZA/NZlOXWisGZDa78961ihiFRtLwG5mIexcKDd9YazKkgzaKVdG+f9dSI8IEY9IKkKEijQTQZghZQObFUDWYSt0fWuV14Vzns7NcsJrVg5BVnp8mPkdVoGxE+q4xeVZG2pA6e+ZDLhGXtyaXXAv8jUpJ3INIYf8OrKCUUO0yLNbC1JF9G1M8WlFHreM2KWAWDHqjZpolhwzzdJEb4xWs1I5aY+HC71SP06EAPMYGKVo8WqyjMNRE12Ci9L5kY9CoywDcp5ZwRwFpQ9N/YX3tm+7Z+49T9A433uBTNXCX/sgBaPLbOpkKOYNz1NMcLsDRqcS6EhyBIN46dSjPcpGa+zqaigwgWVg7we6YXkaJq1JFLgOAp6hxdnA9qA/Moe0DpKq+xEh4m4miE9gkMg35GwCCJ9SD8kh4LkJkn/Ewdbg3aK/XaNCFltti9PyT0GnGEYmHQMqraBBKpvATEhlDQ+uvb8GlS66CHYKVhvwDIXWEUHDRYAxRk4l4W6SSV/ixLokI1Q+ic4WHRQO137aSYU80w6Xq2NOb0ZEdFAG6iLzSa8JYShyZtmDV2DzxNN4KSol7uwZ/Fatsk/Yb763ffsvpl5r7z2TdsvAwnv9gX2Fv8oUEuMXM27d/GsfpGR0mkydjDyrFGmghyUbtkQdpVdyzUmT9YF5rpTqQAWkCFLD6++Q2cKL0TiVMEvONrDoEH3OVFaYBmkuudzGcIVUM6j4YWlnj1lXLqnSRae8aPv4LaDl/mUek4DxI4q+Mxx15wyk8FDD+2JUrN1z9/oQ5xT28D/4ewWt2XILXMMAJUN7lbHtOcUGflGCJSjxGfQsT1sgpxQN7qMYc4ZonWXaHc3N2pFO+xAtpxlqlmvN8jytUW5EryoOnp+ky+UVU9tAoXvdvHXQumyo4AUA53n9kTnM1wS57gB5m3ywybEt81r3deh6bdb64vI6rp2gwGC/WweBMuqmxObKz35H/bd/YnklOWaRd8xub9DxeJO/J6+1rfULaQw/6gouagqH/ZKUIslc6E/lzfG5cnzj8mSGtJ22fvnVrxIwyzad/Fwmbti/tx3/79H/lpZ9X37DCixTp82LYcb5M+Znx2fjQtOxzPQAeqCSnHaeaZEy8O8EjZDsFzBSFQ99FZuQXefqoDWxvMRXaGzeIHLlXAO0LnFgINHQNReISud6rY94QwzMjwAYB8HC9CBsBC/99WxcQXllRH4gcSZig1cIQErnQhsIHrkWAlDaKtKonXrXEknpdFon1aWXLCkN3q49+zCNcHkMVi4neQrZzqhiPWNkvs+ESAItUS/rZH1fNE3VKOMdroXWMibp06nOFGvquuRpqIRL73EKwNCl2a5ba4P0Gi5Bl1iCNAvLwL4ANJdqBERXLayHn6S1eOr0yuXlxK32zW3v0qahKbaeZUFErGkEYa2FgFo7JUjoPeUWj5v8aVSxTQtj6gOHeWt43hkgaEIUkOK2HNGzdkI7BUQnp2VOc2MF0MAOWlSIGHRfDhuZZrTTrSwDe4q/1V0CkaDo1nI+U3sRQNe/yseWyK1k7LwOAQwaAmHUUOjZt4sbh10t8xqOvWs7IFAAwGPfj4EkQo/6l+6RsudLleibMbg53dQao2SgfAh+bG6QA11n6REtAk0SspmvCdNpHdQ2tbVter1ySxRk9iYHaHsAZFqX9W+go/LU0emzypuSBk3GYY6BUfpSGZTK9kGJoTp2YboHKk3HGiAsIdFFY8aBE9OSJmjgECsGipG61Cij9DmfnqWhAg1Rm7N3t0J0sF39ZeReQWSInnUduo71ynlA+pL999hF6DxiYEGV9tXG1ky5Ga6kF8xrKZbVwIyFUFew4wh+jv/QH7D3aq52AIiCkK8RL0QLaW1etq+BpmdNerVHBIXRM8TUhZ9HwCTkJi1p9t7w4uy1mTVY/VbCa2Y24TRELzmi2fzFooOVJ6SHA4SgZYY7b2Aldstfu74fGd6gFUa+ZuZEPvbgsR6GEx4x8yPHIYdn7hkFLl+VyItz6dT/OO4+X3GVYQP6O9wf//bLqDAviN/FSmzWrf/aozkwB2hhx7SZPvcqd3qEfOpdg66xDMgUkOx6+gaXd9BU0ACNxvNor2ZwimsGQwN0KI6XAFIfd/WGyydOEtAlyiR34lpSR1opmRMcjOv16k+Yjy+kaLnZGopTYEHKUk3KT3pCNmlmJE3PshlFi5uKhlOUvWDZM0/g1eAJ2K+uE3JIMwRWGYIqFlCdORott5AyH5/Qi8L0+wVDHHJpGqWjOZHmVpag8/a0ekf0Q/2a1cx6C3+Rxgt15CCLnTZiEm13BuPDuw9PPyDtFKdOtNg2i1Dadc7FIlv2XfFu9jdOFp89m5bDQ34DOYF6rfoIwk5dBC2yS5ZWG7qp6akHnh/flPap9lU6tdtQvVRifwA9YLTRX2mBDZxedao993pOWb/JTKJ0bt5AMiYSKBiG3AIsLqpSkRs2niO6pZD+3KLEwGZMM3XDQNEmqjavJ5tWFQfNT1yHtrNDqaQ2brpBasjpY5Lk2Bplbii1alP5wACpb7FSE4p5OrChXMztyFnoLEufinZUDBlbMmRm2EE3TMc7rIZTWI5KdGX5fITN2gJtAa1syXXCag5XSlHjNZRZyBnuJD012Lw1AOPf8zPsPZQ7k7alBfP3+Gjyi+9/EWhvVMyqD0q1tiVcfqdTFxXhdR65e1EXRLK2J8w9KIp3yxN0sqOhuHV9JkYa35BHT5cfnetn3Qmgvtir7oV6tU+1TiejKsSVojNqHjA9gZ6wiOr96qiU2yh1zP4YVeoT9BMT2yFz2eROG2W2Cqca6F4o0Q6wGuZ2zIEABgeZBAmav1XBegU6hqLjmTF+gmjB34IUE4E7lOyKKZRkufXJsEtS1JSlH7o9FKVRNAbQtYmfvqq+Cim9iR9uf0iugotgZgLxlUz9DPfpVTHJw4iUnoGL4YJhf/TuLGkR7Eq+je+dr4kaxoeeDImi04VJwwHxX18+kDU98k0WRsr8ZETr0vfGcXmVxKVn5KIlcVl/uYOcuQtJiGj3Jbv996AS4zu941wraTfdvsdTT/l6zXR/jc6O6u4Ujgn4xJ1ahLEheRQaTV9IrdF22Yj2qbZfO8slKXjtgUvXmONNIoTlQT4LcN3/KDoeH7hg3x3vjyNAFUVJ/XixSSIul6MsTKkP4rAEEEZCGuurDOdw8+ZG4psymvChCGJ4uAUELJanJhrzeC4qX1JNlfIoxtTUOKOcX0UViHo4l4w1XmAkxDEY7xPi39txjgO4E2PPR56DLNEf1rh+gbqQxEqTUbcgcDQ9rMD7qCG+R2gsTGSlCKlnF1HoqHMLfIDfV5aJovfvAF5XMe7JyZjv+ygWV1YQwrpPODMxMf/dW6CfIO+K7N1N6aBY5PdQ0Vrv0yAzJHfctHDtg1AQJSITVKRHEZLjIsjM/eZmSKob4TnVAHQiM4vmVKkc9KwsJ3320Z0BdIdK6aT5HLT9pDmOZybfTwmt/xUTGjrnfn1oym8gt89kffz0sW3WFtVuzR19Ogr4vA+z1ouzoyDqbmKMrFwanZDYlzREyxLjoyVGaUxiQv8aVcRIgLavfVmkiwsPGq9Ies8s4XWtoA3NmZ+v4u4dxzxmMugoUaifUMsOnly5F6qzsnRdDiffk79V8tzBPPYVTYcmh/j+dfk98nFi/J5lPFhw55+lT0mhuW9EMP1letd4G10Ez4TySSl0WJTPDyW9Sj+EUJMk+J8TQxO7McF+G24FySb+cwhUVbNZJeMhwFhex1Oz4tyvxofGy/6gqCXc+I9Cqhl6N/4u6wkdFqn4oaS28S4qqWsK4siFFdHr1RRO4s8EveJwDEFYEgReqdhLff+W+X5P7FgK4N4s+1kmey2VffLkTSj9b9aTx+zX95lP7suUb4D7BPmSykdpT35DXt/b8PoTG+S6+w6yZh7rQnTerQ/3XZ0XaUt9chJELXr89GSqLTKqkf9oXwvC3AccIMzJHbeGb6gzHBx2+AxKWg/yNdbWp61ArrUIV4siFP7x2cuIQ3EriTyyLEgYs4+MEU5LIuT+pHkriMMJeYBUI7yPDZQvJ2NCJFH5CdxpWBJyO17JPdbJ/FQ13x6/7VHvLvTBfUQv54z6z3pb56ontDGy8jFPyOc+xxAwBN/HwSVEvZ4VM00UiVnR07C+nB3dPN6c2kC0KXkdhdOpxAaltYP3KWaA4scIdvaAUYraP58kTeMoyRWAdw6R8Bncr4800Gs9i3jT/bz+NEwaWII2ygGHfQweJbnGJ+V18utTV2zh7kaa8gAyo2itOwn0DsHgwykKXk1WcaSq9Eo41/RPf0yZZgfqx+AtS++K7dxz89F3kdbqPPlu+sk9TXQVz7qwjZgHXGbrd2//GBglK3GKaAnzikpyS915RP95WnaELWG8+V/SGigogWVA9msatfvjVjmMQWKNQGNfdzSdDtFZBnYXSwm3xWh4LUzov14DBy2EFh4P+ZQdHDS3MEKqGa48m0s+SDMtZHdSC1RPT+E4A7Mj14YALbqukLZEXmYR2ONt+LiIOCt+MUoEF8g0FZ41F06yl3isvM0ns4+TOciDESG5vPKbH4/fpFrFZ0+tkp6z6FZrIryC+AFSShY/rkx6VjrABR5+vcgNCJoTNufVnHgUYdvl7Hk87sQWCL4PD1LbXQiB9PpuPkMOSicFSr40LixvDT/GIfFSwsIj+3gkRuvmVg8GGo8KiECHeaHQqMBhdCuwNKlWULdh0amJAaAHvQNLXYoPX1NePjI1U/VH1dRIefmJcOYL1a+Xl1++t0wImILJWyM3VqsrM/rSwrLhOqntd2lHRj8SpsLXS0HmrklmJpwdltaXJ2oRFsh3aha8Kgzpd/weDWQ0mlizLFCz01RhBbMXB3xXBSJ0kzVY9jIJXkzMM/+WlkZGm/frYBc9oGh+x9puiRqKgr5D6jppL+3pvjIOdHECBLz00D/XF4Qf5tZaeGObulnzGEBH2Crg3Ys0OsLTL73yFvbvyRGGVoQ3d5YGgcP1A+pF23A2scmGPlO/5d6ubXfN7ZeOZAc0rZ3VThPyWY8Il5rvFuzeVnpvsYw3q89SdTJNf/mHZ/8zYGTr6y5boCGebbyrEGaUeqk2ht2P6c/rhEs5eYqDz1sct7wXEcKwIPzO1PqCMIVpMOkMj6uKpjaftw1x/v3niZmsOTVaM6B5a7ByI/+AAKYFsk0KOiyMgpU5VwsEzT4nJnsTWoGDABk5C11F3YIABBwA/Cmxlq3HgNtPA8qOkwrjLuOln/13jKW+lWKDcaGf2cALrh+g67P/f6ivPTAeVcyecTeuX1FfL82JadtUVb12bbXzXgaOObOtrdu4tNxx5ghc/HnO6QLCB/SSJzPu2g+mLs5aAlH0KoCw/1FXd+B16S0mqC3dsrKHxz3uGFCjoJdIBQyoKueLz2FJUPlT1j4ffkZ1waE2CTYtqovdBD62oawkFLkWd4ZHNDr4sSijlgYpDJgHV2hcr18HlVw7c/WZy3ibloHCY70Zrq8QVPKSrw6t6y5aZc3zuk72GSXntwBUg3m8oL7MOk04UosCDK5vH4NKXp25mi/T5Cf9ZMArZ99BGl5ksR6tuuHDi10OqSCUaXHgR8oRTXXmzCuHluhVX+J3LTxrU/tScsc09S7reOIDqpYbieR+CGetrnedIi0O3OfheUsKUu+ySaN3+VcXqUDnsQKdbOgL+Hr4u3vH53UCDgH157jIfSYFKWZ0Am3KyL5vmjK0K/9s3LS+P2+HRioXaANA+1dqUn6CAOVjVoG3LhF/ILxtL2MHap3Ys5zEKddt5EnIOj+AuC7fSp4sfc7T6wd6ZkfbVb8sKWQCcmVvizjBIAK4RpqWCHhbREgctZtJ6+WmrZUi3+8SaFOtcFPLvg+8aSOQF/vW9WTp35haNXJrF7AeAfFUwlRSeKrFEiZGVwpPpQ8fChC+OsFeiZb4Z/0A3nMAwOuHIjsAfFjvvfDk/z85B8czwBA0gAB+6NQY8WPjO/8zApSvD/mWOomB66hln7z8U36U6GxVlP7A4EqBRUVN14e5Q8wwKjXWn0jSE7jiki8aQ3WiQE99oz2IBPGBa+2/oZ+xpOrk52Gd2WZt/WRRW2dt8wVD9Yn1L5jL/2BjSrOxPhDf+iIzY/3A8Z5+44EPubLJ6kS35UwGa9yc7O9B7Zm8ms0TSFIB33h0cZKwPvdFFdNwdElkQOoX3P1P9tiklhl7r9RdIciIohVV2/5/NZZg/j7u/Ft7DCPZzH4G9ZTtxdz9B4beh9n3dUWl9qFCZhWvOoJyN4lbubkpxJLwSfro9uEN8rJBSwp15wzz2p76OG6o/KiiP9QSzQy9QZlsjt5cTW/wqyIlTPSZSx2NX/HLXflNQV+TzleuS87Zknt6dQJKd+zH9FVe36u7j3DVg5bHbpqrY5c8wLx4ZUH5DETIadIfWFPNWmYVDLPGFqqzZatuXdn4iaQcZ+1sEpevaA2ia5PuCFB7tuPdc5nObQIy+Jx9Pucayxhii054oqzhjmH8QHMncA/VA1s3vpj7B4kcuitfWiNWEdmpPV4x64PkwjYQjQBZQNYY6Yn1cqpYvzwZ0Kgd+Y1Jn5P1TbrlBvEvs4E8Go2TqWAK8r1oZEWISes5cKI+6kMgU5ShffSgWaRKdttYmmmSpjsPA3nkXdD6SPpOxTXcYJnwRQrhhgJ808mLCdRsihFAgroC/eb2BlXwgCreABie/XgaSqC7p6HhfH+aB47h0yAk9ad5imCkmE5gU9ydAU5yPw31MqT0bVKmkTNT9/Ina6LVQesaWrkrn09Mga+ZnRO0FfPblaPTKr9o85Da3tSYWOPJ71adWrBUyRgYWK/PBl4208zrdZtPRCxznL1x6qUCWvXauLFKzn1h8cokRIaJIfXdACvVxnI7mI02kIsFs7CcmrBpa7CqLiq8KJ+UX5gb1aphe2Rl2BL5Tj2ZhHaorUfngf0MTTatY2cCGph6ys0hEWsSlbZ8O+38iAk1uMFUrEbIQiTeGin+W/X0OSegf/sNp40/iJ/yhf31EOHAX8m+qVBhwkUgiBzRTkG1ctxevASJktDQJUuR8f+pLGyINOk4uDJkyjJPthw8QiJiElIycnkUlFTyqWlo6egZGBUwMStUZL5iFiWsFlnsC0sNWWe9rbbZYTLQ4K5/ue8X/zRuwgknXfUVgeVW6Lfabv8QwF+0KLvs9Obty3evX3nC8BGDiC+XDdkqI44as8SAQcscMOqY48674Kyv/exPh1zxzHOlyn4x/cIuVarVqLWa7dfUf1K2WqBNuw6dunRbqEevw4740mnf+NZ3vveDa6674aZbbptyx7SfPDXrPw666FJMB+e8eOIvUPnHyyp6Nb9wMhh84SQAKwE=) - format("woff2"); -} - -@font-face { - font-family: "Baloo 2"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Baloo 2"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Bangers"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Bodoni Moda"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Bodoni Moda"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Caveat"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,d09GMgABAAAAAL7EABAAAAABugwAAL5eAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEgG4GDNByXOAZgP1NUQVQuAIUMEQgKhatkg+sqC4VCAAE2AiQDin4EIAWDfgeOIwwHW/dVUcN2vYHuhKJVFUv8nNawTcGV784T6pUNu/1a0YEYNg4AaLsbBP//GcfJkDEmw+l99QpiglgZxhTaZaFX9+rQ7SlPqGDY2KhwOR6lrWFT6RME6VQoQcLmi2uYMpvuiVvxxRdXeokqs+iFq7AqWKFCjV/5whsf8qAV/ZXIFP1FRz0jT7jjYfedfuU10v0w/ZkrMRX2CNNlYOwyKBFtrDjxwv/zdv+ufe58O3g/VAWZFYgKZJfM8Pzcev//99eMrWHUCloZ2xita6JDkCoDBG1UQoyirAAVtLEqzsPIO+9Qxam4iOLv/P8/B7/2ud9aaUApZWFQoFGQeUgjMPz+//9tffRmnNyOk0ec1IZ57xlJZHmpNBu/0AWLTyz4qVfdPE/u/gswzBSCqDpVU7J68P8pt7dyhasFJhBaEmYg6Q+iC3VPmMqJZeXUw73n3cOlYnzWBLEvSr4pL3lQ0T3Vg+vpXx5+3NyyUnJScpKyEjISMpKy8AMAdGNYB7bl52ezBfD/f9W0ij+zR7y5/SUyA4uackKmBVNyrXKv+3GcynmiN0avWrP5zdFX+2pfASWQCEpCgAQyVCNL6kLVcq1rqw1UNlkx7gnGYESFRIpZ+9jZ5JoUK9Gv6ecs/fjuUhphASyUr6hE35MydtLXcRpthcD4vaZWYiqmcmed0dNlISoF0l9VQKNHrdlFAyDBGWpPlEiZ9Z53M59T/z+7tdv0c67+5jYVTar3bNVAC+1kRhosBmYIEtggwAZbek+y5fTWvv+ONCgbA2PyM0fnf83MzuyU6BcQhWayJPuqgy+ZzBJNsinwFIAnRcAUEEnNq8pWqCrfqhWyRFpXn7p39iyBMMfGnTwhTx78f02/pDrV2xNg72a22s3QiW+iQL/Vo19X7VeagHpkw9TOvwY55Y3cBswAmwk6RGZCgSGy5fTu0OwJ5yh9oKvPK5qQ6GaRDgcWCTxfy++V7lHvVYz4l5AIGz0pI1EhttvhXc30v9uS8yZF5Axod49Dzzwn+C2AHBAzBkbQgBHD93rySyfDZkIT+7n7iKNiy1tSwwHVB87z7aezbR9s9S6whcK4XFWcR40VxnLzPLJUIgzyS1+Hxf9/NctSVLvDVmQcZU3oc+tTmyvIgPs+moX3Uc2q96tH5Ad7xP6gxgDdOsUPjvs141vOr/E2mwF6ZFCyxZ411FqXbbjp+miDfKNEO1FL0RoXhJvEitbEySJDzttBLQ0o+DyJr2/GtZxdfkRE1PptX+U8Ze1cc/a64oqRolJUio4MnfPL3JKYV5Ltfd6nqtaKiDHGiKjV3tUj0wMT7Q1ESG7r/8yebGO+v/S1/dOuLQpCgCwC10dMq72S2//ulZ6YponjNGCAAT1kzrQP3VMUZGwJIQk33ygRKHQu0KkVwYZAFkZ9g3PZCIg4gvHcgQcP4MUHlKkF9RrBVM2gxTywwEKw2DKw2hrQYx3YYIOhTbY2UEEKA1O60sGoAECyMBI0BwUAROm9CwjHQRi0avW6TaH37TS0P3QgAHzffSAL1afb4P58CyQggq9wUIaTwVwhSIsBzuMpQIIAAwIFaIibhaBCA0fKmhlWRSAqtZ1Gqo3M7BJ2NoEOXgiBO3Itty/G4cAk6bAggbjuA2JcETRiAftqDbz3L+/3mLvcud+1hy94O4UHOcI+9rL9fhtvX10XYPOZyWTGMpyBTe9Lbmo5Sns3W1qUhZgR1Hg3ygM3bVCKzOENOWapZBFLeK/TCf3vZ5/RftirPWnvXZ1ucIkzzbFY70Anql8e3s5t3gCg9Vu2ji0Qs2iioa0CqD896XzcVnFGs6RzHQfFm+wtoTZosmpGJ7zsSrmdtymLOfNMt6e9RszqVjHQFS1lZskugNMr1TW2s8CzLgadVs/WlVNyc8OevcW5bY9zDCFtWlaCBgeBLB/KLozmnr1qy8inNKq7YleW7FiPI0sudJMN0vlhr17qZWu3HaxHL5tiRx8hiwddOOuhlV+hdYwrjPe6YxufOeXtXMzK0cPjSI3C7CgBPlsgY8UGg4h9N3MMCrpLZcEHJX0FKS64osSXiQQQRMR1JAKAPMd1IFYhCHA2RadKYyPvfwgKUrBCFKowpYNCAvGq+p0NzJL9P8n3LfIZ8L7nzfHq9szwuObRpRpSKd0pSoZiocJXvsJtsRvdddX4oXFql3nOOU6XnIQOa+wv2DvZ7bYz2p6RTpDUSZwkQvEl8W7RkHC3MEuot7lnPWqdZE2ySrMYszgmqBLYma/in+PreRO4F7gNnBOsIeYqZgdzATOL8YJBMJ1jGkd/Y3LNZC8tidJEVpFppAlENeEU/Io9wq5g27EerANbgGVhCZg3JsP7IdiDLrW3FbVWYxkWZb5zGg15tyfbvgWrAMUc0lErFQSTEDBM/xmEgw/HkjUyQiI0JCvQcf7vpozjhkHFC5ePVObSpXnCeJ0VCmsrqGz8M7Vd+zRSDhmkZZhlV7DKVZtjp58s5xW4FFVQnqb4NNwLThfJU6S89DQkSVzXljYaZTJ5CkP2dK4GB3YIchx3F/63XFCp9fSTa4oo902+igI44yYaLWi0/OVGa5KFwNbq22RM/Bi3WzFfYANmvyUVccmXFBllI4VcG6VApdRLXSa+r9YrJSOp8jkdkO+zdk9cErcGZKGnT2muJe7yJ9HUCpRUu0yt/MCAi5SNnJCnQHEQcKpXgTKVJCu7uSgau/PeqUE+pQl8DPmpbMGayIUUeDevc31BrmbxUK0B1swST/vV0lbMomQzCDiVhUhiuW4aVF8oJTSBNYkylURIUuGKCk+88MEXP024/7D6Lgm8Z4KksJ5oxVBjWYubKb5TgpRUkUmOiqzie00WpSpDdag+0sjUXr5kij372gcJ3Qdty9oe2cFOBttd950DHNLRWsfmHNdJc1pn4KzOwXldRDcjt+v9u+MBPNTjarOqL0Jz4EBL4gSQVl191Ra5DZ0O3Z3RQ5/1CyhmNw2JSBgGy05lWGJP4YgbJbBEQowEmeSSokMljZPYDbsLZMYseLhWbLJHufw2dd0qFHw3+BXwoIiiWbE6qaIxQ0r2eqW/IKMs5HScOdGpVKgGhaysEk+HZ16GkMIbkTf1Vs/beifzbn3vflANyuWP1Qv5NHx2GEIKP0V+1i89v+q3zO/1j/tXNSg6/qvqSvxfiOqdaUqGtkHXXX3B6j7QwaRY05kTZXq/ApW0s2p4Lb3ZhMajAAo5hwXOsbpNWcpqJ1/fyq0rNIJ2GUZmEjStRFhCKHUdbGQ8ZKGdvLXSBTqj7oQ+yEVKCaUBR7RU3MyFWiilzsTejq3IMY/Jv2b5PgMY7idJZkSjwtC9iU/iBKrio/Q02+gND2f6g53011wwHlJKKX7B6d2o97r8gaOxN1Dqyk8P/9wj9Lv5Q39RQPXzRSY9g1mpLN4KiogEUeYjUzbCbmLlADMMIlx4u3yRAXGv1i6a7uBznm70EhWnNahQwyra1diNqybelZgoMsFcLsNyGA575zDAAi8uy2W5HB5/uAzLsuCXFy+WZRgOh+GyPixLMLAYBGgPX6jiFC5rdjrot4H8aBhGGFvnpt++kZmHm5eABKmTl2jrBDTPFl+sWSMXCXDyujOi12MCj3pOZWWS2ieng84aletTyKMCKtaU0vEsUKTgyouxevUy+ZVEMHYrmGXZ2feTYTnmw6lhUvhc+kIJoIGv9c2Eb/mOn1It37lQ/NM9ZNcHRqZoBOhkPdstBtmDan9YMebT4OWLvhGoOQeGF/hF6wpIO/seoyzE9fKLw7Hhh3WWH+50cAp0nmAJEl2e5dZXrC4nFZ6593PeL9UW0nVlfbmu8h8bh9L/nBtyAOunMmEBk+M7WoISbXH/sa4e7kjWNJgoBFs8GvuOKYosSCZh08khwwSLKOSO+6EqHnCER8WEKA8auzsk7FH5ZOoUmOLrnoDfnwj3/F7x3Kw2UhhboJLR19PjqxEwIhMngRiQ0cvt9lxRFRZQjL9SGouEWGk/XKKXlhUiI+w1GYEBAqEH/GvgEZZiXwGTPU93RKxD/hvsvaHMXueq98ki18PMDDIUN8kJ6lCTCynN663kxKjIcnp9VczqPmtiZSer1hfsSSzoMztFguJLE5rD2VPLhe3seHqBESbDLv3edGdvYI3nJZbjuikW6GP+sOOj7SfSQZF6Wri9APYU4+CMAMpGwQLXXJ1urXnUbQyJfkiCVTeK6PNphY9QC7GObryJXaQvpQxNbErrnKBKqGigSsRcTFlJk2NaQRTh1rcTS85VcRtNbrH08rfIQSRIMMhc2K0lyQH3oG+kUjzvJfQxUGmvBIwIE1qVwlaIG1evDDHPZURttvgoaDji9tPmlSSsOkFbUftdlXnWrqTmg8hhFDhEimi6k3NU4pDuo9mRLJ5wfjXy2vg6uuJxqegpgwKKeLp6Hhe6zt9Hftj+GAKkoicOCiie6SuqZUlaNBg1fcCotAsBUURD3XPXFT+9ShZwrNrTqFUIQfrt+5GRV6MWFMIaRhhiqOVeIaNYUFqB6e+qpD76Lfz/bQcwoJw1aTGpOFF9HCsoUn8rFN7hcWdsv9TN4rlPAkWJM9B8eBwBrsRdJpisjlLESuER/oURp1UzIHohBjezLqOPeJEKtCjBwai0aAEQ7Mltnk38sqiKTNvmS6mNXzJuDDBYacvf30lHFKhL2cMkr4lYp3S5YExFYzw2FEp0PD+C3VpPgy41EgQGTqNhoXvyoZ1ry+MLF0KyY3hczUSyWygyDu9aIpM/zDlUh8egfoTLrQK2TPR7dgsYiUQEyahsmUsGGIlEAAkCHAIYiUSEaQCc3Onosd2lMT1YnevtuAovHEUZUf1iWJtUlhrcfZ/p+uWNMmblimeDvvT5nlSgZXJdgHiRuY5022ikK6My5nnnl1pzC+TqAqxVUDCs8NbtEP9Q22VZp2Oq/cKYHqFqX1wBK3l7LS4pVGNU3nCllMLYX4GNOlw04kYRRgXGgCc9VTaCETAK4HrkImhWB5dOotpRdEy3Tp7AWY9lcYtgcTcQfth7XwrrtNMjyef9zfocF3VGeyrk0rkydRBpO86Ey3NRP9g76TlTzdkc01uu2YqehOXysHYTzBcvefHw4uFwOawdeuHhcLk8FsPFlxwuLx4e4OHacSEcDpfhPthu1RGV1iWlqzYYILBp6z8QVrCg7DHlcMyfsGwCkudwmhceFZUwUOnxEwabebxVVbPAB845VC2VSpbtYT2BPQdWUx1C1vM2RcoKCY48nUhKLGHnLEBwYL1k/7eMirTZLGvhulRayQmG25Xq/eY8x6Hfnnq/9hcMbVsbCNilcyG1ewocAQdpW+tiT6vNAqCIOOGS8Yb1GIlagQJhneZRrrEwUG1vE2/fRxsNc86i+FtiSCILxj+RUMFgwCnCgIXTJwcQLm0iCGyCy+tar8MTHVtCniP2QhDG61Zgb7q7x+lZRwLhzaEOI3VOd6wmiMye5FkWkHg6BpK1WA0ur5cuqzIajLc0v3btTZsN7+Q0uAFyMHKJFitNPOgOIWWGSH9rnwkeYQfTUHC58LjqBywh9Ms0mDWtIwsIdcahW4DbD6AIBTzCmtk1/KOPm9URbVoBk4urbi5NMFTNZbaaOHsW2rYVZTH4jBt3KW0lb2WBCKfGQNm1MEvyig5xLUcw0et/KVIKdCspx1u2CXNgpV+k9HjA0zqbvtzrsbDbnkHRrr5E2b2BildyiCqgmAo5r2cDRmmW+pBw0daz61p3IUpoUql1UUqplG7bLcb1bkqplFIppZRK6bZ9ZFzvpur/06JUSimlrrSr9V8rfrepna1X8Uhdh4zFrBVl/qWNiILATbkpLK3B1sI9Rz0HvFSVf4hmR8Mei7C11mplX8rtBa41t8MEuqhpaa+UMa7jALUr9e046j2+ms6Zge9+o5BlNw4z9Vhh6cQgdcEhE7W3QF6U9h6MhA/PbCpm/lHTMtebOvlgkHRdxSH+8XvocR82aPUVjUBTp9qqlrTqGgYWpNVEBZj0mE8NpqYXcmTcUnOyTv9JpystAoeKd82/cpl/fe9T4Iyn4DmhhweGn76ibow/ybjPGIk0BHKqYV24pDF7e7iJzK+Eat2mp2cYhgGGYZnpIMtKuAzDMNtteeOSYUSWAFdGhuzdgQ0jYy7WhZ7yVnZrtUkzvdt2tET2jpUapGPHos1HUWUv6WHK2Bzdd3Ep/KdBGstlEiGd7OngkQyYnFeAy7t8Pwm5JSyGMblHBLYMzIzybhAE/wVwJeLhJzX0NGgdf1yzXLMWR4UQiJE8+mHh2DnrMzKvjHNJE4c5MeuToN/K+uV5IGM2W8rQ4MLY3T4aWlqPwlQckmT/K9BPFGzdxiEEcSrICsoPvfWEfBQ5AvZwGocQf02fCwz3Zh+i33BeM4Jo+JVtv++VblJjmSb+tiZy3YOgCrkwXTSm/qThlPMeK+eE3BO5gSind3mPRqKXmdJcnlHxJ8bGWouKQkJJhVMHJLcDKdmSsyqqwmtG8ATx95jPU5OelofDV36mrvNe/fMklEIz9M3NzOZsnHP8/PifkzyfKmqpPW6FF8MSDkeW4chh5UrkMoSVGR8zamel0dBHesmhEnKT0ZzrxmPWIZH7uTsPVgwdc/7VFFSBWx5jNAtYRNtP11caZv/OrI3/k/yh6AHU8QBztLuLK7M+BeRtHsPJflNmwQ5oX2c1Aw4vGLfU+GSMWHljPcYMzyERiZERHh3cLX0k1rUv4P6VCXk0aMWhpKJyTsUZnFu3G2lHH/2RTNxM7kaU2J+CE34EqqcdXS9I6/3x30uvAuejb0O3OtaZ7HcA+NL3wPl9v0JvkiXqz+g8RXWqG4ybQZ2cRYiIbkMnHZlohNfr+NzH4QnLnI7kHs0jU3we3XbieK1TLeOdPFAl84+mUtdOc8hqH9kb5uzhu0kRwdVYveBXANLNaCc0zU/D+iPDCNgYtQQIxqmkhHQ1M3OWpVMtdCOZ4GEPTkSIFmnrsQLGVzawdqK3420WYOCJ4wXRXiPA4T6aTR+ASAoGkGluEvQ36N9rqOTOGBbg2Y5mjBost/4KaU0pHQITfP+g9uuBO0jv0/rRDyb6+aFM8kpkvtuQ/sneTo1vLv+4/hA8m1rr2pu5mqxa4pLIjMdcRUOg6FMFtTgxgZNf6qHx/dj1xavsWJkBwmzDkEUCc7+i7mX0SUE4kywFnITSVIAnZMBX5Zk4E0Isjx2Tsic6o7mxfTB7lr8FU16Vo2R0xlAZ2Ho4w8FJpxheommbEIWcnzqHdnRP3Zb2lp+7Kl+BYwV4O03hgxWaLSJOQe0UxEUb2nCut4Jh1QBy3aktc2u+3WXi/yALcqROs382BAlccEaUCaaJTvBWpzw5m/nKIQzgsZ9j6J/cGuhIVusUvmhH8OnXpuGdRc846tA1zavVrFUCnKMPbTt4NPoghJ6Vrr9kMR5lY69ffpIrVSOyx8MOwRbAkOVYg/a7yJnSW4jTDwDulJ1rmgvYi0SHQAqGpejGddFjfWX2Ih+P+vBA/bcw4Th+ECi4AXrre1U9Ynxtz7OimsN22XumUFfb8UbLt/1nFDq29oY6xVTK4w0lpi9ZvvoziHKLTg6r/q/oSJsYfj9T9YB4+R3u1GNtln3IWao2qTdewqZFApCmVCk+p8iFUh+yLqD3TyANgg6WR04g7HN6wW7vtDNDN/MhAj85r6w/EWhn2f+wFbPSmxAVHbeOhMNyv/E74HW9TL1SDdTwLB7NYFjxFb1BFbIs4btq3WDDK+Ixt2kizf5qxJEWT4ij8sCjVpaUeVnI0e9SDFZmnHHIJm3r8YLIXObO5JgfFoko30WJaSZhyPblLwV/sjCASTJDj5frim8lHtNtv5BOtf3NTvxwnIiQBREqwo9u0G4XiSWkSqWmLBkDHHR4iR7pUG7YpVPfobj8fQ/oXzQo2KMTws94l74IoJ3OOMowhzzULOvp95q2Zg7XIb1wjpOxG87QA1TBCTKBA0sMCJD/cWL4FNP+X+QodAj8s2T7lz+ZyK8GfwARE2Ch8CMhfO9nhszvYp3/EjjvvCfbj8YIyQStyw2xgQp1OiOQhTAhtCFFkQuz+7sMIjoWK4aMdQYmSGICSMUoCl3poo3d5OqK8oJSnHgJEiVJliJVmnQZMmXJliNXnnwFChWZpFiJyUqddsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889qQ5PHlG8uVngonUNLR09AyM/AUIFCRYiFBhwkWIFCVajFjbbLfDToOG7LLbHsNG7LXPfgccdMhhR4w66pjjTjjpFATlLgmlHtjUEhcPH7V6HBUSkXA2zpIrGTe+h8g8x5vQN2850De6u4mkfSnAoXSorJxjTwcUFHllz9RodilLGcmbRCAaiXKiJZFA+Ei4RThI6CPMIhQRgghOeAjuiYtxGvwKH8BjcCNcAMugDPsXU2FizPtHQ7/vUafaWkc1lmTeE6TV+MxCwTvX7LXGDHkwCIxdRdUpiF5tCSwqR/aG03DQOfw5Il/B2YuDFj5+u4t4eQ0O6sJ3EX4MacVBSY9vcGFjMQ7KwmcR2tHEHOT0+CAX0k4wIaVXElxRHPy3vbULCpwoniJvZ6GOGQwuKCicF+yMNQLk1hmVcZk2rABG3N1WPxNxT9ExYzOQhWDht4p8iq14bTpJlmrcEfqVTSZXIXeTlPE2geoRB2jRoSeAYEIJI5yoiPn2SkL22euEdakLBDk7XUe49aWmFyQir8nC3kMwhU/CTftC7M684YK/wBS/k27XTYCbQo7OwUyHoFIqPighNAFNe1pBOth0cX4gioQYboT4EkdNAnoSCSKJCJKJI4UkUkkjjRyaUEQ6ZcNpqjQMWLDhYIYFVlhjgxgpDu3stjHQvhEBYBCgvmaov+T2rGGYhPswCc/MUS8XMh+44q/Q5Xezwq0gwzVRoAuQ6Qi8hfceVFIYkbFeNMiE0tcIkzpDa9O/xIx45UsiSUePVNLOW2XZbuccslt/f9h+hQ4aNdkxp1Q645w6F1zS6IobprnlnhYPvDKnL1yzzaA9Djg6y0zlq0Mv2J55xil/ihq/mcVuMVpXQ5pOg6WNyJSMV0oAIRLWWxqAsrblEwDhZmIR21wQqbd7o9sCiDYIYuwBsQ6AOEdBvNMgwXmQ6DJIchMku1/pUzz1SmpHYFgHAQiGEBBqEoG5E2EHTkgwcEKC+0ZkQuQExrMj3AvidF69eI+XCbR5AWZ6ammG5zBBm2eLpZkQkJZDbdliOMBmlwCgzqHcao/cmAvuROAesrXjA6TKW+NqjAI5XtzoA8Ddmg/ACgC0sCwAAcYswjJg9+pkFuiIHj2HCjD3sJhsqGEnpDCwCBNhxQ2GVgegLCGIpfVHnCsv0/yvELei7WCnuteDQzCIkTApJEKOUCC0FoqFdkKF0FuoF24VicUsMReU/z9V7BSS8dajM8oIwJyVhEBqIItHJQKlaPBEAjv66Ysh/c3a/v/7jjM2Dx5U2xfw4hmA5/+e/Daa9/zVk6En459kPrN5Zn9ES4rf1IPHmPfhTbcXP5ws5rxcw//Y2SOqioePCegOfIAM7kSxgZqXkjuqbxf8Xx0HYuePKWlH/P8JFgM2Lw5IbuO5cGWklkiTt9s8WdBKpueRr75l4G0i1M8ovniTtd9++CcaIIACIYFDhAwNNgYmFgtmzAnQEbMnZcuRXXIO3MkpKHlzsVaVchVqVKpWq0GzaaZrMs9sc8w1RbtunbossySFpdbp02/AZitt4WR55pklTtI96Dvfj9Eid3wfPTvzpB7+p8HfgFE/ALsFWBYXnw4C9b8z0DqLXmtyX3HDsv1Ka/3QBY+XMLBD6IKWhHXKWrta0KWbo6lDqOJ3KG05Xnm0fder3R5KGPudjtlzoCvSaGMlrdSjr91pjKNDm9IJuuZBMpS8LVO/RSgX7EqI3QJfVeu1b9ZV6bWOF8W5DDNUNuU+4kbIGA9t2rGkohsBvTtGYOJhP5+zSDMKV9lniOKW7KyYHtGVlaMXOU3qKpA6hp6navKNEeXyXMX/veObVXs4Zae3BGqUVrEZFlprUYq/Y/W6yI6csqnZG6cE+lQF+eY7V1dmLZzVObsuQzLVIdHfb3Jt48y2BGNQ/NWZsf7p/Aj1ckl5RpNxZXl0swfTlSVnTAr1YPmwzN0YLXpWrpQt9aVl+U9KsGcK2fYOTDdGMiOCYeZF983dl6KTpcf6CKNU5oGsFAPbyI2JscwyYwWaevIkvivjXCyTeW5sW29NhL/XFBuVSh5o5BvE+hgDa1I6P9qKqaY3sOOTdfYsLSvQ3De+ysUwOSxBtda6z1rAXmsd32rBaok/7Md0M/NyNxYnpibF21ZGW1p4W6TVp4SFJNd/PnzflJD61eTJISkzydHmGFES1fWRxMPls/XhbAaNJgoTmk5WwoXHadFDK4n3PnGIVc7k8q6AMBsrMzMLNzeZLJ60uehPElkF6BdxovMyrZRW1tZWVn+32Wxz8/a49odhaeuaHsywZ9iHdVqk8RmLtY46Bx/dBAez6UpHK3q4ncDOmsVmsy0t6FR7ttiSxeKYyVdEVqNpHT07OWdScl1jTkIjLWHfJjrObP7ism6DsWjuYrnMLq2uObn4kDi8EnsDEGagTAYsqJs/2bNby/JabaGVAGYxs5+vkBqab91DYggR+8uWxAA4Xmle69KT9I59SubFfj4GsrsONz+PwvrKVq2JOIuSYkg5nUr7g+Ad83+QJ6eMlsvf+lyaKvCyULpQu4cFFxPDOkx5ornt65JAPZkoCIKQ7rY85wv/r1BDNO9Cn4WUfdGzflIYbbEoccoEG8Emmv7nSfb/QDulxCZYNBDCohiCZWmJJNr6YoQookWVxjeLkqY0eyyuP/QW7fHDw3XIvi6Qzm6eVwNfmFPs1CKiFAMmJKTOyGGQKvzPjvr1KoPuAyBdfwkzzxAAJhkh9HmQzOYr6s5ElehmQpaCpT0JABTk5X9mq9yiiiU58rtZnqykQVfiRl1uVhbfKrs5LzhX7QgJd0i0nMogWECQjPYMiCDQBHtj+7j7hJZBVJlARRFAY3q2zCSLgnxhO8SQeLmu3Zm8feQKFs3HXvkTq+fukeMk5e50gKiuQPM8VRPe7jkTQOMNWJiL0Xxf4k9j3RWt8x/jGmLgXA+izj5Qxlv+HdzbYZ50EIDA0VczawGZM2gE0PCU48V5AIloTlb3RmpwN+UpODZJEfpWDz1f6W1PZ9SV3XpgEQteVzXfodvftG6Zn94HcP6VIj+szhd+F81dtBOiCFCKBiz5ImwdGTUU7UJWQ0jsBf1Sak5eSnJkUdjF2kexiZKXcSQaE4OTK+MFIKKzXkYhfXlchi9jQLEpLDoMifnFrVfgRzQvYWsNmYCyms0yNRyxj9BpNJ+7GEhm3zBwKrptSFBr0/UrAASC5HBbsihSDMA7dWJ4tl52vhLLuBIBP9V2DyFfuTLXk9Ql/8uoZhNkf0m1I6bNeH7jHrPZwSK56OG5ZPZVSZ+7BMJ/dIhiYhcmirBnz/ZzvyofU7XV3eCqKUoguttQRnrP+rXmP/fljTEJNbSZaBDrrhgte10hFxA8s0s4FW3Q+8dmW+MD2r/tCxWS2bs93cPlVuB3J9GSITcCDpM6g0MzJM2lCb+qW6L01+5MiTgzJKb3v+96bq9Atp7mfUPx3ixDH/ayWJ5ySBqi3frvPuQKINMhuvII/Vae9P2e4WP2A1oKOCD2w5cHFKA4CbbTHxEyt+CzDEHwzLQzSypcd3Wa6Z++YP2CxotT+4YvSOKpvj9707Wez4WiF0n/VGIkGrnBfmFqgtS62yjUAHRfi4gxRaBPbkTwDD1HQ5C49VVwKkAnyFDTZ4oFOQnEYYBwUfj2loFEK8WybYKNFbjYY5Lyq7NMfQ6e9nLn5q0mqiJ744i7Q6Sb8slv7u+D4frG7Na0K/D2QcHmia6+dVI+AiUnjZvIIEgaqY82714L0OKTgDD68xEeX/0tJFPl43QQl7+dEQcBknXQbsskDOO4oV2BpojpQ/QXT1YFX0AB9JUFAH+sUZMnd1NgaFqFu1HQnjKsrHb7053KuH/XDRb5YL8AQI2IWFSRNwKKcj4wqcHUE7xrVmW6nx9sqysRIdagbaGd1hBDxrgNKQWBxqXjcu4eYdBaSnKQmOYMR9mYznwlxm0bohtM+NJsfOzRaL8Pe7YPCaG6Cct/CfpYmeYdO2DE3C1trxTVgcf0tWv3jR0OV691jPIl8jjFQzzdD7PLg8gfzBgm7FnPeQup8+eZ+c3Tc6cHlE7Z5KavAPebxu0WBK/jm8zvon1RBhb5CztRn/6gpaMXbfPeHuDylg6SLcPlWltN5/kouruwTVnaAOPFxUQdXNLYLnqnThzHme2vKSkPlzHucwaqxsu21TuT/0XP1SfKv6sQZBR5UeKlHt1nCfW2xRrov8w/6MGPHAzu2Pa0KIi/dijDXel1SMpiV5R178DTIO8LK6V7TOPtMe1LQ4WlW95wOfTTCnPrptEQ37SFEafr/Ta/X4Ye2dYYV/cTDPPXeiRkIyQlJBJaAsFkKIzY0/9N+dr97ZbZn2N7IWz/xeGoIzAuVrzNaHtXW1iCUPHDwuhn2wIFJJceeoFaEBQH1WiE6Gk8iiMr+uWzngWo8I6WIdRVKVJh7XcPxewFAH+73YKXQSxJgwXRQzmfd2nGGmPKzAiwzWHufut+qJe5w3jb0fXyCpKVVYGWdP1NkPlsgqpHSKSYliVQw81fIfXjr6eh9aRWeRFVzSvZF9Tlrn1XRjG7go+x3B3xfw881vOuyTF0351/UFVDeXnn/GzimcD/oNdvYUO7BTCRsbgsjOXmj49YLhUX3J95ckxMiVN6QDbWxdJSL10vF8VswNCrLqQxJETVXou1SLIxWbaKBhTzp+1P6335+pum9evjfTk9y/D4y5mpIyneHJ7OFyufDL/T+ZKYfbEVJukfyhst9mgSouyIr55+sYbP7HmVxjmBIJasRQGfJ/TCCxbX5aqgwaokLHd/ZplNv7Xl5aVoDvEhXekResY4bo+9UD2RU+IoKC2josiTvorDVuLjfvGrNJZrSPylfP3dEoVJEzEy4Dhn2kw0mjt+0BLBgRCLgzY7PvQzcOsJgdeCcXWTfduT2t+vJCW3tZM1HWC9dKDlYxpTjwEmjwUNXkmeOk8ZM3NzcPhg/aa+zBu9NIBh56m9KMzuqVIau1AxNJYWRXk55Qypl4rDLFtrIu69QS+3BYMcZVhGMEBe+P2uZVUQEyoK23t2IC/fRRwj6JtNUOhCihxeCb0RtxA0tGmU7krtxpIWfivXlqUJ7m5MyjVTPsTRWxRpaj2i234Vau/z4W52fbD4RZNMJujNqoCyrzYsqCUSLZE8bvnXo9T3PbHnxvDma0acu0fImyWtHgtzITxrQ9tXnIyKk1ZOq8pEv2gU9ddtYCpun6KYPWljHc/vjrRXbhpgHBBZ5Q/WORuuj48XEZLxR1iKr1x8Twck1UPKJLbU5VSetiTiX+eH555zaqczFpx0lqYrj0UuY3aZV5yDdpoEZ0JKx+Hq2AtzZ1mlWCD72z+d36x0xBZrv6Yd+z9bYXX5vWanK6IHypQt2ThZfR6zZyCbp/8RfDgTLaHzB/zW927UQJbzVc/2vBbn1pdA2uov+Ozp1WVpvRfKTl95CXJIIK4a+sSh7n4uXO7nvMCtN1B9hxfVTwa4XtQwfBk9gvg6sY1WJrcydTneygCuTzMRAXcbxMHR9wVJ0c8vAfEyEPzWjfNr4QpN6PmJgqs77Kh/uEldYb0UDmA7OIQYWE+OKbDPtKtp63yDMJrtHSk9fKT997kLwjKchbp8fEAEgdmWn6ChFEwVmkGIKM32ov+E2mXWtMxWu/YkSNu+xsIKJEuNjpKXV6UXWCQqeLIFyxCrYCYqlR4CoFU87S6vPGazkQitri6VuV/g9JD4t1MHzpWkSABaygapKihmlrd3My3iExj6IM0pjf+xHkqqDjwDtiUAGXl+EtvXSMRGGCJKSZY9jy0RhXxotXGMIVTf6FHheKuh6fmxx1SNfgwmqSZQFrkzb+Cq66RYtS/Q68KhIImmRFvMrOcJsp8MEfYyRVy1T8n5gUdhaC9tpjlO0UWy+vVFnbXvRMDv8D+3PudESM2buPIhbCDIp5xrJcNyEyE96XDNpFq0YpvPlXwTRbq7wTEgpjFuqmex0dIE7anM4yWQgLaDTLKc5+jPGIoe53wSG6cqwEyKJFGiS38P7wN8CxQAihPZY4pAimNS/bHl6nFe7IJZKrqzwnyMnrf3GkN9f3jln616N5wOYaEMSz8u78TTxpSwM5sMOrdJ23sH55leref77CfcoXtWzVxC3htWAo8u+ODi8I9bQCO+OcQUk8OulvMwOSSOTePiJdOEOsGOxOKVp0IB2gBJy6hC/IdUPBTaFzAVtWUZcnEeYmuSqRiRGPKCLKsva1KL8fSOTQZHLBk/9beQZEcM8PbIa0S7PpOrgpqqYU3OKQZiJlImCyflXD+Ras9N0S8y2sL46ENtX9XbYWhsdz+0DpIBWETAG4HCrAHL33vPduLkDYqSMCHgtNsVwoDTO9AAaEjG8Vgm83fKBjYN69RJmgEAMkm9K2YZ2jIdsqNzRJ3NXvWj4XrHLY8+hsrmXes1FblZXiwvVgI8lj9rMS8/s/oH58VK50KYSCDjHAOsbIkwOexlcdSFLtXPh53Ua4pZLYHk07zXpC0rk/RQeVjZoAAaqmOqXfoKb1/dTCYrc53H1PbGp2470VDcQpMUWubQKgbwRT6AwAn5YwrBYj53TVGYI77embHN46/Fum2lhLyrasl/Vj53IJsdCOAeBEUng+GtZLlc+8iX2dNZ2AKmoA27vOkLemksQdXLkEHyGrJ5jjCrsKtPAyjfWRkbtamzM5mMby+26UsBge9U5ZORBiAG/bulPj9Ha2IHSaF5gkc+1dkt3fzplCfDXn+cBFXfDhggtbXARZFauD0dudeh8GhaRmWO5VhIp7Bdq6WvL0SL5TE4NnS0tDleEpxeM1RhoHpnCsJaovG6Pf70H7qWXdgfXpFtHy1A0zHwYBL0PBbspGRbLc53q8J2/VM7Cobz+3fxg05GVPiybUcZwAQE6gWSirGDrhkI8a/HtKkKdLXfnCdoNG76wQarRclU3L0gByGQ9tfaucAGCoAlbruGm+Jk+Ko7WxnDcIFayuvYoNHdls3G8QSzZCB0o08gw79ZGJfWZo7bP9F4fc2QVNdhZNqSvvnmIbGqq+bIXIOvDhfnWcPSS6IgYZnnhglNr9K+TolaHzBXmBUlGXBuMfM16S6C55YTgrQfy0Ve+JQPyZPDwqhQbVJWwxg2utqnBUtiJvK8zl7S1dhULaPKjHGqg8KYeh+5VfMGwKtQInppZVgtFHbHs0sKB0SbSnSYjirrm4wfymjeHVbHVSxOqDwmErTvg3GpJ/fXxBf8wY3142cT8oBiFmkXus7EJxeTgTTMa9Vs9NrmrFSbwwzYT5qEtIYofJP8SoZria8MwdoU4XHt7KOdhdOR6ctXzqdAn0dzYI+b45WYlkzT/GDPSQBx74u4bfDUj0yIyo7wF7uQ+Pd6lp17TSnWCqdzzfOmROF0wJ7iztX1chJQIjXIZa+06rSJCKQulky2LJ48oLpAdM7qmsZAS3lZtTcA0YaqbB0xAZZxV4mSCtsADWVxXe3OgVHu3Gh2mXhY0nIMCNxpGQ3MCb0P3LwyiDRF83d0fRFLyXL5QSjc2tGOon1xlqBBJT2ZlvHjxTlC3nWpZ0BQ+4vo74c5DOcyz/pz7T2Y1NB6ENRAi7gpQLIZgISOTa/cS+qZNv7g99iF8SIf9l5GHuhaAMMNx2K63GluIHlqrvOuv9TlqMe0Q9/4Xnv1GpePh1VTu45xXak7bD6IwQ7LzdMZ0yU3/DUbHZkoCm8V3wftBzPUQxpKOrg3B5WluIlZpeoUyM8PWEbkMYANUCM8GrYRTOt2RoZaCeJU9ooE6EeSfX59Fr9OVVWAJzebfj94wW89qByQe2hIrpoMPeaZPVRxUKhwVCVi/HSfeanhwiQWvYWE0hNjcLUfFovX+FdE/u2RA+SSgTrLomX711V04dFubeO56aMp7HY1aYUbmur23VhgxalO07NnnMUSI8XI9RCGIm/BtH5ZCxsDUV6Ml+FLp4Q7KSq0rbBbbDEhzcL6CpI+zUIrrb6wmRRXVK2/yGdUs1VJirUDyoN9wBbFCfYirbDlj2jJMsjHK5SjWFCTBQBMH5uOiAaRR4C4qogIRHC4/97jSWahR9oggGQaqdrkbrHouZxgiYmDcDELAN5WCTlSFU/ak6rwNmRE4xIDGgdDy8n3hKvXrAe9CZxmieEQz6b6DKS2IDDVPSeYvas7E1JGy9IR0Wbc6VZ9NtkqvS948Mceh7pVHxXRIBAs2NOdmf/2g3uzXrgSEQRK0zTsSVCq8KLit/+du1B90PDJXkDbbetKtyL8YfZodZ5xsLv2VFdlTF47IOcJNIMRR1/8cDXfHXGMsSvGbku0JMBMKzTTXkoLWPEwLPaWKjyrBwdolg9W2/FFeVHUjZTBjhYl63QUQCIEX3Mrr5pRm1y/IX7EhRvCwkz//BXLlIAvjnfMyyG0UoR1+TFFPRwFQ4md6iBul/OnY/QE5J5WMppbr5V6Sc5848PmG/WF66U18qW0BcttgLQrHQLZxeioAjXYIsgpSinAMkqB/4BHI1nKsyWJYr68FsuxuHwM/2yFUwKhYWc12xtzn6Vl7Dr28U6TwnLxCdXhUloeD1S9xzYh3Mqnpl3exao0K2+hLowV5IUNlvb9TT+SdFcJyJ45D1XHU8T/u/avDzYQ2ynxAk1oyvimuJlQiCp3Ei/f8+nycWFcSo4WEpVJLst460h7N1HN0BdlSCCupg2ehf2qBm0Wp6/8n58hhGGp7N4UHDhIr91gEYi6QQnwiqk9jRSd2yNxmJs7WnaeM51ramusBba4IrB0D2zFyzxLbyE5fyhrv15nEJkXqsc2eaB9WQSEBdzu9PYEIUEKaahYmuXqkO7C32Q+DmClOxFa7SQL1y+/eGsdHxea0CzBM67CawMh6ZcxxcTemQaSNzg/vB3qmK7ZrzFR+RdeSCFzRAhkXk4f7RfkZR9rH9UxIjCKvnK8P1D4++zUfi8ZS5GRo2BMKqSPnBrKpJjM1iR+QmY2SewDrqhWigdGYJbOPPgdm6xEooXDigjrSoeYjHDdEXxQrdok5Da5B0A343dArnpMOsTxOityXVjKdBWsjPVa0YZOLoyXHLtabGwO7HIi+XygL6LFelWEtl5iutnoZvtRi+IC0mkMwuHUxHcVc1CKGyJ1fmg3VVSCmzNyv7biCt7g7kmgszcYwioJbQ4iJRp/Xtj6fZNc7lreHpfq7LaDackQu2UdAdOfalCZtNbcCxzp0M/MgwRywBK5SY/BF+gct0aRILBOo8ZhQoE1e7tJHPgDrBtqGRrEKH3C+J0psHCI5hRpTsIMEpYw+STx+inzu5unLlHBn+753gCbD+agRbI4HU7nh+rHQIXwGfuzQEPuuUB3VE8JgxW3hKABJD32+Mo2SiTsFdWTRdT5SfQ5pubBs253pGoA3YkeIOQDOnaO5G00OTlrmbwkSH0EmarABBC6aWMgrPU1yhhA9xZRcTJbnF+HAxj+PBWNIvXB4aFZNct9Y263cCjuXN1JASHAO+NcFMRDO93rrpGuxy2qbfUJLWoHtzBOQ00Ke9ETsNXYYlJunXoghfvHonEd/fZbbixQrfOAnRQsYgGnbQ5RsaZFMhxmubhhuLy9EC9YfUKqNyDcv44tApyQiStYsU9rxoTyLw0Qht6i48z39SxvtcRjxLxk2NZ8IZMR/zFdfgkjgg1fXQDQqpKjPtoV6TyeH/O4Mi7Xl3PQQH64QYqrg5PpUGtktY4mBH/e0A6eibP9SviXtW3jzHDptLQbOyJ+jbZPYYLulrbq6uBEhBldiHiJWLpzikwLHBecGrvYFGVWYF8w5RjI0vKJdI8PFA3KpVDCgJQbwKDUsAfBvgBiq2qpYq1cVQiUHmSn6RgFrREjae2/KCJR+Kn0qru4zXrvWoUN6NkU1VAZqWHkd3SyfgwGY6zkfdZFlqkAWNMXWYT6cy7L0rh6ysK/ePDLltAlULTuQ3kGe2eqtAmB14Y5fa7WKXoLF8PRTJrEauF05dqG6OUO5bAxJ4ANd1b+9WgGSrdHzpe9++rgnXw/Ov9fyVpC0w5Mh8AStNmYwlXOG8reVIqOUE+D5kGEMhS0Dx6hcdZSmG88A3/U7iC4HZC1gKoBYyBokYlGxQIodovPRabOtps6qYbGVGp1dtZLsOBCXbenS8HU9lUv50MF9wBFyxeVz7d1PorluhunSiRmiCvfh6AFirRRFnGr/6B8fRnwu3L/1zDTJn0laR8rUpSe3JwcOn3jl8fs8//2+t5eEsVDSsoMwmRxIe1s9alDprsBywiaMSMbgFyM1oTpUC30V6VWgoKvzX9ppXXosrB2x0KCLuXleRnO/Ybfp4Uv0z/u6jptJfV48nqH7l+bU0w2+MdxJADrRFX/9oiJpnakAOejRpQ/EdbIp3neBWq8j/io5QuR+0guXipLEuPway27olMwBnyjCGhQNYWm1FRLfAMu4zbqkCMUxZeFW3UfbNH1zM5CbQEstzLAUP6rKLBHYvISaSYLMV+jeGyaPx6j8XmGh/STm9mVl4cQ8kuv/n9GpgyNW+CmK91a9WutTPPdEHY+pzut6uBwNuX4cf849s5Yh2/TVpfusKhat7vJ+Sw/2CnVuABp77qp5rOUnuKZ5Pr5lgm1niEXlY5MNuhJVxZAj1Li+CwpBQBlF02YxjesLMs2y5Zt3hlIClPqTI1qAUZFaQVO5Emk2JS9iLExK5/DCkclfY7IU2WUeqG7vlA5RvV9W4ZM0t0j2DI9fnC+b1UgiHb6VhYoRMthoB4L0hqihepUJ90+Em0hoUtr96M7Qp70LuO8233o1vmz2788A+t5peexPGJBHXHPWMwBl0HOB3hNWgKpbaiStspXjPkmqiYKmKAzfcJQo0IWvTMZQmOMO315uCoso48GneKepDce7G3QFmOUmiSWXafuKZupfv7BK+t1UCZq/c83OI0eJfvY3svWA3sHvjcxxD1Ku3ofWeHBMKAqdIxw8bxa16pjqBVji0VGFSxHvpK1akNfsDiFz2vkazRFE9GVY/VIwCfYTPlBFF8dqyVFnF5pKz17pBI3KimmHCCtxnSNARr/YSVWihuPgiuM8Y14sATRvI2Fj9s9elm6y1KLfEGYxsh/z4cJvBVZZEBs5Tx/Ua8Kp7SDanIKgyMiHLuXCCKGnysw4MatxxMhLlu1DWhYOILJy6/tg9B83j9m0ImwY5OKPBHdGkEF4rZoeMEUe1AR1jLJWRT8YQcSefnrflwPyW7aLcKegpoe9JwdN9iYbWxAtFZcljNcohlxrgZd9n39ToRTRcHBKhPJWpAo70EBN19NXayn88H5UxQSQOMjkRJNFSyvPgnS+xjJ2+HUdRt+i4F2v4WHH4pd+IzJmefIALOyvXwUg13T+CqVG+LN9dK3MgV8HU/KPFX0Z7XiIq+G+aMzU2v5f0l2YRea/QxLn9OIOxnE/UoyscSSXR45RiEEMV6uUbCFdygg0BMRVenRfixIyOINp/nPye0uwYOhjOv4+0G7ZTNfpvdtT11bgul9n1WiKy8Bq6JqQNcunGBC72gWllufPWosOiySkT0kI4uGCJkhQQMcSC0OkljE86lb+5BTrd17ng+RNIK5HOfFtjKv4n2DzCxK7yPX4XJRecWfAfSDjSlh/HRxogn9Yh0xznJ+cvCJMSaK49oXkOqMEMWf9MqH2Puk1XmdtvSlQdHkP6kE2nyflMVFkMolweixgIWnoF2BMJYuIadUisOz6raG1OR2N3es4Cm+lf7EREtmcnsB8G3REIsFzZC11fBvX1fcbi/Q6lVpPmQosnRMjQ8cHb5Kh78Y5wODDpws6OdstcmvjH8fC/I7q4WEvOk1s0cA/8CJGoM0WMw9Y4splEWP/nOwvUMsNy+tWsopyzPb+MaJIBeFhkpBcGNe9qQumi/WZbRsQBCESTbcxmhYgTrNvj1enO+Y8MHLrhuK4448jYTnmUZsuGAoNtvH3mMDHA1oAutZqM6SZBGpldmN25y1LpXMaEh+rUQJC9f3hzQjgSPpxsJ8ZZDAR+egVqgXLL7YooT2nBBXjRCbfaOqdkySoXs7DgpIJIs7KRGIFzQDPZ4vzoOUFHPmFKvsUfvE8UMY1nnsUwQszO8WR7kyHcMvOfiPUUyfQNfhC4pMkAlMAPQ0lLnU9qGFQ1ZjAUnHuJUQeLrvtHbfegUfnctN+8PeFw0V2L0I9IX18XqJvQD0anR5MhFsULWnBd4RSKsgdMtFG9OgFUXAQLrX3zSrwtxgs136KIPefCTu/sKzCQkEtPC3w5sLbppmI8C+5s3TSMe4+8Eb8f5smKhCBYVdVi4Kjfp6SejUtsrELvYcCZcE8bsqE5Hj2NHFWkMP6q56HIuwp4BGQ0lLhYRuXJVyzdvrrLLrH3Cu6T4B+vF8S7yGba584wgQJOUJ+ij3hi3AqvSvj8oUmctkGACq+bFCdaCofLi4qbAZXz2KPu/VfXH7J5OM/VqcnuZZblOWYY9Ob6p7OiTEZyYDL8AXgSooi8qDgZxfJpLtLuiK7e65KPAkVy7ivL7d7zsFdmq1ZNUMWAL4J4tvtfihtIFFvMsEYWFyK+rCFzcKGy3yQgcJpuOPWT0CdB8oTI1OgHabWxkOWZRPipxz89GmwFEn0wNaWDVQIrAKHfXlrv/Bbx+x/YWyunStdJKx/US5aEehweC412TBRoFzeZtoLtyPbMSrZsoUM4PLPSgs5fK0pbo8pMAnkS+k395kIq6TW4uhzlTrGAlG5f/YpMFOlGLfqX9TsYbYdxHMJtaTAUudw24BuFq6eg4TKs45DjnbQuGraekmCrJxKwVclOFgOmYWWlIHd+/9Ys523VCvxdUiLF2B/XsZn8QNbvsfRjk/1ZBbQXQhEv+eAmy4lZWqfwpIBpj6qJqPsT3Ehsmly6UyVDnYr1kTZFs+2CbC1Goo+1VRcqgl0DhsxUotasG0Ti7VJy6XFrFgUIdHO1jxmouR7cELy2dYc8cP6Rj1GuATvNo0kfLgvWTasq/0WhdP3Dx8RAy8dUzh2eDbIROHpkmBxGjZv4wHJumBwsyR0ZsP7jPJPqYtM1FqMB27u5p56faDsm9Ta6Ydzxcs3IRinIlGn7W+32TrzTRw61IU9zhDGaM6TrZSm7nxXMGthXW9+o9CchZmK8wO9RQzpswRbavY40zK3ogtrJKMhzmx+RcZpz/XhwZKWqcAKo5iZZkFB+N0v6tQZ9nhHa8HFcoiYAxEuaW6nR/2XIkHb+OlBzQOa32a5A7WUWB/PSRaMf/WIC1NkN0FGQlVCoGxxxcBvP91SEGFavIIMhG0EmKzg5WWlo4mJIq/LkUjvOjiLY5KO2lWQNxalG/XQ79iSg/mhxsNkt3pRrcVgBU8U0oEfAaqp0m5DiO/GOBoHo+AXJe3c+5BeMzmtWZ6oMHOaM1OGRYn7VsT8kXOfUopSy84lv11WAADkzAnenrO1ft7P5o6g2ljgVZ5gkmONnmbSiRaWoUZzbW+zJJjk1xNfXHRGIB9IC75ngF0hPFLttBbNtsFWCmiIK3FV3Dp92XJXLTUtWDjGsham4F8UB5qvhNjKf9IVvYKdGUN+0wwNk/UtRosTujtuV9ZoFTBTCOu/IItgwQohE/2ty/W0jmHx6VWslQQ/4NRbQ0CojLf9Uef2N6SDjW2TWWzc3gHB1mgtKl0DByBmFJHs0kOv7vP7wwGgPwH/FxE4jnzpCvwKD0ugPHwHFJ1gEpJwpFLuR5qOXFciZnmOSsr0TbJckfjBCgLDdkMb5faqqSI9TPNBjcGTJsccSemJWMM/VkUWxTQ8IRubP3n/fo+TuDM1aWWR8deHQUiMSVM/AIPOc4E4vSwGVO57TIpz5PUHvnixtnFLc+EGD88uFCGbViEbkk8915uKRPo0+Zq9udYgWJidLVPVImQWbJdgA5bJ30WtxnTmCEBtdPF01tNIgDI1VVHLvVuwmtO+koOaCZN0rD4Tev7ky2cth121I9qzzZpcbehhOgvzZ30MhRRto0aLb6nnQ9CQAMXRsQk2xjQJxo7B9fLqJrLawrojrAbGPNc56axiVBGT8IY/uTCQm/JUn5KF6DtYs1JXRu5vCYiD0ynQi6oM2TsIla3UBOPQeBwJOOlIoWi9XS/drWmPougDc5dzA/0aLRyDjnCi2emJDTdv372rzYMs8fs+O06ktfUEdU+ttkRf1Axi9Xuc59sTWuq6nMGHZo8+ESNemCHrNt8Oh30AIo4IXUd4pLnCykp12JcNLrnsWuFgAXhdZpDH6bawiubFRS4dpDpT8gBkaKq2siM7KXjPoPuY/hYONElF9R/qdwOOyxJEV4/uALooJb9gl26hcn5rTpeYAVG9Lc5Rax4tOs3GQVJcmpIEgS+riszTTgh9BIgTtddG4VlSZUKNFoY06PsVCgXfBDhE6VL2P4LLjKBXZu1LyjAWL88mBCS/aihvo/qF58jQz11BSSAWRmF7SsZh/egpNfsno/vIbTU9UhBfbaGeYbGsL7RVqVJACbWGg2A9zlvktpm7wRt0SKjF0nYTMiUd3YYKUc9FpeXALWtnlZwgDGpfWlwvoRqA7ayv4WtEAayZ7YDFa8+U4uQON7DZh1U7X67jpJXnB+yy42q+QYpN2J3YYhjiXprwjJZmBTI0C1Dz4Dk6uZ6dJ+Ok8DIL1uqKiciUAOOIoytcSGiOWUh1nMucdarOcIdxvDTlhc1LmU7I7G5Po049ld3uPkh6nbdgBhpumGhqNcEPccp157+WlTfHNDjc53ua+5ysA3e90o7jbWy9sPTE/jhyxu+WfPjQBsBGYrP9nQw2A45LYo4Z1XT95Fmh34akZ0SEg6wElwJ3kZtH3uKzAKVZ6poulWBo01S9Bk+RItTz40dd5VmZxtxfpZ0f0pdpFspIYBdgoep9jtUK0H11HxCn0BNBiYygjknC5sqoHBf2WysYal9PULuBHKYLG2TWNnSGGkGSDSKtrRUV5oHFZsdQbrAKvVvFSBGs70C3mjtbKJpIaswn0TxFXxdx/LbYQyI6o14PEIx+p1V24lxqD3Fqa7OU3w7YJx9qdYgWRZFrRnYchUy1PM8yDLLktqplkMDHW8wlUlWDMY6JKzGYLLHpB18YLyTMN141ekkTJsbBfNuBUsTpP7Cgh78QaCk3lGvtohQ7I4c4WF+6Ejjg6R1+5U0RnZUG3/dkqmBrDwJbcFDtgm+0jSlt6Kd1N336WEpLS+1zhzza4a3klhD+mobD56vPYIhdgfjE60CzgyhWhHJ+d3IFyP0ILGptbL8RHElElESTv297hSPkqc/Bh7Tpt2h6DYEWfTIqwUMHO+rdffOhIlJvT+qmaviZjXLBTiANLidWZUxxYmv4J2O7zOxR+sP44fEjqFlI9e3VK9KdLJ4ShM9Nx9rFdsWUJLblpIWKTi+r0rkVbh521O7z4/M9vY1K9ZaimmV9rY1IAPRQdL781mTn5QgPDUrUmjLusGmG8JWysnFhRbpJftBHaNaofkf7KgHoucBuJNLnXoNJC9JYc81zkOPY1ZNys1ouqRqjOUn9i8S7JBXCmG/z+m712XurKpKdsZv9HDnlJDY1ZlIqYj32mXyD/OWA6B4d7cvj7dA4pPw0aPkPJiWjK8WeUF9Bx0WY/lbj80AlWgbZAvPRqj+ZH/3If15uCXUgud6FEDwaRLdKix4A3LDyuDXX4Zs53kCPOozkAZftwEK5pj/T0+S+WKli1TVzgI7thqhp4Xxw0rKkb6uQmuqYL0Y1DZB5hdgWIRGVR1G/MEB7yY16dRQcCkFizqQ3RZRLqZYjjwSamzVW0fbM1tZrMeorMx3s72uiAu2iLOU2UjalBTNxDNcXX3XyVqUdMsd3bMJXxu33vwPCN6rN2N14A/xI6kkFqP45WXpZ881pu1bIeID0cpQ+kiJPqMy78ckJTPeSjq6d32DUwhEL/8qQtwhKwWMIrrTMTbkZeJDC3gaK9W1klz5neUD92yYgFxRhOONQnOu3tFjTmOLuiq8g9+LCf6yDJXFKpqgDnQlmU2Xz9rG9fVfGZu/L4cm/nsD4vhQUWD9ZH5Ejs/W10sCqWnIE1w1g6oyVQqxjdcRaJbTig4GgumG9mf3XbCpVlxCEqTXm9g3XfcBPezWTlJgH2SPD6RugiUwJEyyd1wMv4Db0r5SEQTdBPFwGKfNST6Se9VToArrsYInSHR8/64xCr56UhRpWJWRf9HdJVzTKQfblGy5exiHU0hpTqAWpYN6JZ3yu7nCHgRbVUI+h3Vwhrqja1u0vJMrWvKFLsm7ucJhL7crFjEpPEc2BUbe8SGOkUh5iQypfnIjVyNegin/+naQIvTUAJ+BDCtp9/1SC0WjgCeKMqkQXAveXQ23CLHZpnPD4PTuCc2ioPbRtOSzzr/D+ULcy3hqidWO5v/zlszPb56Sx+2lNnh0ZXkI1de75j/NjEFbTcJa2GlBEaE/edYpKRuiImkRMv9j5IKxSGC1IQ0O3yhF4yhoE283qrpd0DbOQuq8BhGhKLIzBhWwj4bjBOdW/VG5ffP5R9MlQclTC9zy/RJBNjC9TFrHwCJqGiPVxAJFxbwtQZ4cF32wtLCKiyHpIYWwjKZOFnqk+WN3WyMeo2RZ+lk6K1+xRMws/1cGltbWtkfGB1/CUs7OVqU9nRdcFAtefOv27W9pbjG3Kp52Y92TrSVqeIC78l1+F2SSRklHDb4KrNN473ZzpWQaKxM6Wvv2ZfDCZkhYg87b4fb8neWjofVydxp94fq3hFhpgJZLFHSZXog2P0Agrglk20JB95N87JPaCq6HCmx5OwKCUUDE3hUF3xyBbUBQc8XS5ul+umb+ZaMgtIo3VzkIWGiJmb8BWLJFW83yVbsqzA+u7QbhUSJ3taqOPYszKWfkgGCwOxjr0/6CqN8CrYS6UGOin+qJaZbOtyt9fr4xWvwtRHn4NoYUSTM/K09egly742fKQGBMH6rttSXSPdCKIr8S0IPal4cJV+7RlwDNS6vaT1qcvVU6HjaLDXcSYvpSVzHMXHYseB0cs0Uy0ONQPvmRuUcOnLIfC1pDwXRHteOzVUEGaPnRGFYhP25Yqdos9kYoS2C1kX+nm8lD+fODvbBY+6lcWuVXaPrXuVvIbQ1zG8gIABaTYBdhxaSVwXE4HRoUXxNiYY/T7U47rtrnLidAkyBBVntQkF67TgPXvu5RdT1KB5eTkJbwjc9B004DadQ2eXek9469LEkAGVR03V/VartfnnIdkeBdREhvCzqohGkFhXoyH8WnKnyHS5Y3YjJBBUfW6F/kfke+i4pkuKjdwjtw61AzHLXS8g4LCRX52s6QKCfMGLW+wOUDPxy/KQxeFx/SZDyED8VMRqN4i7mmS92NSJe5TJI+H7eJuKPc7uZiwbBg274SxYVx9Z8s0+lrHBTiHzTybx3qWwvqm+4Gc05QZO+NsQIB7+UMTb/ce4n2XCP0rCgc3M+czxVRejbkepQ2z21vxxuk77si+mvdfmcoLi5uIs+rkY0zU2G4daJrz83qLxSC/PwiAgMw0IeQXqvb+wbVwMp+R1bqwA3y9zO8/pKMN/eG5XSpVhveF01RfElu1uel+mpBfTmstxWYPypZDW5XQOAw+cuOIGdOB4tMZ+o8xPQQ7qF5uhZAyG/COj9iWJmUex+qMwL0o2qQOd57BYA7dNv+0+gHXDiX6kYl/gO6uzccVuRVKeQCroSaBE95gfwDtGb4w1iG014+ptmH3g/GDb83Ht8zZLp9BvS89wDSE0ec+WJ0G52Nr6vepwk++IMmhc7EqL5qhzbkWFYBPGEKqXhwrbns8PYdanBGnhCvL+nuFVvXvVNBXjrxRn4j4ZB1Pd+fkTIs3A5MW7sF15P7RK6Iw1lhyw2yotyrne20vwz+/g3hJW3oIP8Squ+lyBIov2Y2Yn1zYMQRyovp9e7pDJ6KoHTLsoGQq6y0PN06C6eAp8v43M1bA7jaqzlOQTUcsVWhFu87X75ZOytaZVN8Wao+bW4jeyhkqPZ7tUpSMrtKdDyWEE3tHkYhfkK7G0hLTzZUjFGJQTGTgdnZS/t2UhkEXM2l4ms/ZR+kBu332aFAjY5BQrMO9OypBXG+JLa7t7cr6JwJR+wqpD19qp9kFsL4NBoXGFrsSYKBh0TFFNBOhwxF4yrPwjbBAnWCz38tuM2EzP6dLinwCE0lJTwXpaIKM377I6znjEj9WAlJYgVd8fZpTe7dkl+dz0dlkm6uo+ffYzviXjGt3cZyzMZyxG1iz8PddwdZUwD99Z1sSl4PtQ92BIAaS7l+Rp2SCF0RkUHLK6qrdvNZAH43F98qMc14lGQV3K/Q1O+xdxfjuffAMn6P6RPx3LKv82hT6TlSkx3Smj70ZmC3R/8RWS/2+4L87t14fZAyA0s7PbyZ5ML7a+V+fmCcn/dFD8hApTdg3I0He3kZFsZIHTJWX1HQDQqGMJB8R7gxYv2woJS1puaJRS3OYCG3VorY5AgWfWn9Wia/9SJprEUv11Ma346k2AlJOozGKlGDwv/6ElBfhOGzWGJ4XNEiiriOImPf5YhB/K3nu/L2tfTnrJhDFtZ7B4q0g/Ldx0tdEG5P1Wq3x1L+Uw0y3K5t36VcnrGyjygtU45aO9DBpDmj50RRmxUt7eVTueEdEqPrQzQtRSXFCR1YoFcfeY0RJ9+g369ZAmTwA/pmr2D0Wuf/QFuPJzeIU9v8AOkEDVhx6XeildMpaXlDSCPnlpakhRkQhwZ9Pgif0gp8YuBXUlBUF+H6AdgZ9prmpED2r0EgGuwDMdpyJRyvFggFESXuAh24kZuzO1uXh0cKN9LWumVZjJNU9SRaQyFiggqsIS0ECtPn1AqHEn4E7sGWZcjO8KTylJi82Hpsi0hWcfnARIpRuli+h1Q2mFXjaMDmAK7MUjG7JnjBGtrBlAmo+6C4jk3+LFB5jqyepFhieIqU2xccXK1o9IdRYKZXcyqtcnTXDgjAUHT3/WIG9Xr16hB5aDmpE8ipfAK6ZwOdHAGoY52OUkQ6WYfwV/gnVJnaIMv1V8c3OKYfpDLOGasrBGVUf0ZAQQ2LEQdMpRuiZWx1kzt+thZGn2gKJdjIcsaTb9Sgkyv9Ov1JMpbcXnS4Od8Ge+tvfch6t4PYzuvr9e1u9/24C4bU4S64hbZ4c+ffPKx+1Vcmvfxbt3loP49lWgBi+0t0RHz/VXm8bca/lH8ptJTKxv4vv3e78rtDLd+1RJeF61vv+t77ilcDfza3NgCwd9jf3uE5+QCaPd16uNuhy/Sb0emykT68Xd8rt4UJXmJUYvprINVRnJVfD7Tvx8b3PniVLFyylb1832p62o3rAR3JRvBN3Xp81UEcnQ3OD8P39NuItgPt0nPNYu/SXnDfnW0XsF6/esr2/U2vlSf2ydm00W/907WeshOn2XVWIk8Xu2rCP5rL/gfjPKJ07yYjRbdIBopy0l2/1j3AAOoEA3EaGv+PBn2Ks2c0+rem4r4yGGKIzmlZUSp2yK5eeEopxGraS7T4zI+WcI6T4qmnvGCMUbqadhJ93nAXo0+6kJ+/9SvAtI3/DaAnJuh5WL5KMeLuNxmvd51oERZ4WWyyxDihEvbcPUY9bG+/5GiGpCoODyomRQNVgrIhZWRaLKF3ir4c6UEOZYIa+8MsHsre1tUlHa5jXSkwbJfGabAyLGnmDWcEmKBCkaaKeYf66ARyVAsS7Zazh+lpHpALcbgYXY/qzZ6d0vKYWG2D21CZBmHScnHB0kfTJ9W4gECfu+oDL9eXxMYorMViKGDip6PNZpfyYXPLI2h+J7aczGcFmlP5N7rLKdk4HKfh00hmaxJIgrSlejK7CQm20h0i67wCmMXzaFz9tTlTT/IEWtTwyao8fH66zHMEUCIBQW/f/GwJmVy/3+egpKt3pivSyk0pgB628pPFaxJpSwx3OWWVz4Q2KU5qUlZmPE0qv2tcJ/wNeKt0kozwsMRTuk8qZRhzzFVALznw/Y2feNkNLD8srV7HsXXVFq8eVn96AkEWehVJKYvNh6XU42FvCsP5k+THl+rG1M1FMCmzvT0MVwdddE9eg0EsW5AN+eRK8HMmeM/undnZGfeAmS3bFiVjQsRpduj5i/WyvDG7lX2ncJi5VPIJf3o0VUDDqI6zrdeWNjJVH+arRCJkFTjP9HnS/VZyd9qsoCLMcQnz30fvxmzEqEIBZVJleMeGjKLxvCLeAuyKy2iA5lrzk7PvW2N8jYMcCaAJTqkwkrC8Uv+1IDd//0W0clZV7SGZtUHE7+Qm6LTTfHpzVClve/zmlpfE9T7ITg+9VHxln/zuN+2r6vucE38HQZcaZSkOobYb0lmLbCpjyaCt1UpiPp69y+GuMnfZBOgV2CZRr9V9YXwsjj4G0lxd+snxF3Spgl0E89CtWvASHsd3WJ6+wflwcfM8DrZ3aaxW3LY95abqw5vpbjwee8GGn5JfinNck3UJGmYNXiA9fvPQ/LKXWh5qvig/frqIlNKTt4Ux/c9xh5XPrerhMBkq0HffV72iqy9Wpr4kp5jftYUxhUH3CQQ9ELAp5mQxfxuLVuWt1F14+fhnq4FHC5gLDQQPpbB22n5Yu7ypAnMi8qok6ZRCn2RUGP6ANgiTmT4lkhP5LaXIqaCWdmv1yqAZ6Gq3EInFOIDOnXT8Zrb/VuRgwAaI/DkFbT58g8+2byf0mJuDayuvtwq/0R/RgwvDuQzScGvrZDrG4hY/Q4tlYaxoBMKuXrevcKoncF9kkBMGOZCVqcjwoWBuW2Nb0WFM0GHhF4tkn63V+VMfV+9t60mTQJHTwwSDKLV5yAxqrOZaxAfN8oV5A8pKESLUh7iEyhOv7dqvdTaZLQEaDUvpsdhElIxgoW4aYTEGomO5YK9OGXPajms0N/8ZgvjoHrmd11GBA0wh3s4UNs/bI8IIt5OBFqW78MFQ0DEVCDApng9CLefiPF3qfGPxjPoKwjrnwNUQUxbfhZV3OUhZWbrGKnk+tdKaC9xpxgjIDr6d8stEF+LP4j2V2a1AfmNnGiZ9PSlSOSm7mZJv45x3cA8wnLdmfTx7x7A4Jsb9GYHdtne4YuY95ZGa672snYFPqM3/H3rBDXP/dKFpzjA5jJ1fdhsell4lcH7R6D/cj4RwR7M7uZcMV9A6vByAZxYL4vnr5Dwm/bF7/Og57mwhxidarytxEyC3M/CiMBS7si+ia9Qt3+2J9JSK2n+I3PhiCusx38WUFt3iEXipMT/uqBK+KOeu5JOpYLf935p8NRhHECrSltQG89N+6NH/5rtHLubDusXkMBxXXVT1ppnjnd+1C5/Iuf23iuriOZf7wjSPSO9quXMmSHDiND1bfkuXNEuFB9oGqv87qbK2nSGJoTNJGPnx8qHkzEj+8zv+1g/6Wl33XuCj7Sy/5+2iec/JF8PtgWF1+ZJMKxaC2vZ8IznsM9ClmURH6gy2UxBnAsLnpSwf6AOgZZRoWfWMuMfP5ILfBY2nyQ1u5dA49o7AhyY3uZAuMzkP9EJz+/v/TZkxEzNraNEXtrc22mu/yV0D+rcxmmh/L0/zZ+OBXg7UUko9XuZIssFje+abiSlsAuwdJbO7CTPIs/v8wvCcNkAYv/dG+OFQoDtBWx5nGqXMBIhXCUHrSUetAWGSq39AhxXOHB/3CNi5OrzpnGgefli40IMmDkJZUNI+0HH0c5gKJx+tcZi5IK4NILINZRodM8v7LbmrBSKWs2bUvb+WEFO+48/OFUmFF2OKHAZ+7OHdj4huUWXyVp7UhwoA1tHEM8Pdidc1AA2bI8YoP3asimn5nJtjCmO1gyvIWbH//8+i3ZalhvhspPWkFWX8p9AimwUPsnE9VM4koh+vopRd7Hnvd7OVAO4UPaGYBStENQiw9po6GbIv+66R6HOPXmWyZiJH/JVnibe+tYELnlvu9EQPzHHbGLjq42DQf7YrZiQIjmTsiUEyqzampYTMkF6b6t0ekKYNswyyz3Ge5JB+5VGyGk/A4DZqM34FYl9EWjxQTQTkt9HnToUB8G3GlV3bJkzaPzlvGkB/p69cug6zO6AmdVvPB8a9nVrH5Q96utdlyy/MW/8ZHr9HJffoCQ0A7rspUIKbHi//2rx0VT5U0kN+sLY+9SwjOZ2LZG7npWvubBjwYap/ac8bHjThsjg3lU991BzFU1JhoP5tlXvkPfZMgE0L2oZl0YM/njm55EF97bLqBeQbbiT606m17TfCH/4NnqSJx15/vfhsx7y0DuG5+Ef12LWG9A26X4A9UBG7aa7IzJtQ23c40cRgku6k/70xZ+1boWyBKNWukB51dw3ec5qobq6QASAmMAJinbAp2leCT74Zl+qxn7Yhft8yBnYdY0QmmnLZNIDvP61tbr+66R+jt3f4SudkkoFNcUOHQ809yhbDLBm+TU7QEZZBgMFGRt9Fj+6ELp11STr9jY6Rwyu/K792pjBPGCfJNmHx2RsuFURmiFgoQZh7PM3JKS43JIABUwKYYdqlWvibfbVlJ4KBHPgh8Y+ewMo5NMbH/4tFX/GfPm0HqnR5vaD8gFQd1JsHAB4w/W+Fgc32Kq445o1lvRo0GGeMNiEg0748M7P1+u7v9q3/1r3KSRwYnqMEsbDrePNjIzNg8b1t04IWLQrnqpmloTg7m/Kn38W7ZoW5LLp+k46rq1Tj0o3LN7mdhYmfl6HBjTzwn49d7e5RUe9YM5hLmqSZH3yfNNtNi1XW7R2f6/JsXFBHX1oIhZ+ve7HE8dju5Qi7huengeVlgz2yxd/INtInmehziT5SWwPx1p3Hpazreh4z+yvao9OJYxR2wK2LmeVJQkks2booNF/2BoXec1VuhVTm9Ykh8PMzqNGWicBm655Hpia8ac7HrUNsdLue6bXk23rTgO7jeY2jNOIpx7nHD/9YH1H/ftnnX53bndJe+53cw8iAgfc1WRqxpek2vkx3jV/E3dyvGC4iPnJQGmiZLzT5duXRFNAcBaKaCV/uTVR4kTx4E4UfWAab92JAhEDc6J0Ila+y0p9vAhABCuuATR67oD/DOWitxP+fUAiO/BO53R6ig3ojyGhXivIazcNX/uHSsL713P3U77/DKmlpCua+5RgxWsF9zFT7VhK7SD67cOOOLEzxrd+pYL3/x2lp1250MSEBMK/pQAB6nGpJopoCdNdnuNnM7eSbTeCIdREuutr9kU8t6VF3eo/k+f3PvWfmee+CuXmYqVYGn2qPi4y1jiSyNneacxYiWDoDa6qyj6jKLtHGgOZni424v8JfiW2u9v0fvW/nqYdXODr0USN41v6i+ZaD9/UytywDj8QACbuJfV1j+RN8NSTqtb25f6ctvVzjAwgKrHai93vTdP2TEI+xVcNc7TkWsNURIAYRIOqegpOmPJfnHJUbCg3xoulB4lRRzhWnt/f8Ku77kir14NrSSuGU4BsQ4BDE4FwsNwOkS09bx9AMGG4BSSd1lc8gqcw/OISU8nBiBE99dIb5QwwQIf5v6ZoGACYpzmSXTec0lndfmvMGd8hBS3d8GZjINZ4jwlmJWNMz57/mfXcN2l96wwIYXA0c47t910CBB1ntTMNREyeW3btf0wKUYs2OhuwF/neo7bJK2gDR/FCxw1FbEHK8vq0R5srAWyXn6OJsz5IRBNyxrX+/iOaIsUQUTOsYbIqBFEUsFWCpEmYxwOYe3iRBvYpgTdAGWorwPOr2MS+aLsveLYK7LyQBlI18lK+MswIMgZ2OQcocCqMx3iX0fyWWzYhGjp46NhgTGavU6bwdOEOZtp6FCtDliusbK4SmUZwyywWMkBG6th5gm1dj4HrP8gPkPxL9rQVMjveEwwlDxQAb139Qumrp5b2WqVlU4/b5duzoNhXPJTzNIViZ9fZ+IpM8frmdyf4DZ+Oi/adTDPp1U+YOrR8XNrH4P30vkYs2U77MaxzJpkeFEE9xM5hZ1Bg7SfaS4UkzDk/lK+ODprlGZzlozz54kG9i0sYMuys89q1WfVmwKFmomqg+DjL8VqTptdOdxud8NdPcBdinpo2mHH28YPc/F6IDJ8WYmiGT0dQmUd/RoxAnC3S2U/iZakawquD+NoxIhngDhdmqty9rdBTQQ+hq6uBpidcqtXmZ55rImlk/HaNM9B1v0Ghigo1pOirNyo35zkn+bpCkikurV0aB7ezgCVxmaON4PQDwd6aPNMKLP1fwl4/VQKOHlmaYhBpN9NJIglgfl5vkHUP8lrXk3uhqUmHw46m1LBMp2F23wjNxd9Tq8BwiICsvWvtbJLESGAJOw8LEs6DFKHt0XNhwjOf+/zitPMBF/Y4pW8Gz36nmzMOwXGz5tLsjpzlh30RkGfBMSmQE+Q5efPxkGWQfLIqtm8JBWfaRoiAASVd2FMoC3IKddZcdcouF6b5kZOcquDaFlnNApVmnu/Pw3jD9Tbj1mQCzEXc6IXpx9DvXyP3p+tzQRJeJOrOjYsHgatt6zhojd1sA/sLUQKysUQG8XGSro1KNH78pz/HE2epp7wUv65iZHLMwqfj4f07pgriWHUb/aQP9i1/cirgxKQrML2fICRbTJrqvc0sLyIyVRiAg6A1pNsZO5OoplQKvU0RQ4kqbEiv97rBkiEQNIxL2yGU50L93ZCpbHVC6fW90Tq311t/m5QxHvGWZP0aYoSZWrckoawumlyijV+LwVurq/Zed76x8vUh4nOAXMg9nv8G/yPx2V7grYt+rWpy7Kz2lH1LaeJrAVaejrdCvTw+WLJvD1IhjvCmeoGqiVnKHhOIx8eh5S/OTKNyhIC04F0NY+WgPApxXAUn1BIHb3CZCGZtxlK/5Cye9Jomb4f+LIhot+jN6VQLox4/Jou0stmMBs9T8jZngzqnhvkZS1363c0t1GgonYPKnEtGMznS8zGD7ofbIi+3fXtETj72y8NbM/WhtNFf/BV4Zn7ndK5kBKxiRarLXD1RMx8GmU+e8pAuiC0d6WFZ27h6+FpQApjGNAiJw3s4PNolxdZleK2VjP31zqUy3K04lA3eKWLUrg49L+a7wmzIm6ECBk5dfNva4vCsqJmieVcycVexAx2Tzhn9ChIGxlgaHONe5JiWrrC+B+T5eGtqB4kcED1mgn5laGG5lzCRK4q21XjhzBW9A+S6LNPxPHXlL1dHeN5vnR5754tJP75S1FadXaCbviw+cHHD2283tis+uCZx7BvdDMYomvCLz2oeLarvpEnMTnz3H690P6rBPmVvOPagFf9w4cYCT3/Nm3i/PyYSBDevKTr0OQyeGCcn29aaiV/Nv/bhUvei/rz6nU894MdfXMgDEgdZKrrWJtrIAoKm11z4/bX3bATFKWjf/v9vyyOfGbhQQZOjj5cuPIYIAHxM3wo3ScLc8VowoZWefqW+paGffhqzs01HgljPJi2r6j1/5xAJMcnQi/4Kz431eYzUWbQnxXCi31Kt7LCo+6C5D5nEMO8WZ7qecXlq4fmFU7M4NE519xL22n7F110VHZwBMsaQzRyNzjqnM493Qn36BDDnhfXCxnAXuK67IAtBWbn6WeaI4zS5BVNDaLqWEUbaK9TZeVgns0Ia5M8UC+pTOcuKG4MAfgKPHsDhFxTNqNsRrDfpX0sCPTmOuTPUzC8syTHPzdVQ8v2c1J9J7rigEIPhwSUCx1iEVwJFojYUkYvr2TbxMgHlpPCyo+7DNK8Mnsly9wnW8ma65nrmMUAq7fHdkpK4ykiKwJaon15FizLBI4iR7zCsOK3t7LOXM5hXmPl/TP9wl/+1/+QujV1vYQPDv8pOFOxibgmrrl4s0/5uHXTzQqoZ4UUYs+KQcDfFS/rBwpdo6M6IYmm4M/uvlWfxIqk+/Pbdq5ENM/wdJkZuziRPRSNK4L7KeSdNVHsvFrXMKl296LJMuoGd7kDVTHRnlBzc46CK6pAE0sf5fk50TI8eKKznxnoT3SSteCBv4eYwcItXVk68r8Dyz4l6bskxWam5barNEx5qtyKCGmxlsoq2C1w/4kaDnW78v2xa+ZoK6GbLD38rzXAtG4Xz5fdfNyrzDGmwFhxG9UYdsutLo6cDxgOVuTQzgJUiM9C6+ai38n2bYw8Icek3u+XiwEpnDelI3TR1xvmta6ypRVIHWYzElWjvExLRArOKA1SKFni8iAW6d+N0FqbkgFiELfaCPkugNYYGLeeL0KxMebLgzzASsvq1aCo+2HgRSnP0qDfleBBL+1GMlspmGFplNTR1yMPpv9dQ4zxt2n1kGyjmFbDOI1c3Rn8tb4zmkD6xBlvpnamS/u/PH1RcRGJo91CVv0tjlh93TlyxtGPct4uCRhaBeouEprLYuR+bPjgjpKP83Nl+i1OmiwXrRjTTKSKYTVFKqvRoVlfLsZ71+TLmG8Gnm+uPb9ngGBIRFVSZE7Bmp2LfqQnPGkps98mTcktS/ekZQ8iyiXevYaADsMsQj4F4Y7Dbk6chUEcvKynOcmuztIQ5C5SckmqqQRx8X/EfAyUe7PQ2+xqkAfeIv07A1WYKz5K4WiF5QaQu2DHnqmWsfZswLclwtLfIsTHa0KwhlYXZyazKZR8cRmjUStv9pEnixEx1y66lkcJEgEEJiTwCs2N5Sf2Xi7SA/EMf8dU5LGaA8a5L16p1NvT1DpGbqR5JEh9xPvKCoi3aOTY3I1crCg/YgEoDy2g1fJ0CNIIir4RxyVC/ragbXD7lQwvoLJgR4dnOl4eYBqqghEvlV0tI8sc0CAjhwENPsb/JC1dvMa03dzMrSvpwKkav0O5JSzElZ0wOh5a0ko6dbNFZNBOfVGYUAiIBOMlY++rt2xKTFVLPXTrOGd0kR8aPidoT+ypVsEm7MP95JSKgRKlcWAUfAqZdI50wLwHljePymdQ997gVw1r9UeujSHsvnEqdjbK/o70s2LHLeUUhl4vTgSBkC4Vq1E3gjsXvbgDsToJZIbxj214bzjF7BIYKJGf8UXch+aEKPyW7n0wTRrN4Pl+NAHow6cUg0fjwdOqqk7HF/oQQuJNk9+P72caRLHG8S5dnNbqPDxTFFQBuJESf2GxcScvMrnZIpIrkh+dOuv+i973XOPuXKSCmNzAEqW4c3na9IQSxjwEkcyi01slivhcIbkszVDdsQeVBTPsfHb5PaV8KZNYj6Np0GWqRlBp3ItGKT0MuomwnZ7OmguynZs+mrE5k4mnLGt4jIj4ZJFU8Bq+fLoMccSZM6R6G4F7H4VD0Tp0JZlrAyJmMsAoKOr2X7T7JVG8uqnnc0U6J6rpvLOk1jwDooo1ibuA+ORvwUbFtrLsytWCeD5EyM0TMAswfIJwsSODqg6u9VuIV8yWHrMFQGBRDGg1gCIIbW34xjK6rVujYK9n3bpZNu4LBU0PeOO445zXLAMtRKN3BCoycvCXk5s+taTcMolTjiOPf6wR/r7BseLHtxr2WRfcbpcXtmMSKIgW8V2XJoMtbmINMctyvCN3cpjxetmB3u/pf2pTyQXxFFB3OTwYmyz+9cFY4ke/5ExgVTI0N9XgyIGBAXewdC5ans8OOb7UybJJaB8zz6HWI5Be0QBdyfYHHHB81aYtOGdKgRzW63tc4v5oUveIQBLrP3OEt9fc+1kpqmZG6aixFiFPhOhtqkktBF9BmAqrVRmAT2O9V2+1+eHLZr18ztULqiQwLwEz2WZdQnAO2/9nIFWTR8eh7Yq6rHxFeX/DGjpvVqu5w2xPkR/D6RPB9fM+eFm+igs0l/gmms8XJYnls6LhuxnN3SrMqMyJqKEo0BzHjezi5gu7fKsVfk+X4mPrBz0OOmaosknn8reNYprZTl2QUeL1fkGAh4zlEgHTzrGO1PD+zBYowoMTlzkLxREka89+vW1C3WunwHEMcj9JqYuN0TFdnkcQJJJpl5HZHsJ8XLJsAviKxfVpHT23QTyKgtGceBePYq2/D89PSRENOlSY7P2YDoqdZCVYACmMQTGTsfE66/PoSa2YfWha0/Dhh2MPbikukFj7fqx708YGSU66YLJx9wLp/h61uqAEnOi2lLitdCMJSvtpsg0CuIRO6/CdoiDyogN+Nkhb2V3V0Uj5MsVYdOgckZGfsA4KlpnmZqBUj4b/mV748+NlBP1AyrigG5fNIiozzIR+N1wTsvVHTlK0Dj/7rgJf/5qRf8T68wN8A7rjrcAKDWNFCFh+FMHKgxQpVZwPssg4XvbRqv5C/THQVffpE1fz3G0V/Tt0hwAE4xHhLigmRfmDhJaffkbImf3guT6Yn+Xol05rcm5nI2BaxKMMclC6cVgi4uWLUqdIGrNdRQImjBcROm4Zil/kSYcsGLSVMv7Lx2SiOgOBA9bSE2y0RspIrY26UObgV24bYWhnvp3z8VHh8f+mB534rAlyi28CUmRKSpUBIabbaP5FlikKcqfGyW3iyqWANeTjPeuopFtMeToF9tJJy9XCB6DthOZF7Czda1+HzH6B2kNfLNS0m595Cxi56zRvgGE08voqerDjdamCSSaxYcl5Hl+Hgf1txesNDut36oKskCp/zDDxWELM9cYe8dNA0A9Gvn7l4qvau80p/AMhPOhGkwH9dzShl7NBdqvME88j1v3qJtOkLdRgzUBY9YOj+ilwGCnzmvq9vRyXrZnACVbaY+/NKt1gvcoWRqLUmTQFeEWzD4dnSe18nlWZj3hBp16mTC+1VcmAbu4XKnTFqw5V8q1BPjXnnE1BABKVE88QjEPBiSNptxzwA4sso6GujcCQ74yF4hVGHwS7INCmQY8n8/DkRi5Mzhc88kEeq8dccCw1RjOb5ORfLa+dV0CpqqYlvyqZiuEgCmWUeWuptQ2YiRHrSO/Tx5ck+9wJCwyK6p2pZj4yC0jdOBJWb4nW0kQFORoDc1SUXtm9CzbQLJft8FcwUBgofbOJexwOI8RRJAl6dMOo6ZMEmduZL9457CAJq1lcZDW9aeyLfL6nUTl4+59Ddk+/pEtfFOm9SLo4fMHlZBCw/iwYpc5YSJ2wDcNEF+uWLANKCIGvXXso5ycHGckuR++ZEaAew0SVbeNGtP7yljT364hgEw4C+ERrlNyjKeJYABmMQGsC0P30k5T0q0W7RtvZxw+FBLlok3mdRVnPQwIQVW3xbEXiep2zfOu307kLeK2ACVoKzCe9KLJ5MJc6YrFK3EiaT6FcLihbQLtGnhEgDaT8rwZ+bx+c5Rqy0N/bk3F1BtnoJpPGL9xjluqNE8gcFaC9Aldm4MlPjUOr5022VQz70ztXGl1LR7UgFnjO0veUVktiMSk7m2/PEPv13NSdHYsgMAcaou60dUpO1nplWMKDH/1FsfjY+5IevLIFFcS7AjInvu+JstX0cpJkZj+9DPXxTHq99rG4oCSDbG1cR5+rl7K1BOU1/dWct9bhjTzGCm/x/aBB745vYGLJC3HAiNssF5h97lODOWYE+jMyV5+5+WHWHyoN3BvwhXH5f633GvFYJAu4fcWHwK+haCE91DW0wA4HIYou470UVrdllrAcGCKNq2rG+jhKEWpi9JZfLqSlak4xAByNsHEAR5yeODabT95lu2XBsf8/IVogc8gWLxgHTGEtWlP38O80mL/AaaBRP73SY24wzbJ+38px+5FnfdItuvQQWfjbtUTNPv8MzOVzCFfDmx1eopXyKFRIUC81AoaUQWLbtVZNqBw7NxiSfdFdQ0v1ISWKjilijAFBK5oFLUfoYSDaP+DIEPFh/lRkIro6DAarL9ZM+EmnapY+g/W22M4Ao7mKbRzU6Vsqb0lfM2+ga+AVKl1WOy8toHfT3rDIrE4Q1OR00Z6l0CZUI3nqLPJy6eSje41Am0AMHTq6FvrsEsDRBva6CVVOOuLtvMrwBfmKDZKD3hlYpE4UQxpLsrLchsSMXEXCj2Vi0NjI+KZtiuh+GrDQIfZz6Rw0OJFMjncUkEDBFpl38fYZ3djADPxpgG58sL34o1xFWcwIBYNz41dGFOwZx3sDzqK0d8o/jjXM62kq7G4Cv1vGr2/j3bVNd88hIg2KMu+uEtXQYVw6Xz0xpDbPwz8sE2D8F7MUkTArx2f2Hl/m4b3PdVN7GSGIBEVYaxvYivLcJF8eLwt0vjxoaJKjN3x1SbL4PjpolmmdZbmgg+2NZHUAA427LGRiMKNde7+fURSWey9yfLFtBnAEn2k1//le2+FAbABs+mS6BmuqXGXG9uYmde3ED+PZtjbWKo9FoSStzoQbg3LXHe43z/+ufeu+xznEfObgaybKrejXTAqcVKeqQtXTXVY8nlXWs2XYNAvs1sV9tPIgmIZ+8WQ76nItSDvF5FCgV4usojBnhu/uk9AjwGiJACQZJC9zz7Ve1frppKmFyrPOXhvc8ncwmp41lgiCp3a5YCHK05Oti+uNYzr+GptzKRit2MrQ2J76e/qNC7OMC3mfaHn4XMWvsEzanaD6B43UKAeV7xne9uucSn2hFuTHX6aW+syIXeALt7bMMILYY5QxLq46Fkd8bYeFkVbLYNRR2dcEh1ZJm3Ug4WGVkQi5d7LNIhAgAOeN9AALaAOrR9vEYTO9Ptl6V8lanX9JVFvoE1dzxUd9XQCGG+opWE3iu5cKGmyUyPOYp9fl7nEVY7/zNAym0GswkP/vuPWcval1q877/Z3uudbWtNFXcoNRmbLuHoYl9xU0et/WE9RAHaypsLJvpfXd5T/W0IAOsr16gs1rcbtYyVOEYguJnfPvNpni9y7H8UAOBzXZ1DpYcpEKWcvpMunWT6PsCfEos1K5SuTMbZ9c+NaAr2VanhagTgeFJg5XhyQWKWq5Rrmmx+vCljp9TREbreF0WvOU2efX/1vwCOe/RfaCUEzR14EVm/ypM+5hlYBoFLByxcRVko1/v6Lh0DYJFfaAXE6yhw/ZWEatxMTCgiNzTY5itRQgw1fjAYFx2/0nw9S1/Kwkl0RzwUCyWxKW9xk1MXQgt2aHiKy23vVgCuYs498WyavOpWBzPXMnz8T50w9txyMTv+9qkFgwXeYj2p86GGYfF9NoWwcjMJXVbJ15jphQyrlSjnh2Mtbr128lvVYdIKpgyiZy0FkZoP/0S+kPQsa5xR4WBh6TTd5Mmv2O+HCsCjRJBfNTmkdj7h3LHitlzU7Ssx30oDEn72nZmoRCjXN+6/+ysPA11bL9zCQGfx/Ha+WZH8aP2UU7+u7SQ13vZYS7/vAHBXR+fHT1XnDsehShMsjB3uXGmlcfBLMkapfRII4OnxJy+ad7MzM4quyuB65WkAbH1u0/V5EYFy51OBFW08tXmRkyWAFpLlis+LB29vjQFGciv9zJZ/MkGAt3Fvq1BdeHrnKVBstWm+WGe1/eQjX+KCxF7H19dAp0BrGdCQZNZydKzwa7Nl5dUZN3gsmgEpNe98+/faAPZb9QZXkmbBB9+M4DDdrZV9EtHzjoGeV+LrzzN6qVfuE/pNAKxINju5JbL+FDkStz329kyQo6c8uTFYc+voCoYqMI8igVb4LY9ZHEtznWXonhQUEKxUm7lRrYOAJlD23XLAa3CAEiBJO3miaeAqcibu8DUlYR7+2K925lr1Cj69dN6Sf7Rk2RcGYBpWOKKELfVRJy5uCtRswudQaXoC8N31La+HhQbO7bzbDcEzE0yV5RDErJzJ0JMN7nmrTvqbTKsu7j/dM464t1Z+HpSB2IMa73MMDV8CohtiEVIMpm8NMZkqTzSFw+r27QDGO8AHYX5bA8a99lKb/2hgetNsdUwOBEC8eH0sR8nEMCsOmzho8t2kb8OF1EtzG/YzRDfdZTN/kyGNA05oIJvwSYfDaOi+bJxvK2TtuHvae+Q4BrZLWTcvmUEqeyoZSJODJwL1wYdv30W239nw2WjedDX5rv9Fco0nbghM+a/L2R+LOPkoBjIAKIiUZjMrJFk1xxx9acronn4QzwLvlz5uPFzkmj+cEkx1RXoyntHHL93eXhidMC0kXgYA3tlOvPYiBsPMU6nTntp9tEpBX493qnObAm4En3gWyt3F9OcGrfaUct2izy5PuLpzZJRRLsUNf75if8ePz9u2IIJ9quVd8ocHtXRDrpqhvzBVGGubJArtriETprVmHNWsD8w76BZYGlpkq7e7/3g2wpwpfaqG67R3Z2JgZusElmHNblaPa4nEH5zIZG0+IPVVM5zrLHA0LqjRZsRkdIvdRm4AM3ibSU4seGLCGEWEESQh0NR0PIqyQ2sG2aJrXTsryubNcrDxeIuScwiSgU2plJNwBgKBAETctHQv6ijg32CAZgxfnEGyhLc4UCsmEFFMfKfjRaaGtFUNYlCszZvw4xP7oIouOfXkpkhhCf0y7QhWT8tFwmOZZU/3lXvwWkT6xbwn1vyyTzDyy5WoTD6cDpgnnRILvf/OAuPDLDyFZc8UTeoErro0dlv+CwR9PNE+aepcCO/YhIQtZS+WXe25SnjSkD3fXLJObhW/e/0U4rzGbiv9E5f69J4nEPxoM9fM9XzsmLbAgRBzsX9qAA98lWC3xQdcHi65s3gVKePPiDNxaxn2CWT/uhufLwav8lovcTTlp16PA+Qs20ZCVfnaLQdt+92j91WA/Rfmeu/xMSxSvmivYP+9wuuouZW/g5zYyZ42I8Uz1n3VGY6qdDzbLuAo/3FVSD2A+xZNfYGNTu5usDWLcgnyDYs/tjLALlUCggNJUqPjZIBN4Hl9n3Lw3lZwzfpF1orMlMUiuvEEaM/YMy7TPUMeQJtt/EziorKm+tTbAADgu8FnOgBrguf14GBgPQZyAD604/xLfzZBsdY8ZxuIsFLRGvuYg1+PkqNYz0bzj7RJE0Pp38AcRftmxsQQQqJtiAUbpyvIPLOAQJJfDIQsbug0IwABFr4HD6mekNIGl4w/dv0uHhSv41uhFACeNFBrJQF2F0feLts3q+UvA/u/0PteEx2sKVXmndjUN98FRgYKPTx53RzjZDaaCSBJYrlKJiOqCM6osVYCahO4JVPZxYPiWZOVQI0Djm9BbxaEfByoMH+Z0BoJzNXChHsWrt9DHH4TdeWTge0/7wR4c9X9DbtNI2VAAVytPdJ0E2PMuGlW0pLpETyKMzLOBVpw5j4HQ1gwyWHyfkZHQAot5sL/8/zmkeZBZI+NZNcBxdaoyvZjF7PaDnlxQ0McUSZUk4z90W7Pzvu9HfMfRb7scJk41BkIgZNC98tFHt0UVUM7LN3q7zUvyM0AgbRwkv/1J/0DS50/AcJVg6l0LaeHKXu4V28S6ksVCfDAYOtz/FjzGEu/ff6+FaEOlIHd4KYJq+pdijVu/E/gSAYFAONyVAZAMAMYF9PHQnk2iETl+OVvPlKtJuXMAQA06sV0s2UojAQRfF3mDisr2z0XvNDsbM7cj17cnUAE0fchs4xnHOaKFubsCBoEETiYoFj6DmD5S0XMNy+Y+iIgJ5DpPkCPMk4f41gbs+wAaJiz4ZbfxQnXMdhIIv/HWXvBOkDgL7CuUjXX3Qf1HoGpjUJ0G+pWy8QyA7Bw10fW/tPRyArWGlUpBhw/KeauSAlKenRxA0dCfUe8/29q2JZekm9cccv6N5niGDX+oHvwOwBGyp/msVNtzJdMwDBUL4thOPu7z172c1y+LDxm9THkRXbcvWVVxYPHR9+8s3xecgFGZKEegNXJDnx+csLqrMtVWnYybDr2995yh8tkHKsrvcGqqubMKhx5P6p5JN2IpfH2LMtYKWf48huh28bbucu4eobRNxLV7lq2+uoRhXN5rh2XwieSC0OPKoO6Ptsk8MLtkc2gWAiNEEdJVjWoCcEew4IhXGQnrfVCTTQTIlACCZAwBQBAkD3PHgPmRkstpchYQQMI2jpnX34FgpWBIQD22MYeI7z8NDXAJTrrScpfRCIKEJedKyOI5baJNEbwinIU3i7wFRCwqxnETgRQibS6sVF2oLMmKiYv7yktt5JIw0F3iWUrpPJxzIOA0M295kB8E+zS5ZEserpbD4IMKq98UakpXfO6PB6A19e++cvy2siHjhG0II0zN46r8TjtrYGUuRKkFCf+micHVVYLh5zOejUxPLCdYk60fdmhpNlAHB4DrbkeO85Ge6rJAPQy5CdyGg+0Bzl5JRpKL3842oJBW1tg8tKOvV0frWj6bB3kUT6ZWG8WjMIJKO/7OO52Ew9OuIKIEBDCVaUQvOC3V/1KljjY8XWFRZ5UiDd5BmYQQMefNbM+EVCXa9F9zdcYbr2EdYLjwhl8DqScZpt0UXA7Nv3H87uOc9yNjATY/4VMmKN0Q/7ZjYNi6HU28LXrZi9fq6XGHBIy9cyZleAv8di+N/9rAq1MWXSicSozyjI3kj7JA5I01XPGuoKrRhAT1LOAezBAFaqyT1NhKah7ENaQwp2koqd4cvX8ZqaWauQLRSbW6fsjnn0WfnoUdCxXF+l0GGlqE+gF0ewQW3dJpmK3JlPJKaerfyQTMriYA0DKxqkHnvd0vyhSgbH8/HiTmjrApl5fdzoXFDkyJqIB1gx7LBtPnSwqzFnxsne5kKCB4ViIF8WiZLkcNP2ock9VZDhFDjG1PoX4lhPiPqmbYlPoweXMTONrjBC5Omqmg5Nm4R2AmR4dvZnTDvBbczFiMwAzTXy5Ij0wnUjyhaApGhKUxPsr++nSxWWBNo54YR6ljZ7AymZnMqOOsWLUnglz8QDz6CFBASeV5B+Z7xasnuYUUbN60QXJ1np6ke8B0y1KSjQRBhscD3vMWHD1ciAaEz9QM2yhU0p7juXSc+S7h6i2IY4ArD45adJZCC1J3sMOChuG5l6w6n9J2SkTXlcWoyMHYiPg7lR7NxvtPqe5rbaksKjugNF9Pn+jJLCHCA71bTw25Hbz5rA4xzfPNcc5iF0n/psYAIKszKfrY5ggYhnF7Rkl1C3E60EUiJk6edWcAXytLuEtwIK+Ykth7supnygXYswDBo6oat4B0vU5SZc26s4tsDBe2lYiKQe4LXyjEPtVW9pTC+NJUo9x/cHVCpjqAXk+Pn/DU0wfTLGqs190Cj72KfOD+PXS1XWu2ke/xZUZIz581RT3QGWIo3YyXptFQ8F1HNZWlsrQfSTGHWBesNhab2cA6BIma+u8R4+d8opLcg41XwKY3YxdN8qJvTCIH7DF35qorYOkdce7xJB1BQUAqJwkmugW6hKWOIOE7E6h5EVOr3UqnbT4wpaooDYU+BuYjy/jGL2PuoxMfba+Vhpzy8WdDhCSkeZPjSfAfgC6UWry9QGcEHBjAw0USTz2QkhSGPYfFtf+UsA4SMDtD95bEnryX/FD4TI18/T5k0HPr5bdpVIa27HZU91HoTIp1uifJ0NCidtbLPWG0OjuDJKJq1f42s4XIHe3Qe/eHlwWh5n7Y8KspsRs+TvUfT/N4GP2/QXXf2Sk3lOTqyLiy/zsnMP+ev9WHZk1qXB5v5zsPr4lzo1qv9vfXY4qssi/KvTL82pwvM6NsmGMd3KggkCid3T3Dc9/yZTuFoFrDLeZKXWOGF6GYpky4Wa9zKS9xjPAg/V8s19K/ftOACeR3M6Z5cRieP2kxNe3RaCcZtEM5b8GsSu+6qydF7LUz177S/lVGakHJKl8/+WG2e8m3q/eujxCWMnk9Z8cUN7SrYIEAcpSunDLboArlBNjZ4Tj2GF24cUetd9vziB90dOAHhDmMpLkPiSYgeO9++3xWnnyFY+2o7Zh7+JEwutf1/1oeKd9WNm4i1Z+2z8KQsAO+HOCQCGgl8NBIesYzacmj8OZbPXWrDcZCUwNdzglRYK5hhVHDRPL5psFS2P/Xv+ujGoT6klLOi0OE6daJXfEknS4kcCPxrp3lVzb8e7WnjzW+n0jM6KrXQLXmf8DdlGPvtl4gZAvcPADejk7QgBTXq4N1PTtyzPExYC/mChdkDPj75ApWMN+gvbqSZbCweGnzWSkXlC1I7alP8zaUPRc9nWOQBQSOYyz3juGue32nDZhOoG188WJvEcmwTmWIQNdbr+ti7IzUpgBmwBbXKd58OMqevQLETQURr9/nO/m4I1BwqQyF4SPmpXY1vWQWbdhl8rTXHsn4nl9iGfNvqSlXPaZ84+86JYkYcSurabEYoCNVwUG9ok6z8RioGxrYR8KSTiInOq1W4GAOStQaFXz5TrleVWfWoKt1rG98jGYgNFV3M4t2YQ4DsnDEiIElCxkuNDk4MLh/RfS3DfOZYvEV09z7U5+kjkwc2iJ9wd4UbOcmxSEVPaKuGdxt0+XpE0m647uvTvBUCnmIALZBXLoZIdVC7yModyg6X/MYlyiPJQyPwaZeMPMtP6o+JrX85Wr3cFs94xnObUJEn34nUbX3oP2jW/j/iRP3sonzSbSKcrpXyRZorQnMNrDowTA2HCfdZYBXx78KR8ZcQEwA0IE4vkvKLS7PUeKa0khjHQG6QZQ1EBa1Mh0+//HVqb7kKgUwcMRv8NxYLJNbT7fgxSAYdEOpf/eX4vRxnYNr62duMFjm4XHVl+OPMZ/zl/hG/UVDKws3QLGyUaK1s6o4z5vSUDLAnyOxupB3dB5QMGrk0imt036db2rTl/I2suKXey9HkKzQFMjFPee1NeGi/SEmNUrxk3oJOBDRwlY26Pg3LKutVsLv166fq6Hu2P+A1AKK1j7qEHfdzW0+UyP0pefcxm3+cDc8eakfKgog7CExrCOHxEFOqb9xwIH/1nXXlY+skZBxOdvvbY2pP+8GPxpnO6Ebz/Q4GHr42F3QFz448neVjhZ5TEEYKLx683GkI/z+YwVYIa00L0qOI5oPnx3lA1TiaRsBR4CoT8sLhAY+LqPOKkWL4WD2tr03QGTaK59JQvCUh+PR8+WoZCogBRA+f1dkGxpZg3sHDUTb0lMEBLpUufjFWLO3o16AY+n+bKTLCwb84efRibNVJxbRMRMQsPL/l08wSrs8uMsMaRs+5bZi5hSo+w3B/0awtC9wqU6/a/jzPP/53HNsTXzAcgezi1Za7mfLKSxXVgSePVp7K83buDkOM7iFj+tjVQBaRj8Keh6PxI/h1S5fmn+IzaevoiDZzdakEpv7+BjcRCA2rj5/KxLpRk4CO2r0nvNaa/kQVJTHB8SMV+qQgsghAjAGf2xB5RgI93k7UbJV6E9HejlbIKA7/46sWx0X2t0TAzz78Jgp3H0kLqWjtFQy4D8hssnvBkukcMc2dtxIRHPKQuAni6tm1NdVKEd37pwtxUrxMXbabPdnLD0AI17+Lml9AtPpMX+R2b/fTEhG3/qyX7jAcJE496nS7CTfvTl+mi1mFQMNApepIDXPTtR2brPySMxFrzLX54YYfUw0TE2L4zjWVbqluPHLCIM893ni6LGNhRmEx20ue48fK+fnWPYow9vuZGZkwr/W0W3qpm1LU5Gsd/todKg8iwy+W5dXA2Oz5FRNj4RnBzIGpugpfCUG5FdYuD7GO4MUGKB6ggSNOL+yVTaPlI+HMcxWidaxR46MIcClfnLX2+YkuluuqSBMePZxmQr2uJ3sXCKR72DdQVQ4+i/Kxjc2Ux/jNB0CAfuSkDwJ6V70PKgjIeTLIpDSVb6c93nKFO7LGIOup803zOOF+uwsAiecXVmRr5mtmff3vIMbSgmngfyncnTBaFmAc9hy/+7Ltv+ZRnN15hHgm/3R9bogkgJ5kUcfwb28jPTZA+DwbDymRq99nTV98qqm/CL466RaAWFseXhj1AY4vjZ1vzah6RGbaOPKquOrLX/y/Rvir0H64fP9wOgRjyrROK8YpKFo4Xu4JrqzNqNH0r37+dUJf3r8y2qyuhW9C2NuAFAHBC1Y6MeN2P1jp/zb07Rt0/GQFTBEQbowewFAeS4UYymeM3F4xSwG+IunZH/KiECiEQG7UbtBUZcGIdnM9yFHuPRfHOJQI1TPrjsdpFwIYglwjiAfz+HE0Skm5XiWhULwkuOJHemluSzzMSx3N3M6vGWrptjIOzGlx9CJg8GpONp9jgoP3LRd1yZe+jarcRO8zVhIUABFBITwnAYQFPf/pgnt1IeE/cg6rTq4OvMmF9DlQgwDV22E8N2ZNkCAyDmf/DMuFst8EBc8qLbO7vz9hs62JkISQgAc/SJwTSh9wlAyAABJxxN3K/U5JkxDNFcrhIgqbeapZQ/MNT+Vm7KrwsL8hsZV+200tBdqkNLrXiAmAhwFAHJlStXhfqdPqnC2FxekB+NnQSGCL1ZJEfUAOT0RFm4KndTQ+Z8SOJBtUW70K2GF1Qxqbh5rXHXrNnCD/XmbWWapm/ut06sYdj/sqtkkEZJ5eUFHopPu+6yo+I8OzQ96PWBhiWtAuC/x4e2/NP5IAqIQpbL4/hU3O5SjGL4Fuy3//dyMstUOzsgTvLC2yrxb9ZVnm7ijdbLiwTqymmoRdaw8g5nTOak27gy1+Esxnr8Yb2IauZkBoZ9c4NZEZGK+Q4aj2HtM9kutrpqwgHosb1WMf9IcMuXQr60vNLHp7FVMZ3xM1axbmfNPrDTxbR1s40wT25LFOll1QrD52/+MWhMPCcwdJzopP5DaOxoVnirPEc0ckA0Mv3pDAZnPYnGNMzpmGUCCfPiC7oqd+frTGlOxz4aFMrGtsha/Q3Hu3/bkUIAPD6pKasGzELhUQV0r+w0syok4DiIgxQKsFAc2Egi+TwhgbaR/9aVPvPZSWoEoHZghCAjkBjV0/c/AuIb3zTV3jeotEPelv2norp+q95mx1sQULgku1YXBsJO1czZ5Iq3nTBUrenKOX+tMdUh6LF9dVxyKwb/TA7zah/+MAOAWcR1B+J63tfaGYIvBPPbvbbkOGmnLLv9vO7908tf+DgBENom4nyZI9W0QQ7AASn052PhzpRs+rQzYL5FTJT9ptmGv+3q/s21bCwcn/6uOuO5m+VYuSm+LJUAhhVVMxUgomxxzpbz/6duURRgYNDXxaDM9lVIdCOzZzMBqNp99EnWaGXmlhAWjBFdj6WCvZbli6UYjoPZLW2iFgeh1tXgn/Kw3LzL3TzFCRDtNdls1uVTeyLO02gFwJTq/SoybuPFWdKAXjfy8JrrBL6bt1kGj1CqvHmMJYFfCYRxX8Cg1bFYq7z8FCIU8qxyIOrk5faTECa4GrhSGCoKXe9em7l5ntkhVZextmTZ2xm7lbHWHkD3sTDMffEV0+GQcocQXt+zDcuEMWd+3ggLNFlNNPzzWmcUG3k8jfnH6GKsaBGxClzg8aJHajwGFRNMNyz1SAf4zLfL8o/29+ea0hu3M7Vuuq9uFz2o3n5TySavxvKbasp7TgNohLRb668k/jj7a/1ZCAmK+Bs9mFksDFEYRf8CWa6i5hbMzoTLT4FsMnxmfFprZ00gKrRWvIBVIsTTnycLruo3XjIWfLbdY+rlv3gSV715pcA06eHWiOdFHS2XIg5PPCtzLYJ1Dxa5WnAlRJ7F/Qnc59V/jTORQ5ydkRmzrW2tUDcVHEddPLQI2yzKMcR8S1cujVpTSWDniBnhu6I/VempnLDt+fYrtrFpBn93KZX4JAsP3eCG7HEGUFnZRoVfRRFgNxOZTyapdvLvswZWeWctj2o63vzr74YTFU8Q8uQNYGnQaOKoyJM7jRvWYBUqDO4SR1LRX5OPKYu/vTRlP7VmMyaPBxTjKaYRBhPQFkqLCVmdaIljCBA+U+8qW0qt/VTG+czZV7ohIhj7lKFwu/XCYxqu5k2IDwX7DvScHzjb/oxEPOs/r7Iho4V0qXpBS2nLZIoIrP67am/0i6yX88jE/7kkFOIQO9fiWl6eYQLAqYGXU14gOLmsrBTC4K1w3p55OFbUm+Z74cqbVV6h5rwFSX7FiZVR2DyZrDlLE25O4N96XXk2Z/VssMZ6fkOhkDppcaSDI4SbxJHPq+ZTTO+vd1ooHU8O5MWNP5ZG5ei/n4akFIUiFuAv7/FLrMjK/8w1u8Jw8lYCcazBY2lNzb7fQySTKG9xAqJb8H9ylgSCh4+tp8I4CBCIrngHllg/NdoQx9nIb70eYfvH58fbzt27oYfiNqFokTyjKkP9DCWH/XwCI19O+8oCdvfix78s5xggtqQGI2DpZcIinxNLPfSR3Us01EWFrj84IR6RsbXlXyriT0XBflwRAQhMxkc/pGsdruCETzdWxuvu/P+U2OWCjx4oPtKoI03qO2C6oPb/KlDE7V5JsS5LF7XsOGERsPT5bIvuN98Kit252Ub1fT51imJao299UNAe3qyg2hr0VmH5xMxtMLdhEf3tQ/zTz/QD7cuuz7r8jz5zU2KLkyie6N16cEuE9pSqFWOb5P5akLpOLOlrGZrCciqYXNW/LLtvWdWyk38UoHL8kpVU07KJzJy16/hBs08E/DPnzK2EYnes97pSuGA6Dse5KyYX+yYF+azj5TkX5F87VRQpjFwIY4Omk5OvgOlSSTBEcSh+M7NvodYJBX3iqVPMlZ1A9iK69PNSb/Pcmhvy9S9lS71arzjfXxNINEpsMKAhinMBzPp3AznvvMTgE39exysHQIbphtmEvV2TmCxrIdPGAyGZmBGvEfb/leHMpgbiWIM27zwJDhA75sd6R3i6WdlifAxemJQ+NO+xKN95iq2ZsHdNLwHAW7J5K/mTz2SC5VSK4YmpKT1yU338tFtpdTq3DWcrs5ezqxdH9klMKGMCA086QUTCnYKYHqqiv8jbVSGeHAAHnd5l/UbhHoVCDUCZorornQL1gKSpMd0kr4v18leVgQu2ur5NP/znkcQW4faBL+I9FGUf4rEq6CYPiIkiDEIijIMZpn7Os5wqripcFu6FnlGKczI4HMdzjwnHmrMplI1fwP/9fDWLvg/kbx9p3pXNbSATFl9WJQYSeZlKfoWRJ5FhRDvB3WVb4cvKCdMrWjRfEVzNOjaCsxEIkhYqwIDC4+0DT5NrnFNDIPvxp27jmGjD3JA5GMFMDvjxq36vcRZwys3d+gSnDXU3fO0rHTxArGzKv7wgR3tw6+nxIYRa6Q9bgwuxFW83ryrdSfegm9JqEWYKixMsFicOz0i1y9p1VNuSFQyVG8yod32quG/2a73QoIUEGYITbe8NT9SKNOw42p8lSRl2jrD/cXetKHrDz11+BhPsmIGa5+9LhOO5PiXW88z2gB5r4fWbTEVpGinw9ofjdozJVyj9LKvN3V06t9hsbyphqcuF38MUapLHYvK2VWchgYljTXeWQ1v/jr0d4Bip+eybyBJqNunMwIfeiRYw2nudWZAZK2Ec69BJDtU9u1/OJFYv9O6AQQAET2AVbSZRiep5H0WlTPrZPHBvzeUR8AS5Lvhw5LzSirboxCbcpfOJVoYDiErZC3ubn/1eObO6SEn6vNboPxExDZwGZIydvax2fgQmOG5Bjmw+hoqOnlNnEnRuc+d4/2vNlx4b9C4CYUh2ybZJweZYsHXsnPNXiPRbwbEkPTfYUveWRrqcoSLXzC/1/xIB6XkMPUI9ftnr7rUOnAwiait5uBfB00ka1WAl9bBdGDNzmxk4a9NdtllEz0nxJEMJO7srm6W095Go1n9sqCra5qjwOKTqq4PyLJg3LI+D+N8uWhCr4EX9YzG6ugvE4rcFxWKWNQBeNxNu9Gvkxl9cjsQpxgOzk4DzztCTpIHk5etOLV0+KXfZEsYZJ2IIFBMhjKLKYaVEV+QzO5YEHXboAqfCUg8jldrpVGNNVFAAVlJSTg4h6KLHRfh/ScWH95OR9GW63hihRpzgkhBZMwRResXps5EghjB22V8/7/lTwfm1jwURy7VUyAt/2I5hnwz6rYlti8ZExLLCxg9IyUcz1H6Q+DLmlrGYGMio/9FXRX8Whux6xWnLiffcbY+ELLFTIdEIghpQO0oeiB6L/nZrwwjEVAOUbJECOH3++CemTelWydGZakG8IG1FagyF2lfUoT22+t0kw+ZorzsW2NJutl1EdizDipqv8hoMlPs+cQywLIx//j1xm+Jf770QMUZjiq4pDGijdbViGG9NWy5JDcKAGqIrRkCTueU0c+GLFY4rvCYpJRminZzeKsaxvIASrcBfV+Z6vGuZiUuawbmu75XicdKiFwrZYtKYqHLD84j2jsj+JzCGyWSfNZZJv34qA73CwQMGZ+V4qXG8Rpiw/sTz19fvbp82VVw3QVEPAUGVO3lC9dLYDb4kEANxexf/jzjIqxF4vHs30y/w2OYWhSQXQgKAzrPdCc8K38YpWHmF1r3eg/bDdlncVBNoAEvkJD9FuWzsBAJEtuQDE2Q03aV6ftimQwGTH3rUOfDXH9hs84JcSM98xqyfxDKs+VrgLxGv19j1v9zlNn76CjF9rzxbW6edWbW6Qb2YEPXqgaBzvT2+hUnG0d90PdwNXskOF65qezlU7K8BX8xPMs+ipy94fMcTF06+eCoKxJM0x6+qZZuHQtDN55QG5BKV3wZIF64zF79z8IpWuCG39t103pXZ73eF9GMGDluF6J7TQIv2z6BNEptbn7Z66pnf4Fb151NVq6N9xKau7IBOgpECY90U7z/dsqXtJITYu9xZoRiNm73rN3vFITfbvJgOvYIN/XzI/5p/tQ66u507LpFkf/K/aXQp5INN/NKCSdacTZK/IEEGYYsbbIcqQedaU8o6jXt2GaN5y5kStxLHA14vj7UIo7KnWnAV7LzWPGngvypx33rxDDt965LHMvH1mM4KgbetYu6sDVnrV/1wY/eCVdmZvyHBG5pbSO0NSfNLNIt6RGd8lq98xQDinTFmO+aCWVSThfstMg1ulrj6T9OUrY3+EjrEZ8ladheuibRynJPN7Hesqa26f9bDqSLzHmZnIsPhROLm2WNjalmlhhJm4uMYGIelEDRH89+AR4ftT6wzzftQ6Ca/egLG3Cg3ulX/4Xe4VLGj842uDbKTlXsayklXQNWCf+dPsWaY0hrEI2dli1kbbh3pTk+jm9bmoWpGJMSmmOPOHI4dirFZ0jCSt2M4quAFKe3YsfZx8WnLp/tkfMgP8+3B5D3G++sBYuu2TLEIHOFKWR/bblqgxeQqF7x3YUCQp+NPSKy3xmHHXyP2c82CVvnK3Hzsf4oojqQwCVwM0H+eEELqSDvCl6hCt00rWJoeeOhhEdKs8/KZYCvwi/SdVPMeATUyOABgMMw28070jVHcwGCyokZwxpToKQz1+DBtdgOtz8UUHxxESU3ZG02pvAYg3PdhfdvT1DLlns4To3WTqtJTQ2qhsnaiSKngBCfdhJh9Ij0PylX5BcHqerzlwv6QCfUE1ehBKWaE6G+T4M7t9+f1VOeYRL4Xl/24RGMRQS6iEL1idc+VsMb+vzzqNhc+7MZAwcCAU8lyEhVj+1mkWgZM2Om9uGDF1eayjo6E1Tf1+uvXDLXCLW/K167t507FsUgPpzP2wYF2Argv+32BdvA5u7NyW7Ml+a5qaVY1gJMqFSsxgAP4fsPm5gqmRiNCocO2OdGdM1gNW3Q/0z7E5V0NxGySyJezF/MGPUEO6cRujFYbiEIEczXDizSdDQio8aZbqLejnijRQcKeEuidYqPy/KkAAc/I0/SvYigpPr80LYyN2qVKyfqZUVxzMYIiE5fbIAgifQg6ZOt5LMr0+4Xt16FFaT1Tf+2V1xbRjhbuBaK76bVCwkJ3VRE1ekBBNwBA3jtO+Wj1Tx9HT5/KZUTKbDFzAs9Zvm7J/+zxc9bHbZyofnvLwkPaPWJhOdSVXHOzE3Q6w3eKfFdLoXmQtU5o8MiXQAIgffY2mRRclC0HaZkeBq3+41LuSFGGhfOE57zOlhoG7d/6y3STX6XeZIktwyXmA4I8vgjO4KPfhyO0wGwciJFj5Qn2ZzYGSapWJDjEezD/rZlTOAWG/bHzX+L6ybPcLytPwJgUceKnBOtNbl+SHwM8HmX9WUwgdDACOEFbOQUb6801Ftq5c0cx7pxuIed4QHx5tge5RxBZ5lqsv0KU5eHb33b+BLArUp7Rnt1Lgoh5+A1Hvv5oSsNkW/jszoeE/d07Bkdw9EDLzFjw6ybxoZOf5kTR+8xrV2YbpHPra9S2i1+Uy76blSxjWp4SVYryNDkxU9IJFEh8jowLwD44/OGkP/57+jD6doNmXYa6kSkUWCoO3P+alGDGHv9idLvcGIREwwyoObnFor0Th710U7CEF2gfTVzK5zLy/MpSY/WVSzoKw9ayNsHaY0sPaiIO+yp2bJ4Te9x3JGXd58UXa01zfJtz3l7JY89/6dMdC46YyLML4YaG2wKT3TderchGusNixk/jqxOqpmUgkvy3TwdJSIcsCh6NPmfBGneU0aoVAci2NSUJJDuvhVul3uFNNhbjVAJ9hVcGm8JkIkjjW3ErcnwGOOQG8+KjxmcDW7HJLG4G8F++0cB+YOOALn18lt2lkD3RDR8qlo2azuiTCKcMVFsABnMXg72R/Lb14YQadhUvju5adg+ayzJEL7qMkeOz8HcZeqS4i0k4XRLxHkBCcLW2CCiCVaS2EMRcpi6HNy2Dfw6DTXKhxMjcz9UMPzz8zHOr9ZC3ZUR4Ox+TKN20r1NzPXUseW6LN8/2y9ZWyVz7wR5w3qbs+MGiA7HmpAUtZnOJ1xNumbTgMt5UCiWxASEgaiNJ+OHA83VUtgclxmCp0jvYveOab7i2mUwz6XzhP53sWTtWYzsCZlqWdR5s28E8fzvs64xhlWoh4NhCczuMBKRoJJudrX5GEsXJRK5cMpOHM4CJgC4Jio78W/cjq94+l/gwpqRTLfAr9PMbZzmBJPzwt3oTTqqIMVjaIR6Y3TuupdSFRvur5YVH6S/P+Cc1+AYQScU3lRHwniP5223CTizEvVkSoqCm/MZmF6zAO7Mg3wRC5cPHJ2CPJ53o5ZVeXTF2PH6TCMjmEe3m7GJlrBe5OX7KC6svOsJWjM3LnQU2vUTeX8H9Ntqvpa4LsLALPrpiWDN27ILaHdVR9OXSyJrz6C0969KUU5a0fC2hy4BPDGhtbrKJSDki07w8hYLyJgydubkKYS67GLzYXG2TnKlO8XhG/urFKoCLQRUv4F6YOmj5RxXhiUJ7d1zj0blkub18d8XQGpxOHd68cv7WMaWVVHNrZsp1S3jtIQaqiV82/zgJgsN9HanttqTtegWZbpceeBxCMuLiQ3cLz7m5LnyyCLT2L4vOnLIcW342HOjvmm99cBzm2bihY22HpnfB3bOzkt56dpmhLZRM/AlL7U/BoV8ESiZ3NAw/SUa4E+8WAjUO0Ul9gT4Dc2PyYU0CA70nh5A3h0eV+Ul3CcvXEUw6eksZ14itVJ8+ianO0l7d/+tQEuu8T7MiDmQzS0E0d4yah2SyJv9ySjRnX2TEtsV/RUxsMEjYlo51d6VK+3mzRJ95Rt3dPeH3hwQxuXLIH+fidU0vdoU8IyeC6jqzutBTkBx0PRS6bbP7rTJ6nxx4oaN8jWYkixUIRmQh+ln5j/RTVYkANQgJhHb2Bquuh6qP531sKZyTpdOyy99QSKva+x3Z7Ok81WbJToMsibn9T5ynzpzW8ghSkpyNgUEnwS9Pk38OXF4t4lgChgJlMhAGEgm4CKHocnGAS/Ey+VMp4j52kRzMM6fqv06YkIH8e66H8tKT19DOY5KpDCZSVfkwRmqkOOoIFoDPIV74vCzmPlUfviNwys/uZbf6FhM504cpRF4lZZVHEpUct3KJpy0FqogeCoMC7erFgBqDi5nL7WwuUVV5Ft83bR+93ZBOpeK+Aka+/CSRmFaVjeN0VRKzFcJke+PjS3woMWXaRwSqUMmma0BNFnXszVUIktMUSxuAxn7Ej61Zs+AwAKP7w8nPBQO7W8/NTmSEtpdqsT8zDfscjc4y7PQBPG6vp3WIU8y0o9uLSp8cHl/dDtbw3N59tJUWQtHVGyjWKvcHhvqlSuNnAsjTak1i+S7LGx/wnGLiamc4XCssc1sd2/Vkrpa9l8oBZRWTUn8MtBq42yX6LDRgIYqVzXhBVmWKOWLAe2nbdxyCgLh/a2sEqJtgJ1M1e0byAVvw2dT83RDVdCiKF0rVWYk36Y6deXzmSlPvqbjFbHh2751u2rHZfHpX81UIEEzDfY0iAQZMM1rBYYccHrguke28wU0fx/zstujbWM50XxRUjejP/rP6UaBceiSQA3wJBWatgQ/cKhYB0M63KPytLzDTp5xtQTEj9HxS6FpTyZFIo10xoIbQ69C1ikhNe69IEZXlKCFkk05CeNZ7WtbQ7FEIb3nk+U61yDg9PGKtsTIsiLz9gBTI9MwC6/mWZHdcGCrGPD6/IvI3Rew86/+15JACB+PswyYQMrVPx5qBetz/ePJ/eR0HroQIm0dnHZnKvb3nDrbB/1mQ3FYG4qBBqgAEjBAgauleeIRD02hs42+UamT+AjUC/rUm7dbduy4JYwYGVe41qwoyGH22rCIA7Uxj3WlD+KffFiC2XBYk5Qc/uNurwDpAZPXRv2c/Zl/wBLa5GLyQ2fKyPfrHYfkLMiN+65SO+TPdcgDeV90c5cKWzS2/LgNDThqvqCDiZAy73juUeeZeplmz/Gfmzi+9mXx/iz3gAXOQmyq3T7OJtmA1V0l+aJvceKiwWU2nU3HTiKvLrk61PuOq23Z0bFJq+Kl1EUV0giDU3CW7/aUH0GMy38TF4eOdbsp1gQDrNmCFKLjpR5I+oJ0kRPlhUUaNxDbIHXNrMBQWFyXCuTxVEldYnsc3fl4Fdthk3D4fkxEppYUXZr800Oq3od7eKyAw2v1Fvv8l53qPVyNx98sqHMuDSSYpCfM7defLjXOhvAyi2/a5AUL00cEiXtgLp+FRMFPLO6FuST3jcGXmYr9Zb9M2HU6+758wWwveBW07rso7IMYOTo3dvsFf+yKJvWksycKGnOLsfzPc9FGUdVlLCiCTOI3AU6AeqUchDnwJGJ/INtVwA1Zddy1/4XjNkr7xZBijtOvz4O6XPV+cM5gX/zgFOqX9uUvQZcCTUEIJsjv26Z5syt8+89WHSPKLoryi9rrPW0MVZTIggwEmK81Anruid2+skiOH5lhwG3B7uIif7+iS7xKa5DfzpEmV1ezc91Xak901C+m2jKaN1XnCmJHcWFdLxUyFvEbu8jlRyBjngBIJfJbD6ad/q33j7QFEvGIUldeF0IvjmA6uJWhkKhjSgCIpk9Glbujm5YhB/7AerMZAnZvQ7mYcm6c8jhyj0zZQZOXaqPZmAOLmNe3Y2Wdfdg2UTeB4IcYJJJNtR6XbvmzVaZcdtEVEIPJlwJfIcvkJRIQArEJqK65x7MxkERgaYQ8JkaGEwT1fZ3zYC2zdbWwBfUgzcy7pEsqldK7fHwEyB9cri1juxL79GiR6MD4zF1lN24WMKd1aYhGEJ0Vl2ytwyT/BlX0zypsQSYe3a3ecors6bWR9Tk3OWZpXXmOwnmr58IZvE7Axugl+lUdFP3jgrVjsaynm9HrqfQKVGgtsAsxuuYkkbtSDm4je6K1v1CMMbP9j9eM0Cy975ZaA9yasbf/LZz/gqRyuH/2CJm36QQYnNubZ+5c/jueyivfktnPwCrRODLp89l7sBTkjF5FtCKoVXRCTlZHAdv4STDCV1jNgf3LF/OBHdazHKcb1Lo027xMiTPC+OzP30a5Vz96LNE1y6eYRenAGfCktquo2Eiv70xQp9KZANKUe6bISe0wQUYhSXFR1aTefR1T8W0UKtC82kxFKY4Cwo+VYFpW9qFgZzVEi6VlcLwRggA3tax51xwLtrh4p14mF9frnipGfzg/CEhAkot3u2qxsWIFCjIJkHfBoLSZXFuP4TSJiHOfFC+E4pChx9mabEIEx+kllEuLODwVmhSSpokc1qqmW/ryj0NiGqsYm9A+HLGlu3XOVKM4odSD52eU2LmlosL5dGhSvpfCXHXyiQ8v8G/a0ZGGQbWdrTeI23xyQIKxqDROT1JQpGWXRSGNRhoQRUsPjZgDUze6UBmw4mx/dbDwf/zhANYdfrwRo0BngPokFc4LOLwrbiAB1kQiFAIBApPKclXgUQUGeHBQiAeYWJM99Jw9wuGcTvZ29dYEAlQBieVKW0doeVv6UOwp923y2K9PHAopuHgQsRFkAPT//ILGJV4QD6T1IUEsIjAoqGIjsa+6RATXtMuSrVmz75L9S3eTeNlX5bd1MCefUTw+DOAoagDuKuTfL43/fsAr3RBCUHr2Wn1CfTL6k0F+bL2ZFGOw45utmkZBwiUzumIGombkpZuqM/a4dCIAAlfkHGZK8lhnJrovL6lcdMVZH5RP5a6fnIe0iMs3WPdfOO1BhRe6QSLxAonsCiqx7cJqjorDWSZ2RqJwcFXJKyIxnW+gI7igbVYURm+II/BM+BXeLWWuyrrt7X7vdvHQaEYD6C/vMIzI8EZRrZ/iU+1BeS6hR6iHAZVJHFMeBXMhgArUCLiiafokI3jGvyY3cegC8ZADka5nKWfy1oxFGFNi3DygZlDsvWmsScCBcOiuVQ9vJZVG0AQgkQDJWEMgEBCALbQNR+bACZfvBkpXHRke8cT6GhUA5m0CcCNGpNAMtlOqfReTHWnD3zOLrbVQUos4k2SSdGmmXO54FyG4KPoYmzujxMJFjiFNEtKD6bqYjRb2+uwqs/kHScED9qItIad/6K97q7QmoetXbW+dWJ+9YebgCvMDtmt6JTrQLEP61kqLn7+6lQBFG0aqIhXnLV5UEeJe4kWiKvN6ZXPfKTbzkeAzGKBRPwDLFLzOph7ltETixabfN7eQaou+xR1LYxqCAGtveABddsjS4E/i15fIyCPLza5g0dO2/HaIcy/TgxPvrMcw+mge4oFP6H5dv79e/awWzZyftyRfS2Iv+sf5+Kcrm9wwd53tknzC9nVxNcrn20BYuIJGidbARh3p874aIs8oiv1p3rURj35x4pAC0zpcmGpge1eF/5/nzjIB1Mx+TFgijRAlW4Wx4VYH2fE3YZfTmk7Vcto4XwvY/RTWz/u1FYPSbdqu2C3R9XxLQDCQR6ICJgL35Y0N2RiQTRkSAZBALRml+0kL3bLgDKyQR1XouA78Of7pFQ6l8wr7M/qv/zKoCcLgTtOflxQ3moKS9QaMLn0ZQHUmhuIwbmQUa2fF00+xpiQsCLgHwhBnxFMdYpKFVk/NzETXT31LtHvuPcAtLEXx8Q63j7oMRi+9EPIFXXNy10tK/E1eK5ZHONhm7TUNoaTHcd4wqbk8XaK6Ji9tZjZCdvkVPbFVzMqNAA8dM9MLAVemtrKjinfapkcWRuYRk465XYYIZbNwkSdsSdFHA/xkduwfDrhZjP8p0cHAnmQe8+0u6a2KiKRdoU68QNZVJuwm2fXb+TqG2+tVM2QICv9eNMwnD4rC6bgQ7ZIONR3W9IKCwAHGy7FjclzC6NQHFtifF+YR+R1F7rcwJkJb1O4XLM1xThDqBKg1UESs7DkwLQ1EDwrl+NQXXNO8kRBqRJ2DHtDYCWGdskJpSWEBvReAjntMHflMY67KtV/m0HTctEbUdOSize3Gu5urjdR4OOZreTBH+1VSCyL6aszJj/VzGuU3tPoFnk+3nwQ5K6eGqyUdIxnY/ZTLGPgUHCzYtinuN94EFk3v8qHgs0KEQuBNOXDwf4KyHmBPPgqQNrB1vXimrRg2E5mW2ESWQADwnbZ8+vfszZ66HTq+sJWJR9YHyIqoz0Gc/LNbLMyFkZM1RTAaAoc02LTWb6kHHT122QKCN1LZkAw5kKH34EIhoItbt1E4nEneYWn2Q4FfJn51qxpXaxQ26aCBHZnW8eaPg2UM4NDTl8bgEmDo/S7pBwroL9qLM/zy/mnFJFj5efT2emL+/arOTagrEqN4SMlBUzqzbTAq+ycpTmrKfLKnz8Baz4s20DC4gi9Z5ZCcwQe1kyG7PAOiTPWqwxHB3t5K8XqLB5D3yFRYOMKYUtx+IslF5RtMtrB/T51uniAsfrtsIQNbR51E9iJiByeoIZJN5it0zsD5bJAc7R5lKjHenY1tQjKMGGpy/CgINDnWhHX4YSOV5VNksuMF1FAGs9XQgXFqvWs7BZuHQRCelAowNMBMCN7O5t2KnXAasp8/W+NxzRGaxDNpagqPfinmzNjrpxusyq/U2Gd5TyZM2TR3n79n5KH9ebDSPDBD7oR9tiwZWYLFtsZxSyWUK6qRPoBUmsDclPuHEOQH/WqmGjlJV4OQX2a8n20+H/L6WiCcNbZTjIJUc1UrBzGD/RlwntbS0b1xLxDL8sPomIkWioKxKjeKZsSWkKGpYaSE/wDJwbiP6urW77UWqHxgcbLMxXAuAaWgGEuITGJdiGdWBEOAPZD8n1bYT/G4A/hKHpDK158sPFCMPddwWFuQuXzCOjP/T9VFZvpEXZOyyp+ijYAlSFvFHLn7KDjKpLymPBPNqu8YFbVke9x+MzJSv1xBBeO65WyeyqhgUyxTf53fnO88awf5oMEcYE9gdGaldqubHPrx/8mak6zxxi3+Iwa7Rp+Z5WcZfcvFTVvKf+hL13Y1JZtmPFy9EnaMsDD4cTE2eO0gGhShqPdpFRj4TYvc66iEz5mE/iwgUnPx92nfVUNweNP7+Hk0ur8h/6PWvcgNsIFzkTXD/SEac5mzugFsHE0odh8KYlQCNpSQRJ7jvPRCDKGloKCvAqeA+1y9KH6R2D8DHnu768GxRj01pacJVGbZeOQwA2/v6o9wIfxeHwYCC2iKzDAcLU2jOWDZHu/PUymjgTm41Gdn8LhOwVXaGDTMwdcHIkV2HzmPEpvbIbiPuUyDQAo7JWN/MGDQXDjYjTcTP5c/mEIRaZJDeQxL6Oad3XaEKbrrvCf++IJ/g2PVhoQSuJpCytfh8iOphUb9YLwmwVjvB9GuxnSAvL0BMseyINgRULx+H4r88TExPo8Q5UADg8p4tVlorjc6KmDb5r5PMs9gIyvOJucBc14YplGWoQb1Th+UQ19PoS6L1FhqkXcumh2OOsdg8ISLHQXJheijJfvx7b0TJNkrmKZGyIPe57upZuUfHo8xNS1qPPd052P0zpaRcIkVKlYFv7YYspKCwJvIzMzqPzQQoj/18NVp30T8hE4exfGn8t0/hQGV2PWbLEXQgczl2HYvN+J/LfH1904a/ez91Cuc9e+7G/V4YQs+8QK5PAIONRbgP2Edb6Sy1aSxUpJTaYhJSVtE9+3CHWHFwFETZYpFMJizHBqni1qz+g6JcVaJ7WQZCuUpxigD1a2mYKUDIQAsDR5C+wkC7U9Oac2r8OjpkbnzdHR+LXInKYGePvCneb8WgWoX078Dv3JsUcko5UHcr9Z960jMMnOgc3GiirBgcehCN/9M73yoTqPn+ayNpnIpCw0PRXNTD0V+UwnFLkZFJ/ayNG8/aRj+/OaYFw66PIghfxWakHKQvhv1i45djpkzN0OfOGlX0mdmO7FjrDK8uRYyhf0MKIEjGUxxLgZwKiSvv3So/zmH4Xh/A1AsfAPBP/zrLYMtInkFNnrOWZ+bT7/rpDtHEPIUHC3B8N5HZs+linR+UMTQ7qU2yjGVEgg89qvLJbFWjz3T8gcB8xqP375vVV6IiaHqvqHZNNEmUUrLT0yFwace7XqUMatFQxMARaFZ83KCC0IxK4CJGOp2AeJsWnuT63kgIU39qZCBcu28zc60pb8Ex3Zn7YtP39NxaxcGgTTRzPtMwqTHoq3TlMehXPU6PUy44JB47/CTOFe75geVHD5QR801M/owEB33VlWCMRRBipt2qR0Wd+fH4eBvFZusVlYsHM4kzRKFtR3R/YehP6rdIX5G9OPJWk/wq2OcUESOZa7QDU3OJLvm3Djdn0SoTPYIt5lTvfhUhB3Ehwa7j9wRbhZaNMTY8JrYc+XYrxxGUqYqSxgVfKwguKb/G2Dj0T3Xnt5EcZ1lElKJeTwLTql7b+JzbMVNr2ZLmFsxbV3n9tlr/BAz+yHPmmbysvAFU82a7r59+HJ/BDV32fp0bPt4EWpghVNzEk5YPHs5ZLt5mHWZ39C8ppe90eCoP2CBccznIOcMLc1myXvU1I+Yq/lHZ9wjiXtuo8ocgJ8q+zNmtmxkrQ0dvpJjDknme1/7u5AL9VvhpB9MmCGIEKfVGIj8gTqIpE5btJ0tB/sUmlmzEWuGCD6YFgqQQkCI4LIMpIrkzyfTqM1O2OxMl1024beWzWYijzvGe980qW0wMpqS6ktzeaFaI+bMeMKLjWPxUduxKXydtV9/DGS5w8+je9ZTTNf8f0ngUoHRDcTP8nyF/88KlssdszpWDPAKXv/WPj0UJZX/Eub87gz13XxjzP1lCPkWsF/w0Xby7YQAFkUdKMDuc8KHR8pzppPFe0VkyZuSzAt00G22inzIqZcMf1a8+U5N9aDB4tPGB9Fe5NF54zUtIpMRPSPInfg85v8eMzJ6Z8f9Nr/F0IWbBJco4DhPtsTe2EA9cOVZvGYsjFPn4FMPAMVPecMDxederDvW5FmT6tdmui0st2BJZrichkiBybWXkc8Tj6pJWox0yrfGpkGXmRbCvQobQPS9fNv3NKNkCFrtTs4Iq3kh1E0uqBU0jGjyrorlSr+W6ow4Xzocur7BmBQ6uvfYxA1FVQreI4ycUpw+9+5ZDNplpdXkjgKsrNlX+QZEJv0groKnRVzNX35t3lFMBRu9PuPsRLNiPeOe/ffA2606X2iJx3IL8PVf++gUwXVFiZsWrUv6iRsGWEyGPNqvZF513uo3LaCVHgN3j9xvmY1lesWLnIq8AVdAZo3wr6O09sQnPWMvX3rw5u+896Vnn0IJ+VwI5Xnr2r0kq2dYztwCY5k+yGl4WZ1X8b+8+tva6kU9RBs5QaG0Q0m6Jjx8gLPLY4GyfC7GJxIBZdsYEgM2aruz0LQlZrC7C0OxMb8zkZHWZ3+S/01VX1J7fJzq3OSo5uM3k5YXtIOhg4s1XJdTssmP9H/qUlpEV3roQpU/yg/mrPm2lSjMzwSkB0Sjz7oAUpm/QBLH3VlIvURm+81CGCZW8/Jga/P7P0WLW0YRrb4upOWVn+t+uU1hgx71NxQFmkWZ/kftdfxBZj65OZNID84D5PRcByExWg3g3dv+EcITIwHgcVM4DXoej/d1QnKG02/j6/0n2h/3MCG27vMUsPiKhCgNQoBExtn2IAIiMYU9PxsViZqFJjN+/Osqs721/k6CzbPZ2RTHShuGerx1/BtpFHbSpjltQqmqjzWHBsAuhfpWMPPR8XI+frdOdb5cRMIBnXgOjDa5NPGSLrW3PPOL13YE+l5rNzG1Fu3ZGzqg2OqmRhhNwBgaJmT79oml2uP5qmplgVTrJCjXblEpzjJWSugmSyJ2DiiuNWE0XkTZuW/Eq6kHsyv+a8hZRSeTdwaV5uZYfgLCnCoq4YUf9rxtq18AlnqLa+WyeiUeO4no/0OVh2ixuUwqoYVB+x3FDl00e1jGdCG57iicVdd0g5osnQXLpJpx0LcFfIyQzmfy5dM3hNBIrMn5Hc2HvEak63jU1d9j4BjWhGjqK2GoWTQz95WyOoZxQNsXb1IRiiwlr1jFDTuUNM3ukdlNOGrfv36r89b8AmW/tWi8m68inG/f/EWpuS6chgR5bscz/CeEtA158NcKeQcIHHuzC/H1RNwIGBqgMQsJkNDuVtS2Sl8rnV8z1zvWeCtLCqkCq0J/M/znKUrJ6OwCIAGjmjKhhOTRqIbNf8UITAfDRjop2gkwIQjbZrQ9LmjbVnJJxtfH0qfuv7MjSuwYn8ft2tiHmyXPalC+mRHu+UqyVm2QHgSXzfYkbA+CQ7chJ6YvbJIqWZgjjgyCDsSNaU7ilv4fTRjJSHUMNkZk86s7Z5aQ9c5wOnZqF/L11EVaa/bSpZXhbXkZwJeWzc1gm5vCbd6zjuNv80J6ZYNu9XXBisX8UvAoim69d5dHKrZGTbaisRdPxVIeHA6+/8loxztZcUZ1sb3B4W8zoi8q51M8iKpBVPz3vhC/ZvlYC8anqpmTvsj8+DeecV2QLHYcI2HHw4GzeJAy2sd9nrZevdQiwoDSsXQeu3gVVCdsk0WdvLpk9lrBP/JAVDy8qHxf892H4ZBX4c/DzAZNQEVu4Q+3ktuzK6OlFiX38c1qeg1byClAGxXdc2NS/ucKDVmYixmlWHJFWy7STU4hAdYez0KX1IY1yeWcvXMPp2AZJhxi7N/2XU2H/3M4/azgVh8dbr/x/HCQdyNpB8trBZ12ekbtKI352fJ0kLClq3VLguanR+N8PwvyXJtc5uvi+E4ByOvtq+NHCURwJKq8CP6+spXzWOJC0d+/siORIzYKE2+jQpLnA5cIZXQNwYu2W+11gS438HBStZO4uZmyNpXheXgXGWRVNZ214T1gQs/15tm8jgOaBAAhWZHDstTXRQSbqqQn3TESQjunFegCAyvh6R2DajcyCjmqGp89rJxngB5GHoaNM+MFGxKHY+i1EKBhzhOgS+yljJ6n4Ja+jTLhvItjGpuEWRP6EjjLh3xsRP+DFyG9CWTeuADrBJBbSSSal8DYVqG/EZ2JqEPcdOsEk/kQSZpm4ZTrBJK6IkiKAtgtaid1iKkkJdARxvtMJJlE6Cano7cY9/tdNCAMmMYJJnw2bunF3GU28D8hTgIekXXdqBiQhDqlR8meF3++f9IrjAS7GGf969llaU1kGtfHyxe5fOS7tKPMuXNJccLn56ffISSP+n94LpOKwXLdJxL1pqkuDrLrgeOkc2RzG308ps7lLCZ5QnHs396jtIm9bT+pfr5d+t6+gEVfsp6w9VFP4Kr8a7mzz5nOXEjzh1/3b14ZLJxLdCGgEhvo0r+fXWcf3cdhq/D/cWQm+YAs2TwGqLhQB2ZSX7M/am+/zGUxUbhGQMPOSdLN24iwbc/8o0xaqePwsZiWdqe4X4WRvXnI2a1lYnL+be4nuewt1ciwvuZ51UV8J/uVfbqiIg/f0yLNOf8O73BLfG9mZrCMgO1dmcQrVrj0ogtG27W1WXndxdyIABIABuv35Xzvw/R+KYW8AuPvm+xMAjz5ulvH/e49u0Y0CBIMCAAH+kHFuYKTry2YkErpYiNXBkv2j+072sikPBtVIILI7Knq2zExLuC+YIiZV6NQcfT2FFAVusfGOkF/2Gf5muRCzK8SLJ3KqLmdjKsDLQmQPhviuULE5pO/KZz7fe6Wlczb2TINr3juHd0XbaMC9n+4fhukowK/vJg6ANj3TOC1TJrWwa7r6rGlKcS1mm/x2H4W2WfWuiJlKKu0+pTsqeye7z9J7JbhzlvZMq9GR+fi3ajSQ0E83RwEBfRc8AFr0TPy0JE5qSdck9VnClOJbzFTyu/souM1qdoVuKrWNSe+OyFnIL2lmr8zunLU9M6t3rrBynR8NCPvp4SjApj0ir8VugpB2qSubnBVxcHNllFrl2EABcIlQ26zvilQHEo/IL9zOlRA0HQLiHzGTHcExBc5zmaTDcifTZyW+BiSO1pNXAfnFzu+FXAqmsgpKDlBwE4eDacXjWax/+dDhPsxrl9MupaVT3VzRGchIwnXkazqlxQFlLlz7Soi3ScZyKOuYGWVSVQMe1TOpAqqLJbJgKqqgsGDmDwdT2o6jkOUjqhXS2mVK1dQ1V0wGEpLIKhtjp0x2QJILt2klRNokeDI1HVNZJqU1wK+enArILpaygqnF1prKh2cMB0uLx6vPte3qVzlbGJs1t3ReaBd2ZlwsjR1Z2N8x8xZ91LKIYZqpZg+N7ZXUvGT4pTccvcMndMgWru/cyrrly03iYEFsccAi2k6nRD5XtCiCXaOpiLny72pwNSzmwxx/2aHaOuTwRbXqMKesBSas8dzxr+7SebvNVPI77I1LmZq4WRp3wq5ejbS7ogILhtsTqm3jyA2mz8BrOseaM9PkAWZjUos92MI1uWOb6+PhqrqP5lWBdAlkyPOvapExJWMbra3ZzMasvV5cl+1ZuFwQBUs5/mCTEv1hXAT4u6vgpt4uZ5p3u9rFDW6zhU1cuTxUmQrdxYkH+l5D0OuMQ6zTQnvIz+uoOIgsBbt0Nv9H4UyDgXhkANjsUew6Ao1r11HonLiOIddxHWKp5jqOQIoIvVdfo6NEO0DAY8BlpHaOnyjDW/kKVF2vdlvGm2utlK1iUspUVWG8ShVnlbbKny2HMwqhk6lGblquMk6UXPmqFatUiDu5onyz1GRC8k9G2dWXi+8h/GK2fI4SR6Mh8k3bfTn65YLP65QqU6+CayRTZdwoC8U05H4FKUVclVJFtcueNaolivxVqclBLqtc5nyFmaValpR9MZYkV1mlGzZ0sVx5QjDkzNZVdtMgjlAufOcfJGdIHRm8uZwNBadl2SbbdovZspPD3lsOcp1xznmOnDhzmXYF60/mVwpbBHnk06+A87H2+VREqfAXJfc/p585EQu04Dx+vHjz4eu9CZwAdXqDUTGZLapVs2FiYePg4uEzY07AgiUr1mwIiYhJSNmyY8+BIyfOXIwznisZN3IKSu5UPADSKzRJsSKTlehhYFTK3zsByqSXK5+3RZy3ValRq3ryFkp5LmjdEVev0RQNek1FEO3jNC7aFGeueAmmadJs+gQx0A/sjZc81YhRY8ZNmDSFhY2Di4dPQEhEPHvLKUtJRU1DS0fPwMjEzMLKxs7ByWUaxc3Dy8cvICgkLCIqJi5hxmxWr2FPOYA1IYApnxCbM28hB79atJRvqWUrVq3RAxMmOm42K6ZsAelHgEmsDw4FayxaaTJMoEaFxi5DGE3RVDbZ7LAjTs4hQ9wJmKZpupq0npmYyEzd6PxtzF5CIjY6DcisGUkzSJCZY5b55lmgRbo3NLWsdTM3a7M3Z3M3b/O3YG1buEVbrM0jdyykc89Dd2tfx08jVKIqcmtyYYintIqg6f9KWQTO7a/CxcMnICQiJiElI6egpKKmoaWjZ2BkYmYJe8gDAAAAAAAcjLzjZaK4eXj5+AUEhYRFRMXEJcyYNWfegkVLlq1YLQAAAAAAAE4eAK7GfM48PJr0wmVSjBU5Fp61ilgdK5St1uuo/JDiwfLcayU5HsudCaspoM1dVR2fVEnNC9Zo2rxZ0wdVz2n0lMy/q+q5itKygtynnlI2XA00LDD5RX1a3fjeWvKXE2bamhP+squamLdb5kn2z2bWNFeXZJEz3f8UeXhVsDgnzT6lpBXhX7i6Tn+uepzK15A+593kb55DdVizTm9FnuF/9UFJy4lXzY4VT/t7+fsHzgMAAAA=) - format("woff2"); -} - -@font-face { - font-family: "Caveat"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Chakra Petch"; - font-style: normal; - font-weight: 500; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Chakra Petch"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Cinzel"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Cinzel"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Cormorant Garamond"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Cormorant Garamond"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,d09GMgABAAAAAFdEABAAAAABLJAAAFbfAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoNiG7sKHJNMBmA/U1RBVEQAhTARCAqD0kSC8CkLhWwAATYCJAOLVAQgBYUgB5NBDAcbcvclbJtGzaA7wHkhy9N+TqabO+V2KG1Kg4VZCGwcIIB2Jcj+/2tyY4iIHbSqfeOCDElwVc8Z3Ks0Q6/Y+xR0GqtD7w6lWo4bwmEbJnV/zhVElH1sIkHKPool5ngSTdcwQ0yJk9h8jvuPP5LIa4jYzBAUv2iioNEfHqb0xXvDGjHpGdg28ic5Sd6f5+f259x739v2NnrAGAMmjoF8JIwZTZlFC2NUCIiNRZTYWFiIVXzEwkgircJu/m/o+X6//+y1zx0Ep8YBGoMkf40H1BhQbGRSPkrFx6XmDdB0dpJUkrQRv+SSi1sbqcQb0apBBakYFCnqxW3aDbOJMQXGEB82Z8Z+ojz/kCf+lzSlWkFqVIH5bgI+CRVz4ex5+/BUFAoVOkb4LOqyxSXJUnzgpKkC6Bw4B1jEYXmY1p/+cM44sHTo3pgOWDLqAiaFG9xIu/eX98A44FE0+TR6tPNREnWe/CiJokHE199e8VFyXDf+PRHJvJlaNmUN3/Dvpr3ceV45jWCbU7WJ2Xt5QFooZR07EeG3/CYE2ZxQwcd1WOuTmqT0/3hYPxlj3I/RlED1Fgxq6a+EhQUtfr/290zTIZ4gRCKRevoXlxD1bZ2pD/VQThpRO8fgnLWzO/sgzAv/Rr0kUHZnW5ukOE6b0gCzrRlz4P/WUpufuT2Y4GVDjkG4uXVXW6H6akxubgNzP1NKeBN2gFeGTcsOnwd2tYggbGprGf751l5tZm8I9hX3tyxzqla4QNG4Ghmg3Ree0iSqksG1KrUsPAtJjsipGlMhq5zrlallOgPQAOQb4p3nR9alZ0kZ42IF0aJ3gXVYmAXvjgR4fyTur3Qk39Cc4Rl9YbHYGS4AkuCS74ynOcf3PBlrI2dMZE2sWmRvXKxMQaZQ8SuSUuOySKFChQoVBoJ/nnvnfwYckHXfbYxFE7wTSCZjmpcEqOsLjq64ANG/7fu0o/foy7sk270Hy9bYidipDCJTEXMsh3l/tf+P/fxo2nbs/X7t99oSAUUFBfxxFcp0WZnTrJWSYhXIhIp9aRWCx7+zct9KQCRlAMYA/+bOMhz866eP2rW55qT9ypRYLM1PyaKFmWYcf4MRRIBAAJWuIBCDnTsqKsVOGaCUQalwvREu4O2TUJ1uBp9smeBt6wIvbekw0qYBH3AkjiO/fodgW3f4JucykB5Hy7aQkcX7Rti2mQ7TG5cIcgwmGX5VbdyS5iDUJnS3jB54CD0XeiX0oYw++wp1jMz5X/5uBEgMOYlQJAEFudLInUFD+TRKRGPENE5Kk5TKODm9CVGIAFABkCFIpH9HgI9N0B4LsekBBEOlXtOld8wU0N59pyWC9uE1KgGUz6yMZNBi4DGgZBqxHhf6Pf2mJYPL31QzqJ5HYTcgB0DwRJ4ZCYrhkIS+fuITbte7h0Jz1QBkMzDHM4UECA+pGgwP3iLDc6OlpiRnDG1dGXSkzuTyGENZuwMFj3U7N4BaT62ELABajk64Ulzpm2htRl8vJo8DieHBg9MODxqSMa1ehJ0ADjo8csleJRaIF8BfL44Io3acXS0V0DMXWUHdZ7YGTTzbQiKYpqAqzatwkgytSBNuF8PFm/LanK6bAvcGjZfrGbKVuLmcovMwqBNkdcRAuhXXQeP8Nrd9V0a79TPTksOkt7mGN0kxtVl0xdCcg9afEFWS99jD1enp4f0eeylFtGj96b021crly2QwyVDuEHzw6XIg4xTEAKBBDAAaxACgIAYADdwABaDADkIPFlKwQpBrCmjgBiigwA24AQoocAMU0CAGAA3sIPhAg3ciBzEKQdO2dG2VqhxX7aRTzqhx1jnnXXDRFRIhWjFwbNm3aTtpJ52UjLxu3O7bHjJuurVXcvmFEEutrvouuMxLvXjokNFwYRdwk2BMgv8Nvf4Zrac/5Ylz8o91lBMLwupgOPhZf/a9j73uaQ9IV0m3aqlud5eqqbqj7a+CfGrH293WNrSa0+iK6WC5LW5e38soudj01cFCmtaERuXb4OyZK5sdtAnysJCDMcqFs2AI+leHr96/J32p3T03NDldiWs42IX0Tqv6qQ67YG+vq9pyZcBS8F+Zm2X19RSDtbB/VVbKlmWONIkli1YoXJApaSWM4G2lgfKc50ntGA0Boy8o0JCgDAjA/37u835qz/vWvd3zPdqdta1hV3ZuJ1e5g33c7qe9Zj5ou/q0StNed24kt/LdTjR0mqzG9fZG3HPGXKs9ItdtKr050LJfPLNOx6xOxp05juP6qtRvlH8ptvM3V1Qh2SsZ1WKYHWF+POafDGhwoxK7Yxf4Fpd6jxW7h6PJcrr64Dtj1t6pvLNHBRgyNtqyXW4A/gH0F1j35zrHvCIdnWuVO1TNRqKY5deMzHSxKDvbpcILiLRMeR7vQFc1zgEXsHDepHxRWmrv3Ma0xxDeznUyGotgSGX3ImHOcrWFVBGRO3nHyFqNh9V6AJ1QH4x4s1f9HES4qIn7OV8XK/zcILJuCGaPK3sBMnOgw+QK67WI/OgFYV4X2Qtg/Sw4BewxxMtdZPmIRU12KNoJHj3Vp6HLkfpAcHQA8ZIRrnbVXflkrrMzWQ+Z/iP2LjXCBpoOlmCevvjiCJX8ThXHOcFJTnGas5zjAhe5zBWuhtpTnurzgUaaaKbF1xdAlfcYBgZd8AyuQfM+eyiwLVCZ+D5kuMhwCsOOuy7c5lnTPrmSJ4Hu1Cdj43P+9P1290evPR34+vAHbmnpX+eSGtUtR9v2D19x6VYbrFbsns61GPrPkyFZ7KV6l7zWUlYtnqtLbu13HULSNBP6W4uN4mswO06Zacnn+2MAIobclqzp1YPBfyF17Gvx6+X7bi/XDunebjg3waXXKGlhvNpOTb7Gr3bsArdLdmZVO7y/eu/KV7ZS+AHft3KFa1q2DfvXaviU1VI6Aj0D2lPA6opkDSF0qECxOkC+GxQ5BnGyLZ7beaLBvYDpfjTyH2c4kv3ZFQKIsvwuBfxDDtls5AudfhkAyW7GvIFA9rEVD3T4UscowhnOYiyw5CZFZFKOJgvrsof9PgBkwTEBV2qaosfqv6MlbcYh7NJwx4R4EHTYZx3xVUf97WNVTeWVVQ3l7Xj1cpJTnNZZuJuHRk5cL60S4rr7XeIeBvCftAkEAADQefqo5+zvfZN3XpD676IPoMfTO68BsLQgdzVZ+rshhD1mbqHN2GFpQXv2K5NDwePPRC6IWg2a3XU/GKUoQyOUY+LgQQkIiUjIKCipGJmYWVjZ5Mln5+Dk4hcQElYfoUQQqFYtXr16Ig0aiDVqJGrUSeRHuFySFI2AxnpDLCvsuBRYjkVdirhKmFEXopmuXMTSFHE5LUfYLEXciirGqRSrB1t0xRHZLEdhObrdI1qIehSmfMwzMXfBSJz7IRdHI4hYtZAJPmds8ZIACGkhYwAOjRAQAoEELO9TLUaO3SEgB29hQLZfMv9rl1NQqYY8T1Zvl9kLJBSoNgggTDMwpALRO6WmQIb7AzTgJ/eXPXgmiH32h3GGrwg5W90C5B3gXw76Ou3491ZiiDI5d2Z2kLyJUKMTM+2E5Ssll4rcw0HaYFy70A/O6c0M+/aXZK9bger5d7U0smT+tDNAtZnS1wqXrmCjLoE+cN7O8udQU/BCWbDISJjFSp5z6OcUyhZ5g4/kvaM8I/F8Z9qIW91JF+HIMJMFwwbXwSoRlvMpZ4hZy1AikVNNpzBZS8yoSWRgKUV1bFVxKOvQlwEGNkBEqWAER7YInWBdEAW+s+G804/p1Ki+lctCD+dhCvo+qFmFaxKLbMFnLk3ghkyD0y28FHN/G9dFdRYT2go5OIx6dIZzaRza9lTuTvCG0Q+AGqlTfY6aS5luTRu0jYUBeR37R70LnoavH+hrbUYJpEagwek2YW0CYGx009uTsMZzG/FKHnxu4P/PPBExE9YUbCjZcqLlzEU3rn7jpjt3Hrz00FNvOn301U9/Aww0yGBDDOXH3wgjjTLaGGONM94EU0w1TYBAwUKECqcXJ0WadBlmyTTPfNly5clXoFCx1dZYp9R6m+yw1z77HXDQIYcdUalKtVPOOOu8C66oXRxHA88gBZQlckqE4kJ/J56IniJ6yVzvK03oDEATT8YGw4r0k5FhkIqfCH9RI0e0PMoEnIkmV1MhzjSTrCQTQRAvWFIhEgsVChthzRBe6SGpSCkZxMRIKU72Ek85SDEzf2maTMx8lMUWWAZlSyxHKFdMnqTyJVYgprBspUgxpsRMgiSzFmLWWS1HsrABYjYJbZZSmdBWKW2Tg+0S21E2U24P3l6Z2VcW2+8QdFimjkjsmHhXZKpWNuplq0F2GmWr2bbLfwTLr0ywRo4EATlyrJEgQY4cAQkCAsIJSek0XhAeXRrYBHaKIXiSPRM71E6yZAMLFZSkvCCV3jYrFhATbG1cIAmNIFtCIqbAppCIAMhMoDjBokJkIVRi4RLTixMnOymWiJ848yDOfFMwrTBTwVFjLaXiOSOpx0RGZrm8EwLaqAZtIRpizJOFyiCqSlS1OKckcUbUWXHOS+JCTeXtYm4rGRFZIaAV13J0gUeECAU8PAoUiOARIUJkHs7ZQLLOXZN5AcV9MNNdEIDQqIFFn4UFl1H+/OtYib0pyfmPn9rfFz1TZj2/WFo0XKsYV1Q+vaBi07v0LZZ+lqOX47/4iK0mqfs/U8uhqedhn2XMhKlrb4z2RrY30r0R9kayN+K9EcFPPQu99qB7bPM3ze5aiRnQdHdcUipcutedkgQ1/wDiT0H1kTERcPSks5Jg/4HIRKgY2coGVlNMLouZV2VcW0mD5G8RYmPaQmOCGBFSBHgkcMhgmKPELJianiFfl7OiYHug/xSs6/s+2Hfs9l/IXOXLefy53dtObbmbYf66qlaQI20oVSspVn27xCVNqNOs5sTjGleQ+vkcyqxVLNsCGRIZhJhmglF8DdZXD260LiNSXUJEuogocgGR5zwixTlEorMIvd8RESoRwWpQEYqcOap5TqupTqkpTqqJTqiRqlW942qEKhn8fCcGUkPA/ntDVG8RDsPEehS7h58JAaAZBxEjvHbDIQZhkDYWa1FCE8cFlVQaRGMAWNM5OVMQR90HSTx1mu1GT/nBV2hcfsnKOWEy4KMbTiuXLZ43R7Q2b7BErkuMJW1Qx1wdp+TNt9gO5QsSgSjL93GvL2/gssDpao+s/ZdQuwf1aKhrSN4qQ1zbughXi7VWdZST+VplUVL7tZZGSezTio0arVxrXNQoO7R6RfVVoqU0dIoTMvcU707rKLzy2htvvfPeBx998tAjj7V74qlnnnvhpc9JSDt1u8XUegDwLMZiwGBl2fjNVqS3z5GxNjfcdMttd9x1z33XS0krVRZB1WoF3eptSxojmVC3IkRP319/7oxRCqbEMaB1qS78UW0o09ci7vIJSpEIcq+Bj/dksnaoXqNmD7gO9kCCL7757oeffunwhz99RUH5o/7yj3/953+dCBgS+BtBkpiZvzQ3/owtkl3mF63EbDMXllrPilZVSpXghalmoJFNlAszrk51ZP0ruzbZOa0xZrgRtraJ7ZixFgn1V5Hy4XuFcb+m2qzMFsdsKi4kJWXBVV+jxVisRLn9GQIRr254KuZIG/1dCE1KCgXqr0PIuW0lfa5Bd45Ula6Zvs7JQISjwm4v5ppJaqz+9dwF1Q4qt0EWA299udNATDhS1DmlLYjl72NUrJgSZM2rRbOiW6DIFi4YXpniuU5mD57DLNLJGKNeiIqyEH1uY/frExkXuqEd7ExXugx2xAG7Nvs28xbhZ0xImFFRc6IzSiTDkvX18xXbYV9RntLgKAOm1nj4yGRKqThfGcfaCImSbMP6NOdwgHycgABGb7aNN+rhrZvSxYAYezwQ++C/VrsrsJ36O1r2/RkA7DreA+BXAIAvZ2YAahSWowEg/x6gmeLFLzYDiQAf5j0aSTDkmFcCyQhA4tABeIjUWECAotyHH51syt5mb0NxCC/9ZKnSiV7KxrmpeB66Dd2FQRgHZ8MSDMKyMSLGwBBMgIkxOWbBnJgfe1kkFo2K1olp0Hym8wJqPfS3XXVeSsfZ8DSALipOujEOxh+aGXPI0g5GYM+d/P9nr+01HfnM1v/j8kN6eOjhwYdnAQCe/v/0l2e0p57+9XTHU/WT50nLEx+IDMgbgN77aAH+UsW35fFnWKtPbYA2PIl78X76MU0KuahpCJVjkmEQVetBLGy1qtXgKWgU3kQiEiYmM2XGmg1lofl76WmKXl2M4t7F4YalJ2bQSGVSOzoVRph9CxzU13dDitTSlLldClm0FWvd7d2QmyCdelSIiISopBLFJnJ3tTwN5Dx6+dR9qk1URIfvQ4Rr5cMjQx5VjeucOCcYe/qcSYxJyRixYkHOkphG945MqYdzVCkH9GHOdqgejtql3E57VNhtr1CH+ia3OkGMWHFmmGeZxZbIsbTpZVulxAorlcqznqcjZRhobd5OCRp7Jv6mEO4ssp2Ae0cE8i+g54KJf4DwH9xQTw0CenXMbyXZcpBsMhABbsxoSaoUdm8IHvhAVvH+GZCE1+AopRhDJFhhm0xIZCYbhcx1tn7fVOzS4WkmNLxb+51nyvumADObT2fwKPO3mIuLcMbDUH9cRUyWCbWZaH5rBOM3ZLy1mfBpzY1fOE2GZOSeROMEHeP3TDp2xS1XYl1x8BB8JqbNWB6cX+iQfWLdhLWuFZ0+VXCqlcKRHalFWAGzWsinsnMTNAGY8MpCECBGFEH4zp7bmZp1nWTGM5pp+At3BbWO7GKh7V2QeR0Fu1F4wFArY8MyayQynBBJuJYu3J1kYwcvs2KIMT99Xl/LNV/TNcI1L7I+dNaGYTQsxNuCV5Znv0W4fqFCBsYMI4oinMOM3F76vn4J+llDODZB84z878JdShY5V+eFh0rJmurCoXMS2oAjp4FGgwyzDCobVpUuiroNwjpW1uWaU7UyYJEBgnJCJOHaa7yRwZu0TjMZNXc5pXkQxCDwcgRBxuK9uNDe38M9Qp9BpdiVCxxl3mHMQoW0VwIYRFGEc5jRtIhXg/iVrwwjiiBweGnuNA2oUH/SnTZk0t6saWQ1Y2oNrU3Ck5QW/FBj+l5rxfIaPYmUeKsVPcCbYTdwj9eCN/NsWi4NDYanD8pLMGR4f11Op/WDN6Ze7voo7+t7P1uUtvyvvUfvji79emrzrtt3UwOU4AfXdM3MaC/sIyKIuE/GdKzvGMFjPDuINrBCGsN2x+P5PMtiJyEY5Sf4NZ/7n9F6wM/juy0Pbq9mG4b7ECuKruH83IaReoIoAlh5AEIfuYCQzJ9rnZydEWHQikEQsRfEqcgngR6Mjl5DHP89o9N/6PEB0AG3jHS43lEyDYEBcsBGbiBiXdcM6A3N+HAJ7bEONi+W8MocDX9AWHjjrX91gBOGI1mHRSCLCagV78/Ik8mDm38PQsPvJEiWV/d3LLbaiTUtEGFDcveeD8TpTJuoGKwtMR/yvqrPPeJjyzqlN6IysxzPShRpolFJeAUy6QGN/nMamHGzlUYJcjsMG69Zke2Yf4jlmZFAY2ixTJ9pGwDJUmFuuI0dCgQXB7I53LMiYSo6+Z1MrY1nEBrGe+FJlyyvlOmAC+QBzTPoE5sA13Lq5EAYNzv6NHsNuYVpPCUJqTXGrdWTZsraxa4/3guXWXfvPsBSXYmxYtkzPaOA7zWfkHcgjUUgBeYJJXomoYUuh+mXi8UTGSgkyPqt6PQp5OioOfqs57B7xJeemnUn0Di9fwlU0VksA05AEgpmI6Isplkh8PrIiA2YXsWvFM5ILscO3Q/IADKbBCoFwZQRaHb9cvcX4Zc78nO9cgrvOYtuIIlCM7+ArIku6InGFcjeqWbdKDFPiDAprDSVihAF811zSJFo1INUlKQDXYKQVHm1Na188Uak3Gg4UNbgWHg/2Pp0jVeKuiVdwzk67xG/ototIM0YlF/nfdBDPf4Wc4cET4mxoaNIQ/ic+MPTvdsTbdKj8cO3nYqM//1lc2Us3hLE7GDDhLJUoB0TMm+xPpofDfaHlr7Lr/oaV7y9Q5ekcZ+Xnzf0IClmWzU25DTsEOmkv6XYNlvQUlmZP688ezHW1qK9UCPsMEydswCtUUv+y3Q/T5cD3OfjByqO7fx94lu1u3fxPxu/N2dJzYL8aFIy94qLKrKFdHIUurVaF6SvoEzBsM+FpQfrOHBg+LTZKUHD2GaHmIyzp1iEkEOUNuTN5GjBjcfW7cMJC/r9FHvk539RQuZuMsoy5gPD1nE6VoHSAyjQc5lnp5AB3oBd6t71mOm26HN+g5U9acqzvJyt6Y2nCxuCK4ZT5ztsJrgKcWr3ujOJACy9K9I93rIslOS1r5svHSjY9oPNc35EhWcGGxSxBCRN4TUeLD6m/wOCFVtkCALg/O3pZRqDuBOtkEfUedWzMqr3VNhLt6a8ooOzRAlA49LKBYMnENQh/GCPfrJ+BjIvAylTQzBk0CsUSbqWOBV65i2To8NAY4Z0Il3TpEIphVUt/wJhFmm2ShrnSE7wQf+iKvd53qTBhsSspBOlHpwZoSgaFm3dbktXD5vVH9S51C3yLdETbmu28r6TJG7NSLfdhxjvJC+9hlPtgw19iTNEq1lVTIwPphY00j3IOJmhzUGzfLT9v5PMeVqtR4IwXUzIGReeS7cGIwKgKu3kKTrvxLl9BXU0dbOj9bE5iAKZgOfTmMncleDhE6Ka2aHooB2gu7KfBgK59hh78m4OYqMHLQmRoY3HpmNkVPJqSKzG+6hPcN7niZfmRhhi0hnGAUQYO4UlTJpU0x6RjnRbIsI0zI42iDgP6BKeLhh0bmCznM9UtGmE8sKk74Nb6AuKlxYZsqbD1jUX+gxn3vaAyXMahJCLOVj3hTVkUcdAsviQRyIULM9MnV5sctCP+DDMJrUDqhy8Ma1/bkmzlBXGw8xqJc4R0m/gEWDJAGBe8A/hgqw4MIoVHAQ773fgHGgaeN2ArV008QGIvoC0QLVNscXdUuf+uJC+AxmuKe/f/2/ue0mXf4vt67Cn/rBeGG1YjabNp/ah7trjr+4nQU0FlpRe0EgU3ovpULVYTznCBGBjiS3DmGVUbakmxQMlLJdzJcaSJZvfwIdvI2nGrpqaEGI+CLKwy0OcpCKVYWq+pw8EdHONTFdOFd1B7aUeL0PH4yVlUSQ40kD4Swbtxg56dzhI/hVz0BcMGatczBS5KoSJpzrQKCUj8qcB7ixeCUGNxZ7YjwGcTDeGompmugitMgdAnmN086zxaKioFgQnIDlaWsq1jh28ac7Yvxa0diEp0OZ1KmbCoFsDhTWSU4WsLF89M1if/iUpbrhGuDBniHcrMMikyL4xP2DSmft2rh3b83KU2wcIsEtVgdXp1+JobOKeE0I559dOJcJie15cqPb5IGASaqQu62GyPpigvtw9N6M9pZXEwYEShiQKnPNMEYhN4C5ddSuExLJ49IQgOR+Dy/ajnJh7gI2f/U1XqR1l3uI400fUYUMUo2BJAaeWC0rVuwhUDcQyQoMXnY4a6gfzO0aB4MT+yCkJPSRWcbJO0aopTeK8wZNdRWdq5g8NYPx7T1Sc0hbcXPtqd/ohZ73aPaWQ55PdUUj0jwXzyLzoqsgxokuulTPdrbaDoYBsK6kcv2g/+f7UP8jLtUO/st5LGnkvqR0yEitJMkZQ7zj5DNnFZYt8aHsBI3j6Z03JSE4642Q9HzwKlBlrfErbgE1FJhBNZXXMg03nqaGz/YdOoY1UFC1xhuS2R1ak+brXl7p3Mc/vE0Ee69hBNstYjo8lDpKA1NxWXOyZuJb6wNBaAsg7kEGrvms5GczVChZ1mABmGtRNpcsUGwRCLFuoFyujoyReoh7rIxG1Iy+FMT4bGodq6tfVb9MxjSFTHuppoRlTFpB58AcYynN7VJgsMkeiTBVEjSzdiy70aPKGQY+BptFQ+5q116SoUQvdaW6sZ7OM1R+CPRld0qrtGnAzNTU5Yk3cJycUhCCjSRBEy7HfNgoNuxm5oMU04MT4EOp7QudtIiwadIfeOAeY9JBUIa04r/c40zzNVs03XZK9iw3WZCwH82OD7TjJtpNTI0vSEGoM9Cu29rOoPA+RL5rdqGGrJLPUwoRpVwaNBGglMX0DXGlion5GjKhMngN3Lb6hHkIbk55xaZmQHWWQGTXQabE5HwXrwNsjuMdEE9uqnS5UkXpeCtHwwmnw11g02E2a1L9TpaJpxWh+1bcPaLJLsh+oFjIt1ytNlkYu9iaErkzu1wIS98pC522yFQREoqDTtnWmGUdhKsNmgM48G69kRc6G38UFkWWka+qrP8txKAEMTQtiHFejLSS+6ioFgWQhe92rtv64YyIlKQgA8znIJ2WTMt2W40fRSyXhdHjZ4RNzCSCG7Giatc3QVIebZvQ1KMfqogkgxshg7Nh5xF0uWmPptGq+wOTKJyOr/Le1LSuTD1wKyDr02jSMDx61xQtzdmaylLXH/V/8QOd3jwZDf1mUhENJuAbV0Xz+EkeG7lNcUDVIbSuq66aLNqWcgZcxSj5oMHNgH7B5SBNxpikHsFrjT4Xa0ov0s4EdsiCZ6kH0FHzwq4xqtFDflyOmBqs/kXq69pfPpOgeSA161msVJcrkemnC+e3R25K2l3D5h/QfWEwe6buHsy5C2+UWQk44YAN295bnmWLR/i4TQEvBcqb0ASJtXsBWMjlyXID1m7XPu5pjRaWbiOO1iN5ID/PdGzfdLEBBKt3uDI4bMn4MW3bbeHBPjKGEC5tkXI7vfapy6USdN2Ji9KYHuw67N7DCNxL7a5X9FcP+7TT9jkH+Dtaia9gsFeMDQ+dY1oq4E36V89oODsng7ksqJxemPmRO8uHHQh9JBPlnBnrJBKgVcSmHxxGvysrotbcRUCoGwOikl9jzEZy8HpdnzspFzxlgtljp66SLm0oCnPOB86KyjFoObaiZVMOdypu9KgjKx6lU02xVq5ZWDep1zHTIulYgiNq2xiltWefK/LiNWXlFhwKbWX07/zLd6L5+R/YIoLxD0ktUZygzXtpXgHBbQiH5kxEzeevO+ycai5qc4u5gTEsd75CnlOx5eQggM2bhu3gvL5NE8d4FewI+LTGMpC8cR0d7EQno77n7uCdcLbwFA7NpWabTL5Xy8wgi02yBsMzBSw2DPkXPq9h5yfJ8QwgCxjPfqCzLZC1IyxBNy7OQmzOCY4xVul50Vtf5SOBpxWYsPCzrBwNaXKZxrVqqJjAQOVCsH2M2cHhob8uuWWYvo0cgdPN6R1aaCutP977OUWb3lTaYxqaeUjVJ5wL0qdC1mDjwUVxkkVw1OJSs6fmWDjbTcHglDZ9IT6nRb3g4qyJMeC8wW3nRzNgn2DsY15FIdFqZRDSuVB5TE02K93E0fZFDOabk+TgahFC0wI09Acmkswz+XpCE1/6rvUuiZIOo8Wp2bMWCyc8z4S22l5ubCffGQJd5kyGbW3DnNsRMznFBK45z/mKnI0qBswaRQPmgJEAhpLqVOlc97EzEUpRFVhoUNRyeNl6pZYuLK7j2XVKaWaAXCarfxRcaTmY7dWJcbiEM8a6klE1oGJBxmLzo4T5Jnji40t3ZbSaUTDTLyOt9MVdbAj9tPfDAi1ojD9SZtNO8Nst0XfZQQ6prjNgflenWxWZdI6NKqNm++kTnPHTz5ioPyQ4+8AGdaOSiK9dJmcErcWqLnGexikhM48KQDWpImPs5A6BWKCTSkB7u17mr2EgCtM6Rwq6mUXIKq3vJSc7o2QZVB7+eolRoMI07NR3WwE6snMkSq0qs0t9VIlb1UQViFYhVLlaB2A4530/tzzYwVhUhW7ye6qoUUjR7pLs6yFY0afak8tzjtrqhkH9KWRFXYZpfSah2b3ZlwFdSLxfakCr9b8LLuGEb4YdTi6UUZTa3L3gGwpTG6LY99rhkXJwLfGpwnpGc/VB7KpPmGnI4SnVlubvfKdV2usZwuH6Uz6otYkQFK3NgFk1gMPWcwwmTkdyUfZbTyiSj1YNNwDLIgAtJyhqx1FkhU1euOtDhFScWQksnThc0TNTFOka2BSeKvDoYr7Ouzmw05WI0fHjGV9dZgNxngOas6PvFYdWQMKxtheVgdFD41hWePnQC2LPNsi5MBCFQf30MkjTs/Cjv9Hoq032Qbo+SHfnQGgo3fMZDHZy/G67fvWSA/U3GEammVz1A7Fo/n8YQNuzBUQw1/lfmgRUbwPoboewVDzhjg4Awuxw0VXp/VaMm7Jqrae7UeHp0f2Gc2cSPrc+xzXgZELUT+Ua/yUfwV1x9DrK1a1Nkxg7kWVpDD807dTtBp2ULJ72GKfG3VuB0n5sZ4c3I6BGwI16QombkCWLnZihgTu6jk0Szc3CXrI4pkIlzwGLbQ4oxoAHc3ki+YJ+b05Diof9Nn46OsAyeCWIr5wCvN9LHQHdpxpFEtUuojFWi4zuUigm37ktbxInJnofK8k0MDbXKTLEG0BdWF7wufvFdunWrQ6bFtQZ+i3osdYHpRNYULuyNsElzoExsmeNHQeuJzc0rNRZ5irHD/vLVD1luDFX8yyrCM80HJlOoOU4k2QtBZW6diDfBpii5br9RHAuOiYnHx4CT5FtVLMzAy3F3T6wK6YPLwVJ7rJwZp3H+erI4MmM8dBl7TiL0r68T9LRUO28faiSarzFziB0s4ZluSwi1Y0Z4mb8uXFJTmhM8rfSAv+hC3efMbiqqJvQKktF7J39MxKJ7gGmd1Mu0x5sOQEAB3M+IaQ9DIIXpjBizyGZ0rU4w/b8adV58SJkBePRg7AgrK7k5gxknFIN0Ds4BwmpBjywPi9gVJ2YUmuagKYK/lFs8uzc04MPkxhZOIuBdLAhFYFmzXAF3ibOMH87IBsHOEOKcUvKHUkHFyda/3YKjOIpwlr5tgCzuinvHpHHgdy5ac4DQ9K7r0mo4539s+KGR8sFbws1jN/CNwzeFWzXXkesST+2p1fqm5/2hn5g2htm3sbvxnKWQ51RC4WZt1g+JtaXu4cly67qMm5+ooj4+H2fk1rjMp3Ky3O2CzgckOgek4EMNeXZKqzJs3qCmUBR1J2E/xw4vBFfpRi6L8rnpQ+ODyoMHmgnzRKX3ul+fXBSvWZFFXxfbK8APv5IyVKN5XyL/32PCmqqsNYagKFm6RkF2EHj9EawBXvWvmaqrKClZvASxjCu0pAY13AOdV9FsjVnshksb62f5ndt6IRBaOwjay0fxTD1Lobqw9KooT4yXYUdGCvFQwzS0eTO+165z5nQOPYWXZOeIZZTUV7PWEKvcyf236n2I0dYLMhV+Z8Ac1Ixw2FpLoGSU7TukaLV+mmN6pOds3g16z6iFJf433lZo6KFcpw9Lbh++lpvEhzE/iA3D8jRG8zSCamgqLk1sOOfGiEt2JUmfwHMlUSqzl6oBtI5qH1pYOMoaTODiHpeknmvKuTEee1Ufv0RYsmUgx/MBcwujiINcAimS7P9LdSLr/BVJSeslkubXpbuyIOmyhTS/zFUqWvmK/T7YrdLQ2syLYzmnmEtJJn3tHL305rEZ57KbjSWISUvD07M8As6rIRmZylZbKeA50ei27D+HBto3hd+QLQs9ci92EPPOd5UHgDcHxd7AeMwvEUk8jV6pVzw+6BUdXDhzkfjgOMx3WMwRG9tSor6DfeM96MG+g1jS2GZcWB0M6EUHRW1+PSY+CPidfalul1kBE2CCm0brzYYJsOLNHHi32Stv0f2ZEAHKQvAZGIxnbl24Hppwsm6bWQ4RIIKbQenNhgiQErilfnJxUq4AT8IL3LBATBfiSDjVm3M+WmOsOH/iJUvA/mYTXa54LJZPYrz2yYtv3oV+hv96Mkv+FdnT/OFqU4dk1yU9I6N79oA8aejmm6roO7XuV9Qo/xFF/pEavUhto+3OZdOWv8Rm5ZwzbaPO2sCj5864C4gYCaf229Qe4WlVrAgmwa8I2eACsodUDJ6XqulbT9I+om8uoGjlUcm2vdBaosUnxGTycUKChLfG0H+LFJcdXJ8TT8JL1xkk+wh5T76adLdK9aNrF3+365QEJsEiHIMrRCEiYErsCYzX5McsVldZp9HLK8WLpW4QgUkw/9sL6CX03Hd8iAQhv0jRa1hBOf+mJr+qduhf+qRl3HeDwBooz5Zyyse9QAwFCoOeSLA+Qfh5P/EvxrK7gB/FmvBKqQdEcoS+faVdQrd/J4BJMPKLTFqBE3ZuSVYsrYxahuvKp+hirOIWd/5IXYVlaUPK42Sq3paNA6xKGEVh1a8Dla2lFHl8pjAmvLWDyH1bKD8vzZ2Nmv8d1RUJGINscVFEiYZiphdyUgEaOfi56vOCxfwlrg8kMFFeyHCjIbEZoA3VANtk8e/Nww9NTsxx/Ial89WVo15yh4zyf2B+edA+4M+1tg1glZRJ8slyoD38D831h9y7COcOl/sSJ3869xOE8xHXaslnPhb+h/JOmYc8uvzVTsuN4yqjGhB3D4I4e+yZE5zmfSR4dkcHkSBxArRJfWDrFeXnrpn8EddpyRFoVsPwYRIgQNExl1RD23khvTQINagKEfIyc1TGFW0lCEr1XnAwqWMMHfmSf5j/xZeZ8pcJLg+k+iHTW0jieg29gL7mYNwB9YF6qc8IhhFnvwbPU+iOW8Kw71N506h7+TuhAoVGuRviJk9IwZMdaNwB0u5qJkk6lpuXKB9BUssXdukXyf2U+btVqPVZDnJuNveccZ4hyMBSs0RNIqpe88xxt42g4t7ukXGyXJTWy+dsffwRiUn3piai55xSZk9xAJJL9gLvvHH6ZH0smX8Cc1APKDf3/ZlBG/QXiWQt5/OpUkQ1uxYbnZjj2E1z5ysrR72UDhnQPqGti0vlv+QjcWcMvcD14+JIOOThaJn1S04lY5svtNuCocP7KHZ0bV4uOZ2V4xg7De3BTL/MvG/m9euN/Tr3bOq7rB8DDK4KPuIML+aIE31ltAA0SjF8vYJMvjmUgBwct90cL5f2Af7dDvwxX3fxAT5C5qP3Ef6nQEZW9u23CDdxF1SZNqzLKGZifWaq/vukUOYJUCp7yt/ohhfUrLPm5LMKmkPnsGRB235lmZcpSAsx9zH5/j5Tzbecho+IhDQZe4v0d7L+AJv9Hn/sFm0r6lYlsHNWVte3aISd0TP3v9EMryfjn0yPNxOYlXXn8i3bawqIBLEe8gVzORo1lO6/ajrH9Hujnc/Fk8AYpUlHKTnnZ3YfzKwFLjyyvY7Z9IjPM7M+B77ycwqWW+cInDpDy6bZYqWO7kQz9wpvoEevdsM/OUqShgbNpTXaQW+6aFpHaoaiMDJoTdeo+wqC+VOba2aZq+1VxeYZNfX5qztKw3UtS6eHRdMLakuNRFZLt9QDJTqWzs3Cp4PudL0/SCiv6mw9UiqhecvgRw1ZRg/1hJTY9Gs4bFvZRic+eNSIweeKqOO7RG5Luo+hHbXhSdwGdx9I1S6tjOZPbamYrS2RxUGZNBvmDUMqF56QqhnLT9LHWW6yDi33QciO5GKhG25/ZEkqSydTAQZ6xlY3yOxnkUvIC1xxcLKncKSuwrGsMwXcKBdc3Kays7AIqJ1caYCrFy9sThwvLm7GHCUITRp1mxIcBWFuJcY39pky0P+h4XwbGtqooYWXI8B4B3TFMuK2nL0ibRgSoVm17aLwPH2vhkVhxER7OAzHvnQlqhu1V2UIXE0CZ5CPk8UehNmSnHnH3HdO5tCykXd4EWepN2HDbm4A3hM3j6xMG2VEoFmtojCmsC09+s4apaervu4axojyzh/kVX6r1m+02ZPN2iKBm+g5ba7Mhnay3fRHif/DQSl71wsyg8rrMefJf57lZi8KNovM0hJSaF04Yx2dZ15X6Zqu5M5fBDyuKSxPccLQGoqaowoanognhPZmV0ADwTJIIQ0lYSJOqNQzcmAClJsojbgYkQnsC+hrKui9I34AVCsDIFohcVy4NlanE3D+bMvVQiSI6xW2rx/VV2ysksLOHns03J/v7oz44NaVVTCjpau0rGF8I+kAp2MqSZWtlfyTToYqNcv8x10N1X3/vC86HJoMLVs+6XakzcB8FJm72HbqB5hOf8aHLOzNgqS3mrn2AHCYokNr3lAen69PP3eWIvCYmhFQs4YvBh5Epodjz7pXOJEeNurc1Bw8BareTefWqPz9xvPZEAmSuYuCbD0/X6O1IxxWM+3QbngesOn1NWr/nsM2JCjP73CQjG9+LtuybGImN1ZzGhNwHxWwrbhmUuE+YO1+AXrij7yHZ2H+r4XxNkMTmvgtRG/4q+DbBSaxjVfpEWievjQKWl1oKZl+AO3esRXvN51oi5o0fJEhf1O8rcWsQcXceEMWWUuAQub0TzNzAwbUY/2GLIdl9M+YOvdmgrTpw8g33LYn/0Lm/zyXlnC/zyGrH7VldWf9ODIa76GNGFkiFar6Y/1zjREplFnUiAvmFMyCwMNEMQYeRlGNvOCV+fiwuCZkpWV4JgplXum/ZYQA56yhefgwsB/YFcXZR1g28oUMf+icqYO+675AmjG7p99FSHB6adExkpTSsGeRvYoJ1aZ14P32VqEIVAstcPWF/D7bQ3z2dLjyMzAAvPjFE2zSk5v+YlpkGc9O0ahRsrywu8ultu/30JHulhqzjL+PgKlRei5aF1tmCxFTCtHeE3Fongs8nfgBi61hHKxhaC8X+098988QuPHb+s4LEUjL6KgFL9VeFfFPDBUsbAhKej3JGnVeSX1MWUabC+fOIAbn/9xoopn8XKppTWPIPtxeudSQ+FUcHPEbVOoYTcCZ7dZJ27m5wxTmL9WX6CwO4vi2VRPbtOWlpUAFsXqpqanKNOANO6ZOqFxpKDc05dzdJ83J7o26VTklLrO4O/2Fs2tCyqFI5Th9gfyyz2J8eYchg4IPwD3AZ7gcPPBsbRMV67MyLC2ThskAjeyNNKx0ttbxksO9o1VuJUSCgtXfDdS3egtcntp2kyMXPXTPsD0QCeLBqnMMkBdfjIkS+J79rpGNPCUquXr5aYXL5K4nq2Wr25bvhFCJNycCm926I2UfuT+R1i1LcShOTBHjTKNXBY8ybtqBiYmw9CovZVlT3hXC6rgwf1rFGk9x93REOqMHCv8IWTTzuPqAfhkMdeB2SEvGwkWM0ARubMwhbedEP1DQ20tStDBnWEmXJSS1dTCkk1rSrSAj09ix6I5v6R/cDcqt1oWWOGnO0giatIErSuvym0h4cnuudPYmIKn86XQZDu1Jjr7dKagLEh9VUg2csniz0u3nldodBdqRaAg0uqFKl5UO4Je61FdYO7oJRU2MzvxcTVb+SWUesKYDnSc+5DUTSwXPEDq50mHJLwzkv0n6y1KgCG/KoBXrXlSsq6GTZ33K195GuBV01uYHPhpPe9VxGE3Sc78yRTx2kzAllHav7ZEU+TkvdFCZU2lZBzu6oMJ9Re92XvP9FVypTJMW5BQPuhSBmSyttipZ60qbhdNaFvu/OSPXRpT6dHG0aHyLSYA32o1dO5VfiS9Sc6Ybo5RRPwbhn2dr4B0xUONU1xnMqrjfWsZToWtSXOo5Hvf0cEcWR2OuCJjRUp/RIVi5nNpBNYTFsbvrMPD/N1pD0gR16sqiQk2p35RkSaWXV7BSsWqlxRWsdvCSXKHy7OubSxYEpe9fLRd/TM4MvCuqpS71YhAB1P8jfp2aKdtvrKOs9VMg/CmY25abSlWaTZ50yo41vK8U3OckSsqUO0JLG7rKTNWmUsmCroYFptFwRfGECcZid0OeudaWr0r6LXGuVObhLn26xLjKKKLONe10e4HviJ5am77a7HI1tzs8RR6rnmjKbBZsFytNpQG7pMynM3K6GqgdNH9McIwB3cax8NmV9eZiiyPh5DWah6xjJzgwDZaszcIdSF/ZZ7+Hcv6k8yI9PSquJn/aqnb0tRoFjoSTeEEJ2vJjojOYoUTkYfx8WpRNaAWYardS/4pfp+ZOx+ooo34KBOKfZ1OVk+/dDFGXv1Rzxz9w60RVBVZ7QfJJFVA055Z65VHRRekNHcU2Biggfgsjsa3HSwCCf0IxoXxT9Ec+GUVy+fzPkUJ8ItsBbmQIqmDIP6CEb0F7EfuJ9tV4Pv1uwa13qGtpvkn+SdfOEN+fOAZjl/3TMzG2rYrR5Ndh/uBXkPAnaB4Bzo5krj3Pi1XHHD4GJYLh5A0VUVED8iXO001OwXhs4zHy+lZJWE+BrTAokL4ZRS7pxpvDW32W5UfeTfKKMoJyz/71TYvmnvZLAHajTgWy7GJcP6VE+h/QlaEEtAl75CxTB1PY1C4Ze4zH6HM141yN5C5jaEjLjAp3cKPU8gKzbbs7AOlmQd693y32jwPMWvoUnhPepWZP+crkoizzpUFik+7zh0JIw3RNEwogPVOwaRUAyvvols86YMW9yDV549SCH1TRjpCPuiuiZwsWpnbh24Gd6YZ07YBuZHXiy1naUn978SOpuM5harZbFVGPMc6Wu2tdhgZbYUH9OPO7SkW8JCxtGcUUykDYL2rfhJk3/qK4CRLlES8LlSC6U1STypnXc7kSCoFzq/orAxvBpP2WvD/VplVfH7hWgyeLqHNXUE8uFV9YRsEukWTj3lxpSVhzSXiXljXluqmOstJPgYlJ3VP+hdr7Vxo/ACr4nut4xaR6fa1EY7Cla1PhhFlWsX2but5iUpeotWmXW1nlscZYQKY5RIIkYQ1Z/Docd9VhbgosLaO0HkSCULccXVM+aXJR3q7kge0vqRssRqxA8V9qvUfSRJX60iK7rNxtT/JUFaedDWoTi2kxVqRqXWmTcGl6kfXPl3h4iASZT2sYS00mh2nFFOG3mrAEJsEMDyp2g8Du3JmTm0rJzItc5jIWM4CjZGZ9t17doOPIs0lj2Fo/qOzf0oChicxmZ2zls38kGMkjM3ORS1QbDmyFd+OrmRjC2IzwF9Q6J9+5LVGPeplSVmB4XhYDQWASTH9CQXPH4ASRQ86Ufs7cVEPH0XCiP/+g5+BqlHMF7Hm3xUvMfr84UrsklqFBVAn8O1ACAI/lDWJ+USB/negnCvG6MYotLMYgew338haq0TVZdZSywtNLCROFClOtqB0FJjzVH8Es+woDQVMnH+CMtepCnbXpoMVEm5VVcI1R0xdi1rGmTp1pvl15C6C+N9cohvu4cDqPQZVu1jf8CfraUffIVKNcDR1KeGLqQ3PV5MwssrLkhcLZI+Y8BJqADbraGXSIBJHTIpmHBZEg7rq1U+6bqidnZAmhs8CGyr1MpTP/o6LpCEz/Ay6eUv8XUy+8aMMln59x3wzp0Lsq8KfKti97+7l/kplUqpVPydI+9kKU0asH/9nwgJqssoUq7SMuG/Obv/XU3MsvRaaUcTOKvPv6Jv7By4oc+jIOCwOnVOBk4V4I4luUbrmkydvt08nRLA7nPJ1aUEDhDOtaBRXyFyrrltHMNfEWQ5omWZak+OAs2Fn5D1CnKrAdaJjOa50N6OWA6MiPY4ntTXnZtnLWynfBPUS1HTxsHhgRKgaj+BL643p5limSU0eoh4gwOIwL4k0D/SZcyWiD9Dj+E8vGMdNUi8jt3yP5rSA28PuE/lMthlIlIjgAWeUfSkrdiKy+5lEkPtokPHKkPyjxXrQbUOxEuKsWkvQ3uUgFhfOiBwtW66rWuf47IDdpD4pE5vXfjZMWLe2/O8xGONSsxxup5IApNYtBvvOBPtFnZrn8UWdMn2b/nOuf6bPNt937TJ/ZSJbb5tlCxJxCtJ9f/EDIFi6zOFrGCfqsc17sQ31H2km0pCXGFOQGfFwNic7c8w6fIsK4+9lU+ZxfBaq1k9UzGsgasu+HP3agk/uoHbTysOBFGDpBWctF3rKPGyxO109FhDChQfcqW6GqfCBXPScWPrXdHict2qJ4giIn6QTpkIgcsDS80QYNaXE5mtocXlfQVphTdeZw/TKlPu13mm0FdBbBqhUIPsBhFr6pVEVJk2YEFZI4hewH1Y84E9M7yvbOepwbqCqyYMaSgHrrSdZqpi6yAzNfyte1+bJ0FF/2mxKJ0VOz0FXA5H896Ba7cWX/KDSKWMBVJxbtNAYUDSJ1VQpR6gPYYqk6msKeMv4w6T96mcEpkWo4nraWPcI/P5ThDaTcPjO7mkZqfRd4TCqodZg77rdOmSNhVVVZvNbW6rzDmLw81VTYb1bo4tECbPwKDcVdYVSXmgsc7eMK3YWevCKU1AwHv0I0uoZIMlpXxFvRJOoQl8cFz8PQOcoChgXjZgn7DJfpXzXrCypSrFJ0/UO2ezSCUfE2pYBtRvN1y6d3aS47NPN+RgRzPB//WyCboAEfM/Yf5MAUWLi8R5CxIGnNsM7DCIsEZ/tWHWGLnW7vKRsXEyvdUVXjscp6o/fQ82R//oCi3J4FH9fIC+1htMzjdZ0X8Y7ffDWnwe3Nfim5yo12bGSVUoGEJBSYBO8L9+vTghx7KdPjc0p0mupkbUHadFZjdU1U15n+GdFaOHWiLWSNsYnqWG3YpDD7Js3cfDGeMtHnbeo9VFXELo5gqVmZ3el+n7w9OClwkYrBQhah/YPjaDjx3ix4YuG8Sc6SakQFXRMrDxfLLd6pSzYA8i70PlAsSHuLrjLdr4rePAfN3ZmzjkhKNCUznsUJwxu/R1BRttWSGWkr+yvleBgLp6992LU5DpNgwWRlYddlMEv+6zh42Fwa9IHUiartWojPF92uRV2FiUBMJaENc5Ed+Rf42AbxUFNRamxxT/qHdNR4osUYpWwMeG/jSQrrcR++ffndesGiSYXhdOnjz7/XcQGRHlAZXJCKFXHj+fTDDO9HeAjb34QyEy58LXHohuN9/enUrV7LiiPvFs+GY89+5MjQnva165sWzv3QD5vhsoj0dEr6G6HoVX5XojMDY/KGWpT/14SALxJ8jaHZN6ekcmje4ZMLXHHwPch0jdHOJYHOrjaLwf3UNjOZmNDMb82XiBzyH9JH1Csf1kJxlq0VnGO+h8Ki5+JqlH1C9uxPLEvMfp9LrfwovYnzWrdCM/HCb5qFr62Fpmb273/s3GW9YrtsAtVFNlQb+m7roqOdVLPUu0tovuDSrPdlKmXezN1OUqM3skFDoiE3xktEblx5jlKriAcK6kRPAlWXkGaDFxe9U73eaqE+vkf517Jgw9qFPH6D4F3pD/LKkMW9BZUi/k5LUBEXqTuSiMxQgi2SaGIJ7DL1W1u+PSRn2eVSpmfauD1CpZerxBVPYzwlp5j7N34eaSc/b2p0YutVwBmBqRToIUyhwubSr84Jp4p3fpOdizL43zCpXkruh/ue0NBR+ZCYOMNkp17A2BspVM7m6apsL/fdB7k5PxEz9g5zEHYmngC6UXH87+UzElVs+Emme8HNx5RT7krkDY8b2QeNDkUSY881yKieP4AvpKJmW15DQUFeXbOlqLjRaq3XiK3+/U+hBl1dMiSoVKBGc0PCxa/2AJHqWOQ9hCWxy5T6UBQ8jJoXoSNm5hcyqUy1/V21dORdt26d2IKzxEDHFQ+8hzCm4IK44L4wvhKw0Yxh08mES+/W8xQvCsUE817MhfmonhKf6T2B2mfvAA8T6ShtL2g8k0ldqCwuDmhlEr/P9Bf5adJV6pbp3C1LqgA2rsNim0p7C08mDCTkC4ifJFy/YRIzLq8CCEMJ6YUzFHA6AdUAkwEYe7l9hiG/LN/hqp9d2aE31pii6vJyUbmmtLm+nsQTHs4w91ZkN5FONamg3ZTerTme8xrNQanNgFVoWPSi0GBPNOqc1Z0DnY2VR/eu7JUZHaJqzdBy5760g98Ukspec1gUbg39v0LxImjbMDFw6IpjWX9ajgVAWJ+Xle4Abzzb8kKHqfYodTdo5IjIRYmkEF9NBxSNzz9CdOcFfBxfmD6Fs3mNarfOWpAcry0oqtOZIjq1OpoocFfL1BVWHRbfJRN9OogqN/4jxb0WL9fLwxyx0Ss0cIS2kBTY12H++FWhXh8oV9h9jfmW8UGfYVH99EWNlQgWNnkFrY2efmzYLiHF+H6CREky5SsDGlpuMW0j7Rnwt/Y1xc2j7e3mNc0xv7chbhrtaDOtaYyNFzjJszv6GcsvyYSTqHMn9jCX5gIaiAQpb8XR5qgkx9AjmkD5ZK0JzswUo+i3KpgEC8tArboCBBS49y1FydohewNSqg0f1RguLgH3EIKvJRWJJyv9RnFZfswbKPbOzsuONeGKNGyYBG9neXjTlGHgQ2KzP0JfLGl7zDUNjchUiNerLMQhGXl7JysCFSpJSJoBHcOSFp9bHxSvUivl4bBNxX43pVaFlHZjWbUeaJuAjmxBIBLEnitW+kAUIkHykjHh5iv3jZXEaBfQTPpgHA4290BLIYxVSkqO0N7CA8kxJJ6QmGHNqm8DvvjnIq6hlG7e1JzPcDk6xn4lzbZO4C8oc0d8jX7h9gzICl7109T1E1saPXk1dVqnISz7lb4Y6F5mCChlIaPdUllrcBbXOA2TIyWaFaWD08JxGMfB0umorROZ6TXnlp5r5soFcXdcEdMQjlabqiARDbjLKphGrMxcon38W2dWxQRw0+FNmrMLzevQIVKcJX6rDdMASqmeltYVcGXiFzFV5IdKmcemjuRb7almbaGv3mhMG5z2dIXt5aqQIh6285IRqUHlNVoU3p+kjLGk3mZwR1Glzi8clufH6mLAm4ghqJUlzDZrqlbrLK5xGCZHg9oVlYMj4RQOx8XmVETtnbwcb+nlXo4CjaE4OjZMNc0PTPFEd2SL5whVXpZKnnKbsezX7B4c8WqY+xDSw4oAdMABv2kaLq8wLl3ZWv4rPUtQ+cRtTv1iXxr0dE2zbEHSAppMrdXlr95fqn72Tb19cxMkbqrvg576fag6sOqVYfXPuE8Bi6tnYTUEq+TKjUWyqbYTPXWtrXlRbcDLz4giBp0ofFau2I6F9Xos/KKOw/CHU5w4wmUFI0kkCshWj/31bEQ4RbH60A/GMLbYZaqAfxB2beJBJIjxlMf3ALatX+PfsORjnTQWaTy8l+ysMei3CMXdbdnLCaybl3WJBJEgsAmPU0024ICZFQTVN3L2LKFCvXEMPkzXa5kMVCnxyvFEHHP35wzBMI2Va4SPkLl/aXRnUe77G4AbSvqLfJAEUn5mcQ/RQRIoymZc4/RtFOMNT+dRYB78cAKcxuWLD1y3fooHlAfwGblL+Qzngz3tTGg3XSHOmQ1mZmanWQs3d1GU90TSb1WE0gEwB2jZwDG7DQZxYSUqbHlIXQJUvGS+LNQEbWZnQcBqNNc1FF6mEqEbzyNJDb9/NovxTKw0sZilvwHpkFMG+cg4lgrczSAzrRy8Z6qVxiX4vD0ndqjhvQSZBO8l7AUUgq2QCUlAYOfY8z0slEil+Ojs//3w469GBDmlsPcJkRxgSt8GCSJ+ImS+xuY+vXP3VzPv8c8GpZ/Hu3gfWFBil2GqoMlkL3Lbbbq6OrsfAglgyXxm0sjv72HTiZhmHZ8KvQdkU/7jARv01YnOeLZhEUeo0hdOc2KuQLRDBJBaIWLomFpmiqxZCf1YTDwq3bntq7BsD0Vb1+pqzyq6WIwb9949ho6Uo9PWP0zn/O0RcM9XNNBfKiEiYinBMdfzaAJULBn39mbgbrJC4oTKF226FyTfocWlD9bw2wwVn1EIJS94/i+uKkl7kuOZ95jCrj30YaE9lFXx6PnuEtL9/WbkriLlYg76zfHIiTzgS3b5A88GQx/HfCAEEP8NyOqg/fYnWG958224B1hNS7MkyviAihc1SdL6cWBgt7MhWogD3Hi6YVIoDc0UaTWCA3VbQ8rEGsaBWzQpo1madRCx53HNOZxGKxXYvHeI+rZBSKGIRwjv0hE9CtZsz6aXYeTsFIQI6CA5JggdbSMQK1yD/xVhiJN0m/OtzT+YK+hv0zwywQubgkDaArnI5RfG68PnkExqUh/uvkhLIZcLT18mYGA7ro2Wm0tbyBAw1hLXMy8MQTDsJaw3X6s3x9qgHscYKhvCjbSBeXAgiIM9hA0bNxn9HuH/hKA/ARUNlC0CYm8Hl99IkcT0TlWAu18p/vFI6XdnZCQFhfY/2tmcAJuPH+klimVprDOFMez4vxnKJc2eykETFHHM4FQG720k+eEdzwOA/gdpsuwTXszk9b98Htb9qwj7tUeNJX/FRL8mYFeXrGbfZ6ZtSeogpHuV/xK4CJuqy5PwgX4X5+U2M1NzxDNnUJS3sVcQSIH1ultXTL/0sYU7O1P7l4iR2AZlAxtK4dFSsFULzy+FqlW6Zi7Y0nZgBcxmQ91TGzh8HmazGsRaWSBcAS0IgMjv9NPGd0IAYz/56Ey4evDVIYCdgzWTdmU/xQ5bYC4RwukxBMEA0X6Yw4behNkc+KnoH0fKGb0BGkOjbV/7rJCEYqUWlzguLV48Mu+rpNgoIWn7iG0/IPZosO1vO1Xpp7pL7AwxFKb6SZBEmFs/PAAOKjgHXq/wZDSbi3Pi7B9NOBIOOQEBSb49fmPN6M1kRhuQICeUOBLO/COXFCu2ZDRzPMDfD2uDSfwDw7eBS/HG2TLFGZxiJ3lpedN+/s4nAl2E7CzmZEiAi6fK2e5y4Z3yO0K3m51zVRPKFfcl1zUkO26ZIp5lttua7q17mO51X0DS+gRZVWOqPsVJrVoR8HN3dr0113J2Pa2NWrc1NIOVz0Pn/nOc89Rvra8Fvu3MNfpy/WfaRaG6LXXbwLYXoG3F2fWQp35LvR6TQwaKOjE+VPtk/s9Zwg9/5ouywYeboGcpjv8pBVi3ll7Jb/dVhUwibmVLjTp2zy8RMvK4bz+0FFEfQMr70fsIiyrxWf3FXb2eUKIr5pgVLfNNm+Et0yYZY6Iq0ewO1FS2xJMaqYnkT22qnKH3lU31eCYWOfObG+wu1f3SnFwX/7k6x34gtZ48UG0G3EsVO7x5kTxvoSps0K3B+IOSfHNfeVfnuOqgtS1vkZEAC6v0xOIPMkaDKxL1Mz74ZadNV1ZhKFCdJGLKMZ8lavJZxpRyjb9U41Sd6qEFdY6AFiLCPwBUBgvuPZg5kxtSh7yFLVJ/qF6l8QDNFzSogDaRx+OKanJzfspIBofWpHPyu5G6gvzx0WlbhxeKSvAa/jwuTII1txTA3TmRqUBAGB54iOgNjdeqpTJdVpynQU7/uZ+YOQgTodqaf1dx2W+K5bjQ/ihRy8n9bOVXyAuZ5o6MzEGICNbWfL+Tyz4kluNK1kdJWm7OZ68Oj2Pzh/r1aolMy43xgJlx7j55VcQ8OVjiGGgtnanzpoc8xROLnN7OKZ6EL6WXlMjyLNG0XMMlZbPoeWyKrWt1LVuUn6dBI/9aZR6lMmr1u7o6PL74xFDetJBH3hkOtyvc2Knj/xNViS71osCkAsdEeUXY1OEusfU2JKeqvNVzS0pmJDymvqqKIcN7i0EiyNwpuMFbwwRJILmZSn9MMRtk8v8naG9TDs7QKQcY9H8l1wQ/8iAiRMbY1DXbuqLNXn1/qNY7a8gTL233G7o9btWkaGycekoXQVctDr/Wp3AvHqFkQjIz0K5nWRwQCWJTaUT4EMuiZdM/5aIYherjgkSIwKRlQUSIzWKQZzJPs+7xIRJEncNhzaGCJBD5j3WGNf2XTzIueDM+EkmxJUKKQqIQG1kna9jrLeWmGExK7qjsC/iMsSd9WXQafcqDD37Iasea+RY+6yEu6/a6ltfg9p8Vz+FhD4GaJtoXKSORjT/KXQB2DxZFI/kSziNVUTiSlxcOd3Fqe7DpXvaMPszK8wIiE15jIGdT6YM+BU6/yN8MBp2AQVuG8P2t+CnS2t84+nG/mjmwcw3gCNF5xZu2bcI/+gy/iX32SByWVOVeaLVl4drhUYtkothq9Fix+kINrUIR/EtvCxRjXvpcOHNCpm3+K2miJN6pL4ry4t9Voa6RYmBBFZschPf7efMPvdVe5gBujf10tuuq5tQzke67AF+k+Cwm19wNCNkIWSNyVfA5T7TCnBDwSdor8j1FVd0/Aldb5Uq9OyWzb/QV7H9NjmxcL36NhcAQ+FTOEKQQceP6n+6PKxarMpOoTuLPVawNZzbBa83lAYdApGQCH5xdrUx7zXpbypVDG4VzGjIDA6+UEiWVXS5n3S5dzUt43Sr8LqbXwdHV0SOe/3ZpcI/EmqbnxVSJ3D3Zm8PKJnAek2Svc9b4TcoqBdDqsVnzcWkLdIjaEjwyuQomYkvSW3CsG/8WEYfNW8k3Ub9Y/CUpowNHoFPoq/i8J+c4CoaP4VOIXf8SK659jdfp8V/j9DqgZ7koC8kSZSIZwV27XZT6Fy1X1520oDQ1zdvHvTBGlrcedgMjlxeuYcMkOEecw7ncS4ZIkPC5pgn7u3Tojr8wv0u7h3KxB0TCD0p/jaG6CL8jSw78jjfeyiT8EK+YvslVK9j1xgjogzJ8hROaokPyYmsd+4o+ZOgC++AGmdcjNXiqfbopQLypPdGvjyc0za0zCCFXX7Unz9GQVKZoc2HyELFyANdI3QLh9Drce/jCVfiTkx8dX75RAJvML6oVb7RChwjqZrPJlE0QkWJ1FRhIfsIn8oi7rlPt4i744wti5hCOQH8yIV+ivEgNyU3sJCthMigekadRRMJ1iGIbrvufXH78NFxqO4CXqTcxelSmf1IBHHrW4LTdXNNS/O4sGbByRJtWFMF9c/hgc2fCx8YAjNdRDSD47bciw1MRCXoqBHCwXwzU0zX7j9hxDn4+j38luSpqAomO0Wmrix5XBPQ3e1FPfK1JpjK5FsmHjmaV3AxIXj6yoVeu9H74HrXMA1BgJgOKwgwmHH7EJ57rmpP6e9R5BfvmZWobbUs9QOddBlH0GAAGcmToYx7zLREwaQzc0ge9YwjrYBYLiuqB2HzqAurshbMXigbBWX/iGDhgg94ZjuRLuIflzpJoni0UFvLuaKfl8claE9tn8MmPIFIJ94hcsZYgzQuFKbzbuuE8/jOtieUT0cE/74B9Qupfd0CAg53+SYyDTMDJnySV5pOrT6+mTrlVBre0QDS4pQUGNh84dY9ElFWa4f4jrfNuTaxlpyb/etGciasyu7qvAv2Sr78C7SZ5pRdfodE+zc2SrqO209AdLKyOy3qv9DAwsqWqrGiX5osS5inzjRX2A1p75SpxQvnfv1PxIynyY45+nFLO46DkN7JDR02dZv5lBht7a29GB4f5OsIf4YoLpOqPgW8vfQQAGHi9rV9+1UQu+C0Lhr9JXgEAz95m/QGAF78Psv+n/xV+bA0I8chhA3x/u114l3F9EyHQjrnsPb8JK5btfLL782PENWf/mslp5y2q2QNXph2KAA7zL1WVuVRYM67LNTlXtmtLJp/VVCOaPdyqSfGI5z75g/WM15TFjPD+jqocRpa2+b0Nw8jN5zJvsAs2W4+sFe7JK06IhdbXRdgccBskwA4yaIKiZtekVvF9vD7wnfgZ2irYd25Iuy3msnHI1YGdDQ649lHjZx2vM66cmptk7v92nYnAFE5IKnZlWQgD8UN5TAbGeLglAe6ejPGj1zvqwD01xICdb193P+sgcca99/bEXEtl3V8karOTuy8ztrtOwQ7s7sc3cHATNhFcB3mw5ZSE0rBb0vpITDzVsNTY4Tts5jD5+ACRVaSooc02Mfla8sYTxDbgLlwljgMeJ+4BKnSPF2txPhpyjRPPKGtGNmEpC2TfPYx9LXXL2PYB67bo22VOjZH1rqq8TNlvY13MsbOsOqprt8m6xKOf9CkRLSA72bWN5dIT6hGPwj3xGKzF/rgP9sZOuDvuggNwBHZXYruxR3GXlZuTKvMyQOE/Fv4hjwziYqsYWfpO68fIokfMbbYg4q7fDZFpQlN58pnxLu4VO4gb7jBfylQH+B+A9wrVQXURaOWmnSba7K3us29mmTAw6FyWfSWJXc658g/bm9wnF/rXlBJgD0jky1amFVlgt4rgbpXHlpvHLhHmeWj5bLmr06wb8HSkaLFWQ1Gtu8MLdX0yvrFx7PpslbKdW4buE8M2Stc3Ju3GWvyCNnvErhh0hzNgA3sN9qsXytCybyf3DvKcaJoOEfqOjjGM3Ms8+5vqNgJusiq+2pBIvArPJvayQ7HpLI+W03BL9JuizDvKKlgPgJyFGugH/UEDgWBUK8o7B7fh1q/+i37Z6tYc/atJ4y1jz/ip1NVDrhDgXmcIAACQGipjKQo3SUNF0VkK8iwvhRDnnkKN8TyF6W9vCkepJIWnEwDGFsdylEjoSJGCjBXIFAGNnNz5JCmSREg2Usa7YKI4kaaLao8RK+PDYzOmStefh0hRjOJ0FSmzzLDmFZFO6E5FZMTwMZgUcGFnhuE8w6QhTQZjxGu78+4yJjKYJspIF9fdV60Xd55hUV5SC1c/mNUPNvVMw3EAzdFWGMfPANdK1Hx1BH122MpzpSns4Y7o/RVTdhA1R0ExAYU2KV6USGOYWYeDd4t06nARI+7BfxY9d5GHssODj4gGGbErG9L5H6o1pfMI27ohXofXWZYevmPcC3CQIkMOVnLi7B2XMiBKnQaNuvmNW5nQpFmLVt3LAnceZYNnBJSiDLzKQWM0gWg9oqCiodfmuhg3rXLEUT190otOH31jdMttse4wOnV8MCgmI0MCBxdytvw06tXSOyTSYVoGrnqzMwnMGeL8Ntp/uPdJGsmlcPi7ScnKkGl28mYZy+LjHGc8TuBy6NA2MR2hY+Mck7ibjtpc8y0wzw4LTfaZCupnmi4ga1kWW2KRQEGChfjotFBOp9MryFecBIniJUuy3Qiph2bXM41yTEGDFClmgnTwcq4nI6iE7WmwI6Ji4hKSUm2xlQVLVrRTZSoKlCmUq1CpiiLizaxNXp16DRo1adai1TjjtWnXodMEE00yWZduPXr16Tdg0JAppho2zXQzzDRiltnmtKSlalhO3tKWlV1OueWVX0GFFaEVt7wSZkzYsXcAs5OjcpflMcIzN6TVrWTaqEq/8yYlEybcYENdcZUzFU9wyXDG1ASOoOunmS9XkULFlrW6NWZ42/rWyXaWqFI5Slvfhja2ibEvvjpJrQsHa0SoMIy4zZW1pa1ta3s7Km9nFUr4WO6ex+57oL0D7W7Pj1uzUlmrtMcTHj4J6em3W6Um9oNcqTSqlXqlL3oGytj1HEhsMcrYWZa5YTl33OPP0gUUKyO4Wo8WZlU0KgxXboh1t/aajNgNu8HNimexJWPTqcmgcx3ludG3T/dHaAPT0zo3y2tsXE/lfJakrpdDPp/FetjtcpHrOciuLQ3ofuLI29nROOpeFHk+JFxeWL/b5GWtJRfQk2WzbJsZ5VyKtx73C7qp69bqbaG2eGDMJpqJpcWmmqmlxQILmmBpsXdFaXgaUgM07jZpVeXksk1XzFlWbcw37NDzIT5keFU3sxomZCSjmIjEgbl1MIRr2kgQ2Vh6bFUkGqD1H8HuG6gvo7I4VAMj8NHJV+wX+wRSTzvxCciIpj3OR/2c9qpy+eiKuMmX159rHnjprPmiPJVL61IWtKAVFVTQgla0IsE3ADOONdyes2c8zYwUM+UmGqMNJogxjbEXRswhVh6/oyirWBEQMQItAIgWGgEEWnm8kQLGAIgYgRYARAuNAIF6BJKmbaiJmW1uQqSPqbZ8f5GL+F7pd6O6VtS749F4PKpt+k37XkXPu9j1Bdu2Ozf/XFOZ9vvuhoQLfEZ8456JQsKZKCeb/EzKzox7J86pw0vvvRK3stU1Pj8JjrjL20vrO9b18byfeQTtdn7kU690+K1iye+X/L5v8dvIhgCRZYPVQ3MB2bt5WhaXGZzX/9krrLe7fX8QffX/deY0bzkAAAA=) - format("woff2"); -} - -@font-face { - font-family: "Creepster"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Fredoka"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Fredoka"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,d09GMgABAAAAAFxwABAAAAABBWAAAFwNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoFQG4GvRhzVcAZgP1NUQVReAIU2EQgKgbtAgaEUC4gOAAE2AiQDkBgEIAWEXAehBAwHGw7zJ5huOl475bYBtOPXkPVLdAHVazeH0HNrHDdaqtTZgdrjQMa0T/b//2ckqDEGwlsHomq1bYbCsDBcZiTWsxNV1a1G2qzqFdVZ6UNgIaKzpsNF5bDt1lmK+4wJAuaM6cYjQYIECc2vCjsyLghJw2P1Eb2H+sS5+Wk9BoiB3CSejPblcoR+3ffTTvu8/ve22xfN0DQ85cPFRX+v6vG6z7bljR/7xPmXScNKt68ouQqMXTYjYtVJX3rAuh7+66STnrmP1E7SN3YCVwSnf56v259z35sxmzEGQ7KMYU+S7PklhdolRUQb2oQ0DBOTtMuv+b5la5Lk+6Xla1o22j+jVcumkt/XLmNLG0Og5/+VmlXaGqU1ahZdRkpqRrasQUJEkIREEBIhEYmVCLGrVtWsGKWLDtTqmr/RVsd8Y63PP3z7Pez3GXkXT5AISTwkGnQWVURDshJo5df4053//92se+ER6L1RoHLOsGPmXzuRppkpdaZD6yNJ3gr80t9VFWRNfPs1e6tcO75VdVWAcAuc5C+wcP4wslWW59soiILr/522W/u3vZ10zaQzt6dGKIzioZASo5Eo/BnDWH/pvv3rECuvT4dWnqFdxIP4YtVDNNsvJTM7/UN00eqlPPIQPZPFTjQfC7N3nkPsf6fN87AoixIohdMo5NrdI7dy7U+a9nZuT2iGwmr7AElOl1FUJ9bKOYx/qAv91ZQ6c5qdw+Vg/MY7fl4qhyNSsYxHrCj7oh6qOBiI3u3svWAaiNV4U2FFJ4hmnqBAcgtlAAcjt3+u+f2jlywXje1kE5ZsbAFYu7tStUqnRaIW0FmsI+8810rvbKq7N8YH6cdjAAGDIbQgSN0TpHhHroe4erkz5Jo6YqndorjvvCHXUuesDZI3PvrU+ujz8Ez0zqbxp/Gn0cPz/Vqf+v5Tk7dAXR0Yl1qhI0xXTyL9QP9NvTkDAe6E1V9AhdAL5X/FAikCR45AhXWMidARlq3/zbTsztsri7qQVoVx8DcNJvWTjjuXUlWzMv83VanHvCRthYILS+BYAxHbJ71f6XpR54RrAJLvfyd5SO7YC8C+Pl4KS5lk5LB2y8WkBNSVaV79rM1jr/HzvKCxgI7nEQnBxoKfSEAwdRbQ4+H75Tu7J6WqLyNv3JsY16TMzNufBLg8Wl+qXD50FUer44mxKGSMxP9v2u9TajK0prrtxhDhWKExZjN3XibtbfbM7vzej6e0WVoSqvyLQ+KQYNG4qgyeg0VpjsdriCbHv98RBMItjMg5dReew084VSidCjFOzP+cKrX9rKyl66kDrUGIzQofDKKR5ChD/wrXxL0C2rKUFRqzwteW8ObNgF7MQSSVjyxhsRL+sdR3+yL3vWzPY5AiYQgiIYjYIEOZnt9l/b8R/b/TsEHDjG+MtdZIkitJkiQZGVlrjb8NZ4hW2WUMq1jGmxxjM7fBslyUGwroEWV+GqpLXVxw5Vq/hQCGEf8qFIIPwLciTBFKKF89pPYYeuol1O479MsQjCABjEYGYDzkAcZHPcAsE8Nss4MFhYHNigRTag8r1hNWpi+swomww06FHXE67IIrYQ2Ww5q6iaqrLzBtWlT99aMgAtwKuBbErKnmNLWkrR/CbkLgGkLko5/0lPUZnp9FCcHpqxk7hNP3/ZnAFA04DhswUAJV2GEc9ebXJgLvw3L4vu4O8Q9l/sCmQBhusXfbQBuvLmC/3b9xpl/Dbz/UAnxMAogD4Z6TK9yn4GGwYEKIt5nBwWBoYe/XfZjquUFfUcNYlQ07+mHB3W/lhGsILw4jeYkXf3E/4cVZN2Vn2iIs9IJBjOq+XKY4LEnabImko5lgcRiS57xwYXf5C0Z0LQrEgCojP8JBg2QEVeCsP8VJBoyn30MHTUXo+RhV9DArpkJOoZdH9q1ySOEUTcGB9BOYwkIl8pKK7wL7seHqbIZo0ZjnaSRC/SwmX8OogW02q95gbQQrWJCUlxfMmjK14Khau6qZFSuaUs1dRbMtU/w79riSSa4NCcdb2hgjDfvA4YGeeFwuoppaSYeNDPKFm5WXu/g8i/Xi6SdbOKqcRzEpIP/jcKsrE85lNpXy5qIjcSDVe4WG7zGcKXg2+1GnRqUyBeI1WrrbDjlM8C2ipiAlxsflyLHQEKDBxBgKuXQiR/+B2zVSB9e3FrhCtv2w/GuGyV8oscN8SznYUdzaj3K9+Lza4/pOHH9eMyXISWZbEbc8bb0wahdNZ0zlv37U9ZqAWkSDY6qOyVsQGqtFgBN9nFi7aGue6MQ7Jmvl3nDcRZJMOpwQXUwCSxpSkibiOvXHGNZGqwbZXXZ7bvCUe0Rtv502qjch0CrZR79TvZoWCzM6mtHjZyVvG6OIKEQhClGzoOXOOItxJ62cbAfS4Xc9SJcIcWlU7kRFgYctXyNi/HD6EwAYKLQxGjx36s7VyaYN0dwQ/nDUQhzSNDfIIlB5gpK7iF3Mq5p3sqJbwS+lA7mI07RokLZAkz6hlKVBuKSXfFNMMogDccjVtOiNDWD0G3sk2GQ3KDuqjScBMFBoY4BrfNRzQE835+Vyah4NDqu9shKRizhNazYDYSi2XgJkz99bjrvjMU3VxH08RR8G8BXf+L064qcOOQDO0m121plNXfwRC5jAw4Y8QO4ld5HbvdwCxs2bmJVR9l5VE1+JOXf1vLOe9LfVG9iwxTy3T6NrjXfRMbitfDTuohn0iGs0cDmdv2PT2WSHQF903t4Wvks7oqZOjWKQNMTw67kla9AgDEaXsBHTc8clzRzMj+C5RFszIKoXwLmB3ohDdYMrPd9glPmmztp7NhrCsSco7htH6fTq9siIIxNW27xFoB9jXgjiRGhMXwbUcXX7clmcfcV8yw4QCgncS+PtxW8HjV4dyZfgsumIYhzwJ0cDCpzWc+WmxQ8WAfl68GSpARRs0JaCNV6Cg5DhOgZuBFJ2xZXfY9BD8IDr0cdlxI0ud/OMssAuM+yhtEm+ApsVq7ct46niAtdpsTOzfdfKPvYBtonR17SrC5JzH0OABjam6188olpdfhJY8+U9QoC60X8YqsAHxnW3RIMbvC2YDaO4WCZ32U5IunP1vtL59UGVcFua6WlFMSWT6i/hqL/wpxMzzPYvHba4G8NF7ep+6zW+70ebhFv3LLp8mSfKJrhVZaR18iJyQbmuBVorzc4VcMhTez7eI0yiv5otb05YUnkbYUREeCsT4kptWCzBCWNacyLKS5an9yY0zWX1QgQTlSzFtrhr+/Kx5nARvSzdJnLtIhKXYdePFy3b0ywzrv5Taech/fJ5WLR0l/OVFwBtG5FE8nELnYzfahqAOP4BOcHBQhDDCHg/i0aXPa1nk/mroD01vDAI+i166ra3SaTJUrRwwu6DyxW1UBDv8+hAboUbHW5PK0ziHWyxzq/dWBj5Iqr/K5djVwlWu9H/2jJVHfFxv21E/Ho5auu73oUpPS6FI0z7uX7iF47SZ6qwKT59sm7zMzdEwacZg1kjv0nbu8mJKC0IyXcuTfwZ2A9WXvUpXIlFMYGKjVxgZQXcrOFli24Od/HzyI9eAeEZN+vCqjmHJIXFdCg8lk9FxWHf4nI5troCbiUl55msSn5l0ze5Bq1Nr1Nnc+vSV2j9KLwBRTSshY1GFNmkqaKavhTd7NvFtGCxxZl7aGkfeiMOEeJF3KFG3tpQjhcBwihgGg2cYwDLmMAwFhDGBo5xlmDjXRyjPJA884J5A50PmC+k8WB+0AWg32RMCoRfMPymwW86zMIY1XyowpEUARYF3SKwxdAtgdvSm9gtKwen2PivfFyCR+LLxWp1EjqtrQijZMDWISoF49bXV16aPFpWGVJ6Spgc6DaAZULKAsuuk9+kprcZ0W0RtrWe5bepP9ypMd12Ibo8WfS7mO2WoD3LdCMYG1FD5hVrdCWyqlT2lcmgco1sr8SpZFRlzc0o75yq0jJblIoeZh9u16OewJ72DMGZ8cUGK/gYQ+GAkSMii+3wtYeLXDBOaViwZMW6ibIkvk1kIYiONG9KSAIcrl9QaIJptIqpYcexRv8hXjP6vVhZAUtW9Kv26sRdEnEIunDgogsHdjDXCtAlIQ1GYsZIzJpYS6I8ie9qZCUxbaKJHgQxPAzRg8ISJxhYa5KrOGKKHSYIsUCSHNWghyr25sgh5IIGbqD9rd1whdrRma2Wv/K8Vb5NpjSxFnDISBgihTrIQjbOL7WnuMEMOvU6ZcZ5epOK4IaTdSzoOwMz7zArOzZVE0xicZKw0iyQCBlkF8a+DGHzBaLTGS7HHR7LH/TzwCj8uKIUqMbA1uqD5Q8kGZZOFMANdRhIiO0M+nTxOb4ZBKDzWSIADdwqlR4d6ojrgS3moV3okCSWx9d61JQGSKDbIZUqjXPHLVeHooiSAjLzKrL4+rk4sUnhSo1X1mUhZaQgaYoMW51Ak2YtWg07bYXyJYeWdaj4Ewno+sqUl+6bogOjDGniwQxpM/3IsGU5HMRwzHrYsOG2AnvYUo47SOoh48H5xBpG1cibF7Sanfth0bGHoQJA6IUwlFNMr46ViE87Sr0351mRGxrHROgp4QEYeOCZqC+chQfiJ2IF0J4oW6GcIydqGtfuIbNjY6Yz7OPKnKhhaIdRunUNvyvB418idxTYYt4UsPqMlhx4czzzSL2RwY3tL7vU0fv8n9NDMz4MQ3z9GbnjFwMN7vrhUjgEmQRJnmPPX6an9MPTRR4Icp4XR7bHQ0QOtu6bZX1Q23ld16T6S4I55wCghu66/jl47UAMxvWth2g/pz8RZBhWp7KT2Dxmrt7otztP6sWUS+fJS/wm71oEhfKpjDJtJAtyhHB3OxUBOzpzP8MFRgPiaxXjltXrvhDgWAw45cb9bXiM57OXQ5PXf9yuvRcoN005dkhBiHQdWcsyQOX7svD/ADsr7V27hUTeNSbWC08c2fW2J+TIfjAdqzL5Jvhp/kt/yaNbc0wy7eo7S3ozUV7S/xnVMIlqdYhMsUTD9AqSbkQSjNUj8FlHJBiUU5cOafWxk1QtJDFzDHgqGC3PHdlS03ZCM9CwW590kPFSZJGjLtj6MWa50dae0CezSr/9/lCT3HAG0ekC526uVgk2i4WQCaykCAzXDditxozRlsB/MNXshtdKG12QeV009+hcgmAynnwiJAQpjuoY4CvV0Tlx1vxVcXQLVU8cl81XX3ZJAkQ+6eOgh20Zagh8TrqmzSWdZAh+t7qlG9oxEwCUKNDydVQvf8TlEEF2CVwKeJlfNNEmFnqTqM53bhE3lSLN/IB+qm4pIiTORWVXjlUf4XffFzHxLdzDldV+6TPTDxwF6V5C1ZMbhaLMBAUd7D0Joc9WUVmQrub4xzXWXtPLW9U1Qdh36xXDHnT/wBYIP7xdgpcpsNA4bEpP3oU69Kto66vlq1Zmf6rfRbGlmKLb6bH+v3jUWrBzJER4FpqrJz/wG9U0C+2cx+BEXvuf7QqlkpCOkoRGHRF5bF1g6XXMEwy4TKnWcx33NuIkAwFyZFurxYhbB4f2hrvZGPs/FQvJJIbEygM+2ZUPjbnxk43NriBbdBrGgLhLT2/1CkcH0o/sMflP+u0+1e48ZF/PVh8268z3NWnzi1516Weyv+8Ij14OuxucR2PD6C5WqVoAMOjSFFH2rd/7w2UwWDAc2FMiFXhDnH4lRF84AKef8oDkfWZQB898hQp45jtmTbr2jexmJ4+476v/ZzXL/YW0yPuecrSWq4qz6CoC55gEV5ZOtkdgJjn/r1f8j87Vk3eGi2HER3h/Pu4t/udBdOFrr6H7ffSBG1i9C7ifDt9Cd+pi1Tuof4mwXyy4JLMuFuAkFt3lMqhR3X+/owGqzsQUlJtXiOLwcmXsUp1Ct7xaeDpEh1mPVbLvhsnELfB08OSKbbZ74N0aAMZicz2ZlEIdRiK+f/n/GfItghT8jIFMGIqNXAS8fTcotDZotDUY6OAwR1lZOiwnlgdrF2s3y4vlw/JlhbIOsiBlsYc6wevCIDXrkEdTWSEHC+s7/ldFILYg9DAI6ENChmhGJJA1WzQ7jpCTUQw5Gw25cGVoLDdonHGsuZsEBZiHFmY+tMACtHALoUiL6IsWQ9diCdjWSjJCMilzqdIIySjwbLSJSI7ddOzxB5RvH6JSJRv7HUBUq4H+UkvP3w6xcNgReo46ysIx/9BT7wQTaueg866gXHUbccddlHvuIVo9QHnoMa4nnkBPPcfU5iWWV16ZoN3/WDq9w/HeZ2a6fGGq21ccg74z9sMP6KefiF9+8TVkiGMECYyJQgo8YiADvGIiE1xjIQvGxEY2TIyDHBifJAmrbLJhlV12rEaau0nrQTDwCx8j+AjgY4SL40ZCGYUzo3BmFM4PWTbTfVbNHj1FSJQxwx8DfYaC4WMEHyMcsMUOB2yRIGYkfMbixljcEMDHCD4C+AjgYwQfAXycMMITS0Yf6ZTS0ewHSXUfG/W3YVD9RnrhTwV5sZF3bA/eHl16dLIDYYzIIj7OmBUdEhKjM0XzHNFk0mQKVvY8XPPiw1QRmud1dXKkaltvCAsbJFXjsPh2uxB5drO3RwFUbB/MFCwxg8DGDnbYDQl2eYooSHsXZgdmcOBXhVBMhoKLFWK4GuQFyCTG4Ys13o7PCKboPRaNL7qgUCmrAgCuAgBmxpoRY0aMGTE2HpeGQqGcMCQAwAAYRkgEI8TXG53G1c0OgCUrltUVAK5CFQBwglL/AEMwW2ImDEmmRuXY9GyCKs8+C48xLo1VvP30H2NoWsuUeWIcVUV46C0AmMm6J+gPMRe/b3wlOcD39sMfAnh79iMmdHgfonzzhV/cV6iMdVMk33+w6eItvy/v0Ct8oXLy/rYM8GhdE9yKJvRq2Wh9XiYxyL+jYyGZgthOO41RqIhrDnG3suIJ7k47Z0J+eAGG+17mnpwNCCqV4KRMTbE0LTK76Rm40QxzCATSr7Z1sbaOrp4+BBNJZAqVRmdzuDy+QIIZGhmbmJqZW1haWdvY2kGOMPOFi7DQHkp/qHZQjb/UOqzOEccc9w+1k0457YyzzjnvgosaNLrksivuuKvVfQ888aMkUk9aWslHgM207E7OrlzDNV3LtV3Hdcsh+kgxJcvac6VESZF8TOukWE9aUp4Cv+N3f+/s8yUyrn013TMwAd/QDukDMIBvNQHgNHDQpwauUcytw2F1jjjmuH/UO9FoSkfPmO3t/IhySPcwBCAAbev/7zw323VOqTvVsKwjDUs+OErX0X05OpBbXxzs+3H+rkjmNrNGpygEHyhKtCNisXBIlVOqUK1GHb16z2x0z6+F7vW31LNFZT3Oo4+9otZNh5PkZLhP+/f93a45ea7sF3rdUewunz6Rbayeda3GdC6mUwt5cFvGwn0DUFeUTktcipaglmym+1JXXd9tk7dnW+UWb5xPChpNo+Hu6Umtf8+cPDt+riiERPkOHMkwjg9mY/FtdIVZwEK0TaxUqhRU84tgR5xW5x+e7oyLWRq/zWzXXDfHEy/N1e6ziLptfEv7UGKJ6ksq6V7JRc11VcuU0kaqabXoYVn1mF43lH+T52gFFtnh0gcnkUFuw7vJcvCJxUj56OSOJ53Nhb8AgeAQkFDQMLCS4eAREJGQUVDR0KVExv/zcDNzJQ9ZsuXgExDKlUdELJ8kCmhIR0qUFPWuO5Gd5Fu8002rR68+/QZ8vUysXzYuPrUAAAAA1aSRekxpITtCugxyG2TKooiNR5dtU6lr7aESJUXqsaWF7GDpMshtkCmL4nsqJhNd0RlDdB7srXe6afXo1affgK9TA6oSaw+XKCllMdORQW6DTFkUl+1CUj/QdFUkH2qdFOtJQ3ZAugxyG2TKoojOw731znsffPTJZ920evTq02+g+1poG9Kuozv6JEukJgUaA5MOFjYOLh5dfHrGveMRhBNso+y26YMlyFSF8Cj1+njTsag1XcJBXtzlqDVApR8A/SlRnwMlhlk10pLPqJpKLvgcw7oqkeg0BR0yF1FfnEjCYeVKojfnZpgyUuivKi3/YtMcI/HQH5b1G/h0UfLDFupb6Wj02j5M6sU28zaQJqqOA66th7qeT6eTcAfTo4Tzpn39AUvzY8p509w1ouRg11yPtsO98NIr7V7r8J83/s8PZ7QGfeu+TwP+BOPAOkQVWvp7mWFMelbyZXzw6iwi+UTDRkkPfRxCOjUxpe18ZSyf/PpxZ8vG0bVejU6+t4cfMnX7FC20K8SoHdiO+6NsGCXI+LikL/iWrYguX+39fD4b+MTHn1uAA47DudIuqC+Yj/lEmk7N4zdivfqVlCHtM5MjJH4uirHyy0Q3Mf17ZRKm/Jhzggk//3kE3r9vupnqBBxhhgLUyb02Fg4ePgEhQyImTJmxIAayaw9xxkwS1uzYG/VSnWOR5I2kSpIjWbbY2uoHLfMtt1jGLoBY8i/FohvuwlHIhVjwQ0LFvNO8cvo/BOaV5vk8yjVfXvPSNVX/mwkfczlABATCQiQYFw91kY96KEg/YQYZZtTIzLJMnHkWWSXJNruss8k+h0QZZ9KITHPMqVE5NzqXxuTa2MblnkeeeeWdT76Nzy2/fmsCghNBLkBPKhmnGVEIiohF1KI4jFtdPpPWVsS01PSZl8vYmG5121h3aZexHWn908wMB7mm0QoqPGkhQ4UtOXSY8BEiR4kYKVacqrlfVnnKuv6K1FXWSJO2qhMlKaPr6OgZLSLyAePhBGC5OJtNmwnJrzFSTtWHnxG3zApJ/lj6UEf/9ab/6+xt73rfhz72qc8IHV26QE8KB4soHau1FeCVWiXdcjUmqrWXjDGBJ1/L38hn+ApPjFPMicns2dv2a/uh1/TK9+wdt4ftQkH9ayIsQQcl8M+CJgiBIQwo4EMhBh1VLlF9ay/Y10qmmHCEhXlXcDzJk4gmhiqHnaF+KikzbpDkStDtmStqKVHIVcWrOHQGmQXPRuBuNtTMfHV9xKFKZK6Uppc9sQjZbXDXxHAkhRIPI9MfDQfV/V7GI/To7m+pmt1T3sEfXtkw54rfWfZZ7QYpmA4Y6jz4+HYEdSFIFHIBujYa3RWKzrq0Huhy4LxxQLE3c1UhcbF519o+xtqGxE1tXfMy9EpA4lxalxSMvMISJ2rXsDdyLdgsF0reDAieaZkCCJR15xCAgMLMNwACse15EyA4c/ec1+ZxAIH2wZkPIHglTwMQrEkXAQjmxVMAglJIMOMDIKGGw6dmYDYj6kEvKfN0SqzwuCnSH68nenxuLU9kQ9XXwd3hcHoZ1jr0JOZ24eADEYa0WUMNzK76DqeRWtFq0PnajrLGDama14eeK8wQqjRz+tDhNEQRu3D4kT+P6bVXZFDdn3mkoKchYLcVvxuCgwZCj1HoOl4lLXrfzBvj74Uvvi0x46/ig3GAxEG3xwc0ALPIHmjq/AbxpuuBDUPrNP8U5JX6HWRp5+Cp4JNFHRIsqOY7GlSHbmYJZbYLZeEQYAGWcYXtmncoesVE4AJs8Reh2HX7cRqQfOhTEUL3woDdqi6HMO5sIRAxWo7jxe/00pivrCq5qGerLJnGxRdABy48jIY4in+7CZwaPz7br27u40qOiU1W1jF1XzfxyMquWGn/6fAi6cEceq2VK5W4BDi/YTa7I9LVHELbzZPdIQDyA8IkBrxhu2NGfQs6M8mPDB5jWPA2HoSqLFq4Voc8EC6sC3Bh1MBBCOTIPweYxtSuFDmRVL2MxIEwKBfzAGQ/UorOyHakRdmELCRNdUpsDyVpQf+uHd0D+vjPg7oXe1KtqJR5pWFhIdBlsvVIwYnqTa3GEtlzqU6PhROxcRQsXTElDclqVr22G8KMofzzAiNA7CJil1Z6G9Eqq6HrrP229g9OgZVfPFhgtil8ORAheJh9RNq4zdMOfOCrA4iu7cnzH0J56RENoTpVSuy2hVyyeDHU3y/IBJ5c2EVgoDeoslXtlM1l7yHzG9lcy1DMZSxk7bdo06X2uXrcrmxVZ3uyJEuyFdkRGByI49/yeuflyov7+tKFyR4yXn66gg5vrhxImBERBClm0RkO8Rji/zn3qIe+2G9cnvfWmo9Ypf6M1FTF3P12riIqCN21oMNrsUjURihDOUVE1yoF5qpTCDdi/N+JqH7cBwLufJgWYrp0p6wJQeIJSBs1Ik4OUyhUMdVCYHLClNGNs4gv2Gre60qJ/r8S/0v/9vTo78vv/R/ht/p0SHHldV3T1Vz5FR7/0o5y6Is7du7J17rKNdHALpYv2+p6q+zZNW3/dqxhNStf8fI2ZQkLX+iGay5abgtX/ze7mUx7YNBYI8z0jEzPtEzdqEY6wuEMbbCTMMMho05nalfj/F9dddCiuEG1nu9EB9rZxlZVUUmzyyqpyMY0rl2xQkunSw6ZpRuacpxIOZ2T6Utb9FGnJHnhhhFcYImKHz29NE5z/x9vPHLTiSMbnvOUh9zlJte43IXmO80Uox1nZteyW67sUgNaiIup2jW9aZyVSf3qkEEaySUWTykiCC6oQplC4lSY/8eOCW0AhIXANCP00EIdKqQI4UADSwJDCCodalM3hBrcaoMVwwumXQGdqVOtYLnLXtokyx5rpCEXMzYyfWjCKhQh3+3M8HrxJhCHot4hVcrky5VDroRYtjQ0OHAxGEKHtDQIixDsONKeddtzdCXdNuV2I7T56ZqZGUmSAACoqqqKiEgyHzgPNDcboZXNZ2ZmZiRJAgCgqqoqIiLJO3eYEXphZmZGkiQAAKqqqiIikowhJkmSJEmSJEmSJEmSJAkAAAAAAAAAAAAAAAAA5CVJkiRJkiRJkiRJkiQJAAAAAAAAAAB4/DJL2FWjXwcDTfLE8UqJEDxoLtlkmiAm/NTjnZce0LjklDpVyuTLlUMuxWrLRAozu3UkwLetTvOUy9UdWUoRy6wEmGVXIUFMpJIkSQAAUbS5GY1MN2reDbuEDUemrrMaRciglYECFtDUq6VSIFe2NBLZWEiQYsRsIkEJhzoElfPSUleX5O45vm2MNCUiBvXw1x/XRfLkSFeILw0FWhzGJWupEMD/aBGPVc1L6Xg1VZSZPEn8ODHCnvf4tTPRBhCLoE6VErttISclxEGDlWCIUHXUCMHBVg0qwgVp1VebqoJyyy4tSdmxIoUsrmF+ZmKtakjDT+lS+uxIG9s4Utp5jydyYjwpCOCgQiaEU8Cf7ZrUDkJZCdVVVUm725I8acI40cKW0DCSWqcaEhjU5Y1n7rqhwSlH1VApsts2Csuhxb/i1T+AHxzdpUlKSIXAewoeUiG4+9/c93M2QpOZmZmZkSQJAACNSZIAKP071B9T2XwKCTrjin6KAmJNDJtW9kBpGtjN2SdBYb7tpeAM6PttLOf9wO0h7JZyA+EzUwzwR2+LwEpNBfMHB20/cfJbVRpc7dZ6r3YXOwEzVtTd0prx/jPZvfnq1N38ZQo6GnBvO0TdTQ9EYCqBn0Tdjfe5Y5DCJlF3wz1CtFBYI2quf8joQXHDbaLuuj4Yb3Wl8NqBLA5b7LVGxtH0307/AvHPd8ZZ55w3a85l8xYtuOSCi4QzRYz6wDXH0Tkj2rcOB4H/bzJMG6y7QQS4HqOuVM1AEi1o4ljQo00TtSpK2ZItE2YqP85wbcHVJJkDwBaQBdXw2M7BoRse85wcxi4e6zw8MRse+3k5OmdxTuflPdZZPJ3PwxP7LJ6uzsuDc14e17hgDve8PF3zvPyxCnuXMcAQOEVJRlUytLAHk6VUj3xGAm7k0JY5/lPOHzZg0JBhI0aNmzBlkslJYxE0JSCHDF6XT/P2OjMo39GEzqTmv3oBflSkhcCD3xV0p5MwvpjsxTW9VNudueU05h4Owk4jky+e1gLGj8Ar5xGvziL/ibu/cfvn+rDa16N1cymWZKUtt0XTPbN9NvRHn5ZMwRx+P96whRtn89sEPwQ9/tw6u0xLMtLakZN5+L13PUrdDnw2I3hhBrxxxRkKCV36jb4XN317rSY63LlcDmzUW2h8LVoMtP36NaOvbaa9ZLLHaOyPX97ntFnL8VnPDxI/afjRpLHJu3hb3+L/dnjjf/Z56QsaXlfbfS6LZ/ObBx+/8iN6TTxY3nd0efd57Vt+e9M+LWi8ZiGuty2awL9neMsVL0u8hGjstXCxe8EdznXPHjjFSZmXfeOLjD2G+I65EkcLjUNli7+t0/OwvZcj2vEAWKPsHjx4wPTaVd66j1CVDffqW6FpCaMslVI0fkYBTd0OtM00D27RQI+eBnQarVvLqG9orJ6vXQVVpmqMrKREbQVTiWW5c1dTpCdyZJRUiymCNpb45TyxFgkz0xQTeHOLjAkWWWPcTCzLWcqStdWoNO+8au5sqcnKrM1cgWEkXo2T3ZgwuujVjUoRFi4jfFrOfxK6XlfiBeZ6f74Bc66rhDDNyU7GlLZFMAhizrDF7NDErNxyNJ/peszILZ5Pd/mMkDIp/MtmE2NCrwW/7nhf8Ol6H/DE42EWv7LPlRObH/3rpnCsF7q67xhqnZijGc4xaqkl1EHVtQ9r2JYaNs/GFhTX1pAVpWIrWppopu1IxghMwiI0mu9NhiRRMqzqw78ePQ/lzXBhQ0HDhLHkJE1ovyvHIXQJCBkxZs2OI3defP0mQKAw4SJFW2ytZKlkNsqRZ498hYrtV+0vtdROO6/BVTfc0eqhp9p0eq9Lt8Fa7EnRpwf8R/2wBKZk0zEiTeCAAdxk1aqeHfQR00U11XJPhRDSh6BrtoeOd5VyYnu6fCWSBam84068DpmeHSljgPXAeQv4wr3T+Hl5Y7AfYwMgW/Vjg9cDb7Kcb896f3PCJXA5dC5dhADn3x8FQV8WMF+2zMDt8GBLLG60XTz3Qt7+jrTRoOD9X3mZtgnwje/RSYMh7IgwUQjSJICADR6Qsnf8MC+OfPCVoaERC9xVelTlnsS/Jbh23pcPhTrDjW3euLJujmejbUOKptiU9e2I+Ep8TfGNxKZiC7FEbCceJ/YVT1k4bSWx+sPqT4lwaHj4gNtx5avS0cILHYsEc4HaKNbMG4pNxGaP3U3sAyV/xaIe73fHl/8f+nR5p+XlG/741kDNQPWAAPjj914f8dDXUa+9X89v7+ePpJ3UTnyVS36EwBOAl+k0BPpSQwH0xS+Gp6vPDw6yn8+/nGh+1SixZa1coUbltZ9VfoyxWVLo0MIgPBySB7aE147jjyPMAqvP+g6MqYHBmpyssCt5lxOEddxDf1Nj9iHg5fuwSYYCfLbhFnTM1X7XRla9JjfaQ123HqteVUDarYq0k7fkimWIkeybPoVFlwETI5gaydloLpzqMkGQYFNNMTmVQEsstcxy6X54YrvNtthlq1x5/lSqTLkSh9U54m8/NfpXk2bXXWuDG9q91uGFHn/Qmuf2AHxld7JTSSP6f/nCc/meh8d/1wWMHYB5LYCeCW74L8Bt3wG4ztPANSYArgGMY9Eksi2pZ2gMRLGtUsJGoUgBsBX1ZbPhzXUbYsr/0RNtQcRIdX7Q0ks2fD/HcEdRVECTRxzbtrY6/vviLR+XVgATGBMogatNOJOvUUSo0fPrWACzpa0SAlWPaKkTE7AH0T0F36qHZFvplgCphUlooAIsp2sYjgXdqx6qgGtr4rWhfKhWhXGNRQ+KsYeo15ZG24lzyNhsahXkFfTnDHqXFkFCqAoJRdWFKfJEyzuESitVkaW0UNYXTLND7cq4VZfYkunQly80u1ZmnU7T5nLblPmVwlqehgotLYRYPbXMV/n82rXCHORyfWlhnio6xDxTbBHLxXr7girMhYjyzMJtpKxYYmUK9lj5IpPPC5E+JNQbLDatbf3RPW1mEvlD95AN5qiKQuSqKmekeJlsF25Gx8J8Po1bZalRrrZr4kA2c936oUFm3jpSlizQMgtL3yJNLB1V3OSsTu/23VUotClCHIjJbN2qrNijqbpim6nq+cLYgp7TXcIEOomzIEcv0qURgobkoQrck9CSNmG8PAEjA6H7wQX3jr5PQNKwZy1RX0zMkiOKm9TlOthhgMaqmAM9YexypqTFMGOONKBynoLGqSkNaHMZVmmTVJREEpqPavw3Xmj8z3MIz6GmK6Ua/AKVvMEdpqrHdWGkRr/Hi4xb7v0KFfZPHJFkaRVrXJ8bwbEfj6loUB9lliysFEeUMoWMSI7XKCJDZVCKbZypQAlb7iDPlfhyRyg50e0I46oXyU/zymvRvYRFF9H9GV8w8yhdTWIJ3BGFkOL7qI6sB1W3lPT2s0BcTOvP+gizZAOqLlXcVdMQt8f6lNNAfSR5PMlta7qu0CzFn51Zdg755B62uY+Jdj/GJR4dr4G0OclxXcABF2rYpENjVMcsd8z51M5FiTlQTWlxSVNKJSO7jIB/jJijJV4UPcmhdscwmQevNWGIpVkCBnx1E71sBvtLMaKRj+zdbuYXoH5wyEjZwwxRqSAYZSrdVAfSMQdhcOzN8yIb0F8Tm+zvq5V9j1hdJNa6K+YpQ0AQ0jPUcqGm8RZwqaV1xQyqhZyzW+NeAKkSW5wLFploXpFJCrI6YVLXTebiOufHVt2sK64mIMmCn06kttEKZuTaXCN5QAV1cLzl87J9n/GalaT2BU4ghbuKAz+N9AQdO6MPF8BEy67KfMcSdIzaqoVl9m3CaR4y07Vr2cPekyQCWdukO61AC6vVi6r3LkVZOUGIOiGZqr52uA1pSosaGSJktlwJucSX6WIZzFzyrlRack7+d0alxUHqwMIsa4wDP/A+aJDqZn0jXzKYPU72qFcmyUaUUlTjZPTqhT2F2ygq+u1wW5AgRBUTHiIiiNrtl4hIOc7YZm3Tm14bKm2KMJt2opi5gVqnEHCmQueHK5xHhi6OL3IpFr7ZIcUZSrLry8duPFqp6MxAzaFd8e5VmsiKFvOFcoaKZCb5tcE5G1JPw0dqVrG7uWxfYid5pMcXcZTcPqH9tu8t+zQhyFAraL2MEnW0IAQDOpwXK/trqHeUU+5sGFh967ipxTf3669QCem3seTIrc+EkWWNq9bEMrLjSHLoKZQeBxMjcDzscm5vk3nYzjgXGmmLNlpzZpvTDChGC6RtehHgUOe9Nss94BjE6NSqBWuwOadl4hPSEA4yllvy11DQYPmmh8CApl0LHSN1xKaW0ZJ/wQFKBgrBgqGk18YRA4OqfK9btEDv5vcr9SUlYYCDRt4H+GPuQVdpetU9wB53b9LDOAinqpXrFe81eDp6AfqgPjIdwYzHpsH+mpl3gNGC2MRuEZs51jk40GRWoryEIloJBcq/YqJC+CoyXEualASwQtpwEtXbYIm00VHZ855OP5iB5jsRXeVQ6coXPNsXiKzEOiv38hFBzGF3bUgwLlQq+AtG8b0ocR6Lta1vYAQoxTWvMYqg384MPVpenkkM0ghKXyhWG7+fWsxQy/3qULPwWw3jZX9zuWr+F5LZvtSAIgYfWRJqkQ77ohp3I/0CRBc65FdaTC+0TNl1jHWiNqc43rWz9e/jq1nhvNFmmYbaTxh7OTuMqbUYNkK+imcOSNdzwh30zpchydKaDli0WJWmxmOOJOjIIfsmYpytOXmBLPL5Xrw3ru13zkkfHCnx0LBXGuHhoSJKmOqEjmmQIc7msX0Go2JFItyfTLMyw9crwUQZe1HoSudaO8qntrdneZ5OYNlUikXQjGWcbyvdTZIbZvTc76rdco5M6mglLI5HhoGGyjxKPdxdDvrcwQGvPzcZdPr67QF/Mji15CD5SclPS47ytT3jz5ruE3ouO2pKm2v3UA1VX1yiXIfjeYWPjh8NAVahrX84M1zR4DRvyF72Az6vplho8InMJCdGUANpher9nnJF3amVvW213yxrXkBi6fC5KbM7ysU0K3EtwWrKc3WoYJmgNAO/jIkSyRz2kaoSwB9UCyVH018lFjV3D3wHSnTGpE7rghj73l39Wu6z8++eksUnAZg/1YinZof44y6pUIps9CSW3k9flmsvIM+g7TiHn4bVsHCv8S1ER+MLbYiGTFWMC4NWuISaON15IdbrvHl4qiPof2yL+c5QMunh8NFD9LDMQN2ggY1LUqxkNITcUs1b7gYaqDbfbgVyHPhKAPexbkpHhqBNPyg8QLiMKhpwEc9Qdgd+FhsAxKu9oHy1wTXerzWjYzIQqWEY9eRaCx7Gyw+mWAygAbPf60jgU8ADJK1nU1DxfOGEM61lNXPXOv7zjn7A3cV7CFhQG1jHgIQCPDfRJ1r3WZJHtof9egtjne++2s9+de1q6Ldf8tznguNDrKvXHPuH4J1d8/pmOgdZtrS5ffWbxL2IfU7yo0uIIeofuhluGj4VLl8ZcccST0LO9d7P+Ddpz8pXoE5ZzM2RxrZV39Hm9a53RQ4eI0Y59Ea3dBPePMLzkXvtqv8kIUo7xpxzV0+KEqQdd5lvQMS1nl4vsFsqsKs/D5HXrtjuTzXbH151bwYy9BPAXbDmV2TJXltevuo5P24tO7T6Ptr856JQL6x8XpsHqipLWK163YP8FAkD9oHc+i1YIReQd/dDJfPJh/W1flhZxapC5DEsLbJ73POl6vk9p0EyL9WNjUb3qedksD8mXxMjRY1RmTHRPC+DIqxAbLp0zjmTEQCOK53dAqlQWh+ZHvZb3YYHqo8vQPtp6/1ZHwOAufzGM02Sb/58QwtgIHFltWr1/2bCimzjkl5N1LL8e9jQ/0VydeixjLcHxoNpE99nb2hFu/LaeG3+jyQpD0B8n5pf+6HMt52vyT2phF+ilgIOr5D+8MA7R8pRg6Z/TQDZf8OcPXH/m4GJge82JpqBVWrG3k9TdYMDpwfAHLAyb+u/K84+X8BDqAuTYdsdUZaN4ZzhUqlw9lXe2exx7ukOXRYeX9mI5+UNYSnVCfgSYpZe104CYT+4rIRenkr55tuplND5leLbSYMa8ZxzybITgSArJOv2Jus36iutVxo01ht6XbIuuJBEkDvhl3cUi2cHtbfhQJc3wbn4XWOp5YUTcvBZw4xiovYl5NxJwudfjpHiZ30EZmBlXgZWZgE30DTx8LMTEyd+2Zi4XaqbuPVfLbZhHQinuNzaNz+e8vW3cDHsnV9R3EcNV4vPO+dfd8Pgi/OotaHk2qf6SuvVZY3Vi/oGzYpYfF3fuGiKG50/4bSjgE//cp1jXUN8AJOjCXYG5tlij/ON3z9/RlmmGIwtshJ+UgzBy8HPfvscHJ68F4Hia0XKiivv/6yYbPO+FkJ+CP9Z+Ftwop7s+rX0aHBOI9eFwCq0HuzVyNGtd/rSnuwAmW/JaugbX2mA3Few5jY67QSszIv0g6DUopro+NsMkQdb9tftLVh3WaePufrTzYHi/TWH2tyxO3ZaVGMdqsLpvaP0PvDjeTlCRmoPpO22Zdr0Y61LB+Cj+pHvNQoOp86cQlf6by60WaSNDjQQDpwEp9pODV0JmZ9K+fYbaBRyefmM7pleY718ieAQ1ek36qMrDRqrUrDz+oGFKdLbD7Txgfnreyb2tL1oVlqcO0rSL1rapuvAOuOHvf+dbtdInup0ko132tOicZ6ilQJrYrFgjW3ksihgtQ8eP7459qL39+Sbwy+6l3rB6PxVheTR0bj3ruT0sckmRQsySZPKTqppxUa3J2W5A88KBkCbx/A3uboFW/U1G3qWpAeSKhhKyigjYyls3RGy62zEbMStpU5N/ZXPc9uOfsitOW8pXXCQXFDoeG0JZAmaxOPWQbidwStt0bUcRkueSnPtx2JgHeg0IZxYB1ahDcAqFP7aeda6Yc/3vRvLt/O5pjOZKtXpzAxT/u3ljd7W7zc3AKs8bnRWvgtP+ffwfODhZXJ0hO/6fmoGdz0E5quO1zp2YH27fPq2Unc6Uh+Of9e0sZNz/nPHnzsMsH5dvn0b8V2TG9d2rONs/nUPnfnNNsuzJukHnrs2B7vqQsyeIqefz8KRAFlSs1+O9+tnsYdQcZkR6f+3uiPSE3iHUC9jN/zobk0BzthXm5UnjrDCWd+GvIxgxaQtWysBK9sPIX0d9D6cQugILiIEFxM7DxIC379SJzob1OhDRt/thwv0EUnEdKt5wtkywTM4Wj46hBY3Q5AGXbw5OE7AMw/xNFnQW8jDl2mQvb5EuxyHyq1rIdboSF5uJIlSHI7GuU1DQwXtJWcOpUBbdtWRU/prP5zrcQiaR9NFJw7wG4gYNfL4dLIL14ll3+FvIw1C4GAxscTcvWDDQzzD97d6ptaIG99DY9ATtkqSZpoFAkF7NnEgXaBmnuplCxD5gSQC9vR+D0ZF1SWsXLVKrWh3yfSGBFDlZQMwPvtUjLGG9vQ4fpGsD6bRYak1LD7fQESrkZmoiCwhwOtXUrdfjdhH7Dfu4kilyRIa/MHJneJqLIpz0GXmNLAyz+11PDA5TYspaHpiLLc4V19m+aTZNCRqkqKXS+WohaYCca4xF31ZrcYsNYnpngkdyXPARt6Iv7Pnk1at5fQx7eZw+9RDbQ1RkJglbtjpsIVwDBqS7hktbZWjlqSFqCutMik0wwsbFY6/cirMFZciL6O1hwLYTuPT5jLL8/+UWzw1Ggu0GGSal+NeNbAyn55x8UZzqrDkIaFRjFlSq9GXjbm54qYC1IK8FL3cLAWynSNftWo2TddVWH10tIc9HdNUQ396HM/vsaRHFyKn6nkCQWs23vy7T/exhHBEvEnPHPKgV2gvYkAon9vX0bf1OvfnrLTq9iQqjO4CDe99ci+IjmdQ74HsefVcQlnu/vYMLZpYHpWtn9Y2vt9+CJlaBZfon2oqfj5zRPnfM6NRUoVGpR/YPnumoq364mtmU77QyMGcVpWh54zCXHGzBH1BKsOcac4G1BMDMl0L52p9IvquVGuLpzjchZabFy5V69tLKVpUsg4McOe4wO4J98JpIErubicXBJh8SRgWHaDb3/m++ebd5h2GBThgZZ4DVmanUxKtZscwcA00P5FnL74z4E9HUWS2oi4Wq+o65qp0d6aLlF1J7KxBOney5qe5z8r63DS8JCGmAPNy7v8fWZyZVBKHKmOvAlvGnQGOHig02WVudS5O937aGqJn6rSWX2DPUHG7DHWlsAi13C4vdvSnDk4MA2twetYlkHqafO0lig71qVHI6pE5sqPr15HvHR8hl9nT3tee+sRt+wD39LSDd9iAkO+S9cOFdb8HUDRwjJxwBXjslJ2Hy2qdM6eCd6bXMfmljTmoGAqBtmN+X7f/0S4FL79jgVYmG0Lyy91JIyH54iwJvy4dncDGZblN7O32b++SZRf23EwFc/TKwrnrvCrNTY7sVLlac1oc4Nime+5anyJ//rqobmx8TN7YkF/c215bPZWOzcNC5fDc+haFtKNOTAGBfG4fvG/cbi4IH4fEbMfQA7rn0Xb+fwz3NAD3rZG72Kx3qEeajeozBy5wTzu5j+tf1urzRjlnysPWquLwBEU8sibPNJcV/Vec1/EAY4O2QhBaFN/Co4j3HDgg3pNJiW8pCrYAH3bNcW982xUohNz3zIR7ZkLuBwi/7bqxa44Lel0h3JX6z3fnJP7jPejj1RP/r6dI9/lq7ee7hXH/ePXv8elL+Mczr/7zFcxVeLbtT1dCyODecZeUYGdm8ETIsCuu7U+QdLkGNAzxzY3PD9NJ7SEIbigC3R5Fb37+cESimyt9PPoXhEpoCoZlBsNQTYepY38BY+eB4wEFbAcMfhfZh7Nrjg8skht57/8m+77ruvcFK98IbkllFDkMtRVo9Hsjg7ZkjmNag5y9tpSOA3td6yqwMq9aze3XgqFX8pI1RVnJ1VeyoSpTlbApHiOj0TBlTTBhFYgrrU/zP1jA9ncJ2tr1oqH8x35V2Q9369UM9REmQ7VtT3rt47cPJ5lYtTru57VbmxXI1TnV/9vqOwbzjFmYMSEXdqGxXCpqFCPP5GYnnmoUA8YLYKNPBzb68Ssdt+8DrMwKeDkeGmtQzwTHX807ZdDWpN21Km9/6M5aqHn3URW44LjEB4EGjAFSvKe/JQAFZYfYBIEFz+WUZU3CowflLSUX0xWmbdLp3TvEdZX5mRWEI9WbKC6Tm+CRaYzoTE+GnYds3PbgggMJk4d06jp9mN9A174uAP/4GqLtIqQNkuUP74BCOjB+M9iBS/y4Yj+Yak1fZLW2UmS9plMlSX2zjlTj+vGYe1jprOvl/pRvvmUnzHV+tvgOAeicTV/OVjB+/knN/PLC2NhXFyqYP/2kKq1mTWMF3c1k+6UGskP37wWkYwt5y/JFsn0GBD9t9NDiP3z9OLn29xHfgb6G79xp7IL6aBWKlFxcGUdhqpEINeNinfLW40Kd7n6hfLGUeqSnfa3WiEpzOPMXUDl3fMipO7e5dNUKzRA2RjG5bTB6KZFKUfWiipRjytS6hORiIg5WUBZHJdRFMQQW2EuW8tpzz3NqjbeL8i+INXVnin0duI76pehjXFXtyqeFoOzg8eDrtrLviN4yC4eSce3BDIDdfwFYmQHdufaRsOL85uLLVknEXHUMPq2JTj7K5dG721K4qOZ95865pn7YNi6NOG/71BhGFE4na/XoC5LWqnfvqoDOOWMe0TOYvv3hDVxYi/mORFt5I6fy3Hb5gjvPWC0vOalL/WeWV1nEajhIrFqv1LxtM1Z89EHfbUprZdO7MtIpnc2paUg5JJUTpkhiUbtaOeB2iMDH4Z/xq+dCmL6g3Ln7M3HVopKLH6rNpznaSnZr5xUlpecfCHW1D4SK8yWKqnnRbluKY+0a4hBXWbP4mfjYyZxWGElOptM17VgOtx1L19DJRHk7LGeZrExAF+PxiAJVHJWmikMU4PHI4ooEkOasvZFTObtdccUt21irKBnVsf6d46mLWIYwUtVTjeZtq7Hyk4/0PRbp4BKy+0S608ObuPBm8x1JwTKy9HAqJ1wBT6F1tnA4aS0sehcnndJpTAXdftNZyfzppwrmF+qXF1SmkrHeHTeRtiw1kraYzVRZufgp5YEPQ71DLr/6zlWTqstUZfIVnwmDj6ZxOw/kd2sAV671PuLFoSK6ArzpJ/I796dxg4/mflKWKVBlKrsCqUivDKinlluqzTh3cfYieKBTdgVQEV6cI96aDHlVd/7RA8QnVfiZgsdXBX78z7HsjFKtJ9Qrg4rsClRmqkCmQPFJbl63Akf3+0RiZ8HFWQAQzkefSkouy7LJzU1KVtLrkdHf9xMhGG46Fco8cJASBY0QpBZEI0I/hr2AjJF5mh7sMXYOu/sks1A6nJLaxkZGyFhZfSGv0xE4OSoZVVgZT2OPYqvr8SvlM52IpZSCe3FY0ksiuPcWXPv5Plj/OfVrKIkUDdtDoUQU7YHVvC0+e1SwlpqjW9wCERFx+ekJNKtbGtw7c1KQwUl72apUNIxfEI2MlYRhcq1oy5srFWfWOIqaZb7oXIlSdIoX8xsJ65fL3pL6gP8Guvu3GNyP5TCRITw6oWCCwmiEis3drKoVZ2dVrwhEZ0fD9hIxfnks3E6E6qCuXeAFdxTOl+FwqjOEfik9FtehgzgVHmSeO6N5XrMGMt1YFwvCIrZW5cfiiujE/jM4lRyXJBh5V7emfgI+uAEbZEvvR8B6R0cvULmdecvOyxe0+sKD/PmtXFKS8V2q8quvylJeP1VSv/iGqH7yMKru8Ucir55812fI8waJHKL04SQ32w5u5RXrztemvW/Wi9cXVGW8KtSYPWPgaBycDUsm5ng9GlXTvhif/z89O701b/FWlvfFy1nea9d3CxYoPV5lAXdCjea2wJPuJ7BZCmJUv6I8Vq+ISqXJGPFNDE74cFE2uOUkMHc7ocyRH467H+O4H4vbfnxGn47Q1tF97t1pbt3gg7N6I3NkKv1jnQ6ajUxucNUVz7mjk5wuz/lkdKqUqobLr2pK1rXVrMFVdXnZdbV8vVpLWlzX+P7slFpx64Gywuak3A4vVd67h65Sr5x7SsffNM0q7j0A+9Du3tZ/mODuwK7o88CuY+9hwUrH5KlJ+64P45PjYOu7t6XhHz0ytZgAzGJEAKoSVUA3StzOamcy21lsZluIsthtzCibxWxfHthbHi+PakyN6kXDox4e7+hYW+4addV1fdY5lyJ33a3YBYIcgq5ytxT80qrcUNs/bNjIAHLrynr40BjM2GhiN72+/oCR7snu/Ksg2Ww7H3L1IUPkmU/59VIOPtw3GUzQ6vP+hABKzs3Jm1FHB28MAsz5E9OT0wA2JI2shcpK2bCYyCq5TBbwhBwcgf6pySkzPZpIjI4iEqKjCYQoSBOjfl3IBCgQMTehG+XgAXLi7ESsBdFfmPsCf53sB+MXN1XQjunhOJwynoIm/hqUgGanntykoh/TwXGEChgBzv0kKAZPBVwQfS7W6fg+5Glgcg2Bp44CwUNKn+2X39Ktz332i9ObX8Blo0Mcdyq40qP95mC0Cc/yyi1xHBvSmpUMsyMEqP/sz8QqfiQaWu7FND8i18t+4TNTZU1pxBPMzZgtvJ1W/CgfqoYwyS43pw0OppnLyweeeLnlSg3sMLukSXVLobilUhk7p1LeFswF/stMzr81W/594L7NjxgQhYuJhdIoIYHX2IMehWFhJW6Fa+D/43LZteuysrzTrJLurbyzjsl1mQxsGRpTlozFKOYJxDLkXEfcWQdefq+JlVd2XS67Nl4/6KpYX1e4Dg4ODF71BnWjgZmKZ+mjo+nPKiqMjV2vQi4QcDhy4eud2SP6UX3Wlzsj3DPdpe5Z7u1fZH1hcY0xxgBeiPiMHnZ6DycjvbcnLYPTnZbW+6TTerrfJcci6eHh9EhIc+gRchgR1YFE6gbCCAfFeqYhhlJMyxQKTuyn25Jts+2/8tqMTMWnpAqRsUNBPvgSTlsI4XCZuzgBUZx2wCSzq95Ew+pwuZAoRph4gb49w/4ayU4ETYjhxYFv6ysXJcK16lrh1cX8ysqF/NyrtdUXZiJ1C11MgtSQyZG1+WQ6baVrKeSIdfUAWZ+7D7tv/rkyiBngzwgKQPoHIYDTL8++G3TvrbI+IU2mFre0a50G+4hMFgbDSQdJzP3CzYzBV8riJ/X6YvMr1eDCln9TYfH3QBBxoGQ4ObvRlTcU4p6WJy7MKKaQo8OTMZE7PEZ/5QkgpXHx0VIBHmUZEABFFJNb7p00jZ4bDu3qDvblpQuFPBEz+XA4DhsZ4DGWFMQVRhTHJMYUCjFJVkG9cUSv1AhuVsMMbqvxNdsdSYWHeKOu3PYa/Ym+O56WFOyFfvc38Ik6vX+m1/ZlVc/DCmCTU1NBd/j1z0+8ozISUBhWQpSp5KKhrXuuLs/XGX4YL0inxvYU2lzYBTxHy7MHj3DzNqHO7hRFJJOy4w+Fi+M5hAoCMScu7AATikRnR3mOA1SaqCeWm9UWR85NQgrSaPbWYofiLCKKkz8SB9pgVubJJPCfa1Bv27PffO/uyNPu7pFnd+4OrffoCbjW+gZcO4GA6zAYcC1gd87+/cMn7VY7h0bUQCxxCpoawzh4CBd5KOLX8OMFA2qZ6lhtRqAPhV2WkimS26PrQYstvfYgKQU3mkfxCYshQw9CMEgiQ8OIRiZA9teF70sNjOiLo6ZXRxKYJYmx/Gg0NuONPdOOJiTlnKoFaepqxAHRKuJ2xpaH+n/Uo6Gk7v2gxp5YHoXK2Hc8HBm6L5aMj09gMhDb5oqbfY4ob9ajdl20eY3eGUhQoJBKIomg0mFAi+3BxN05lMT+6i72alc6m6CMJQnsYYOfJIVH4jPV6i0BcdEwtAyBKiMrRk8aaxIZzMQ4MhMWBAs4jRalZAFNSt+Wlm3QJtYgqLblNMYQhPDwvXT0kct2AwH8uERMljqaSqmEYrIS4hE5GrvuwCOh9Ag4SdgYk6ZG4uIhUCoyPpGChEKS41EiCDImIiIJGg2FQSMi4DFAYUdUxhLz7JOGnsIiIRGE6H1FdHtkbmwCuhSJKifRSTWNyWyLqtUefCK8v66HvXY0nXl0f1LoXoQfksFDwmgpCfFEJiBog6uC6c+Ue5WgZ70usA7oHmsdtVstq/hVUNeRGnQLubAP3pGox+8pRXga401h+R3YUtIvIJYUWRQ3scsAK8Xtgek79iUhFvbeYpUSfsGVga/tDnQdQCVA4I2+Pqa+vrNHbajxSII9s4mZNTR4A41EQxhqaFxeFS3JMMErs4p+a9QQ4vMQJHisiISHieAkREJeEuId6eNbTYPtnbhNGKKN7eu6jbZ31gKBq/yH1YiMZ+KhT9dbQltAsM43EO3+Huu8q9pTY8EmlVL2Jnm0JXt4HMNVWGTQikGK0X1/IpOZH/vVFFXnRa300LbSbEOIiYSE2tIcuxslnOQcGocmMD8mK6wbAiaoQlo4vGrdznE/8t7dHVIATHucK1618vHy8TnmeXKshgJMNVRuJ5cDFxCYNxRwaDk0TrJkpZ7mqP1QYiKhXelWQ2NQTV51UYTCFz4soxEoYIBQF6Uq8Zva4Q6sp3iKuyEAWWUtK5aOl9esZWt7RrWlKeQ9GBtDV3NNeQ8PlL4/UX18fKLt7a2bOuZQwMmx8k2JctCPRSfrDs8f62rCovC1oumXTR7g+LDyQFCNVyGCdzghXT4E7lbhTPCVesEpWMqHdmJEmQHKyLn2Hl6fw2gMjEaPzf5F1Xk12X8bdE0nWqiLySW0SCv/+2YyPDPlcDHg+skJ795PWpNbnfO30hFCUMijb6U1lIBIK9exKFQ4IGQb8kWhnt03Bk6lrpHJqPCIZGQkhDoR4eWIg+2lFufYX9mf+mhvN/v7aeDsMoYtQ6CL0c6UhjQ2WcFAKhcrnMrD1odAsNjDQPgvPsnAhf+DIcgwetXFqDAmkPZAbfGToG9YpIieDgw8FU3z+jQzLCXLMo1AZRVSy8GhTy+1hLY86DY631lzBpGb/wT6MqExU7235/6ucqoa7pfIXHW+Y3QW4qX5Wk/6loNgnXULuBFSftjpMs5uVhnJxai8VAFPXiZ8ptCovFhOPRg8d9i4l6tV9EQu4rskzl2bvCf+6e8+hO9rmVuXLF93kFu7oxZh+2ubFsL+n5xngwuvrvb7J2NED+h/cK69aJVGqrU4mz/Iv8b+V5bvi9wFAU5pxSVX3OIiN2fDTbVwbyNPf/VHUNd4ate/WY3Tnm7/d9BDf6cB3bpmC4Ruml4i8KAYwq+BQQ8XeGgaJhCjLmRH4/m7XivjzR3CvZ6wloQ0iqYGDcWmr9yo4i7uT6pbyMV6xk0htSZxtAvoDlrs5kB5dOTVyykevJzn5kNxEzPuPRK45ZjFmmOu6cea0WUp7nmhWdwXxc3fXqPEy4ZMfIkq8V0NB+W3TDCsfoOuF9NcvAUEKgAnEFBriasuDYQrwAcgxYObxgjubRVrsudvzvBwhaD8szQ0NWh0GPbVz180M/2Dsb7rxD+mi2HSqbAvvFlgE8Y/EmmjVEVCJdFElSxOA9FqMWi1eDMMrKXiFgOsScjfHCgPlr/zTz/MjwxsNtDJF3frvl57GwWGmwPJunnM8+Cm8d1oK7Dh+CWpqyEasnpTl8hakaxx2zQ3ws6BqyKbGHVKhnrZGC6/i/cgV3LsFy9A02v7x572l59XjqIPN1Nyf9ZG82So9/lldlrujjyt6ZwX3TTqZM8Y7EO+HijKQzeVKIVdWByLZ80uUjwdLnrhpmJNL/VM63e9raKaK+xKCEFxp+V5sh+Ij/vd2XtUNVZJ9a2J8nUtOj1Das0/FRS3XPp087HXO4pN3HuE1jXHnJ5B/z+s7jLE3aFgoHau0vrlzieQu1A/Byp1MjeB0/trihhJjlWXgwsDJef3h535+e7Iiw25ZS9oNnwTatYY3qVXk/3mDG+HLa/Qg2Dlxb9euKnErV4NbkPZR9RVrPM47i8SLO/yyyFE2VM8mXJnAPbHVjHUQh75w25u+cNuHvEpBra6qzA+m31sWzpV1W7LC0JS/l1IMcD0OjW/jqotXe3gFkVo7AxeP6JWPZiB9yttCco0V2v3jDnqPULR1dH+Sux+iz+tJsU0bxrN88E0q7JBiJVuwiPvzh4pg+/gLoNzr8rF2GabaeuezBhxOBNdx81Z5s4Oc45F5prL49Kj8X+GwmTNP/EuLE5fjpHNkf2Laxe1dEZfwiXW7pHZlDuDxwOv50GPG4L/HSxwJ9xENofCItr41gw6RVz2ePfVGsxSr4+c9svisn/x9H9GBuTYgEzJ+nIqtwLcS6XvQJV2tFWyY6xKP0Ytw+S2QTKlWLK+VWC2awPCbIoYBCIIwZgq0z7b4HTgj8J9hDVgoUTWqUQ9fx67lk31uCwGMJZUS5JiKZamTKU9vSO2JLTDB1g5W9lVORX9aT+rwF2HQbInzjs0GbGVAvphr/g7L1ZhbhC+QGu2C+tuPMMHrBvW1TURUroU1Y08C5BxUEwm6fJFpxn6VA7bIJnyeZIlX7xXFoyvtXKrsL2msn1Wafutyg5YtR20GvtLa7eyr3woXcSV/lGxnwFWpdq48V774eTbXz1xVEczWnppQUPffOBOC1izxlbRcJ8HPOQRj3nCU57xnDZe5Imglz47Ri+23QejA0he17bb/9902x+RR9OPffa87//H3/n/+0OXV/9Rdiz9mOa3w//KH/Lr4sfwQB0/j+Hzf5b/07N8+x3Uf4DbnuZjCsDHnBLwILCeeVIUSXT/NEp/hTHyWSTfUS+0zD3u6a0txnRjapR5e6j8nrfy1mfIx2uWsgj9ajCfrqtTUoQxkfMG+Y5avVeIoiFdo8CMCCdgoqe0o14ZL4GWlV953sAFvcvrjJujjIPnwEjsIadVxz//bqdgCSfw9QOld1SdUfZdV5D2xu+k8dSw9f7JGL039+yTCJMaqRfodNZc9acgiJDrfUA/J40IYx7an0jamDcIA/IdRXdgRAhHSulb7b9aAb7ISs9ni0sjP/3FXrZLR302lj+rF0khicKYbc6i+2dDDGYBMEbjygWvWPvpW4PFUrQwBOTTux51lcUjQGxoKVjkRkFMsIdmngfzs00zwpPsPrTI83lr30VABIN5CWYCetd9LVW09bt7r0WFnLRS3VFTs8xW3jHz4ExAPl+JYSVgqc4F7Ra8P9ySa71XoL0BC37FhePMCjkB1VCv1XpQwEk+pckEvX+3HE6C8YTdYvg9GLda/YcW9KzZCOiQjyplPAI++tdh3Beaoc9ej8w7KtVuCRtRNrnH50tMiriqCsynnRpTrUBIjT+SRJcMZW1deWp/TQZYyVni6bvV6gexAfmO0lfDp3ELEu133nkzZdNoPQdu1LMJ8Rk1j9ZKnMq1THXHTM0oZfw6yuowns5ECc52HzzlOyo6ExjezShdeUfTMRY9OYBq52m+k61XPzmtju7snzVjLMvzriJfuKcguRAE9v+1Xrq4YWMI6iSAiHwvMBB2exFrXT/65GIjlirA9vdgy3cU2TW/COa71meKjp9KeIZj33vN6rkMKOal5qcy+CCU8GJrOOQvJdyldXSX8oynsqnIJ1RxXHze4hddPnz563H8HZAsZPUCSSA3tIPh411kJIBvbSjQwwfjp/TfcNII2drGHVBn081XI+eVNLM1TEg8MQ8aORdtMmqxSzlDXU07E8aJrko+4d74U5dkYr5A4IazFNd2urYDMknenY0zdKewrKDBkDj0QQ2HM93UIhs6Yz5wdRQcyQajQwYzaa45PsZO8yuN2k7MH4rH/lm0J7pheK6a656dVcP4jC0BtkMHSGED2IHS/g7worX8bD/Bdg3l6Nzemy9g6wPgb/0BfsOuOiFaZ/m6m81KHnxHdU6/SzdHuNusrIHuiZ+XdlCGspVMIyvP+D69TYh29ITKbiXv5pZ1V8sjvunGi6Vc7AkTIkDd/VF3Vsyygs+w94zoqOGIp5urhueOc0PrKDgVG0xrBlMx17T6SKf5ldvajuIfasb+eXBPNHucWFfXczOGyVUzlyux2sRjM1hBUcq660vH8TUt2gvLKLh3aQUuYfH+7Mx4J2MGjcpLIp2/jdKjsm3KR+f53daR2pmXwg8Q3vEMsL9umeFGEEsjymvXD/3aRYpAHyfIcBltNc8C4rcFeeeT2rGtNofV78EOHP+t+5zWwQXdKyq/Y/qT66+I9VZ6rKER/Ri5pdzqyYUZ4c/LUxUkehWBHXquBNAPSkBMWfB8JhjWy1pU2p+NMoSHR6xnG4L1+j81CAiPtSngr9+Z8WIj7t9ZFAsAf/LndmVZde9/8kWcP8TaePpdFYjDfwB1bvz7Rvm/yDrg49eQsTP8w86zwfqk3L9Erl47bT/qyHPyyTepH1nrEZrfbf9BPv0n6vYRpBz1qKUXV4PjI6B/ioT7LF3txW4edWTpi1wxHtbD5knqTS4/Yb/j9qTGkAVB3Yz4kU4JteyJ/gt1cA/r6MBOO5XP45/IfToL5M/w0oiMXKl2W59RRTpaKX32AE7d1/iN4Xpn5dTFVJ2G/CATqZTjODyytRrOoDe9Qtuw0erkrjOWiva5431hnJN1WYDqYa2FR79vZb15OmjL1/8rVx9YOS1BJXOz1hEJd/od9RjI0J2mtQzA2ftncbqW51N75BXE/kxgYO2xYvoaiuW2m9o12crrx3Z0VgtZrP8kbib3zQP5TLJkfVC2fpS190lfK2Wv38hXfcvWz+S1sMPsNryGi1AEGVAPxXDKKoH+41irZCxh7jEMyfHQ0p5kTNbCHdZsKhqhAR6AetJVzebFJw8E5gg3hh3gPay7WjmIKndYO4XG4sfXnsES6IhtmCLK93jDtZCcR2lvJ9k3pY+PuIy/WRNHl+qXdB5NuQA4A/NjAb2A3ESlxIRa57kp26qMcaX33e63xc/G6CDJjqp8fEWkIS4+F6azWGIha7LYWMjGOwqfoQOudm2F28+LmvZNq33WBNuPC10WkLJDXN1hYi+K2vWx0DlWzhxu8nxtdseKmBWWLLPE1ZR8FFk+G0qe7a2o4Ze8bTN77DZj/Gj53Aqx01fU+It0OsDscVPwtILZtTA9ZOzKpXOXbX1tq2N+PZH9fI/3d3jcMuOR3/RyhNjrlc5RWC0npGgtcNlmi1/20DFbPRjLOA1b5cAyIMCv3eOf9IV8wMDRnUDvAXD6yjRPnUvzghQKjjIgA3shqNRa/BzAz0jqUfdlrfvO0v2a4cpODaAbAR8CXgfcA3gN8EXAr63jXNaistzWqnoB+JM2wfrh+p0zbClWf8zZLLR8kcCvzVXcIBg7ROKIxIA+ik1nrq3q2yqTDeBzC5XZiJN4NsFPOJviqmM2zVTTbAZP+ZyZSenADwcUEIF3a5ztzYTFbB8sIu6/lzh8Ujvp4FmSrLVUommklkqwynJjuUsmNeegJ2aegLti89YoFyd8bF1lhZWktZTJ1vM1JpM0xkkUXx4kkoZNT7n+SZdklmKFafbxOClGCxXnMVWCpbQFMqy3ytvET1yQrn0ca7wVTulx82RNJ16W5zLeidpG/L53DDXPrPGr40e/r97taZOXepQhZelBzI2GMj1/Muwl7j0XMuR5O8lqcZZrDpOkhqol+XaymEPYDpErT2bLuFgelzZGs85cX73XYhXxnCNiud7lq+X5rrEDiI1ljjqi2b+W3xjEgJK3wbZ+N9iJ9Yt9bHDQIk4TTRzk3odkFhw53YnEGMU/w9ntDN1x062M7kAyazSXe5AYY+5LYrg+5owVf3OSL7PiZoVj/nDfXfeSZJ3NPUrG7XPAJxw3LmfuPG5QYnjyP8qrsbw98sBDK4u4UclJPo03fPk/qon5G98kfj46HzxEyFCh/VZwWFOsskZCyVaHCy/RWpURIgqMpEuQJEOCI5tqvXWSpUSJGi26aabHiGlGKaWa6TFZLKmk0u4pMGwW1rllmvNfMRgh/CcyV3qChOUKlSnLfnIZNpSXKHH5/jEviTDzK6jQgoqS2im84kpE2JQsuY0Usu9qYizkgyL5PlHvscg5n+5aYormP9xnH+jYosjW9BkwZETE+PvxE2Zt/38dCiMfa9P+S6W1Tsd0fZX+2b2/a1o7aYzpp03JZH3oD5hWL7jo0m+YfvHYaAdIVOHimcBfjCWsO2fRFUuWrVjFdJHQYu9MJFDvhO2tdaWrXXPKaRwMaiddd63r3aBH32Hm/cvCVQ0a/e0QS1bE+L7odsaflv53dunNO6z8ZXanu6oFmES3e3LtkmezvVSZu2+HbT3pYY9caKMnPe1Zz2vrRS97VfvdVfC/5P2fu9PWU2999TfQ1wb16TeA5XeT7fbEU8+88LJvfe9HP/uFaqi/FyDJiqrphmnZjuv5eIKmlraOrp4+BBNJITcoVBqdwWSxOVwegvIFQpFYghlQwl4GPJ3fzieUy5a0Ie7n2mhJTmXtSE92TsafjyUs4dOERxNTsF0tmC8POy1s7qk4TZYSJriQvxFhkW0PiyVavGXc1mv49jAjGymsC2aZhB9jfuRtKWXWdhsl2pV8glIrsfeK4MfDgvj0sPe3xWKXHqb3TfLk3cfhqL/WwslKSsY9XMpYvXQAC0Go3AlWafj2cOQsndjjhgg39zZ9LQVSfDe7Wdvl4wGrX6s1QdArCGUUHsrOJi4IuVHDM+fCWNuijyGdJTFW7GEiRENAtnWGCMehbSiopa0QGccV+DVV9YeDMNaVJB2dSYgqxWoQcEs+yP6SdX4AFU17++ktzkAGijDNsaqyFOHNqVAd3yAgaXCQCkaR54yCvFQQ9hPnpNJ8liRWhAMmU1Z2aRfKrvZK6lg2hEMz9DGoO1gIoRoMNIb9famRFL0L3vBjBTxdiiYrDRm+a2tYU3QFV0gd/+V1IvU/uGqsZLg3rGQnxD+18BNMhuTZlVyV+fjhfMoryFu3ho5LP3jc2uflY1/K27XKINDxLVFTGpeAjQiECLvrif3y8cuNPuKlboyUXdFLVJuzbmKuD1hccD9Rh/PA6vK1zKsvm0bhWiHbFF1gNpyc3/xWNgkuWyudT0T0nMPsn+RW8To66TcxdblaNE/4N5H7eqWn8+1Ykb6bM/NYXgVX+kEmlCY3aUXGrMpO/uvEtL2Kl1B00idTXhdB15nOicYDhdEx6DwRMnzVWlkHmATGklh7dFBdQ2s79V7fpTV1+9U1tIt0qVx0RlzQeCF4o13F0cNUeo/s332B8+KauFtKee8tsgaulLSU0yKjpZxWK1ouaE1N6xparego+N3zV3VAxBRP25X783LHFXKWc/AsG93y/FbwAzkEUADPslEOBRxBJAfAlQqufEkOoJxQAGKoB+CB9oXegTRyMU8gApYOAIXWpYMsASiAo9BQAABAEABQAAMAAApADAAeAPQOpJEAjYAEscSG0cyy2RgKluc5RnjWndIyhy31uJcwo5EgpZhKphBm2WV6ckPIHMAyq5KodfKdUlLryJR2dO4LeSNmZGN4kGWVe99idvjLTeLyPsRkGVRlkAc/By3qPi9+5U2IizpfahpQ0YCafg4dV08XTV7diJ7MBk69WKVXcDeEZ4q6Co6zp1rdaD0/nh3+u7b2qLE5tBRrSShBP2YrT53309m5XXO6xS4Gzwcbtu4Di6PDfGij1n1i2p8cIhrKPbInIat6DeILA+eFmBs95wPbXgG9npuNOiDMOlf+nsZQ7WdJ559R9o5qd1d5XpFEfsq6l4mOZ5ey8UsZ3vqc//d/XUIz) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: italic; - font-weight: 500; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 500; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: italic; - font-weight: 600; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 600; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 800; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 900; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Monoton"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Orbitron"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Orbitron"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Permanent Marker"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Press Start 2P"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Rajdhani"; - font-style: normal; - font-weight: 500; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Rajdhani"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Saira Stencil One"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Shippori Mincho"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Shippori Mincho"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Sora"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Sora"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Space Grotesk"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Space Grotesk"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Special Elite"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Teko"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} - -@font-face { - font-family: "Teko"; - font-style: normal; - font-weight: 700; - font-display: block; - src: url(data:font/woff2;base64,d09GMgABAAAAABxwAA8AAAAAR5wAABwUAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cghYGYD9TVEFUKgCEchEICvAQ1w4Lgz4AATYCJAOGeAQgBYRQB4RCDAcbUDizom60Wi4RRdncFLP/MoEbQ7A3sItjxIBhUav6ojA0ykMVWuGxOpvzXPNb1iMAwx4egdbq6QUVx8uHi2OMR2jsk1ye5//Yf/ucO5kWEQKVoFXAA5Zgg9j21hMZ+nF9gOb278aojVEtjI3BiBo1egUYpKRJ5KZSRwonDhUUI4L6TGQ2foxIsBuxkjIGh91OPHDOBenQx9JPXGWZMZ3J4MKnfNnDVbEs2+jpMAq/VyfeWXHadz8q4crDhMtqSbaVRnEUdhniNXl7O3UFwJVWmn+d5vq/FPXsJPdO9pUgeVfEPb3yhsPWYSpL+pbl/79UxbJfnmUlaawcKT6yj10y3VXxkQvIU9k+DBwAd+KVaONp7LDsHea9fr9fey+ry1ZgoycnmJD8f8/XfWrfkTU4oZQsCyFiEddyxurH19j3Y3uf6/LnjOImB0iksa0UwDbYskXIbsYkQwd0gDkEUBiSYCZ6MuB5XqVgCrJW5n1WeRGsGaLFPophg/00PrZBdY4GCNDQRgdoDSbIeTalBJ5wO/1ng3mA/V5ekAVrYCNQgqdDOzkwmbclIbAEtY4npEEPWqiaMF0lGhLrfLHoAQ52F3zmGP3TMZsGNqpDgz60MIu0NmgE0h03jRKtDjIsS8ZZWqmAY72Phtgl04lbPUATaHPTwb345plIEEf+U/sEZ8FdsAXgzs0oNjbB+tQ4tM4DxqHcBV+BvGgDOIYOQt+CA4s1PoRW9aqwnAAoCIBo0g6gFgyWpsFOp9MmghsinwKMwU5Ms98Q4ZOkHuip3um9Y0z2AbY1247NYTuxg9kydpcDh2PMMfs3dM2NnbCID9c3HT1kP9uSbTu0oM99nmkA0wzWj/8z+kf882gWsFwLLEuXLC9q9nDDg4MP9hALEACueEOwIRv4SFaEgvjf7mcrqa12AlfRY69OKotdw3JbrLHRDNM0UKpTa7p6U1GW2eAizuMC1tmHgC4Y0AMLJkyZMWfD1jB27Dlw4cqNOw9e/PgLEChIhyX+cxqtbiOYhFSkaLHiJEiUKk26McYaL1eefAUKKRQrUapMhTb/a3cGC6xyDCdxHKfQ67Bb2K/aVpfQ4pA7OOA6ms3Rhxs4aK1+NKnRZT0taIAOHWhCGzQwYUQfBjBkzYIlK8bYnHA54uO5Ame+vPkQEPIUL0KIUGJhRMLJjDLcCCOlGC1JshjjZJlgohwZziJbkUkmm4IkV44j02ab7LDTdgSIoSEYAFgA5ABkGuy5Auz/CXQmpAuAEfHzqfPkVG8CipwOIP5AOuZgDlXFYzwk6g6bkMrSCjNXzUUfOVK23GoukKqkqNTLQcohN3Q1xGgZtGgqwIOItw3J8fqKATZbWolStLpSemL3cBR7somkZveOrCuftywenCyZkxV0qGudS2MZ0QYj8rPW7tM2MTJK0cw0Qo5ED9rqntfs+UTckPnQYxOtoKQNaTPCPYnCYdhdSNGUJmhnasqRbWOv1OpabY/1cE+UOwKorV7aZjM20f2JItaXfZiRDZ4JyJPDUlAUBgGBKg4dEEEIZqKbTbS6XfNibRC2nI6cdrXXZMSDi1pVkTwmVWYqZ9H95LA8PkWrwBFirrIiNqt6uumjuqb8mvo9hFIqKXMJqLsSCgJP0JIY/QTerqBXF7BQ97RphMXJ6ERuCGEQVqTq9+OTBQ4myfImVPOsIpgpAE65gJxxD5FycpID2X6JM0dLQgi+KJ6haB72pSBXcgX1X1VFwc6CKI8p0ZJa0/SgI/4sZhOsgdYFiYjjUYgXtU5zBbCmKGUiaY89x+pH+aEoOkeUFExLGYE+pau6XQOajSvXrsgoEgyp4RVW7dWVLphYr9J4eHLAVBApTJMxxIxE+ugKGBhJQEgjpE4q4xgOCN9CBLujxuAUkyD4R0VgSBz/AwVTlmSnTWt0pYfi8sso833Id31NCrGZ+BLGIUpZtIZISDsGuWiKOsHVNBNujFVg9NGgC5oinGJiMsumSm3YkPs/c2e1duAQPaDnzt56VUuEnOZOLnHljCNadAIQFsYFjkeSeOJzpmxJTbOCDEla+UgsNnv+IArAksgKtP3BlNbc/dcumTPbtj513ZHHcqRnS1KSkkMWoqGwEnIZkhTCRHarYlb0OJVfKG0UU6+26R7EH2YG/j28FiVgO11SCKHTMij3O2Rg0GrE3kvlwToxU3YIdg7aezVT5JW2E4djEX+B1SX3qHKwvXewzJkV3WclRwWzYB3SYHzNOGMsURozqTQzcKXYban03u/cYypReAofkWD0urCTna/Uoli2sozfTIHd77vTPEl24JdMrgi0V7wGycOOQ4JJKqYIiy/8aJTnv0SX7WlqnTUUatU/Unoxs9uCUeBviDadfNaAI0qF4lJHksILNwmYK4kgvmZmKYEJiu0xj9MSLmoaDi0BcTdn8a9g7G/X2ZR0LEoqqV55vYnLVRJEKeSq4ZZOlCZxrF3+macOSRgbVCidZtzZXcKBPuW08I40dSXE6DA75WJD9faSlxH0mpd+xZ/k9rDP0GRm6Gt5rNRNV7SFtUT5Qo5LQD8RNSJ1kmh880Ayk7e7O29SkcjQJnKXdc+HBJinCYwy1KG2LKfpT0aqLxZ/txHgE9BDF2A2At3DvDTyJPZ8dplbKs0/AeZpZta0zdFFmVRwN021UJYeuCmbDg+zZPOqjg08ayU2M9AixdS8907ETHzz3GSurj5MP28wlnf/OLAsSzpQJkFX/nQCcsmod+NR9EAS0JXzVPDIW2d4fbPUs+DywcqQPeQsZ5q4rOJbiYOj4PiDqIBKUmeH4/UUBmhI71LTP3XckwGKysNcCmg3j4hKxe6iRc2vCGzPMwAN0GaZXle6ry1O8wCTun9AW1z/j6DFgZMG/wnV3L3AJC2CRQy+afRLtMrcrkCCLYoBsUX8ozERE5EyPRR1f8o4qcebnpTxN50d6Wm/HE5ellpoh/s3U74fS9sqcKDuoh8eHKeMeV3eToJJbaUHTc9d2ljUcSR9vScgd82yfCdCDIKxrmMt8qQXhfM6I11LiNB1c19uFA7xLKRiVijEgIVqTwN6LmtygdhYqk58JZOb9OQugbZcDzOrRwbJXue5V37nNZ/EpLec9sMRFkgKwwqJ42adpKJKn/7odu9Line5AEixNoF1RIolwnjcLMWaTLNrrhm2NMR+wy03CxNx4MBg32DXVPJUsnWVdaZv9lB04ay+g9vznLaRHnjjsyXBPO39P2v0sXLWgR/rQM3WVlkLRAKSdiwu/TU4L4BLe/d/pxH3MTI8axqDhEDi+NI57iMxGXC1d0z6FdlInMRsoPpjTTEbO5ihrem/ai5lfb+7Le+8VJFZlaoyrTeSNUaSwwHMilyYSFtXEuw7WyJqWMJqIXji+qQFb4UWPIGFUOlMy8lyOpSFUov38fKrHsqm6M1XXyK7hGfCw/a7deK67rvbM45lH+tqVfZhtfK9suufcseKanE1VrQ1tNXXUSMpLp2yoHyHKDEFZ6VTgkQqHO3scvkC1ylTKJEmOOnNljN7WcOXD2f1mhTu4bIErv4o8XFrMr4raW4ViyetpQcllxZcTVHerZOjLqlOILRihvXvI9+faFH3u19qbf49uW8ahoa6QQ1n5fZ7zFFSVpT/ECWlRtGpGKrP6Of15DBy2AlzC0kr0s9SRneQBRnDJ5A209A3FT8u9pEkyX4bMiEts9t2vnpNLR9DWlRHwVRqNzVXq6uhy0UZA0Qd6EJdVB9iapv5Qa3VkVRcToWb0Xup6ANh28jKoANP8W9qMBVKobm5Oo6xYl3D4YLUgtTDDWtXIUa5qWHFgoTEbEGp8KqoYfayHKhUpuqfDPKplMO4cfk16kVnZVWDrSxtjBJGBQfSMCDJOM5tYrLNTOlzNY5PCjAkB9VPncFLSJZX+Wswi5SsLv8f1UD51JFWpD+dlJKj9MkYEg80BUOWNSp7o3W34IaHs3qZeZUCi5EzOkfCL7eZx3upDx2ZfeEPFAw9Z67vDF5+QLXmid1HTsOvZBpZtp2pgjZV1rhsXe5yAMOWjBunyowTRgpnCsV985yEmBDGqgMyzjBWLzODhk2MCxbXkNkQStYb6iPVUWpXJdVOwQv1fXx79fNG0jIK/7x6u5c2Nw7BEtkqNJf9/IByai2kKfeuV55fv1WK6cI85bYm5dmoaY/QWepxr786Rb01RY2syPbIk7Jd2IG96yJXhZzya/FvOYCknSsPXNqVpB+rvzOlVG2oxn4ltZZ6Wtcz2NSzmWo2Hac/qJqEYdJoY6/HrmO1bAwv6huxepkDGaplGhkdqz6oJLBVRvoXDW20xro+9jKODpMK4R3unDI3uNMBnQ42dfGDdjZD4m4qCaEMmePf2z/f+4XTba5qayxjxy/azTxu1ebGYUaE3/uft/86Ssm9hwXqnKocmNNw1N5nRTvHU3AJ1v1qq3iqcI2MDpzOuOjippRsHPIbMialTAZTIvS0cT0qoCwtsmWDZ2tkNR9A6RXD77WXharWd2RoDLRkXFN9VuFQwX11uiv+yFNh65uwcJbfrCL0RMs2pdhu9ph3aIUZ68Cm9vFV43F6iTeopaKZXfxqUr5KzDHGQdyJgaNupbx+q8fzHc0pGd5T44umrOfZ7ZccOCEZL/QNVA4VfF61/88Q60S5URhGU43Gd8+dKSx1jrZVeZqzp/qw3WmjqhTZNJpbVNaMNYuMv64dn9nLkiQIpUJz4cuRrGamIbOZtTHMAGEmd+SQ34nnkRyAB2vXIQ5JaPnPMC2GCJcE4qgqUzXJgUrVetWEJbt8qrdX7ydcy85crpq5/LaZz95DaxBb7yd7oF8pNq4NqxrSJ3TWXLz3Gmy0616oflDOJ1Y7RGkckH7Wq7Q3blX82RH5Z2ve1+2/iqPgTT93ZGjcX1ozQjs1qFWd6BEOFOiXgPmL6ULCoFKcwMZf1D62sKNaOC0uQVxpwOqNeT69Y1FWNq2wVbwa/w2co78d4KHDMi46kfEs3BqMg5VEjIR6UGVvbnZ+fi3EK2vMPCO7eWSe9UgcsdQC7Pu+q8rvUbbIropy/Cv5SGU23ojvy4IiZElfMziLbbiF31WfO0gu/s3QobSwhAiJMJglMoFhn+sWDmSo7jV+sTCQyfa5tDkAPRvPk48xYVApZR/Q7VdZFJtCLyNXyq5D9xk4n1SZWGX1V8J/n0IjQiI66z+df+5Q7NNH8akzlBfG68z9tMExWBS8PEgICVFLdPkv9V7aXvqv6vNO12bX5k7Q7g318vfaWvfKWJQ0IjW5dqT5g2ozMco+VY2vaqvcu4e+i6wiq9Df8bnj4zCjDjvlwyoNf/pFfGoS5ehb2VGJp4alX8fzn9rXt0N5Tp7hckhgw9liF6ppambiqFuls/2P3E5Dmm/VKU/UqdJ1ZDQzTTTD7bI59oLDfJw5UajTpKsf6Rh0yCWvMH6MPIV/OMgxUl+3MepwoTzP5ZDQM9JCt6lgjE6jrkWkp/AwPwVnfymYvSz72rlIRq4T98BhF+c4JPyIWtswM2uIWcotD2PCnOuIWW2yVuNmYUyuEVEbIqAiZiW3Omz0P4ojJqZQGa+mVK2JuhNp3G9k3q7hXelrqAEIy+qP1X9cO0huT9Lf/7e1tBWnB4qr/XJytbo0zAGLB6Xmjw+NenOZLy7A3W9GRWZI8VBJXaLGJsk+pyqbSptWZhzj7BlQgrckE46tvkBzfDEhPn4TSpo+HKcHItSpNSVrGUa/zFR1xOCYsnqZOWQmkoleHVtI4uTACPUSNVaTIKta+ng/TjSvtvkYta7s4PmHIQ6yDurl5Q0zS9kb3Spc2EbJ+b8r2B1cJPi5CHuVkaWRA8pFQw2L4pFVlHWnVKCIsJe5p7v72bvyMiXDRRUjvouqit7nWfK0UrSZ2nm4FD5iaIRVSuOlwoPczAXZl7IXDjcw9VfIZ1/LIizw5ii87GXuae4yey/zjd+/fcx8n3r3VnC18rSZ2ilaAu1kbZ6IN6j+5O8u7/uVsbmB8P2PSiDxl+njZ+dfu2uPTAuJwJAy8jGXlHTPx6QoYuiZU8WXgZoSTSVcTKS31uUO7z7dOMVYickdZ05rtq3HVKKjOR8lzQNfeBVfH0ShFiYTWslH5OIskTrzXSTOdLAL31l6sAtf6pwO57jWrtatX1Xg3NI1tuqBH/hai/u8JXyUJ4etmmP06ogXGKHj9ym7loOb0xcvnL5E9KkopGj6pwz1zIQ3saZrDYxWOpLfnByFjGmek8cHsnobGTsMVi3RB0uSP2TqRNfykIzHE8fGtpbR4mcmaDpdHl/I2eQ3WA1MOK9lYi15h4TO/OthN787qPwfrpJ6iBWec+nnaZPavH63M8JzcKNU1nu9ceAZt0Eu51aG+dC/1+jlS2Svpq5QjDr1bnXIngCrxcLh8WeDrLvu0Xlw5ZK1M3QX69q8tZWFK8Jj+K0NC83IDF8J/rzqgbZ3BQpmi63LmLJqyoqNihWKVf7PMdj88AKaVymWFvGKTG5HO2shj+mcthPOytWM1Wd0I5qg5LQHHteFzw9Fx/DTSzorfX3Du7FXDuVB8Yp8wS2MFizndmdMSRu0l22/QMSKypxLn5muSGk/bODK7GX1s3qZZc31wpEFoivBasFc2wbO9OFHWk3DAC1WRmy07N4lfJP6zhcZchcogpv+ugvYBFCNj1B8JtmdsMid1BYjokMOhrPzboWNm84zFM33XVw5idHJtNI7oD9B/4CeFfM/aHDFa2lr4aypzlF398ce8DyRM9ZtdlFMwYn84pi+YSxnnFtTQ/6JgqKYyq0jGgKjrDkJ8VEJnPimIbAhINq6ISEqnpOw8MWbOBUBTg8CkwMfOLXkq+Zf4aDTqGOsW6lTq12la6zThP2a45YhsFoXPpvrF6ZMwEljXo6Do3J71TYt1bxJo4l5XGPsAYfdTPytEsTuoWSoyL1r8DcJsIoXGRBXj/92MIa9PszT1TN0PXuAMZsau/5BpnWKsavdf07ScLaYLglKLbXV1jF3NdfBEBUfg2AyCvF62MbYdFBZQTNb2pKw3x+h6LAgcaK3vqgzCOpZlICMyBrDmsujMpwyxNWinsdvc3WMfLNTRRKP3CjHi38iUq12ZppkGtcvM3zlsmJeLm2L25a2rWzD70g/oV1SnPvwUcMh7OlCvyC70XEeZyEPVH+6z8BJLvAVKJwMnMdShTHW+blyeW6e+2XyTFLUL/4cdaVXpSI6on1lu1t4gFziN7l9DAy4Wu5+Y0HdLP/SwxPhJcqH1gnqKNOvekeTLCaxq0Q+R340vL05zfJjcg/B5nSqvnWvambuCP0yrvcO7DtvszcuwNio28hjbYqfV6jUQSuun3VaFZagnlISixay5aIOBsBUy0LlU+WT60NPSJIExzU+mbPkyeLZ+L34HQtOmG0E1scc/L9JPVt9JoQMJaFPYHxc7M3MTE8P6o/7fxQUw3o8osT5olSPHs8UUb448q/3rwrNPgt1ZzMNGat06e2tZBgym/7+zG7TYlyvUFLQR9jXrhZYltU8rZEcbzFo2bhuxFl2Xq7eaiBLJVGBNNkwdZ2aGrtpkYydzvg40j/wu/evnlr8D6+corqdq6bVCLigmKVA80tD/vbg1ODtfEOXfCHyQH3G7O1O22dvy3sTvX/Yaxem8UH7pkD3LcLTqCCGbvM2uz6h7geDQHNCADajD+MsFCf8TZglOLul32RWtUCAdenbQ4/G3YW51sa6B0YeMoQbtf1PNZY061PDqh/6VDc0yLI4FntcNZ/WDZ3gzLlZbCNrzpmzaZq9CdZEc1BW44l8ZJwWq8M6cA7umyxwDzWalwAbxXlxTJbBenFe7N3ugTUweNwm9IVic/DN7wC4BVoWLFd2+ykOuvvN1HfvK1hpbX+fGi3HBwC1N7/VRdO+AJVRw/SqYyWYQXZ8S5/IKVaY7+z4mvGuE6i995lVRPq8NJnvNQrmK6uoUTAX1TIuFZT5QdBg2V+rhd1w9PvRRxumD65vB2Hx2M4S3rsBT1f7ERRL8eiAvNNz1//Q3wZ8b3Zia8BD1AltPNwc5AOpd0o4kWAYkpVOMR3AP/Dei1f6IUrzHOSXfgKdBwBvtaGdtb8qcMcHH+om0gMEVx+dZP0P6nzmsCr3sRrNOgd58Cjk4sPQ7KU5biCeW1XqAAceCObGYdZzJQqw+RnhnAJitRV4ujJbmWEQ+l9HQ+MVsLz7vSeu/fMyQ53//igfeQhogQYgwFvQQw0Fz9C2h0HAz3tB+2JT7WHQAFc4nJgOfj7gnqNGBDmK71jnCycIUqPB0G/24a/vsU74hpx3aBs8kNpDnMWgGZftDfgFZ5ZOB6/PiKMET77IG2pHtR/lfzIN/Lxll+00aeY8ygDfZZrR1pBh0HSvegBXkytM85Dd0/URbmryc5zU4wj7xeHNPMG0zgCsYIz61DYeeYZfh3lapPDsBNwL91kD3M3z/F6P5BmO4eUxLrS/mTvEFFghOywfxxM+mKZ60SRe49zTuKHNPl82znloR4kcPj7ZwS/HNGEQ/xoTWWUU/wlXhPUbw35SyjjtG5OX+yWnj0W+ovLa+U5PUUMsyh14NcwXY4NF2GPhDDxqZGqnkXFNBvMI/MEPng4eGhcCu+3s0owY8kkfUyAq1o+X9zyboQ5LGtMT3oFEMWxgEGH4IsFEmGh9ZQDODe+UXFcw0D/4B3xOaSm7kSE3MCAIwx502F2DVWoQmzxgV1uhvYtBo8Pgmnc2CfveWp1fTGtEk3bE+F6WWTNWNkVSghNI0DV3nCdMRwO3CBhwUl/j54tyDWsgHwbATBgI5dTf3k9HABZIp4M4Wq9JWrq0bZhGAwRdF/Aj3ptjCJjG9hgadAjTYzTg7dkxdNg5dYwmFMYfowVboqP14UfvFASwA6Cacsk0eeQfcyDlQXSNJYJ5pZJylJFzXP72eSLxZMLFwvoU8BIvSoxkeSYpFiNgepDwzMlypcpTViPCKcIm0NS7xSF1MJ8W90zSuHSMpyCeH3NwcuWp5I6bAoHOEfDhCyuXJ0xvAljeAoM+wYCb3R/AztF0RogSRUVbllFYkEo/DAJrFA3FismWnMC8LJgJyggrOM3hxcUqzjI6g5jUOv+Ma2SfVrVJTwXkLLNCtm7MUWwKLThfZoHJE8ynRVcGewGpJbmgwV/lXAeBT2oBOGWRsziNbNvk6MbjJJczvjxncA7n8foDNJ/MBVzEJVyGB09evPnIJ7DdFVxFgetYTM33Izb9vYfQDfShUD+CBH9YBb61ZOQfQ1m9TRSKTBEpSrFoNzFcyXmwSr35IMt/4zlGiVGuUpUKseLES5Co2mg1atXZYarNKEmSpUiVZgDppplOqd4YY40z3jv0muAIjmK9DWxYsmDLlDUr5syYOOCLr6HhWzQIOqFJaBHahA40CF2wEKHJMAbYio4WWjByHBxb2DG2y06GYUBiokzhRJjQQyeVQw7TxEnstsdePU6AAV1wZXiFuWaYrVmjeWFipoO0McsKYln2RQ9sDuy1+oBBOtDH0rAw3wPcwgJSd3Aftwl97YqPcm9vSVDkfLsENOlT+n89xbo8JLCtMk+fbKvYW3usSZwho38JPpofKvDx14v7SqS/Cp1oz4AgfR8xNGs7fT4=) - format("woff2"); -} - -@font-face { - font-family: "VT323"; - font-style: normal; - font-weight: 400; - font-display: block; - src: url(data:font/woff2;base64,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) - format("woff2"); -} diff --git a/.agents/skills/embedded-captions/references/aesthetic-principles.md b/.agents/skills/embedded-captions/references/aesthetic-principles.md deleted file mode 100644 index fe81e7d..0000000 --- a/.agents/skills/embedded-captions/references/aesthetic-principles.md +++ /dev/null @@ -1,167 +0,0 @@ -# Aesthetic Principles for Cinematic Captions - -The 18 rules that separate "designed" caption work from "preset-generated" caption work. This is the single most important reference in the skill — every plan.json and every Standard-mode HTML should be checked against these before committing. - -The whole competitive thesis: every AI caption tool in 2026 (Veed, Submagic, Opus Clip, Captions.ai, CapCut) is a **preset picker**. They hand the user a box of crayons. This skill is a **director** — it exercises judgment. Beat them on taste, not feature count. - ---- - -## The 18 rules - -### 1. The subject always wins - -Captions exist to serve the face, not compete with it. If the caption draws the eye before the speaker, the caption has failed. **Before shipping any plan.json, ask: "does the caption or the subject read first?"** If caption wins, shrink, dim, or move it. - -### 2. Occlude, don't hover - -World-class caption design puts text _into_ the scene. Letters that pass behind a shoulder, mic, or head feel diegetic. Letters that float uniformly above the lower-third feel like PowerPoint. Use the matte pipeline — that's the moat over every competitor. - -### 3. Contrast is a hierarchy problem, not a brightness problem - -A white box behind text is a failure of taste. Priority order: - -1. `mix-blend-mode: overlay` or `screen` picking up scene luminance -2. 2–3px dark stroke + soft drop shadow -3. Narrow semi-opaque gradient bar (NOT a solid box) -4. Dim the background plate by 10–15% locally -5. (LAST RESORT) A hard white pill box — banned on cinematic directions - -### 4. Kill the constant lower-third - -Fixed-bottom captions are monotone. Caption zone shifts with shot: - -- Tight close-up → upper sidebar or crown -- Mid-shot → embedded on back wall / foam / whiteboard -- Wide → classic lower-third offset to non-subject side - -### 5. One family, two weights maximum - -Hierarchy lives in **weight** (e.g., 500 → 800), not in **font**. Mixing Montserrat + script + serif in one clip is the #1 amateur tell. Ship Inter, SF Pro, Söhne, GT America, Aktiv Grotesk, or Neue Haas Grotesk with ≥5 weights and compose with weight + size. - -### 6. Tracking tightens as size grows - -Display-size (>40pt) wants negative tracking (-10 to -30 units, or `-0.015em` to `-0.035em`). Body-size (14–20pt equivalent) wants positive tracking (+5 to +15, or `+0.005em` to `+0.015em`). Apple SF Pro's optical-size model is the reference. Submagic defaults do the opposite — they look cheap because of it. - -### 7. Cap height ≈ 3.5–5% of frame height for body captions - -- 1080p vertical (1920 tall): body 65–95px, emph/hook 130–170px -- 1080p landscape (1080 tall): body 40–55px, emph 70–100px -- Hormozi-size (~7–9% of frame) is **hook** size, not body size. Reserve for punchlines. - -### 8. Never italicize for emphasis in video text - -Italics are a **print** convention for flow inside a paragraph. On 24fps motion they read as "tilted" not "stressed". Emphasize with weight (extrabold), color (single accent), or size (1.3–1.6×). Italics allowed only for: - -- Literal quotation of written material -- Foreign word -- Thought vs spoken dichotomy - -### 9. Color discipline: one hue + neutrals - -Pick **one** saturated accent per video for keyword highlights. Hormozi's yellow+green+red works for him because his content is already loud. Cinematic = single accent + white/bone/charcoal. Default palette: - -- Warm white `#F5EFE6` on dark -- Graphite `#1A1A1A` on light -- Accent chosen from scene sampling - -### 10. Animate transform only, never the letter itself - -`letter-spacing`, `filter:blur`, `font-weight` animations cause inline-block reflow → line-jumps. Animate `translateY`, `scale`, `opacity`, `clip-path`. This is locked from the embedded-captions debugging. - -### 11. Minimum 0.4s per word visible - -BBC reading speed is 160–180 wpm (0.33–0.38s/word). Cinematic feel wants more breathing room — 200–220ms stagger per word, hold full phrase 0.4–0.6s before exit. Entries under 150ms read as frantic. - -### 12. Stagger is the primary expressive axis - -Same phrase, different stagger, totally different feel: - -| Stagger | Feel | -| ------- | -------------------------------- | -| 40ms | machine-gun, urgent, TikTok-hook | -| 80ms | conversational, default | -| 150ms | deliberate, documentary | -| 250ms+ | poetic, ceremonial | - -Pick from content tone, not default to one value. - -### 13. Emphasis escalates _within_ a phrase, not _between_ phrases - -Every word bolded = no emphasis. Structure: - -- 70% plain body -- 20% slight lift (color OR weight, not both) -- 8% full emphasis (bigger, brighter, held longer) -- 2% climax (biggest, held 1.5s, breath before + after) - -### 14. Break rhythm once per 30s - -Every-word-same-way = eye adapts, stops registering motion. Plant a rhythm-break every ~30s: - -- Phrase enters from opposite direction -- A single word at 2× size -- A beat of pure silence with no caption -- A color shift - -This is what separates Submagic-preset work from something designed. - -### 15. Caption what adds, cut what restates - -Transcribe everything. **Display** 70–85%. Remove: - -- Filler ("um", "like", "you know", "I mean") -- Self-corrections ("I think... I mean actually...") -- Obvious visual echoes ("as you can see here" while pointing) - -Editorial judgment — no existing AI caption tool does this. It's pure upside. - -### 16. Segment on breath, not on duration - -Chunk at natural pauses ≥ 250ms. A caption spanning a breath-break feels wrong. Whisper word-level timestamps make this trivial. - -### 17. Safe zones per platform, always - -- Use the safe boxes in `/hyperframes-studio` (Safe zones) for wide and vertical - framings; that skill owns the values. - -Bake into the layout solver. Never eyeball. - -### 18. Letterbox/pillarbox is caption real estate - -Black bars on 9:16 from 16:9 source? Those bars are the caption home. 2.35:1 cinematic frame on 16:9 export? Serif quotation in the letterbox reads as documentary. - ---- - -## Rhetorical judgment rules (editorial) - -These are the "what to caption" decisions. No existing tool exercises them. - -- **Filler suppression** — off/light/strong. Default: light for documentary, strong for vlog. -- **Self-correction folding** — display only the final version. -- **Breath-group segmentation** — split on silences >250ms, never mid-phrase. -- **Semantic emphasis** — LLM-pass per phrase: "which 1–2 words carry the meaning?" Highlight those. Don't default to stressed syllables or loudest words. -- **Silence honor** — if speaker pauses 1.5s+ for rhetorical effect, don't back-fill with lingering prior caption. Let silence breathe. -- **Quote-sensing** — "he said, quote…" or air quotes → italic (one of the allowed italic exceptions). -- **No `[laughs]` / `[sighs]`** — those are accessibility captions. For aesthetic captions, they pollute the frame. - ---- - -## Self-critique checklist (run before rendering) - -The agent's own pre-render pass. Flag violations: - -- [ ] Does the caption or subject read first? (Rule #1) -- [ ] Any hard white pill boxes? (Rule #3 — banned on cinematic) -- [ ] Still lower-third for a close-up? (Rule #4) -- [ ] More than 2 weights or more than 1 font family? (Rule #5) -- [ ] Italic used for emphasis? (Rule #8 — banned) -- [ ] More than 1 saturated accent color? (Rule #9) -- [ ] Letter-spacing or filter:blur animating? (Rule #10 — banned) -- [ ] Stagger same for documentary and vlog? (Rule #12) -- [ ] Every group emphasized? (Rule #13) -- [ ] 30s+ with no rhythm-break? (Rule #14) -- [ ] Displaying every filler word? (Rule #15) -- [ ] Caption crossing breath-break? (Rule #16) -- [ ] Caption in platform UI zone? (Rule #17) - -Any "yes" to a violation question → regenerate the affected segment. diff --git a/.agents/skills/embedded-captions/references/anti-patterns.md b/.agents/skills/embedded-captions/references/anti-patterns.md deleted file mode 100644 index 21e6a34..0000000 --- a/.agents/skills/embedded-captions/references/anti-patterns.md +++ /dev/null @@ -1,188 +0,0 @@ -# Anti-Patterns - -You default to these. Stop. - -Each entry: the bad habit, what it produces, what to do instead. Written in the voice of someone who has watched an agent do this 10 times — because we have. - ---- - -## Layout - -### You default to center-aligned crown. - -`.crown-plane { left: 0; right: 0; text-align: center }` is the template default, and you'll leave it on every video because it worked once. On a subject that sits right-of-center (Jobs in a 16:9 frame), the body eats the middle 60% of the word and "THE BEATLES" becomes "THE \_\_\_ S". - -**Before using the default crown**, run the three conditions in [layout-heuristics.md § Crown placement](layout-heuristics.md): - -1. Subject centered within 10% of frame center -2. Clean zones ≥ 15% on each side -3. Crown width > subject width + 400px - -If any one fails, **move the crown to the larger clean zone** with a narrower container and smaller font. Don't keep centering a word that's about to be 60% occluded. - -### You compute text leftmost as `plane_left + padding`. - -That's correct for left-aligned. Wrong for the templates you're using, which are **right-aligned** on the main column and **center-aligned** on crowns. The real leftmost depends on the word width. - -| Alignment | leftmost_x | -| --------- | -------------------------------------------------- | -| Left | `plane_left + padding_left` | -| Right | `plane_right − padding_right − longest_line_width` | -| Center | `plane_center − longest_line_width / 2` | - -Compute it against the **longest wrapped line**, not the whole phrase. "four very talented guys" wraps to 3 lines — the widest is "talented" (~8 chars), not 23. - -### You treat `plane_left` as the text's leftmost edge. - -It isn't. With `left: 180px` and a right-aligned 468px word, the text starts 104px **before** `plane_left` relative to the plane, but actually lands somewhere inside the plane box. The plane box just sets the coordinate space — the text positions inside it based on alignment. Check the compiled output, not the plane attribute. - -### You center text on the frame when the subject is off-center. - -Look at the subject's body center, not the frame center. Jobs sits at x=1100 in a 1920 frame. The **scene's** center of gravity is 1100, not 960. Center-aligning text to 960 is center-aligning to the empty left third, not to anything meaningful. - -### You copy-paste position values from memory-wall to a new video. - -`top: 40, right: 30, width: 720, rotateY: -13` worked for a 1280×720 frame with an acoustic foam wall on the right. It will not work on a 1920×1080 frame with a bookshelf backdrop. Run the 6-item checklist in [scene-types.md](scene-types.md) for the new video before reusing any numbers. - ---- - -## Typography - -### You use template default font sizes regardless of column width. - -Template defaults (66/78/92/140) are tuned for a ~560px column. When you bump the plane to 700px+ and don't touch the fonts, the captions feel underweight — small text swimming in negative space. - -Use the [Font-size × column-width matrix](typography-presets.md). For a 700px column, that's 78/108/128/220 — a 30-40% bump across the board. Re-check pillarbox safety after bumping (bigger right-aligned text extends further left). - -### You pick `intro` style for every first caption. - -Intro = italic, smaller, contemplative. Fine for filler discourse markers ("You know,", "So,", "Well,"). **Not** for the first line when it's actually the thesis ("I've had this kind of upbringing"). Read the words semantically, not positionally. - -### You skip emphasis entirely because "every caption looks clean." - -A story without an emph or crown is typographically flat — viewers can't feel the crescendo. Reserve at least ONE emph per video for the line that lands. Skip it only for truly monotone content (policy statements, warnings). - -### You give every group its own style. - -Style is supposed to signal _hierarchy_. Using `intro`/`phrase`/`emph`/`dream`/`crown` all in one 15-second video means none of them signal anything. Pick 2-3 styles max for a short clip. - -### You only use the 5 preset class names. - -`intro / phrase / emph / dream / crown` are scaffolding, not a closed set. The canonical `memory-wall.html` uses `cap-1 / cap-2 / cap-3 / cap-4` — **position-indexed** with bespoke typography per position. That's how it achieves the 3-line right-aligned cascade on the climax. You can't express "this cap has a hanging indent at position 2" with `"style": "dream"`. - -The `"style"` field in plan.json accepts **any string** — it becomes `class="cap-"`. Define the class in `custom_css`: - -```json -"custom_css": ".cap-1 { font-size: 78px; ... } .cap-2 { padding-right: 44px; }", -"groups": [{"id": "cg-0", "style": "1", ...}] -``` - -When the scene needs per-position bespoke typography, do this. Don't force-fit into `intro / phrase / emph`. - -### You regenerate from plan.json when a canonical example already has the answer. - -When scene framing matches `references/example-renders/memory-wall.html` or `champion.html`, clone that HTML into `/index.html` and only swap the GROUPS array. Don't re-derive the design from presets — you'll lose the specific per-position typography that took many iterations to validate. See [bespoke-vs-presets.md § The clone-and-tweak workflow](bespoke-vs-presets.md). - ---- - -## Blending - -### You default to `mix-blend-mode: overlay`. - -Overlay works on **mid-tone** backgrounds. On dark bookshelves (<60 luminance), overlay makes white text render as black. On sunny backgrounds (>180 luminance), overlay blows out. Check the actual luminance of the caption region in a sampled frame. Pick: - -- mid-tone surface (60-180) → `overlay` -- dark surface (<60) → `screen` -- bright surface (>180) → `normal` with opaque text - -### You animate `letter-spacing` on the word entry. - -You saw a "typewriter breath" effect somewhere and added `letterSpacing: "0.04em"` to the `fromTo` "from" state. Result: inline-block reflow every frame → the whole `.cap` line box recomputes → captions visibly jump between rows. See the "Some → line 2" bug from memory-wall. - -**Animate only opacity + transform.** If you want a breath effect, use `scale` or `y`, not letter-spacing. - ---- - -## Animation - -### You fade both the group container AND each word. - -Default feels safer: fade the container in, then fade each word in. But container.opacity × word.opacity produces a non-linear curve — at progress 40% the combined opacity is 16%, not 40%. Visible result: captions seem to "pop" into view around halfway. - -Set container opacity to 1 at entrance via `tl.set`, then fade only the words. Single-layer opacity = linear perceived fade. - -### You stack captions in a flex column. - -Flex-direction: column with multiple `.cap` children looks tidy in source. At runtime, hidden captions (`visibility: hidden`) still reserve flex space. The newly-entering caption shows up at the _bottom_ of the column instead of the designed position — landing in the gesture zone, getting clipped. - -Use `position: absolute` for each `.cap` inside the plane so hidden ones don't occupy layout. Both shipped templates do this. - -### You start the timeline at t=0. - -Caption at exactly t=0 feels like it was there before the video started. Offset 0.1-0.3s (hyperframes motion-principles.md agrees). Same for the very last caption — let it exit before the video fades. - ---- - -## Scene admission - -### You trust that "looks like one speaker" = "is one speaker throughout." - -TV archive clips cut to B-roll mid-sentence. Interview clips insert cutaways to the interviewer. You didn't check frames beyond the first one, so you rendered captions across a shot transition. Result: captions designed for Subject A are placed relative to Subject B's position (or empty frame) for half the render. - -Sample frames at 20%, 50%, 80% BEFORE planning. If the scene changes, trim to the largest single-subject segment. - -### You ignore baked-in captions / pillarbox / watermarks. - -You saw black bars on the sides and didn't computing the safe-zone. Your captions cross the pillarbox. Or: the source already has burned-in subtitles and you added more — two caption systems fighting for attention. - -Run the **letterbox probe** first. If the source has existing captions, refuse with: "source already captioned, adding more would conflict." - -### You ship Whisper's transcript without checking timings against the beat. - -Transcription is Whisper (via `transcribe.cjs`, no API key) — good word timings, but not infallible: a word can land with a near-zero duration or a timestamp a beat off. This skill is verbatim + on-beat, so `check-timing.cjs --strict` (80ms tolerance) is the gate, not a suggestion — fix drift in `plan.json` before rendering, and never pack two transcript words into one timed entry (the second inherits the first's timestamp and fires early). - ---- - -## Matting - -### You enable CoreML for the matting ONNX. - -It's the Apple way, obviously faster. No. CoreML partitions the ONNX graph across providers. The mixed-precision boundary produced (observed with the previous RVM engine) alpha=30 inside the subject's face while background correctly reads 0. Captions shine through face. Pin the CPU execution provider only (`onnxruntime-node`). Our `matte.cjs` already does this; don't "optimize" it by re-adding CoreML. - -### You pick a matte model by "general vs human." - -DECISION FLIPPED 2026-06-12 after a 5-model × 6-scene A/B with caption renders: the matte's job here is CAPTION LAYERING, not prop fidelity. `u2net_human_seg` (via hyperframes `remove-background`) usually excludes thin offset furniture (mic boom arms) from the matte — words stop being sliced by booms, which beat PP-MattingV2's prop-preserving behavior on real caption videos. It is NOT surgical: large salient objects near the subject (telescope rigs) can still leak in — always sample frames_fg/. Known cost: HELD products can drop out intermittently (captions pass in front) — route product-demo climaxes away from held objects. `isnet-general-use` lost outright (backlit-hair collapse). birefnet-portrait (MIT) beat everything semantically (keeps held items AND drops furniture) but is 928 MB / ~7 s-per-frame CPU — a future quality tier, not the default. - ---- - -## Grouping - -### You caption every word. - -Transcripts are verbose — "you know, um, I, I mean, you know" is 5 words from a single beat. Captioning all of them clutters the screen and breaks reading rhythm. - -Editorially drop filler. Use the rules in [caption-grouping.md](caption-grouping.md): merge short fragments, cut repeated discourse markers, keep the meaning, trim the noise. You are writing typography to support speech, not a court transcript. - -### You group by fixed word-count. - -"3 words per caption, always" makes every caption look the same and fights the natural cadence of speech. Break on sentence boundaries, 250ms+ pauses, and semantic units instead. Caption sizes will naturally vary from 2 words to 5 — that's correct. - ---- - -## The meta anti-pattern - -### You read one reference doc and skip the rest. - -You'll read this file alone and feel covered. These anti-patterns reference concepts defined in `layout-heuristics.md`, `typography-presets.md`, `scene-types.md`. If you haven't read those, the fix advice here won't make sense. - -**Order of reading for a new video**: - -1. SKILL.md (decision gate + pipeline + pre-flight probes) -2. bespoke-vs-presets.md (**first check if a canonical example fits — clone if so**) -3. scene-types.md (template selection — all 4 wall conditions) -4. layout-heuristics.md (positions, sides, crown, font scale, pillarbox formula) -5. typography-presets.md (font-size × column-width table, starting points) -6. caption-grouping.md (word → group) -7. **This file last** (to catch yourself before committing to plan.json) - -If you're pressed for time, still read this one — it flags the failures you're about to make. diff --git a/.agents/skills/embedded-captions/references/bespoke-vs-presets.md b/.agents/skills/embedded-captions/references/bespoke-vs-presets.md deleted file mode 100644 index 8311cb7..0000000 --- a/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +++ /dev/null @@ -1,178 +0,0 @@ -# Bespoke design vs. presets — when to override, when to clone - -The 5 preset styles (`intro / phrase / emph / dream / crown`) and the 3 templates (`wall-embed`, `corner-column-crown`, `portrait-header`) are **scaffolds**, not rules. The best renders we've shipped all override presets for specific groups because **typography is a per-scene decision**, not a general rule. - -If you only use presets, your render will look generic. If you only copy existing renders, your skill won't adapt. The right workflow is: - -1. **Decide the shape first** (template choice, plane position, blend mode). -2. **Check if a canonical example is close enough** → clone and tweak words + timings. -3. **Otherwise start from presets** → override per-group via `custom_css`. - ---- - -## Canonical example renders - -Full HTML for two validated renders is in `references/example-renders/`: - -| File | Scene | What makes it work | -| ------------------ | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `memory-wall.html` | Introspective monologue, right-side foam wall, mid-tone | Right-aligned cascade, per-group bespoke sizes (`cap-1` 78 italic / `cap-2` 66 italic + right hanging-indent / `cap-3` 72 upright / `cap-4` 90 uppercase). `mix-blend-mode: screen` for the dark-ish foam. | -| `champion.html` | Podcast interview, cluttered bookshelf, 1920×1080 | Upper-left column + center-stage crown. Tuned preset class sizes (`cap-intro` 52 / `cap-phrase` 60 / `cap-emph` 70 / `cap-crown` 140). `screen` blend reads the shelves through text. | - -**When a new scene matches one of these closely** (similar framing, similar subject-center, similar backdrop type): clone the HTML and only replace the GROUPS array + word timings. Don't re-derive the design from presets — you'll lose the specific choices that took many iterations to validate. - ---- - -## When presets are wrong - -You'll reach for presets like `"style": "emph"` when what the scene really needs is: - -### "This cap is at position N and deserves its own treatment" - -`memory-wall.html` uses `cap-1 / cap-2 / cap-3 / cap-4` — **position-indexed**, not role-indexed. Each one is a bespoke design for a specific phrase at a specific point in the arc: - -- cap-1 (soft opener, 4 words): 78px italic 600 — feels like a whisper -- cap-2 (dreamy modifier, 3 words): 66px italic 500 + `padding-right: 44px` — hanging indent creates ragged right-edge stagger -- cap-3 (turn, 2 words): 72px upright 700 — the syntactic pivot, no italic -- cap-4 (climax, 4 words): 90px uppercase 900 — three lines cascade right-aligned - -`phrase/emph/intro` can't express "this cap has a hanging indent" or "this cap is the syntactic pivot". When that matters, invent your own class names: - -```json -{ - "template": "wall-embed", - "custom_css": " - .cap-1 { font-size: 78px; font-weight: 600; font-style: italic; - letter-spacing: -0.01em; } - .cap-2 { font-size: 66px; font-weight: 500; font-style: italic; - padding-right: 44px; } - .cap-3 { font-size: 72px; font-weight: 700; letter-spacing: -0.015em; } - .cap-4 { font-size: 90px; font-weight: 900; letter-spacing: -0.03em; - text-transform: uppercase; line-height: 1.0; } - ", - "groups": [ - { "id": "cg-0", "style": "1", "words": [...] }, - { "id": "cg-1", "style": "2", "words": [...] }, - ... - ] -} -``` - -The `"style": "1"` field becomes `class="cap-1"` on the element — any string works, no validation. - -### "The template's blend doesn't suit this backdrop" → pick a different template, do NOT override - -**Cinematic mode does not override colour or blend.** A template's `mix-blend-mode` + fill are **locked DNA** — `make-composition.cjs` ignores `plan.cap_color` / `blend_mode` / `text_shadow` / `text_filter`. Selecting a template commits to its look; the only agent-authored things are layout (planes/positions) and per-group typography. - -So use the caption-region luminance to **choose** a template that already fits — never to recolour one: - -| Region luminance | What fits | Why | -| --------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -| < 60 (dark / low-key) | a cream + `screen` template (`cinematic-cream`, `memory-wall`, `champion`, `portrait-header`) | light text glows, picks up the scene | -| 60–180 (mid-tone) | a cream + `screen` template still reads (add a scrim via Standard if marginal) | text picks up texture | -| > 180 (bright: window, pale wall) | **none of the cream/`screen` Cinematic templates — they wash out** | → use **Standard mode** (opaque rail, set per the chosen template) instead | - -If the scene is bright and the cream/`screen` look washes out, that's the signal to switch to **Standard mode** (which sets opaque colour in the HTML), not to recolour a Cinematic template into something it isn't. - -### "Hanging indent / outdent / letter-width tweak" - -These are per-group affordances you'll occasionally need. Express via `custom_css`: - -```css -#cg-2 { - padding-right: 44px; -} /* right-aligned: shrinks right edge, creating left outdent */ -#cg-2 { - padding-left: 44px; -} /* left-aligned: offset right start */ -.cap-emph .w:first-child { - font-size: 110%; -} /* oversize first word only */ -``` - -The `#cg-N` selector always works because `make-composition.cjs` writes `
` for every group. - -### "Caps should accumulate (flex stack) instead of swap" - -All three templates default to `position: absolute` on `.cap` inside their plane — caps stack at one spot and only the active one shows (single-caption swap). This is correct for `portrait-header` and `corner-column-crown`, where each caption replaces the last. - -`memory-wall` uses **flex column accumulation** — captions pile up like a poem. The template doesn't default to this, so override via custom_css: - -```css -.wall-plane { - display: flex; - flex-direction: column; - justify-content: center; - align-items: flex-end; /* or flex-start for left-aligned */ - text-align: right; - gap: 14px; -} -.wall-plane .cap { - position: static; /* un-do template's absolute */ - top: auto; - right: auto; - max-width: 100%; -} -``` - -With this + staggered `in` / `out` times, cap-0 fades in at t=0.2, cap-1 at t=2.55 (below cap-0 in flex order), cap-2 at t=4.90 (replaces both as they fade out together at t=4.85) — this is how the memory-wall poem pages work. - -### "Font size doesn't match the scene" - -Template preset sizes are tuned for a specific column width + frame size. Don't fight them — override: - -```json -"custom_css": ".cap-intro { font-size: 52px; } .cap-phrase { font-size: 60px; }" -``` - -Then check [typography-presets.md § Font-size scales with column width](typography-presets.md) for what to aim at given your plane's actual dimensions. - ---- - -## The clone-and-tweak workflow - -For a new video that's clearly similar to an existing canonical example: - -```bash -# 1. Scaffold the project -hyperframes init --non-interactive --video --skill=embedded-captions - -# 2. Matte + transcribe -node scripts/matte.cjs -node scripts/transcribe.cjs - -# 3. Copy the canonical HTML instead of writing plan.json -cp references/example-renders/memory-wall.html /index.html - -# 4. Replace GROUPS array with the new transcript's grouping (hand-edit index.html) - -# 5. Render directly (skip make-composition.cjs since we're not using plan.json) -bash scripts/render-and-composite.sh -``` - -This skips the preset-based plan.json entirely. Use when: - -- Subject framing, shot composition, and backdrop type are similar to the example -- You just need to swap the words and timings -- The bespoke typography from the example is what you want - -**Don't clone when**: - -- Subject position differs significantly (e.g. centered vs off-center) -- Scene luminance / blend-mode needs are different -- You want to experiment with new typography - -In those cases, start with plan.json + custom_css and iterate. - ---- - -## Rendering history - -`render-and-composite.sh` now snapshots `index.html` + `plan.json` into `/history/` with a timestamp before every render. If the user says "the previous one was better", diff against the latest snapshot: - -```bash -ls /history/ -diff /history/index-20260422-203947.html /index.html -``` - -This lets you recover a design you iterated away from, without re-reading the agent transcript. diff --git a/.agents/skills/embedded-captions/references/caption-grouping.md b/.agents/skills/embedded-captions/references/caption-grouping.md deleted file mode 100644 index 06f04c1..0000000 --- a/.agents/skills/embedded-captions/references/caption-grouping.md +++ /dev/null @@ -1,130 +0,0 @@ -# Caption Grouping - -How to turn the Whisper word-level transcript into the `groups[]` array of plan.json. - -## Goal - -**Each group is one visual phrase**: enters, reveals word-by-word, exits. Rule of thumb: 1 group ≈ 1 comma-to-comma clause or 1 breath of speech. - -## Input - -`transcript.json` from `transcribe.cjs`: - -```json -{ - "words": [ - { "text": "Some", "start": 0.24, "end": 0.44, "type": "word" }, - { "text": " ", "start": 0.44, "end": 0.48, "type": "spacing" }, - { "text": "memories", "start": 0.48, "end": 0.82, "type": "word" } - ] -} -``` - -Drop `type: "spacing"` entries; you only need words. - -## Break boundaries - -Cut a new group at ANY of: - -1. **Pause ≥ 500ms** (gap between word.end[i] and word.start[i+1]) — speaker took a breath. -2. **Sentence terminator** — word ends with `.`, `?`, `!`, or an em-dash-like pause. -3. **Strong comma** — `,` followed by pause ≥ 250ms. -4. **Discourse reset** — words like "but", "so", "and then", "you know" starting a clause often merit their own or new group. -5. **Group reaches 6 words OR 2.5 seconds** — whichever first. Long groups feel like subtitles, not embedded typography. - -Hard constraints: - -- Minimum 2 words per group (1-word exceptions: interjections like "Wait." or the crown line). -- Minimum 0.5s on screen. If a group is less, merge into neighbor. -- No overlapping groups — at most one visible at a time. - -## Timing the group - -For a group with words `w[0]..w[n-1]`: - -- `in` = `w[0].start - 0.08` (enter slightly before first word) -- `out` = `min(next_group.in - 0.05, w[n-1].end + 0.6)` (linger ~0.6s after last word, but don't collide with next) - -The last group extends to the video end if needed. - -## Style & tone (cross-reference) - -See `typography-presets.md` for how to pick `style` and `tone` per group. Work left-to-right through the groups and: - -1. First group: default `intro` + `soft`. -2. Watch for emphasis signals (ALL CAPS in transcript is rare but possible; more often it's semantic — superlatives, proper nouns). -3. Escalate tone into `present` once the monologue shifts from setup to statement. -4. Reserve `crown` for at most ONE group, typically the final line. - -## Editorial surgery is allowed - -You do NOT have to caption every word. It's fine to: - -- **Drop filler** like extra "you know"s, "um"s, "I mean"s if they bloat the visual pace. -- **Condense** a 6-word run into 4 by cutting function words, as long as the meaning and timing remain truthful. -- **Skip the whole thing** during obvious silence or non-speech (laugh, music interlude). - -Editorial rule: you are writing typography to support the speech, not a court transcript. Keep meaning, trim noise. - -## Example (champion) - -Transcript: "You know, for me I've had this kind of upbringing, had the great foundation and, you know, I've achieved incredible things. I was dreaming of becoming number one in the world and becoming a Wimbledon champion" - -Groups after editorial pass: - -```json -[ - { - "id": "cg-0", - "style": "intro", - "tone": "soft", - "words": ["You", "know", "for", "me"], - "in": 0.1, - "out": 1.45 - }, - { - "id": "cg-1", - "style": "phrase", - "tone": "soft", - "words": ["I've", "had", "this", "kind", "of", "upbringing"], - "in": 1.4, - "out": 3.35 - }, - { - "id": "cg-2", - "style": "phrase", - "tone": "soft", - "words": ["the", "great", "foundation"], - "in": 3.5, - "out": 5.35 - }, - { - "id": "cg-3", - "style": "emph", - "tone": "present", - "words": ["I've", "achieved", "incredible", "things"], - "in": 6.05, - "out": 8.3 - }, - { - "id": "cg-4", - "style": "dream", - "tone": "present", - "words": ["dreaming", "of", "becoming", "number", "one"], - "in": 8.5, - "out": 10.4 - } -] -``` - -Plus the crown: - -```json -{ "id": "cg-crown", "style": "crown", "words": ["Wimbledon", "Champion"], "in": 10.8, "out": 12.08 } -``` - -Notice "had" was dropped from cg-2 ("had the great foundation" → "the great foundation"), "I was" was dropped from cg-4, and "a" was dropped from crown — all for visual cadence. - -## word.start/end inside groups - -Pass through the original timestamps from the transcript. Don't retime individual words — only the group `in`/`out`. The word-level karaoke reveal inside each group uses the original w.start. diff --git a/.agents/skills/embedded-captions/references/composition-craft.md b/.agents/skills/embedded-captions/references/composition-craft.md deleted file mode 100644 index eee8a33..0000000 --- a/.agents/skills/embedded-captions/references/composition-craft.md +++ /dev/null @@ -1,522 +0,0 @@ -# Composition craft — EMBED track only - -This is the deep "how to lay a caption INTO the scene" manual — it governs the **embed** -track only (captions composited behind the subject). The default **rail** track (standard -lower-third subtitle, where most text lives) has its own, much simpler spec → [rail.md](rail.md). -Read this before authoring any **promoted** phrase, in either authoring mode (template -Cinematic `plan.json` or Standard `index.html`). - -Topics: phrase grouping, planes & clean-zone anchoring, zone coherence, climax pop, -readability, edge breathing, the occlusion 3-step judgement, accumulation, and persistence. - -> **Two-track model (SKILL.md § Caption model).** Render states are `drop` / `rail` / `embed`. -> The `bg / fg / hybrid` axis used throughout the text below is **superseded**: read **"bg" as -> embed** (behind subject / in-scene), **"fg" as rail or promote-out** (in front), and "hybrid" -> as simply rail + embed coexisting. Everything here applies to the **embed** track — don't -> apply this craft to the rail. - -(Granular sub-topics also have their own files — see SKILL.md § Shared knowledge.) - ---- - -### Caption layer: BG vs FG (aesthetic axis) - -Separately from template choice, decide whether captions are **embedded** (behind subject, matte occludes — default "embed" cinematic feel) or **announced** (in front of subject, no occlusion — poster / lower-third feel): - -- **bg** — classic embed. Captions sit behind the matte, subject's body partially occludes letters. **Default for any cap that fits the frame.** Partial occlusion is the cinematic feature — small narrator caps with face nibbling 20-30% of letters reads as embedded texture; climax words with face crossing 30-40% reads as Vogue masthead. The eating is what sells the embed. Don't shrink to avoid it. -- **fg** — captions float on top, subject can't occlude. **Fallback for when bg cannot work.** Two scenarios: - - **Climax fg**: the climax word is so big at impactful size that subject + frame width together leave no place for bg to render at all (subject fills frame AND climax phrase is long; bg would be eaten past readability into broken). - - **All-fg fallback**: rare, only when the entire scene has no usable bg zone for any caption. -- **hybrid** (per-group `layer:` field) — when one cap (usually the climax) hits the "no place to fit bg" wall but the others (smaller body caps) still work fine in bg. **Body bg + climax fg** is the canonical hybrid pattern. - -**Rule of thumb:** - -- Small narrator/emphasis captions: bg almost always. Subject eating a few letter-edges = embed feature. -- Climax: try bg first, sized to maximally cross subject. If that size won't fit frame width, AND no clean zone elsewhere, use fg. -- Don't invert the hybrid: body fg + climax bg is the WRONG direction (sacrifices the easy bg embed wins on body, while the climax that needed protection from over-occlusion gets sent into the fire). - -**Hybrid worked example — Startup_Host (subject fills frame).** - -Subject fills the frame top-to-bottom (head_top y=126 / 10% from top). For body captions there's no large clean zone, but small italic narrator caps in upper corners get eaten ~25% by subject — that's the embed showcase. For the climax "SUCCESSFUL STARTUP" at maximally cinematic size, bg would be eaten 40-50%+ → past cinematic into broken. Climax goes fg. - -```json -{ - "caption_layer": "bg", - "groups": [ - { - "id": "cg-0", - "plane": "body", - "layer": "bg", - "css": "font-size: calc(0.055 * var(--h)); font-style: italic; ..." - }, // narrator bg — face eats edges, embed texture - { - "id": "cg-1", - "plane": "body", - "layer": "bg", - "css": "font-size: calc(0.085 * var(--h)); font-weight: 800; text-transform: uppercase; ..." - }, // emphasis bg — Vogue masthead - { - "id": "cg-5", - "plane": "crown", - "layer": "fg", - "css": "font-size: calc(0.09 * var(--h)); font-weight: 900; text-transform: uppercase; ..." - } - // ↑ climax fg: subject too dense for bg to land readably; fg fallback. Sized to fit frame width fully (single line). - ] -} -``` - -Result: body bg captures embed cinematic across the subject (eaten edges = texture not bug), climax fg sits on top fully visible because there was nowhere else for it to go. make-composition.cjs emits both `index.html` (bg groups) and `index_fg.html` (fg groups); render-and-composite.sh runs two parallel Chromium passes and ffmpeg screen-blends fg over bg+matte. - -Set via `caption_layer: "bg" | "fg"` plan-level (default for groups without explicit `layer:`), and `layer: "bg" | "fg"` per-group to override for hybrid. - -**Decision rule — bg is default, fg is fallback, hybrid is for mixed semantic content.** - -For BODY captions (narrator + emphasis): - -1. **Find the actual clean zone.** Sample frames at 20/50/80% and mentally trace where the subject is (head, shoulders, gesturing hands). The clean zone is what's left. Top band above the head, bottom band below the shoulders, or off-center side column. -2. **Anchor the plane in that zone.** Body caps fit comfortably with NO subject overlap → `layer: "bg"`. -3. **If body cap stack inherently overlaps subject heavily (>40% per check-occlusion peak)** even at smallest reasonable fonts → body `layer: "fg"`. Subject fills frame too much for embed. - -For CLIMAX caption (the payoff): - -1. **Default: `layer: "bg"`, sized to maximally cross subject for embed effect.** The face/body eating part of the climax word IS the visual win. Don't shrink to avoid occlusion. Use the largest size that fits frame WIDTH (sub-pixel readable letters fully on-screen) — vertical position should land it across the subject's hair / forehead / face. -2. **`layer: "fg"` for climax** ONLY when frame width physically can't hold a font big enough to feel climactic AND there's no compositional way to break the word across multiple lines that bg embed could carry. -3. **Hybrid (body bg + climax fg)** is the canonical pattern for subject-fills-frame scenes. Body small caps stay bg — subject eats letter edges = embed texture (cinematic, not a bug). Climax goes fg ONLY because at impactful size + subject filling frame there's no place where bg climax could land readably (would be 50%+ eaten = past cinematic into broken). The opposite direction (body fg + climax bg) sacrifices the easy bg embed wins on small caps and forces the climax into a slot it can't survive — never do that. - -**Editorial split — the spatial form of body bg + climax fg.** When the hybrid above is laid out with **bg in the upper half and fg in the lower-third**, you get a magazine-cover composition for free — no separate template needed. The rule: - -- **Body caps (BG)** — placed in the upper half (top: 6-30%), at the head/hair zone. They get partially occluded by hair/forehead = vogue-masthead embed texture. -- **Climax cap (FG)** — placed in lower-third (top: 70-85%), in front of subject's chest/below. It's fully clear, fully readable, dominates the bottom band. - -The viewer's eye reads top-to-bottom: first the partially-veiled body line ("decorative, atmospheric"), then the clean climax statement ("the point"). Same Z-axis layering as Vogue / Apple Keynote (decorative top behind subject + clear bottom in front), but driven by cinematic-cream's existing per-cap `layer:` field — no new template, no separate masthead track. - -Two timing modes inside this layout: - -- **Sequential cross-fade (default)** — body fades out as climax fades in over 0.3-0.5s. The brief overlap window IS the editorial dual-layer moment. Standard cinematic-cream behavior. -- **Sustained overlap** — extend body's `out` to coincide with or extend past climax's `in` so both are visible together for 1-2s. Use sparingly: works when body line is short (≤3 words) and acts as a "kicker" above the climax. Long body phrases sustained alongside a fg climax = visual noise. - -**The plane-conflict rule for sustained overlap (debugged in Startup_Host).** If you extend a body bg cap's `out` into a window that contains another cap with `layer: "fg"` IN THE SAME PLANE, the two will visually overlap in the final composite — bg pass renders the extended bg cap, fg pass renders the fg cap, both at identical plane position, screen-blended on top of each other. Result: muddy double-text at the same spot. - -Before extending any body bg's `out`: - -1. Check what other caps occupy the body plane during the extended window -2. If ANY of them is `layer: "fg"`, the extension causes plane overlap → don't do it -3. Workaround: either (a) skip sustained overlap and use sequential cross-fade only, or (b) author the body kicker on a DIFFERENT plane / absolute position so the two don't share a plane - -Concrete example: Startup_Host has cg-3 "diving deep" (body bg, plane=body, 3.1–4.15s) and cg-4 "into what it really takes to build a" (body fg fallback, plane=body, 4.15–6.42s). Both occupy `plane=body`. Extending cg-3 to overlap with the climax cg-5 (6.42–8.06s) ALSO drags cg-3 across cg-4's window where cg-3 (bg) and cg-4 (fg) collide on the body plane. Sequential editorial-split (climax in lower-third, body bg already faded out) was the only safe option for this case. AI_Insights had no fg in body plane between kicker and climax, so sustained overlap worked there. - -When NOT to use editorial split: - -- Body and climax are both information-carrying full sentences → forces viewer to read both at once, fails. Editorial split needs the body line to be _atmospheric / setup_ (italic mood), climax to be _the payoff_ (bold uppercase). -- Subject takes the full vertical column (no top clean zone, no bottom clean zone) → there's no upper or lower band to anchor either layer. Fall back to all-fg with crown. -- Climax is a long phrase that wraps to 3+ lines in lower-third → eats too much vertical real estate, leaves no room for the body bg above. Either shrink climax or split into more groups. - -This pattern was historically what we called "hybrid" but the spatial framing — upper bg behind / lower fg in front — is what makes it read as editorial design rather than just two unrelated caption tracks. Keep this in mind when authoring per-cap `layer:` for hybrid scenes. - -Common mistakes (debugged in real cases): - -- Defaulting to "right column" because memory-wall did it → narrow 400px column forces long phrases to wrap 4-5 lines, pushing the stack DOWN into the subject's body. Fix: use top-band full-width instead, wider wrap fits fewer lines. -- **Flipping climax to fg because "viewer needs to read it" → kills cinematic embed.** Climax is supposed to feel half-eaten by subject; that's the magazine masthead energy. Don't fix what isn't broken. -- All-fg whole plan when subject fills frame → safe but sterile. Hybrid (body bg + climax fg) is almost always better — small body caps eaten = embed texture, climax fully visible since it had no readable bg slot. -- Sizing caps before choosing the plane → typography is a function of plane geometry, not the other way round. -- **Putting LONG multi-line phrases on bg in subject-fills-frame scenes.** "Subject eats letter edges = embed texture" only holds for short caps (1-3 words / 1 line). A 6-8 word italic phrase wraps 3-4 lines, and when subject's head is high in frame, **whole lines** of the phrase land deep in the body/face zone — entire words obliterated, not edge-textured. That's not embed, it's broken. **For long body phrases on subject-dense scenes: switch THAT specific cap to `layer: "fg"` even if other body caps stay bg.** Hybrid lets you mix per-cap. Sample the matte at the cap's time window: if head_top y is climbing and the cap's stack height extends into y > head_top, that cap needs fg. -- **Subject doesn't move uniformly across the clip — sample matte per BLOCK time window, not just once per case.** Startup_Host's head_top swings y=224→96 across 8 seconds (128px / 10% of frame). A block plan that worked at t=2 (head low, plenty of space) breaks at t=5 (head high, no space left). Per-block matte sampling > one-shot per case. - -### Step 0 for ANY plan — transcript role annotation (mandatory) - -Before writing a single caption group, do a **pre-plan agentic pass** over the transcript. Read every word and grade it. This is judgment, not a lookup — context decides (e.g. "like" is content in "like this", filler in "like, um, yeah"). No hardcoded word lists; agent decides per token. - -**The grade is the SELECTION INPUT — it picks the render state** (`drop` / `rail` / `embed`); it is not itself a typography class (see SKILL.md § Caption model): - -| Grade | What it is | → render state | -| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -| **drop** | Interjections/hesitation (um, uh, er, ah), self-corrections ("I think— I mean actually…" keep only final), pure stutters ("the the the") collapse to one | **drop** (not shown) | -| **normal** | Ordinary spoken content — connective glue + the content words that carry the idea | **rail** (dense conversational glue may be trimmed for readability; content/structure words stay) | -| **emphasis** | The 1–2 punch words in a phrase | **rail** + `emphasis` highlight (inline — stays on the rail) | -| **peak** | The payoff of a beat/section — the line you'd say out loud paraphrasing it | **promote to embed** (apply the craft below); the single biggest of the whole piece = `apex` | - -A **peak** is per-beat, **not** per-clip: a short clip usually has one (its climax); a long/multi-section explainer has ~one per section. **Embed is scarce + spaced** — ≤1 per sentence/beat, never two adjacent or co-visible, ≥ a beat apart, at most one `apex`. (The old "1 climax / 2–4 emphasis / 4–10 body / 6–12 narrator / 2–8 drop per 10–20s clip" was calibrated for short single-beat clips; it generalises to "one peak per beat, spaced — everything else rides the rail.") - -**This step replaces any filler-word list.** If you find yourself reaching for a regex, you're doing it wrong — go back and judge per-token. - -Then build the plan from the annotated words: - -- drops → do not appear in any word entry -- narrator → either fold into adjacent body groups OR become tiny italic subordinate groups if rhythm demands -- body/emphasis/climax → shape the group structure, with typography matching role - -### The compositional unit is a PHRASE, not a chunk (read this twice) - -A **caption group** is a semantic phrase — typically 2–8 words bound by intonation and meaning. It is NOT a mechanical "2–4 word chunk". A group has ONE typography (one font-size, one weight, one case, one position) matching its role; the "every-word" feel comes from **per-word GSAP stagger INSIDE the group**, not from splitting the phrase into many tiny groups. - -Canonical reference — memory-wall, 12 spoken words, **4 groups**: - -- cg-0 `"Some memories feel soft"` (4 words, italic 600, right-top) -- cg-1 `"like old film"` (3 words, italic 500, right-mid, smaller) -- cg-2 `"but suddenly"` (2 words, upright 700 pivot, right-center) -- cg-3 `"EVERYTHING IS SHARP AGAIN"` (4 words, uppercase 900 climax, spanning width) - -Every word is shown. Groups **cascade and accumulate** — cg-0 stays on screen while cg-1 enters below; by the climax, all 4 are visible simultaneously as a poem. Per-word stagger (~80ms) animates each word into its group in sequence. - -If you find yourself producing 15+ groups for a 10s clip, stop — you're treating verbatim as mechanical chunking. Go back, re-read the transcript, identify 4–7 phrases, and make them groups. - -**Don't split idioms, collocations, or bound phrases across groups.** "Not even kidding", "at the end of the day", "as a matter of fact", "whole lot of", "more or less", "a little bit", "kind of", "sort of", proper nouns ("Blackmagic Pocket 4K"), brand phrases, and other fixed expressions are semantic units. The climax of "I'm not even kidding" is the whole idiom, not just "KIDDING". The climax of the memory-wall canonical is "EVERYTHING IS SHARP AGAIN" as one group, not just "AGAIN". Splitting these across group boundaries breaks meaning AND typography (you can't render "not even kidding" with "not even" italic-small and "kidding" uppercase-huge — it reads as two different statements). - -### Captions are always verbatim - -Every word the speaker says gets captioned. The skill no longer ships a "highlight" mode — curated/edited transcripts produced fewer beats but lost the rhythm of the spoken sentence and ended up feeling like generic subtitle tracks. Verbatim with strong typographic hierarchy (small italic narrator → emphasis upright → climax massive uppercase) gives the cinematic feel without dropping content. - -The only words you remove from the transcript: - -1. **Pure phonetic interjections** (um, uh, er, ah, hmm) — not words, not captioned. -2. **Exact immediate stutters** ("the the the" → keep one; "is is is is" → keep one, aligned with the phrase that follows). The viewer should see one "the", not three. -3. **Self-correction backtracks** ("I think— I mean actually…" → keep only "I mean actually"). - -**All content words AND structure words stay** (articles, conjunctions, prepositions, auxiliaries, pronouns). Dropping a structure word like "in some" or "and I've" or "out of it" is a bug, not a stylistic choice. - -### Planes — shared parent containers for spatial coherence (RECOMMENDED) - -The memory-wall and champion canonicals don't set `top:` on each caption. They have a **parent container** (`wall-plane` / `left-plane` / `crown-plane`) that owns the spatial anchor, and caps are children that stack automatically (flex column with gap) or replace (absolute at same anchor). - -Your plan.json can opt into this by declaring `planes` and assigning each group to one: - -```json -{ - "planes": { - "body": { - "css": "top: 4%; right: 4%; width: 720px; display: flex; flex-direction: column; align-items: flex-end; gap: 14px;" - }, - "crown": { - "css": "top: 32%; left: 0; right: 0; text-align: center;" - } - }, - "groups": [ - { "id": "cg-0", "plane": "body", "css": "font-size: calc(0.08*var(--h)); font-weight: 600; font-style: italic;", ... }, - { "id": "cg-1", "plane": "body", "css": "font-size: calc(0.10*var(--h)); font-weight: 800;", ... }, - { "id": "cg-2", "plane": "crown", "css": "font-size: calc(0.20*var(--h)); font-weight: 900; text-transform: uppercase;", ... } - ] -} -``` - -The plane CSS owns positioning (top/left/right + display:flex/grid/block). Per-group CSS owns **typography only** (font-size, weight, style, case, letter-spacing, line-height). **No top/left/right/position on a group when it's inside a plane** — the parent decides. - -**Typography is agent-authored per group, NOT looked up from a preset.** The `cinematic-cream` template locks only the DNA (Inter family, motion curves, `mix-blend-mode`, `cap_color` palette, text-shadow/filter derived from luminance). Everything else — `font-size`, `font-weight`, `font-style` (italic vs upright), `text-transform` (uppercase vs mixed), `letter-spacing`, `line-height` — is written by the agent, per group, in `plan.json`'s `css` field. No "cap-1 must be italic 600, cap-2 must be uppercase 900" rule. Read the scene + transcript, pick typography that matches the semantic role (narrator/body/emphasis/climax) and the visual weight the frame can carry. See [references/typographic-moves.md](typographic-moves.md) for _recommended_ combinations — treat as palette, not schema. - -When to use planes: - -- **Multi-phrase sentence in one home zone** — use a flex column plane. All body caps inside accumulate/stack automatically, no collision math. This is the memory-wall pattern. -- **Body zone + climax zone** — two planes: body (flex stack) + crown (center). Body caps live in body-plane; climax pops in crown-plane. Cross-plane transition = earned break. -- **Any clip with ≥3 body phrases** — single-plane flex stacking beats hand-placing each group's top% every time. - -### Picking the plane anchor — find the ACTUAL clean zone in THIS scene - -**Do not default to "right column" because memory-wall did.** Memory-wall worked because its subject sat left-center with a clean wall on the right. Different scenes have different clean zones: - -- **Subject centered (most selfies, vlogs)** → top band above the head is usually cleanest (clear sky / ceiling / wall). Right or left columns get eaten by shoulders or hands. -- **Subject left (interview with right-column backdrop)** → right column cascade (memory-wall classic). -- **Subject right (reverse interview)** → left column cascade. -- **Two-shot or busy background** → may need to use a corner, or sit the caption on the ONE surface that's consistently clean (a solid jacket, a whiteboard, a ceiling). - -Before writing plane CSS, look at a frame sample. Mentally trace the subject's bounding box and hand-gesture reach. The plane anchors into whatever's LEFT — negative space where the cascade won't be eaten by body or busy backdrop. - -Small-size italic narrator text is especially vulnerable — it disappears into mottled backgrounds or body occlusion. Keep smallest caps in the cleanest part of the zone, not at the edges where subject extends. - -When NOT to use planes (the remaining free-mode use cases): - -- **1–2 isolated groups** with deliberately different positions — free mode is simpler. -- **Specific clip-spanning motion** where a group needs to drift/move independently. - -Free mode (no `planes` declared) is still supported — each group's CSS owns its own top/left/right. Use when you genuinely need bespoke per-group placement. - -Wrong: "primary slot for 9:16 is top:12%". That's a lookup; it produces generic output. -Right: look at THIS scene, find where captions will read cleanly, respect the speaker's framing, and pick a composition pattern that serves the content's narrative arc. - -Example patterns an agent can pick (not exhaustive, not ranked): - -- **Right cascade accumulating** (memory-wall): all groups right-aligned, stepping down in top%, they stay — final frame shows a poem. Works when subject is centered-left and there's clean right-column space. -- **Center stack climax** (Sunset): italic openers at top, upright pivot mid, uppercase climax takes the full top as the final beat, earlier groups fade out before climax. Works when subject is centered and scene has clean sky + clean below-shoulders. -- **Left-right split** (memory-wall variant): narrator voice on one side italic, statement voice on the other side upright, climax takes center. Works when subject has off-center clean zones. -- **Single-line subtitle rail**: legit choice when scene is dense and no clean zones exist (busy background, subject fills frame). This is the "accessibility" fallback, not the default. - -Whichever pattern is picked, the agent's job is to **justify the choice**: "Subject is on the left, clean gradient sky on the right — I'll cascade right-aligned so captions have clean backdrop throughout." Write that reasoning as a `_notes` field in plan.json so the intent is inspectable. - -Anti-patterns to NEVER ship: - -- Alternating top↔bottom per chunk — reads as chaos (one sentence's words appearing in different vertical zones). -- Locking every group to the same `top` value — reads as subtitle track, kills cinematic feel. -- Placing body/narrator groups directly over the face when clean space exists — the Vogue-embed effect is for the CLIMAX word only, not default behavior. -- **Dropping transcript words to fit caps in fewer blocks.** NEVER. Verbatim is verbatim. If 4 caps don't fit in 1 block, split into 2 sub-blocks of 2 caps each — keep all words. The only legitimate drops are SKILL.md's filler list (um/uh/exact-stutters/self-corrections), not "we ran out of room." -- **Mechanically aligning all caps in a plane to share `out` time.** This makes everyone stay on screen longer, _increasing_ density. Wrong fix for the no-jump problem. Correct fix: split natural-handoff caps into separate blocks where each block's caps share `out` (same exit moment, no jump), and `next_block.in ≥ prev_block.out` (clean handoff between blocks, no overlap). - -**Block boundary three laws** (must hold for every plane in every plan): - -1. Within a block, all caps share `out` — they fade together, no per-cap exit jitter. -2. Between adjacent blocks in the same plane, `next_block.in == prev_block.out` (or `next.in > prev.out` with a small gap). Caps from prev_block must FULLY exit before next_block's caps mount; otherwise the prev cap's exit at its `out` time triggers a flex reflow that yanks next_block's already-mounted caps upward = jump. -3. `prev_block.out ≤ next_block.first_word.start` so next_block's first word still animates from its real spoken time (the in-time only constrains when the container mounts; word animations fire at their per-word `start`). - -A common mistake: setting `next_block.in` slightly EARLIER than `prev_block.out` to give the new block a head-start fade-in, while prev_block still has a different (later) `out`. The 50-300ms overlap looks invisible in the plan but produces a visible jump on screen because two caps with different `out` coexist in the same flex stack. - -- **Vertical gap between body bottom and crown top.** Looks disconnected ("The pace is" at top:3% with "UNPRECEDENTED" at top:20% creates 144px void). Bond the setup phrase + climax word in the SAME crown plane via flex-stack — the Street_Talk "and being / CONSISTENT" pattern. - -### Zone coherence — one sentence, one home zone - -**Never switch spatial zones mid-sentence.** A full semantic unit (sentence or clause) should live in ONE home zone (e.g. right column, or top band). The viewer's eye follows the phrase group. Ping-ponging between top/bottom/left/right for consecutive phrases of the SAME sentence reads as chaos — the reader has to re-find the caption every beat. - -Zone changes are earned at: - -- **Sentence boundaries** (period, long pause, topic shift) — allowed to move to a new home zone, often paired with a tonal shift (italic body → uppercase emphasis) -- **The single climax** — the one break from the home zone, always allowed, often takes center-full-width - -Heuristic: if you find cg-N and cg-N+1 are in different zones (top vs bottom, left vs right) AND they're parts of the same sentence (no period/long pause between them), you've violated zone coherence. Fix by picking one home zone for the whole sentence. - -### The climax has to POP — not just "be a bit bigger" - -A climax caption that's the same size as body emphasis is a failed climax. The viewer's eye needs a clear visual break: THIS is the payoff. - -**Size the embedded climax to the FRAME, not to the rail (two-track rule).** The climax is a hero — its size is anchored to frame height: **`font-size: calc(0.16–0.22 * var(--h))`** (default ~0.18–0.20h; go bigger for more impact — it should dominate the frame, only width/readability caps it). It is **NOT** a multiple of the rail: the rail is a small standard subtitle (~0.045h), so "≥1.8× the rail" would yield a tiny, weak climax. Express rail, embed-body and embed-climax all as `var(--h)` fractions so they scale across resolutions — **never hardcode px**. The ratios below are a **floor / hierarchy check** (the climax must clear body-emphasis by ≥1.8× and the smallest tier by ≥2.5×), not the climax's sizing basis. Width is the real ceiling: shrink only if the word can't fit the frame at a legible size (see "Readability is a hard constraint"). - -Contrast floor — the climax must at least clear these: - -| Ratio | Feels like | -| -------------------------- | ------------------------------------------------------------------------------------------- | -| **1.0-1.3× body emphasis** | Flat — the climax is just another beat. Fix it. | -| **1.5-1.8× body emphasis** | Noticeable but not explosive. OK for subtle payoffs, weak for punchlines. | -| **≥1.8× body emphasis** | Pops. Viewer's eye snaps to it. Target for "punchline" / "reveal" / "reaction" climaxes. | -| **≥2.5× body italic** | Compare against the SMALLEST body tier too — the multi-tier jump is what creates hierarchy. | - -A quick audit script — before shipping, dump every plan's max-body vs max-crown font-size ratio, and flag anything <1.8×: - -```js -const bodyMax = Math.max(...plan.groups.filter((g) => g.plane === "body").map(fsize)); -const crownMax = Math.max(...plan.groups.filter((g) => g.plane === "crown").map(fsize)); -const ratio = crownMax / bodyMax; // aim for ≥1.8 -``` - -**Split pattern — when one word alone should carry the climax.** If the climax phrase is 2+ words ("and being consistent", "not even kidding") and one of them is the actual payoff, split into setup + payoff BUT keep them spatially bonded: - -- Setup words → small italic narrator (soft, trailing off) on line 1 -- Payoff word → massive uppercase on line 2, same plane, flex-stacked directly below -- **Both groups live in the SAME (crown) plane**, flex-column, gap 4-8px. Not two different planes — otherwise "and being" sits in the top band and "CONSISTENT" sits mid-frame and they read as two unrelated captions. - -Crown plane CSS for split climax: - -``` -"crown": "top: 26%; left: 0; right: 0; display: flex; flex-direction: column; align-items: center; text-align: center; gap: 6px;" -``` - -Street_Talk canonical example: original was `"AND BEING CONSISTENT"` all in crown at 0.085h (same as body emphasis, ratio 1.0×). Rewrite: crown plane becomes a flex-column; `"and being"` → 0.055h italic at top of column (line 1); `"CONSISTENT"` → 0.11h 900 uppercase stacked below (line 2). The payoff POPs because of size contrast within a bonded 2-line composition, AND it crosses the subject's head since the crown column is anchored at ~26-30% top. - -Timing: both groups share `out` (at clip end or block boundary) so neither fades alone — they hold together as one composition. Setup enters first (soft fade-in), payoff enters later when the word is spoken (snappier present scale-in). - -**Readability is a hard constraint — bleed can't eat the word.** Your first move when a climax word overflows is NOT "accept the bleed, it's cinematic" — it's "shrink to the largest size that fits." Compute the max font size that fits the frame: - -``` -max_font_px = frame_width / (chars × char_ratio × letter_spacing_mult) -``` - -For "CONSISTENT" (10 chars), uppercase 900 (char_ratio 0.62), letter-spacing -0.05em (mult 0.95), 720px frame: `max = 720/(10*0.62*0.95) = 122px ≈ 0.095h`. Use 0.09h for a small safety buffer. The word fully occupies the frame edge-to-edge — that's already maximum visual impact without losing any letter. - -Cinematic bleed is only OK when **a few pixels of 1-2 outer letters** get mild cropping from scale-in animation or sub-pixel rounding — that reads as "bigger than frame." Any bleed that forces the reader to mentally complete missing letters (>15-20px per side on a 10-char word) is a BUG, not style. "ONSISTE" with 80px each side clipped is NOT a valid climax — it's broken. - -Hard rules: - -- **Readable first.** Every letter should be fully on-screen, with at most a few-px crop on the first/last letter. -- **If max legible size doesn't meet ratio target**, raise impact via _other_ signals (weight 900, all-caps, bg head-cross, multi-line composition with setup word above), not via illegible bleed. -- **Never bleed body/narrator captions.** Only the crown/climax is allowed any edge crop at all. -- `OCCLUSION_SKIP=1` is an escape hatch for iterating; the shipped plan should pass `check-occlusion-v2.py --strict` (pixel-perfect via headless Chromium DOM). - -### Edge breathing + climax-crosses-head (bg showcase) - -Two placement tweaks that separate "looks like a caption sitting in the scene" from "looks like a pasted subtitle": - -- **Non-climax caps need edge breathing room.** Body-plane groups should NOT hug `left: 0; right: 0` flush to the frame. Add `left: 3-6%; right: 3-6%` (or `right: 30-40px` for pixel-anchored planes). The breathing sells the compositional choice — flush edges read as "default subtitle track", indented edges read as "considered composition". Top edge the same: `top: 2-6%` not `top: 0`. - -- **The climax SHOULD cross part of the subject's head — deliberately.** This is what makes bg-layer captions feel cinematic instead of just "text floating above the speaker". The effect is strongest when 20-40px of the word's last line dips behind the hair or forehead — viewer reads the word clearly AND sees it being occluded at the edge. Not "covered by the face" (unreadable), just "grazed by the hair" (legible + cinematic). - - How to place the crown with intent: - 1. Sample the matte PNG at climax time: `f_{frame_idx:04d}.png` where `frame_idx = round(climax_time * fps)`. - 2. Scan rows from top until `alpha > 128` — that y is the subject's topmost pixel (usually hair). - 3. Position crown so the _bottom of the last line_ lands 30-80px below that y. For a 2-line crown at 0.085h on 1290h frame, line heights ~104px each; total height ~200px. If subject top is at y=445, set `crown.top` such that `top + height = 445 + 50 ≈ 495` → `top = 295px ≈ 23%`. - 4. Verify with checker — the HERO/crown peak occlusion target is ~30–55% (the embed effect; the head crossing the middle). Below ~15% it reads as a floating label (the hero-weak advisory fires); above ~65% the word is eaten (the gate FAILs). Small narrator caps: ~20–30% texture. - - Practical rule of thumb: **crown peak occlusion 3-10%** is the sweet spot. The checker's number tells you directly — not a subjective "it looks good" judgment. - - **Crown defaults are scene-specific, not template-wide.** Don't set `crown.top: 6%` because "that's what the previous case used." If the subject's head_top is at y=380 (29% of frame) and your crown is at top:6% with 100px height, the crown bottom lands at y=200 — 180px ABOVE the head, completely floating in sky, zero embed effect. Always sample the matte once per case and compute `crown.top` from `head_top - crown_height + (30 to 80)` so the crown's bottom edge dips into hair. This was a real bug across 6 cases until enforced. - - FG-layer crowns skip this entirely (they render on top, no occlusion to showcase) — FG is announcement, not embed. - -### Pre-render occlusion + frame-overflow gate - -**`check-occlusion.cjs` (canonical, pixel-perfect)** is the only occlusion checker in `scripts/`. It auto-runs `measure-layout.cjs` (headless Chromium via Puppeteer) which loads the compiled `index.html`, seeks the GSAP timeline to 4 sample times per group (15/40/65/90% through window), and queries `getBoundingClientRect()` on every `.cap` and child `.w` span. Output is `_layout.json` with the actual rendered pixel coordinates of every word at every sample. Then it computes per-word, per-cap occlusion against the real subject-matte alpha (read via `sharp`): - -- **Per-word peak occlusion** — the load-bearing metric: a 5-word phrase where 3 words are fully eaten averages the same as 8 words half-eaten, but only one of those is shippable, so per-WORD peak is what gates. Per-word peak ≥65% = `obliterated`, ≥35% = `warn`. A `WARN` band hit on a single climax word is OK (cinematic edge crop); two adjacent words obliterated is not. -- **Per-cap aggregate** — avg + peak occlusion across all samples. Cap fails at peak ≥50%. -- **fg-layer caps are auto-skipped** (they render above the matte; no occlusion possible). - -**Why measure the real DOM, not estimate a bbox.** An earlier heuristic estimated each word's box from `char_ratio × font × text_length` and was wrong in both directions. Startup_Host case: it reported `cg-1 "podcast." OK at 9%/12%` because it guessed y=134 (above the subject's head), but the rendered DOM was at y=209 (mid-head) → actually `FAIL 54%/60%`. Same case, it reported `cg-3 "diving deep" FAIL at 76%/77%` while the real measurement was `WARN 36%/40%` (the box is wider than the head — most pixels clear, only descenders dip into the silhouette). Estimation is retired; `check-occlusion.cjs` measures the rendered pixels. - -**Frame-edge overflow** — the checker also flags when a measured word bbox extends past the canvas (text the ffmpeg crop would clip), reported as `cg-N [overflow] "word" off-frame: left Xpx, right Ypx (@Ts)`. Because cropped body text is always wrong, a clear glyph clip (>8px past an edge) **fails `--strict`**; a sub-glyph graze (≤8px — the first/last-letter crop the climax is allowed) is a non-blocking `[overflow-warn]`. - -**The checker reports facts, the agent applies judgment.** A FAIL is NOT an automatic "must re-layout" signal — it's evidence to interpret. Two competing goals coexist: - -1. **Readability** — every sentence must remain comprehensible to the viewer -2. **Cinematic embed** — partial occlusion is the desired vogue-masthead effect; zero occlusion looks like a pasted subtitle - -When the checker reports a per-word obliteration (≥65%), apply this **3-step decision rule** before changing anything: - -**Step 1 — POS check.** Is the obliterated word a function word (the / a / an / of / in / on / at / to / I / it / is / are / was / be / that / this / which / and / or / but)? Function words are grammatically optional in most contexts — a 100%-eaten "the" or "I" or "of" usually does NOT break the sentence. Content words (nouns, verbs, adjectives, climax words) carry meaning — they MUST stay legible. - -**Step 2 — sentence parse without the word.** Mentally delete the obliterated word from the sentence. Does the remainder still convey the meaning? - -- "like this are why I travel" minus "I" → "like this are why travel" — first-person obvious from context, **OK** -- "take it all in" minus "all" → "take it in" — complete English idiom on its own, **OK** -- "a whole lot of information" minus "of" → "a whole lot information" — slightly broken but recoverable, **OK** -- "diving deep into startups" minus "deep" → "diving into startups" — works fine, **OK** -- "diving deep into startups" minus "diving" → "deep into startups" — loses the verb, sentence breaks, **NOT OK** - -**Step 3 — cinematic check.** A single content word at 30-65% partial occlusion is the _intended_ embed look (vogue-masthead "subject grazes the text"). Don't "fix" it. Only escalate to re-layout when: - -- a content word is ≥80% gone (not just partially eaten — almost fully missing) -- two or more adjacent words are ≥50% obliterated (sequential damage compounds; "X X X really takes" with first three eaten is unrecoverable) -- the obliterated word IS the climax / key noun the viewer is supposed to read (e.g. the subject of a sentence, a brand name, a product feature) -- key letters of a climax word are eaten (e.g. "STARTUP" with the S gone reads as "TARTUP" — the partial-letter pattern matters more than the whole-word percentage) - -**Real examples from the 13-case batch** — all four caps below got a per-word obliteration FAIL, all four were correctly judged OK by this rule: - -| case | obliterated word @% | sentence | rule applied | -| ------------------ | ------------------- | ------------------------------------- | -------------------------------------- | -| Sunset_Stroll cg-1 | "I" 100% | "like this are why I travel" | function word + parses without it → OK | -| Sunset_Stroll cg-3 | "all" 75% | "take it all in" | "take it in" is a complete idiom → OK | -| yt_gtds cg-6 | "of" 69% | "a whole lot of information" | function word + recoverable → OK | -| AI_Insights cg-2 | "that" 66% | "that don't replace human creativity" | relative pronoun, optional → OK | - -**When the rule says re-layout** — what to change: - -- per-word obliterated AND content word AND breaks readability → switch THAT specific cap to `layer: "fg"` (per-cap override, not whole-plan), OR shrink/reposition, OR split the cap into a different block where the subject isn't crossing it. -- per-cap fail (peak ≥50%) when the whole stack is in the head zone → lift y or shrink the block. -- frame-edge overflow → shrink font OR tighten `letter-spacing` OR split the phrase. Cropped text is ALWAYS wrong, no aesthetic excuse. - -**Override** (for iterating before shipping): `OCCLUSION_SKIP=1 bash render-and-composite.sh ` — don't ship past this without applying the 3-step rule and either fixing or consciously accepting each FAIL. - -### Accumulation capacity — split into blocks when the plane can't hold more - -Each scene's clean zone has a finite capacity for simultaneously-readable caps. **The agent must judge this before writing the plan**, not rely on CSS `bounded height` / `overflow: hidden` — those cause visual bugs (caps overflow off-screen, are clipped, or content is centered outside the plane bounds). - -Rule of thumb (capacity = max caps visible SIMULTANEOUSLY in one block): - -- **9:16 portrait, narrow right-column plane** (width ~380-420px) → max **2 caps** per block. Long phrases wrap to 2-3 lines; a 3rd cap starts spilling into the subject. -- **16:9 landscape, subject centered** (e.g. selfie vlog) → max **2 caps** per block. Even if the frame is wider, a centered subject leaves narrow columns on both sides and hands reach far. -- **16:9 landscape, subject on one side** (e.g. interview with clean opposite side — the memory-wall canonical scenario) → max **3-4 caps** per block. This is where accumulation shines. -- **Top-band full-width plane** (either orientation) → max 1-2 caps before overflow into face zone. - -Capacity is about the specific scene — same orientation can have very different room depending on subject position and background complexity. - -When your phrase count exceeds the capacity, split into multiple accumulation blocks at **sentence or clause boundaries**. Example memory-wall canonical on a 12-word clip: - -- Block 1 (0–4.85s): `"Some memories feel soft"` + `"like old film"` — 2 caps accumulate, fade together at 4.85s -- Block 2 (4.90–8.04s): `"but suddenly"` + `"EVERYTHING IS SHARP AGAIN"` — 2 caps accumulate on a cleared plane - -All caps in one block share the same `out` time (sentence boundary). Next block's `in` > previous block's `out` so the plane clears before the new accumulation starts. This gives each cap ~3-5s of read time, avoids overcrowding, and matches memory-wall's cinematic rhythm. - -**Why the shared `out` is load-bearing.** The template's exit path is `tl.set(sel, { opacity: 0, display: "none" }, g.out)` — at `out`, each cap releases its flex space so the NEXT block's caps can take the top slot from the plane's origin (no permanent downward drift). If caps inside the same block had staggered `out` times, the plane would reflow mid-block (cap 1 vanishes, caps 2-3 jump up, cap 4 arrives… visible jitter). With block-synchronized `out`, the reflow happens ONCE at the boundary — invisible to the viewer because the block fades as a unit. **Never stagger `out` times within an accumulation block.** If you need individual fade-outs, you're not accumulating — switch to stagger-fade pattern (one group at a time, no flex plane needed). - -**Anti-pattern: bounded `height` + `justify-content: center` on planes.** Do NOT write `height: 70%; justify-content: center` on a flex-column plane hoping to vertically center the caps. When the block's total cap height exceeds the bounded height, flex centering pushes content OUTSIDE the plane bounds on BOTH top and bottom — the topmost cap ends up above the frame (off-screen, unreadable). Instead: - -- Let the plane grow with its content — set `top:` (origin anchor) and let caps stack down naturally. -- Use `gap:` between caps; don't try to "center the stack". -- Trust the block-capacity rule above to keep the stack within the clean zone — don't paper over overflow with `overflow: hidden` (it clips the very caps you wanted the viewer to read). - -### Accumulation — vertical spacing, not single-line - -Accumulation works with multi-line phrases too — memory-wall canonical's groups are multi-word, right-aligned cascade in 16:9 landscape, and several wrap to 2 lines. They don't collide because **each group's `top` is placed below the previous group's bottom extent with a margin**. - -Math you must do before shipping accumulate: - -For each group, estimate its rendered height: - -- `line_count ≈ ceil(chars × font_px × 0.72 / usable_width_px)` (0.72 = Inter 900 uppercase; use 0.60 for italic/regular) -- `group_height_pct ≈ line_count × font_size_pct × line_height × 100` - -Then for each pair (cg-N, cg-N+1) you want to coexist: - -- `cg-(N+1).top ≥ cg-N.top + cg-N_height_pct + 2%` (margin) - -If the math doesn't fit in the available clean zone (top-clear + bottom-clear zones minus face/body bbox), you have two options: - -- **Shrink fonts or merge phrases** so they fit. -- **Switch persistence to stagger-fade** (groups don't coexist, no spacing constraint). - -9:16 portrait specifically: clean zone is typically top 0–32% + bottom 72–90%, split by the subject. That's ~50% of frame height usable. At 15% per 2-line group + 2% margin, you can fit ~3 accumulating groups in top zone. A 4th must either (a) be smaller to fit, (b) go to the bottom zone (zone change allowed at sentence boundary), or (c) replace an earlier one as climax. - -Landscape 16:9 has ~70–80% usable vertical — more room for 4–5 accumulating groups, which is why memory-wall canonical works cleanly there. Don't give up accumulation on portrait; just do the arithmetic first. - -### Persistence — how long each group stays (agent decides per case) - -The group's `out` time is not a default, not a rule, not a formula. It's an aesthetic choice. The same 5-group plan renders very differently depending on whether groups accumulate, stagger, crossfade, or roll — and each is right for different content. - -Patterns to pick from: - -| Pattern | What happens | Good for | Bad for | -| ------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | -| **Accumulate-through-climax** (memory-wall) | All groups stay on screen until climax arrives, then all fade together | Poetic builds; emotional crescendo; ≤5 groups where each word matters | 8+ groups (screen crowds); punchy comedic beats (breaks the laugh) | -| **Stagger-fade** (Sunset-style) | Each group fades ~0.8–1.5s after its words end; next enters into clean space | Independent punchy beats; clip where each phrase is its own moment | Long poetic builds that want the stanzas to coexist | -| **Crossfade-handoff** | Current group fades during next's entrance (~200ms overlap) | Dense verbatim (6+ groups in short clip); conversational flow | Short sparse clips — feels like subtitle track | -| **Rolling window** | Keep N=2–3 visible; earliest fades when N+1 enters | Longer transcripts (15s+) where full accumulation would crowd, but some layering is still cinematic | Clips <8s (rolling isn't perceptible) | - -Decision axes: - -- **Narrative arc** — crescendo/revelation → accumulate; list of independent points → stagger; dense conversation → crossfade -- **Group count** — ≤4: any pattern works. 5–7: prefer stagger or rolling. 8+: crossfade is usually forced. -- **Scene density** — busy background eats stale captions; accumulate only works when backdrop is clean enough that older captions stay legible. -- **Clip length** — ≥12s erodes accumulation (viewer loses connection to earliest caption); prefer stagger or rolling for long clips. - -Write the reasoning in `_notes` in plan.json so the decision is inspectable and the agent's intent survives into review. e.g.: - -```json -"_notes": "Morning_Jog: 5 groups in 8s. Narrative is crescendo (Okay→honestly→changed my life→KIDDING), and background is clean (trees, sky). Accumulate-through-climax — all 4 earlier groups stay visible so KIDDING lands on top of a built-up poem. Cascading right with varied top%/alignment so the stack reads as composition, not a subtitle column." -``` - -This is where per-case judgment earns its keep. The skill gives you a palette of patterns; the pick is yours. - -### Spatial coherence — the main slot rule - -**Every plan has ONE primary slot.** Most groups land there. Secondary slots exist only for intentional rhythm-breaks (once every ~30s, never per-chunk alternation). The old autogen rotation that threw each chunk to a different corner violated this and read as chaos. - -Choose a primary slot based on scene: - -- **9:16 portrait, subject mid-frame** → primary slot is `top: 4–20%` (sky / clean zone above the head). Secondary: `top: 72–78%` (below shoulders, above UI). Never: bottom 22% (UI/hand zone per [rule 17](aesthetic-principles.md)). -- **16:9 landscape, subject left** → primary slot is the right column (`left: 50–55%`, right-aligned or centered in the column). Secondary: below subject. -- **16:9 landscape, subject centered** → primary slot is `top: 10–20%` OR `top: 70–80%`. Pick one and stick. - -Within the primary slot, vary **size and weight** to create hierarchy (narrator small, body mid, emphasis large, climax huge). That's the rhythm inside a coherent position. Secondary slots are for **break-rhythm moments**, not for adjacent chunks just to "avoid collision". - -Collision validator still runs — but now the agent should be hitting it only in exceptional cases (intentional layering), not because every chunk is in a different place. - -**Verbatim recipe** — every word is shown, but it is **not** a flat TikTok subtitle rail. Use the cinematic DNA: per-group typography variation, position variation, size modulation. Italic openers, upright pivots, uppercase climaxes, spatial cascade, per-word soft/present tones — all of it. - -Chunking: walk the transcript and split into groups of **1–4 words** at pause boundaries (>0.25s gap = hard cut; within a phrase, chunk by emotional beat — short 1–2 word chunks for emphasis words, longer 3–4 word chunks for connective tissue). - -Typography per chunk — treat each chunk as a mini-beat. The sizes below are a **starting palette, not rules.** The agent picks the actual `font-size` per group based on the scene's clean-zone width, the phrase's character count, and the desired visual weight relative to neighboring groups. Shift by ±30% whenever the scene demands (narrow portrait column → shrink; wide landscape hero → enlarge). Pick from [typographic-moves.md](typographic-moves.md): - -- **Filler / connective** ("you know", "like", "so I was", pronouns, conjunctions) → italic 500–600, small (~0.05–0.08h starting point), softer tone, subordinate position. These read as narrator voice, not statement. -- **Emphasis / content words** (verbs, nouns carrying meaning) → upright 600–800, mid (~0.08–0.12h starting point), centered or cascaded position, present tone. -- **Climax / hook words** (the payoff word of the sentence) → uppercase 800–900, large (~0.14–0.22h starting point), full-frame or near-frame-width, present tone with scale pop. - -**Size is always relative, never absolute.** What matters is the _contrast ratio_ between a group and its neighbors inside the same plane — climax should be ~2× the emphasis, emphasis ~1.3–1.5× the narrator. An agent that writes `0.08h / 0.08h / 0.08h` for three caps in a plane has failed regardless of which bucket it picked from. The hierarchy is the point. - -Spatial composition: use the full frame as a canvas. Filler chunks tuck to corners or sit small at subordinate positions; emphasis chunks claim the middle; climax chunks own the frame. **Don't lock everything to `bottom: 12%`** — that's the boring-subtitle trap. - -Time windows: either spatially-separate overlapping groups (cascade, poem-accumulation) or hand-off so only one chunk shows at a time. Handoff at the same slot reads jittery (too many cuts in a short window) — prefer spatial cascade where adjacent chunks coexist at different positions, or accumulation blocks bounded by sentences. - -Layer: default `"bg"` for any chunk whose position has clean scene around it (sky, wall, the area above/below the subject) — that's the embed effect. Use `"fg"` only when the chunk's position would be ≥80% occluded by the body (e.g. chyron-style chunks at bottom in 9:16 portrait where the torso fills that zone). - -**Climax chunks across the subject — readability first.** The Vogue-masthead effect (big uppercase crossing the body) is the most cinematic move, but only if the word is still readable. Use `bg` across the subject when **all** of: - -1. The caption is multi-line (≥2 lines), so even if one line is mostly eaten, the others stay clean and the viewer can read the phrase. Single-line captions should never sit directly over the face/body — either reposition above/below the subject, or use `fg`. -2. The subject's bounding box covers ≤40% of the caption's total pixel area. For 9:16 portrait with a typical head-and-shoulders subject (~30% vertical × ~50% horizontal at mid-frame), a caption at `top: 16%` spanning 4 lines × 0.14h meets this — the face eats one line, the other three read clean. A caption at `top: 40%` sitting directly on the face does not. -3. Each individual word has visible letter endpoints on at least one side — a word that's split mid-letter with only interior strokes showing is unreadable even if "25% of total pixels" are covered. - -If any of these fail, either **reposition** the BG caption to clean scene (above the head / below the shoulders / into an off-center corner), or **fall back to `fg`**. FG for climax is the right call when the scene has no clean zone big enough — don't force the embed aesthetic at the cost of legibility. - -Rule of thumb: if you flattened your plan to just the climax chunks, the result should still read as a satisfying tweet-length headline. If it doesn't — you've under-varied your typography and the climax doesn't pop hard enough. diff --git a/.agents/skills/embedded-captions/references/direction-catalog.md b/.agents/skills/embedded-captions/references/direction-catalog.md deleted file mode 100644 index a197441..0000000 --- a/.agents/skills/embedded-captions/references/direction-catalog.md +++ /dev/null @@ -1,138 +0,0 @@ -# Direction catalog - -10 distinct aesthetic directions the skill can express. Each is a complete look: font, motion, color, placement, rhetorical defaults. The agent picks by **content tone × shot type × platform**, not preset name. - -Current shipped templates (`modes/cinematic/*`) cover about 30% of this catalog. The rest are future ship-ready aesthetics. - -Classification matrix — pick direction by intersection: - -| Tone ↓ / Platform → | 9:16 portrait | 16:9 landscape | 1:1 square | -| ------------------- | ---------------------------------------- | ------------------------ | ------------------------ | -| **Documentary** | documentary-dignified (vertical variant) | documentary-dignified | broadcast-dignified | -| **Conversational** | portrait-header + default | memory-wall OR champion | broadcast-dignified | -| **Energetic** | high-energy-vlog | high-energy-vlog-wide | high-energy-vlog-sq | -| **Poetic** | lyrical-poem-on-wall (portrait) | lyrical-poem-on-wall | chapter-card | -| **Keynote/tech** | — (9:16 not ideal) | tech-keynote-confident | tech-keynote-confident | -| **Investigative** | — | investigative-typewriter | investigative-typewriter | -| **Music video** | k-pop-lyric | k-pop-lyric | k-pop-lyric | - ---- - -## Direction specs - -### 1. documentary-dignified _(Errol Morris / PBS Frontline)_ — Standard-mode direction (no prebuilt Cinematic template) - -- **Family**: Söhne Mono OR GT Sectra for name cards; Inter for body -- **Weights**: 500 body, 700 name card -- **Color**: bone `#F5EFE6` on charcoal, OR charcoal `#1A1A1A` on bone. No accent. -- **Motion**: burn-in (no animation). Held 0.5s past last word. -- **Placement**: bottom-left block, 10% margin, locked position for whole interview. -- **Rules**: 2-line max. Speaker name card once at first utterance + after each cut. No emphasis styling — gravitas IS the style. -- **Rhetorical**: aggressive filler suppression. Every word is chosen. - -### 2. cinematic-noir _(Kyle Cooper / Se7en)_ - -- **Family**: Distressed serif (Hoefler Text) + tight mono for detail -- **Weights**: 700 mostly; thin italic ONLY for whispers -- **Color**: off-white `#E8E0D0` with deep red `#8B0000` single-word accent for menace -- **Motion**: typewriter with 10% chance of 1px jitter on entry; scratched etch for chapter beats -- **Placement**: off-axis — avoid dead-center, slightly high-left or low-right -- **Rules**: no emoji, no rounded corners, everything hand-feeling - -### 3. tech-keynote-confident _(Apple / Jony Ive ad)_ - -- **Family**: SF Pro Display OR Inter, nothing else -- **Weights**: 800 headline keyword, 400 context -- **Color**: pure white on any bg; `mix-blend-mode: difference` fallback for bright scenes -- **Motion**: swipe-reveal from bottom via clip-path (400ms); exit fades 400ms -- **Placement**: dead center, large. NOT lower-third. -- **Rules**: one caption on screen at a time. 2–5 words per caption. Long held silences between. Feels like slides. - -### 4. lyrical-poem-on-wall _(extends current memory-wall template)_ - -- **Family**: Serif with personality — EB Garamond / GT Sectra / Caslon Italic -- **Weights**: 400–500 only. **This direction rejects bold.** -- **Color**: picks up wall via `mix-blend-mode: overlay`, opacity 0.85, no stroke -- **Motion**: etch in 600ms, hold 1.5–3s, etch out -- **Placement**: always on a surface in the scene (back wall, foam, whiteboard). Uses matte pipeline. -- **Rules**: captions are **fewer** than spoken text — 40–60%. Intentional silences. No other tool does this; strong differentiation. - -### 5. high-energy-vlog _(controlled Hormozi)_ - -- **Family**: Inter ExtraBold, uppercase -- **Weights**: 900 always -- **Color**: white body + ONE accent (`#FFD600` or `#00E676`) + narrow 2px dark stroke -- **Motion**: word-pop with elastic, 60ms stagger; active word scales 1.15× on speech onset -- **Placement**: center-frame, ~35% from top -- **Rules**: max 3 words per frame. Hard break at breath pauses. Accent color on ~15% of words. **One full silence every 10s** (what Hormozi imitators miss). - -### 6. chapter-card _(Wes Anderson / Grand Budapest)_ - -- **Family**: Futura Bold (modern) / Archer (warm) / Bodoni (formal) -- **Weights**: 700 chapter title, 400 attribution -- **Color**: pastel hue sampled from scene -- **Motion**: full-frame static card between interview segments -- **Placement**: centered card for chapters; lower-left name card during speech -- **Rules**: chapter cards get their own beat (0.8s silence before, 0.4s after). Feels authored. - -### 7. investigative-typewriter _(Frontline / 60 Minutes / Morris Interrotron)_ - -- **Family**: IBM Plex Mono OR JetBrains Mono -- **Weights**: 500 -- **Color**: white with 3px shadow, no stroke -- **Motion**: typewriter char-by-char 25ms/char; cursor blink 600ms after last char -- **Placement**: bottom band with 40% opacity gradient up — **NOT a hard box** -- **Rules**: one line only, two-line max. Every caption ends with 1-frame cursor-hold before next enters. - -### 8. k-pop-lyric _(music video typographic flex)_ - -- **Family**: oversized display serif (Playfair Display / GT Super) + tiny mono detail line -- **Weights**: display 900, mono 400 -- **Color**: deep saturated single hue per song/segment -- **Motion**: cascade entries alternating sides; words cross subject with mix-blend -- **Placement**: intentionally LARGE — sometimes bigger than the face -- **Rules**: emotional/musical moments only. Never informational content. **Breaks rule #1 (subject wins) on purpose** — that's the whole point. - -### 9. broadcast-dignified _(BBC / NYT documentary standard)_ - -- **Family**: Helvetica Now / Neue Haas Grotesk -- **Weights**: 500 body, 700 name -- **Color**: white on 40% black gradient pill (not hard box, not plain shadow — gradient is the signature) -- **Motion**: 200ms fade-up, 150ms fade-down -- **Placement**: bottom-center, 10% margin, title-safe locked -- **Rules**: strict BBC — 160–180wpm, 32–34 chars/line, 2 lines max, 1.5s min gap. "Export to broadcast" mode. Boring on purpose. Never wrong. - -### 10. conference-lower-third-killer _(B2B but not lame)_ - -- **Family**: GT America / Aktiv Grotesk -- **Weights**: dual-weight name card — role 400, name 700, same size -- **Color**: scene-sampled accent on name, white on role -- **Motion**: name card swipes in from left 400ms on first appearance only; subsequent static -- **Placement**: lower-left card + active-word highlight inline in dialogue above -- **Rules**: mode for podcast clips, founder interviews, keynote pulls. Sophisticated without being arty. - ---- - -## Which to ship next - -Current templates: `memory-wall` (roughly direction #4), `champion` (roughly a mix of #5 and #9), `portrait-header` (default vertical). - -Priority ship order based on competitive gap: - -1. **documentary-dignified** — no one else does this well; Errol Morris aesthetic is an unserved niche -2. **lyrical-poem-on-wall** (as distinct template) — the one that most uses our matte-embed moat -3. **high-energy-vlog** — matches but out-designs Hormozi/Submagic presets -4. **tech-keynote-confident** — big for product launch videos -5. **investigative-typewriter** — niche but highly distinctive - ---- - -## How the agent picks - -1. Classify the clip: `tone × shot × platform` (see matrix above) -2. Look up direction in matrix -3. Read that direction's spec in this file -4. Translate spec into plan.json parameters OR clone the canonical HTML from `examples/` -5. Tune layout per scene (agent judgment, see `aesthetic-principles.md §1–18`) - -If no direction fits cleanly → **Standard mode**. Don't fake-fit an ill-matched direction. diff --git a/.agents/skills/embedded-captions/references/example-renders/champion.html b/.agents/skills/embedded-captions/references/example-renders/champion.html deleted file mode 100644 index 3ec196e..0000000 --- a/.agents/skills/embedded-captions/references/example-renders/champion.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - - -
- - -
- -
-
- You - know, - for - me -
-
- I've - had - this - kind - of - upbringing -
-
- the - great - foundation -
-
- I've - achieved - incredible - things -
-
- dreaming - of - becoming - number - one -
-
- -
-
- Wimbledon - Champion -
-
-
- - -
- - - - diff --git a/.agents/skills/embedded-captions/references/example-renders/memory-wall.html b/.agents/skills/embedded-captions/references/example-renders/memory-wall.html deleted file mode 100644 index c34d5cc..0000000 --- a/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - - - -
- - - - -
-
-
- Some - memories - feel - soft -
-
- like - old - film -
-
- but - suddenly -
-
- everything - is - sharp - again -
-
-
- - - - - -
- - - - diff --git a/.agents/skills/embedded-captions/references/failure-modes.md b/.agents/skills/embedded-captions/references/failure-modes.md deleted file mode 100644 index 1a971a7..0000000 --- a/.agents/skills/embedded-captions/references/failure-modes.md +++ /dev/null @@ -1,145 +0,0 @@ -# Failure Modes — learned the hard way - -Things that broke during skill development. Check against this list before you ship. - -## Matting - -### CoreML execution provider corrupts face alpha - -Running the matting ONNX through the CoreML EP partitions the graph across providers; the mixed-precision boundary produced alpha ≈ 30 (out of 255) inside the subject's face while the background correctly read 0 (observed with the previous RVM engine — don't re-try). Result: caption text visibly shines THROUGH the face. - -**Fix**: Only ever use `providers=["CPUExecutionProvider"]` for the matting ONNX. Our script does this; don't "optimize" it by adding CoreML. - -### Aspect distortion / sharp channel-stride make the alpha garbage - -(historical — the PP-MattingV2 engine was replaced 2026-06-12 by hyperframes `remove-background`; kept because the lessons generalize) Two earned scars from the ONNX era: (1) fixed-size model exports — squashing a portrait clip into a landscape canvas distorts humans; contain-pad (aspect preserved, centered, alpha cropped back) instead. (2) sharp returns a **3-channel** buffer from `.raw()` after resizing a 1-channel raw input — reading it with a 1-channel stride silently produces a smeared, striped, displaced matte that can _look_ plausible. Always `toBuffer({resolveWithObject:true})` and stride by `info.channels` (other scripts in this skill still use sharp). - -**Fix**: both handled inside `matte.cjs`; preserve them if you touch it. - -### isnet-general-use / u2net_human_seg miss props - -rembg's general/human models capture the person but drop handheld props (mic, notebook). If the caption crosses the mic, it will NOT be occluded by the mic — text floats in front of it unnaturally. - -**Fix**: For scenes where props matter, either (a) accept that the human-matting model captures what it captures, or (b) add a manual mask ROI for the prop region. We haven't productized (b) yet. - -## Layout - -### Flex-stacked captions push hidden ones into gesture zone - -First champion iteration put all cap elements inside a flex column with `display: block`. Hidden captions (visibility: hidden) STILL reserve flex space. Result: cg-4 "dreaming" got pushed to y=700, landing right on the hand gesture zone and getting clipped. - -**Fix**: Inside the caption plane, each `.cap` is `position: absolute` at the same coords. Hidden ones don't occupy layout. Both templates in this skill do it this way. - -### Header-overlay on close-crop shots - -First champion iteration used a full-width header band across the TOP of the frame (`top: 30, left: 40, right: 40, height: 360, rotateX: -3deg, justify-content: flex-start, align-items: center`). Subject's head crosses the center, eating the middle of every caption. "know, for me" became a faint "now, for" with the letters sliced apart. - -**Fix**: On close-crop podcast shots, don't use symmetric full-width bands. Use `corner-column-crown` with caption column in the corner opposite the head. - -### Text right-align + align-items: flex-end + no max-width → flows off-screen - -If you set `align-items: flex-end` on the plane and don't constrain width, each `.cap` shrinks to content width. Long words then extend left beyond the plane's "visible" box without wrapping, clipping into the subject. - -**Fix**: Set `max-width: calc(100% - padding*2)` on each `.cap`. Templates do this. - -## Animation - -### letterSpacing animation causes inline-block reflow jumps - -Had `letterSpacing: "0.04em"` as the "from" value in `tl.fromTo(word, {opacity:0, letterSpacing: ".04em"}, {letterSpacing:"0"}, w.start)`. GSAP snaps the "from" state at w.start. The width of the word then changes over the tween → inline-block reflow → the `.cap` line box recomputes → "Some" visibly jumped between rows as "memories" entered. - -**Fix**: Animate only **transform** properties (opacity, y, scale). NEVER animate letter-spacing, font-size, or filter:blur on `.w` spans. Templates follow this. - -### Double-fade (container × word) produces a non-linear pop - -Fading both the group container AND each word independently multiplies: effective_opacity = container.opacity × word.opacity. Even with matched eases, the combined curve is nonlinear and feels like a snap-in around the 40% mark. - -**Fix**: Keep container at fixed `opacity: 1` during the group's life (set via `tl.set` just before first word). Animate only per-word opacity. Templates do this. - -## Blending - -### mix-blend-mode: overlay vanishes into dark regions - -`overlay(white_text, black_bg) ≈ black`. If part of the caption falls on a dark shadow / dark prop, the letters disappear. The first champion render had `SHARP` become `ARP` because "S" and "H" landed in the dark mic's shadow. - -**Fix**: For scenes with significant dark regions under the caption, use `mix-blend-mode: screen` (which preserves white on dark). `wall-embed` defaults to overlay (for mid-tone walls); `corner-column-crown` defaults to screen (for dark bookshelves). - -### Bright backgrounds wash out screen blend - -Opposite problem: `screen(white, bright) ≈ white` regardless of the text — letters become invisible on bright backgrounds like sunlit windows or white walls. - -**Fix**: If average luminance of the caption region exceeds 180/255, switch CSS to `mix-blend-mode: normal` with an opaque color. Sample the background pixels in the caption bbox across the clip to check. - -## Render pipeline - -### Frame-rate mismatch between bg render and matte PNGs - -If hyperframes renders at 30fps default but the matte was extracted at 24fps source rate, ffmpeg overlay gets a temporal mismatch — alpha from frame N is overlaid on bg content of some fractional frame ≠ N. Result: person's current silhouette and matte silhouette are shifted by a few frames, so the occlusion lags or leads the body. - -**Fix**: Always pass `--fps` to hyperframes render matching the source's native FPS (usually 24). `render-and-composite.sh` reads fps from plan.json and passes it through. - -### WebM alpha (VP8/VP9) flaky in Chromium - -We tried making foreground an alpha-channel WebM. Chromium's support for VP9 alpha is inconsistent; VP8 alpha needs specific metadata the default ffmpeg encode doesn't produce. - -**Fix**: Don't try to put the matte inside hyperframes. Do the overlay in post with ffmpeg against a PNG sequence. `render-and-composite.sh` does this. - -## Crown / centered text - -### Centered crown eaten by body - -Default `.crown-plane` in `corner-column-crown` is `left: 0; right: 0; text-align: center`. That mechanically centers the word at `frame_width/2`. If the subject sits right of center (Jobs at x=1100 in a 1920 frame) OR the word isn't wide enough to poke both clean zones, the body eats 50-70% of the crown and it reads as "THE \_\_\_ S". - -**Fix**: Check subject center_x vs frame center before choosing crown strategy (see [layout-heuristics.md § Crown placement](layout-heuristics.md)). Either size the crown large enough to cross both clean zones, or shift it into the larger clean zone with a narrower width. Keep `text-align: center` within the (re-positioned) box, not the frame. - -### Crown font too small for frame → half-swallowed - -On landscape 1920×1080, a centered crown at 140px is only ~500px wide. If the subject is 700-900px wide, the crown vanishes behind them. Symptom: only "THE" and "S" visible for "THE BEATLES". - -**Fix**: For full-frame centered crown, font must be big enough that `crown_width > subject_width + 400`. See font-size table in [typography-presets.md](typography-presets.md). Prefer 180-260px for landscape centered crowns. - -### Wider caption column + default font size → underweight - -Template defaults (66/78/92/140) assume a ~560px column. Expanding the plane to 700+ px without bumping fonts makes the text feel too small relative to the column. - -**Fix**: Column width 600-760 → phrase ~108px, emph ~128px, crown ~220px centered. See table in [typography-presets.md](typography-presets.md). - -## Scene admission - -### Handheld / fast camera → matte alpha flickers - -The matte is temporally smoothed (EMA in matte.cjs) but moderate motion only. Fast camera pans (vlog selfie) still produce frame-to-frame alpha jitter that shows as flickering caption edges. - -**Fix**: SKILL.md decision gate lists handheld vlog as `⚠️` — degrade or refuse. Production version would add `vidstabdetect` compensation; v1 does not. - -### Multi-person scenes → matte is ambiguous - -The human-matting model segments "foreground" as a single alpha. With two people, it captures both but they're treated as one blob. Captions can't go "behind person A but in front of person B". If the scene has both speakers visible, the skill should split by shot boundaries first. - -**Fix**: Either pre-split with PySceneDetect + per-shot planning, or refuse for `⚠️` multi-subject scenes. - -### Undetected shot cut inside the clip - -Some sources (interviews, broadcast clips) cut to B-roll/archive footage mid-clip. The matte + caption layout assumes the subject is the same person throughout — a hard cut mid-render creates garbage (caption placement relative to old subject applied to a totally different shot). - -**Fix for v1**: Probe the clip at 3-5 timestamps before accepting it. If any frame doesn't contain the primary subject at the same position, trim the clip to end before the cut. `Steve Jobs 60 Minutes` cut to Beatles archival at t≈9s, was manually trimmed to 8.5s. - -**Fix for future**: Run PySceneDetect as part of the admission gate; split into shots automatically. - -### Pillarbox / letterbox content with baked-in graphics - -TV archive clips often have pillarbox (black bars at sides) plus baked lower-third logos ("60 Overtime") and date labels ("2003"). These are part of the video file, can't be matted out, and shrink the usable frame area. - -**Fix**: Detect black-bar margins in the first frame (scan rows/columns for all-black). Constrain caption safe-zone to `[left_margin+pad, right_margin-pad, top_margin+pad, bottom_margin-pad]`. For Jobs, safe content zone was x=280-1640 (not 0-1920). Layout positions must respect this. - -### transcribe.cjs sees an existing transcript and skips - -Transcription is Whisper now, via `transcribe.cjs` (it wraps `hyperframes transcribe` — no API key). `hyperframes init --video ` may itself auto-write a `transcript.json` in hyperframes' raw whisper shape (a flat word array, no top-level `language_code`). `transcribe.cjs` only treats a transcript as done when it's ALREADY in our normalized schema (`{ words: [...], language_code }`); otherwise it (re-)runs Whisper and normalizes the flat word list into `{ words:[{text,start,end,type:"word"}], language_code }`. - -**Fix / expectation**: If you init via hyperframes first, expect `transcribe.cjs` to normalize that transcript into our schema. Don't hand-leave a half-normalized file (e.g. our `words` shape but no `language_code`) — that's the one state the skip-guard can misread. - -### Transcript gaps > 3s with no speech - -If the original audio has a long silence, leaving the caption plane empty feels wrong mid-video. Either (a) let the prior caption linger, (b) show a title-card crown during the silence, or (c) cut the silence out of the clip. - -**Fix**: During caption-grouping, detect silences > 3s. The skill should prompt the user about this, not silently proceed. diff --git a/.agents/skills/embedded-captions/references/layout-heuristics.md b/.agents/skills/embedded-captions/references/layout-heuristics.md deleted file mode 100644 index 09919d5..0000000 --- a/.agents/skills/embedded-captions/references/layout-heuristics.md +++ /dev/null @@ -1,238 +0,0 @@ -# Layout Heuristics - -How to pick `wall_position` / `crown_position` in plan.json. - -## Step 1: Sample 3 frames - -```bash -ffmpeg -y -ss 0.5 -i source.mp4 -vframes 1 frame0.jpg -ffmpeg -y -ss -i source.mp4 -vframes 1 frame1.jpg -ffmpeg -y -ss -i source.mp4 -vframes 1 frame2.jpg -``` - -Read all three. Note: subject's head bbox, shoulder top line, and wherever hands move during gestures. Worst-case foreground envelope = union across all 3. - -## Step 2: Find the clean zone - -The caption plane should live in pixels that are **always background** across the clip. Never where the body lands. - -Annotate approximate ranges: - -- Head bbox: `head_x_min`, `head_x_max`, `head_y_min`, `head_y_max` -- Hand gesture envelope (if any): usually below `y = shoulder_top ≈ head_y_max + 40` -- Props (mic, cup): typically static, note bbox - -**Clean zones**, in priority order: - -1. **Corner farthest from head** (usually opposite the gaze direction) -2. **Upper strip above head_y_min minus 30px margin** -3. **Lower-third** if upper is occupied (last resort — breaks "embedded" aesthetic) - -## Step 2.5: Which side of the subject? - -Once you know where the subject and baked graphics are, decide which side (left or right of the subject) hosts the caption column. Order of precedence: - -### 1. Hard constraints first — baked graphics - -Logos, watermarks, date stamps, "60 Overtime"-style lower-thirds are already in the source. They occupy permanent zones you must avoid. Map them out from frame samples: - -- Jobs 60 Minutes: "2003" at upper-left (x=280-460, y=30-90); "60 Overtime" at bottom-left (x=280-770, y=960-1080). Left side partially constrained; still usable above/below these. -- TikTok re-uploads: username watermark that rotates corners every few seconds — hard to plan around, often a refusal reason. - -If one side has a hard constraint that eats > 60% of that side's clean zone, default to the other side. - -### 2. Subject body bias — pick the bigger clean zone - -Compute clean-zone widths on both sides: - -``` -left_clean_width = body_x_min − safe_left_margin -right_clean_width = safe_right_margin − body_x_max -``` - -Pick the side where clean zone is wider. If the difference is within 10% of frame width, the sides are ~equivalent → fall through to step 3. - -Worked examples: - -- **Champion** (Djokovic, 1920×1080): body x ≈ 550-1200. Left clean = 510, right clean = 720. Right is wider → but we put captions LEFT because of gaze (see step 3). The narrow difference made either workable. -- **Jobs**: body x ≈ 700-1480 (right-of-center). Left clean = 420, right clean = 160. Left wins decisively. Captions went LEFT. -- **Memory Wall**: surface location dictated the side (see note below about wall-embed). - -### 3. Gaze direction — the "looking room" rule (tiebreaker and aesthetic) - -Classic cinematic framing: leave more empty space on the side the subject is **looking toward**. This preserves their gaze path and feels uncluttered. **Captions go to the OPPOSITE side** (the side the subject is facing away from), so they don't steal looking room. - -Quick check: sample 3 frames. Estimate the eye-line vector. Does it point more left or right? - -- Looking screen-right → captions on LEFT -- Looking screen-left → captions on RIGHT -- Looking forward at camera → no preference from gaze, use step 2 only - -The champion / Djokovic shot has him addressing camera slightly from the left — captions on LEFT actually read like text he's looking toward, which can feel like he's acknowledging them. That's fine here but is a flavor choice; generally prefer gaze-opposite. - -### 4. Narrative emphasis (for optional crown) - -If you're using a **center-stage crown**, it sits across the subject — no left/right choice for it. But the other captions (the column) still follow steps 1-3. - -If you're using a **clean-zone crown** (shrunk, placed in one clean zone instead of crossing the body), put it in the **same side as the main column** for visual consistency. Don't split crown and column on opposite sides — it creates ping-pong. - -### Special case — wall-embed - -When the template is `wall-embed`, the side is **dictated by where the usable surface is**, not by body bias or gaze. Memory Wall's foam panel was on the right, so captions went right even though the subject was slightly left-of-center. Surface location wins because the whole effect depends on the text sitting ON that specific surface. - -### Decision summary - -``` -Side = f(baked graphics, body bias, gaze, surface) - -priority: -1. Hard constraints (baked logos) — never place here -2. Wall-embed surface location — wins if using wall-embed -3. Bigger clean zone — default for corner-column -4. Gaze direction (looking room) — tiebreaker when both sides similar -``` - -If the subject actively swings their gaze across the clip (turning head L→R), pick a side that works for both extremes, not just the most frequent. Or accept that looking room will briefly be violated — it's a 10-second video, nobody cares. - -## Step 3: Pick template + position - -### If scene has a flat back wall (acoustic foam, plaster, fabric backdrop) - -→ `wall-embed.html` - -``` -wall_position: { - top: max(40, head_y_min - 40), - right: 20-60 (hug outer edge), - width: video_width * 0.35 – 0.50, - height: shoulder_top - top, - rotateY: -10 to -16 deg if wall angles away on the left, - +10 to +16 deg if mirrored, 0 if wall is parallel, - rotateX: 0-3 deg subtle downtilt only -} -``` - -`mix-blend-mode: overlay` in this template — works on mid-tone walls. If wall is near-black (luminance < 60), switch CSS to `screen`. - -### If scene has a cluttered but dark backdrop (bookshelf, plants, set dressing) - -→ `corner-column-crown.html` - -``` -wall_position: { - top: 40, - left: 40, // anchor to clean corner opposite head - width: video_width * 0.40, - height: clamp(360, 520), // don't reach below shoulder top - rotateY: 3-6 deg (subtle, not flashy) -} -crown_position: { - top: video_height * 0.40 // center-ish; body will cut middle letters -} -``` - -`mix-blend-mode: screen` is correct here (bookshelf is dark). - -### If subject fills >70% of frame - -Template doesn't matter — there's nowhere clean. **Refuse**, suggest classic lower-third. - -## Step 3.5: Crown placement (when using `corner-column-crown`) - -**Default preference: center-stage crown.** A big, centered crown word (think "WIMBLEDON CHAMPION", "BEATLES", "SHARP AGAIN") that crosses the subject is the most powerful embed move — body occludes the middle letters, clean zones on both sides hold the outer letters, and the word reads as a title drop. **Use this whenever conditions allow.** - -### Conditions where a centered crown works - -Sample 3 frames, eyeball the subject's horizontal envelope across the clip. Let `body_x_min / body_x_max` = tightest horizontal bounds that contain the head+shoulders+arms in any frame. - -A centered crown at font size F (where `crown_width ≈ F × 0.55 × char_count`) reads as dramatic IF: - -1. **Subject is roughly centered**: `|body_center_x − frame_width/2| < frame_width × 0.10`. The body sits in the middle third. -2. **Clean zones on both sides are non-trivial**: `body_x_min > frame_width × 0.15` AND `body_x_max < frame_width × 0.85`. There's ≥15% of frame width clean on each side. -3. **The crown word is wide enough to poke out both sides**: `crown_width > body_width + 400px`. If the word ends before reaching the body's right edge, most letters just get swallowed — ugly. - -If all three hold, centered crown is right. Go big — font sized so the word spans `0.8 × frame_width` or more. "BEATLES" at 140px (~500px wide) fails condition 3 on an 1920 frame with Jobs-sized body (780px wide). "WIMBLEDON CHAMPION" at 140px (~1700px) on the same frame passes easily. - -### When center fails — move crown to the clean zone - -If any of the three conditions fails, center-stage eats too much and the word becomes illegible ("THE BEATLES" → "THE" and a sliver of "S"). Two strategies: - -**Option A — shrink crown to fit cleanly in the larger clean zone.** Pick the side opposite the subject's bias. Compute `clean_zone_width` on that side. Pick crown font such that the word wraps to 1-2 lines inside it. Tail letters can touch the subject edge for a hint of embed, but the body of the word lives on backdrop. - -``` -// Jobs: subject center ≈ x=1100 (right of frame center 960). Left clean zone is larger. -crown_plane: { left: 200, width: 560, text-align: center } -font-size: 118px → "THE / BEATLES" wraps to 2 lines, fits in x=230-770 - leaving "S" tail at x~760 lightly touching Jobs's shoulder -``` - -**Option B — drop the crown entirely, promote the word to `emph` in the main column.** Simpler when the phrase doesn't deserve dramatic center-stage treatment. Works fine for 2-word emph like "the Beatles" or "incredible things" — they become large bold text in the left column with body occluding their tails. - -### Rules of thumb for choosing - -| Subject occupies center X%+ of frame | Clean zones L/R | Crown approach | -| ------------------------------------ | ------------------------ | ----------------------------------------------- | -| < 50%, roughly centered | both ≥ 15% of width | Centered crown, go BIG (frame_w × 0.8+) | -| 50-70%, slightly offset | one side ≥ 25% | Crown shifted to larger clean zone | -| > 70%, fills most of frame | neither side wide enough | Drop crown, use `emph` in column | -| Close-crop face, fills > 80% | essentially none | No crown. All captions in a header/footer strip | - -## Step 4: Respect these invariants - -1. **Never cover the eyes.** Eye bbox is sacred. Add 20px margin around it when checking caption bbox intersection. -2. **Caption bbox must not exit frame.** Reserve 4% broadcast-safe margin on all edges. -3. **Large emphasis words should have horizontal slack.** At `cap-emph` (92px), an 8-char word ≈ 580px. Plane needs ≥ 620px width OR rely on wrapping at 2 lines. -4. **Crown lives at `top ≈ shoulder_top − crown_font_size/2`** so it sits across the upper body, not the face. -5. **If aspect ratio is portrait (9:16), rotate layout**: wall-plane becomes a **top band** (full width, height ≈ 20%), crown goes below it if used at all. - -## Step 5: Validate before render - -Before calling `render-and-composite.sh`, sanity check: - -- Did you place the plane in the opposite quadrant from the face? ✓ -- Does the plane exit the frame anywhere? If yes, shrink. -- Is the font too big for the plane width? Calculate: longest word in words[] × 0.55 × font_size < plane_width - padding\*2. -- For `corner-column-crown`, did you set `crown_position.top` so the crown actually crosses the body (not above the head, not below the torso)? -- **Pillarbox / letterbox hard check.** If the source has black bars (see pre-flight probe in SKILL.md), compute `leftmost_text_x` using the correct formula for the text alignment: - - | Alignment | Formula | - | --------------------------- | -------------------------------------------------- | - | Left-aligned | `plane_left + padding_left` | - | Right-aligned (main column) | `plane_right − padding_right − longest_word_width` | - | Center-aligned (crown) | `plane_center − longest_word_width / 2` | - - Where `longest_word_width ≈ font_size × char_count × 0.55` (adjust 0.55 down to ~0.50 for italic, up to ~0.62 for uppercase bold). **All** of these must be ≥ `pillarbox_left_edge + 10–20px` (safety margin). Mirror for the right bar. - - **Gotcha from past iteration**: setting `plane_left = 180` with a right-aligned column on a Jobs 60 Minutes clip (pillarbox at 280) looked "inside the plane" but the right-aligned text at font 108px produced `leftmost = plane_right − padding − 468 = 180 + 700 − 36 − 468 = 376` … wait, that IS past pillarbox. The actual bug was different: for a 3-line wrap ("four very / talented / guys") the widest line is "talented" at ~468px, not the whole phrase. Compute against the longest **single line** after wrap, not total phrase width. - - **Re-check after font-size changes** — bumping font 84→104 shifts right-aligned text leftward by ~30px. If the budget was already tight, the bump blows through the pillarbox. - - **Empirical target**: leftmost text at pillarbox + 10-20px looks "anchored" to the bar (visually grounded). Pushing it much deeper (50px+) makes captions feel floaty in the middle of the frame. - -## Worked examples - -### memory-wall (1280×720, acoustic foam wall) - -```json -{ - "template": "wall-embed", - "wall_position": { - "top": 40, - "right": 30, - "width": 720, - "height": 520, - "rotateY": -13, - "rotateX": 1 - } -} -``` - -### champion (1920×1080, bookshelf backdrop) - -```json -{ - "template": "corner-column-crown", - "wall_position": { "top": 40, "left": 40, "width": 720, "height": 420, "rotateY": 4 }, - "crown_position": { "top": 440 } -} -``` diff --git a/.agents/skills/embedded-captions/references/motion-vocabulary.md b/.agents/skills/embedded-captions/references/motion-vocabulary.md deleted file mode 100644 index 77cc1e0..0000000 --- a/.agents/skills/embedded-captions/references/motion-vocabulary.md +++ /dev/null @@ -1,148 +0,0 @@ -# Motion Vocabulary — named word-entry moves - -10 motion primitives the skill uses. Each has a specific timing + easing + situational fit. Agent picks by **content tone**, not default to one. - -**Easing philosophy:** `cubic-bezier(.2,.7,.2,1)` is the "considered confident" default. `linear` is almost always wrong. Back-easing (elastic) is for playful content only — never documentary. - -**Exit rules:** Default exit is the same tween reversed at 60% duration. Never exit with a different motion than entry unless doing a rhetorical pivot. Never fade out during speech — only during the gap between phrases. - ---- - -## The 10 moves - -### 1. typewriter - -Char-by-char reveal, 25–35ms/char, linear easing. Documentary / data-heavy / tense / interrogative. - -```js -// GSAP -words.forEach((w, i) => { - const chars = w.textContent.split(""); - w.textContent = ""; - chars.forEach((c, j) => { - const span = document.createElement("span"); - span.textContent = c; - span.style.opacity = 0; - w.appendChild(span); - tl.to(span, { opacity: 1, duration: 0 }, wordStart + j * 0.028); - }); -}); -``` - -### 2. word-fade-up (DEFAULT) - -Per-word, 80ms stagger, `opacity 0→1 + translateY 8→0`, `cubic-bezier(.2,.7,.2,1)` (ease-out). Default for conversational content. - -```js -tl.fromTo( - word, - { opacity: 0, y: 8 }, - { opacity: 1, y: 0, duration: 0.45, ease: "power2.out" }, - wordStart, -); -``` - -### 3. word-pop - -Per-word, 60ms stagger, `scale 0.85→1 + opacity 0→1`, elastic-light `cubic-bezier(.34,1.56,.64,1)`. Energetic / YouTube-vlog / high-tempo. **Never for documentary.** - -### 4. swipe-reveal - -Whole phrase at once, 400ms, `clip-path inset 0 100% 0 0 → 0 0 0 0`, expo `cubic-bezier(.77,0,.175,1)`. Keynote / tech product / announcement. - -```css -.cap { - clip-path: inset(0 100% 0 0); -} -/* animate to inset(0 0 0 0) */ -``` - -### 5. drop-and-settle - -Per-word, 120ms stagger, `y: -30→0` with back-bounce `cubic-bezier(.68,-.55,.27,1.55)`. Playful but controlled. **Not for documentary.** - -### 6. etch - -Whole word at once, 600ms, opacity ramp `0→1` with slight blur→sharp transition. Ease-in-out. Poetic / lyrical / "quote on wall" direction. - -### 7. crosshair - -Per-word, 200ms total: two 1px lines converge on word center (linear 150ms), then word snaps in (expo-out 50ms). Thriller / investigative doc. - -### 8. breathing-hold - -**Static but alive.** No entry animation. Once visible, micro-scale loop `1.00↔1.008` over 2s, sine ease. Used on climax lines held 1.5s+. - -### 9. cascade - -Each word from alternating direction: L, R, L, R. `translateX: ±40→0`, ease-out 300ms. **Rhythm-break move** — use sparingly, once per 30s max. - -### 10. burn-in - -**Zero animation.** Sudden 1-frame opacity 1. No fade, no transform. Interview-doc style. Use for every 6–8th phrase in a documentary direction for variety (Standard mode; see direction-catalog §1). - ---- - -## Tone → timing lookup table - -| Tone | Stagger | Hold | Entry move | -| -------------- | ------------------------- | ----------- | ---------------------------------- | -| documentary | 150ms | 600ms | burn-in (70%) + word-fade-up (30%) | -| conversational | 80ms | 400ms | word-fade-up | -| energetic | 50ms | 300ms | word-pop | -| poetic | 250ms | 1200ms | etch | -| broadcast | 0 (burn-in) | BBC timings | burn-in | -| investigative | 25ms/char | 500ms | typewriter | -| keynote | 0 per-word (phrase swipe) | 600ms | swipe-reveal | - -Agent picks tone → this table → GSAP parameters. Data, not guesswork. - ---- - -## Per-word vs per-phrase animation axis - -Orthogonal to the 10 moves above. - -- **Per-word animation** (default): each word enters at its `w.start` timestamp. Tight sync with speech. -- **Per-phrase animation**: whole group enters/exits at `g.in`/`g.out`. Words appear together. Used for: - - swipe-reveal moves - - burn-in (no animation, but the "reveal" is a group event) - - title cards / chapter breaks - -Rule: per-word for content that tracks speech; per-phrase for moments that step outside the speech flow. - ---- - -## Stagger breakdown by context - -Fine-tune stagger within a tone: - -- **Documentary dialog**: 150ms (measured) -- **Documentary punchline**: 250ms (weighted) -- **Vlog opener**: 50ms (fast hook) -- **Vlog narration**: 70ms (conversational but snappy) -- **Poem / lyric**: 250–400ms per word, with 500–1000ms gaps between phrases -- **Keynote hero**: per-phrase only (stagger = N/A) -- **Interview name card**: 0 stagger (static) - ---- - -## Anti-patterns (banned, from anti-patterns.md) - -- Animating `letter-spacing` → reflow -- Animating `filter:blur` → reflow + can wash out text -- `Math.random()` / `Date.now()` in timeline → non-deterministic render -- Entries under 100ms total → frantic, unreadable -- Same motion for every group for 30s+ → eye adapts, stops registering - ---- - -## When to break the vocabulary - -The 10 moves are a comfortable coverage, not a ceiling. For Standard mode, invent new moves when the scene demands it: - -- Kyle Cooper's scratched typewriter for noir -- K-pop lyric's directional word-from-side -- Film-title flash-cut burn-in with chromatic aberration - -When inventing: stay deterministic, stay transform+opacity only, state the motion in terms of the 4 axes (entry, hold, exit, stagger). diff --git a/.agents/skills/embedded-captions/references/rail.md b/.agents/skills/embedded-captions/references/rail.md deleted file mode 100644 index 727d19b..0000000 --- a/.agents/skills/embedded-captions/references/rail.md +++ /dev/null @@ -1,68 +0,0 @@ -# Rail track — standard lower-third subtitle - -The **default** caption track and the workhorse: a clean, readable subtitle that sits **in -front** of everything (never occluded by the matte) in the lower third. It carries **most** -of the transcript. It is deliberately **plain** — the cinematic craft (planes, occlusion, -Vogue-masthead, accumulation) lives in the _embed_ track only ([composition-craft.md](composition-craft.md)). - -For talking-head / explainer / voiceover, the typical output is **the whole transcript on the rail** -with only the climax(es) promoted to embed. Rail is not a fallback — it's the baseline. - -> **Implementation note.** A dedicated rail renderer is the next build step. The rail is a -> plain `fg` caption track and maps cleanly onto hyperframes' native caption pipeline -> (`media-use` captions) — prefer reusing that over hand-rolling. Until wired, render -> the rail as a simple `data-caption-layer="fg"` composition (no matte overlay for these caps). - -## Position & safe area - -- **Lower third, horizontally centered.** Landscape (16:9): baseline ~80–120px above the - bottom edge. Portrait (9:16): lower-middle, ~ 600–700px from the bottom (clear of platform UI). -- **Title-safe margins:** keep text within the title-safe box (80% of the frame, `/hyperframes-studio` Safe zones) / inside any letterbox-pillarbox bars - (see the letterbox probe). Never flush to the frame edge. -- **One caption group on screen at a time.** No accumulation, no cascade — that's embed-track behaviour. -- It rides above the subject; the matte does **not** occlude it (rail = in front). - -## Lines, length, timing - -- **≤ 2 lines.** Broadcast target ~ 32–42 chars/line; break at a clause/phrase boundary, never - mid-word, never leave a dangling 1-word line. -- **Word-synced.** Each group's window envelops its words (`group.in ≤ first word.start`, - `group.out ≥ last word.end`); each group ≥ 0.5s on screen; ~1.5s min gap discipline so it - doesn't strobe. Word timings within 80ms of transcript (same gate as everywhere). -- **Grouping** = short readable phrases (see [caption-grouping.md](caption-grouping.md)) — not the - embed track's "phrase = composition" rule; here it's just legible subtitle chunking. - -## Look (restrained on purpose) - -- **Size: ~`calc(0.045 * var(--h))`** (≈48px @1080, ≈58px @1290) — readable, _not_ hero. The rail is a subtitle; it is deliberately much smaller than the embed body/climax. Express as a `var(--h)` fraction (never hardcode px) so it scales across resolutions. The embed climax is sized to the frame independently (see composition-craft § POP) — **never** size the climax as a multiple of this rail. -- One clean sans (Inter / Helvetica Now / Neue Haas), weight 500–600; white (or near-white). -- **Legibility without grading the video:** a tight text treatment local to the glyphs only — - a soft dark drop-shadow, or a subtle rounded gradient pill / 30–40% scrim **sized to the text - box** (not a full-frame bar, never a frame-wide grade). On luminance > 180 backgrounds, keep - the scrim; never rely on bare light text. -- Motion is minimal: 150–250ms fade-up in / fade-down out. No glitch, no scale-pop, no per-word - choreography on the rail — that energy is reserved for embed. - -## The `emphasis` flag (active-word highlight) - -The only intensity the rail carries. When a word is graded `emphasis` (the 1–2 punch words in a -phrase), give it an **inline** lift on the rail — accent colour and/or +weight, optionally a -karaoke-style active-word pop (≤1.1× scale) as it's spoken. Keep it inline; it does **not** -leave the rail. Anything that wants to leave the rail is an `embed`, not an emphasis. - -## What the rail never does - -- Never goes behind the subject (that's embed). -- Never accumulates into a multi-line poem (that's embed). -- Never crosses the face / uses occlusion as an effect. -- Never grades or textures the underlying video. -- Doesn't drop content to "fit fewer blocks" — split into more groups instead. The only drops - are filler (um/uh, exact stutters, self-corrections); dense conversational `narrator` glue - ("you know", "sort of") may be trimmed for readability, content/structure words stay. - -## Hand-off to embed - -Rail + embed coexist in one render: the rail runs the whole clip; an embedded peak appears over -it at its moment (the rail can briefly clear or dim under the embed if they'd collide). Decide -which phrases promote via the role read in SKILL.md § Caption model; author the promoted ones -with [composition-craft.md](composition-craft.md). diff --git a/.agents/skills/embedded-captions/references/reference-bar.md b/.agents/skills/embedded-captions/references/reference-bar.md deleted file mode 100644 index 57be3c8..0000000 --- a/.agents/skills/embedded-captions/references/reference-bar.md +++ /dev/null @@ -1,47 +0,0 @@ -# The reference bar — what world-class looks like - -Self-review without an external bar always passes. Before shipping, hold the render -against these references — not "is anything broken" (the gates did that) but "would a -designer at these houses sign it". - -## Per register - -**premium-warm / editorial (cream, editorial)** — the bar is a _Vogue cover_ and the -A24 title card: type interacts with the subject (masthead behind the head), one or two -sizes feel chosen not defaulted, the frame would work printed as a poster. Check: does -the climax frame, screenshotted alone, look like a designed cover — or like a subtitle -that grew? - -**tech-premium (keynote, ink)** — the bar is an _Apple keynote slide_ over footage: -opaque, weighty, dead-center confidence; negative space is doing the work; nothing -decorating. Check: would this frame look at home in a WWDC sizzle? - -**formal (documentary)** — the bar is _Errol Morris / PBS Frontline_: the type has the -restraint of a court document; stillness reads as authority. Check: does ANY motion call -attention to itself? If yes, cut it. - -**loud** — the bar is a _k-pop lyric video / Nike spot_: type fights the subject and -wins on purpose, color is saturated and scene-true, the beat hits WITH the word. Check: -does the hero frame make you want to replay it? - -## The five positive checks (run on the preview sheet, after the failure checks) - -1. **Poster test** — screenshot the climax frame alone. Would you post it as a still? - If it needs the motion to excuse the composition, the composition isn't done. -2. **Timid test** — is any body caption apologizing (tiny, corner-parked, far from the - silhouette)? Small is a choice; timid is a default. Hug the subject or commit to the - margin as a designed column. -3. **One-glance hierarchy** — at thumbnail size (shrink the sheet), can you still tell - opener / body / hero apart? If the tiers blur together, the contrast ratios are off. -4. **Scene handshake** — name three ways the type acknowledges THIS footage (accent - sampled from the scene, occlusion crossing, shadow direction, depth blur, palette - temperature). Fewer than two = it's a sticker, not an embed. -5. **Dead-air audit** — scrub the no-caption stretches. Are they _composed rests_ - (subject carries the frame) or _gaps_ (the design just stopped)? Rests are earned by - rhythm; gaps are bugs in pacing. - -## How to use with fresh-eyes review - -Give the sub-agent the preview sheet + the 5 failure checks (SKILL.md § Visual QA) + -these 5 positive checks, and ask for verdicts on both lists. A render ships when it -passes the failure checks AND at least 4/5 positive checks with specific evidence. diff --git a/.agents/skills/embedded-captions/references/scene-types.md b/.agents/skills/embedded-captions/references/scene-types.md deleted file mode 100644 index aaef185..0000000 --- a/.agents/skills/embedded-captions/references/scene-types.md +++ /dev/null @@ -1,94 +0,0 @@ -# Scene Types — picking the right template - -The three templates differ in one thing: **what surface (if any) the text physically sits on**. Pick by reading the scene, not by the genre label. - -## wall-embed — "text is printed on a real surface" - -Original Memory Wall render used this. Text uses perspective transform + `mix-blend-mode: overlay` to look like it was silk-screened onto a wall behind the subject. The illusion is strong when it works and completely broken when forced. - -### Four conditions — ALL must hold - -1. **A flat or near-flat surface exists somewhere in the frame, larger than the caption block.** Good: acoustic foam panel, painted wall, door, stone facade, large backdrop cloth, blackboard. Bad: bookshelf (3D depth + decorative items), mic shield (too small), window (transparent, content behind it shifts), brick wall with mortar patterns (competes). -2. **The surface is at a non-zero angle to the camera.** Perspective is what sells "embedded". If the wall is perfectly parallel (0° rotation relative to camera), pasting rotateY:0 text onto it looks like a sticker, not embedded. Memory Wall's foam wall was tilted ~13° — perfect. A wall directly behind a centered frontal subject usually has no exploitable angle. -3. **The surface is mid-luminance.** Overlay blend neutralizes mid-tones — text keeps contrast against a mid-grey wall. On near-black surfaces (luminance < 60), overlay makes text vanish → switch to `mix-blend-mode: screen`. On near-white surfaces (> 180), overlay also fails → switch to `mix-blend-mode: normal` with opaque color. -4. **The surface has no competing graphical content.** Plain paint, uniform acoustic foam, blurred OOF background all work. Printed wallpaper, picture frames, text on signage, busy bookshelves all compete with the caption and ruin the embed illusion. - -If **any** condition fails, **do not use wall-embed**. Pick another template. - -### What memory-wall looked like - -The acoustic foam wall to the right of the subject took ~40% of frame width, tilted ~13° toward the viewer, mid-grey color, uniform dimpled texture. Perfect. Text with `rotateY(-13deg)` and overlay blend sat on it like printed letters. - -### Anti-examples (wall-embed would FAIL) - -- **champion / demo1_avatarv** — bookshelf background with books, white vases, picture frames. Cluttered + 3D depth. Fails condition 1 and 4. Used corner-column-crown instead. -- **Jobs 60 Minutes** — blurry potted plant background. No flat surface at all. Fails condition 1. -- **Randy Pausch "Time is all we have"** — completely black backdrop. No perspective to exploit, no mid-tone surface. Fails 2 and 3. Used portrait-header. -- **Any vlog / selfie with handheld camera** — surface moves frame-to-frame, can't lock perspective. Even if conditions 1-4 hold briefly, motion breaks the illusion. - -## corner-column-crown — "text sits in a clean region next to the subject" - -The default for most talking-head content. Works when wall-embed doesn't. - -### Conditions - -1. **Single subject, fixed camera.** Handheld is tolerable if drift is small. -2. **At least one clean zone (≥ 15% of frame width) to the left or right of the subject** where captions can sit without continuous body occlusion. -3. **Background can be cluttered or 3D** — we're not relying on a flat surface, just readable contrast. Screen blend mode picks up darker backgrounds (bookshelves, dark walls) naturally. -4. **Landscape aspect** (16:9 or similar). For portrait, use `portrait-header`. - -### When to add the crown vs when to skip it - -- Add crown if there's a natural "title drop" line — the one phrase that lands the story (e.g. "WIMBLEDON CHAMPION", "BEATLES", "SHARP AGAIN"). Check [layout-heuristics.md § Crown placement](layout-heuristics.md) for the three geometric conditions. -- Skip crown for factual / neutral monologues where no phrase carries the climax. Short videos (<10s) often don't need it. - -## portrait-header — "subject fills center, text lives in top banner" - -For 9:16 aspect where the subject inevitably fills the middle. - -### Conditions - -1. **Portrait aspect** (9:16, 1080×1920 etc.). -2. **Subject occupies the vertical middle of frame**, leaving ~15-25% of the frame height clear at the top. -3. **Optional crown at bottom** — only works if there's also clean space beneath the subject's waist, which is rare in close-crop portrait. - -### What to watch - -- Subject's head top often approaches y=40 — top banner captions at `top: 30px` will get partially occluded by hair. Accept the partial occlusion (it reads as embed) or bump the caption size down to clear the hair. -- If the subject already has **baked-in captions** (like the burned-in subtitles test case with yellow subtitles burned in), the skill should refuse — two caption systems compete. - -## Quick decision flow - -``` -START - │ - ├─ Aspect is 9:16 / portrait? - │ ├─ YES → portrait-header - │ └─ NO ──▼ - │ - ├─ Does the scene have a flat uniform surface that passes - │ ALL 4 wall-embed conditions? - │ ├─ YES → wall-embed - │ └─ NO ──▼ - │ - ├─ Single subject + fixed camera + ≥15% clean zone on one side? - │ ├─ YES → corner-column-crown - │ └─ NO ──▼ - │ - └─ Refuse with reason: - "No flat surface for embed, no clean caption zone for column. - Suggest a classic lower-third instead." -``` - -## Mode checklist (run this before committing to wall-embed) - -Read 3 frames (start, mid, end). For each, honestly answer: - -- [ ] Is there a single surface behind/beside the subject that occupies ≥ 30% of the frame? -- [ ] Is that surface relatively flat (not curved, not 3D-stacked shelving)? -- [ ] Does that surface angle at 5-20° to the camera (not perfectly parallel, not warped)? -- [ ] Is the surface mid-luminance (not near-black like dark bookshelves, not near-white like a sunny window)? -- [ ] Does the surface contain NO printed/decorative elements that compete with caption text? -- [ ] Does the surface remain visible across all 3 frames (subject doesn't step in front of it)? - -**Need all six YES to use wall-embed.** Even one NO → step down to corner-column-crown or portrait-header. diff --git a/.agents/skills/embedded-captions/references/typographic-moves.md b/.agents/skills/embedded-captions/references/typographic-moves.md deleted file mode 100644 index d03af29..0000000 --- a/.agents/skills/embedded-captions/references/typographic-moves.md +++ /dev/null @@ -1,266 +0,0 @@ -# Typographic moves — a palette, not a cage - -`cinematic-cream` template locks DNA only (font-family, motion, color -palette defaults). It does NOT enforce slot structure. The agent writes -each caption group's typography from scratch via the plan.json `css` -field. - -This doc is a **palette** of tried combinations — pick what fits the -scene, invent new ones, skip these if the content demands. These are -recommendations, not rules. - -## Size vs text length — DO THIS BEFORE PICKING SIZE - -Bigger is NOT better if the word doesn't fit the frame width. Every time -you pick a font-size, sanity-check against word length: - -**Rough rule for Inter 900 uppercase at -0.03em tracking:** -`max_font_px ≈ frame_width / (longest_word_chars × 0.72)` - -The 0.72 multiplier is intentionally conservative — it targets the text -filling ~90% of the frame width so there's a small side margin. If you -want edge-to-edge, drop to 0.65, but you lose a bit of safety margin. - -720px portrait: - -- 3-char word (15%): max ~330px (a single big number like "15%") -- 5-char word (TAKE): max ~200px -- 7-char word (AUGMENT / QUANTUM / MATTERS): max ~143px -- 10-char word (CREATIVITY): max ~100px -- 13-char word (UNPRECEDENTED): max ~77px - -1920px landscape: - -- 7-char word: max ~380px -- 10-char word: max ~267px - -For italic/upright 500-700 it's slightly narrower — increase max by ~10%. - -**If you want the word bigger than it fits:** - -- Split into multiple words per group (natural wrap), OR -- Add explicit `
` between syllables, OR -- Drop letter-spacing to -0.05em, OR -- Accept that the matte will cut part of it (Vogue-cover embed effect — - only works when the cut area is exactly where the subject is) - -Never let the text OVERFLOW the frame edge — that's not cinematic, that's -just broken. Use the heuristic. - -## Sizing discipline (frame-height-relative) - -Portrait 9:16 (720×1290) and landscape 16:9 (1920×1080) have very -different comfort ranges. Use `calc( * var(--h))` for responsive: - -| Feel | % of frame height | Example calc | -| ---------------------- | ----------------- | ----------------------- | -| Whisper / label | 4-6% | `calc(0.05 * var(--h))` | -| Soft opener | 6-9% | `calc(0.07 * var(--h))` | -| Narrative body | 9-14% | `calc(0.11 * var(--h))` | -| Emphasis | 14-22% | `calc(0.18 * var(--h))` | -| Climax / monumental | 22-35% | `calc(0.28 * var(--h))` | -| Title-bigger-than-face | 40%+ | `calc(0.48 * var(--h))` | - -Use absolute px only when a specific scale needs to look identical -across frame sizes (rare). Prefer `calc` + `var(--h)`. - -## Named moves — pick per group - -**Italic contemplative opener** (memory-wall cap-1 lineage): - -```css -font-weight: 600; -font-style: italic; -letter-spacing: -0.01em; -font-size: calc(0.075 * var(--h)); -``` - -**Italic continuation / dreamier continuation** (cap-2 lineage): - -```css -font-weight: 500; -font-style: italic; -letter-spacing: -0.005em; -font-size: calc(0.065 * var(--h)); -``` - -**Upright pivot / statement** (cap-3 lineage — "but suddenly"): - -```css -font-weight: 700; -letter-spacing: -0.015em; -font-size: calc(0.07 * var(--h)); -``` - -**Uppercase climax / monumental** (cap-4 lineage — "EVERYTHING IS SHARP AGAIN"): - -```css -font-weight: 900; -text-transform: uppercase; -letter-spacing: -0.03em; -line-height: 0.95; -font-size: calc(0.18 * var(--h)); -``` - -**Chapter card / full-frame Adam Curtis manifesto**: - -```css -font-weight: 700; -text-transform: uppercase; -letter-spacing: -0.015em; -line-height: 0.9; -font-size: calc(0.14 * var(--h)); -``` - -**News chyron / broadcast label** (small, locked): - -```css -font-weight: 500; -letter-spacing: 0.02em; -font-size: calc(0.038 * var(--h)); -``` - -**Tiny side note / caption-on-surface**: - -```css -font-weight: 400; -font-style: italic; -font-size: calc(0.045 * var(--h)); -``` - -**Vogue-masthead monumental**: - -```css -font-weight: 900; -text-transform: uppercase; -letter-spacing: -0.04em; -line-height: 0.85; -font-size: calc(0.32 * var(--h)); -``` - -## Narrative arcs (suggestions, not required) - -**Poem arc** — memory-wall canonical: italic opener → italic continuation -→ upright pivot → uppercase climax. Four steps. - -**Question-answer arc**: italic question small → uppercase answer big. -Two steps. - -**List-of-three arc**: three equal-weight narration segments, one -climactic uppercase. Four steps. - -**Single-statement arc**: one monumental uppercase held long. One step. - -**Whisper-hook arc** (short-form): tiny italic hook → massive uppercase -reveal. Two steps. - -The **number** of groups comes from the **content**. A 25s Pausch talk -has ~8 beats. A 7s TikTok hook has 2-3 beats. Don't force 4 or 5 or 7 — -read the transcript and mark breath-groups. - -## Position + layer vocabulary - -**Position** is where the caption lives in frame. Use: - -- `top / left / right / bottom` (percentages or px) for anchor -- `transform: translateX/Y` for fine offsets -- `text-align: center / left / right` for alignment - -**Layer** per group: - -- `bg` (default) — behind subject. Matte occludes. Cinematic embed. Works - on clean zones (sky, walls) OR intentionally crosses subject for the - Vogue-masthead effect. -- `fg` — on top of subject. Announcement. Use for climax breakthroughs or - when bg would be 100% occluded by body. - -**Tone** per group: - -- `soft` — gentle per-word opacity+y drift (0.45s power2.out). Use for - introspective, dreamy, or narrative content. -- `present` — snappy per-word opacity+y+scale pop (0.22s power3.out). Use - for emphatic or declarative beats. - -## Anti-patterns the DNA protects against - -The DNA defaults prevent most ugly outcomes. But avoid in per-group CSS: - -- Multiple different `font-family` within one video (DNA is one family) -- Multiple saturated colors (one accent at most; DNA defaults cream or - deep warm) -- `letter-spacing` above ±0.05em unless there's a specific reason -- `font-weight` 300 or below — too light for screen -- `font-style: italic` on emphasis — italic is for lyricism, not stress - -## When cinematic-cream is wrong - -This DNA assumes mid-to-dark backgrounds (luminance 60-180). For: - -- Bright white studios → cinematic-cream's cream + `screen` washes out, and the DNA is - **locked** (you cannot recolour it) → use **Standard mode** (opaque rail) instead -- Documentary formal → Standard mode (documentary-dignified direction; see references/direction-catalog.md §1) -- Energetic vlog hooks → future `kinetic-vlog` DNA (not yet shipped) - -## Example: memory-wall original, expressed in freeform - -Same output as the canonical memory-wall.html, but using slot-free plan: - -```json -{ - "template": "cinematic-cream", - "caption_layer": "bg", - "groups": [ - { - "id": "cg-0", - "tone": "soft", - "in": 0.2, - "out": 4.85, - "css": "top: 14%; right: 6%; left: auto; text-align: right; font-size: calc(0.09 * var(--h)); font-weight: 600; font-style: italic; letter-spacing: -0.01em;", - "words": [ - { "text": "Some", "start": 0.24, "end": 0.44 }, - { "text": "memories", "start": 0.48, "end": 0.82 }, - { "text": "feel", "start": 0.92, "end": 1.14 }, - { "text": "soft", "start": 1.2, "end": 1.64 } - ] - }, - { - "id": "cg-1", - "tone": "soft", - "in": 2.55, - "out": 4.85, - "css": "top: 26%; right: 10%; left: auto; text-align: right; font-size: calc(0.075 * var(--h)); font-weight: 500; font-style: italic;", - "words": [ - { "text": "like", "start": 2.66, "end": 2.78 }, - { "text": "old", "start": 2.88, "end": 3.02 }, - { "text": "film", "start": 3.16, "end": 3.46 } - ] - }, - { - "id": "cg-2", - "tone": "present", - "in": 4.9, - "out": 8.04, - "css": "top: 18%; right: 6%; left: auto; text-align: right; font-size: calc(0.085 * var(--h)); font-weight: 700;", - "words": [ - { "text": "but", "start": 5.04, "end": 5.18 }, - { "text": "suddenly", "start": 5.24, "end": 5.76 } - ] - }, - { - "id": "cg-3", - "tone": "present", - "in": 6.7, - "out": 8.04, - "css": "top: 32%; right: 6%; left: auto; text-align: right; font-size: calc(0.11 * var(--h)); font-weight: 900; text-transform: uppercase; letter-spacing: -0.03em; line-height: 0.95;", - "words": [ - { "text": "everything", "start": 6.82, "end": 7.14 }, - { "text": "is", "start": 7.18, "end": 7.28 }, - { "text": "sharp", "start": 7.32, "end": 7.52 }, - { "text": "again", "start": 7.58, "end": 7.92 } - ] - } - ] -} -``` - -Same visual, no slot constraint. Each group owns its typography. diff --git a/.agents/skills/embedded-captions/references/typography-presets.md b/.agents/skills/embedded-captions/references/typography-presets.md deleted file mode 100644 index b44f26c..0000000 --- a/.agents/skills/embedded-captions/references/typography-presets.md +++ /dev/null @@ -1,63 +0,0 @@ -# Typography Presets - -Five named styles corresponding to the `cap-*` CSS classes. Pick one per caption group in `plan.json` based on the line's semantic role. - -| style | CSS | Use when | -| -------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -| `intro` | 66px italic 500 | First line, filler ("You know…", "So…"), contemplative openings. Low visual weight. | -| `phrase` | 78px upright 600 | Main statement clauses. Default for most lines. | -| `emph` | 92px upright 800 | Lines with emotional peak or key achievement ("I've achieved incredible things"). | -| `dream` | 82px italic 700 | Aspirational / "was dreaming of…" style lines. Italic signals memory/imagination. | -| `crown` | 140px upright 900 uppercase | **Only for the climax line.** Used in center-stage `crown-plane`. Maximum one per composition — ideally the last caption. | - -## Tone field - -Independent of style, each group has `tone`: `soft` or `present`. - -- **soft** — gentle fade + 8px y-drift entrance, `power2.out` ease. Feels floaty, nostalgic. Use for memory, intro, dream. -- **present** — snappy 6px y + 1.04 scale pop, `power3.out`, transformOrigin center. Feels assertive, in-the-moment. Use for emphasis and crown. - -## Picking automatically - -Scan each group's words: - -1. Does it contain superlatives (incredible, best, only, never, always) or brand/proper nouns? → `emph` + `present` -2. Does it start with discourse markers (you know, so, well, look) or is it short (≤3 words)? → `intro` + `soft` -3. Does it reference dreams, hopes, memory, past tense verbs like "was dreaming"? → `dream` + `soft` -4. Is it the final sentence-clinching line and feels like a title/headline? → `crown` + `present` (only one per video) -5. Otherwise → `phrase` + (match the group's neighbors' tone; default `soft`) - -## Font-size scales with column width - -The `.cap-*` defaults in each template are tuned for a **~560px column** (the original champion composition). When the caption plane is wider than that, the fonts feel underweight — too much negative space around text. Scale up accordingly. - -| Plane width | intro | phrase | emph | dream | crown (centered, full-frame) | crown (clean-zone only) | -| ------------------- | ----- | ------ | ---- | ----- | ---------------------------- | ----------------------- | -| 460-580 px (tight) | 66 | 78 | 92 | 82 | 140 | n/a | -| 600-760 px (medium) | 78 | 108 | 128 | 100 | 220 | 118 | -| 780+ px (wide) | 90 | 128 | 150 | 116 | 260 | 140 | - -Notes: - -- Crown sizes assume landscape (1920×1080). For portrait 1080×1920, divide all crown sizes by 1.5. -- "full-frame crown" = centered, designed to span `0.8+ × frame_width` and cross the subject's body. Use only when [layout-heuristics.md § Crown placement](layout-heuristics.md) conditions pass. -- "clean-zone only crown" = crown positioned inside one clean zone, smaller font, tail letters lightly touch subject. Fallback when centered crown would eat too much. - -Also: if a plane's `rotateY` is non-trivial (say > 8°), effective visible width shrinks. Scale fonts up ~10% to compensate. - -## What NOT to do - -- Don't use more than **one crown** per render. The whole point is that it's a singular payoff. -- Don't use `emph` on more than ~30% of groups. Emphasis loses meaning when everything is emphasized. -- Don't pick `intro` for the main content just because the words are short. "I won" (2 words) is `emph` or `crown`, not `intro`. -- Don't mix `soft` and `present` alternately for no reason. Tone should follow the story arc: soft opening → present build → emph peak → (optional crown climax). - -## When scene luminance affects color choice - -The default color is warm bone-white (`#fff5df`). Adjust in the template CSS: - -- Wall is mostly warm wood / tan → keep default, or shift cooler `#e8f0ff` -- Wall is cool blue / tech-lab → push warmer `#fff0c0` -- Wall has strong primary color → desaturate default, luminance first - -These adjustments happen in the HTML template, not plan.json. If you repeatedly need different palettes, make new template variants. diff --git a/.agents/skills/embedded-captions/scripts/audio-envelope.cjs b/.agents/skills/embedded-captions/scripts/audio-envelope.cjs deleted file mode 100644 index d8bb2f9..0000000 --- a/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env node -/* - * audio-envelope.cjs — extract a per-50ms RMS loudness envelope from the source audio. - * - * node audio-envelope.cjs → /envelope.json - * - * { hop: 0.05, rms: [linear 0..1 per hop] } - * - * Used by lib-dna.cjs to couple the hero's entrance amplitude to how hard the word was - * actually SPOKEN (percentile of the hero window's loudness within the clip). ffmpeg - * astats over fixed windows — deterministic, no network, no Python. - */ -const path = require("path"); -const fs = require("fs"); -const cp = require("child_process"); - -const HOP = 0.05; - -function findSource(project) { - for (const c of ["source.mp4"].concat( - fs - .readdirSync(project) - .filter( - (f) => - /\.(mp4|mov|webm|mkv|m4v|wav|m4a|mp3)$/i.test(f) && - !/^(final|bg_plus_caps|fg_caps|rail|index)/.test(f), - ), - )) { - const p = path.join(project, c); - if (fs.existsSync(p)) return p; - } - return null; -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: audio-envelope.cjs "); - process.exit(1); - } - const src = findSource(project); - if (!src) { - console.error("[envelope] no source media found"); - process.exit(2); - } - - // asetnsamples groups audio into fixed windows; astats prints RMS per window - const sr = 16000, - n = Math.round(sr * HOP); - let out; - try { - // resample INSIDE the filter chain — an output-option -ar applies after the - // filtergraph, which would make each window n/ seconds instead of HOP - out = cp.execFileSync( - "ffmpeg", - [ - "-v", - "info", - "-i", - src, - "-map", - "a:0", - "-af", - `aresample=${sr},aformat=channel_layouts=mono,asetnsamples=n=${n}:p=0,astats=metadata=1:reset=1,ametadata=mode=print:key=lavfi.astats.Overall.RMS_level:file=-`, - "-f", - "null", - "-", - ], - { encoding: "utf8", maxBuffer: 64 * 1024 * 1024, stdio: ["ignore", "pipe", "pipe"] }, - ); - } catch (e) { - // ffmpeg writes the metadata to stdout before exiting; some containers still exit 0 — re-throw only if nothing parsed - out = (e.stdout || "") + ""; - if (!out.includes("RMS_level")) { - console.error(`[envelope] ffmpeg failed: ${e.message}`); - process.exit(2); - } - } - const rmsDb = []; - for (const line of String(out).split("\n")) { - const m = line.match(/lavfi\.astats\.Overall\.RMS_level=(-?[\d.]+|-inf)/); - if (m) rmsDb.push(m[1] === "-inf" ? -90 : Math.max(-90, parseFloat(m[1]))); - } - if (!rmsDb.length) { - console.error("[envelope] no RMS windows parsed"); - process.exit(2); - } - const rms = rmsDb.map((db) => +Math.pow(10, db / 20).toFixed(5)); // linear 0..1 - fs.writeFileSync(path.join(project, "envelope.json"), JSON.stringify({ hop: HOP, rms })); - const peakAt = rms.indexOf(Math.max(...rms)) * HOP; - console.log( - `[envelope] ${rms.length} windows @ ${HOP}s → envelope.json (loudest beat ~${peakAt.toFixed(2)}s)`, - ); -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/check-occlusion.cjs b/.agents/skills/embedded-captions/scripts/check-occlusion.cjs deleted file mode 100644 index 129d423..0000000 --- a/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env node -/* check-occlusion.cjs — pixel-perfect occlusion gate (Node port of check-occlusion-v2.py). - * Runs measure-layout.cjs (real Chromium DOM rects), reads the subject-matte alpha via sharp, - * computes per-word / per-cap occlusion. No Python. - * node check-occlusion.cjs [--strict] [--word-fail F] [--word-warn F] [--cap-fail F] [--remeasure] - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); -const cp = require("child_process"); - -function hfResolve(pkg) { - const roots = [ - process.argv[2] && path.resolve(process.argv[2]), // project-owned helper dependencies - process.env.HYPERFRAMES_ROOT, - path.resolve(__dirname, "..", "..", ".."), - path.join(os.homedir(), "Downloads", "hyperframes"), - ].filter(Boolean); - for (const root of roots) { - const cands = [path.join(root, "node_modules", pkg)]; - const bun = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bun)) - for (const d of fs.readdirSync(bun)) - if (d.startsWith(pkg + "@")) cands.push(path.join(bun, d, "node_modules", pkg)); - } catch {} - for (const c of cands) { - try { - if (fs.existsSync(c)) return require(c); - } catch {} - } - } - console.error( - `[v2] cannot find ${pkg} — install project dependencies per embedded-captions SKILL.md Runtime prerequisites`, - ); - process.exit(3); -} -const sharp = hfResolve("sharp"); - -function ensureLayoutMeasured(project, force) { - const lp = path.join(project, "_layout.json"), - idx = path.join(project, "index.html"); - let stale = force || !fs.existsSync(lp); - if (!stale && fs.existsSync(idx) && fs.statSync(idx).mtimeMs > fs.statSync(lp).mtimeMs) - stale = true; - if (stale) - cp.execFileSync("node", [path.join(__dirname, "measure-layout.cjs"), project], { - stdio: "inherit", - }); - return JSON.parse(fs.readFileSync(lp, "utf8")); -} -async function loadAlphaMask(png) { - if (!fs.existsSync(png)) return null; - const { data, info } = await sharp(png) - .ensureAlpha() - .extractChannel(3) - .raw() - .toBuffer({ resolveWithObject: true }); - return { data, W: info.width, H: info.height }; -} -function occlusionForRect(m, x, y, w, h) { - if (!m) return 0; - const x0 = Math.max(0, Math.round(x)), - y0 = Math.max(0, Math.round(y)); - const x1 = Math.min(m.W, Math.round(x + w)), - y1 = Math.min(m.H, Math.round(y + h)); - if (x1 <= x0 || y1 <= y0) return 0; - let cnt = 0, - tot = 0; - for (let yy = y0; yy < y1; yy++) { - const row = yy * m.W; - for (let xx = x0; xx < x1; xx++) { - tot++; - if (m.data[row + xx] > 128) cnt++; - } - } - return tot ? cnt / tot : 0; -} -function argf(name, d) { - const i = process.argv.indexOf(name); - return i >= 0 ? parseFloat(process.argv[i + 1]) : d; -} - -async function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: check-occlusion.cjs [--strict]"); - process.exit(1); - } - const strict = process.argv.includes("--strict"); - const wordFail = argf("--word-fail", 0.65), - wordWarn = argf("--word-warn", 0.35), - capFail = argf("--cap-fail", 0.5); - const layout = ensureLayoutMeasured(project, process.argv.includes("--remeasure")); - const framesDir = path.join(project, "frames_fg"); - if (!fs.existsSync(framesDir)) { - console.error(`[v2] missing ${framesDir}`); - process.exit(2); - } - const planPath = path.join(project, "plan.json"); - const plan = fs.existsSync(planPath) ? JSON.parse(fs.readFileSync(planPath, "utf8")) : {}; - const planLayer = plan.caption_layer || "bg"; - // Hero groups (the ONE big promoted word) are SUPPOSED to sit ON the subject — for them - // occlusion is a TARGET (~30–55%), not "minimize". Collect their ids for the advisory below. - const heroIds = new Set(); - const heroIn = {}; - for (const g of plan.groups || []) - if (g && (g.hero === true || /^(hero|crown)$/i.test(g.plane || ""))) { - heroIds.add(g.id); - heroIn[g.id] = g.in; - } - if (plan.crown_group && plan.crown_group.id) { - heroIds.add(plan.crown_group.id); - heroIn[plan.crown_group.id] = plan.crown_group.in; - } - const M = 2; // frame-edge tolerance (px) — matches check-overflow.cjs - const frameW = layout.width, - frameH = layout.height; - - const capStats = {}; - for (const sample of layout.samples) { - const png = path.join(framesDir, `f_${String(sample.frame_idx).padStart(4, "0")}.png`); - const mask = await loadAlphaMask(png); - if (!mask) continue; - for (const cap of sample.caps) { - const entry = (capStats[cap.id] ||= { layer: cap.layer || planLayer, samples: [] }); - const wordsData = []; - for (const w of cap.words || []) { - if ((w.opacity ?? 1) < 0.3) continue; - wordsData.push({ text: w.text, occlusion: occlusionForRect(mask, w.x, w.y, w.w, w.h) }); - // Frame-edge overflow — clipped SETTLED text is always wrong; a hero's first - // 0.5s is its entrance TRANSIENT (slam over-scale, streak fly-in pass through - // off-frame states by design) — judge overflow on the hold, not mid-flight. - if (heroIds.has(cap.id) && heroIn[cap.id] != null && sample.t < heroIn[cap.id] + 0.5) - continue; - const off = { - left: Math.max(0, Math.round(-w.x - M)), - right: Math.max(0, Math.round(w.x + w.w - frameW - M)), - top: Math.max(0, Math.round(-w.y - M)), - bottom: Math.max(0, Math.round(w.y + w.h - frameH - M)), - }; - const score = off.left + off.right + off.top + off.bottom; - if (score > 0 && (!entry.overflow || score > entry.overflow.score)) - entry.overflow = { text: w.text, off, score, t: sample.t }; - } - const capOccl = occlusionForRect( - mask, - cap.cap_bbox.x, - cap.cap_bbox.y, - cap.cap_bbox.w, - cap.cap_bbox.h, - ); - entry.samples.push({ - t: sample.t, - cap_occl: capOccl, - cap_bbox: cap.cap_bbox, - words: wordsData, - }); - } - } - - const failures = []; - console.log( - `[v2] ${path.basename(project)} word-fail≥${(wordFail * 100).toFixed(0)}% cap-fail≥${(capFail * 100).toFixed(0)}%`, - ); - for (const [gid, entry] of Object.entries(capStats)) { - // Frame-edge overflow applies to every layer (fg too). The skill allows the - // climax a few-px graze on the first/last letter, so only a clear glyph clip - // (>8px past an edge) is a hard FAIL; a sub-glyph graze is a WARN. - if (entry.overflow) { - const o = entry.overflow; - const maxOff = Math.max(o.off.left, o.off.right, o.off.top, o.off.bottom); - const sides = Object.entries(o.off) - .filter(([, v]) => v > 0) - .map(([s, v]) => `${s} ${v}px`) - .join(", "); - const hard = maxOff >= 8; - console.log( - ` ${gid} [overflow${hard ? "" : "-warn"}] "${o.text}" off-frame: ${sides} (@${o.t}s)` + - (hard ? " — cropped text is always wrong" : " (graze — within climax tolerance)"), - ); - if (hard && !failures.includes(gid)) failures.push(gid); - } - if (entry.layer === "fg") { - console.log(` ${gid} fg (occlusion skipped — fg renders above matte)`); - continue; - } - const capOccls = entry.samples.map((s) => s.cap_occl); - const avgCap = capOccls.length ? capOccls.reduce((a, b) => a + b, 0) / capOccls.length : 0; - const peakCap = capOccls.length ? Math.max(...capOccls) : 0; - const wordPeaks = {}; - for (const s of entry.samples) - for (const wd of s.words) - wordPeaks[wd.text] = Math.max(wordPeaks[wd.text] || 0, wd.occlusion); - const oblit = Object.entries(wordPeaks).filter(([, p]) => p >= wordFail); - const warn = Object.entries(wordPeaks).filter(([, p]) => p >= wordWarn && p < wordFail); - let status = "OK"; - // HERO caps WANT occlusion (~30–55% is the embed); the generic cap threshold would - // fail a working hero. Heroes fail only past the feasibility ceiling (68%). - const capLimit = heroIds.has(gid) ? Math.max(capFail, 0.68) : capFail; - if (oblit.length || peakCap >= capLimit) { - status = "FAIL"; - failures.push(gid); - } else if (warn.length) status = "WARN"; - let s = ""; - if (oblit.length) - s = - oblit - .slice(0, 5) - .map(([t, p]) => `${t}(${(p * 100).toFixed(0)}%)`) - .join(" ") + (oblit.length > 5 ? ` …+${oblit.length - 5}` : ""); - else if (warn.length) - s = - "[warn] " + - warn - .slice(0, 3) - .map(([t, p]) => `${t}(${(p * 100).toFixed(0)}%)`) - .join(" "); - console.log( - ` ${gid} ${entry.layer} avg ${(avgCap * 100).toFixed(0)}% peak ${(peakCap * 100).toFixed(0)}% ${status} ${s}`, - ); - // HERO target-occlusion advisory (not a failure): a hero should sit ON the subject - // (~30–55%). If it barely grazes, it reads as a small floating word, not an embed. - if (heroIds.has(gid) && peakCap < 0.15) { - // METRIC HONESTY: this advisory uses CAP-AREA occlusion, which saturates ~15% - // for a width-filled hero over a narrow subject (the 30–55% figure elsewhere is - // the safe-zones BAND metric — different denominator). If the hero already owns - // the width, "center it + make it BIG" is unactionable — stay quiet. - const widest = Math.max(...entry.samples.map((sm) => (sm.cap_bbox && sm.cap_bbox.w) || 0), 0); - if (widest >= frameW * 0.8) { - console.log( - ` ${gid} [hero-ok] peak ${(peakCap * 100).toFixed(0)}% cap-area — width-saturated hero over a narrow subject; cap-area can't reach the band target (this is the geometry, not a layout fault).`, - ); - } else { - console.log( - ` ${gid} [hero-weak] peak ${(peakCap * 100).toFixed(0)}% — hero barely crosses the subject; it should sit ON the subject (~30–55% by the safe-zones BAND metric = the embed effect). Center it (safe-zones heroAnchor) + make it BIG; don't park it in a clean margin.`, - ); - } - } - } - if (failures.length) { - const uniq = [...new Set(failures)]; - console.error(`\n[v2] ${uniq.length} cap(s) FAIL: ${uniq.join(", ")}`); - console.error( - " → occlusion: set that cap's layer to fg, OR shrink/reposition; overflow: shrink/reposition (fg won't help)", - ); - } - process.exit(strict && failures.length ? 2 : 0); -} -main().catch((e) => { - console.error("[v2]", e.message); - process.exit(1); -}); diff --git a/.agents/skills/embedded-captions/scripts/check-overflow.cjs b/.agents/skills/embedded-captions/scripts/check-overflow.cjs deleted file mode 100644 index 4acbaa5..0000000 --- a/.agents/skills/embedded-captions/scripts/check-overflow.cjs +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env node -/** - * check-overflow.cjs — mode-agnostic frame-overflow WARNING for custom mode. - * - * Template mode has check-occlusion.cjs (which also flags frame-edge overflow), - * but custom mode runs no gates. This is the cheap safety net: it loads the - * rendered index.html, seeks the GSAP timeline across the clip, and flags ANY - * visible text element (regardless of class) whose box leaves the canvas — i.e. - * captions that fall off-frame (the bug we otherwise only catch by eye). - * - * WARNING ONLY — never fails the build (custom designs may bleed intentionally). - * Exit 0 if it ran (with or without findings); exit 3 if it couldn't run. - * - * Usage: node check-overflow.cjs - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); - -const HF_ROOTS = [ - process.argv[2] && path.resolve(process.argv[2]), // project-owned helper dependencies - process.env.HYPERFRAMES_ROOT, - path.resolve(__dirname, "../../.."), - path.join(os.homedir(), "Downloads", "hyperframes"), -].filter(Boolean); -let puppeteer = null; -for (const root of HF_ROOTS) { - const cands = [path.join(root, "node_modules", "puppeteer")]; - const bunDir = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bunDir)) { - for (const d of fs.readdirSync(bunDir)) - if (d.startsWith("puppeteer@")) - cands.push(path.join(bunDir, d, "node_modules", "puppeteer")); - } - } catch { - /* ignore */ - } - for (const p of cands) { - try { - if (fs.existsSync(p)) { - puppeteer = require(p); - break; - } - } catch {} - } - if (puppeteer) break; -} -if (!puppeteer) { - console.error("[overflow] puppeteer not found"); - process.exit(3); -} - -async function main() { - const projectDir = process.argv[2]; - const htmlName = process.argv[3] || "index.html"; // Standard mode passes "rail.html" to gate the rail too - const indexPath = path.resolve(projectDir, htmlName); - if (!fs.existsSync(indexPath)) { - console.error(`[overflow] missing ${indexPath}`); - process.exit(2); - } - - const html = fs.readFileSync(indexPath, "utf8"); - const num = (re, d) => { - const m = html.match(re); - return m ? parseFloat(m[1]) : d; - }; - const W = num(/data-width="([0-9.]+)"/, 1920); - const H = num(/data-height="([0-9.]+)"/, 1080); - const DUR = num(/data-duration="([0-9.]+)"/, 8); - - const exe = - process.platform === "darwin" - ? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - : "/usr/bin/google-chrome"; - const browser = await puppeteer.launch({ - headless: "new", - executablePath: fs.existsSync(exe) ? exe : undefined, - args: [ - "--disable-web-security", - "--allow-file-access-from-files", - `--window-size=${W},${H}`, - "--disable-dev-shm-usage", - ], - }); - try { - const page = await browser.newPage(); - await page.setViewport({ width: Math.round(W), height: Math.round(H), deviceScaleFactor: 1 }); - const waitTL = async () => { - const t0 = Date.now(); - while (Date.now() - t0 < 12000) { - if (await page.evaluate(() => !!(window.__timelines && window.__timelines.main))) - return true; - await new Promise((r) => setTimeout(r, 200)); - } - return false; - }; - await page.goto(`file://${indexPath}`, { waitUntil: "load", timeout: 20000 }); - let hasTL = await waitTL(); - if (!hasTL) { - // GSAP loads from CDN — a blip leaves no timeline; retry once - await page.reload({ waitUntil: "load", timeout: 20000 }).catch(() => {}); - hasTL = await waitTL(); - } - if (!hasTL) { - // NEVER claim "ok" when we couldn't actually evaluate the animated layout. - console.error( - "[overflow] ⚠ timeline did not register (GSAP CDN blocked?) — overflow check " + - "INCONCLUSIVE; eyeball the render for off-frame captions.", - ); - await browser.close(); - process.exit(0); - } - await page.evaluate(async () => { - try { - await document.fonts.ready; - } catch {} - }); - - const times = Array.from({ length: 9 }, (_, i) => +((DUR * i) / 8).toFixed(2)); - const found = new Map(); // key text → worst offense - - for (const t of times) { - await page.evaluate((t) => { - window.__timelines.main.seek(t); - void document.body.offsetHeight; - }, t); - await new Promise((r) => setTimeout(r, 25)); - const offenders = await page.evaluate( - (W, H) => { - const M = 2; // tolerance px - const root = document.querySelector("#stage") || document.body; - const out = []; - for (const el of root.querySelectorAll("*")) { - if (el.tagName === "VIDEO" || el.tagName === "AUDIO") continue; - const own = [...el.childNodes] - .filter((n) => n.nodeType === 3) - .map((n) => n.textContent.trim()) - .join(" ") - .trim(); - if (!own) continue; - const cs = getComputedStyle(el); - if ( - cs.display === "none" || - cs.visibility === "hidden" || - parseFloat(cs.opacity) < 0.06 - ) - continue; - const b = el.getBoundingClientRect(); - if (b.width === 0 || b.height === 0) continue; - const off = { - left: Math.max(0, Math.round(-b.left - M)), - right: Math.max(0, Math.round(b.right - W - M)), - top: Math.max(0, Math.round(-b.top - M)), - bottom: Math.max(0, Math.round(b.bottom - H - M)), - }; - if (off.left || off.right || off.top || off.bottom) - out.push({ text: own.slice(0, 42), off }); - } - return out; - }, - W, - H, - ); - for (const o of offenders) { - const sides = Object.entries(o.off) - .filter(([, v]) => v > 0) - .map(([s, v]) => `${s} ${v}px`) - .join(", "); - const prev = found.get(o.text); - const score = Object.values(o.off).reduce((a, b) => a + b, 0); - if (!prev || score > prev.score) found.set(o.text, { sides, score, t }); - } - } - - if (found.size === 0) { - console.log(`[overflow] ok — no caption text leaves the ${W}x${H} frame`); - } else { - console.error( - `[overflow] ⚠ ${found.size} caption(s) leave the frame (custom mode — WARNING only, not blocking):`, - ); - for (const [text, info] of found) - console.error(` "${text}" → off-frame: ${info.sides} (@${info.t}s)`); - console.error( - `[overflow] if unintentional, reposition/resize; if it's deliberate bleed, ignore.`, - ); - } - } finally { - await browser.close(); - } -} -main().catch((e) => { - console.error("[overflow]", e.message); - process.exit(3); -}); diff --git a/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs b/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs deleted file mode 100644 index 0b921e2..0000000 --- a/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/env node -/* - * check-rail-climax.cjs — enforce the Rail ↔ climax hand-off (PIPELINE.md). - * - * node check-rail-climax.cjs - * - * The embed climax is a PROMOTED word — lifted out of the rail into the hero - * layer. It must NEVER also be revealed in the rail. This gate loads index.html - * (the climax) and rail.html (the verbatim rail) in headless Chromium, finds the - * climax's on-screen window + its word(s), then checks whether the rail reveals - * any of those same words DURING that window. If it does, the promoted word is - * duplicated on screen → exit 2 (the render aborts). Standard mode only. - * - * Conservative by design: only a CONFIRMED duplicate fails. Anything we can't - * determine (no rail.html, no puppeteer, timeline never registers, no climax) - * exits 0 — infra problems never block a render. - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); - -const HF_ROOTS = [ - process.argv[2] && path.resolve(process.argv[2]), // project-owned helper dependencies - process.env.HYPERFRAMES_ROOT, - path.resolve(__dirname, "../../.."), - path.join(os.homedir(), "Downloads", "hyperframes"), -].filter(Boolean); - -function findInBun(root, pkg, sub) { - const cands = [path.join(root, "node_modules", pkg)]; - const bunDir = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bunDir)) - for (const d of fs.readdirSync(bunDir)) - if (d.startsWith(pkg + "@")) cands.push(path.join(bunDir, d, "node_modules", pkg)); - } catch { - /* ignore */ - } - for (const c of cands) { - const p = sub ? path.join(c, sub) : c; - if (fs.existsSync(p)) return p; - } - return null; -} - -let puppeteer = null, - gsapSource = null; -for (const root of HF_ROOTS) { - if (!puppeteer) { - const p = findInBun(root, "puppeteer"); - if (p) { - try { - puppeteer = require(p); - } catch {} - } - } - if (!gsapSource) { - const g = findInBun(root, "gsap", path.join("dist", "gsap.min.js")); - if (g) gsapSource = fs.readFileSync(g, "utf8"); - } -} - -const norm = (s) => - String(s) - .toLowerCase() - .replace(/[^a-z0-9]/g, ""); -const toks = (s) => - String(s) - .split(/\s+/) - .map(norm) - .filter((t) => t.length >= 2); - -function ok(msg) { - if (msg) console.log(msg); - process.exit(0); -} // can't-determine / pass → never blocks -function fail(msg) { - console.error(msg); - process.exit(2); -} - -async function newPage(browser, W, H) { - const page = await browser.newPage(); - await page.setViewport({ width: W, height: H, deviceScaleFactor: 1 }); - if (gsapSource) { - await page.evaluateOnNewDocument(gsapSource); - await page.setRequestInterception(true); - page.on("request", (req) => { - const u = req.url(); - if (req.resourceType() === "script" && /gsap/i.test(u) && /^https?:/i.test(u)) req.abort(); - else req.continue(); - }); - } - return page; -} -async function load(page, file) { - await page.goto(`file://${file}`, { waitUntil: "load", timeout: 15000 }); - const start = Date.now(); - while (Date.now() - start < 12000) { - if (await page.evaluate(() => !!(window.__timelines && window.__timelines.main))) { - try { - await page.evaluate(async () => { - await document.fonts.ready; - }); - } catch {} - return true; - } - await new Promise((r) => setTimeout(r, 150)); - } - return false; -} -// visible text of a selector at time t, by seeking the page's main timeline. -// Visibility must be EFFECTIVE (own opacity × every ancestor's): a rail line that -// fades out as a CONTAINER leaves its word spans at opacity:1 — checking only the -// span's own style false-positives on text that is actually invisible. -async function visibleAt(page, t, selector, childSel) { - return page.evaluate( - (t, selector, childSel) => { - const tl = window.__timelines.main; - tl.seek(t); - void document.body.offsetHeight; - const eff = (el) => { - let o = 1, - n = el; - while (n && n.nodeType === 1) { - const cs = getComputedStyle(n); - if (cs.display === "none" || cs.visibility === "hidden") return 0; - o *= +cs.opacity; - n = n.parentElement; - } - return o; - }; - const out = []; - for (const el of document.querySelectorAll(selector)) { - if (eff(el) < 0.05) continue; - const kids = childSel ? [...el.querySelectorAll(childSel)] : []; - if (kids.length) { - for (const k of kids) { - if (eff(k) > 0.05) out.push(k.textContent); - } - } else if ((el.textContent || "").trim()) out.push(el.textContent); - } - return out.join(" ").trim(); - }, - t, - selector, - childSel, - ); -} - -async function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) ok("[rail-climax] usage: check-rail-climax.cjs "); - const indexPath = path.join(project, "index.html"); - const railPath = path.join(project, "rail.html"); - if (!fs.existsSync(railPath) || !fs.existsSync(indexPath)) - ok("[rail-climax] no rail.html+index.html — not Standard, skipping"); - if (!puppeteer) - ok( - "[rail-climax] puppeteer unavailable — skipping (install project dependencies per embedded-captions SKILL.md Runtime prerequisites)", - ); - - const exe = - process.platform === "darwin" - ? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - : "/usr/bin/google-chrome"; - let browser; - try { - browser = await puppeteer.launch({ - headless: "new", - executablePath: fs.existsSync(exe) ? exe : undefined, - args: ["--disable-web-security", "--allow-file-access-from-files", "--disable-dev-shm-usage"], - }); - } catch (e) { - ok(`[rail-climax] could not launch Chromium — skipping (${e.message})`); - } - - try { - // index.html → climax window + climax word tokens - const ip = await newPage(browser, 1920, 1080); - if (!(await load(ip, indexPath))) - ok("[rail-climax] index timeline never registered — skipping"); - const dur = - +(await ip.evaluate(() => { - const r = document.querySelector("#root") || document.querySelector("[data-duration]"); - return (r && r.dataset && r.dataset.duration) || 0; - })) || 30; - const STEP = 0.1; - const climaxTokens = new Set(); - let winIn = null, - winOut = null; - for (let t = 0; t <= dur + 0.001; t += STEP) { - const txt = await visibleAt(ip, +t.toFixed(2), ".climax", "span,.w"); - if (txt) { - toks(txt).forEach((w) => climaxTokens.add(w)); - if (winIn === null) winIn = t; - winOut = t; - } - } - if (!climaxTokens.size || winIn === null) - ok("[rail-climax] no visible climax found in index.html — skipping"); - - // rail.html → words visible during [winIn, winOut] - const rp = await newPage(browser, 1920, 1080); - if (!(await load(rp, railPath))) ok("[rail-climax] rail timeline never registered — skipping"); - const hits = new Map(); // token -> first t seen - for (let t = Math.max(0, winIn - STEP); t <= winOut + 0.001; t += STEP) { - const railToks = new Set(toks(await visibleAt(rp, +t.toFixed(2), ".w", null))); - for (const w of climaxTokens) if (railToks.has(w) && !hits.has(w)) hits.set(w, +t.toFixed(2)); - } - - if (hits.size) { - const list = [...hits.entries()] - .map(([w, t]) => `"${w}" (rail shows it at t=${t}s)`) - .join(", "); - fail( - `[rail-climax] ✗ DUPLICATE PROMOTED WORD: the climax word(s) ${[...climaxTokens].map((w) => `"${w}"`).join(", ")} ` + - `are on screen during the climax window [${winIn.toFixed(2)}–${winOut.toFixed(2)}s], ` + - `and the rail ALSO reveals: ${list}.\n` + - ` The promoted word must be handed off, never duplicated — see PIPELINE.md "Rail ↔ climax hand-off":\n` + - ` freeze the rail before the promoted word, let the climax carry it, hold the climax across the rail's\n` + - ` page-flip, and exit it at the end of the thought. The rail must never reveal the promoted word.`, - ); - } - console.log( - `[rail-climax] ✓ ok — promoted word(s) ${[...climaxTokens].map((w) => `"${w}"`).join(", ")} not duplicated in the rail (window ${winIn.toFixed(2)}–${winOut.toFixed(2)}s)`, - ); - } finally { - await Promise.race([browser.close().catch(() => {}), new Promise((r) => setTimeout(r, 8000))]); - } -} -main() - .then(() => process.exit(0)) - .catch((e) => { - console.error(`[rail-climax] (skipped — ${e.message})`); - process.exit(0); - }); diff --git a/.agents/skills/embedded-captions/scripts/check-timing.cjs b/.agents/skills/embedded-captions/scripts/check-timing.cjs deleted file mode 100644 index e4fad56..0000000 --- a/.agents/skills/embedded-captions/scripts/check-timing.cjs +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env node -/* check-timing.cjs — verify plan.json word timings vs transcript.json (1:1 port of check-timing.py). - * node check-timing.cjs [--strict] - */ -const path = require("path"); -const fs = require("fs"); - -const DRIFT_TOL = 0.08; -const CREATIVE_SUBS = { - "15%": ["fifteen", "percent"], - "1/3": ["one", "third"], - "2x": ["two", "times"], -}; -const norm = (s) => - String(s) - .replace(/^[ .,?!"']+|[ .,?!"']+$/g, "") - .toLowerCase(); -const splitPacked = (t) => - String(t) - .split(/
|\s+/) - .filter(Boolean); - -function estimateVerticalBand(css, words, fw, fh) { - const top = css.match(/top:\s*(-?[\d.]+)%/); - if (!top) return null; - const topPct = parseFloat(top[1]); - const sizeM = css.match(/font-size:\s*calc\(\s*([\d.]+)\s*\*\s*var\(--h\)\s*\)/); - const fontPx = sizeM ? parseFloat(sizeM[1]) * fh : 0.05 * fh; - const lhM = css.match(/line-height:\s*([\d.]+)/); - const lh = lhM ? parseFloat(lhM[1]) : 1.1; - const charW = /uppercase/i.test(css) ? 0.72 : 0.6; - let lineCount = 1, - cur = 0; - const spaceW = fontPx * 0.3; - for (const w of words) { - const parts = String(w.text).split(/
/); - parts.forEach((part, i) => { - const pw = part.length * fontPx * charW; - if (i > 0) { - lineCount++; - cur = pw; - } else { - const test = cur + (cur > 0 ? spaceW : 0) + pw; - if (test > fw && cur > 0) { - lineCount++; - cur = pw; - } else cur = test; - } - }); - } - return [topPct, topPct + (100 * (lineCount * fontPx * lh)) / fh]; -} - -function check(project, strict) { - const plan = JSON.parse(fs.readFileSync(path.join(project, "plan.json"), "utf8")); - const t = JSON.parse(fs.readFileSync(path.join(project, "transcript.json"), "utf8")); - const seq = (t.words || []) - .filter((w) => w.type === "word") - .map((w) => [norm(w.text), w.start, w.end]); - const issues = []; - const fw = plan.width || 720, - fh = plan.height || 1290; - const groups = plan.groups || []; - const bands = groups.map((g) => - g.plane - ? [g.id || "?", g.in, g.out, null, true] - : [ - g.id || "?", - g.in, - g.out, - estimateVerticalBand(g.css || "", g.words || [], fw, fh), - g.allow_overlap || false, - ], - ); - for (let i = 0; i < bands.length; i++) { - const [gi, ai, bi, bbi, oki] = bands[i]; - if (!bbi) continue; - for (let j = i + 1; j < bands.length; j++) { - const [gj, aj, bj, bbj, okj] = bands[j]; - if (!bbj || oki || okj) continue; - if (Math.min(bi, bj) - Math.max(ai, aj) <= 0.05) continue; - if (Math.min(bbi[1], bbj[1]) - Math.max(bbi[0], bbj[0]) > 2.0) - issues.push( - `[${gi}↔${gj}] groups overlap in time (${Math.max(ai, aj).toFixed(2)}–${Math.min(bi, bj).toFixed(2)}s) AND vertically (band ${Math.max(bbi[0], bbj[0]).toFixed(0)}%–${Math.min(bbi[1], bbj[1]).toFixed(0)}%) — reposition one or add "allow_overlap": true if deliberate.`, - ); - } - } - let ti = 0; - for (const g of groups) { - const gid = g.id || "?", - gin = g.in, - gout = g.out; - const ws = (g.words || []).map((w) => w.start), - we = (g.words || []).map((w) => w.end); - if (ws.length && gin != null) { - const e = Math.min(...ws); - if (e < gin - 0.01) - issues.push( - `[${gid}] group.in=${gin.toFixed(2)} but earliest word starts at ${e.toFixed(2)} — word delayed by ${(gin - e >= 0 ? "+" : "") + (gin - e).toFixed(2)}s. Lower group.in.`, - ); - } - if (we.length && gout != null) { - const l = Math.max(...we); - if (l > gout + 0.01) - issues.push( - `[${gid}] group.out=${gout.toFixed(2)} but latest word ends at ${l.toFixed(2)} — word clipped. Raise group.out.`, - ); - } - for (const w of g.words || []) { - // Exact pairing: a compiler that KNOWS the transcript index emits `ti` — - // duplicate words then pair by POSITION, not text-search (which grabs the - // first occurrence and reports a phantom drift). Sanity-check the text; on - // mismatch fall back to the text matcher below. - if ( - Number.isInteger(w.ti) && - seq[w.ti] && - seq[w.ti][0] === norm(splitPacked(w.text)[0] || "") - ) { - const drift = w.start - seq[w.ti][1]; - if (Math.abs(drift) > DRIFT_TOL) - issues.push( - `[${gid}] '${norm(w.text)}': plan=${w.start.toFixed(3)} transcript=${seq[w.ti][1].toFixed(3)} drift ${(drift >= 0 ? "+" : "") + drift.toFixed(3)}s`, - ); - ti = w.ti + 1; - continue; - } - const parts = splitPacked(w.text).map(norm); - parts.forEach((part, pi) => { - if (!part) return; - if (part in CREATIVE_SUBS) { - for (const sub of CREATIVE_SUBS[part]) { - const j = seq.findIndex((s, k) => k >= ti && s[0] === sub); - if (j >= 0) ti = j + 1; - } - return; - } - let found = seq.findIndex((s, k) => k >= ti && s[0] === part); - if (found < 0) found = seq.findIndex((s) => s[0] === part); - if (found < 0) { - issues.push(`[${gid}] '${part}': NOT IN TRANSCRIPT (plan start=${w.start.toFixed(3)})`); - return; - } - const ts = seq[found][1]; - ti = found + 1; - if (pi === 0) { - const drift = w.start - ts; - if (Math.abs(drift) > DRIFT_TOL) - issues.push( - `[${gid}] '${part}': plan=${w.start.toFixed(3)} transcript=${ts.toFixed(3)} drift ${(drift >= 0 ? "+" : "") + drift.toFixed(3)}s`, - ); - } else - issues.push( - `[${gid}] '${part}' packed with '${parts[0]}': transcript=${ts.toFixed(3)} but entry has no distinct timing — split into separate word entries`, - ); - }); - } - } - const name = path.basename(project); - if (!issues.length) { - console.log(`${name}: timing OK ✓ (${seq.length} transcript words)`); - return 0; - } - console.log(`${name}: ${issues.length} timing issue(s):`); - for (const i of issues) console.log(` ${i}`); - return strict ? 1 : 0; -} - -const args = process.argv.slice(2).filter((a) => a !== "--strict"); -if (!args.length) { - console.error("usage: check-timing.cjs [--strict]"); - process.exit(2); -} -process.exit(check(path.resolve(args[0]), process.argv.includes("--strict"))); diff --git a/.agents/skills/embedded-captions/scripts/fill-timings.cjs b/.agents/skills/embedded-captions/scripts/fill-timings.cjs deleted file mode 100644 index 627a41b..0000000 --- a/.agents/skills/embedded-captions/scripts/fill-timings.cjs +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env node -/* - * fill-timings.cjs — fill plan.json group/word times DIRECTLY from transcript.json, - * by SEQUENCE (Cinematic mode). Kills the timing-drift + duplicate-word class of - * occlusion/timing-gate re-tries: the agent only decides the GROUPING (which words form - * each group, in spoken order); times come from the transcript by position, so the - * second "and"/"actions" matches the right occurrence (text-matching pairs the wrong one). - * - * node fill-timings.cjs - * - * Reads /plan.json (groups[].words[].text, in spoken order) + transcript.json. - * Writes /plan.json with each word's start/end and each group's in/out filled. - * A group word that can't be matched keeps whatever time it had + is reported (so a typo - * or an added word degrades gracefully instead of silently mis-timing). - */ -const path = require("path"); -const fs = require("fs"); - -const norm = (s) => - String(s == null ? "" : s) - .toLowerCase() - .replace(/[^a-z0-9]/g, ""); -const LOOKAHEAD = 40; // how far past the pointer to search for a group word (skips dropped fillers) - -function fillGroup(g, tw, state) { - const matched = []; - const unmatched = []; - for (const w of g.words || []) { - const target = norm(w.text); - if (!target) { - unmatched.push(w.text); - continue; - } - let found = -1; - for (let j = state.p; j < Math.min(tw.length, state.p + LOOKAHEAD); j++) { - if (norm(tw[j].text) === target) { - found = j; - break; - } - } - if (found >= 0) { - w.start = tw[found].start; - w.end = tw[found].end; - matched.push(w); - state.p = found + 1; - } else { - unmatched.push(w.text); - } - } - if (matched.length) { - const firstStart = +matched[0].start.toFixed(3); - const lastEnd = +matched[matched.length - 1].end.toFixed(3); - // WORD start/end are filled above (deterministic). For the group's DISPLAY window we - // only GUARANTEE it brackets the words (never clip a word) — we do NOT tighten it: - // a deliberately later `out` is the apex HOLD / sentence ACCUMULATION the author set, - // and an earlier `in` is a pre-entry. Preserve both; clamp only if they'd clip. - g.in = g.in == null ? firstStart : Math.min(g.in, firstStart); - g.out = g.out == null ? lastEnd : Math.max(g.out, lastEnd); - } - return { matched: matched.length, unmatched }; -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: fill-timings.cjs "); - process.exit(1); - } - const planPath = path.join(project, "plan.json"); - const trPath = path.join(project, "transcript.json"); - let plan, trWordsRaw; - try { - plan = JSON.parse(fs.readFileSync(planPath, "utf8")); - } catch { - console.error(`[fill-timings] no plan.json (Cinematic only) — skipping`); - process.exit(0); - } - try { - trWordsRaw = JSON.parse(fs.readFileSync(trPath, "utf8")).words || []; - } catch { - console.error(`[fill-timings] no transcript.json — skipping`); - process.exit(0); - } - const tw = trWordsRaw.filter((w) => w && "start" in w && "end" in w); - if (!tw.length) { - console.error(`[fill-timings] transcript has no word timings — skipping`); - process.exit(0); - } - - const state = { p: 0 }; - let totalMatched = 0, - totalUnmatched = 0; - const groups = plan.groups || []; - // crown_group (if any) is spoken last in the standard templates; process groups in order, crown after. - const ordered = [...groups]; - for (const g of ordered) { - const r = fillGroup(g, tw, state); - totalMatched += r.matched; - totalUnmatched += r.unmatched.length; - if (r.unmatched.length) - console.error( - `[fill-timings] ⚠ ${g.id || "(group)"}: ${r.unmatched.length} word(s) not found in transcript from here: ${r.unmatched.join(" ")}`, - ); - } - if (plan.crown_group) { - const r = fillGroup(plan.crown_group, tw, state); - totalMatched += r.matched; - totalUnmatched += r.unmatched.length; - if (r.unmatched.length) - console.error(`[fill-timings] ⚠ crown_group: ${r.unmatched.join(" ")} not found`); - } - - fs.writeFileSync(planPath, JSON.stringify(plan, null, 2)); - console.log( - `[fill-timings] filled ${totalMatched} word time(s) from transcript by sequence` + - (totalUnmatched - ? `; ${totalUnmatched} unmatched (kept prior time — check those words)` - : `; all matched ✓`), - ); - console.log( - `[fill-timings] group windows now: ${ordered.map((g) => `${g.id || "?"}[${g.in}-${g.out}]`).join(" ")}`, - ); -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/fit-fonts.cjs b/.agents/skills/embedded-captions/scripts/fit-fonts.cjs deleted file mode 100644 index 483ede2..0000000 --- a/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env node -/* - * fit-fonts.cjs — shrink any plan.json caption group whose single line would overflow - * its box, BEFORE render (Cinematic mode). Kills the "font too big → off-frame → shrink - * → re-render" overflow round. Estimates rendered width from character count × a - * per-family advance × the group's font-size, compares to the group's box width (its - * plane width, else the frame), and only ever SHRINKS to fit. Approximate by design — - * it prevents gross overflow; check-overflow.cjs remains the exact terminal check. - * - * node fit-fonts.cjs - */ -const path = require("path"); -const fs = require("fs"); - -// rough per-family advance (em per char, caps-ish). Condensed faces are narrow; pixel -// faces wide. Default is conservative. (Estimate only — gate confirms.) -const ADV = { - anton: 0.44, - oswald: 0.45, - teko: 0.4, - "saira stencil one": 0.46, - "bebas neue": 0.4, - "press start 2p": 1.05, - vt323: 0.52, - monoton: 0.62, - "special elite": 0.55, - "jetbrains mono": 0.6, - "space mono": 0.6, - "ibm plex mono": 0.6, - "source code pro": 0.6, - "archivo black": 0.62, - bangers: 0.5, - "bodoni moda": 0.5, - "playfair display": 0.52, - cinzel: 0.62, - "cormorant garamond": 0.45, - fredoka: 0.55, - "baloo 2": 0.55, - "permanent marker": 0.55, - caveat: 0.4, - orbitron: 0.66, - sora: 0.54, - "space grotesk": 0.54, -}; -const DEFAULT_ADV = 0.56; - -const cssVal = (css, prop) => { - const m = String(css || "").match(new RegExp(prop + "\\s*:\\s*([^;}]+)", "i")); - return m ? m[1].trim() : null; -}; -function familyOf(css) { - const v = cssVal(css, "font-family"); - if (!v) return "inter"; - return v - .split(",")[0] - .trim() - .replace(/^['"]|['"]$/g, "") - .toLowerCase(); -} -function sizePxOf(css, H) { - const v = cssVal(css, "font-size"); - if (!v) return null; - let m; - if ((m = v.match(/calc\(\s*([\d.]+)\s*\*\s*var\(--h\)\s*\)/i))) return parseFloat(m[1]) * H; - if ((m = v.match(/([\d.]+)\s*cqh/i))) return (parseFloat(m[1]) / 100) * H; - if ((m = v.match(/([\d.]+)\s*vh/i))) return (parseFloat(m[1]) / 100) * H; - if ((m = v.match(/([\d.]+)\s*px/i))) return parseFloat(m[1]); - return null; -} -function planeWidthPx(plan, plane, W) { - const p = plan.planes && plan.planes[plane]; - const css = p && (typeof p === "string" ? p : p.css); - const v = cssVal(css, "width"); - if (!v) return null; - let m; - if ((m = v.match(/([\d.]+)\s*%/))) return (parseFloat(m[1]) / 100) * W; - if ((m = v.match(/([\d.]+)\s*px/))) return parseFloat(m[1]); - return null; -} -function setFontSize(css, fracOfH) { - const decl = `font-size: calc(${fracOfH.toFixed(3)} * var(--h))`; - if (/font-size\s*:/i.test(css || "")) return String(css).replace(/font-size\s*:\s*[^;}]+/i, decl); - return (css ? css.replace(/\s*$/, "").replace(/;?\s*$/, "; ") : "") + decl + ";"; -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: fit-fonts.cjs "); - process.exit(1); - } - const planPath = path.join(project, "plan.json"); - let plan; - try { - plan = JSON.parse(fs.readFileSync(planPath, "utf8")); - } catch { - console.error("[fit-fonts] no plan.json (Cinematic only) — skipping"); - process.exit(0); - } - const W = plan.width || 1920, - H = plan.height || 1080; - const groups = (plan.groups || []).concat(plan.crown_group ? [plan.crown_group] : []); - const MARGIN = 0.92; // leave 8% breathing room inside the box - const HERO_MIN_FRAC = 0.18; // a hero below ~0.18·h isn't "big" — keep it punchy, widen its box instead - - let changed = 0; - for (const g of groups) { - const text = (g.words || []).map((w) => w.text).join(" "); - const nChars = text.replace(/\s/g, "").length + (g.words || []).length * 0.5; // glyphs + ~half-space gaps - if (nChars < 1) continue; - const fam = familyOf(g.css); - let adv = ADV[fam] ?? DEFAULT_ADV; - if (/text-transform\s*:\s*uppercase/i.test(g.css || "") || text === text.toUpperCase()) - adv *= 1.05; - const sizePx = sizePxOf(g.css, H); - if (!sizePx) continue; // no explicit size → template default handles it - const boxW = (g.plane ? planeWidthPx(plan, g.plane, W) : null) || W; - const usable = boxW * MARGIN; - // A WRAPPING group only overflows if a SINGLE word is wider than the box (the rest - // wraps). A NOWRAP group must fit its whole line. So don't shrink wrapping narration - // down to one line — only force the whole line for nowrap; else just the longest word. - const nowrap = /white-space\s*:\s*nowrap/i.test(g.css || ""); - const longestWord = (g.words || []).reduce( - (m, w) => Math.max(m, String(w.text || "").replace(/\s/g, "").length), - 0, - ); - const constrainChars = nowrap ? nChars : longestWord; - if (constrainChars < 1) continue; - const estW = constrainChars * adv * sizePx; - if (estW > usable) { - const newPx = usable / (constrainChars * adv); - let frac = Math.max(0.02, newPx / H); - const isHero = g.hero === true || /^(hero|crown)$/i.test(g.plane || ""); - if (isHero && frac < HERO_MIN_FRAC) { - // The hero must stay BIG. If it won't fit its box while staying punchy, the BOX is - // too narrow (the hero should span the subject) — keep it at the floor + flag it, - // rather than silently shrinking the peak into a small word. - frac = HERO_MIN_FRAC; - g.css = setFontSize(g.css, frac); - changed++; - console.log( - `[fit-fonts] ⚠ ${g.id || "(group)"} HERO "${text.slice(0, 28)}" won't fit box ${Math.round(usable)}px while staying big → KEPT at floor ${frac}·h. WIDEN the hero plane (it should span the subject, centered), not shrink the peak.`, - ); - continue; - } - g.css = setFontSize(g.css, frac); - changed++; - console.log( - `[fit-fonts] ${g.id || "(group)"}: "${text.slice(0, 28)}" (${nowrap ? "nowrap line" : "longest word"}) est ${Math.round(estW)}px > box ${Math.round(usable)}px → shrink to ${frac.toFixed(3)}·h (${Math.round(newPx)}px)`, - ); - } - } - if (changed) { - fs.writeFileSync(planPath, JSON.stringify(plan, null, 2)); - console.log(`[fit-fonts] shrank ${changed} group(s) to fit; wrote plan.json`); - } else console.log("[fit-fonts] all groups fit their box — no change"); -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/fixtures/heroless/theme.json b/.agents/skills/embedded-captions/scripts/fixtures/heroless/theme.json deleted file mode 100644 index c16e6a7..0000000 --- a/.agents/skills/embedded-captions/scripts/fixtures/heroless/theme.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "width": 1280, - "height": 720, - "fps": 24, - "duration": 6, - "lines": [ - ["quiet", "captions"], - ["continue", "without"], - ["a", "hero"] - ] -} diff --git a/.agents/skills/embedded-captions/scripts/gen-stroke-path.py b/.agents/skills/embedded-captions/scripts/gen-stroke-path.py deleted file mode 100644 index b53d6dd..0000000 --- a/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -"""gen-stroke-path.py — generalized draw-on path generator. - -Lays out ANY word in a single-line (pen-path) SVG font — Hershey/EMS — and emits -one continuous-dash-revealable path `d`. The glyph data IS the pen path, so -stroke-order reveal is exact by construction for any text, no per-word tuning. - -Usage: gen-stroke-path.py -Prints: the path `d` string + layout info on stderr. -""" -import re, sys - -# Windows sizes stdio to the ANSI code page (cp1252). These scripts emit UTF-8 on -# every platform; say so rather than depending on the console's code page. Carry -# `errors` across: reconfigure() resets it to "strict", and CPython deliberately gives -# stderr "backslashreplace" so the diagnostic path can never itself raise. -for _stream in (sys.stdout, sys.stderr): - if hasattr(_stream, "reconfigure"): - _stream.reconfigure(encoding="utf-8", errors=_stream.errors) - -font_path, text, target_w, baseline_y, x0 = ( - sys.argv[1], sys.argv[2], float(sys.argv[3]), float(sys.argv[4]), float(sys.argv[5])) - -# SVG fonts are UTF-8 and each glyph's `unicode="…"` attribute IS a literal character. -# Decoded with the platform default, a non-ASCII glyph key silently becomes the wrong -# character (or raises) on Windows, so that glyph never matches the requested text. -svg = open(font_path, encoding="utf-8").read() -glyphs = {} -for m in re.finditer(r']*?horiz-adv-x="([\d.]+)"(?:[^>]*?d="([^"]*)")?', svg): - ch, adv, d = m.group(1), float(m.group(2)), m.group(3) or "" - glyphs[ch] = (adv, d) -# default advance for space -space_adv = glyphs.get(" ", (300, ""))[0] - -# total advance width in font units -total = 0.0 -for ch in text: - total += glyphs.get(ch, (space_adv, ""))[0] -s = target_w / total # scale font-units → px - -out = [] -cursor = 0.0 -NUM = re.compile(r"[-\d.]+") -for ch in text: - adv, d = glyphs.get(ch, (space_adv, "")) - if d: - # polylines only (M/L): transform every coordinate pair - toks = re.findall(r"([ML])\s+([-\d.]+)\s+([-\d.]+)", d) - for cmd, xs, ys in toks: - x = x0 + (cursor + float(xs)) * s - y = baseline_y - float(ys) * s # SVG-font y is UP; flip - out.append(f"{cmd} {x:.1f} {y:.1f}") - cursor += adv - -print(" ".join(out)) -print(f"[gen] chars={len(text)} scale={s:.3f} width={total*s:.0f}px " - f"subpaths={sum(1 for o in out if o.startswith('M'))}", file=sys.stderr) diff --git a/.agents/skills/embedded-captions/scripts/hf-cli.cjs b/.agents/skills/embedded-captions/scripts/hf-cli.cjs deleted file mode 100644 index 6786380..0000000 --- a/.agents/skills/embedded-captions/scripts/hf-cli.cjs +++ /dev/null @@ -1,33 +0,0 @@ -// Resolve CLI ownership once for matting, transcription, and shell rendering. -const fs = require("node:fs"); -const path = require("node:path"); -const os = require("node:os"); -function hfCli(checkout) { - const root = path.resolve(__dirname, "../../.."); - for (const dir of [checkout, process.env.HYPERFRAMES_ROOT].filter(Boolean)) { - const cli = path.join(dir, "packages/cli/dist/cli.js"); - if (fs.existsSync(cli)) return cli; - } - const manifests = [ - "plugin.json", - ".claude-plugin/plugin.json", - ".codex-plugin/plugin.json", - ".cursor-plugin/plugin.json", - "gemini-extension.json", - ]; - if ( - !fs.existsSync(path.join(root, "packages/cli/dist/cli.js")) && - manifests.some((p) => fs.existsSync(path.join(root, p))) - ) { - return path.join(root, "skills/hyperframes/scripts/plugin-cli.mjs"); - } - for (const dir of [root, path.join(os.homedir(), "Downloads/hyperframes")].filter(Boolean)) { - const cli = path.join(dir, "packages/cli/dist/cli.js"); - if (fs.existsSync(cli)) return cli; - } - throw new Error( - "HyperFrames CLI unavailable: install the full plugin or set HYPERFRAMES_ROOT to a built checkout.", - ); -} -module.exports = { hfCli }; -if (require.main === module) console.log(hfCli(process.argv[2])); diff --git a/.agents/skills/embedded-captions/scripts/inject-fonts.cjs b/.agents/skills/embedded-captions/scripts/inject-fonts.cjs deleted file mode 100644 index b3994a2..0000000 --- a/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env node -/* - * inject-fonts.cjs — inline the @font-face blocks each HTML actually uses. - * - * node inject-fonts.cjs [file.html ...] - * - * hyperframes' renderer only auto-supplies its ~18 CANONICAL_FONTS. Every other - * family (Anton, Bangers, VT323, Press Start 2P, …) falls back to a generic font - * unless the HTML ships a local @font-face — even when it "looks fine" locally, - * because that only works when the font happens to be installed as a system font. - * On a clean/offline/CI machine it silently degrades. (hyperframes' own font - * linter flags exactly this: font_family_without_font_face.) - * - * This step reads the bundled font library (modes/standard/fonts/fonts.css — - * base64 woff2, no sub-resources), finds which of those families the HTML uses, - * and inlines just those @font-face blocks into a `, "i"), ""); - - const used = usedFamilies(html); - const already = declaredFamilies(html); - const blocks = []; - const inlined = []; - for (const fam of used) { - if (already.has(fam)) continue; - const lb = lib.get(fam); - if (!lb) continue; // canonical / system / unknown — not ours to supply - blocks.push(...lb); - inlined.push(fam); - } - if (!blocks.length) { - fs.writeFileSync(file, html); - return { file: path.basename(file), inlined: [] }; - } - const style = ``; - // Prefer right after ; fall back to before , then , then prepend. - if (/]*>/i.test(html)) html = html.replace(/]*>/i, (m0) => `${m0}\n${style}`); - else if (/<\/head>/i.test(html)) html = html.replace(/<\/head>/i, `${style}\n`); - else if (/]*>/i.test(html)) - html = html.replace(/]*>/i, (m0) => `${m0}\n${style}`); - else html = style + "\n" + html; - - fs.writeFileSync(file, html); - return { file: path.basename(file), inlined }; -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: inject-fonts.cjs [file.html ...]"); - process.exit(1); - } - const lib = loadFontLibrary(); - let files = process.argv.slice(3); - if (!files.length) files = ["index.html", "rail.html", "index_fg.html"]; - files = files.map((f) => (path.isAbsolute(f) ? f : path.join(project, f))); - - let touched = 0; - for (const f of files) { - const r = injectInto(f, lib); - if (r == null) continue; - if (r.inlined.length) { - console.log(`[inject-fonts] ${r.file}: embedded ${r.inlined.join(", ")}`); - touched++; - } else console.log(`[inject-fonts] ${r.file}: no non-canonical fonts to embed`); - } - if (!touched) - console.log(`[inject-fonts] nothing embedded (all fonts canonical/system or already declared)`); -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/lib-dna.cjs b/.agents/skills/embedded-captions/scripts/lib-dna.cjs deleted file mode 100644 index 8ab5eee..0000000 --- a/.agents/skills/embedded-captions/scripts/lib-dna.cjs +++ /dev/null @@ -1,201 +0,0 @@ -/* - * lib-dna.cjs — DNA registry loader + scene-token resolver. - * - * A DNA is a complete visual language (type, palette logic, motion grammar, hero - * orchestration) that PARAMETERIZES per scene instead of shipping fixed look files. - * The resolver folds in safe-zones.json's v2 scene measurements (palette / optics / - * lighting) and envelope.json's loudness so the compiled tokens fit THIS clip: - * - * accent — scene-sampled when the DNA says "scene" (clamped readable) - * text shadow — contact shadow cast along the measured light direction - * depth match — embed text blur follows the scene's depth-of-field - * hero amp — entrance amplitude coupled to the spoken word's loudness (RMS) - * - * Everything is read from files written by deterministic scripts — no randomness. - */ -const path = require("path"); -const fs = require("fs"); - -const SKILL_ROOT = path.resolve(__dirname, ".."); -const DNA_DIR = path.join(SKILL_ROOT, "dna"); - -// legacy template names → DNA (back-compat for existing plan.json files) -const LEGACY = { "cinematic-cream": "cream" }; - -function list() { - try { - return fs - .readdirSync(DNA_DIR) - .filter((f) => f.endsWith(".json")) - .map((f) => f.replace(/\.json$/, "")) - .sort(); - } catch { - return []; - } -} - -function load(name) { - const p = path.join(DNA_DIR, `${name}.json`); - if (!fs.existsSync(p)) { - throw new Error(`unknown DNA "${name}". Available: ${list().join(", ")}`); - } - return JSON.parse(fs.readFileSync(p, "utf8")); -} - -function readJson(p) { - try { - return JSON.parse(fs.readFileSync(p, "utf8")); - } catch { - return null; - } -} - -// ── audio impact: where does this window's loudness rank within the clip? ────── -// envelope.json = { hop, rms: [linear 0..1 per hop] } (audio-envelope.cjs) -function heroImpact(project, t0, t1) { - const env = readJson(path.join(project, "envelope.json")); - if (!env || !Array.isArray(env.rms) || !env.rms.length) return 0.6; // neutral default - const hop = env.hop || 0.05; - const i0 = Math.max(0, Math.floor(t0 / hop)), - i1 = Math.min(env.rms.length, Math.ceil(t1 / hop)); - if (i1 <= i0) return 0.6; - const span = i1 - i0; - const mean = (arr, a, b) => { - let s = 0; - for (let i = a; i < b; i++) s += arr[i]; - return s / (b - a); - }; - const target = mean(env.rms, i0, i1); - // percentile of this window vs all same-length windows across the clip - let below = 0, - total = 0; - for (let s = 0; s + span <= env.rms.length; s += Math.max(1, Math.floor(span / 2))) { - total++; - if (mean(env.rms, s, s + span) <= target) below++; - } - return total ? below / total : 0.6; -} - -// ── scene-aware token resolution ─────────────────────────────────────────────── -function resolveTokens(dna, project, opts) { - const sz = readJson(path.join(project, "safe-zones.json")) || {}; - const palette = sz.palette || {}; - const optics = sz.optics || {}; - const lighting = sz.lighting || {}; - - // accent: "scene" → sampled suggestion, else literal. - // accentMode "counter" (loud registers): the accent must FIGHT the scene's - // temperature, not harmonize with it — a sampled warm sienna inside a tungsten room - // camouflages (the warm-on-warm failure a blind review caught across three DNAs). - // Counter-pole = rotate the sampled hue 180° and push saturation/lightness hot. - let accent = - dna.palette.accent === "scene" - ? palette.accentSuggestion || dna.palette.accent_fallback || "#e3c06a" - : dna.palette.accent; - if ( - dna.palette.accentMode === "counter" && - dna.palette.accent === "scene" && - /^#([0-9a-f]{6})$/i.test(accent || "") - ) { - const n = parseInt(accent.slice(1), 16); - let r = (n >> 16) / 255, - g2 = ((n >> 8) & 255) / 255, - b = (n & 255) / 255; - const mx = Math.max(r, g2, b), - mn = Math.min(r, g2, b), - d = mx - mn; - let h = 0; - if (d > 0) { - h = mx === r ? ((g2 - b) / d) % 6 : mx === g2 ? (b - r) / d + 2 : (r - g2) / d + 4; - h *= 60; - if (h < 0) h += 360; - } - h = (h + 180) % 360; - const s = 0.85, - v = 0.92; // hot, acid, readable - const c = v * s, - x = c * (1 - Math.abs(((h / 60) % 2) - 1)), - m = v - c; - const [r2, g3, b2] = - h < 60 - ? [c, x, 0] - : h < 120 - ? [x, c, 0] - : h < 180 - ? [0, c, x] - : h < 240 - ? [0, x, c] - : h < 300 - ? [x, 0, c] - : [c, 0, x]; - const f = (q) => - Math.round((q + m) * 255) - .toString(16) - .padStart(2, "0"); - accent = `#${f(r2)}${f(g3)}${f(b2)}`; - } - - const dark = dna.palette.scheme === "dark-on-light"; - - // contact shadow along the measured light direction + a soft ambient. - // light-on-dark also gets the warm bloom layer when the DNA asks for it. - let shadowParts = []; - if (dna.optics && dna.optics.contactShadow) { - const sd = lighting.shadow || { dx: 0, dy: 3 }; - shadowParts.push(`${sd.dx}px ${sd.dy + 1}px 10px rgba(0,0,0,${dark ? 0.22 : 0.32})`); - } - shadowParts.push(dark ? "0 1px 14px rgba(0,0,0,0.10)" : "0 2px 22px rgba(0,0,0,0.28)"); - if (dna.optics && dna.optics.warmBloom) shadowParts.push("0 0 26px rgba(255,214,160,0.18)"); - const textShadow = shadowParts.join(", "); - - // depth match: embed (bg) text picks up the scene's bokeh; fg/rail stay sharp - const blurPx = (dna.optics && dna.optics.depthMatch && optics.suggestedTextBlurPx) || 0; - const baseFilter = dna.filter && dna.filter !== "none" ? dna.filter : ""; - const filterBg = `${baseFilter}${blurPx ? ` blur(${blurPx}px)` : ""}`.trim() || "none"; - const filterFg = baseFilter || "none"; - - // hero orchestration + loudness coupling — one config PER hero (scarcity is per - // beat/block, not per clip; each hero's amplitude follows ITS spoken loudness) - const heroGroups = (opts && (opts.heroGroups || (opts.heroGroup ? [opts.heroGroup] : []))) || []; - const heroes = heroGroups.map((hg) => { - const impact = heroImpact(project, hg.in, Math.min(hg.in + 0.7, hg.out)); - const amp = +((0.75 + impact * 0.5) * (hg.minor ? 0.7 : 1)).toFixed(3); // 0.75…1.25, minors damped - return { - // spread the DNA's full hero block (entrance/perLetter/glow/breathe/ripple/loom/ - // letterBlur/sheen/echoes/… — new fx fields flow through with no plumbing), - // then the per-hero computed values - ...dna.hero, - entrance: dna.hero.entrance || "emergence", - dimOthers: dna.hero.dimOthers != null ? dna.hero.dimOthers : 0.45, - id: hg.id, - minor: hg.minor === true, - in: hg.in, - out: hg.out, - amp, - heroColor: dna.palette.heroColor === "accent" ? accent : null, - }; - }); - const hero = heroes[0] || null; // back-compat single accessor - - return { - fontFamily: dna.font.family, - capColor: dna.palette.cap_color, - blend: dna.palette.blend, - accent, - textShadow, - filterBg, - filterFg, - blurPx, - motion: dna.motion, - hero, - heroes, - heroCss: (dna.hero && dna.hero.css) || "", - heroCase: (dna.hero && dna.hero.case) || "none", - heroTracking: (dna.hero && dna.hero.tracking) || "0", - dnaCss: dna.css || "", - register: dna.register, - name: dna.name, - }; -} - -module.exports = { LEGACY, list, load, resolveTokens, heroImpact }; diff --git a/.agents/skills/embedded-captions/scripts/make-cinematic.cjs b/.agents/skills/embedded-captions/scripts/make-cinematic.cjs deleted file mode 100644 index 2714950..0000000 --- a/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +++ /dev/null @@ -1,1206 +0,0 @@ -#!/usr/bin/env node -/* - * make-cinematic.cjs — compile cinematic.json → plan.json (then make-composition.cjs). - * CINEMATIC MODE, raised to BLOCK level. The agent authors thought-BLOCKS — lines of - * words, which plane each block stacks in, at most one promoted HERO word — and the - * compiler lowers that into the classic plan.json with everything deterministic - * generated, so the Cinematic failure modes seen in the wild become impossible: - * - READING ORDER by construction: lines stack in declaration order inside a flex - * plane (spoken order = visual order; a hero can never sit below later words) - * - timings from the transcript BY SEQUENCE (no hand-copied times; duplicates by position) - * - accumulate-within-block / page-flip-between-blocks rhythm generated: - * lines of a block share the block's out (they accumulate, then clear together - * when the next block's first word lands); the NEXT block enters fresh - * - hero hand-off: the promoted word is lifted OUT of its line, enters as the hero - * (its own plane, BIG) when spoken, holds to the END of its block, exits cleanly - * - fg fallback: safe-zones verdict "fg" → caption_layer:"fg" automatically - * - * node make-cinematic.cjs - * - * cinematic.json schema: - * { - * "template": "cinematic-cream", - * "width": 1920, "height": 1080, "fps": 30, - * "planes": { // layout REGIONS — place them using safe-zones.json - * "narr": "top: 14%; left: 4%; width: 26%;", // string or {css} - * "hero": null // null/absent → auto from safe-zones heroAnchor - * }, - * "blocks": [ - * { "plane": "narr", "lines": [ - * { "words": ["You","need","to"], "css": "font-size: calc(0.05*var(--h)); font-weight:600;" }, - * { "words": ["judge","us","by","the"], "css": "font-size: calc(0.062*var(--h)); font-weight:700;" }, - * { "words": ["actions"], "hero": true, - * "text": "ACTIONS", "css": "font-size: calc(0.24*var(--h)); font-weight:900; text-transform:uppercase;" }, - * { "words": ["that","we","take."], "css": "font-size: calc(0.05*var(--h));" }, - * // per-line escape hatch: "layer":"fg" lifts a line ABOVE the subject matte - * // (use when the occlusion gate reports a context line eaten by the subject) - * { "words": ["over","the","subject"], "layer": "fg" } - * ] }, - * { "plane": "narr", "lines": [ ... next thought ... ] } - * ], - * "tones": { "default": "soft", "hero": "present" } // optional - * } - * Rules: words must match the transcript verbatim in spoken order across all blocks. - * Mark at most ONE line "hero": true per clip (scarcity); its words form the hero - * (usually a single word; "text" overrides the display form). - */ -const path = require("path"); -const fs = require("fs"); - -const norm = (s) => - String(s == null ? "" : s) - .toLowerCase() - .replace(/[^a-z0-9']/g, ""); -const LOOKAHEAD = 40; - -// Authored css WITHOUT a font-size renders at browser-default ~16px (an -// invisible ribbon) and every gate still passes — observed in the cold-start -// E2E. Guarantee the default is present whenever the author omitted it. -function ensureFontSize(css, defaultDecl) { - if (!css) return defaultDecl; - return /font-size\s*:/.test(css) ? css : defaultDecl + " " + css; -} - -function die(m) { - console.error(`[make-cinematic] ${m}`); - process.exit(1); -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) die("usage: make-cinematic.cjs "); - const cj = path.join(project, "cinematic.json"); - const tj = path.join(project, "transcript.json"); - if (!fs.existsSync(cj)) die(`missing ${cj} — author it first (schema in this header)`); - if (!fs.existsSync(tj)) die(`missing ${tj} — run prepare.sh first`); - const C = JSON.parse(fs.readFileSync(cj, "utf8")); - const tr = (JSON.parse(fs.readFileSync(tj, "utf8")).words || []).filter( - (w) => w && "start" in w && "end" in w, - ); - if (!tr.length) die("transcript has no word timings"); - - // safe-zones: fg verdict + heroAnchor default - let sz = null; - try { - sz = JSON.parse(fs.readFileSync(path.join(project, "safe-zones.json"), "utf8")); - } catch {} - // author override first (borderline scenes: coverage near the line, agitated subject), - // else the safe-zones verdict. - // narration legibility follows the verdict; the HERO is judged separately — it WANTS - // occlusion (~30–55% is the product). fg for the hero is the LAST resort: only when no - // height band achieves ≤62% predicted occlusion (safe-zones heroBands). An explicit - // author caption_layer:"fg" still forces everything front. - const authorFg = C.caption_layer === "fg"; - const narrFg = authorFg || (sz && sz.recommendation === "fg"); - const hb = sz && sz.heroBands; - const heroFeasible = authorFg ? false : hb ? hb.feasible : !narrFg; - const globalFg = narrFg; // narration layer (name kept for the lowering below) - - const W = C.width || 1920, - H = C.height || 1080, - FPS = C.fps || 24; - const blocks = C.blocks || []; - if (!blocks.length) die("blocks is empty"); - - // ── sequence-match every word across blocks/lines ────────────────────────── - let p = 0; - const missing = []; - for (const b of blocks) - for (const ln of b.lines || []) { - ln._w = (ln.words || []).map((text) => { - const t = norm(text); - let f = -1; - for (let j = p; j < Math.min(tr.length, p + LOOKAHEAD); j++) - if (norm(tr[j].text) === t) { - f = j; - break; - } - if (f < 0) { - missing.push(text); - return { text, start: null, end: null }; - } - p = f + 1; - return { text, start: tr[f].start, end: tr[f].end, ti: f }; - }); - } - if (missing.length) - die( - `words not in transcript (in order): ${missing.join(" ")} — lines must match the transcript verbatim`, - ); - - // COMPLETENESS GATE — verbatim is a hard rule, so enforce it at compile time: the - // sequence matcher's lookahead can silently SKIP transcript words the author forgot - // (a real case shipped missing "in our newly released model."). Every transcript word - // must be consumed; the only legitimate drops are filler (um/uh/stutters), declared in - // cinematic.json "drops": ["um", ...]. - { - const consumed = new Set(); - for (const b of blocks) - for (const ln of b.lines || []) for (const w of ln._w) if (w.ti != null) consumed.add(w.ti); - const dropOk = new Set((C.drops || []).map(norm)); - const FILLER = new Set(["um", "uh", "er", "ah", "hmm", "mm"]); - const skipped = tr - .map((w, i) => ({ w, i })) - .filter( - ({ w, i }) => !consumed.has(i) && !dropOk.has(norm(w.text)) && !FILLER.has(norm(w.text)), - ); - if (skipped.length) - die( - `VERBATIM VIOLATION — ${skipped.length} transcript word(s) never authored (the matcher skipped them): ` + - `${skipped.map(({ w }) => `"${w.text}"`).join(" ")} — add them to a line, or declare true filler in "drops": []`, - ); - } - - // text override + multiple words double-renders (override replaces word 1, words - // 2..n still draw) — caught cold by a clean-room agent; illegal for ANY hero line. - for (const b of blocks) - for (const ln of b.lines || []) { - if (ln.hero && ln.text && (ln.words || []).length > 1) - die( - `hero line ["${(ln.words || []).join('" "')}"] has BOTH multiple words and a "text" override — drop "text" (words render verbatim; DNA case applies) or promote a single word.`, - ); - } - - // ── block windows: in = first word −lead; out = page-flip = next block's first word −0.28 (or +1.2 hold) ── - const LEAD = 0.18; - const bw = blocks.map((b) => { - const ws = (b.lines || []).flatMap((l) => l._w); - return { first: Math.min(...ws.map((w) => w.start)), last: Math.max(...ws.map((w) => w.end)) }; - }); - let srcDur = null; - try { - const cp = require("child_process"); - for (const f of ["source.mp4"].concat( - fs.readdirSync(project).filter((x) => /\.(mp4|mov|webm)$/i.test(x)), - )) { - const fp = path.join(project, f); - if (!fs.existsSync(fp)) continue; - const d = parseFloat( - cp.execFileSync( - "ffprobe", - [ - "-v", - "error", - "-show_entries", - "format=duration", - "-of", - "default=nokey=1:noprint_wrappers=1", - "--", - fp, - ], - { encoding: "utf8" }, - ), - ); - if (d > 0) { - srcDur = d; - break; - } - } - } catch {} - const DUR = +(srcDur || bw[bw.length - 1].last + 0.6).toFixed(3); - // ── SLOT layout + paging. Lines get FIXED absolute positions (no flex reflow — the - // "lower line jumps up when the upper one clears" bug is impossible by construction). - // Lines accumulate down the plane like a poem; the plane PAGE-FLIPS (all visible lines - // clear together, the next line restarts at the top) only when (a) the plane is full, - // (b) a block sets "flip": true, or (c) a block boundary coincides with a real speech - // pause (≥0.6s). Block windows (bw) are kept only for the hero's hold. - for (let i = 0; i < bw.length; i++) { - bw[i].in = Math.max(0, bw[i].first - LEAD); - bw[i].out = Math.min(DUR - 0.05, Math.min(bw[i].last, DUR - 0.05) + 0.9); - // a block's hold (incl. a LOCKUP's) yields to the NEXT block's entrance — the same - // page-flip semantics columns already have; floor: its own words must finish - if (i + 1 < bw.length) - bw[i].out = Math.max( - Math.min(bw[i].last, DUR - 0.05) + 0.15, - Math.min(bw[i].out, bw[i + 1].first - 0.28), - ); - } - const fracOfLine = (css) => { - const m = (css || "").match(/font-size\s*:\s*calc\(\s*([\d.]+)\s*\*\s*var\(--h\)/); - return m ? +m[1] : 0.05; - }; - const planeBudgetPx = (pk) => { - const css = - (C.planes && - C.planes[pk] && - (typeof C.planes[pk] === "string" ? C.planes[pk] : C.planes[pk].css)) || - ""; - const m = css.match(/height\s*:\s*([\d.]+)%/); - return (m ? +m[1] / 100 : 0.3) * H; - }; - - // ── planes: agent's + auto LOCKUP planes (one per hero block) ─────────────── - // The LOCKUP is the layout answer to "the sentence reads broken around the hero": - // a hero block's lines do NOT scatter into the narration column — kicker, HERO and - // tail compose as ONE bonded ORBIT (context anchored at the hero's edges, diagonal - // read). DEPTH: context EMBEDS (bg) with the hero — one shared depth; per-line - // `layer:"fg"` is the escape hatch when the matte eats a context line (gate tells you). - const planes = {}; - for (const [k, v] of Object.entries(C.planes || {})) { - if (v == null) continue; - let css = typeof v === "string" ? v : v.css || ""; - if (!/text-align\s*:/.test(css)) css += " text-align:center;"; // slot children are absolute; only alignment carries - planes[k] = { css }; - } - // multiple heroes allowed — scarcity is per BLOCK (≤1 per thought), not per clip. - // The LARGEST authored hero is the APEX: it gets the full lockup embed (centered on - // the subject, matte showcase). Smaller heroes are MINOR peaks: they stay IN their - // column's flow as oversized emphasis lines (fg, hero motion at reduced amplitude) — - // not every beat needs the matte showcase; that's what keeps the apex an event. - const allHeroBlocks = []; - blocks.forEach((b, bi) => { - const hs = (b.lines || []).filter((l) => l.hero === true); - if (hs.length > 1) - die( - `block ${bi} has ${hs.length} hero lines — at most ONE hero per block (scarcity = per beat)`, - ); - if (hs.length === 1) - allHeroBlocks.push({ b, bi, ln: hs[0], frac: fracOfLine(hs[0].css) || 0.24 }); - }); - const apexFracAll = Math.max(...allHeroBlocks.map((h) => h.frac), 0); - // placement: "column" keeps even an APEX in its column's flow (the hero bursts the - // column instead of crossing the subject) — the sanctioned alternative to the - // subject-anchored lockup. Author it per hero line: { "hero": true, "placement": "column" }. - const heroBlocks = allHeroBlocks.filter( - (h) => h.frac >= apexFracAll - 1e-6 && (h.ln.placement || "subject") !== "column", - ); - const minorHeroBis = new Set( - allHeroBlocks - .filter((h) => h.frac < apexFracAll - 1e-6 || (h.ln.placement || "subject") === "column") - .map((h) => h.bi), - ); - const columnApexBis = new Set( - allHeroBlocks - .filter((h) => h.frac >= apexFracAll - 1e-6 && (h.ln.placement || "subject") === "column") - .map((h) => h.bi), - ); - if (minorHeroBis.size) - console.log( - `[make-cinematic] ${minorHeroBis.size} minor hero(es) stay in the column flow (apex gets the lockup embed)`, - ); - const lockupName = (bi) => `lockup-b${bi}`; - const lockupTemplate = - C.planes && C.planes.lockup - ? typeof C.planes.lockup === "string" - ? C.planes.lockup - : C.planes.lockup.css - : null; - delete planes.lockup; // template only — not a real plane - for (const hRef of heroBlocks) { - const a = sz && sz.heroAnchor && sz.heroAnchor.plane; - // band pick: target ~40% occlusion AND a band the DNA's text can survive on - // (skip bright bands when luma data exists) — heroAnchor.yPct is the fallback - let heroTop = a ? a.yPct : 30; - if (hb && hb.profile && hb.profile.length) { - const ok = hb.profile.filter( - (b2) => b2.occPct >= 12 && b2.occPct <= 62 && (b2.bgLuma == null || b2.bgLuma <= 165), - ); - const pool = ok.length ? ok : hb.profile; - const best = pool.reduce((x, y) => - Math.abs(y.occPct - 40) < Math.abs(x.occPct - 40) ? y : x, - ); - heroTop = +(best.topPct + 6.5).toFixed(1); - } - const heroFrac = (hRef.ln.css || "").match(/calc\(\s*([\d.]+)\s*\*\s*var\(--h\)/); - // the lockup is taller than the hero alone (context above+below) — anchor so the - // HERO band (not the plane top) lands on the target, then clamp so the WHOLE - // lockup (pre + hero + post) stays on frame - const heroIdx2 = (hRef.b.lines || []).indexOf(hRef.ln); - const preH = (hRef.b.lines || []) - .filter((l, i) => l !== hRef.ln && i < heroIdx2) - .reduce( - (s, l) => - s + (fracOfLine(l.css) * 100 * 1.32 + Math.max(1.6, fracOfLine(l.css) * 100 * 0.38)), - 0, - ); - const postH = (hRef.b.lines || []) - .filter((l, i) => l !== hRef.ln && i > heroIdx2) - .reduce( - (s, l) => - s + (fracOfLine(l.css) * 100 * 1.32 + Math.max(1.6, fracOfLine(l.css) * 100 * 0.38)), - 0, - ); - const heroHpct = (heroFrac ? +heroFrac[1] : 0.24) * 100 * 1.12; - const totalH = preH + heroHpct + postH; - let top = +Math.max(2, Math.min(96 - totalH, heroTop - heroHpct / 2 - preH)).toFixed(1); - const css = lockupTemplate - ? lockupTemplate.replace(/top:\s*[\d.]+%/, `top: ${top}%`) - : a - ? `top: ${top}%; left: ${a.xPct}%; width: ${a.wPct}%; text-align: center;` - : `top: ${top}%; left: 6%; width: 88%; text-align: center;`; - planes[lockupName(hRef.bi)] = { css }; - hRef.plane = lockupName(hRef.bi); - } - // legacy alias: an author-defined "hero" plane positions the FIRST lockup - if (planes.hero) { - if (heroBlocks.length) { - planes[lockupName(heroBlocks[0].bi)] = planes.hero; - } - delete planes.hero; - } - - // ── PER-PLANE LEGIBILITY COMPENSATION ──────────────────────────────────── - // The DNA fixes hue + blend; the SCENE decides whether that survives. Match each - // plane to its best-overlapping measured zone and ladder the treatment: - // luma > 150 → opaque (blend:normal) + strong tight scrim — screen/blend washes out - // luma 95–150 → keep the DNA blend, strengthen the glyph scrim - const planeComp = {}; - if (sz && sz.zones) { - const zlist = Object.entries(sz.zones).filter(([, z]) => z && z.meanLuma != null); - for (const [pk, pv] of Object.entries(C.planes || {})) { - const css0 = typeof pv === "string" ? pv : (pv || {}).css || ""; - const lm = css0.match(/left:\s*([\d.]+)%/), - wm = css0.match(/width:\s*([\d.]+)%/); - if (!lm || !wm) continue; - const a0 = +lm[1], - a1 = a0 + +wm[1]; - let best = null, - bestOv = 0; - for (const [, z] of zlist) { - const ov = Math.min(a1, z.xPct + z.wPct) - Math.max(a0, z.xPct); - if (ov > bestOv) { - bestOv = ov; - best = z; - } - } - if (!best) continue; - // gate on the time PEAK too — a dark wall swept by a bright moving object - // (handheld drift, screens) averages "clean" but peaks hot, and text there - // washes out exactly when the bright thing passes (real cold-start case) - const pkL = best.peakLuma != null ? best.peakLuma : best.meanLuma; - if (best.meanLuma > 150 || pkL > 175) - planeComp[pk] = - " mix-blend-mode: normal; text-shadow: 0 1px 6px rgba(0,0,0,.65), 0 2px 16px rgba(0,0,0,.4);"; - else if (best.meanLuma > 95 || pkL > 135) - planeComp[pk] = " text-shadow: 0 1px 5px rgba(0,0,0,.6), 0 2px 14px rgba(0,0,0,.35);"; - if (planeComp[pk]) - console.log( - `[make-cinematic] plane "${pk}" zone luma ${best.meanLuma} (peak ${pkL}) → legibility compensation (${best.meanLuma > 150 || pkL > 175 ? "opaque+scrim" : "scrim"})`, - ); - } - } - // lockup context shares the hero band's luma - const bandLuma = sz && sz.heroAnchor && sz.heroAnchor.bandLuma; - const lockupComp = - bandLuma != null && bandLuma > 150 - ? " mix-blend-mode: normal; text-shadow: 0 1px 6px rgba(0,0,0,.65), 0 2px 16px rgba(0,0,0,.4);" - : bandLuma != null && bandLuma > 95 - ? " text-shadow: 0 1px 5px rgba(0,0,0,.6), 0 2px 14px rgba(0,0,0,.35);" - : ""; - - // ── lower to classic plan.json groups (slot layout + per-plane paging) ───── - const tones = C.tones || {}; - let dnaBodyLayer = null; - try { - const dnaLib0 = require("./lib-dna.cjs"); - const dn0 = C.dna || (C.template ? dnaLib0.LEGACY[C.template] : "cream"); - if (dn0) { - const d0 = dnaLib0.load(dn0); - dnaBodyLayer = d0.bodyLayer || null; - // category lock (symmetric): column is every classic DNA's home today, - // so this only fires if a future DNA declares a different home. - if (d0.deliveries && d0.deliveries.home && d0.deliveries.home !== "column") - console.warn( - `[make-cinematic] WARN: DNA "${dn0}" declares home="${d0.deliveries.home}" — cinematic use is cross-category and unvalidated.`, - ); - } - } catch (e) { - if (e.message && e.message.includes("does not support")) throw e; - } - const groups = []; - const heroRefs = heroBlocks; // [{b, bi, ln, plane}] - const isHeroBlock = new Set(heroBlocks.map((h) => h.bi)); - const flat = []; - blocks.forEach((b, bi) => { - const heroIdx = isHeroBlock.has(bi) ? (b.lines || []).findIndex((l) => l.hero === true) : -1; - (b.lines || []).forEach((ln, li) => { - if (ln.hero === true && isHeroBlock.has(bi)) return; // APEX heroes slot into their lockup below - flat.push({ - b, - bi, - ln, - plane: heroIdx >= 0 ? lockupName(bi) : b.plane, - lockupPos: heroIdx >= 0 ? (li < heroIdx ? "pre" : "post") : null, - isMinorHero: ln.hero === true && minorHeroBis.has(bi), // minor peak rides its column - first: Math.min(...ln._w.map((w) => w.start)), - lastEnd: Math.min(Math.max(...ln._w.map((w) => w.end)), DUR - 0.05), - frac: fracOfLine(ln.css), - }); - }); - }); - // size sanity: narration below 0.05·h is whisper-tier (36px at 720p) — warn loudly - { - const tiny = flat.filter((l) => !l.isMinorHero && l.frac > 0 && l.frac < 0.05); - if (tiny.length) - console.log( - `[make-cinematic] ⚠ ${tiny.length} narration line(s) authored below 0.05·h (whisper tier) — body narration wants 0.055–0.07·h: ${tiny - .slice(0, 3) - .map((l) => `"${l.ln.words.slice(0, 3).join(" ")}…"`) - .join(" ")}`, - ); - } - // RATIO LOCK — poster lockup typography: context is sized FROM the hero, the way a - // title system locks its eyebrow/tagline (kicker & tail ≈ 0.26× the hero height, - // clamped to [0.05, 0.085]·h). Hero dominance is structural (~4× height + weight - // contrast), so the old mass-rule downscale is gone — whisper-small context was the - // disease, not the cure. Too MUCH context is a line-count problem, never a size one. - for (const hRef of heroRefs) { - const ctx = flat.filter((l) => l.bi === hRef.bi); - if (!ctx.length) continue; - const heroFracV = fracOfLine(hRef.ln.css || "") || 0.24; - const ratioFrac = +Math.min(0.085, Math.max(0.05, heroFracV * 0.26)).toFixed(4); - if (ctx.length > 3) - console.log( - `[make-cinematic] ⚠ lockup-b${hRef.bi} has ${ctx.length} context lines — a lockup wants kicker + hero + tail; move narration to the column (a leading clause can be its own block)`, - ); - const moved = ctx.filter((l) => Math.abs(l.frac - ratioFrac) > 0.002).length; - ctx.forEach((l) => { - l.ln.css = (l.ln.css || "").replace( - /font-size\s*:\s*[^;]+/, - `font-size: calc(${ratioFrac} * var(--h))`, - ); - l.frac = ratioFrac; - }); - if (moved) - console.log( - `[make-cinematic] lockup-b${hRef.bi}: context RATIO-LOCKED to 0.26×hero → ${ratioFrac}·h (${moved} line(s) re-sized)`, - ); - } - const byPlane = {}; - flat.forEach((l) => { - (byPlane[l.plane] = byPlane[l.plane] || []).push(l); - }); - // make sure a lockup whose block has NO context lines still exists in the loop - for (const hRef of heroRefs) if (!byPlane[hRef.plane]) byPlane[hRef.plane] = []; - for (const [pk, ls] of Object.entries(byPlane)) { - const isLockup = /^lockup-b/.test(pk); - const budget = isLockup ? H : planeBudgetPx(pk); // a lockup is ONE composition — never paginate inside it - const hRef = isLockup ? heroRefs.find((h) => h.plane === pk) : null; - const heroH = hRef ? (fracOfLine(hRef.ln.css || "") || 0.24) * H * 1.12 + 12 : 0; - // ORBIT estimate: where do the hero's left/right edges land inside the (frame-wide, - // centered) lockup plane — kicker hangs off the left edge, tail off the right - let orbit = null; - if (hRef) { - const disp = String(hRef.ln.text || (hRef.ln.words || []).join(" ")); - const fpx = (fracOfLine(hRef.ln.css || "") || 0.24) * H; - const estW = Math.min( - W * 0.94, - Math.max(fpx * 1.2, disp.replace(/\s/g, "").length * fpx * 0.6), - ); - const planeCss0 = (planes[pk] && planes[pk].css) || ""; - const _pl = ((planeCss0.match(/left:\s*([\d.]+)%/) || [0, 0])[1] * W) / 100; - const pw = ((planeCss0.match(/width:\s*([\d.]+)%/) || [0, 100])[1] * W) / 100; - const heroLeft = Math.max(0, (pw - estW) / 2); - // side-aware: anchor context to the CLEANER side of THIS hero's window — the - // kicker/tail must land on scene, not on a large/moving subject - let side = (sz && sz.subject && sz.subject.clearerSide) || "left"; - try { - const hin = Math.min(...hRef.ln._w.map((w) => w.start)); - const win = (sz.windows || []).find((w2) => hin >= w2.in - 0.3 && hin <= w2.out + 0.3); - if (win && win.clearerSide) side = win.clearerSide; - } catch {} - orbit = { - left: Math.round(heroLeft), - right: Math.round(Math.max(0, pw - heroLeft - estW)), - maxW: Math.round(Math.min(estW * 0.75, pw * 0.55)), - side, - }; - } - const pages = []; - let page = [], - slot = 0; - for (const l of ls) { - // the HERO occupies its slot between pre- and post-context, in spoken order - if (hRef && hRef.slotPx == null && l.lockupPos === "post") { - hRef.slotPx = Math.round(slot); - slot += heroH; - } - const lineH = l.frac * H * 1.32 + Math.max(12, Math.round(l.frac * H * 0.38)); // ink overflows the 1.0 line-box (+shadows) — breathe in proportion to the type - const prev = page[page.length - 1]; - const pauseGap = prev ? l.first - prev.lastEnd : 0; - const boundary = prev && l.bi !== prev.bi; - // a block carrying a COLUMN-PLACED apex is one composition — never split it on - // budget (the oversized hero legitimately exceeds the column's page height) - const unbreakable = columnApexBis.has(l.bi) && prev && prev.bi === l.bi; - if ( - page.length && - !unbreakable && - (slot + lineH > budget || (boundary && l.b.flip === true) || (boundary && pauseGap >= 0.6)) - ) { - pages.push(page); - page = []; - slot = 0; - } - l.slotPx = Math.round(slot); - if (isLockup) l._orbit = orbit; - slot += lineH; - page.push(l); - } - if (hRef && hRef.slotPx == null) { - hRef.slotPx = Math.round(slot); - } // hero is the block's last line - if (page.length) pages.push(page); - pages.forEach((pg, pi) => { - const nextFirst = pi + 1 < pages.length ? pages[pi + 1][0].first : null; - const maxEnd = Math.max(...pg.map((l) => l.lastEnd)); - let out = - nextFirst != null - ? Math.max(maxEnd + 0.01, Math.min(DUR - 0.05, nextFirst - 0.28)) - : Math.min(DUR - 0.05, maxEnd + 1.2); - // THE LOCKUP OWNS THE FRAME: a sidebar page must not linger into an apex - // lockup's window (its kicker/tail can land in the same zone → text-on-text) - if (!isLockup) - for (const hRef2 of heroRefs) { - const lkIn = bw[hRef2.bi].first - 0.18; - if (lkIn > maxEnd - 0.2 && lkIn < out) - out = Math.max(maxEnd + 0.01, Math.min(out, lkIn - 0.28)); - } - pg.forEach((l, li) => { - l.pageIdx = pi; - if (!isLockup) - for (const hRef2 of heroRefs) { - const lkOut = bw[hRef2.bi].out; - const lkIn2 = bw[hRef2.bi].first - 0.18; - const enter0 = Math.max(0, l.first - LEAD); - if (enter0 > lkIn2 && enter0 < lkOut) - l._delayIn = +Math.min(l.first, Math.max(enter0, lkOut - 0.2)).toFixed(3); - } - // a LOCKUP fades as ONE unit: context lines exit with the hero (block window), - // never linger on page timing after the hero has left - l.out = l.lockupPos ? +Math.min(out, bw[l.bi].out).toFixed(3) : +out.toFixed(3); - l.in = l._delayIn != null ? l._delayIn : +Math.max(0, l.first - LEAD).toFixed(3); - // first line of a NEW page: don't enter before the old page has begun clearing - if (li === 0 && pi > 0) - l.in = +Math.min(l.first, Math.max(l.first - LEAD, pages[pi - 1][0].out - 0.02)).toFixed( - 3, - ); - }); - }); - } - let gid = 0; - for (const l of flat) { - l.gid = l.isMinorHero ? `h-${l.bi}` : `b${l.bi}-l${gid++}`; - // depth model: lockup CONTEXT embeds (bg) WITH the hero — the orbit anchors it - // beside the head/shoulder so it reads on the scene, one shared depth; narration - // columns embed too unless the DNA declares bodyLayer:"fg" (loud's announce-style). - // Minor heroes ride their column in FRONT. Per-line layer overrides any default. - // ORBIT depth: lockup context lands BESIDE the subject (kicker/tail at the hero's - // edges) — so it EMBEDS (bg) like the hero; the whole composition shares one depth. - // fg remains for: minor heroes (column emphasis), a DNA's bodyLayer (loud announces), - // scene verdict FG (globalFg), and explicit per-line "layer" overrides. - const defLayer = l.isMinorHero ? "fg" : dnaBodyLayer || "bg"; - groups.push({ - id: l.gid, - plane: l.plane, - layer: globalFg ? "fg" : l.ln.layer || l.b.layer || defLayer, - ...(l.isMinorHero ? { hero: true, ...(columnApexBis.has(l.bi) ? {} : { minor: true }) } : {}), - tone: l.isMinorHero ? tones.hero || "present" : l.ln.tone || tones.default || "soft", - allow_overlap: true, - // a MINOR hero holds only to the end of ITS thought (+a breath) — lingering with - // the page through a long pause leaves it co-visible with the next apex - in: l.in, - out: l.isMinorHero ? +Math.min(l.out, bw[l.bi].out + 0.3).toFixed(3) : l.out, - // carry the PLANE's text-align onto each slotted line (absolute children don't - // reliably inherit through the template's .cap centering — authored "right edge - // hugs the silhouette" was silently centered) - css: - (l.lockupPos && l._orbit - ? (l.ln.anchor || (l.lockupPos === "pre" ? l._orbit.side : l._orbit.side)) === "left" - ? `position:absolute;top:${l.slotPx}px;left:${l._orbit.left}px;right:auto;max-width:${l._orbit.maxW}px;text-align:left; ` - : `position:absolute;top:${l.slotPx}px;right:${l._orbit.right}px;left:auto;max-width:${l._orbit.maxW}px;text-align:right; ` - : `position:absolute;left:0;right:0;top:${l.slotPx}px; ` + - (() => { - const pc = - (C.planes && - C.planes[l.plane] && - (typeof C.planes[l.plane] === "string" - ? C.planes[l.plane] - : C.planes[l.plane].css)) || - ""; - const ta = pc.match(/text-align\s*:\s*(left|right|center)/); - return ta ? `text-align:${ta[1]}; ` : ""; - })()) + - ensureFontSize(l.ln.css, "font-size: calc(0.05 * var(--h)); font-weight: 600;") + - (l.lockupPos ? lockupComp : planeComp[l.plane] || ""), - words: l.ln._w.map((w, wi2) => ({ - // minor/column heroes honor the display-form override too (single-word lines) - text: l.isMinorHero && l.ln.text && wi2 === 0 && l.ln._w.length === 1 ? l.ln.text : w.text, - start: w.start, - end: Math.min(w.end, DUR - 0.05), - ti: w.ti, - })), - }); - } - for (const hRef of heroRefs) { - const { bi, ln } = hRef; - const w0 = ln._w[0]; - groups.push({ - id: `h-${bi}`, - hero: true, - plane: hRef.plane, - layer: ln.layer || (heroFeasible ? "bg" : "fg"), - tone: tones.hero || "present", - allow_overlap: true, - in: +Math.max(0, w0.start - 0.02).toFixed(3), - out: +bw[bi].out.toFixed(3), - css: - `position:absolute;left:0;right:0;top:${hRef.slotPx || 0}px; text-align:center; ` + - ensureFontSize( - ln.css, - "font-size: calc(0.24 * var(--h)); font-weight: 900; white-space: nowrap;", - ), // case/tracking come from the DNA's hero treatment - words: ln._w.map((w, i) => ({ - text: i === 0 && ln.text ? ln.text : w.text, - start: w.start, - end: Math.min(w.end, DUR - 0.05), - ti: w.ti, - })), - }); - if (!heroFeasible) - console.log( - "[make-cinematic] no hero band ≤62% predicted occlusion → hero rendered in FRONT (last resort)", - ); - } - // scarcity spacing: heroes must breathe apart (≥ a beat between windows) - const heroGs = groups.filter((g) => g.hero === true).sort((a, b) => a.in - b.in); - for (let i = 1; i < heroGs.length; i++) { - const gap = heroGs[i].in - heroGs[i - 1].out; - if (gap < 0.6) - console.log( - `[make-cinematic] ⚠ heroes "${heroGs[i - 1].words[0].text}" and "${heroGs[i].words[0].text}" are only ${gap.toFixed(2)}s apart — peaks need a beat of air between them (consider demoting one to an emphasis line)`, - ); - } - // proximity: narration planes should HUG the silhouette (the embed reads as in-scene - // only when typography interacts with the subject) — warn on far-parked planes. - if (sz && sz.subject) { - for (const [pk2, pv] of Object.entries(C.planes || {})) { - if (/^lockup/.test(pk2) || pk2 === "hero" || pv == null) continue; - const css2 = typeof pv === "string" ? pv : pv.css || ""; - const lm = css2.match(/left\s*:\s*([\d.]+)%/), - wm = css2.match(/width\s*:\s*([\d.]+)%/); - if (!lm || !wm) continue; - const pl = +lm[1], - pr = +lm[1] + +wm[1]; - const gap = - pr <= sz.subject.colMinPct - ? sz.subject.colMinPct - pr - : pl >= sz.subject.colMaxPct - ? pl - sz.subject.colMaxPct - : 0; - if (gap > 12) - console.log( - `[make-cinematic] ⚠ plane "${pk2}" sits ${gap.toFixed(0)}% away from the silhouette — embeds read in-scene when text HUGS the subject (use safe-zones zones.hugLeft/hugRight, gap 2–6%)`, - ); - } - } - const plan = { - mode: "template", - dna: C.dna || (C.template ? undefined : "cream"), // canonical: name a DNA; default cream - template: C.template || "cinematic-cream", - compiled_by: "make-cinematic.cjs", - width: W, - height: H, - fps: FPS, - duration: DUR, - ...(globalFg && (!heroRefs.length || !heroFeasible) ? { caption_layer: "fg" } : {}), // mixed narration-fg + hero-bg → per-group layers (hybrid render) - planes: Object.fromEntries(Object.entries(planes).map(([k, v]) => [k, { css: v.css }])), - groups, - }; - fs.writeFileSync(path.join(project, "plan.json"), JSON.stringify(plan, null, 2)); - console.log( - `[make-cinematic] ${blocks.length} block(s) → ${groups.length} group(s)` + - `${heroRefs.length ? `, ${heroRefs.length} hero(es): ${heroRefs.map((h) => `"${h.ln.text || h.ln.words[0]}"`).join(" · ")} (each holds to its block end, lockup-composed)` : ""}` + - `${globalFg ? ", caption_layer=fg (safe-zones verdict)" : ""}, canvas ${DUR}s`, - ); - // straight into the existing template compiler - const cp2 = require("child_process"); - let r = cp2.spawnSync("node", [path.join(__dirname, "make-composition.cjs"), project], { - stdio: "inherit", - }); - if ((r.status || 0) !== 0) process.exit(r.status); - - // ── RE-SLOT pass (real measurement). Compile-time slots assume each line renders as - // ONE visual line; a narrow plane WRAPS long lines and the next slot overlaps the - // wrapped tail. Measure every page's REAL text heights in Chromium and re-stack. - { - const textBoxH = (c) => { - const ws = (c.words || []).filter((w) => (w.opacity ?? 1) > 0.05 && w.w > 0); - if (!ws.length) return c.cap_bbox ? c.cap_bbox.h : 0; - return Math.max(...ws.map((w) => w.y + w.h)) - Math.min(...ws.map((w) => w.y)); - }; - const pagesByKey = {}; - for (const l of flat) { - const key = l.plane + "|" + (l.pageIdx || 0); - (pagesByKey[key] = pagesByKey[key] || { t: +(l.out - 0.1).toFixed(2), lines: [] }).lines.push( - l, - ); - } - // the HERO is a real member of its lockup's stack — re-slot must move it (and the - // post-context below it) from MEASURED heights, or a wrapped pre-line / raised hero - // font reopens the very overlap this pass exists to prevent - for (const hRef of heroRefs) { - const key = hRef.plane + "|0"; - const hg2 = groups.find((g2) => g2.id === `h-${hRef.bi}`); - if (!hg2) continue; - (pagesByKey[key] = pagesByKey[key] || { - t: +(hg2.out - 0.1).toFixed(2), - lines: [], - }).lines.push({ - gid: hg2.id, - slotPx: hRef.slotPx || 0, - frac: fracOfLine(hg2.css) || 0.24, - _hero: true, - }); - } - const times = [...new Set(Object.values(pagesByKey).map((pg) => pg.t))]; - if (times.length) { - cp2.spawnSync( - "node", - [path.join(__dirname, "measure-layout.cjs"), project, ...times.map(String)], - { stdio: "ignore", timeout: 120000 }, - ); - let lay = null; - try { - lay = JSON.parse(fs.readFileSync(path.join(project, "_layout.json"), "utf8")); - } catch {} - if (lay && lay.samples) { - let changes = 0; - for (const pg of Object.values(pagesByKey)) { - const sample = lay.samples.reduce((a, b) => - Math.abs(b.t - pg.t) < Math.abs(a.t - pg.t) ? b : a, - ); - if (!sample || Math.abs(sample.t - pg.t) > 0.3) continue; - const ordered = [...pg.lines].sort((a, b) => a.slotPx - b.slotPx); - let top = 0; - for (const l of ordered) { - const cap = (sample.caps || []).find((c) => c.id === l.gid); - const realH = cap - ? (cap.cap_bbox && cap.cap_bbox.h) || textBoxH(cap) - : l.frac * H * 1.25; - if (Math.abs(top - l.slotPx) > 3) { - const g = groups.find((g2) => g2.id === l.gid); - g.css = g.css.replace(/top:\s*-?[\d.]+px/, "top:" + Math.round(top) + "px"); - if (l._hero) { - const hr = heroRefs.find((h) => `h-${h.bi}` === l.gid); - if (hr) hr.slotPx = Math.round(top); - } - l.slotPx = Math.round(top); - changes++; - } - top += - (realH || l.frac * H * 1.25) + Math.max(12, Math.round((l.frac || 0.05) * H * 0.38)); // box is lh1.12 — contains its own ink - } - } - if (changes) { - console.log( - `[make-cinematic] re-slot: ${changes} line(s) re-stacked from MEASURED heights (wrapped lines accounted)`, - ); - fs.writeFileSync(path.join(project, "plan.json"), JSON.stringify(plan, null, 2)); - cp2.spawnSync("node", [path.join(__dirname, "make-composition.cjs"), project], { - stdio: "ignore", - }); - try { - fs.unlinkSync(path.join(project, "_layout.json")); - } catch {} - } - } - } - } - - // ── HERO post-pass (real measurement, up to 2 re-emits) — runs PER HERO ───── - // (a) SIZE: a timid hero is the #1 quality kill. If the authored font leaves >25% - // of the usable width unused, raise it to the width-fit maximum (DNA sizeRange cap). - // (b) CLEARANCE vs OTHER planes: the hero band must not overlap caps outside its own - // lockup (its own context is composed around it by the slot layout). On a hit, - // shift the whole LOCKUP plane vertically. - // (c) LOCKUP RE-STACK: a size change moves the hero's height — restack the lockup's - // slots from measured heights so post-context stays bonded BELOW the hero. - // HERO words never wrap — a mid-word break ("Watermelo|n") is wrong in every case, - // and author css REPLACES the default (which silently lost white-space:nowrap). - // Forced here so no authoring path can drop it; centered nowrap text overflows a - // narrow plane SYMMETRICALLY, which also keeps width-fit honest (it measures the - // true single-line width instead of a wrapped row). - // narration lines whipped away by a mid-sentence page-flip are the same disease - // in mild form — warn (a deliberate quick beat is legal, so no die) - for (const g of groups) - if (!g.hero && g.words && g.words.length && g.out - g.in < 0.6) { - console.log( - `[make-cinematic] ⚠ line "${g.words - .map((w) => w.text) - .join(" ") - .slice( - 0, - 28, - )}" visible only ${(g.out - g.in).toFixed(2)}s (page-flip) — merge micro-lines or give the plane more height so the page holds`, - ); - } - // MIN DWELL — a peak on screen <0.5s is unreadable ("stars" shipped at 0.47s and - // the user couldn't read it). Merge the block with the next (one thought), promote - // a word with room, or demote to an emphasized line. <0.8s gets a loud warning. - for (const g of groups) - if (g.hero) { - const dwell = g.out - g.in; - if (dwell < 0.5) - die( - `hero "${(g.words[0] || {}).text}" is on screen only ${dwell.toFixed(2)}s (<0.5s readability floor) — merge its block with the next, promote a word with more room, or demote it to an emphasized (non-hero) line.`, - ); - if (dwell < 0.8) - console.log( - `[make-cinematic] ⚠ hero "${(g.words[0] || {}).text}" dwell ${dwell.toFixed(2)}s is tight (<0.8s) — consider merging blocks so the peak can breathe`, - ); - } - { - let nwChanged = false; - for (const g of groups) - if (g.hero && !/white-space\s*:\s*nowrap/.test(g.css || "")) { - g.css = (g.css || "") + " white-space: nowrap;"; - nwChanged = true; - } - if (nwChanged) { - fs.writeFileSync(path.join(project, "plan.json"), JSON.stringify(plan, null, 2)); - require("child_process").spawnSync( - "node", - [path.join(__dirname, "make-composition.cjs"), project], - { stdio: "ignore" }, - ); - } - } - const fracOf = (css) => { - const m = (css || "").match(/font-size\s*:\s*calc\(\s*([\d.]+)\s*\*\s*var\(--h\)/); - return m ? +m[1] : null; - }; - const setFrac = (css, f) => - (css || "").replace( - /font-size\s*:\s*[^;]+/, - "font-size: calc(" + f.toFixed(3) + " * var(--h))", - ); - const textBox = (c) => { - const ws = (c.words || []).filter((w) => (w.opacity ?? 1) > 0.05 && w.w > 0); - if (!ws.length) return c.cap_bbox; - const x0 = Math.min(...ws.map((w) => w.x)), - x1 = Math.max(...ws.map((w) => w.x + w.w)); - const y0 = Math.min(...ws.map((w) => w.y)), - y1 = Math.max(...ws.map((w) => w.y + w.h)); - return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }; - }; - let dnaSizeCap = 0.34, - dnaHeroCase = "none"; - try { - const dnaLib2 = require("./lib-dna.cjs"); - const dn = plan.dna || dnaLib2.LEGACY[plan.template]; - if (dn) { - const dj = dnaLib2.load(dn); - if (dj.hero && dj.hero.sizeRange) dnaSizeCap = dj.hero.sizeRange[1]; - if (dj.hero) dnaHeroCase = dj.hero.case || "none"; - } - } catch {} - // the APEX (largest authored hero) gets the width-fit raise; minor heroes keep their - // authored size — inter-hero hierarchy is a deliberate choice, not timidity - const apexFrac = Math.max( - ...heroRefs.map((h) => fracOf((groups.find((g) => g.id === `h-${h.bi}`) || {}).css) || 0), - 0, - ); - for (const hRef of heroRefs) { - const heroG = groups.find((g) => g.id === `h-${hRef.bi}`); - if (!heroG) continue; - const isApex = (fracOf(heroG.css) || 0) >= apexFrac - 1e-6; - const lockupMates = groups.filter((g) => g.plane === hRef.plane && g.id !== heroG.id); - // hero size changed → context follows the 0.26 poster ratio, and its orbit - // max-width scales WITH the font (a stale max-width wraps re-locked context - // into multi-row towers that blow the stack past the frame) - const relockMates = (hf) => { - const rf = +Math.min(0.085, Math.max(0.05, hf * 0.26)).toFixed(4); - for (const m of lockupMates) { - const mf = fracOf(m.css); - if (!mf || Math.abs(mf - rf) <= 0.002) continue; - const scale = rf / mf; - m.css = setFrac(m.css, rf).replace( - /max-width:\s*([\d.]+)px/, - (s2, px) => "max-width:" + Math.round(+px * scale) + "px", - ); - } - }; - const measure = () => { - const midT = ((heroG.in + Math.min(heroG.out, heroG.in + 1.0)) / 2).toFixed(2); - const endT = Math.max(+midT + 0.05, heroG.out - 0.12).toFixed(2); - cp2.spawnSync( - "node", - [path.join(__dirname, "measure-layout.cjs"), project, String(midT), String(endT)], - { stdio: "ignore", timeout: 90000 }, - ); - try { - const ss = JSON.parse(fs.readFileSync(path.join(project, "_layout.json"), "utf8")).samples; - const near = (t) => - ss.reduce((a, b) => (Math.abs(b.t - t) < Math.abs((a ? a.t : 1e9) - t) ? b : a), null); - return { caps: (near(+midT) || {}).caps || [], capsEnd: (near(+endT) || {}).caps || [] }; - } catch { - return null; - } - }; - let didRaise = false; - for (let pass = 0; pass < 5; pass++) { - const m0 = measure(); - if (!m0) break; - const caps = m0.caps, - capsEnd = m0.capsEnd && m0.capsEnd.length ? m0.capsEnd : m0.caps; - const hc0 = caps.find((c) => c.id === heroG.id); - if (!hc0 || !hc0.cap_bbox) break; - const hc = { ...hc0, cap_bbox: textBox(hc0) }; - const mateIds = new Set(lockupMates.map((m) => m.id)); - const others = caps - .filter( - (c) => - c.id !== heroG.id && - !mateIds.has(c.id) && - !/-glow$/.test(c.id || "") && - c.cap_bbox && - c.opacity > 0.05, - ) - .map((c) => ({ ...c, cap_bbox: textBox(c) })); - const maxW = W * 0.94; - const f0 = fracOf(heroG.css); - let changed = false; - if (f0 && hc.cap_bbox.w > 0) { - if (hc.cap_bbox.w > maxW) { - const nf = Math.max(0.06, (f0 * maxW) / hc.cap_bbox.w); - console.log( - `[make-cinematic] hero "${heroG.words[0].text}" too WIDE ${Math.round(hc.cap_bbox.w)}px → ${f0}h→${nf.toFixed(3)}h`, - ); - heroG.css = setFrac(heroG.css, nf); - changed = true; - } else if (hc.cap_bbox.w >= maxW * 0.88) { - if (pass === 0) - console.log( - `[make-cinematic] hero "${heroG.words[0].text}" at width CEILING (${Math.round(hc.cap_bbox.w)}/${Math.round(maxW)}px) — cannot enlarge.`, - ); - } else if (!didRaise && hc.cap_bbox.w < maxW * 0.88 && isApex) { - // NO DEAD ZONE: anything under 88% of usable width is raised toward a 93% - // fill (the old <75% trigger let 75–88%-wide heroes stay merely "decent") - const fit = (f0 * (maxW * 0.93)) / hc.cap_bbox.w; - const nf = Math.min(dnaSizeCap, fit); - if (nf > f0 * 1.05 || fit > dnaSizeCap * 1.02) { - if (nf > f0 * 1.001) - console.log( - `[make-cinematic] hero "${heroG.words[0].text}" TIMID (${Math.round(hc.cap_bbox.w)}px of ${Math.round(maxW)}px usable) → ${f0}h→${nf.toFixed(3)}h (width-fit max)`, - ); - // SHORT-WORD FILL: height cap bound before the width target → fill with - // TRACKING (film-title craft — HER, DUNE), ≤0.32em so it stays a word. - const wAtCap = (hc.cap_bbox.w * nf) / f0; - const dispT = String(heroG.text || (heroG.words || []).map((w) => w.text).join(" ")); - // never letterspace lowercase (tracked lowercase falls apart — caps only) - const capsy = dnaHeroCase === "uppercase" || dispT === dispT.toUpperCase(); - if (fit > dnaSizeCap && wAtCap < maxW * 0.85 && capsy) { - const disp = dispT; - // letter-spacing adds a gap after EVERY char (N gaps) and the centering - // text-indent adds one more — budget N+1 gaps or the word leaves the frame - const gaps = disp.length + 1; - const tr = +Math.min(0.32, (maxW * 0.88 - wAtCap) / (gaps * nf * H)).toFixed(3); - if (tr >= 0.04) { - heroG.css = - heroG.css - .replace(/letter-spacing\s*:[^;]+;?\s*/g, "") - .replace(/text-indent\s*:[^;]+;?\s*/g, "") + - (heroG.css.trim().endsWith(";") || !heroG.css.trim() ? "" : ";") + - ` letter-spacing:${tr}em; text-indent:${tr}em;`; - console.log( - `[make-cinematic] hero "${disp}" short word at height cap (${Math.round(wAtCap)}px of ${Math.round(maxW)}px) → tracked +${tr}em to fill`, - ); - } - } - heroG.css = setFrac(heroG.css, nf); - changed = true; - didRaise = true; - relockMates(nf); - } - } - } - const hbx = hc.cap_bbox; - // colliders OUTSIDE the lockup only — the lockup composes around the hero by design - const hits = others.filter((o) => { - const b = o.cap_bbox; - const ix = Math.min(hbx.x + hbx.w, b.x + b.w) - Math.max(hbx.x, b.x); - const iy = Math.min(hbx.y + hbx.h, b.y + b.h) - Math.max(hbx.y, b.y); - return ix > 8 && iy > 8; - }); - if (hits.length) { - const maxBottom = Math.max(...hits.map((o) => o.cap_bbox.y + o.cap_bbox.h)); - const minTop = Math.min(...hits.map((o) => o.cap_bbox.y)); - const downTo = ((maxBottom + 14) / H) * 100; - const upTo = Math.max(2, ((minTop - hbx.h - 14) / H) * 100); - const planeCss = plan.planes[hRef.plane].css; - const curTop = +(planeCss.match(/top:\s*([\d.]+)%/) || [0, 30])[1]; - const newTop = downTo + (hbx.h / H) * 100 < 96 ? downTo : upTo; - plan.planes[hRef.plane].css = planeCss.replace( - /top:\s*[\d.]+%/, - "top: " + newTop.toFixed(1) + "%", - ); - console.log( - `[make-cinematic] hero "${heroG.words[0].text}" OVERLAPS ${hits.map((o) => o.id).join(",")} — lockup top ${curTop}% → ${newTop.toFixed(1)}%`, - ); - changed = true; - } - // ORBIT REFINE: anchor kicker/tail to the MEASURED hero edges (estimate → real) - if (lockupMates.length && hc.cap_bbox && hc.cap_bbox.w > 0) { - const planeCss2 = (plan.planes[hRef.plane] && plan.planes[hRef.plane].css) || ""; - const pl2 = ((planeCss2.match(/left:\s*([\d.]+)%/) || [0, 0])[1] * W) / 100; - const relL = Math.max(0, Math.round(hc.cap_bbox.x - pl2)); - const pw2 = ((planeCss2.match(/width:\s*([\d.]+)%/) || [0, 100])[1] * W) / 100; - const relR = Math.max(0, Math.round(pw2 - (hc.cap_bbox.x - pl2) - hc.cap_bbox.w)); - for (const m of lockupMates) { - if (/left:\s*\d+px;right:auto/.test(m.css)) { - const nc = m.css.replace(/left:\s*\d+px/, "left:" + relL + "px"); - if (nc !== m.css) { - m.css = nc; - changed = true; - } - } else if (/right:\s*\d+px;left:auto/.test(m.css)) { - const nc = m.css.replace(/right:\s*\d+px/, "right:" + relR + "px"); - if (nc !== m.css) { - m.css = nc; - changed = true; - } - } - } - } - // LOCKUP RE-STACK from measured heights — runs EVERY pass for lockups (orbit - // max-widths wrap context lines, so the re-slot's estimates can leave the tail - // displaced or the whole composition off frame) - if (lockupMates.length) { - const caps2 = capsEnd; // lockup-END sample: every context line is revealed there - // TOWER CHECK — a context line wrapped to 3+ rows means its orbit max-width is - // too narrow for the (re-locked) font; widen toward the plane before stacking, - // or the tower blows the stack past the frame and the walk-back eats the hero - for (const m of lockupMates) { - const cm = caps2.find((x) => x.id === m.id); - const frm = fracOf(m.css) || 0.05; - const mwM = m.css.match(/max-width:\s*([\d.]+)px/); - if (!cm || !cm.cap_bbox || !mwM) continue; - const rows = Math.round(cm.cap_bbox.h / (frm * H * 1.12)); - if (rows >= 3) { - const planeCssW2 = (plan.planes[hRef.plane] && plan.planes[hRef.plane].css) || ""; - const pwX = W * (+(planeCssW2.match(/width:\s*([\d.]+)%/) || [0, 92])[1] / 100); - const nw = Math.round(pwX * 0.62); - if (nw > +mwM[1] + 10) { - m.css = m.css.replace(/max-width:\s*[\d.]+px/, "max-width:" + nw + "px"); - console.log( - `[make-cinematic] context "${((m.words || [])[0] || {}).text}…" wrapped to ${rows} rows — orbit max-width ${Math.round(+mwM[1])}→${nw}px (towers break the stack)`, - ); - changed = true; - } - } - } - const entries = [heroG, ...lockupMates] - .map((g) => { - const c = caps2.find((x) => x.id === g.id); - const curTop = +(g.css.match(/top:\s*(-?[\d.]+)px/) || [0, 0])[1]; - const fr = fracOf(g.css) || 0.05; - // SLOT HEIGHT = the LAYOUT box (cap_bbox), not the glyph box: words reveal - // over time, so at the hero-mid sample a context line's later words are - // still opacity-0 — glyph-box measured a wrapped line one row short and the - // next line slotted INTO its wrap band (real text-on-text shipped). - const measuredH = c && c.cap_bbox ? c.cap_bbox.h : null; - const h2 = g.id === heroG.id && didRaise ? fr * H * 1.12 : measuredH || fr * H * 1.25; - return { g, curTop, h: h2 }; - }) - .sort((a, b) => a.curTop - b.curTop); - let top = 0; - for (const e of entries) { - if (Math.abs(top - e.curTop) > 3) { - e.g.css = e.g.css.replace(/top:\s*-?[\d.]+px/, "top:" + Math.round(top) + "px"); - changed = true; - } - top += e.h + Math.max(12, Math.round((fracOf(e.g.css) || 0.05) * H * 0.38)); // box is lh1.12 — contains its own ink - } - // RE-CLAMP the plane after MEASURED growth — keep the whole composition on frame - const planeCss3 = plan.planes[hRef.plane].css; - const curTopPct = +(planeCss3.match(/top:\s*([\d.]+)%/) || [0, 30])[1]; - const maxTopPct = Math.max(2, ((H * 0.97 - top) / H) * 100); - if (curTopPct > maxTopPct + 0.3) { - plan.planes[hRef.plane].css = planeCss3.replace( - /top:\s*[\d.]+%/, - "top: " + maxTopPct.toFixed(1) + "%", - ); - console.log( - `[make-cinematic] lockup measured ${Math.round(top)}px tall — plane top ${curTopPct}% → ${maxTopPct.toFixed(1)}% (kept on frame)`, - ); - changed = true; - } - // even at the 2% ceiling the stack can exceed the frame (TIMID raise + ratio - // context on a tall lockup) — walk the hero back 8% and re-lock until it fits - if (top > H * 0.95 && maxTopPct <= 2.01) { - const f0c = fracOf(heroG.css); - if (f0c && f0c > 0.14) { - // decisive step: stack height scales ~linearly with the hero (context is - // ratio-locked to it), so aim straight at a 93% fill instead of nibbling - const nf2 = +Math.max(0.14, Math.min(f0c * 0.92, (f0c * (H * 0.93)) / top)).toFixed(3); - console.log( - `[make-cinematic] lockup stack ${Math.round(top)}px exceeds the frame even at top 2% — hero ${f0c}h → ${nf2}h (fit)`, - ); - heroG.css = setFrac(heroG.css, nf2); - relockMates(nf2); - didRaise = true; - changed = true; - } - } - } - if (!changed) break; - fs.writeFileSync(path.join(project, "plan.json"), JSON.stringify(plan, null, 2)); - r = cp2.spawnSync("node", [path.join(__dirname, "make-composition.cjs"), project], { - stdio: "ignore", - }); - try { - fs.unlinkSync(path.join(project, "_layout.json")); - } catch {} - } - } - // MINOR HERO measure pass — minors keep their authored size (hierarchy is a choice) - // but never ship broken: wider than the frame's usable width shrinks to fit, and a - // column overflow gets a loud note (centered spill is legal on a clear side only). - { - const minors = groups.filter((g) => g.hero && !heroRefs.some((h) => `h-${h.bi}` === g.id)); - let minorChanged = false; - for (const mg of minors) { - const midT = ((mg.in + Math.min(mg.out, mg.in + 1.0)) / 2).toFixed(2); - cp2.spawnSync("node", [path.join(__dirname, "measure-layout.cjs"), project, String(midT)], { - stdio: "ignore", - timeout: 60000, - }); - let mc = null; - try { - mc = ( - JSON.parse(fs.readFileSync(path.join(project, "_layout.json"), "utf8")).samples[0].caps || - [] - ).find((c) => c.id === mg.id); - } catch {} - if (!mc || !mc.cap_bbox) continue; - const bb = textBox(mc), - f0 = fracOf(mg.css); - if (f0 && bb.w > W * 0.94) { - const nf = Math.max(0.06, +((f0 * (W * 0.94)) / bb.w).toFixed(3)); - console.log( - `[make-cinematic] minor hero "${(mg.words[0] || {}).text}" too WIDE ${Math.round(bb.w)}px → ${f0}h→${nf.toFixed(3)}h (shrink-to-fit)`, - ); - mg.css = setFrac(mg.css, nf); - minorChanged = true; - } else { - const planeCssM = (plan.planes[mg.plane] && plan.planes[mg.plane].css) || ""; - const pwPx = W * (+(planeCssM.match(/width:\s*([\d.]+)%/) || [0, 100])[1] / 100); - if (bb.w > pwPx * 1.05) - console.log( - `[make-cinematic] note: minor hero "${(mg.words[0] || {}).text}" (${Math.round(bb.w)}px) spills its ${Math.round(pwPx)}px column — fine on a clear side; reduce size if it crosses the subject`, - ); - } - try { - fs.unlinkSync(path.join(project, "_layout.json")); - } catch {} - } - if (minorChanged) { - fs.writeFileSync(path.join(project, "plan.json"), JSON.stringify(plan, null, 2)); - cp2.spawnSync("node", [path.join(__dirname, "make-composition.cjs"), project], { - stdio: "ignore", - }); - } - } - process.exit(0); -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/make-composition.cjs b/.agents/skills/embedded-captions/scripts/make-composition.cjs deleted file mode 100644 index efdda1c..0000000 --- a/.agents/skills/embedded-captions/scripts/make-composition.cjs +++ /dev/null @@ -1,405 +0,0 @@ -#!/usr/bin/env node -/* - * make-composition.cjs — compile plan.json → index.html (CINEMATIC MODE). - * - * DNA path (canonical): plan.dna names a dna/.json → modes/cinematic/engine.html - * is compiled with scene-resolved tokens (lib-dna.cjs): scene-sampled accent, light- - * direction contact shadow, depth-match blur, hero three-act orchestration with - * RMS-coupled amplitude. plan.template="cinematic-cream" maps to dna "cream". - * - * Legacy path: plan.template naming an archived template dir still compiles 1:1 - * (memory-wall / champion / portrait-header in modes/cinematic/_archive are NOT - * auto-discovered — restore them to modes/cinematic/ to use). - * - * node make-composition.cjs - */ -const path = require("path"); -const fs = require("fs"); -const cp = require("child_process"); -const dnaLib = require("./lib-dna.cjs"); - -const SKILL_ROOT = path.resolve(__dirname, ".."); -const TEMPLATES = path.join(SKILL_ROOT, "modes", "cinematic"); - -// Source clip duration (seconds) via ffprobe. The COMPOSITION/background length must -// follow the SOURCE, not the last caption — see the Bug-1 note in main(). -function sourceDurationSec(project) { - let cands = ["source.mp4"]; - try { - cands = cands.concat( - fs - .readdirSync(project) - .filter( - (f) => - /\.(mp4|mov|webm|mkv|m4v)$/i.test(f) && - !/^(final|bg_plus_caps|fg_caps|rail|index)/.test(f), - ), - ); - } catch {} - for (const c of cands) { - const p = path.isAbsolute(c) ? c : path.join(project, c); - if (!fs.existsSync(p)) continue; - try { - const out = cp - .execFileSync( - "ffprobe", - [ - "-v", - "error", - "-show_entries", - "format=duration", - "-of", - "default=nokey=1:noprint_wrappers=1", - "--", - p, - ], - { encoding: "utf8" }, - ) - .trim(); - const d = parseFloat(out); - if (d > 0) return d; - } catch {} - } - return null; -} - -function hexLum(hex) { - let h = String(hex).replace("#", ""); - if (h.length === 3) h = [...h].map((c) => c + c).join(""); - const r = parseInt(h.slice(0, 2), 16) / 255, - g = parseInt(h.slice(2, 4), 16) / 255, - b = parseInt(h.slice(4, 6), 16) / 255; - if ([r, g, b].some(Number.isNaN)) return 0.9; - return 0.299 * r + 0.587 * g + 0.114 * b; -} -const defaultTextShadow = (c) => - hexLum(c) < 0.45 - ? "0 2px 6px rgba(0, 0, 0, 0.28)" - : "0 0 18px rgba(255, 220, 170, 0.55), 0 3px 8px rgba(0, 0, 0, 0.85)"; -const defaultTextFilter = (c) => - hexLum(c) < 0.45 ? "contrast(1.08)" : "brightness(1.1) contrast(1.05)"; - -function findTemplate(name) { - const p = path.join(TEMPLATES, name, "template.html"); - if (fs.existsSync(p)) return p; - const avail = fs - .readdirSync(TEMPLATES) - .filter((d) => fs.existsSync(path.join(TEMPLATES, d, "template.html"))) - .sort(); - console.error(`[compile] unknown template: ${name}. Available: ${avail.join(", ")}`); - process.exit(1); -} -function escBr(t) { - const e = String(t) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """); - return e - .replace(/<br>/g, "
") - .replace(/<br\/>/g, "
") - .replace(/<br \/>/g, "
"); -} -// hero words get per-letter inner spans () so the engine can stagger -// letters; .w keeps wrapping the word so every gate (occlusion / overflow / layout) -// measures exactly what it measured before. -function wordSpan(w, i, perLetter) { - if (!perLetter) return `${escBr(w.text)}`; - const t = String(w.text); - if (//i.test(t)) return `${escBr(t)}`; // explicit
words stay whole - const letters = [...t] - .map((ch) => (ch === " " ? " " : `${escBr(ch)}`)) - .join(""); - return `${letters}`; -} -function renderCap(g, heroCfg) { - const slot = g.slot ?? g.style ?? ""; - const layerAttr = g.layer ? ` data-layer="${g.layer}"` : ""; - const isHero = heroCfg && g.hero === true; - const perLetter = isHero && heroCfg.perLetter; - const cls = slot ? `cap cap-${slot}` : "cap"; - const spans = g.words.map((w, i) => wordSpan(w, i, perLetter)).join("\n "); - const capDiv = `
\n ${spans}\n
`; - if (!isHero) return capDiv; - // fx siblings render UNDER the hero (earlier sibling = beneath): glow first, then - // echoes, then the hero itself. Plain .w spans; none are in plan.groups → gates skip. - const plainSpans = g.words - .map((w, i) => `${escBr(w.text)}`) - .join("\n "); - const parts = []; - if (heroCfg.glow) - parts.push( - ``, - ); - (heroCfg.echoes || []).forEach((ec, k) => { - parts.push( - ``, - ); - }); - parts.push(capDiv); - return parts.join("\n "); -} -function buildGroupsHtml(groups, planes, heroCfg) { - if (!planes) return groups.map((g) => renderCap(g, heroCfg)).join("\n "); - const order = Object.keys(planes); - const grouped = {}; - order.forEach((p) => (grouped[p] = [])); - const free = []; - for (const g of groups) { - const pid = g.plane; - if (pid && pid in grouped) grouped[pid].push(g); - else free.push(g); - } - const parts = []; - for (const pid of order) - parts.push( - `
\n ${grouped[pid].map((g) => renderCap(g, heroCfg)).join("\n ")}\n
`, - ); - for (const g of free) parts.push(renderCap(g, heroCfg)); - return parts.join("\n "); -} -function buildPlanesCss(planes) { - if (!planes) return ""; - return Object.entries(planes) - .map(([pid, p]) => { - // Accept BOTH plane shapes: { body: { css: "..." } } and the bare-string - // { body: "..." } (matches how groups write css). Reading only p.css silently - // dropped the string form → empty CSS → planes collapsed to (0,0). - let css = (typeof p === "string" ? p : (p || {}).css || "").trim(); - if (!css) return null; - if (!css.endsWith(";")) css += ";"; - return ` .plane-${pid} { ${css} }`; - }) - .filter(Boolean) - .join("\n"); -} -function buildPerGroupCss(groups, tokens) { - return groups - .map((g) => { - const parts = []; - if (g.scale != null) parts.push(`--s: ${g.scale};`); - let css = (g.css || "").trim(); - if (css) parts.push(css.endsWith(";") ? css : css + ";"); - const isHero = tokens && g.hero === true; - if (isHero) { - // DNA hero treatment (case / tracking / extra css) — authored css still wins (it comes first? no: later rules win; DNA goes first so the author can override) - const dnaHero = []; - if (tokens.heroCase && tokens.heroCase !== "none") - dnaHero.push(`text-transform: ${tokens.heroCase};`); - if (tokens.heroTracking && tokens.heroTracking !== "0") - dnaHero.push(`letter-spacing: ${tokens.heroTracking};`); - if (tokens.heroCss) - dnaHero.push(tokens.heroCss.endsWith(";") ? tokens.heroCss : tokens.heroCss + ";"); - if (tokens.hero && tokens.hero.heroColor) dnaHero.push(`color: ${tokens.hero.heroColor};`); - parts.unshift(...dnaHero); - } - const rules = []; - if (parts.length) rules.push(` #${g.id} { ${parts.join(" ")} }`); - // fx duplicates mirror the hero's geometry exactly (same slot/absolute CSS) so a - // flex/slot plane can't displace them; glow blur comes from .hero-glow (em-based), - // echo colors from their own rules (they must NOT inherit a transparent text fill). - if (isHero && tokens.hero) { - // word-level hero treatment (e.g. chrome's gradient clip — background-clip:text - // can't clip through composited children, so it must live ON the .w span) - if (tokens.hero.wordCss) rules.push(` #${g.id} .w { ${tokens.hero.wordCss} }`); - if (tokens.hero.glow > 0 && parts.length) - rules.push(` #${g.id}-glow { ${parts.join(" ")} }`); - (tokens.hero.echoes || []).forEach((ec, k) => { - const extra = - `color: ${ec.color}; -webkit-text-fill-color: ${ec.color}; background: none;` + - (ec.blur ? ` filter: blur(${ec.blur}px);` : ""); - rules.push(` #${g.id}-echo-${k} { ${parts.join(" ")} ${extra} }`); - }); - } - return rules.length ? rules.join("\n") : null; - }) - .filter(Boolean) - .join("\n"); -} -function buildGroupsJson(groups) { - return JSON.stringify( - groups.map((g) => ({ - id: g.id, - in: g.in, - out: g.out, - tone: g.tone ?? "soft", - ...(g.hero === true ? { hero: true } : {}), - ...(g.minor === true ? { minor: true } : {}), - ...(g.plane ? { plane: g.plane } : {}), - words: g.words.map((w) => ({ text: w.text, start: w.start, end: w.end })), - })), - null, - 10, - ); -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: make-composition.cjs "); - process.exit(1); - } - const planPath = path.join(project, "plan.json"); - if (!fs.existsSync(planPath)) { - console.error(`[compile] missing ${planPath}`); - process.exit(1); - } - const plan = JSON.parse(fs.readFileSync(planPath, "utf8")); - if (plan.mode === "custom") { - console.error("[compile] mode=custom — skip this script and hand-write index.html."); - process.exit(1); - } - if (plan.mode === "standard") { - console.error( - "[compile] mode=standard — this plan.json is DERIVED by make-standard.cjs; compile Standard projects with make-standard.cjs (from standard.json), not this script.", - ); - process.exit(1); - } - // ── DNA resolution: plan.dna (canonical) or a legacy template name ────────── - const dnaName = plan.dna || dnaLib.LEGACY[plan.template] || null; - let dna = null, - tokens = null; - if (dnaName) { - try { - dna = dnaLib.load(dnaName); - } catch (e) { - console.error(`[compile] ${e.message}`); - process.exit(1); - } - } - const heroGroups = (plan.groups || []).filter((x) => x.hero === true); - if (dna) { - tokens = dnaLib.resolveTokens(dna, project, { heroGroups }); - console.log( - `[compile] DNA "${dna.name}" (${tokens.register}) — accent ${tokens.accent}` + - `${tokens.blurPx ? ` · depth-match blur ${tokens.blurPx}px` : ""}` + - `${tokens.heroes.length ? ` · hero amp ${tokens.heroes.map((h) => h.amp).join("/")} (RMS-coupled)` : ""}`, - ); - } - let src = dna - ? fs.readFileSync(path.join(TEMPLATES, "engine.html"), "utf8") - : fs.readFileSync(findTemplate(plan.template), "utf8"); - // Bug-1: the canvas/background length = SOURCE clip length, NOT the last-caption time. - // If plan.duration < source, the bg video ends before the matte → the tail shows only - // the foreground subject on black. Caption groups keep their own in/out (they may end - // earlier); only the composition duration follows the source. - const srcDur = sourceDurationSec(project); - const renderDur = srcDur && srcDur > 0 ? srcDur : plan.duration; - if (srcDur && Math.abs(srcDur - (plan.duration || 0)) > 0.2) - console.log( - `[compile] canvas duration → source length ${renderDur.toFixed(2)}s (plan.duration=${plan.duration}); captions keep their own times.`, - ); - const plane = plan.plane || {}, - header = plan.header || {}, - crown = plan.crown || {}; - // LOCKED DNA — the plan can NOT override colour / blend / shadow / filter. Picking a - // DNA commits to its visual identity; only layout + per-group typography stay - // agent-authored. If a scene's luminance fights the look, pick a DIFFERENT DNA - // (bright scene → "ink") — never recolour this one. (plan.cap_color / blend_mode / - // text_shadow / text_filter are intentionally ignored.) - const capColor = tokens ? tokens.capColor : "#fff5df"; - const g = (o, k, d) => (o && o[k] != null ? o[k] : d); - const heroCfg = - tokens && tokens.heroes && tokens.heroes.length - ? { - perLetter: tokens.heroes[0].perLetter, - glow: tokens.heroes[0].glow, - echoes: tokens.heroes[0].echoes || [], - } - : null; - const subs = { - DURATION: `${renderDur}`, - FPS: `${plan.fps ?? 24}`, - WIDTH: `${plan.width}`, - HEIGHT: `${plan.height}`, - FONT_SCALE: `${plan.font_scale ?? 1.0}`, - PLANE_TOP: `${g(plane, "top", 0)}`, - PLANE_LEFT: `${g(plane, "left", "")}`, - PLANE_RIGHT: `${g(plane, "right", "")}`, - PLANE_WIDTH: `${g(plane, "width", 0)}`, - PLANE_HEIGHT: `${g(plane, "height", 0)}`, - ROTATE_Y: `${g(plane, "rotateY", 0)}`, - ROTATE_X: `${g(plane, "rotateX", 0)}`, - HEADER_TOP: `${g(header, "top", 0)}`, - HEADER_HEIGHT: `${g(header, "height", 0)}`, - CROWN_TOP: `${g(crown, "top", plan.crown_top ?? g(plan.crown_position || {}, "top", 440))}`, - CROWN_LEFT: `${g(crown, "left", 0)}`, - CROWN_RIGHT: `${g(crown, "right", 0)}`, - CROWN_ALIGN: `${g(crown, "align", "center")}`, - CROWN_SCALE: `${g(crown, "scale", 1.0)}`, - BLEND_MODE: tokens ? tokens.blend : "screen", - CAP_COLOR: capColor, - TEXT_SHADOW: tokens ? tokens.textShadow : defaultTextShadow(capColor), - TEXT_FILTER: tokens ? tokens.filterBg : defaultTextFilter(capColor), - // engine-only placeholders (legacy templates simply don't contain them) - FONT_FAMILY: tokens ? tokens.fontFamily : "Inter", - ACCENT: tokens ? tokens.accent : "#e3c06a", - TEXT_FILTER_BG: tokens ? tokens.filterBg : defaultTextFilter(capColor), - TEXT_FILTER_FG: tokens ? tokens.filterFg : defaultTextFilter(capColor), - DNA_CSS: tokens && tokens.dnaCss ? tokens.dnaCss : "", - MOTION_JSON: JSON.stringify( - tokens - ? tokens.motion - : { - soft: { y: 8, dur: 0.45, ease: "power2.out" }, - present: { y: 6, scale: 1.04, dur: 0.22, ease: "power3.out" }, - }, - ), - HEROES_JSON: tokens && tokens.heroes ? JSON.stringify(tokens.heroes) : "[]", - HERO_JSON: tokens && tokens.hero ? JSON.stringify(tokens.hero) : "null", - GROUPS_HTML: buildGroupsHtml(plan.groups, plan.planes, heroCfg), - PLANES_CSS: buildPlanesCss(plan.planes), - CUSTOM_CSS: buildPerGroupCss(plan.groups, tokens), - GROUPS_JSON: buildGroupsJson(plan.groups), - }; - const cg = plan.crown_group; - if (cg) { - const layerAttr = cg.layer ? ` data-layer="${cg.layer}"` : ""; - const spans = cg.words - .map((w, i) => `${escBr(w.text)}`) - .join("\n "); - subs.CROWN_HTML = `
\n ${spans}\n
`; - subs.CROWN_JSON = JSON.stringify( - { - id: cg.id, - in: cg.in, - out: cg.out, - tone: cg.tone ?? "present", - words: cg.words.map((w) => ({ text: w.text, start: w.start, end: w.end })), - }, - null, - 10, - ); - } else { - subs.CROWN_HTML = ""; - subs.CROWN_JSON = "null"; - } - - for (const [k, v] of Object.entries(subs)) src = src.split(`{{${k}}}`).join(v); - fs.writeFileSync(path.join(project, "index.html"), src); - console.log( - `[compile] ${dna ? `dna=${dna.name} (engine)` : `template=${plan.template}`} → ${path.join(project, "index.html")}`, - ); - - // per-group FG → index_fg.html (same strategy as the Python version) - const fgGroups = plan.groups.filter((x) => x.layer === "fg"); - if (fgGroups.length || (plan.crown_group || {}).layer === "fg") { - const fgCss = ` - -`; - let fg = src.replace("", fgCss + " "); - fg = fg.replace('
\n
.json) is a complete visual constitution composed - * from two registries implemented HERE, once, for all DNAs: - * - * BODY PARADIGMS how the transcript surface lives - * rail lower-third lines that replace each other (fg alpha) - * panel console log accumulating in a docked glass panel (fg alpha) - * poem lines accumulate in open space, stanza by stanza (fg alpha) - * takeover every beat owns the full frame as a hard-cut card (bg) - * - * HERO SETPIECES the climax choreography - * detonation sliced stencil stamp: shear-in, snap, squash, cool, furniture - * decode slot-machine glyph reels lock left→right, CRT-off exit - * drawon single-line-font stroke-order writing (sequential dash reveal) - * assembly inline word assembles from inbound particles (poem apex) - * colorflip inline accent-color crush card (takeover apex) - * - * plus LINKAGES (theme interactions: redact-until-hero, disperse-on-last-word, - * corrupt-on-last-word) and a PLATE budget compiled to _postfx.sh. - * - * Inputs : /theme.json { dna, lines:[[w,...],...], hero:{match,text?}, - * minors?:[...], width?, height?, fps? } - * /transcript.json (verbatim, word timings) - * themes/.json - * Outputs: index.html (bg: plate reaction + embedded setpiece) - * rail.html (fg alpha: body paradigm + front fx) [unless body.layer=bg] - * _postfx.sh (plate reaction: punch/shake/grain after composite) - * - * Render: scripts/render-theme.sh (render-and-composite + postfx) - * - * Determinism contract: paused GSAP on window.__timelines["main"], seeded PRNG - * only (mulberry32), set-chains / pure-f(t) keyframes, no Math.random/Date.now. - */ -const fs = require("fs"); -const path = require("path"); -const { execFileSync } = require("child_process"); - -const PROJECT = path.resolve(process.argv[2] || "."); -const SKILL = path.resolve(__dirname, ".."); -const F = 1 / 24; - -// ---------- load inputs ---------- -const theme = JSON.parse(fs.readFileSync(path.join(PROJECT, "theme.json"), "utf8")); -const dna = JSON.parse(fs.readFileSync(path.join(SKILL, "themes", theme.dna + ".json"), "utf8")); -const transcript = JSON.parse(fs.readFileSync(path.join(PROJECT, "transcript.json"), "utf8")); -const W = theme.width || 1280, - H = theme.height || 720; - -// FPS: matte.fps is AUTHORITATIVE (written by matte.cjs at the source's native -// rate; the matte overlay + postfx zoompan must run at this rate or the output -// retimes). theme.fps only overrides when matte.fps is absent. -function readMatteFps() { - try { - const v = parseInt( - fs.readFileSync(path.join(PROJECT, "matte.fps"), "utf8").replace(/\D/g, ""), - 10, - ); - return v > 0 ? v : null; - } catch { - return null; - } -} -const FPS = readMatteFps() || theme.fps || 24; - -function probeDuration() { - try { - const out = execFileSync( - "ffprobe", - [ - "-v", - "error", - "-show_entries", - "format=duration", - "-of", - "csv=p=0", - path.join(PROJECT, "source.mp4"), - ], - { encoding: "utf8" }, - ); - return parseFloat(out.trim()); - } catch { - const n = fs.readdirSync(path.join(PROJECT, "frames_fg")).length; - return n / FPS; - } -} -const DUR = +(theme.duration || probeDuration()).toFixed(6); - -// ---------- scene awareness (safe-zones.json): inherit the typography system ---------- -// The existing modes' scene intelligence applies here too: hero placement comes -// from the measured occlusion bands + subject anchor, panel/poem dock on the -// clearer side, and hero font size is width-fit to the actual word. Explicit -// theme.json values > scene auto > DNA fallback. -function readJson2(p) { - try { - return JSON.parse(fs.readFileSync(p, "utf8")); - } catch { - return null; - } -} -const sz = readJson2(path.join(PROJECT, "safe-zones.json")); - -// per-setpiece preferred band (topPct of the hero's TOP edge) -const SETPIECE_PREF_TOP = { - detonation: 28, - decode: 26, - drawon: 18, - cpslam: 27, - settle: 27, - flapboard: 25, - ledwipe: 52, - vhsosd: 26, - bossintro: 30, - rubberstamp: 29, - lasercage: 33, - boltstrike: 24, - holoboot: 28, - biobloom: 33, - silkribbon: 18, - scopetrace: 25, - papermat: 26, - centerfold: 21, - chalkwrite: 44, - spraytag: 26, - brushwrite: 19, - inkbloom: 25, - ransomnote: 31, -}; - -function sceneHeroXY(setpiece, fontPx) { - const exX = theme.hero && theme.hero.x, - exY = theme.hero && theme.hero.y; - let x = exX ?? null, - y = exY ?? null; - if (x == null && sz && sz.heroAnchor && sz.heroAnchor.centerXPct != null) - x = (W * sz.heroAnchor.centerXPct) / 100; - if (x == null) x = dna.hero.x ?? W / 2; - if (y == null && sz && sz.heroBands && Array.isArray(sz.heroBands.profile)) { - const pref = SETPIECE_PREF_TOP[setpiece] ?? 28; - const ok = sz.heroBands.profile.filter((b) => b.occPct >= 18 && b.occPct <= 55); - const pool = ok.length ? ok : sz.heroBands.profile; - const best = pool.reduce((a, b) => - Math.abs(b.topPct - pref) < Math.abs(a.topPct - pref) ? b : a, - ); - y = (H * best.topPct) / 100 + fontPx * 0.55; // band top → glyph center - } - if (y == null) y = dna.hero.y ?? H * 0.37; - return { x: Math.round(x), y: Math.round(y) }; -} - -// width-fit: hero font size from the actual word (never overflow, never timid) -function fitHeroPx(text, basePx, emPerChar, maxFrac) { - const est = (px) => text.length * emPerChar * px; - let px = basePx; - const maxW = W * (maxFrac || 0.92); - if (est(px) > maxW) px = Math.floor(maxW / (text.length * emPerChar)); - // short words: allow growth toward the poster fill, capped — except in the - // calm register, where the DNA base size IS the ceiling (quiet briefs got a - // 188px hero from this growth in the cold-start E2E) - else if (est(px) < W * 0.55 && dna.register !== "calm") - px = Math.min(Math.floor(maxW / (text.length * emPerChar)), Math.round(basePx * 1.25)); - return Math.max(64, px); -} - -// clearer side for docked furniture (panel / poem): away from the subject -const CLEARER = (sz && sz.subject && sz.subject.clearerSide) || "left"; - -// ---------- measured glyph metrics (assets/fonts/char-widths.json) ---------- -// Per-char advance widths (em) + fontBoundingBox ascent/descent for every -// bundled family, measured once in headless Chrome over the SAME woff2 faces -// the renderer embeds. Lets a paradigm BAKE pixel-exact word geometry at -// compile time (beam aim, flare centers) so font-load timing in the render -// browser can never skew it (kerning ignored: ≤3px/word vs ground truth). -const CHARW = (() => { - try { - return JSON.parse(fs.readFileSync(path.join(SKILL, "assets/fonts/char-widths.json"), "utf8")); - } catch { - return null; - } -})(); -function famMetrics(fam) { - return (CHARW && CHARW[fam]) || null; -} -function wordPx(text, fam, px, lsEm) { - const m = famMetrics(fam); - if (!m) console.error(`[make-theme] WARN no measured widths for "${fam}" -> 0.6em/char estimate`); - const adv = m - ? [...text].reduce((a, c) => a + (m.widths[c] ?? m.widths["0"] ?? 0.6), 0) - : text.length * 0.6; - return adv * px + (lsEm || 0) * px * text.length; -} - -// ---------- word timing: sequential matcher (verbatim completeness) ---------- -const norm = (s) => s.toLowerCase().replace(/[^\p{L}\p{N}']/gu, ""); -const tWords = transcript.words.map((w) => ({ - text: w.text ?? w.word, - start: w.start, - end: w.end, - used: false, -})); -let cursor = 0; -function takeWord(authored) { - const target = norm(authored); - for (let i = cursor; i < Math.min(cursor + 3, tWords.length); i++) { - if (norm(tWords[i].text) === target) { - if (tWords[i].used) - throw new Error( - `[make-theme] "${authored}" is already claimed by hero.match — embed setpieces own the hero word: leave it OUT of lines (rail↔climax hand-off)`, - ); - tWords[i].used = true; - cursor = i + 1; - return tWords[i]; - } - } - throw new Error( - `[make-theme] cannot match authored word "${authored}" near transcript position ${cursor} ("${(tWords[cursor] || {}).text}") — lines must follow transcript order verbatim`, - ); -} - -// hero phrase: located independently in the transcript (it may sit between lines) -function findPhrase(phrase) { - const parts = phrase.trim().split(/\s+/).map(norm); - for (let i = 0; i <= tWords.length - parts.length; i++) { - if (parts.every((p, k) => norm(tWords[i + k].text) === p)) { - return { - start: tWords[i].start, - end: tWords[i + parts.length - 1].end, - idx: i, - len: parts.length, - }; - } - } - throw new Error(`[make-theme] hero phrase "${phrase}" not found in transcript`); -} -const heroInline = !!dna.hero.inline; -// theme.hero is OPTIONAL: a heroless theme runs pure-body (the right authoring -// for quiet briefs — "安静/每个词都要读到" wants no setpiece at all). -const HEROLESS = !theme.hero; -if (HEROLESS) theme.hero = {}; -const hero = theme.hero.match ? findPhrase(theme.hero.match) : null; -if (!hero && !HEROLESS) - throw new Error( - "[make-theme] theme.json requires hero:{match} (omit hero entirely for a quiet pure-body run)", - ); -const heroText = (theme.hero.text || theme.hero.match || "").toUpperCase(); -const heroDisplay = theme.hero.text || theme.hero.match; // case preserved for drawon/assembly - -// mark hero transcript words as consumed when the setpiece is EMBED (not inline): -// the rail/panel/poem must NOT contain them (rail↔climax hand-off), except panel -// with redact linkage (panel shows them redacted — author includes them). -const redactLinkage = (dna.linkages || []).includes("redact-until-hero"); -if (!heroInline && !HEROLESS && !redactLinkage) { - for (let k = 0; k < hero.len; k++) tWords[hero.idx + k].used = true; -} - -// resolve lines: every entry gets word objects with timings + role flags -const minors = new Set((theme.minors || []).map(norm)); -const LINES = (theme.lines || []).map((arr, li) => { - const words = arr.map((a) => { - const tw = takeWord(a); - return { - display: a, - start: tw.start, - end: tw.end, - minor: minors.has(norm(a)), - isHero: - !!hero && - norm(a) === norm((theme.hero.match || "").split(/\s+/)[0]) && - tw.start >= hero.start - 0.01 && - tw.start <= hero.end + 0.01, - }; - }); - return { id: li, words }; -}); -// completeness gate -const unused = tWords.filter((w) => !w.used); -if (unused.length) - throw new Error( - `[make-theme] transcript words not covered by lines/hero: ${unused.map((w) => w.text).join(" ")}`, - ); - -// per-line windows -LINES.forEach((L, i) => { - L.in = L.words[0].start - 0.02; - L.out = i + 1 < LINES.length ? LINES[i + 1].words[0].start - 0.02 : DUR - 0.1; -}); -const LASTWORD = LINES[LINES.length - 1].words[LINES[LINES.length - 1].words.length - 1]; - -// hero window: onset → bounded hold (maxHold; 0 = to clip end — neonsign's -// lit-sign design). Unbounded default holds turned short clips into wallpaper. -const heroIn = hero ? hero.start : -999; -const MAXHOLD = dna.hero.maxHold ?? 3.2; -const heroOut = hero - ? Math.min(DUR - 0.06, theme.hero.out ?? (MAXHOLD > 0 ? heroIn + MAXHOLD : DUR - 0.1)) - : -999; - -// ---------- hero geometry: scene-aware position + width-fit size (computed ONCE, -// shared by the setpiece and the front fx so flash/rings/sparks stay centered) ---- -const HG = { x: dna.hero.x ?? W / 2, y: dna.hero.y ?? H * 0.37, fontPx: dna.hero.fontPx || 178 }; -if (!heroInline && !HEROLESS) { - if (dna.hero.setpiece === "detonation") { - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 178, 0.56, 0.92); - Object.assign(HG, sceneHeroXY("detonation", HG.fontPx)); - HG.halfW = (heroText.length * 0.56 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "decode") { - const units = [...heroText].reduce((a, c) => a + (c === " " ? 0.38 : 0.82), 0); - HG.fontPx = Math.min(dna.hero.fontPx || 112, Math.floor((W * 0.94) / units)); - Object.assign(HG, sceneHeroXY("decode", HG.fontPx)); - HG.halfW = (units * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "drawon") { - Object.assign(HG, sceneHeroXY("drawon", 130)); - HG.halfW = Math.min(dna.hero.params.targetWidth || 640, W - 200) / 2; - } else if (dna.hero.setpiece === "cpslam") { - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 168, 0.56, 0.9); - Object.assign(HG, sceneHeroXY("cpslam", HG.fontPx)); - HG.halfW = (heroText.length * 0.56 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "settle") { - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 150, 0.58, 0.9); - Object.assign(HG, sceneHeroXY("settle", HG.fontPx)); - HG.halfW = (heroText.length * 0.58 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "flapboard") { - // one flap tile per char; tile geometry derives from fontPx (demo ratio - // 100px tile @ 138px Anton), width-fit shrinks both together - const gap = dna.hero.params.gap || 7; - const n = heroText.length; - let fpx = dna.hero.fontPx || 138; - let tw = Math.round(fpx * 0.725); - const fitW = W * 0.94 - 40 - (n - 1) * gap; - if (n * tw > fitW) { - tw = Math.floor(fitW / n); - fpx = Math.round(tw / 0.725); - } - HG.fontPx = fpx; - Object.assign(HG, sceneHeroXY("flapboard", fpx)); - HG.tileW = tw; - HG.tileH = Math.round(tw * 1.48); - HG.halfW = (n * tw + (n - 1) * gap + 40) / 2; - } else if (dna.hero.setpiece === "ledwipe") { - // LED transit panel: the word lights inside a fixed departure-board panel - // (demo 1080×232 @ 120px VT323 ≈ 0.50em/char incl tracking) — width-fit - // shrinks the type, never the panel; panel height derives from the type - const panelW = Math.min(dna.hero.params.panelW || 1080, W - 120); - const units = heroText.length * 0.5; - HG.fontPx = Math.min(dna.hero.fontPx || 120, Math.floor((panelW - 80) / units)); - Object.assign(HG, sceneHeroXY("ledwipe", HG.fontPx)); - HG.panelW = panelW; - HG.panelH = 44 + Math.round(HG.fontPx * 1.42) + 18; - HG.halfW = panelW / 2; - } else if (dna.hero.setpiece === "vhsosd") { - // camcorder OSD readout (demo: VT323 150px ≈ 0.47em/char incl 0.02em tracking) - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 150, 0.47, 0.92); - Object.assign(HG, sceneHeroXY("vhsosd", HG.fontPx)); - HG.halfW = (heroText.length * 0.47 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "bossintro") { - // 8-bit boss word (demo: Press Start 2P 84px ≈ 1.0em/char); the pixel-block - // matrix derives from the word rect (cell 0.7×/0.5× fontPx, ~50px side pad) - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 84, 1.0, 0.92); - Object.assign(HG, sceneHeroXY("bossintro", HG.fontPx)); - HG.halfW = (heroText.length * 1.0 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "rubberstamp") { - // bordered rubber-stamp face (demo: Special Elite 120px REMARKABLE ≈ - // 0.60em/char + 0.015em tracking); the face adds padding + border that - // scale with fontPx (80px + 12px at the demo size) - HG.fontPx = fitHeroPx(heroText, dna.hero.fontPx || 120, 0.615, 0.86); - Object.assign(HG, sceneHeroXY("rubberstamp", HG.fontPx)); - HG.halfW = (heroText.length * 0.615 * HG.fontPx + (92 * HG.fontPx) / 120) / 2; - } else if (dna.hero.setpiece === "lasercage") { - // beam-cage word (demo: Audiowide 100px): exact em width from the measured - // char table — the converging beams, cage lines and glow stack all derive - // from the word rect, so the fit must not guess - const em1 = wordPx(heroText, dna.fonts.hero, 1, 0.02) || heroText.length * 0.8; - HG.fontPx = Math.min(dna.hero.fontPx || 100, Math.floor((W * 0.9) / em1)); - Object.assign(HG, sceneHeroXY("lasercage", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "boltstrike") { - // storm slam (demo: Anton 145px REMARKABLE): exact em width from the - // measured char table — the bolt offsets, word scrim and ozone glow all - // derive from the word rect (demo rect: 720×145 → halfW 360) - const em1 = wordPx(heroText, dna.fonts.hero, 1, 0.012) || heroText.length * 0.56; - HG.fontPx = Math.min(dna.hero.fontPx || 145, Math.floor((W * 0.92) / em1)); - Object.assign(HG, sceneHeroXY("boltstrike", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "holoboot") { - // volumetric projection word (demo: Orbitron 700 118px, letter-spacing 0): - // exact em width from the measured char table — the projection cone, seed - // beam, emitter dot and scrim all derive from the word rect - const em1 = wordPx(heroText, dna.fonts.hero, 1, 0) || heroText.length * 0.8; - HG.fontPx = Math.min(dna.hero.fontPx || 118, Math.floor((W * 0.9) / em1)); - Object.assign(HG, sceneHeroXY("holoboot", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "biobloom") { - // abyss bloom word (demo: Fredoka 700 120px RECOVER, 0.01em tracking): - // exact em width from the measured char table — the tendril anchors, - // pocket scrim, pre-glow and spill all derive from the word rect - const em1 = wordPx(heroText, dna.fonts.hero, 1, 0.01) || heroText.length * 0.66; - HG.fontPx = Math.min(dna.hero.fontPx || 120, Math.floor((W * 0.9) / em1)); - Object.assign(HG, sceneHeroXY("biobloom", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "silkribbon") { - // silk ribbon draw-on (demo: HersheyScript "recover" w=880 on a 1010×280 - // canvas, ink center ≈ canvas center): the canvas, aurora-gradient span - // and spill all derive from targetWidth; 115 ≈ the ribbon's ink height - // (sky band top → ribbon center, same registration as the demo) - Object.assign(HG, sceneHeroXY("silkribbon", 115)); - HG.ribbonW = Math.min(dna.hero.params.targetWidth || 880, W - 240); - HG.halfW = (HG.ribbonW + 130) / 2; - } else if (dna.hero.setpiece === "scopetrace") { - // phosphor trace word (demo: HersheyScript "pixel size" ≈705px ink, ink - // center ≈ baseline − 28): the surge column, flatline flash, spill and - // write window all derive from targetWidth; 115 ≈ the trace's ink height - Object.assign(HG, sceneHeroXY("scopetrace", 115)); - HG.traceW = Math.min(dna.hero.params.targetWidth || 720, W - 200); - HG.halfW = (HG.traceW + 50) / 2; - } else if (dna.hero.setpiece === "papermat") { - // torn-paper letter chips glued on a kraft mat (demo: Anton 130px ink on - // 118×170 chips, pitch tileW+14, mat N*pitch+80 wide × 240 tall): chip - // geometry derives from fontPx (demo ratios), width-fit shrinks both - const n = heroText.length; - let fpx = dna.hero.fontPx || 130; - let tw = Math.round(fpx * 0.91); - const fitW = W * 0.94 - 80 - n * 14; - if (n * tw > fitW) { - tw = Math.floor(fitW / n); - fpx = Math.round(tw / 0.91); - } - HG.fontPx = fpx; - Object.assign(HG, sceneHeroXY("papermat", fpx)); - HG.tileW = tw; - HG.tileH = Math.round(fpx * 1.31); - HG.pitch = tw + 14; - HG.matW = n * HG.pitch + 80; - HG.matH = Math.round(fpx * 1.846); - HG.halfW = HG.matW / 2; - } else if (dna.hero.setpiece === "centerfold") { - // pop-up book centerfold (demo: Baloo 2 800 120px STARS over a 12-point - // paper starburst, outer R 220 ≈ 0.59×wordW, box 620×560 = 2R+180 × 2R+fontPx): - // the bursts, blob shadow, struts and the confetti hinge all derive from - // the word rect; width-fit shrinks the type, the burst follows the word - // but is capped so the unfold stays inside the frame - const em1 = wordPx(heroText, dna.fonts.hero, 1, 0.02) || heroText.length * 0.62; - HG.fontPx = Math.min(dna.hero.fontPx || 120, Math.floor((W * 0.5) / em1)); - Object.assign(HG, sceneHeroXY("centerfold", HG.fontPx)); - HG.wordW = Math.round(em1 * HG.fontPx); - HG.burstR = Math.round(Math.min(Math.max(1.83 * HG.fontPx, 0.59 * HG.wordW), H * 0.42)); - HG.boxW = Math.max(2 * HG.burstR + 180, HG.wordW + 24); - HG.boxH = 2 * HG.burstR + HG.fontPx; - HG.halfW = HG.boxW / 2; - } else if (dna.hero.setpiece === "chalkwrite") { - // hand-written chalk word (demo: HersheyScript "remarkable" ≈860px ink, - // ink 130 tall, ink CENTER on HG.y): the writing starts at the board's - // LEFT margin — a hand writes from the left, never centered on the - // subject — so x derives from the body strip, not the hero anchor; the - // stroke path is parsed at compile time inside the setpiece and the - // board rect / underlines / fg dust clap all register on the measured - // ink box. 130 ≈ the chalk ink height (band top → ink center). - const stripW9 = (dna.body.strip && dna.body.strip.w) || 1200; - const SX9 = (dna.body.strip && dna.body.strip.x) ?? Math.round((W - stripW9) / 2); - HG.chalkW = Math.min(dna.hero.params.targetWidth || 860, stripW9 - 28); - HG.fontPx = 130; - Object.assign(HG, sceneHeroXY("chalkwrite", 130)); - if ((theme.hero && theme.hero.x) == null) HG.x = SX9 + 12 + Math.round(HG.chalkW / 2); - HG.halfW = Math.round(HG.chalkW / 2); - } else if (dna.hero.setpiece === "spraytag") { - // spray-painted tag (demo: HersheyScript "recover" w=1000 → ink ≈1010×120, - // ink center (646,252)): the tag CENTERS on the hero anchor in the sky - // band — crossing the subject silhouette is the point; the stroke path is - // parsed at compile time inside the setpiece, which registers the - // pen-finish point on HG for the fg paint splat (fx.paintsplat). 120 ≈ the - // tag's ink height (band top → ink center); halfW adds the halo overspray. - HG.sprayW = Math.min(dna.hero.params.targetWidth || 1000, W - 140); - HG.fontPx = 120; - Object.assign(HG, sceneHeroXY("spraytag", 120)); - HG.halfW = Math.round(HG.sprayW / 2) + 30; - } else if (dna.hero.setpiece === "brushwrite") { - // sumi-e gesture (demo: HersheyScript "remarkable" w=760 → ink ≈760×115, - // ink center (863,202)): the gesture CENTERS on the hero anchor in the sky - // band — crossing the subject silhouette is the point; the stroke path is - // parsed at compile time inside the setpiece, which registers the - // pen-START point on HG for the fg ink flecks (fx.brushflecks). 120 ≈ the - // gesture's ink height (band top → ink center); halfW adds spatter margin. - HG.brushW = Math.min(dna.hero.params.targetWidth || 760, W - 240); - HG.fontPx = 120; - Object.assign(HG, sceneHeroXY("brushwrite", 120)); - HG.halfW = Math.round(HG.brushW / 2) + 40; - } else if (dna.hero.setpiece === "inkbloom") { - // sumi drop in still water (demo: Shippori Mincho 700 132px "pixel size.", - // 0.02em tracking, case preserved): exact em width from the measured char - // table — the blob stack, ripple rings and wisp anchors all derive from - // the word rect (kx/ky scale units inside the setpiece) - const em1 = wordPx(heroDisplay, dna.fonts.hero, 1, 0.02) || heroDisplay.length * 0.5; - HG.fontPx = Math.min(dna.hero.fontPx || 132, Math.floor((W * 0.9) / em1)); - Object.assign(HG, sceneHeroXY("inkbloom", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx) / 2; - } else if (dna.hero.setpiece === "ransomnote") { - // ransom-note letter chips (demo: 10 chips, 4 recipes/fonts cycled, base - // 130px with seeded ±13% sizes): width-fit uses the measured advance of - // each glyph IN ITS OWN recipe font + 0.20em chip padding + 6px margins, - // so the crooked collage never overflows the frame - const fams4 = [dna.fonts.body, dna.fonts.dark, dna.fonts.news, dna.fonts.accent]; - let k4 = 0; - const em1 = [...heroText].reduce((a, c) => { - if (c === " ") return a + 0.3; - const fam = fams4[k4++ % 4]; - return a + (famMetrics(fam) ? wordPx(c, fam, 1, 0) : 0.62) + 0.2; - }, 0); - const n = heroText.length; - HG.fontPx = Math.min(dna.hero.fontPx || 130, Math.floor((W * 0.92 - n * 6) / em1)); - Object.assign(HG, sceneHeroXY("ransomnote", HG.fontPx)); - HG.halfW = (em1 * HG.fontPx + n * 6) / 2; - } - // keep the word on frame (when wider than the frame, CENTER it — an inverted - // Math.max/Math.min clamp would silently pin to the lower bound off-center) - if (HG.halfW) - HG.x = - 2 * HG.halfW + 24 > W ? W / 2 : Math.max(HG.halfW + 12, Math.min(W - HG.halfW - 12, HG.x)); - HG.y = Math.max(HG.fontPx * 0.55 + 8, Math.min(H * 0.62, HG.y)); -} - -// ---------- shared emit helpers ---------- -const MULBERRY = `function mulberry32(a){return function(){a|=0;a=(a+0x6D2B79F5)|0;let t=Math.imul(a^(a>>>15),1|a);t=(t+Math.imul(t^(t>>>7),61|t))^t;return((t^(t>>>14))>>>0)/4294967296;}}`; - -// bundled @font-face subset for this DNA's families — the renderer only -// auto-supplies its canonical fonts; anything else silently falls back unless -// the page ships a local @font-face (same determinism contract as Standard). -const FONT_FACES = (() => { - let css = ""; - try { - css = fs.readFileSync(path.join(SKILL, "modes/standard/fonts/fonts.css"), "utf8"); - } catch { - return null; - } - return css - .split("@font-face") - .slice(1) - .map((b) => "@font-face" + b.slice(0, b.indexOf("}") + 1)); -})(); -// per-page: embed only families this page's markup actually references -function fontCssFor(pageParts) { - if (!FONT_FACES) return ""; - const fams = [...new Set(Object.values(dna.fonts || {}))].filter((f) => !/^Hiragino/.test(f)); - const out = []; - for (const fam of fams) { - if (!pageParts.includes(fam)) continue; - // quote-agnostic: fonts.css has shipped with both 'single' and "double" - // quoted family names (formatters flip them); a literal match silently - // skipped EVERY embed and warned on bundled fonts. - const famRe = new RegExp( - `font-family\\s*:\\s*['"]` + fam.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + `['"]`, - ); - const hits = FONT_FACES.filter((b) => famRe.test(b)); - if (!hits.length) - console.error( - `[make-theme] WARN font "${fam}" not in bundled fonts.css -> renderer fallback risk`, - ); - out.push(...hits); - } - return out.join("\n"); -} -const GSAP = ``; - -function bgSkeleton(stageHtml, css, js) { - const FONT_CSS = fontCssFor(stageHtml + css); - return ` - - - - -${GSAP} - - - -
- -
-${stageHtml} -
-
- - -`; -} - -function fgSkeleton(stageHtml, css, js) { - const FONT_CSS = fontCssFor(stageHtml + css); - return ` - - - - -${GSAP} - - - -
-
-${stageHtml} -
-
- - -`; -} - -const esc = (s) => String(s).replace(/&/g, "&").replace(/ ({ - id: "r" + L.id, - in: +L.in.toFixed(3), - out: +L.out.toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - const css = ` - .rail { position:absolute; left:${W / 2}px; top:${H - b.bottomPx}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', sans-serif; font-size:${b.fontPx}px; line-height:1; - letter-spacing:${b.letterSpacing || "0.02em"}; color:${dna.palette.body}; - ${b.textTransform ? "text-transform:" + b.textTransform + ";" : ""} - text-shadow: ${b.glow || "0 3px 14px rgba(0,0,0,0.65), 0 1px 3px rgba(0,0,0,0.5)"}; } - .rail .w { display:inline-block; opacity:0; margin:0 0.14em; } - .rail .w.minor { font-size:${Math.round(b.fontPx * (b.minorScale || 1.4))}px; } - .rail .w.em { color:${dna.palette.em || dna.palette.accent}; font-weight:700; } - ${ - b.rule - ? `#rrule { position:absolute; left:${W / 2}px; top:${H - b.bottomPx + 38}px; width:0; height:2px; - background:${b.rule.color}; opacity:0.5; transform:translateX(-50%); - box-shadow: 0 0 12px ${dna.palette.accent}; }` - : "" - }`; - const html = - lineData.map((L) => `
`).join("\n") + - (b.rule ? `\n
` : ""); - const stamp = b.entrance === "stamp"; - const boot = b.entrance === "bootflick"; - const fade = b.entrance === "fade"; - const js = ` - // ---- body paradigm: RAIL (${b.entrance} in / ${b.exit} out) ---- - const HOT = ${J(dna.palette.hot || dna.palette.accent)}, BONE = ${J(dna.palette.body)}; - const RAIL = ${J(lineData)}; - const rrnd = mulberry32(2026); - RAIL.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt,,minor]) => { - const s = document.createElement("span"); - s.className = "w" + (minor ? (${J(stamp)} || ${J(boot)} ? " minor" : " em") : ""); - s.textContent = txt; line.appendChild(s); - }); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - tl.set(line, { opacity: 1 }, L.in); - const XO = L.out - ${b.exit === "drop" ? "0.18" : "0.17"}; // exit start (single source) - let lastB = -1; // line-y bounce ownership guard - L.words.forEach(([txt, st, minor], wi) => { - const el = line.children[wi]; -${ - boot - ? ` // BOOTFLICK: corrupted-cyan boot 1-2f -> settles to UI color - tl.set(el, { opacity: 0.6, color: "#00F0FF", x: 2 }, st); - if (rrnd() < 0.45) { tl.set(el, { opacity: 0.15, x: -2 }, st + F); tl.set(el, { opacity: 1, color: BONE, x: 0 }, st + 2 * F); } - else { tl.set(el, { opacity: 1, color: BONE, x: 0 }, st + F); } - if (minor) { - tl.fromTo(el, { scale: 1.18 }, { scale: 1, duration: 0.25, ease: "power2.out" }, st + F); - tl.set(el, { textShadow: "2px 0 0 #00F0FF, -2px 0 0 #FF003C, 0 2px 10px rgba(0,0,0,0.75)" }, st + 2 * F); - }` - : fade - ? ` // FADE: 2-frame fade-up — the word simply reads (anchor register) - tl.fromTo(el, { opacity: 0, y: 4 }, { opacity: 1, y: 0, duration: 0.12, ease: "power2.out" }, st); - if (minor) tl.fromTo(el, { scale: 1.07 }, { scale: 1, duration: 0.3, ease: "power2.out" }, st);` - : stamp - ? ` // STAMP: 1f appear oversized+hot, crush, recoil, cool to bone - tl.set(el, { opacity: 1, scale: minor ? 2.1 : 1.28, color: HOT, transformOrigin: "50% 80%" }, st); - tl.to(el, { scale: 1, duration: 0.11, ease: "power3.in" }, st + 0.01); - tl.set(el, { scaleX: 1.05, scaleY: 0.95 }, st + 0.12); - tl.to(el, { scaleX: 1, scaleY: 1, duration: 0.22, ease: "elastic.out(1, 0.45)" }, st + 0.16); - tl.to(el, { color: minor ? ${J(dna.palette.minorCool || "#F2CFA0")} : BONE, duration: minor ? 0.6 : 0.32, ease: "power1.in" }, st + 0.15); - if (st + 0.02 >= lastB && st + 0.24 <= XO) { // one bounce owner at a time; none during exit - tl.set(line, { y: minor ? 4 : 2 }, st + 0.02); - tl.to(line, { y: 0, duration: 0.18, ease: "power2.out" }, st + 0.06); - lastB = st + 0.24; - }` - : ` // FLICK: tube lights with seeded double-flicks - tl.set(el, { opacity: 0.35 }, st); - if (rrnd() < 0.35) { tl.set(el, { opacity: 0.08 }, st + F); tl.set(el, { opacity: 1 }, st + 2 * F); } - else { tl.set(el, { opacity: 1 }, st + F); } - if (minor) tl.fromTo(el, { scale: ${dna.body.emScale || 1.18} }, { scale: 1, duration: 0.3, ease: "power2.out" }, st + F);` -} - }); -${ - b.exit === "drop" - ? ` // DROP exit (completes before the next line stamps) - tl.to(line, { y: 34, opacity: 0, duration: 0.16, ease: "power2.in" }, XO); - tl.set(line, { display: "none" }, XO + 0.18);` - : b.exit === "fade" - ? ` // FADE exit (quiet settle-down) - tl.to(line, { opacity: 0, y: 6, duration: 0.15, ease: "power1.in" }, XO); - tl.set(line, { display: "none" }, XO + 0.17);` - : ` // POWERCUT exit (completes before the next line) - tl.set(line, { opacity: 0.5 }, XO); tl.set(line, { opacity: 0.12 }, XO + F); - tl.set(line, { opacity: 0 }, XO + 3 * F); tl.set(line, { display: "none" }, XO + 4 * F);` -} - }); -${ - b.rule - ? ` tl.fromTo("#rrule", { width: 0, opacity: 0 }, { width: ${b.rule.width}, opacity: 0.5, duration: 0.4, ease: "power2.out" }, 0.25); - tl.to("#rrule", { opacity: 0, duration: 0.3 }, ${(DUR - 0.2).toFixed(2)});` - : "" -} -${ - !HEROLESS && b.yield - ? ` // rail yields while the apex lands (furniture never contests the hero). - // Overlap guards: dim starts after the line is IN, never runs into the exit; - // restore is emitted only with clear runway before the exit (else the line - // simply exits dimmed — never two owners of one opacity). - RAIL.forEach((L) => { - if (L.in < ${heroIn.toFixed(3)} + 0.9 && L.out > ${heroIn.toFixed(3)} - 0.3) { - const XO2 = L.out - ${b.exit === "drop" ? "0.18" : "0.17"}; - const dimT = Math.max(${(heroIn - (b.yield.pre || 0.2)).toFixed(3)}, L.in + 0.05); - if (XO2 > dimT + 0.25) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.2 }, dimT); - const resT = ${(heroIn + (b.yield.post || 0.9)).toFixed(3)}; - if (resT + 0.3 < XO2) tl.to("#" + L.id, { opacity: 1, duration: 0.25 }, resT); - } - } - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmPanel() { - const b = dna.body; - const lockT = - heroIn + 0.3 + (dna.hero.params.lockStagger || 0.045) * (heroText.length - 1) + 0.083; - const lineData = LINES.map((L) => ({ - id: "ln" + L.id, - words: L.words.map((w) => [ - w.display, - +w.start.toFixed(3), - // redaction: words inside the hero phrase window get blocks until lock - hero && redactLinkage && w.start >= hero.start - 0.01 && w.start <= hero.end + 0.01 - ? +lockT.toFixed(3) - : 0, - ]), - })); - const lineH = Math.round(b.fontPx * 1.35); - const maxVis = Math.max(3, Math.floor((H * 0.48 - 60) / lineH)); - const dockCss = CLEARER === "right" ? `right:${b.panel.left}px;` : `left:${b.panel.left}px;`; - const css = ` - #panel { position:absolute; ${dockCss} bottom:${b.panel.bottom}px; width:${b.panel.width}px; - padding:18px 22px 22px; background:${dna.palette.panelBg}; - border:1px solid ${dna.palette.accent}59; border-radius:4px; opacity:0; - box-shadow: 0 0 24px rgba(0,0,0,0.35), inset 0 0 60px ${dna.palette.accent}0a; } - #panel .hd { font-family:'${dna.fonts.tag}', monospace; font-size:22px; color:${dna.palette.prompt}; - letter-spacing:2px; border-bottom:1px solid ${dna.palette.accent}40; - padding-bottom:8px; margin-bottom:10px; } - .ln { font-family:'${dna.fonts.body}', monospace; font-size:${b.fontPx}px; line-height:1.35; - color:${dna.palette.body}; text-shadow: 0 0 8px ${dna.palette.accent}59; - white-space:nowrap; opacity:0; } - .ln .pr { color:${dna.palette.prompt}; margin-right:8px; } - .ln .w { display:inline-block; overflow:hidden; vertical-align:bottom; white-space:nowrap; - margin-right:0.3em; } - .ln .red { color:#7adcff; } - .caret { display:inline-block; width:14px; height:26px; background:${dna.palette.body}; - vertical-align:baseline; opacity:0; margin-left:4px; } - #logclip { max-height:${maxVis * lineH}px; overflow:hidden; } - #logwrap { position:relative; }`; - const html = `
-
${esc(theme.panelHeader || "OBS-01 // " + (b.panel.header || "LOG_"))}
-
-${lineData.map((L) => `
`).join("\n")} -
-
`; - const js = ` - // ---- body paradigm: PANEL (typed console log, accumulate) ---- - tl.fromTo("#panel", { opacity: 0, x: -16 }, { opacity: 1, x: 0, duration: 0.3, ease: "power2.out" }, 0.05); -${ - !HEROLESS && b.yield - ? ` tl.to("#panel", { opacity: ${b.yield.dim}, duration: 0.25, ease: "power1.in" }, ${(heroIn - 0.08).toFixed(3)}); - tl.to("#panel", { opacity: 1, duration: 0.3, ease: "power1.out" }, ${(lockT + 0.15).toFixed(3)});` - : "" -} - const LOG = ${J(lineData)}; - const MAXVIS = ${maxVis}, LINEH = ${lineH}; - LOG.forEach((L, li) => { - if (li >= MAXVIS) { // terminal scroll: older rows slide up out of the clip - tl.to("#logwrap", { y: -(li - MAXVIS + 1) * LINEH, duration: 0.28, ease: "power2.out" }, - L.words[0][1] - 0.10); - } - const line = document.getElementById(L.id); - const p = document.createElement("span"); p.className = "pr"; p.textContent = "$"; - line.appendChild(p); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.03); - L.words.forEach(([txt, st, redUntil]) => { - const wrap = document.createElement("span"); wrap.className = "w"; - const inner = document.createElement("span"); - inner.textContent = redUntil ? "█".repeat(Math.max(3, txt.length - 1)) : txt; - wrap.appendChild(inner); line.appendChild(wrap); - tl.fromTo(wrap, { width: 0 }, { width: "auto", duration: 0.12, - ease: "steps(" + Math.max(2, txt.length) + ")" }, st); - if (redUntil) { - const real = document.createElement("span"); - real.textContent = txt; real.style.display = "none"; real.className = "red"; - wrap.appendChild(real); - tl.set(inner, { display: "none" }, redUntil); - tl.set(real, { display: "inline" }, redUntil); - } - }); -${ - b.caret - ? ` const c = document.createElement("span"); c.className = "caret"; line.appendChild(c); - const lastEnd = L.words[L.words.length - 1][1] + 0.25; - for (let bk = 0; bk < 4; bk++) tl.set(c, { opacity: bk % 2 === 0 ? 1 : 0 }, lastEnd + bk * 0.22); - tl.set(c, { opacity: 0 }, lastEnd + 0.9);` - : "" -} - }); -${ - (dna.linkages || []).includes("corrupt-on-last-word") - ? ` // the feed corrupts on the final word - const NZ = ${(LASTWORD.start + 0.04).toFixed(3)}; - [[3,0],[-4,1],[3,2],[-2,3],[0,4]].forEach(([dx, k]) => { - tl.set("#panel", { x: dx, filter: dx ? "hue-rotate(" + dx * 8 + "deg)" : "none" }, NZ + k * F); - }); - tl.set("#panel", { x: 0, filter: "none" }, NZ + 5 * F);` - : "" -}`; - return { css, html, js }; -} - -function paradigmPoem() { - const b = dna.body; - const colLeft = CLEARER === "right" ? Math.round(W * 0.52) : b.left; - const scrimSide = CLEARER === "right" ? "right" : "left"; - // stanza split: break after a line whose last word ends a sentence - const stanzas = [[]]; - LINES.forEach((L) => { - stanzas[stanzas.length - 1].push(L); - const last = L.words[L.words.length - 1].display; - if (/[.!?]$/.test(last) && L !== LINES[LINES.length - 1]) stanzas.push([]); - }); - if (stanzas.some((s) => s.length > b.stanzaTops.length)) - console.warn( - "[make-theme] poem stanza exceeds available slots — extra lines share the last slot", - ); - const stanzaData = stanzas.map((s, si) => - s.map((L, li) => ({ - id: "s" + si + "l" + L.id, - top: b.stanzaTops[Math.min(li, b.stanzaTops.length - 1)] + si * 16, - words: L.words.map((w) => [ - w.display, - +w.start.toFixed(3), - w.isHero && heroInline ? "big" : w.minor ? "em" : "", - ]), - })), - ); - const lastStanzaIdx = stanzaData.length - 1; - const css = ` - ${ - b.scrim - ? `#pscrim { position:absolute; inset:0; opacity:0; - background: linear-gradient(${scrimSide === "left" ? "100deg" : "260deg"}, - rgba(4,8,16,${b.scrim.opacity}) 0%, rgba(4,8,16,${b.scrim.opacity * 0.6}) 38%, rgba(4,8,16,0) 62%); }` - : "" - } - .pline { position:absolute; left:${colLeft}px; white-space:nowrap; - font-family:'${dna.fonts.body}', serif; font-weight:600; font-size:${b.fontPx}px; - line-height:1; color:${dna.palette.body}; - text-shadow: 0 0 14px rgba(255,244,214,0.5), 0 2px 12px rgba(0,0,0,0.6); } - .pline .l { display:inline-block; opacity:0; } - .pline .sp { display:inline-block; width:0.28em; } - .pline .big { font-size:${Math.round(b.fontPx * (b.bigScale || 2))}px; font-style:italic; font-weight:700; - text-shadow: 0 0 24px rgba(255,244,214,0.7), 0 2px 14px rgba(0,0,0,0.6); } - .pline .em { font-size:${Math.round(b.fontPx * (b.emScale || 1.38))}px; font-style:italic; font-weight:700; } - .star { position:absolute; border-radius:50%; background:#fff7e0; opacity:0; - box-shadow: 0 0 8px rgba(255,247,224,0.9); }`; - const html = - (b.scrim ? `
\n` : "") + - stanzaData - .flat() - .map((L) => `
`) - .join("\n"); - const disperse = (dna.linkages || []).includes("disperse-on-last-word"); - const js = ` - // ---- body paradigm: POEM (condense, accumulate, ${disperse ? "disperse" : "hold"}) ---- - const prnd = mulberry32(${b.seed || 777}); - const stage = document.getElementById("stage"); -${ - b.scrim - ? ` tl.fromTo("#pscrim", { opacity: 0 }, { opacity: 1, duration: 0.6, ease: "power1.out" }, 0.15); - tl.to("#pscrim", { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(LASTWORD.start + 0.15).toFixed(3)});` - : "" -} - const STANZAS = ${J(stanzaData)}; - const lastLetters = []; - STANZAS.forEach((stanza, si) => { - stanza.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt, st, cls], wi) => { - if (wi > 0) { const g = document.createElement("span"); g.className = "sp"; line.appendChild(g); } - const letters = []; - for (const ch of txt) { - const l = document.createElement("span"); - l.className = "l" + (cls ? " " + cls : ""); l.textContent = ch; - line.appendChild(l); letters.push(l); - } - const spread = cls === "big" ? ${dna.hero.params.spread || 150} : 46; - letters.forEach((l, li) => { - const sx = (prnd() - 0.5) * 2 * spread, sy = (prnd() - 0.5) * 2 * spread * 0.7; - tl.fromTo(l, { x: sx, y: sy, opacity: 0, filter: "blur(6px)" }, - { x: 0, y: 0, opacity: 1, filter: "blur(0px)", - duration: cls === "big" ? 0.7 : 0.5, ease: "power2.out" }, - st - 0.04 + li * (cls === "big" ? 0.03 : 0.016)); - if (si === ${lastStanzaIdx}) lastLetters.push(l); - }); - if (cls === "big") { - // SETPIECE assembly: star particles fly INTO the apex as it forms - const lt = line.style.top ? parseFloat(line.style.top) : 110; - for (let i = 0; i < ${dna.hero.params.particles || 22}; i++) { - const p = document.createElement("div"); - p.className = "star"; stage.appendChild(p); - const s = 2 + Math.round(prnd() * 3); - const tx = ${colLeft} + 90 + prnd() * 240, ty = lt - 20 + prnd() * 70; - const fx = tx + (prnd() - 0.5) * 560, fy = ty + (prnd() - 0.5) * 380; - gsap.set(p, { width: s, height: s, left: fx, top: fy }); - tl.to(p, { keyframes: { x: [0, (tx - fx) * 0.6, tx - fx], y: [0, (ty - fy) * 0.6, ty - fy], - opacity: [0, 0.95, 0] }, - duration: 0.5 + prnd() * 0.2, ease: "power2.in" }, st - 0.05 + prnd() * 0.3); - } - tl.fromTo(letters, { textShadow: "0 0 30px rgba(255,244,214,0.9), 0 2px 12px rgba(0,0,0,0.5)" }, - { textShadow: "0 0 18px rgba(255,244,214,0.55), 0 2px 12px rgba(0,0,0,0.5)", - duration: 0.8, ease: "power1.out" }, st + 0.55); - } - }); - }); - // earlier stanzas drift out before the next stanza begins - if (si < STANZAS.length - 1) { - const nextIn = STANZAS[si + 1][0].words[0][1]; - stanza.forEach((L, k) => { - tl.to("#" + L.id + " .l", { y: -10, opacity: 0, filter: "blur(4px)", - duration: 0.5, ease: "power1.in", stagger: 0.008 }, nextIn - 0.62 + k * 0.12); - tl.set("#" + L.id, { display: "none" }, nextIn + 0.1); - }); - } - }); -${ - disperse - ? ` // SEMANTIC EXIT: the whole visible poem disperses on the final word. - // Clamped so the scatter COMPLETES before the clip ends (stagger included). - const NZ = ${Math.min(LASTWORD.start + 0.06, DUR - 0.58).toFixed(3)}; - const DDUR = ${Math.min(0.42, Math.max(0.24, DUR - Math.min(LASTWORD.start + 0.06, DUR - 0.58) - 0.14)).toFixed(2)}; - lastLetters.forEach((l) => { - const dx = (prnd() - 0.5) * 260, dy = (prnd() - 0.5) * 200 - 40; - tl.to(l, { x: dx, y: dy, opacity: 0, filter: "blur(7px)", - duration: DDUR, ease: "power2.in" }, NZ + prnd() * 0.05); - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmTakeover() { - const b = dna.body; - // each LINE is a card; minors hot; hero = colorflip apex inline - const cards = LINES.map((L, i) => { - const txt = L.words - .map((w) => w.display) - .join(" ") - .toUpperCase(); - const isHero = L.words.some((w) => w.isHero); - const hot = isHero || L.words.some((w) => w.minor); - const _contentish = txt.replace(/[^A-Z]/g, "").length; - const px = isHero - ? dna.hero.fontPx || 196 - : Math.min( - b.sizes.minor, - Math.round(Math.min(b.sizes.content, (W * 0.86) / (0.55 * Math.max(3, txt.length)))), - ); - return { - id: "c" + i, - txt, - in: +L.in.toFixed(3), - out: +L.out.toFixed(3), - px, - hot: hot ? 1 : 0, - hero: isHero ? 1 : 0, - last: i === LINES.length - 1 ? 1 : 0, - }; - }); - // a held card before a silence ≥0.5s creeps, then VOID until the next card - for (let i = 0; i + 1 < cards.length; i++) { - const gap = cards[i + 1].in - LINES[i].words[LINES[i].words.length - 1].end; - if (gap > 0.5) { - cards[i].creep = 1; - cards[i].out = +(cards[i + 1].in - Math.min(0.6, gap * 0.45)).toFixed(3); - } - } - const css = ` - #dim { position:absolute; inset:0; opacity:0; background:#05070c; } - .card { position:absolute; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', sans-serif; line-height:1; letter-spacing:0.015em; - color:${dna.palette.body}; text-shadow: 0 4px 26px rgba(0,0,0,0.65); } - .card.hot { color:${dna.palette.accent}; - text-shadow: 0 0 34px ${dna.palette.accent}73, 0 4px 26px rgba(0,0,0,0.65); }`; - const html = `
`; - const js = ` - // ---- body paradigm: TAKEOVER (hard-cut full-frame cards) + colorflip apex ---- - const stage = document.getElementById("stage"); - const ANCH = ${J(b.anchors)}; - tl.fromTo("#dim", { opacity: 0 }, { opacity: ${b.baseDim}, duration: 0.25, ease: "power2.in" }, 0.05); - const CARDS = ${J(cards)}; - CARDS.forEach((c, ci) => { - const el = document.createElement("div"); - el.className = "card" + (c.hot ? " hot" : ""); - el.textContent = c.txt; el.style.fontSize = c.px + "px"; - stage.appendChild(el); - const [ax, ay] = ANCH[ci % ANCH.length]; - gsap.set(el, { left: ax, top: ay, xPercent: -50, yPercent: -50, - rotation: (ci % 2 === 0 ? 1 : -1) * (0.8 + (ci % 3) * 0.7) }); - if (c.hero) { - // SETPIECE colorflip: crush-in, squash, settle; plate dim deepens - tl.set("#dim", { opacity: ${dna.hero.params.dimKick} }, c.in); - tl.to("#dim", { opacity: ${b.baseDim}, duration: 0.5, ease: "power2.out" }, c.in + 0.12); - tl.set(el, { opacity: 1, scale: ${dna.hero.params.crushFrom}, filter: "blur(10px) brightness(2.6)" }, c.in - 0.04); - tl.to(el, { scale: 1, filter: "blur(0px) brightness(1)", duration: 0.11, ease: "power4.in" }, c.in - 0.04); - tl.set(el, { scaleX: 1.10, scaleY: 0.92 }, c.in + 0.07); - tl.to(el, { scaleX: 1, scaleY: 1, duration: 0.45, ease: "elastic.out(1.05, 0.36)" }, c.in + 0.15); - tl.to(el, { scale: 1.05, duration: Math.max(0.2, c.out - c.in - 0.3), ease: "power1.inOut" }, c.in + 0.25); - } else if (c.hot) { - tl.set(el, { opacity: 1, scale: ${b.hotSnap} }, c.in); - tl.to(el, { scale: 1, duration: 0.22, ease: "back.out(1.8)" }, c.in + 0.02); - } else { - tl.set(el, { opacity: 1, scale: 0.94 }, c.in); - tl.to(el, { scale: c.creep ? ${b.creepScale} : 1.0, - duration: Math.max(0.08, c.out - c.in - 0.02), - ease: c.creep ? "power1.in" : "power2.out" }, c.in + 0.01); - } - if (c.last && ${J(!!dna.hero.params.dissolveLast)}) { - tl.to(el, { filter: "blur(9px)", opacity: 0, duration: 0.32, ease: "power2.in" }, c.out - 0.23); - tl.set(el, { display: "none" }, c.out + 0.1); - } else { - tl.set(el, { opacity: 0, display: "none" }, c.out); - } - }); - tl.to("#dim", { opacity: 0, duration: 0.3, ease: "power1.in" }, ${(DUR - 0.27).toFixed(2)});`; - return { css, html, js }; -} - -/* ===================================================================== - * HERO SETPIECES (embedded, bg layer) — { css, html, js } for index.html - * ===================================================================== */ - -function setpieceDetonation() { - const h = dna.hero, - p = h.params, - I = heroIn; - const bw = Math.min(p.barWidth, W - 100, HG.halfW * 2 + 140); - const css = ` - #scrim { position:absolute; inset:0; opacity:0; - background: radial-gradient(120% 105% at 50% 38%, rgba(0,0,0,0) 26%, rgba(0,0,0,0.8) 100%); } - #dimP { position:absolute; inset:0; opacity:0; background:#000; } - #det { position:absolute; left:${HG.x}px; top:${HG.y}px; opacity:0; } - .band, #heat { position:absolute; left:0; top:0; transform:translate(-50%,-50%); - font-family:'${dna.fonts.hero}', sans-serif; font-size:${HG.fontPx}px; line-height:1; - letter-spacing:0.012em; white-space:nowrap; color:${dna.palette.body}; - text-shadow: 0 3px 18px rgba(0,0,0,0.55), 0 1px 3px rgba(0,0,0,0.4); } - ${p.slices.map((s, i) => `#b${i + 1} { clip-path: inset(${s[0]}% 0 ${s[1]}% 0); }`).join("\n ")} - #heat { top:6px; color:#ff7a28; filter:blur(24px); opacity:0; text-shadow:none; } - .bar { position:absolute; left:50%; width:${bw}px; height:3px; margin-left:-${bw / 2}px; - background:${dna.palette.body}; opacity:0.85; transform-origin:50% 50%; } - #barT { top:-${Math.round(HG.fontPx * 0.7)}px; } #barB { top:${Math.round(HG.fontPx * 0.66)}px; } - .tick { position:absolute; width:3px; height:14px; background:${dna.palette.hot}; top:-${Math.round(HG.fontPx * 0.7)}px; opacity:0; } - #tickL { left:calc(50% - ${bw / 2}px); } #tickR { left:calc(50% + ${bw / 2 - 3}px); } - #tagwrap { position:absolute; left:50%; transform:translateX(-50%); top:${Math.round(HG.fontPx * 0.7)}px; - overflow:hidden; white-space:nowrap; } - #tag { font-family:'${dna.fonts.tag}', monospace; font-size:21px; letter-spacing:0.34em; - color:${dna.palette.hot}; white-space:nowrap; text-shadow: 0 2px 8px rgba(0,0,0,0.6); }`; - const html = `
-
-
${esc(heroText)}
- ${p.slices.map((_, i) => `
${esc(heroText)}
`).join("\n ")} - ${p.bars ? `
` : ""} - ${p.ticks ? `
` : ""} - ${p.tag ? `
${esc(p.tag)} // T+${heroIn.toFixed(2)}S
` : ""} -
`; - const bandIds = p.slices.map((_, i) => "#b" + (i + 1)); - const js = ` - // ---- setpiece: DETONATION (charge → sheared slices snap → cool → furniture) ---- - const I = ${I.toFixed(3)}, HOTC = ${J(dna.palette.hot)}, BONEC = ${J(dna.palette.body)}; - tl.fromTo("#scrim", { opacity: 0 }, { opacity: ${dna.plate.charge}, duration: 0.40, ease: "power2.in" }, I - 0.42); - tl.set("#dimP", { opacity: ${dna.plate.dim} }, I); - tl.to("#dimP", { opacity: ${(dna.plate.dim * 0.47).toFixed(2)}, duration: 0.9, ease: "power2.out" }, I + 0.10); - tl.to("#scrim", { opacity: 0.30, duration: 0.9, ease: "power2.out" }, I + 0.10); - tl.to(["#scrim","#dimP"], { opacity: 0, duration: 0.45, ease: "power1.in" }, ${(heroOut - 0.25).toFixed(3)}); - tl.set("#det", { opacity: 1 }, I - 0.05); - tl.fromTo("#det", { scale: 3.4 }, { scale: 1.0, duration: 0.10, ease: "power4.in" }, I - 0.05); - const BANDS = ${J(bandIds)}; - const SHEAR = ${J(p.sliceShear)}; - BANDS.forEach((sel, i) => { - tl.fromTo(sel, { x: SHEAR[i], filter: "blur(14px) brightness(3.4)" }, - { x: SHEAR[i] * 0.26, filter: "blur(0px) brightness(1.5)", duration: 0.10, ease: "power4.in" }, I - 0.05); - }); - tl.set(BANDS, { x: 0, filter: "brightness(1.9)" }, I + 0.05); - tl.set("#det", { scaleX: 1.12, scaleY: 0.90 }, I + 0.05); - tl.to("#det", { scaleX: 1, scaleY: 1, duration: 0.55, ease: "elastic.out(1.05, 0.34)" }, I + 0.13); - tl.to(BANDS, { filter: "brightness(1)", duration: 0.5, ease: "power2.out" }, I + 0.15); - tl.set(BANDS, { color: HOTC }, I + 0.05); - tl.to(BANDS, { color: BONEC, duration: 0.9, ease: "power1.in" }, I + 0.22); -${p.bars ? ` tl.fromTo(["#barT","#barB"], { scaleX: 0, opacity: 0.85 }, { scaleX: 1, duration: 0.34, ease: "expo.out" }, I + 0.16);` : ""} -${ - p.ticks - ? ` tl.set(["#tickL","#tickR"], { opacity: 1 }, I + 0.42); - tl.fromTo(["#tickL","#tickR"], { scaleY: 0 }, { scaleY: 1, duration: 0.14, ease: "back.out(2)" }, I + 0.42);` - : "" -} -${p.tag ? ` tl.fromTo("#tagwrap", { width: 0 }, { width: 340, duration: 0.45, ease: "steps(16)" }, I + 0.5);` : ""} - tl.fromTo("#heat", { opacity: 0 }, { opacity: 0.75, duration: 0.3 }, I + 0.06); - tl.to("#heat", { keyframes: { opacity: [0.75, 0.5, 0.6, 0.4, 0.46, 0.30] }, duration: 1.4, ease: "none" }, I + 0.5); - tl.to("#det", { scale: 1.035, duration: 1.2, ease: "power1.inOut" }, I + 0.75); - // EXIT: the stamp shears apart - BANDS.forEach((sel, i) => { - tl.to(sel, { x: -SHEAR[i] * 1.5, opacity: 0, duration: 0.16, ease: "power2.in" }, ${(heroOut - 0.18).toFixed(3)} + i * 0.01); - }); - tl.to(["#barT","#barB","#tickL","#tickR","#tagwrap","#heat"], { opacity: 0, duration: 0.13 }, ${(heroOut - 0.18).toFixed(3)}); - tl.set("#det", { display: "none" }, ${(heroOut + 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceDecode() { - const h = dna.hero, - p = h.params, - I = heroIn; - const lockStagger = p.lockStagger || 0.045; - const E = theme.hero.exitAt ?? Math.min(heroOut, I + 1.75); - const broom = Math.min(HG.x, W - HG.x) - HG.halfW; // room for brackets - const useBrackets = !!p.brackets && broom > 22; - const boff = Math.max(14, Math.min(40, Math.floor(broom - 8))); - const css = ` - #dimP { position:absolute; inset:0; opacity:0; background:#021018; } - #blk { position:absolute; left:${HG.x}px; top:${HG.y}px; transform:translate(-50%,-50%); opacity:0; } - #word { display:flex; align-items:flex-start; justify-content:center; - font-family:'${dna.fonts.hero}', sans-serif; font-weight:800; font-size:${HG.fontPx}px; - line-height:${HG.fontPx}px; color:#eafaff; - text-shadow: 0 0 14px ${dna.palette.accent}8c, 0 3px 16px rgba(0,0,0,0.6); } - .reel { display:block; height:${HG.fontPx}px; width:0.82em; overflow:hidden; text-align:center; } - .reel.sp { width:0.38em; } - .col { display:block; } .col span { display:block; height:${HG.fontPx}px; } - .br { position:absolute; width:26px; height:26px; opacity:0; } - .br.tl { left:-${boff}px; top:-30px; border-left:3px solid ${dna.palette.accent}; border-top:3px solid ${dna.palette.accent}; } - .br.tr { right:-${boff}px; top:-30px; border-right:3px solid ${dna.palette.accent}; border-top:3px solid ${dna.palette.accent}; } - .br.bl { left:-${boff}px; bottom:-34px; border-left:3px solid ${dna.palette.accent}; border-bottom:3px solid ${dna.palette.accent}; } - .br.brr{ right:-${boff}px; bottom:-34px; border-right:3px solid ${dna.palette.accent}; border-bottom:3px solid ${dna.palette.accent}; }`; - const html = `
-
-
- ${useBrackets ? `
` : ""} -
`; - const js = ` - // ---- setpiece: DECODE (glyph reels lock left→right, CRT-off exit) ---- - const I = ${I.toFixed(3)}, TEXT = ${J(heroText)}, GLYPHS = ${J(p.glyphs)}; - const drnd = mulberry32(${p.seed || 99}); - tl.fromTo("#dimP", { opacity: 0 }, { opacity: ${dna.plate.dim}, duration: 0.3, ease: "power2.in" }, I - 0.25); - tl.to("#dimP", { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(E + 0.05).toFixed(3)}); - const word = document.getElementById("word"); - const reels = []; - for (let i = 0; i < TEXT.length; i++) { - const ch = TEXT[i]; - const reel = document.createElement("span"); - reel.className = "reel" + (ch === " " ? " sp" : ""); - const col = document.createElement("span"); col.className = "col"; - if (ch !== " ") { - const n = 5 + Math.floor(drnd() * 4); - for (let k = 0; k < n; k++) { - const s = document.createElement("span"); - s.textContent = GLYPHS[Math.floor(drnd() * GLYPHS.length)]; col.appendChild(s); - } - const fin = document.createElement("span"); fin.textContent = ch; col.appendChild(fin); - reel.dataset.steps = n; - } - reel.appendChild(col); word.appendChild(reel); reels.push({ el: reel, col, ch, i }); - } - tl.set("#blk", { opacity: 1 }, I - 0.02); - reels.forEach((r) => { - if (r.ch === " ") return; - const lock = I + 0.30 + ${lockStagger} * r.i; - const steps = parseInt(r.el.dataset.steps, 10); - tl.fromTo(r.col, { y: 0 }, { y: -${HG.fontPx} * steps, duration: lock - I, ease: "steps(" + steps + ")" }, I); - tl.set(r.el, { color: "#bfe9ff", - textShadow: "3px 0 10px ${dna.palette.accent}cc, -3px 0 10px ${dna.palette.magenta}cc" }, I); - tl.set(r.el, { textShadow: "-3px 0 10px ${dna.palette.accent}cc, 3px 0 10px ${dna.palette.magenta}cc" }, I + 0.12 + 0.02 * r.i); - tl.set(r.el, { color: "#ffffff", textShadow: "0 0 22px rgba(255,255,255,0.95)" }, lock); - tl.set(r.el, { color: "#eafaff", - textShadow: "0 0 14px ${dna.palette.accent}8c, 0 3px 16px rgba(0,0,0,0.6)" }, lock + 0.083); - }); - const LOCKED = I + 0.30 + ${lockStagger} * (TEXT.length - 1) + 0.083; - tl.set("#blk", { scale: 1.04 }, LOCKED - 0.083); - tl.to("#blk", { scale: 1, duration: 0.3, ease: "elastic.out(1, 0.4)" }, LOCKED); -${ - useBrackets - ? ` [".br.tl",".br.tr",".br.bl",".br.brr"].forEach((sel, k) => { - tl.fromTo(sel, { opacity: 0, scale: 0.3 }, { opacity: 0.95, scale: 1, duration: 0.22, ease: "expo.out" }, I - 0.12 + k * 0.05); - });` - : "" -} - // EXIT: CRT power-off - tl.to("#blk", { filter: "brightness(2.6)", duration: 0.07, ease: "power2.in" }, ${E.toFixed(3)}); - tl.to("#blk", { scaleY: 0.012, duration: 0.13, ease: "power4.in" }, ${(E + 0.06).toFixed(3)}); - tl.set("#blk", { opacity: 0, display: "none" }, ${(E + 0.2).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceDrawon() { - const h = dna.hero, - p = h.params, - I = heroIn; - // generate the stroke path at COMPILE time — any word, zero tuning - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = Math.min(p.targetWidth || 640, W - 200); - const D = execFileSync( - "python3", - [gen, fontPath, heroDisplay.toLowerCase(), String(tw), "185", String(Math.round(380 - tw / 2))], - { encoding: "utf8" }, - ).trim(); - const WIN = p.window || 0.78; - const css = ` - #spill { position:absolute; left:${HG.x}px; top:${HG.y}px; width:820px; height:440px; - margin-left:-410px; margin-top:-220px; border-radius:50%; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${dna.palette.accent}57 0%, ${dna.palette.accent}00 70%); } - #sign { position:absolute; left:${HG.x}px; top:${HG.y}px; } - #neonsvg { position:absolute; left:0; top:0; margin-left:-380px; margin-top:-150px; - transform:rotate(${p.rotate || -3}deg); overflow:visible; } - #coreG { filter: drop-shadow(0 0 5px #fff) drop-shadow(0 0 16px ${dna.palette.accent}); } - #pen { filter: drop-shadow(0 0 8px #fff) drop-shadow(0 0 22px ${dna.palette.accent}); }`; - const html = `
-
- - - - - - - - -
`; - const js = ` - // ---- setpiece: DRAWON (single-line font, SEQUENTIAL stroke reveal) ---- - // SVG dash restarts per subpath → one per pen stroke, revealed in - // writing order at constant pen speed; nib rides each stroke, hops at lifts. - const I = ${I.toFixed(3)}, WIN = ${WIN}, DRAWN = I + WIN, ENDT = ${heroOut.toFixed(3)}; - const D = ${J(D)}; - document.getElementById("tubeP").setAttribute("d", D); - const subs = D.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNS = "http://www.w3.org/2000/svg"; - function mk(parent, d, stroke, w) { - const el = document.createElementNS(SVGNS, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", stroke); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); // hidden until its turn (kills round-cap dot) - document.getElementById(parent).appendChild(el); - return el; - } - const strokes = subs.map((d) => ({ halo: mk("haloG", d, ${J(dna.palette.accent)}, ${p.haloWidth}), - core: mk("coreG", d, "#fff", ${p.tubeWidth}) })); - let total = 0; - strokes.forEach((s) => { s.len = s.core.getTotalLength(); total += s.len; }); - tl.fromTo("#tubeP", { opacity: 0 }, { opacity: 1, duration: 0.35 }, I - 0.6); - tl.fromTo("#spill", { opacity: 0 }, { opacity: ${p.spill || 0.38}, duration: WIN + 0.2, ease: "power1.in" }, I); - const pen = document.getElementById("pen"); - let t = I; - strokes.forEach((s) => { - const d = WIN * s.len / total; - gsap.set([s.core, s.halo], { strokeDasharray: s.len, strokeDashoffset: s.len }); - tl.set([s.core, s.halo], { opacity: 1 }, t); - tl.fromTo([s.core, s.halo], { strokeDashoffset: s.len }, { strokeDashoffset: 0, duration: d, ease: "none" }, t); - const n = Math.max(4, Math.round(s.len / 14)), xs = [], ys = []; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); xs.push(pt.x); ys.push(pt.y); - } - tl.set(pen, { x: xs[0], y: ys[0] }, t); - tl.to(pen, { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, t); - t += d; - }); - gsap.set(pen, { attr: { cx: 0, cy: 0 } }); - tl.set(pen, { opacity: 1 }, I - 0.01); - tl.to(pen, { scale: 2.2, opacity: 0, duration: 0.12, ease: "power2.in", transformOrigin: "50% 50%" }, DRAWN); -${ - p.hum - ? ` const humStart = DRAWN + 0.08, humDur = Math.max(0.2, ENDT - humStart); - const NN = Math.max(6, Math.round(humDur / (2 * F))); - const humVals = []; - for (let k = 0; k <= NN; k++) { - const tt = k / NN * humDur; - humVals.push(0.78 + 0.06 * Math.sin(2 * Math.PI * 9 * tt) + 0.05 * Math.sin(2 * Math.PI * 13 * tt + 1.1)); - } - tl.to("#haloG", { keyframes: { opacity: humVals }, duration: humDur, ease: "none" }, humStart); - tl.set("#coreG", { opacity: 0.45 }, ENDT + (${p.buzzDipAt || -0.18})); - tl.set("#coreG", { opacity: 1 }, ENDT + (${p.buzzDipAt || -0.18}) + F);` - : "" -}`; - return { css, html, js }; -} - -/* ===================================================================== - * FRONT FX (fg layer additions) — flash / rings / sparks / scanband - * ===================================================================== */ -function frontFx() { - const fx = dna.fx || {}; - let css = "", - html = "", - js = ""; - const I = heroIn; - if (fx.flash) { - css += ` - #fxflash { position:absolute; inset:0; opacity:0; - background: radial-gradient(95% 80% at 50% 37%, rgba(255,250,240,0.95) 0%, rgba(255,235,210,0.7) 38%, rgba(120,90,60,0) 100%); }`; - html += `
\n`; - js += ` - tl.set("#fxflash", { opacity: ${fx.flash} }, ${(I + 0.045).toFixed(3)}); - tl.to("#fxflash", { opacity: 0, duration: 0.17, ease: "expo.out" }, ${(I + 0.085).toFixed(3)});`; - } - if (fx.rings) { - css += ` - .fxring { position:absolute; left:${HG.x}px; top:${HG.y}px; width:90px; height:32px; - margin-left:-45px; margin-top:-16px; border-radius:50%; opacity:0; } - #fxr1 { border:4px solid rgba(255,228,196,0.95); filter:blur(1.5px); } - #fxr2 { border:3px solid rgba(255,150,70,0.8); filter:blur(3px); }`; - html += `
\n
\n`; - js += ` - tl.set("#fxr1", { opacity: 1, scale: 1 }, ${(I + 0.05).toFixed(3)}); - tl.to("#fxr1", { scale: 16, opacity: 0, duration: 0.58, ease: "expo.out" }, ${(I + 0.05).toFixed(3)}); - tl.to("#fxr1", { filter: "blur(7px)", duration: 0.58, ease: "power1.in" }, ${(I + 0.05).toFixed(3)}); - tl.set("#fxr2", { opacity: 0.55, scale: 1 }, ${(I + 0.13).toFixed(3)}); - tl.to("#fxr2", { scale: 11, opacity: 0, duration: 0.72, ease: "expo.out" }, ${(I + 0.13).toFixed(3)});`; - } - if (fx.sparks) { - css += ` - .fxspark { position:absolute; left:${HG.x}px; top:${HG.y}px; border-radius:2px; - background:#ffd9a8; opacity:0; } - .fxember { position:absolute; border-radius:50%; background:#ff9544; filter:blur(1px); opacity:0; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 7}); - const stg = document.getElementById("stage"); - for (let i = 0; i < ${fx.sparks}; i++) { - const el = document.createElement("div"); el.className = "fxspark"; stg.appendChild(el); - const ang = frnd() * Math.PI * 2, dist = 130 + frnd() * 330; - const dx = Math.cos(ang) * dist, dy = Math.sin(ang) * dist * 0.55; - const grav = 40 + frnd() * 90, s = 3 + Math.round(frnd() * 5), d = 0.6 + frnd() * 0.45; - gsap.set(el, { width: s, height: s, x: 0, y: 0 }); - tl.set(el, { opacity: 1 }, ${(I + 0.05).toFixed(3)}); - tl.to(el, { keyframes: { x: [0, dx*0.55, dx*0.85, dx], - y: [0, dy*0.55 + grav*0.15, dy*0.85 + grav*0.55, dy + grav], - opacity: [1, 1, 0.65, 0] }, duration: d, ease: "power2.out" }, ${(I + 0.05).toFixed(3)}); - } - for (let i = 0; i < ${fx.embers || 0}; i++) { - const el = document.createElement("div"); el.className = "fxember"; stg.appendChild(el); - const s = 3 + Math.round(frnd() * 3); - gsap.set(el, { width: s, height: s, left: ${HG.x - 220} + frnd() * 440, top: ${HG.y + 32} + frnd() * 60 }); - const t0 = ${(I + 0.6).toFixed(3)} + frnd() * 0.9, dr = 1.0 + frnd() * 0.7; - const yA = -40 - frnd() * 50, yB = -80 - frnd() * 60; - const xA = (frnd() - 0.5) * 30, xB = (frnd() - 0.5) * 50; - tl.to(el, { keyframes: { opacity: [0, 0.75, 0.4, 0.8, 0], - y: [0, yA*0.5, yA, (yA+yB)/2, yB], - x: [0, xA*0.5, xA, (xA+xB)/2, xB] }, duration: dr, ease: "power1.out" }, t0); - } - }`; - } - if (fx.crowdflash) { - // two stadium camera-flash pops: lock start / lock end (flapboard rhythm) - const [fa, fb] = fx.crowdflash; - const lockEnd = I + ((dna.hero.params || {}).lockWindow || 0.34); - css += ` - #fxcrowd { position:absolute; inset:0; opacity:0; - background: radial-gradient(85% 70% at 50% 34%, rgba(255,250,238,0.85) 0%, - rgba(255,238,210,0.45) 45%, rgba(60,50,35,0) 100%); }`; - html += `
\n`; - js += ` - tl.set("#fxcrowd", { opacity: ${fa} }, ${I.toFixed(3)}); - tl.to("#fxcrowd", { opacity: 0, duration: 0.10, ease: "expo.out" }, ${(I + 0.042).toFixed(3)}); - tl.set("#fxcrowd", { opacity: ${fb} }, ${lockEnd.toFixed(3)}); - tl.to("#fxcrowd", { opacity: 0, duration: 0.12, ease: "expo.out" }, ${(lockEnd + 0.042).toFixed(3)});`; - } - if (fx.paflash) { - // PA-system flash over the board glow at apex contact (ledwipe completes) - const C2 = I + ((dna.hero.params || {}).wipeDur || 0.3); - const pw = (HG.panelW || 900) - 180, - ph = Math.round((HG.panelH || 232) * 1.9); - css += ` - #fxpa { position:absolute; left:${Math.round(HG.x - pw / 2)}px; top:${Math.round(HG.y - ph / 2)}px; - width:${pw}px; height:${ph}px; opacity:0; - background: radial-gradient(closest-side, rgba(255,200,100,0.55), ${dna.palette.accent}00 70%); }`; - html += `
\n`; - js += ` - tl.set("#fxpa", { opacity: ${fx.paflash} }, ${C2.toFixed(3)}); - tl.to("#fxpa", { opacity: 0, duration: 0.22, ease: "expo.out" }, ${(C2 + 0.042).toFixed(3)});`; - } - if (fx.coinflash) { - // 1-frame arcade impact flash at the boss-word strike (the coin blip at - // max amplitude) — vertical center rides the hero band - const FT = I + ((dna.hero.params || {}).flashDelay ?? 0.14); - const cyP = Math.round((HG.y / H) * 100); - css += ` - #fxcoin { position:absolute; inset:0; opacity:0; z-index:16; - background: radial-gradient(58% 38% at 50% ${cyP}%, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0) 70%); }`; - html += `
\n`; - js += ` - tl.set("#fxcoin", { opacity: ${fx.coinflash} }, ${FT.toFixed(3)}); - tl.to("#fxcoin", { opacity: 0, duration: 0.12, ease: "expo.out" }, ${(FT + 0.042).toFixed(3)});`; - } - if (fx.inkflecks) { - // red ink flecks spatter off the rubber-stamp contact (fg layer, ballistic - // with gravity) — fires at C = heroIn + params.crush, the punch anchor - const C4 = I + ((dna.hero.params || {}).crush ?? 0.074); - css += ` - .fxfleck { position:absolute; left:${HG.x}px; top:${HG.y}px; border-radius:50%; - background:${dna.palette.fleck || dna.palette.accent}; opacity:0; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 18}); - const stg = document.getElementById("stage"); - for (let i = 0; i < ${fx.inkflecks}; i++) { - const el = document.createElement("div"); el.className = "fxfleck"; stg.appendChild(el); - const ang = frnd() * Math.PI * 2, dist = 70 + frnd() * 200; - const dx = Math.cos(ang) * dist, dy = Math.sin(ang) * dist * 0.6; - const grav = 30 + frnd() * 60, sz2 = 2 + Math.round(frnd() * 3), d = 0.32 + frnd() * 0.2; - gsap.set(el, { width: sz2, height: sz2, x: 0, y: 0 }); - tl.set(el, { opacity: 1 }, ${C4.toFixed(3)}); - tl.to(el, { keyframes: { x: [0, dx * 0.6, dx], - y: [0, dy * 0.6 + grav * 0.2, dy + grav], - opacity: [1, 0.85, 0] }, - duration: d, ease: "power2.out" }, ${(C4 + 0.01).toFixed(3)}); - } - }`; - } - if (fx.laserflash) { - // apex contact flash in FRONT of everything (the laser ignite pop, 4 - // frames) — sized from the hero rect, tinted with the accent - const fw = Math.round(2 * (HG.halfW || 330) + 80), - fh = Math.round((HG.fontPx || 100) * 4.8); - css += ` - #fxlaser { position:absolute; left:${HG.x - Math.round(fw / 2)}px; top:${HG.y - Math.round(fh / 2)}px; - width:${fw}px; height:${fh}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(235,255,244,0.9) 0%, ${dna.palette.accent}73 38%, rgba(0,0,0,0) 72%); }`; - html += `
\n`; - js += ` - tl.set("#fxlaser", { opacity: ${fx.laserflash} }, ${(I + 0.03).toFixed(3)}); - tl.to("#fxlaser", { opacity: 0, duration: 0.16, ease: "expo.out" }, ${(I + 0.075).toFixed(3)});`; - } - if (fx.strikeflash) { - // full-frame lightning flash in FRONT of everything: leader blink 2 frames - // before contact (bright / dim alternation), return stroke at contact + 1f, - // expo-out decay — same flicker grammar as the bg bolt - css += ` - #fxstrike { position:absolute; inset:0; opacity:0; - background: radial-gradient(80% 65% at 50% 38%, rgba(245,250,255,0.9) 0%, rgba(205,228,252,0.5) 40%, rgba(110,140,180,0) 100%); }`; - html += `
\n`; - js += ` - tl.set("#fxstrike", { opacity: ${(fx.strikeflash * 0.45).toFixed(3)} }, ${(I - 2 * F).toFixed(3)}); - tl.set("#fxstrike", { opacity: ${(fx.strikeflash * 0.18).toFixed(3)} }, ${(I - F).toFixed(3)}); - tl.set("#fxstrike", { opacity: ${fx.strikeflash} }, ${(I + 0.02).toFixed(3)}); - tl.to("#fxstrike", { opacity: 0, duration: 0.16, ease: "expo.out" }, ${(I + 0.06).toFixed(3)});`; - } - if (fx.holoflash) { - // cyan LOCK flash in front of everything when the projection boots to - // full brightness — a radial centered on the hero (frame-fraction anchor) - const hxP = ((HG.x / W) * 100).toFixed(1), - hyP = ((HG.y / H) * 100).toFixed(1); - css += ` - #fxholo { position:absolute; inset:0; opacity:0; - background: radial-gradient(58% 44% at ${hxP}% ${hyP}%, ${dna.palette.accent}8c 0%, rgba(80,160,200,0.18) 45%, rgba(40,80,110,0) 72%); }`; - html += `
\n`; - js += ` - tl.set("#fxholo", { opacity: ${fx.holoflash} }, ${(I + 0.075).toFixed(3)}); - tl.to("#fxholo", { opacity: 0, duration: 0.22, ease: "expo.out" }, ${(I + 0.105).toFixed(3)});`; - } - if (fx.sporeburst) { - // bioluminescent spores burst PAST the bloom at contact (fg, in front of - // the subject) — seeded radial puffs from the hero center, slight sink - const C6 = I + ((dna.hero.params || {}).crush ?? 0.11); - css += ` - .fxspore { position:absolute; left:${HG.x}px; top:${HG.y}px; border-radius:50%; - background:${dna.palette.spore || dna.palette.accent}; - box-shadow: 0 0 6px 1px ${dna.palette.accent}cc; opacity:0; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 12}); - const stg = document.getElementById("stage"); - for (let i = 0; i < ${fx.sporeburst}; i++) { - const el = document.createElement("div"); el.className = "fxspore"; stg.appendChild(el); - const s = 2 + Math.round(frnd()); - gsap.set(el, { width: s, height: s }); - const ang = frnd() * Math.PI * 2, dist = 70 + frnd() * 110; - const dx = Math.cos(ang) * dist * 1.25, dy = Math.sin(ang) * dist * 0.7; - tl.to(el, { keyframes: { x: [0, dx * 0.6, dx], y: [0, dy * 0.6, dy + 10], - opacity: [0.7, 0.5, 0] }, - duration: 0.45 + frnd() * 0.15, ease: "power2.out" }, ${(C6 + 0.01).toFixed(3)} + i * 0.012); - } - }`; - } - if (fx.silkmotes) { - // gentle aurora light motes drifting up near the ribbon during its hold - // (fg layer) — seeded along the ribbon span at the demo's spread fractions - // (the gap around 0.4 keeps them off the subject's face) - const halfW = HG.halfW || 440; - css += ` - .fxmote { position:absolute; border-radius:50%; opacity:0; filter:blur(1.5px); }`; - js += ` - { const frnd = mulberry32(${fx.seed || 9}); - const stg9 = document.getElementById("stage"); - const PALM = [${J(dna.palette.rose)}, ${J(dna.palette.accent)}, ${J(dna.palette.violet)}]; - const FRX = [-0.88, -0.56, -0.27, 0.05, 0.72, 0.84]; - for (let i = 0; i < ${fx.silkmotes}; i++) { - const m = document.createElement("div"); m.className = "fxmote"; stg9.appendChild(m); - const s = 3 + Math.round(frnd() * 3); - const c = PALM[i % 3]; - const mx = ${HG.x} + FRX[i % 6] * ${Math.round(halfW)} + (frnd() - 0.5) * 40; - const my = ${HG.y} - 5 + frnd() * 110; - gsap.set(m, { width: s, height: s, left: mx, top: my, - background: c, boxShadow: "0 0 6px " + c }); - const t0 = ${(I + 0.13).toFixed(3)} + i * 0.09 + frnd() * 0.08; - tl.fromTo(m, { y: 10 }, - { keyframes: { opacity: [0, 0.45, 0], y: [10, -16, -44] }, - duration: 0.75, ease: "sine.out" }, Math.min(t0, ${(DUR - 0.79).toFixed(3)})); - } - }`; - } - if (fx.paperscraps) { - // torn paper scraps puff PAST the subject at each apex chip contact (fg, - // in front) — ballistic steps(4) arcs, one accent scrap per puff - // (the papermat landing rhythm); centers baked from the chip geometry - const N9 = heroText.length; - const pitch9 = HG.pitch || 132, - step9 = (dna.hero.params || {}).step ?? 0.09; - const y9 = Math.round(HG.y + (HG.tileH || 170) / 2 - 9); - const puffs = []; - for (let i = 0; i < N9; i++) - if (heroText[i] !== " ") - puffs.push([ - Math.round(HG.x + (i - (N9 - 1) / 2) * pitch9), - +(I + i * step9).toFixed(3), - +((i - (N9 - 1) / 2) * 22).toFixed(1), - ]); - css += ` - .fxscrap { position:absolute; opacity:0; border-radius:1px; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 150372}); - const stg = document.getElementById("stage"); - const PUFFS = ${J(puffs)}; - PUFFS.forEach(([px, pc, drift]) => { - for (let k = 0; k < ${fx.paperscraps}; k++) { - const el = document.createElement("div"); el.className = "fxscrap"; stg.appendChild(el); - const s = 7 + Math.round(frnd()*6); - el.style.width = s+"px"; el.style.height = Math.max(4, s-3)+"px"; - el.style.background = (k === 1) ? ${J(dna.palette.accent)} : ${J(dna.palette.chip || "#f6edd8")}; - el.style.left = (px + (frnd()-0.5)*40)+"px"; - el.style.top = (${y9} + (frnd()-0.5)*14)+"px"; - const dx = (frnd()-0.5)*180 + drift; - const dyU = -(35 + frnd()*55); - const dyF = dyU + 80 + frnd()*55; - const rot = (frnd()-0.5)*240; - tl.set(el, { opacity: 1 }, pc); - tl.to(el, { keyframes: { x: [0, dx*0.6, dx], y: [0, dyU, dyF], - rotation: [0, rot*0.6, rot], opacity: [1, 1, 0] }, - duration: 0.42, ease: "steps(4)" }, pc); - } - }); - }`; - } - if (fx.confetti) { - // paper confetti flicks up PAST the subject when the apex word pops (fg, - // in front) — seeded ballistic arcs with card tumble; launch line baked - // from the centerfold hinge (90% of the burst box, where the paper folds) - const u0 = (HG.burstR || 220) / 220; - const boxH0 = HG.boxH || 560; - const hingeY = Math.round(HG.y + 24 * u0 - boxH0 / 2 + 0.9 * boxH0); - const CC = dna.palette.conf || [ - dna.palette.cream || "#f6ecd4", - dna.palette.accent, - dna.palette.body, - ]; - css += ` - .fxconf { position:absolute; opacity:0; border-radius:1px; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 360372}); - const stg = document.getElementById("stage"); - const CCOL = ${J(CC)}; - for (let i = 0; i < ${fx.confetti}; i++) { - const el = document.createElement("div"); el.className = "fxconf"; - el.style.background = CCOL[i % CCOL.length]; stg.appendChild(el); - gsap.set(el, { width: 5 + Math.round(frnd() * 5), height: 4 + Math.round(frnd() * 4), - left: ${HG.x - 30} + frnd() * 70, top: ${hingeY - 2} + frnd() * 16 }); - const dx = (frnd() - 0.5) * 320, up = -90 - frnd() * 140, grav = 150 + frnd() * 120; - const rot = (frnd() - 0.5) * 520, d = 0.55 + frnd() * 0.3, t0 = ${(I + 0.128).toFixed(3)} + frnd() * 0.08; - tl.set(el, { opacity: 1 }, t0); - tl.to(el, { keyframes: { x: [0, dx * 0.5, dx * 0.85, dx], - y: [0, up, up * 0.55 + grav * 0.35, up * 0.1 + grav], - rotation: [0, rot * 0.4, rot * 0.75, rot], - opacity: [1, 1, 0.8, 0] }, - duration: d, ease: "power1.out" }, t0); - } - }`; - } - if (fx.chalkclap) { - // hand-slap dust CLAP in FRONT of the subject the instant the chalk word - // completes (the bg board shakes the same frame) — seeded radial specks + - // a soft blurred puff, centered on the pen's final contact point (baked - // by setpieceChalkwrite into HG.clapX/Y/T) - const cx9 = Math.round(HG.clapX ?? HG.x + (HG.halfW || 80)), - cy9 = Math.round(HG.clapY ?? HG.y), - ct9 = +(HG.clapT ?? I + 0.5).toFixed(3); - const DUST9 = dna.palette.dust || "#f7f5ea"; - css += ` - #fxclap { position:absolute; left:${cx9}px; top:${cy9}px; width:0; height:0; } - #fxclap .cd { position:absolute; left:0; top:0; border-radius:50%; background:${DUST9}; opacity:0; } - #fxpuff { position:absolute; left:-48px; top:-48px; width:96px; height:96px; border-radius:50%; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${DUST9}80 0%, ${DUST9}00 70%); - filter: blur(4px); }`; - html += `
\n`; - js += ` - { const frnd = mulberry32(${fx.seed || 13}); - const clap = document.getElementById("fxclap"); - for (let i = 0; i < ${fx.chalkclap}; i++) { - const s = document.createElement("div"); s.className = "cd"; - const sz = 2.5 + frnd() * 3.2; - s.style.width = sz + "px"; s.style.height = sz + "px"; - s.style.marginLeft = (-sz / 2) + "px"; s.style.marginTop = (-sz / 2) + "px"; - clap.appendChild(s); - const a = (i / ${fx.chalkclap}) * 6.2832 + (frnd() - 0.5) * 0.5; - const dist = 42 + frnd() * 55; - tl.set(s, { opacity: 1 }, ${ct9}); - tl.to(s, { x: Math.cos(a) * dist, y: Math.sin(a) * dist * 0.8 + 26, - duration: 0.5 + frnd() * 0.15, ease: "power2.out" }, ${ct9}); - tl.to(s, { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(ct9 + 0.1).toFixed(3)}); - } - tl.fromTo("#fxpuff", { opacity: 0.55, scale: 0.35 }, - { opacity: 0, scale: 1.8, duration: 0.5, ease: "power2.out" }, ${ct9}); - }`; - } - if (fx.paintsplat) { - // paint SPLAT in FRONT of the subject the instant the spray tag completes - // — a hot magenta ring + a soft paint-color ring + seeded droplets with - // gravity, centered on the pen-finish point (baked by setpieceSpraytag - // into HG.splatX/Y/T) - const sx = Math.max(60, Math.min(W - 60, Math.round(HG.splatX ?? HG.x + (HG.halfW || 80)))); - const sy = Math.round(HG.splatY ?? HG.y); - const st9 = +Math.min(HG.splatT ?? I + 0.5, DUR - 0.5).toFixed(3); - const HOT9 = dna.palette.em2 || dna.palette.hot || "#ff2e88"; - const PAINT9 = dna.palette.accent || "#ffd23f"; - css += ` - .fxsplat { position:absolute; left:${sx}px; top:${sy}px; border-radius:50%; opacity:0; } - #fxsp1 { width:40px; height:30px; border:5px solid ${HOT9}; margin-left:-20px; margin-top:-15px; } - #fxsp2 { width:26px; height:20px; border:4px solid ${PAINT9}; margin-left:-13px; margin-top:-10px; - filter: blur(1.5px); } - .fxsdrop { position:absolute; left:${sx}px; top:${sy}px; background:${HOT9}; - border-radius:50%; opacity:0; }`; - html += `
\n
\n`; - js += ` - tl.set("#fxsp1", { opacity: 1, scale: 0.3 }, ${st9}); - tl.to("#fxsp1", { scale: 4.6, opacity: 0, duration: 0.42, ease: "expo.out" }, ${st9}); - tl.to("#fxsp1", { filter: "blur(4px)", duration: 0.42, ease: "power1.in" }, ${st9}); - tl.set("#fxsp2", { opacity: 0.8, scale: 0.4 }, ${(st9 + 0.04).toFixed(3)}); - tl.to("#fxsp2", { scale: 3.4, opacity: 0, duration: 0.5, ease: "expo.out" }, ${(st9 + 0.04).toFixed(3)}); - { const frnd = mulberry32(${fx.seed || 20260611}); - const stg = document.getElementById("stage"); - for (let i = 0; i < ${fx.paintsplat}; i++) { - const el = document.createElement("div"); - el.className = "fxsdrop"; stg.appendChild(el); - const s = 3 + Math.round(frnd() * 4); - gsap.set(el, { width: s, height: s }); - const ang = frnd() * Math.PI * 2, dist = 36 + frnd() * 64; // capped: stays inside the frame edge - const dx = Math.cos(ang) * dist, dyv = Math.sin(ang) * dist * 0.7; - const grav = 26 + frnd() * 40, d = 0.38 + frnd() * 0.25; - tl.set(el, { opacity: 1, x: 0, y: 0 }, ${st9}); - tl.to(el, { keyframes: { x: [0, dx * 0.6, dx], - y: [0, dyv * 0.6 + grav * 0.2, dyv + grav], - opacity: [1, 0.85, 0] }, - duration: d, ease: "power2.out" }, ${st9}); - } - }`; - } - if (fx.brushflecks) { - // ink flecks kicked PAST the subject at the brush's first contact (the - // start-splat depth pass) — seeded upward ballistic arcs from the pen-START - // point (baked by setpieceBrushwrite into HG.fleckX/Y/T) - const bx = Math.max(40, Math.min(W - 40, Math.round(HG.fleckX ?? HG.x - (HG.halfW || 80)))); - const by = Math.round(HG.fleckY ?? HG.y); - const bt = +Math.min(HG.fleckT ?? I + 0.01, DUR - 0.4).toFixed(3); - css += ` - .fxbfleck { position:absolute; left:${bx}px; top:${by}px; border-radius:50%; - background:${dna.palette.ink || "#1a130c"}; opacity:0; }`; - js += ` - { const frnd = mulberry32(${fx.seed || 20260611}); - const stg = document.getElementById("stage"); - for (let i = 0; i < ${fx.brushflecks}; i++) { - const el = document.createElement("div"); el.className = "fxbfleck"; stg.appendChild(el); - const s = 3 + Math.round(frnd() * 3); - gsap.set(el, { width: s, height: s }); - const a = -0.4 - frnd() * 2.4, dist = 46 + frnd() * 90; - const dx = Math.cos(a) * dist, dyv = Math.sin(a) * dist; - tl.set(el, { opacity: 1 }, ${bt}); - tl.to(el, { keyframes: { x: [0, dx * 0.6, dx], y: [0, dyv * 0.6, dyv + 26], - opacity: [1, 0.85, 0] }, - duration: 0.36, ease: "power2.out" }, ${bt}); - } - }`; - } - if (fx.scanband) { - const lockT = - heroIn + 0.3 + (dna.hero.params.lockStagger || 0.045) * (heroText.length - 1) + 0.083; - css += ` - #fxband { position:absolute; left:0; top:-80px; width:100%; height:70px; opacity:0; - background: linear-gradient(180deg, ${dna.palette.accent}00 0%, ${dna.palette.accent}66 50%, ${dna.palette.accent}00 100%); } - #fxlock { position:absolute; inset:0; opacity:0; - background: radial-gradient(80% 60% at 52% 35%, ${dna.palette.accent}99 0%, ${dna.palette.accent}00 70%); }`; - html += `
\n
\n`; - js += ` - tl.set("#fxband", { opacity: 0.5 }, ${(I - 0.05).toFixed(3)}); - tl.fromTo("#fxband", { y: 0 }, { y: ${H + 160}, duration: 0.5, ease: "power1.in" }, ${(I - 0.05).toFixed(3)}); - tl.set("#fxband", { opacity: 0 }, ${(I + 0.46).toFixed(3)}); - tl.set("#fxlock", { opacity: ${fx.lockflash || 0.55} }, ${(lockT - 0.083).toFixed(3)}); - tl.to("#fxlock", { opacity: 0, duration: 0.2, ease: "expo.out" }, ${lockT.toFixed(3)});`; - } - return { css, html, js }; -} - -/* ===================================================================== - * ASSEMBLE + POSTFX - * ===================================================================== */ -function paradigmLastpage() { - // THE LAST PAGE: a blurred "future manuscript" haunts the room all video; - // at the apex one rack-focus reveals every faint line was the apex word. - const b = dna.body, - I = heroIn; - const prnd = (() => { - let a = b.seed || 4242; - return () => { - a |= 0; - a = (a + 0x6d2b79f5) | 0; - let t = Math.imul(a ^ (a >>> 15), 1 | a); - t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; - return ((t ^ (t >>> 14)) >>> 0) / 4294967296; - }; - })(); - // field instances: seeded positions in the upper room, away from the subject column - const subjX = sz && sz.heroAnchor ? (W * sz.heroAnchor.centerXPct) / 100 : W * 0.5; - const inst = []; - for (let i = 0; i < (b.fieldCount || 9); i++) { - let x = 80 + prnd() * (W - 160), - y = 60 + prnd() * (H * 0.55); - if (Math.abs(x - subjX) < 170) - x = x < subjX ? subjX - 180 - prnd() * 120 : subjX + 180 + prnd() * 120; - inst.push({ - x: Math.round(Math.max(70, Math.min(W - 70, x))), - y: Math.round(y), - px: Math.round(34 + prnd() * 96), - rot: +((prnd() - 0.5) * 8).toFixed(1), - op: +(0.26 + prnd() * 0.2).toFixed(2), - }); - } - const main = inst.reduce((a, c) => (c.px > a.px ? c : a), inst[0]); - const lineData = LINES.map((L) => ({ - id: "m" + L.id, - in: +L.in.toFixed(3), - out: +L.out.toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3)]), - })); - const css = ` -${ - HEROLESS - ? "" - : ` .fld { position:absolute; white-space:nowrap; font-family:'${dna.fonts.body}', serif; - font-weight:600; color:${dna.palette.body}; filter: blur(${b.fieldBlur || 9}px); }` -} - .ms { position:absolute; left:${W / 2}px; top:${H - (b.bottomPx || 96)}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', serif; font-size:${b.fontPx}px; line-height:1; - color:${dna.palette.body}; text-shadow: 0 2px 12px rgba(0,0,0,0.6); } - .ms .w { display:inline-block; opacity:0; margin:0 0.14em; overflow:hidden; vertical-align:bottom; white-space:nowrap; }`; - const html = - (HEROLESS - ? "" - : inst - .map( - (f, i) => - `
${esc(heroDisplay)}
`, - ) - .join("\n") + "\n") + - lineData.map((L) => `
`).join("\n"); - const js = ` - // ---- THE LAST PAGE ---- -${!HEROLESS ? ` const I = ${I.toFixed(3)};` : ""} - const MS = ${J(lineData)}; - MS.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt]) => { const sp = document.createElement("span"); sp.className = "w"; sp.textContent = txt; line.appendChild(sp); }); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - tl.set(line, { opacity: 1 }, L.in); - const XO = L.out - ${b.exit === "drop" ? "0.18" : "0.17"}; // exit start (single source) - let lastB = -1; // line-y bounce ownership guard - L.words.forEach(([txt, st], wi) => { - const el = line.children[wi]; - tl.set(el, { opacity: 1 }, st); - tl.fromTo(el, { width: 0 }, { width: "auto", duration: Math.min(0.18, 0.03 * txt.length + 0.04), - ease: "steps(" + Math.max(2, txt.length) + ")" }, st); - }); - const xo = L.out - 0.18; - tl.to(line, { opacity: 0, duration: 0.16, ease: "power2.in" }, xo); - tl.set(line, { display: "none" }, xo + 0.18); - }); -${ - !HEROLESS - ? ` // the field breathes imperceptibly (alive, unreadable) - ${inst.map((f, i) => `tl.to("#f${i}", { y: ${prnd() - 0.5 > 0 ? "+" : "-"}${(3 + prnd() * 5).toFixed(1)}, duration: ${(2.4 + prnd() * 2).toFixed(1)}, ease: "sine.inOut" }, 0);`).join("\n ")} - // APEX: rack focus — the future was only ever one sentence - tl.to(".fld", { filter: "blur(0px)", duration: 0.38, ease: "power3.inOut" }, I - 0.1); - ${inst - .map((f, i) => - i === inst.indexOf(main) - ? `tl.to("#f${i}", { opacity: 1, scale: 1.22, duration: 0.5, ease: "power2.out" }, I + 0.15); - tl.to("#f${i}", { textShadow: "0 0 28px rgba(255,244,220,0.5)", duration: 0.5 }, I + 0.15);` - : `tl.to("#f${i}", { opacity: ${(f.op * 0.85).toFixed(2)}, duration: 0.5 }, I + 0.3);`, - ) - .join("\n ")} - // hold revealed ~1.2s, then the future blurs back except the main instance - tl.to(".fld", { filter: "blur(${b.fieldBlur || 9}px)", duration: 0.6, ease: "power2.inOut" }, I + 1.5); - tl.to("#f${inst.indexOf(main)}", { filter: "blur(0px)", duration: 0.01 }, I + 1.5); - ${inst.map((f, i) => (i === inst.indexOf(main) ? "" : `tl.to("#f${i}", { opacity: 0, duration: 0.6 }, I + 1.6);`)).join("\n ")} - tl.to("#f${inst.indexOf(main)}", { opacity: 0, duration: 0.3, ease: "power2.in" }, ${(heroOut - 0.3).toFixed(3)});` - : "" -}`; - return { css, html, js }; -} - -function paradigmFlaprail() { - // FLAPRAIL: stadium-departures chyron bar; body words flip in on split-flap - // tiles (2 seeded wrong-word flickers then the real word clacks on), exits - // flip to blank cascading left→right. Furniture: bar tag + ROW flip counter - // (+ optional odometer chip pinned to the first emphasis line). - const b = dna.body; - const barH = b.barH || 96; - const stagger = 0.025, - exDu = 0.075; - const lineData = LINES.map((L) => ({ - id: "fl" + L.id, - in: +L.in.toFixed(3), - out: +L.out.toFixed(3), - words: L.words.map((w) => [w.display.toUpperCase(), +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - const chy = b.chyron || {}; - const ctrVals = lineData.map((_, i) => String(i + 1).padStart(2, "0")); - // odometer chip docks above the bar while the FIRST emphasis line reads - const chipL = b.chip ? LINES.find((L) => L.words.some((w) => w.minor)) : null; - const chipParts = chipL ? String(b.chip.value).split(".") : []; - const css = ` - #flwrap { position:absolute; inset:0; } - #flbar { position:absolute; left:0; right:0; top:${H - barH}px; height:${barH}px; - background: linear-gradient(180deg, rgba(26,29,35,0.93) 0%, rgba(15,17,21,0.96) 100%); - border-top:3px solid ${dna.palette.accent}; - box-shadow: 0 -6px 26px rgba(0,0,0,0.45), inset 0 1px 0 ${dna.palette.accent}40; } - #fltag { position:absolute; left:30px; top:30px; font-family:'${dna.fonts.tag}', sans-serif; - font-weight:600; font-size:25px; letter-spacing:4px; color:${dna.palette.accent}; opacity:0.92; } - #flctr { position:absolute; right:30px; top:22px; white-space:nowrap; } - #flctr .clab { font-family:'${dna.fonts.tag}', sans-serif; font-weight:600; font-size:22px; - letter-spacing:3px; color:#8A8F98; vertical-align:18px; margin-right:8px; } - #ctrbox { display:inline-block; width:54px; height:46px; perspective:260px; vertical-align:top; } - #ctrflap { position:relative; display:block; width:100%; height:100%; transform-origin:50% 0%; - backface-visibility:hidden; border-radius:3px; - background: linear-gradient(180deg,#2E333B 0%,#262B32 48%,#1B1F25 52%,#242930 100%); - box-shadow: inset 0 0 0 1px rgba(0,0,0,0.6), 0 2px 5px rgba(0,0,0,0.5); } - #ctrflap .nv { position:absolute; inset:0; display:none; text-align:center; - font-family:'${dna.fonts.tag}', sans-serif; font-weight:600; font-size:36px; - line-height:50px; color:${dna.palette.accent}; } - .flline { position:absolute; left:${W / 2}px; top:${H - Math.round(barH / 2) - 1}px; white-space:nowrap; } - .ftile { display:inline-block; perspective:240px; opacity:0; margin-right:8px; vertical-align:middle; } - .fflap { position:relative; display:inline-block; transform-origin:50% 0%; backface-visibility:hidden; - font-family:'${dna.fonts.body}', sans-serif; font-weight:600; font-size:${b.fontPx}px; line-height:1; - letter-spacing:${b.letterSpacing || "1px"}; color:${dna.palette.body}; padding:8px 13px 4px; border-radius:4px; - background: linear-gradient(180deg,#31363F 0%,#272C33 47%,#1C2026 53%,#262B32 100%); - box-shadow: inset 0 0 0 1px rgba(0,0,0,0.55), 0 3px 8px rgba(0,0,0,0.5), - inset 0 1px 0 rgba(255,255,255,0.07); - text-shadow: 0 2px 4px rgba(0,0,0,0.45); } - .ftile.em .fflap { box-shadow: inset 0 0 0 1px rgba(0,0,0,0.55), inset 0 -3px 0 ${dna.palette.accent}, - 0 3px 8px rgba(0,0,0,0.5); } - .fflap .rl { visibility:hidden; } - .fflap .wv { position:absolute; left:0; right:0; top:8px; text-align:center; display:none; - color:${dna.palette.grey || "#B9BEC7"}; } -${ - chipL - ? ` #flchip { position:absolute; left:${b.chip.x}px; top:${b.chip.y}px; perspective:300px; opacity:0; } - #chipflap { display:block; transform-origin:50% 0%; backface-visibility:hidden; white-space:nowrap; - background: linear-gradient(180deg,#2B3038 0%,#22262D 50%,#1A1E24 100%); - border-radius:4px; border:1px solid rgba(0,0,0,0.6); padding:5px 12px 3px; - box-shadow: inset 0 0 0 1px ${dna.palette.accent}59, 0 3px 10px rgba(0,0,0,0.5); } - #chipflap .clab { font-family:'${dna.fonts.tag}', sans-serif; font-weight:600; font-size:24px; - letter-spacing:2px; color:${dna.palette.accent}; margin-right:8px; vertical-align:4px; } - .dcol { display:inline-block; height:36px; overflow:hidden; vertical-align:top; } - .dcol span { display:block; height:36px; line-height:38px; font-family:'${dna.fonts.tag}', sans-serif; - font-weight:600; font-size:34px; color:${dna.palette.body}; text-align:center; } - .cfix { display:inline-block; height:36px; line-height:38px; font-family:'${dna.fonts.tag}', sans-serif; - font-weight:600; font-size:34px; color:${dna.palette.body}; vertical-align:top; } - #cunit { font-size:22px; color:#8A8F98; margin-left:3px; } - #bdot { display:inline-block; width:9px; height:9px; border-radius:50%; - background:${dna.palette.accent}; margin-left:9px; vertical-align:14px; opacity:0.15; - box-shadow: 0 0 7px ${dna.palette.accent}cc; }` - : "" -}`; - const html = `
-
-
${esc(chy.tag || "DEPARTURES")}
-
${esc(chy.counter || "ROW")}${ctrVals - .map((v, i) => `${v}`) - .join("")}
-
-${lineData.map((L) => `
`).join("\n")} -${ - chipL - ? `
${esc(b.chip.label)}${chipParts - .map((_, i) => ``) - .join( - `.`, - )}${esc(b.chip.unit || "")}
` - : "" -} -
`; - const js = ` - // ---- body paradigm: FLAPRAIL (split-flap word tiles on a chyron bar) ---- - const HOT = ${J(dna.palette.hot || dna.palette.accent)}, BONE = ${J(dna.palette.body)}; - const frnd2 = mulberry32(${b.seed || 808}); - const GLYPHS = ${J(dna.body.glyphs || "ABCDEFGHIKLMNOPRSTUVXYZ0123456789")}; - function wrongOf(txt) { - let s = ""; - for (const c of txt) s += /[A-Z']/.test(c) ? GLYPHS[Math.floor(frnd2() * GLYPHS.length)] : c; - return s; - } - // chyron bar rides up; nothing visible at t=0 - tl.fromTo("#flbar", { y: ${barH + 14} }, { y: 0, duration: 0.20, ease: "power3.out" }, 0.0); - tl.set("#n0", { display: "block" }, 0.18); - const FRAIL = ${J(lineData)}; - FRAIL.forEach((L, li) => { - const line = document.getElementById(L.id); - const tiles = []; - L.words.forEach(([txt, , em]) => { - const tile = document.createElement("span"); tile.className = "ftile" + (em ? " em" : ""); - const flap = document.createElement("span"); flap.className = "fflap"; - const rl = document.createElement("span"); rl.className = "rl"; rl.textContent = txt; - const w1 = document.createElement("span"); w1.className = "wv"; w1.textContent = wrongOf(txt); - const w2 = document.createElement("span"); w2.className = "wv"; w2.textContent = wrongOf(txt); - flap.appendChild(rl); flap.appendChild(w1); flap.appendChild(w2); - tile.appendChild(flap); line.appendChild(tile); - tiles.push({ tile, flap, rl, w1, w2 }); - }); - gsap.set(line, { xPercent: -50, yPercent: -50 }); - L.words.forEach(([txt, st, em], wi) => { - const { tile, flap, rl, w1, w2 } = tiles[wi]; - // flick 1 (wrong), flick 2 (wrong), flick 3 (real) — the flap motif - tl.set(tile, { opacity: 1 }, st); - tl.set(w1, { display: "block" }, st); - tl.fromTo(flap, { rotationX: -88 }, { rotationX: 0, duration: 0.05, ease: "power1.in" }, st); - tl.set(w1, { display: "none" }, st + 0.055); - tl.set(w2, { display: "block" }, st + 0.055); - tl.set(flap, { rotationX: -88 }, st + 0.055); - tl.to(flap, { rotationX: 0, duration: 0.05, ease: "power1.in" }, st + 0.06); - tl.set(w2, { display: "none" }, st + 0.115); - tl.set(rl, { visibility: "visible" }, st + 0.115); - tl.set(flap, { rotationX: -88, color: HOT }, st + 0.115); - tl.to(flap, { rotationX: 0, duration: 0.065, ease: "power2.in" }, st + 0.12); - // contact squash → elastic settle, paint cools (amber stays on emphasized tiles) - tl.set(tile, { scaleX: 1.05, scaleY: 0.92 }, st + 0.185); - tl.to(tile, { scaleX: 1, scaleY: 1, duration: 0.28, ease: "elastic.out(1, 0.4)" }, st + 0.21); - tl.to(flap, { color: em ? HOT : BONE, duration: 0.35, ease: "power1.in" }, st + 0.25); - }); - // hold life: low breathe on the line - const lastIn = L.words[L.words.length - 1][1] + 0.4; - const span = (L.words.length - 1) * ${stagger} + ${exDu} + 0.02; - const XO = L.out - span; - if (XO - lastIn > 0.3) - tl.to(line, { scale: 1.014, duration: XO - lastIn, ease: "sine.inOut" }, lastIn); - // exit: flip to blank, cascading left→right (completes before the next line) - L.words.forEach((w, wi) => { - const t = XO + wi * ${stagger}; - tl.to(tiles[wi].flap, { rotationX: 90, duration: ${exDu}, ease: "power2.in" }, t); - tl.set(tiles[wi].tile, { opacity: 0 }, t + ${exDu}); - }); - tl.set(line, { display: "none" }, L.out); - }); - // row counter flips at each line change - FRAIL.slice(1).forEach((L, k) => { - const t = L.words[0][1]; - tl.set("#n" + k, { display: "none" }, t); - tl.set("#n" + (k + 1), { display: "block" }, t); - // immediateRender:false — the flap is visible from t=0; the from-state must - // not leak into the opening hold (paused timeline + seek renders it) - tl.fromTo("#ctrflap", { rotationX: -80 }, { rotationX: 0, duration: 0.07, ease: "power2.in", immediateRender: false }, t); - tl.set("#ctrflap", { scaleY: 0.92 }, t + 0.07); - tl.to("#ctrflap", { scaleY: 1, duration: 0.18, ease: "elastic.out(1, 0.45)" }, t + 0.09); - }); -${ - chipL - ? ` // odometer chip (emphasis furniture): clacks on beside the emphasis line, - // digits roll on true reels, status dot blinks through the hold (dead-air life) - const CIN = ${(chipL.words[chipL.words.length - 1].start + 0.06).toFixed(3)}; - const COUT = ${(+chipL.out).toFixed(3)}; - ${J(chipParts)}.forEach((fin, ci) => { - const col = document.getElementById("dc" + ci); - const stack = document.createElement("div"); - const steps = 4 + ci; - for (let k = 0; k < steps; k++) { const s = document.createElement("span"); - s.textContent = Math.floor(frnd2() * 10); stack.appendChild(s); } - const f = document.createElement("span"); f.textContent = fin; stack.appendChild(f); - col.appendChild(stack); - tl.fromTo(stack, { y: 0 }, { y: -36 * steps, duration: 0.42 + ci * 0.13, - ease: "steps(" + steps + ")" }, CIN + 0.08 + ci * 0.04); - }); - tl.set("#flchip", { opacity: 1 }, CIN); - tl.fromTo("#chipflap", { rotationX: -85 }, { rotationX: 0, duration: 0.09, ease: "power2.in" }, CIN); - tl.set("#chipflap", { scaleX: 1.04, scaleY: 0.93 }, CIN + 0.09); - tl.to("#chipflap", { scaleX: 1, scaleY: 1, duration: 0.24, ease: "elastic.out(1, 0.42)" }, CIN + 0.11); - tl.set(".dcol span", { color: HOT }, CIN + 0.67); - tl.to(".dcol span", { color: BONE, duration: 0.4 }, CIN + 0.87); - for (let k = 0; k < 4; k++) { - const t = CIN + 0.64 + k * 0.22; - if (t + 0.11 < COUT - 0.05) { tl.set("#bdot", { opacity: 1 }, t); tl.set("#bdot", { opacity: 0.15 }, t + 0.11); } - } - tl.to("#chipflap", { rotationX: 88, duration: 0.09, ease: "power2.in" }, COUT); - tl.set("#flchip", { display: "none" }, COUT + 0.10);` - : "" -} -${ - !HEROLESS && b.yield - ? ` // rail yields while the apex board locks - tl.to("#flwrap", { opacity: ${b.yield.dim}, duration: 0.18, ease: "power1.in" }, ${(heroIn - (b.yield.pre || 0.07)).toFixed(3)}); - tl.to("#flwrap", { opacity: 1, duration: 0.22, ease: "power1.out" }, ${(heroIn + (b.yield.post || 0.47)).toFixed(3)});` - : "" -}`; - return { css, html, js }; -} - -function paradigmLedboard() { - // LEDBOARD: docked transit departure-strip; body lines arrive by vertical - // SCROLL-SNAP paging (steps(6)) inside the board window; each word lights via - // a small L→R LED column wipe (low-amplitude apex motif) + 1-frame arrival - // flicker; emphasis words get the LED-refresh double-blink. Furniture: green - // platform tag, ticking clock seconds, status swap gag (⚠ DELAYED → ● ON TIME - // shortly after the apex resolves), idle LED shimmer in dead air. - const b = dna.body; - const bd = b.board || {}; - const bw = bd.width || 1000, - bh = bd.h || 116; - const bleft = bd.left ?? Math.round((W - bw) / 2); - const btop = H - (bd.bottom ?? 30) - bh; - const hdrH = 30, - winH = bh - hdrH - 2, - lineH = winH - 2; - const hd = b.header || {}; - const A = dna.palette.accent; - const GRN = dna.palette.green || "#36e57a"; - const WRN = dna.palette.warn || "#ff9e3d"; - const lineData = LINES.map((L) => ({ - id: "t" + L.id, - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - // page-in ~0.2s before the first word lights (the paging IS the anticipation); - // each line pages out exactly as the next pages in (snap swap), last one early - // enough that the 0.20s page-out completes before the clip ends - const pins = LINES.map((L, i) => - i === 0 - ? Math.max(0.02, +(L.words[0].start - 0.22).toFixed(3)) - : +(L.words[0].start - 0.22).toFixed(3), - ); - lineData.forEach((L, i) => { - L.pin = pins[i]; - L.pout = i + 1 < pins.length ? pins[i + 1] : +Math.min(LINES[i].out, DUR - 0.22).toFixed(3); - }); - // idle LED shimmer: any dead air ≥1.2s between word lights gets refresh blips - const starts = LINES.flatMap((L) => L.words.map((w) => w.start)); - const shimmers = []; - for (let i = 0; i + 1 < starts.length; i++) - if (starts[i + 1] - starts[i] > 1.2) - for (let t = starts[i] + 0.43; t < starts[i + 1] - 0.55; t += 0.6) - shimmers.push(+t.toFixed(3)); - // status gag: ⚠ DELAYED blinks while we wait, pages to ● ON TIME after the apex - const swapT = +Math.min(heroIn + 0.69, DUR - 1.2).toFixed(3); - const statBlinks = [swapT - 2.55, swapT - 1.75, swapT - 1.15] - .filter((t) => t > 0.25) - .map((t) => +t.toFixed(3)); - // clock seconds reel: one stacked digit per elapsed second - const nDig = Math.floor(DUR - 0.02) + 1; - const lateT = +(LASTWORD.start + 0.19).toFixed(3); // one late LED refresh on the final word - const css = ` - #tboard { position:absolute; left:${bleft}px; top:${btop}px; width:${bw}px; height:${bh}px; border-radius:6px; - background-color: rgba(8,8,11,0.90); - background-image: radial-gradient(${A}0d 1px, rgba(0,0,0,0) 1.4px); - background-size: 7px 7px; - border:1px solid ${A}47; border-top:2px solid ${A}73; - box-shadow: 0 10px 30px rgba(0,0,0,0.5), inset 0 0 40px ${A}0a; } - #thdr { position:absolute; left:0; right:0; top:0; height:${hdrH}px; - border-bottom:1px solid ${A}38; - font-family:'${dna.fonts.tag}', monospace; font-size:20px; letter-spacing:0.12em; } - #tplt { position:absolute; left:16px; top:4px; color:${GRN}; - text-shadow:0 0 8px ${GRN}80; } - #tstatwin { position:absolute; right:128px; top:3px; width:170px; height:24px; overflow:hidden; } - #tstatstack { position:absolute; left:0; top:0; width:100%; } - .tstrow { display:block; height:24px; line-height:24px; text-align:right; } - #tstrow1 { color:${WRN}; text-shadow:0 0 8px ${WRN}80; } - #tstrow2 { color:${GRN}; text-shadow:0 0 8px ${GRN}80; } - #tclock { position:absolute; right:14px; top:4px; color:${A}bf; - text-shadow:0 0 6px ${A}59; } - #tclock .cw { display:inline-block; width:11px; height:22px; overflow:hidden; - vertical-align:bottom; } - #tdigcol span { display:block; height:22px; line-height:22px; } - #twin { position:absolute; left:0; right:0; top:${hdrH + 2}px; bottom:0; overflow:hidden; } - .tline { position:absolute; left:22px; top:0; height:${lineH}px; line-height:${lineH}px; - font-family:'${dna.fonts.body}', monospace; font-size:${b.fontPx}px; letter-spacing:${b.letterSpacing || "0.05em"}; - color:${dna.palette.body}; white-space:nowrap; - text-shadow: 0 0 9px ${A}73, 0 0 1px ${dna.palette.hot}e6; } - .tline .w { display:inline-block; margin-right:0.35em; }`; - const html = `
-
-
${esc(hd.plt || "PLT 4")}
-
- ${esc(hd.statusWait || "⚠ DELAYED")} - ${esc(hd.statusOk || "● ON TIME")} -
-
${esc(hd.clockPrefix || "19:42:0")}${Array.from( - { length: nDig }, - (_, k) => `${k}`, - ).join("")}
-
-
-
`; - const js = ` - // ---- body paradigm: LEDBOARD (scroll-snap paging + per-word LED column wipes) ---- - const twin = document.getElementById("twin"); - const TRAIL = ${J(lineData)}; - let lastW = null; - TRAIL.forEach((L) => { - const line = document.createElement("div"); line.className = "tline"; - twin.appendChild(line); - gsap.set(line, { y: ${winH + 2} }); // parked below the window - tl.to(line, { y: 0, duration: 0.22, ease: "steps(6)" }, L.pin); // page in - tl.to(line, { y: ${-(winH + 2)}, duration: 0.20, ease: "steps(6)" }, L.pout); // page out - L.words.forEach(([txt, st, em]) => { - const w = document.createElement("span"); w.className = "w"; - w.textContent = txt; line.appendChild(w); lastW = w; - const steps = Math.max(3, txt.length); - tl.fromTo(w, { clipPath: "inset(0% 100% 0% 0%)" }, - { clipPath: "inset(0% 0% 0% 0%)", duration: 0.12, ease: "steps(" + steps + ")" }, st); - tl.set(w, { clipPath: "none" }, st + 0.17); // free the glow - tl.set(w, { opacity: 0.5 }, st + 0.13); // 1-frame arrival flicker - tl.set(w, { opacity: 1 }, st + 0.172); - if (em && st + 0.56 < L.pout) { // LED refresh: blinks twice - tl.set(w, { opacity: 0.22 }, st + 0.30); - tl.set(w, { opacity: 1 }, st + 0.383); - tl.set(w, { opacity: 0.22 }, st + 0.466); - tl.set(w, { opacity: 1 }, st + 0.55); - } - }); - }); -${ - lateT + 0.05 < DUR - 0.25 - ? ` // the final word gets one late LED refresh blink (kept inside the clip) - tl.set(lastW, { opacity: 0.22 }, ${lateT.toFixed(3)}); - tl.set(lastW, { opacity: 1 }, ${(lateT + 0.042).toFixed(3)});` - : "" -} - - // ===== furniture ===== -${ - !HEROLESS - ? ` // status blinks while we wait, then the gag: pages to the OK row - ${J(statBlinks)}.forEach((t) => { - tl.set("#tstrow1", { opacity: 0.35 }, t); - tl.set("#tstrow1", { opacity: 1 }, t + 0.042); - }); - tl.to("#tstatstack", { y: -24, duration: 0.16, ease: "steps(4)" }, ${swapT.toFixed(3)}); - tl.set("#tstrow2", { opacity: 0.5 }, ${(swapT + 0.18).toFixed(3)}); - tl.set("#tstrow2", { opacity: 1 }, ${(swapT + 0.222).toFixed(3)});` - : "" -} - - // clock seconds tick (stacked digit column, stepped shifts) - for (let k = 1; k <= ${nDig - 1}; k++) tl.set("#tdigcol", { y: -22 * k }, k); - - // idle LED refresh shimmer in the dead air (board never freezes) - ${J(shimmers)}.forEach((t) => { - tl.set("#twin", { opacity: 0.88 }, t); - tl.set("#twin", { opacity: 1 }, t + 0.042); - }); -${ - !HEROLESS && b.yield - ? ` - // ===== hierarchy: board yields while the apex lands ===== - tl.to("#tboard", { opacity: ${b.yield.dim}, duration: 0.18, ease: "power1.in" }, ${(heroIn - (b.yield.pre || 0.2)).toFixed(3)}); - tl.to("#tboard", { opacity: 1, duration: 0.25, ease: "power1.out" }, ${(heroIn + (b.yield.post || 0.9)).toFixed(3)});` - : "" -}`; - return { css, html, js }; -} - -function paradigmVhsrail() { - // VHSRAIL: camcorder-playback lower third. Every body word carries a PERMANENT - // 1px red+cyan misregistration fringe and arrives by tracking glitch (instant - // on + 2-frame y-shake + 1-frame band-slice shift of the word's bottom half); - // emphasis words get the PAUSE jitter (±1px y oscillation) + a white noise-band - // flicker. Exits are REWIND streaks left with a flat-white echo copy + scrub - // lines. Furniture: ▶ PLAY / ◀◀ REW top-left (REW gag in dead air and on the - // final rewind), ● REC top-right during the apex window, green timestamp - // bottom-right with a 1 Hz blinking colon, an idle tape-drift line in long - // silences, and the apex-coupled artifacts: 1-frame full white tear band + - // head-switching noise bar at REC FREEZE, scrub lines at the apex band on the - // hero's rewind exit. - const b = dna.body; - const p = dna.hero.params || {}; - const X = theme.hero.exitAt ?? Math.min(heroOut, heroIn + (p.hold ?? 1.69)); // hero REWIND (shared with vhsosd) - const railTop = H - (b.bottomPx || 108); - const osd = b.osd || {}; - const ts = osd.ts || ["JUN.11 2026 PM 7", "42"]; - const A = dna.palette.accent, - GRN = dna.palette.green || dna.palette.accent, - RED = dna.palette.red || "#FF2E2E", - CYN = dna.palette.cyan || "#3FE8E8"; - // line windows: `out` is the REWIND start — early into dead air (with the - // PLAY→REW gag), before the clip end for the last line - const lineData = LINES.map((L, i) => { - const lastEnd = L.words[L.words.length - 1].end; - const next = LINES[i + 1]; - let out = +(L.out - 0.05).toFixed(3), - gag = 0; - if (next && next.in - lastEnd > 0.7) { - out = +(lastEnd + 0.53).toFixed(3); - gag = 1; - } - if (!next) out = +(DUR - 0.14).toFixed(3); - return { - id: "v" + L.id, - eid: "ve" + L.id, - in: +L.in.toFixed(3), - out, - gag, - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - }; - }); - const lastOut = lineData[lineData.length - 1].out; - const css = ` - /* ---- OSD furniture ---- */ - .osd { position:absolute; font-family:'${dna.fonts.tag}', monospace; font-size:28px; line-height:1; - letter-spacing:2px; color:${A}; opacity:0; - text-shadow: -1px 0 0 ${RED}59, 1px 0 0 ${CYN}59, - 0 0 7px rgba(0,0,0,0.95), 0 2px 5px rgba(0,0,0,0.85); } - #osdplay { left:36px; top:34px; } - #pmode, #rmode { display:flex; align-items:center; gap:10px; } - #rmode { display:none; } - .tri { width:0; height:0; border-left:16px solid ${A}; - border-top:9px solid transparent; border-bottom:9px solid transparent; - filter: drop-shadow(0 0 4px rgba(0,0,0,0.9)); } - .rtri { width:0; height:0; border-right:14px solid ${A}; - border-top:8px solid transparent; border-bottom:8px solid transparent; - filter: drop-shadow(0 0 4px rgba(0,0,0,0.9)); } - #rmode .rtri + .rtri { margin-left:-6px; } - #rec { right:36px; top:34px; display:flex; align-items:center; gap:10px; color:${dna.palette.body}; } - #rdot { width:15px; height:15px; border-radius:50%; background:#ff3b30; - box-shadow: 0 0 6px rgba(0,0,0,0.85), 0 0 10px rgba(255,59,48,0.55); } - #osdts { right:36px; bottom:22px; color:${GRN}; - text-shadow: -1px 0 0 ${RED}4d, 1px 0 0 ${CYN}4d, - 0 0 7px rgba(0,0,0,0.95), 0 2px 5px rgba(0,0,0,0.85); } - - /* ---- body rail ---- */ - .vln, .vlnE { position:absolute; left:${W / 2}px; top:${railTop}px; white-space:nowrap; opacity:0; - font-family:'${dna.fonts.body}', monospace; font-size:${b.fontPx}px; line-height:1; - letter-spacing:${b.letterSpacing || "0.04em"}; text-transform:uppercase; - color:${dna.palette.body}; - text-shadow: -1px 0 0 ${RED}66, 1px 0 0 ${CYN}66, - 0 2px 6px rgba(0,0,0,0.85), 0 0 14px rgba(0,0,0,0.55); } - .vlnE { color:#ffffff; text-shadow:none; } - .vw { position:relative; display:inline-block; margin-right:0.3em; opacity:0; } - .vwa { display:inline-block; clip-path: inset(0 0 56% 0); } - .vwb { position:absolute; left:0; top:0; clip-path: inset(44% 0 0 0); } - .vnz { position:absolute; left:-4px; right:-4px; top:30%; height:38%; opacity:0; - background: repeating-linear-gradient(0deg, rgba(255,255,255,0.85) 0 2px, rgba(255,255,255,0) 2px 5px); } - - /* ---- tape artifacts ---- */ - #tear { position:absolute; left:0; top:${HG.y - 55}px; width:100%; height:110px; opacity:0; - background: linear-gradient(180deg, rgba(255,255,255,0.55) 0%, #ffffff 30%, #ffffff 70%, rgba(255,255,255,0.55) 100%); } - #hsbar { position:absolute; left:0; bottom:0; width:100%; height:16px; opacity:0; - background: repeating-linear-gradient(90deg, - rgba(205,205,205,0.92) 0 7px, rgba(60,60,60,0.85) 7px 11px, - rgba(165,165,165,0.9) 11px 19px, rgba(28,28,28,0.85) 19px 26px); } - .scrub { position:absolute; left:0; width:100%; height:3px; opacity:0; - background: linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.75) 8%, - rgba(225,225,225,0.5) 38%, rgba(255,255,255,0.8) 62%, rgba(255,255,255,0) 100%); } - #scrub1 { top:${railTop - 18}px; } #scrub2 { top:${railTop + 20}px; } - #scrub3 { top:${HG.y - 28}px; } #scrub4 { top:${HG.y + 34}px; } - #drift { position:absolute; left:0; top:${railTop + 48}px; width:100%; height:2px; opacity:0; - background: rgba(255,255,255,0.45); }`; - const html = - `
-
PLAY
-
REW
-
-
REC
-
${esc(ts[0])}:${esc(ts[1])}
-` + - lineData - .map( - (L) => `
`, - ) - .join("\n") + - ` -
-
-
-
-
`; - // PLAY → REW gags: each dead-air rewind + the final rewind (no restore) - const gags = lineData - .filter((L) => L.gag) - .map((L) => [+(L.out - 0.01).toFixed(3), +(L.out + 0.35).toFixed(3)]); - gags.push([+(lastOut - 0.01).toFixed(3), null]); - const js = ` - // ---- body paradigm: VHSRAIL (tracking-glitch words, REWIND exits, OSD furniture) ---- -${!HEROLESS ? ` const I = ${heroIn.toFixed(3)}, X = ${X.toFixed(3)};` : ""} - - // ===== OSD furniture: present the whole clip, 1-frame power-on glitch ===== - tl.set(["#osdplay","#osdts"], { opacity: 1, x: 5 }, 0.02); - tl.set(["#osdplay","#osdts"], { x: 0 }, 0.02 + F); - // timestamp colon blinks at 1 Hz - for (let k = 0; 0.50 + k < ${(DUR - 0.04).toFixed(2)}; k++) { - tl.set("#col", { opacity: 0 }, 0.50 + k); - if (1.00 + k < ${(DUR - 0.04).toFixed(2)}) tl.set("#col", { opacity: 1 }, 1.00 + k); - } - // PLAY -> REW gag on each dead-air rewind, and again at the final rewind - ${J(gags)}.forEach(([a, b]) => { - tl.set("#pmode", { display: "none" }, a); - tl.set("#rmode", { display: "flex" }, a); - if (b) { tl.set("#rmode", { display: "none" }, b); tl.set("#pmode", { display: "flex" }, b); } - }); - - // ===== body rail ===== - const VRAIL = ${J(lineData)}; - VRAIL.forEach((L) => { - const line = document.getElementById(L.id); - const echo = document.getElementById(L.eid); - echo.textContent = L.words.map((w) => w[0]).join(" "); - L.words.forEach(([txt]) => { - const w = document.createElement("span"); w.className = "vw"; - const a = document.createElement("span"); a.className = "vwa"; a.textContent = txt; - const b2 = document.createElement("span"); b2.className = "vwb"; b2.textContent = txt; - const n = document.createElement("span"); n.className = "vnz"; - w.appendChild(a); w.appendChild(b2); w.appendChild(n); line.appendChild(w); - }); - gsap.set([line, echo], { xPercent: -50, yPercent: -50 }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.02); - - L.words.forEach(([txt, st, em], wi) => { - const w = line.children[wi]; - const b2 = w.children[1], n = w.children[2]; - // tracking glitch entrance: instant on, 2-frame y-shake, 1-frame band slice shift - tl.set(w, { opacity: 1, y: 3 }, st); - tl.set(b2, { x: 7 }, st); - tl.set(w, { y: -3 }, st + F); - tl.set(b2, { x: 0 }, st + F); - tl.set(w, { y: 0 }, st + 2 * F); - if (em) { - // PAUSE jitter: y oscillation +-1px for 0.3s + white noise band flicker - const e = st + 0.125; - [-1, 1, -1, 1, 0].forEach((v, k) => tl.set(w, { y: v }, e + k * 0.05)); - [0.5, 0, 0.35, 0].forEach((o, k) => tl.set(n, { opacity: o }, e + k * 0.065)); - } - }); - - // REWIND exit: streak left + echo copy + 2 scrub lines - const ed = L.out >= ${(DUR - 0.25).toFixed(2)} ? 0.12 : 0.16; - tl.to(line, { x: -60, opacity: 0, duration: 0.12, ease: "power2.in" }, L.out); - tl.set(echo, { opacity: 0.35 }, L.out + 0.01); - tl.to(echo, { x: -110, opacity: 0, duration: ed, ease: "power2.in" }, L.out + 0.02); - tl.set([line, echo], { display: "none" }, Math.min(L.out + 0.22, ${(DUR - 0.02).toFixed(2)})); - [0.6, 0.25, 0.5, 0].forEach((o, k) => { - tl.set(["#scrub1","#scrub2"], { opacity: o }, Math.min(L.out + k * F, ${(DUR - 0.02).toFixed(2)})); - }); - }); -${ - !HEROLESS && b.yield - ? ` - // rail yields while the apex lands (dim clamped ≥ line-in; restore only with runway) - VRAIL.forEach((L) => { - if (L.in < I + 0.9 && L.out > I - 0.3) { - const dimT = Math.max(I - ${(b.yield.pre || 0.2).toFixed(2)}, L.in + 0.05); - if (L.out > dimT + 0.25) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.12, ease: "power1.in" }, dimT); - const resT = I + ${(b.yield.post || 0.9).toFixed(2)}; - if (resT + 0.3 < L.out) tl.to("#" + L.id, { opacity: 1, duration: 0.25 }, resT); - } - } - });` - : "" -} - - // idle tape noise in dead air - VRAIL.filter((L) => L.gag).forEach((L) => { - tl.set("#drift", { opacity: 0.12 }, L.out + 0.2); - tl.fromTo("#drift", { y: 0 }, { y: -55, duration: 0.5, ease: "none" }, L.out + 0.2); - tl.set("#drift", { opacity: 0 }, L.out + 0.7); - }); - -${ - !HEROLESS - ? ` // ===== REC FREEZE artifacts (apex-coupled, in FRONT of the subject) ===== - // 1-frame full white tear band - tl.set("#tear", { opacity: 0.95 }, I); - tl.set("#tear", { opacity: 0 }, I + F); - // ● REC blinks top-right (1-frame glitch entrance) - tl.set("#rec", { opacity: 1, x: 6 }, I + 0.04); - tl.set("#rec", { x: 0 }, I + 0.04 + F); - [[0.49, 0], [0.79, 1], [1.24, 0], [1.54, 1]].forEach(([dt, o]) => { - if (I + dt < X - 0.05) tl.set("#rdot", { opacity: o }, I + dt); - }); - tl.set("#rec", { opacity: 0 }, X); - // head-switching noise bar: sets every frame for 10 frames - const HSX = [0, 140, 60, 220, 30, 180, 90, 250, 10, 120]; - HSX.forEach((px, k) => { - tl.set("#hsbar", { opacity: k % 2 ? 0.62 : 0.9, backgroundPositionX: px + "px" }, I + k * F); - }); - tl.set("#hsbar", { opacity: 0 }, I + 10 * F); - - // apex REWIND exit: 2 scrub lines at the apex band - [0.6, 0.25, 0.5, 0].forEach((o, k) => tl.set(["#scrub3","#scrub4"], { opacity: o }, X + k * F));` - : "" -} - // head-switch reprise on the final rewind - [[0, 0.85, 40], [0.04, 0.6, 190], [0.08, 0.8, 90]].forEach(([dt, o, px]) => { - tl.set("#hsbar", { opacity: o, backgroundPositionX: px + "px" }, ${lastOut.toFixed(3)} + dt); - }); - tl.set("#hsbar", { opacity: 0 }, ${Math.min(lastOut + 0.12, DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function paradigmHudrail() { - // HUDRAIL: arcade-cabinet HUD. The whole frame plays through a CRT (scanline - // + vignette overlays); body words coin-pop onto a docked HUD bar (2px accent - // border, 1UP / CREDIT tags) with steps(2) pixel pops + a 1-frame white - // coin-blip tick over the word; emphasis words run a 3-frame palette swap - // (body -> accent -> magenta -> body). Lines exit by checkerboard dissolve - // (words vanish in 2 alternating 2-frame passes). The 1UP tag blinks on the - // classic attract cadence all clip; the HUD yields while the boss lands. - const b = dna.body; - const bar = b.bar || {}; - const barH = bar.h || 70, - inset = bar.inset || 24, - barBot = bar.bottom || 50; - const barTop = H - barBot - barH; - const tags = b.tags || {}; - const A = dna.palette.accent, - MG = dna.palette.magenta || "#FF2E88"; - const lineData = LINES.map((L, i) => ({ - id: "h" + L.id, - in: +L.in.toFixed(3), - // checkerboard exit start: just before the next line's first pop - xo: i + 1 < LINES.length ? +(L.out - 0.04).toFixed(3) : +Math.min(L.out, DUR - 0.11).toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - const css = ` - #hud { position:absolute; left:${inset}px; top:${barTop}px; width:${W - 2 * inset}px; height:${barH}px; - opacity:0; background:rgba(3,8,18,0.84); border:2px solid ${A}; - box-shadow:0 0 16px ${A}59, inset 0 0 24px ${A}14; z-index:3; } - .hln { position:absolute; left:50%; top:50%; white-space:nowrap; opacity:0; - font-family:'${dna.fonts.body}', monospace; font-size:${b.fontPx}px; line-height:1; - ${b.textTransform ? "text-transform:" + b.textTransform + ";" : ""} - color:${dna.palette.body}; text-shadow:0 3px 0 rgba(0,0,0,0.6); } - .hw { position:relative; display:inline-block; margin-right:0.45em; opacity:0; } - .hw:last-child { margin-right:0; } - .htick { position:absolute; inset:-3px; background:#ffffff; opacity:0; } - #tagL { position:absolute; left:18px; top:50%; transform:translateY(-50%); - font-family:'${dna.fonts.tag}', monospace; font-size:15px; color:${dna.palette.yellow || A}; - text-shadow:0 2px 0 rgba(0,0,0,0.6); } - #tagR { position:absolute; right:18px; top:50%; transform:translateY(-50%); - font-family:'${dna.fonts.tag}', monospace; font-size:12px; color:${dna.palette.credit || A}; - text-shadow:0 2px 0 rgba(0,0,0,0.6); } - #crtvig { position:absolute; inset:0; opacity:0; z-index:20; pointer-events:none; - background:radial-gradient(120% 95% at 50% 46%, rgba(0,0,0,0) 58%, rgba(0,0,0,0.34) 100%); } - #crtscan { position:absolute; inset:0; opacity:0; z-index:21; pointer-events:none; - background:repeating-linear-gradient(180deg, rgba(0,0,0,0.9) 0px, rgba(0,0,0,0.9) 2px, rgba(0,0,0,0) 2px, rgba(0,0,0,0) 5px); }`; - const html = `
-
${esc(tags.left || "1UP")}
-
${esc(tags.right || "CREDIT 01")}
-${lineData.map((L) => `
`).join("\n")} -
-
-
`; - const js = ` - // ---- body paradigm: HUDRAIL (coin-pop words on an arcade HUD bar) ---- - // world overlays: scanlines + slight vignette - tl.set("#crtscan", { opacity: ${b.scan ?? 0.06} }, 0.03); - tl.set("#crtvig", { opacity: 1 }, 0.03); - // HUD bar boots up - tl.set("#hud", { opacity: 1 }, 0.05); - tl.fromTo("#hud", { y: 14 }, { y: 0, duration: 0.12, ease: "steps(2)" }, 0.05); - // 1UP blink, classic cadence (baked sets) - for (let t = 0.28, k = 0; t < ${(DUR - 0.06).toFixed(2)}; t += 0.45, k++) { - tl.set("#tagL", { opacity: k % 2 === 0 ? 0.3 : 1 }, t); - } - const HUD = ${J(lineData)}; - HUD.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt]) => { - const w = document.createElement("span"); w.className = "hw"; w.textContent = txt; - const tick = document.createElement("div"); tick.className = "htick"; - w.appendChild(tick); line.appendChild(w); - }); - gsap.set(line, { xPercent: -50, yPercent: -50 }); - tl.set(line, { opacity: 1 }, L.in); - L.words.forEach(([txt, st, em], wi) => { - const el = line.children[wi], tick = el.lastChild; - // coin pop: instant-on + steps(2) scale from the baseline + 1-frame blip - tl.set(el, { opacity: 1 }, st); - tl.fromTo(el, { scale: 0 }, { scale: 1, duration: 0.12, ease: "steps(2)", - transformOrigin: "50% 100%" }, st); - tl.set(tick, { opacity: 0.95 }, st); // coin blip, exactly 1 frame - tl.set(tick, { opacity: 0 }, st + 0.042); - if (em) { // 3-frame palette swap (body -> accent -> magenta -> body) - tl.set(el, { color: ${J(A)} }, st + 0.13); - tl.set(el, { color: ${J(MG)} }, st + 0.172); - tl.set(el, { color: ${J(dna.palette.body)} }, st + 0.214); - } - }); - // checkerboard dissolve: words vanish in 2 alternating set passes - L.words.forEach((w, wi) => { - tl.set(line.children[wi], { opacity: 0 }, - wi % 2 === 0 ? L.xo : Math.min(L.xo + 0.083, ${(DUR - 0.03).toFixed(2)})); - }); - tl.set(line, { opacity: 0, display: "none" }, Math.min(L.xo + 0.15, ${(DUR - 0.02).toFixed(2)})); - }); -${ - !HEROLESS && b.yield - ? ` // HUD yields while the boss lands (restore only with runway) - tl.to("#hud", { opacity: ${b.yield.dim}, duration: 0.15, ease: "power1.in" }, ${(heroIn - (b.yield.pre || 0.2)).toFixed(3)}); -${ - heroIn + (b.yield.post || 0.9) + 0.3 < DUR - 0.1 - ? ` tl.to("#hud", { opacity: 1, duration: 0.25, ease: "power1.out" }, ${(heroIn + (b.yield.post || 0.9)).toFixed(3)});` - : "" -}` - : "" -}`; - return { css, html, js }; -} - -function paradigmCarbonstrip() { - // CARBONSTRIP: cold-war case-file transcript strip docked on the clearer - // side (manila gradient, punch holes, faint red watermark, typed case - // header). Carbon type HAMMERS in per word — per-char sets 30ms apart, - // scale 1.35→1 in one frame (the stamp motif at low amplitude) — every - // strike kicks the strip 1px (y-channel locked while the strip itself is - // tweened); seeded ±1.2px baselines + seeded ribbon-ink weight. Emphasis - // words get a red ink ellipse drawn around them. Lines live on up to - // body.rows fixed slots; PAGES (broken at full rows, dead-air gaps > 0.7s, - // and after the hero hand-off line — it is filed away while the stamp owns - // the frame) exit by X-row over-strike (3 chunks per line, lines 0.16s - // apart) then a carriage yank-down feed; the final page is pulled with the - // whole strip at clip end. The strip top-shadow breathes during the - // stamp's dead-still hold; the strip yields (body.yield) while it lands. - const b = dna.body; - const p = dna.hero.params || {}; - const C = heroIn + (p.crush ?? 0.074); // stamp contact (shared with rubberstamp) - const SW = (b.strip && b.strip.w) || 764, - SH = (b.strip && b.strip.h) || 132; - const SX = (b.strip && b.strip.x) ?? (CLEARER === "left" ? 48 : W - 48 - SW); - const ST = H - ((b.strip && b.strip.bottomPx) ?? 4) - SH; - const ROWS = b.rows || [36, 82]; - const FY = +(DUR - 0.1).toFixed(3); // final carriage yank (the file is pulled) - const HDR = b.header || "TRANSCRIPT OF RECORDING"; - const hdrW = Math.round(HDR.length * 11.4); - const hdrSteps = Math.max(8, Math.round(HDR.length * 0.58)); - const rgb = (h) => - [h.slice(1, 3), h.slice(3, 5), h.slice(5, 7)].map((x) => parseInt(x, 16)).join(","); - const ACC = dna.palette.accent || "#b3271e"; - // ---- pages: up to ROWS.length lines per carriage feed ---- - const pages = []; - let cur = []; - LINES.forEach((L, i) => { - cur.push(L); - const next = LINES[i + 1]; - const heroLine = heroIn >= L.in - 0.01 && heroIn < L.out; - const gap = next ? next.words[0].start - L.words[L.words.length - 1].end : 0; - if (!next || cur.length === ROWS.length || heroLine || gap > 0.7) { - pages.push(cur); - cur = []; - } - }); - // ---- exit schedule: X-strike chunks (0.05s apart, lines 0.16s apart) → - // yank → hide → carriage return. Roomy cadence in dead air, compressed - // when the next page is close (both cadences are the demo's). The whole - // exit always completes before the next page's first hammer strike. - const YLOCK = [[0, 0.215]]; // strip-y tween windows: no kicks inside - const pageData = pages.map((pg, pi) => { - const lines = pg.map((L, k) => ({ - id: "d" + L.id, - top: ROWS[k], - n: L.words.reduce((a, w) => a + w.display.length, 0) + L.words.length - 1, - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - if (pi === pages.length - 1) { - YLOCK.push([+(FY - 0.01).toFixed(3), +(DUR + 0.02).toFixed(3)]); - return { lines, xs: null, yank: null, limit: FY }; - } - const lastW = pg[pg.length - 1].words; - const lastEnd = lastW[lastW.length - 1].end; - const nextIn = +(pages[pi + 1][0].words[0].start - 0.02).toFixed(3); - const n = pg.length; - const roomySpan = 0.16 * (n - 1) + 0.55, - tightSpan = 0.16 * (n - 1) + 0.3; - let xt0 = lastEnd + 0.33, - roomy = true; - if (xt0 + roomySpan > nextIn) { - xt0 = Math.max(lastEnd + 0.18, nextIn - roomySpan); - if (xt0 + roomySpan > nextIn + 0.001) { - roomy = false; - xt0 = Math.max(lastEnd + 0.15, nextIn - tightSpan); - } - } - xt0 = +xt0.toFixed(3); - const lastChunkEnd = xt0 + 0.16 * (n - 1) + 0.1; - const yankT = +(lastChunkEnd + (roomy ? 0.14 : 0.07)).toFixed(3); - const yankDur = roomy ? 0.1 : 0.07; - const hideT = +(yankT + (roomy ? 0.11 : 0.07)).toFixed(3); - const returnT = +(yankT + (roomy ? 0.13 : 0.075)).toFixed(3); - const returnDur = roomy ? 0.18 : 0.055; - const fits = xt0 + (roomy ? roomySpan : tightSpan) <= nextIn + 0.02; - YLOCK.push([+(yankT - 0.01).toFixed(3), +(returnT + returnDur).toFixed(3)]); - return { - lines, - xs: fits ? xt0 : null, - yank: [yankT, yankDur, hideT, returnT, returnDur], - limit: hideT, - }; - }); - // red-circle draw durations clamp inside the word's page life - pageData.forEach((pg) => - pg.lines.forEach((ln) => - ln.words.forEach((wd) => { - if (wd[2]) { - const circT = wd[1] + wd[0].length * 0.03 + 0.02; - wd.push(+Math.min(0.25, Math.max(0.14, pg.limit - circT - 0.02)).toFixed(3)); - } - }), - ), - ); - const css = ` - #strip { position:absolute; left:${SX}px; top:${ST}px; width:${SW}px; height:${SH}px; opacity:0; - background: linear-gradient(180deg, #e0cda6 0%, ${dna.palette.paper || "#d8c49a"} 42%, #ccb486 100%); - border:1px solid rgba(106,86,48,0.9); border-radius:2px; - box-shadow: inset 0 1px 0 rgba(255,250,235,0.5), inset 0 -14px 22px rgba(95,74,38,0.18); } - #shade { position:absolute; left:2px; right:2px; top:-16px; height:16px; opacity:0.5; - background: linear-gradient(180deg, rgba(15,10,4,0) 0%, rgba(15,10,4,0.38) 100%); } - .hole { position:absolute; left:14px; width:13px; height:13px; border-radius:50%; - background:rgba(58,45,24,0.34); box-shadow: inset 0 2px 2px rgba(30,22,10,0.5), 0 1px 0 rgba(255,248,230,0.45); } - #wm { position:absolute; right:18px; top:40px; font-family:'${dna.fonts.tag}', serif; - font-size:32px; letter-spacing:7px; color:rgba(${rgb(ACC)},0.13); - transform:rotate(-6deg); white-space:nowrap; } - #hdrwrap { position:absolute; left:52px; top:9px; overflow:hidden; white-space:nowrap; width:0; } - #hdr { font-family:'${dna.fonts.tag}', serif; font-size:14px; letter-spacing:3px; - color:${dna.palette.ink || "#8a6f3f"}; white-space:nowrap; } - .ln { position:absolute; left:52px; font-family:'${dna.fonts.body}', serif; font-size:${b.fontPx}px; - line-height:1; color:${dna.palette.body}; white-space:nowrap; } - .ln .w { display:inline-block; position:relative; margin-right:0.5em; } - .ln .c { display:inline-block; opacity:0; } - .xrow { position:absolute; left:52px; font-family:'${dna.fonts.body}', serif; font-size:${b.fontPx}px; - line-height:1; color:rgba(${rgb(ACC)},0.85); white-space:nowrap; } - .xrow span { opacity:0; } - .circ { position:absolute; left:-13px; top:-9px; width:calc(100% + 26px); - height:calc(100% + 18px); overflow:visible; pointer-events:none; } - .circ ellipse { fill:none; stroke:${ACC}; stroke-width:3.6; stroke-linecap:round; }`; - const html = `
-
-
-
-
${esc(b.watermark || "CONFIDENTIAL")}
-
${esc(HDR)}
-${pageData - .flatMap((pg) => pg.lines) - .map((ln) => `
`) - .join("\n")} -
`; - const shadeStart = +(C + 0.12).toFixed(3); - const shadeDur = Math.min(1.5, FY - shadeStart - 0.05); - const dimT = +(heroIn - ((b.yield && b.yield.pre) || 0.02)).toFixed(3); - const resT = +(heroIn + ((b.yield && b.yield.post) || 0.41)).toFixed(3); - const js = ` - // ---- body paradigm: CARBONSTRIP (typewriter hammer in / X-strike + carriage-feed out) ---- - const strip = document.getElementById("strip"); - const krnd = mulberry32(${b.seed || 180618}); - // y-channel windows where the strip is tweened — no kicks allowed inside - const YLOCK = ${J(YLOCK)}; - function kick(t) { - for (const [a, b] of YLOCK) if (t >= a && t <= b + 0.045) return; - tl.set(strip, { y: 1 }, t); - tl.set(strip, { y: 0 }, t + 0.042); - } - - // ===== strip entrance: the carriage feeds the paper up ===== - tl.set(strip, { opacity: 1 }, 0.02); - tl.fromTo(strip, { y: 130 }, { y: 0, duration: 0.19, ease: "power3.out" }, 0.02); - tl.fromTo("#hdrwrap", { width: 0 }, { width: ${hdrW}, duration: 0.42, ease: "steps(${hdrSteps})" }, 0.10); - - // ===== body: typewriter hammer (per-char sets, 30ms apart) ===== - const PAGES = ${J(pageData)}; - const NS = "http://www.w3.org/2000/svg"; - const strikes = [], circles = []; - PAGES.forEach((pg) => { - pg.lines.forEach((ln) => { - const line = document.getElementById(ln.id); - ln.words.forEach(([txt, st, em, cd]) => { - const w = document.createElement("span"); w.className = "w"; - [...txt].forEach((ch, i) => { - const c = document.createElement("span"); c.className = "c"; c.textContent = ch; - w.appendChild(c); - strikes.push([c, st + i * 0.03]); - }); - if (em) { - const svg = document.createElementNS(NS, "svg"); - svg.setAttribute("class", "circ"); svg.setAttribute("viewBox", "0 0 120 64"); - svg.setAttribute("preserveAspectRatio", "none"); - const el = document.createElementNS(NS, "ellipse"); - el.setAttribute("cx", 60); el.setAttribute("cy", 32); - el.setAttribute("rx", 55); el.setAttribute("ry", 25); - el.setAttribute("transform", "rotate(-4 60 32)"); - svg.appendChild(el); w.appendChild(svg); - circles.push([el, st + txt.length * 0.03 + 0.02, cd]); - } - line.appendChild(w); - }); - }); - }); - strikes.forEach(([c, t]) => { - const off = (krnd() - 0.5) * 2.4; // ±1.2px baseline wobble - const ink = 0.84 + krnd() * 0.16; // uneven ribbon ink - gsap.set(c, { y: off, transformOrigin: "50% 85%" }); - tl.set(c, { opacity: ink, scale: 1.35 }, t); // hammer = the stamp motif, low amplitude - tl.set(c, { scale: 1 }, t + 0.042); - kick(t); // every strike kicks the strip - }); - // red ink circles draw around the emphasis words - circles.forEach(([el, t, d]) => { - const len = el.getTotalLength(); - gsap.set(el, { attr: { "stroke-dasharray": len, "stroke-dashoffset": len } }); - tl.to(el, { attr: { "stroke-dashoffset": 0 }, duration: d, ease: "power2.inOut" }, t); - }); - - // ===== exits: X-row over-strike (3 chunks per line) then carriage yank ===== - PAGES.forEach((pg) => { - const hides = pg.lines.map((ln) => "#" + ln.id); - if (pg.xs != null) pg.lines.forEach((ln, k) => { - const row = document.createElement("div"); - row.className = "xrow"; row.style.top = (ln.top + 2) + "px"; - strip.appendChild(row); hides.push(row); - const third = Math.max(1, Math.ceil(ln.n / 3)); - let left = ln.n; - for (let j = 0; j < 3 && left > 0; j++) { - const nC = Math.min(third, left); left -= nC; - const s = document.createElement("span"); s.textContent = "X".repeat(nC); - row.appendChild(s); - const t = pg.xs + k * 0.16 + j * 0.05; - tl.set(s, { opacity: 1 }, t); - kick(t); - } - }); - if (pg.yank) { - const [yt, yd, ht, rt, rd] = pg.yank; - tl.to(strip, { y: 30, duration: yd, ease: "power3.in" }, yt); - tl.set(hides, { opacity: 0 }, ht); - tl.to(strip, { y: 0, duration: rd, ease: "power2.out" }, rt); - } - }); -${ - !HEROLESS && b.yield - ? ` - // ===== apex etiquette: the strip yields while the stamp lands ===== - tl.to(strip, { opacity: ${b.yield.dim}, duration: 0.18, ease: "power1.in" }, ${dimT}); -${resT + 0.3 < FY ? ` tl.to(strip, { opacity: 1, duration: 0.25, ease: "power1.out" }, ${resT});` : ""}` - : "" -} -${ - !HEROLESS && shadeDur > 0.4 - ? ` - // strip top-shadow breathes during the stamp's dead-still hold - tl.to("#shade", { keyframes: { opacity: [0.5, 0.72, 0.54, 0.7, 0.55, 0.66, 0.5] }, - duration: ${shadeDur.toFixed(2)}, ease: "none" }, ${shadeStart});` - : "" -} - - // ===== ending: the file is pulled — strip yanks down and is gone ===== - tl.to(strip, { y: 34, duration: 0.09, ease: "power3.in" }, ${FY}); - tl.to(strip, { opacity: 0, duration: 0.06 }, ${(FY + 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function paradigmLaserrail() { - // LASERRAIL: concert lower third — every word is IGNITED where two thin - // laser beams (accent from the top-left, magenta from the top-right) sweep - // to CONVERGE on its position 2 frames early; at convergence a flare pops - // and the word snaps on in laser color (the apex motif at low amplitude: - // crush → contact squash → elastic settle, brightness cool). Emphasis words - // strobe once (1 frame off / back on) and their beams linger. Exits: a - // sweeper beam crosses L→R and carries the words (streak x+44 + blur). - // Word centers are BAKED at compile time from the measured char-width table - // (assets/fonts/char-widths.json) so font-load timing can't skew beam aim - // (calibrated vs the t37 demo's browser-measured table: ≤3px/word). - const b = dna.body; - const fam = dna.fonts.body; - const m = famMetrics(fam) || { ascent: 0.8, descent: 0.2, widths: {} }; - const lsEm = parseFloat(b.letterSpacing) || 0; - const gapEm = b.wordGapEm ?? 0.24; - const railBot = H - b.bottomPx; - const emPx = Math.round(b.fontPx * (b.minorScale || 1.325)); - const A = dna.palette.accent; - const lineData = LINES.map((L, i) => { - const words = L.words.map((w) => ({ - txt: b.textTransform === "uppercase" ? w.display.toUpperCase() : w.display, - st: +w.start.toFixed(3), - em: w.minor ? 1 : 0, - })); - // centered-line layout, baked in px (CSS model: inline-blocks on one - // baseline, margin 0 em, tracking after every char incl the last) - const pxs = words.map((w) => (w.em ? emPx : b.fontPx)); - const ws = words.map((w, k) => wordPx(w.txt, fam, pxs[k], lsEm)); - const total = ws.reduce((a, x, k) => a + x + 2 * gapEm * pxs[k], 0); - const maxPx = Math.max(...pxs); - const baseline = railBot - (maxPx * (1 - m.ascent + m.descent)) / 2; - let cur = W / 2 - total / 2; - const pos = words.map((w, k) => { - const cx = cur + gapEm * pxs[k] + ws[k] / 2; - cur += ws[k] + 2 * gapEm * pxs[k]; - return [ - Math.round(cx), - Math.round(baseline - (pxs[k] * (m.ascent - m.descent)) / 2), - Math.round(ws[k]), - ]; - }); - // sweep starts so the carried words clear before the next line's beams own - // the rail; last line keeps the demo's end-of-clip runway - const sweepT = - i + 1 < LINES.length - ? +(L.out - 0.14).toFixed(3) - : +Math.min(L.out - 0.14, DUR - 0.26).toFixed(3); - return { - id: "lr" + L.id, - in: +L.in.toFixed(3), - sweepT, - words: words.map((w) => [w.txt, w.st, w.em]), - pos, - }; - }); - const css = ` - #lrfx { position:absolute; inset:0; } - .lrline { position:absolute; left:${W / 2}px; top:${railBot}px; opacity:0; white-space:nowrap; - font-family:'${fam}', sans-serif; font-size:${b.fontPx}px; line-height:1; - letter-spacing:${b.letterSpacing || "0.02em"}; color:${dna.palette.body}; - ${b.textTransform ? "text-transform:" + b.textTransform + ";" : ""} - text-shadow: 0 0 10px ${A}bf, 0 0 26px ${A}61, 0 2px 6px rgba(0,0,0,0.7); } - .lrline .w { display:inline-block; opacity:0; margin:0 ${gapEm}em; } - .lrline .w.em { font-size:${emPx}px; - text-shadow: 0 0 14px ${A}e6, 0 0 34px ${A}80, 0 2px 6px rgba(0,0,0,0.7); } - .lflare { position:absolute; width:54px; height:54px; border-radius:50%; opacity:0; - background: radial-gradient(circle, rgba(220,255,235,0.95) 0%, ${A}80 40%, ${A}00 70%); } - .lsweep { position:absolute; width:3px; height:88px; opacity:0; - background: linear-gradient(180deg, ${A}00 0%, rgba(230,255,242,0.95) 45%, ${A}00 100%); - filter: drop-shadow(0 0 6px ${A}); }`; - const html = - ` - - \n` + lineData.map((L) => `
`).join("\n"); - const js = ` - // ---- body paradigm: LASERRAIL (per-word beam-converge ignition) ---- - const LACC = ${J(A)}, LMAG = ${J(dna.palette.magenta || "#ff4df0")}; - const NSL = "http://www.w3.org/2000/svg"; - const lrStage = document.getElementById("stage"); - const gLR = document.getElementById("gLR"); - function lrLine(x1, y1, x2, y2, col, w) { - const l = document.createElementNS(NSL, "line"); - l.setAttribute("x1", x1); l.setAttribute("y1", y1); - l.setAttribute("x2", x2); l.setAttribute("y2", y2); - l.setAttribute("stroke", col); l.setAttribute("stroke-width", w); - l.setAttribute("stroke-linecap", "round"); - l.style.opacity = 0; gLR.appendChild(l); return l; - } - const LRAIL = ${J(lineData)}; - LRAIL.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt, , em]) => { - const s = document.createElement("span"); - s.className = "w" + (em ? " em" : ""); s.textContent = txt; - line.appendChild(s); - }); - gsap.set(line, { xPercent: -50, yPercent: -100, transformOrigin: "50% 100%" }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.03); - L.words.forEach(([txt, st, em], wi) => { - const el = line.children[wi]; - const [wx, wy] = L.pos[wi]; -${ - HEROLESS - ? " const yld = 1;" - : ` // beams yield inside the apex window (the hero owns the light) - const yld = (st > ${(heroIn - 0.41).toFixed(3)} && st < ${(heroIn + 0.99).toFixed(3)}) - ? ${b.yield ? (b.yield.beamDim ?? 0.55) : 1} : 1;` -} - const t0 = st - 0.21, cv = st - 0.083; - // two beams converge on the word 2 frames before its time - [[-25, -15, LACC, wx - 170], [${W + 25}, -15, LMAG, wx + 170]].forEach(([ex, ey, col, sx]) => { - const halo = lrLine(ex, ey, sx, wy - 30, col, 5); - const core = lrLine(ex, ey, sx, wy - 30, col, 1.5); - tl.set(halo, { opacity: 0.24 * yld }, t0); - tl.set(core, { opacity: 0.92 * yld }, t0); - tl.to([halo, core], { attr: { x2: wx, y2: wy }, duration: cv - t0, ease: "power2.out" }, t0); - tl.to([halo, core], { opacity: 0, duration: em ? 0.45 : 0.2, ease: "power1.in" }, st + 0.03); - }); - // convergence flare - const f = document.createElement("div"); - f.className = "lflare"; lrStage.appendChild(f); - f.style.left = (wx - 27) + "px"; f.style.top = (wy - 27) + "px"; - tl.set(f, { opacity: 0.85, scale: 0.5 }, cv); - tl.to(f, { scale: 1.35, opacity: 0, duration: 0.13, ease: "power2.out" }, st - 0.01); - // IGNITE (apex motif at low amplitude): on in 1 frame, crush, squash, settle - tl.set(el, { opacity: 1, scale: 1.12, filter: "brightness(1.85)", transformOrigin: "50% 80%" }, st); - tl.to(el, { scale: 1, duration: 0.09, ease: "power3.in" }, st + 0.005); - tl.set(el, { scaleX: 1.05, scaleY: 0.94 }, st + 0.1); - tl.to(el, { scaleX: 1, scaleY: 1, duration: 0.3, ease: "elastic.out(1, 0.42)" }, st + 0.14); - tl.to(el, { filter: "brightness(1)", duration: 0.22, ease: "power2.out" }, st + 0.07); - if (em) { // single strobe: 1 frame off, back on - tl.set(el, { opacity: 0 }, st + 0.18); - tl.set(el, { opacity: 1 }, st + 0.222); - } - }); - // hold life: gentle breathe + laser shimmer while the line waits - const lastSt = L.words[L.words.length - 1][1]; - const free = L.sweepT - lastSt - 0.35; - if (free > 0.45) { - const half = Math.min(0.55, free / 2); - tl.to(line, { scale: 1.013, duration: half, ease: "sine.inOut" }, lastSt + 0.35); - tl.to(line, { scale: 1.0, duration: half, ease: "sine.inOut" }, lastSt + 0.35 + half); - } - if (free > 0.9) { - tl.to(line, { keyframes: { filter: ["brightness(1)","brightness(1.07)","brightness(1)","brightness(1.05)","brightness(1)"] }, - duration: 0.9, ease: "none" }, lastSt + 0.5); - } - // EXIT: sweeper beam crosses L→R, words streak away as it passes them - const xs = L.pos.map((p) => p[0]); - const x0 = Math.min(...xs) - 46, x1 = Math.max(...xs) + 46; - const sw = document.createElement("div"); - sw.className = "lsweep"; lrStage.appendChild(sw); - sw.style.left = x0 + "px"; sw.style.top = (L.pos[0][1] - 58) + "px"; - tl.set(sw, { opacity: 0.9 }, L.sweepT); - tl.to(sw, { x: x1 - x0, duration: 0.13, ease: "power1.in" }, L.sweepT); - tl.to(sw, { opacity: 0, duration: 0.05 }, L.sweepT + 0.13); - L.words.forEach((w, wi) => { - const el = line.children[wi]; - const frac = (L.pos[wi][0] - x0) / Math.max(1, x1 - x0); - tl.to(el, { x: 44, opacity: 0, filter: "blur(5px)", duration: 0.11, ease: "power2.in" }, - L.sweepT + 0.11 * frac); - }); - tl.set(line, { display: "none" }, Math.min(L.sweepT + 0.32, ${(DUR - 0.02).toFixed(3)})); - }); -${ - !HEROLESS && b.yield - ? ` // rail yields while the apex lands (restore only with clear runway) - LRAIL.forEach((L) => { - if (L.in < ${heroIn.toFixed(3)} + 0.9 && L.sweepT > ${heroIn.toFixed(3)} - 0.3) { - const dimT = Math.max(${(heroIn - (b.yield.pre || 0.04)).toFixed(3)}, L.in + 0.05); - if (L.sweepT > dimT + 0.25) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.15 }, dimT); - const resT = ${(heroIn + (b.yield.post || 0.9)).toFixed(3)}; - if (resT + 0.3 < L.sweepT) tl.to("#" + L.id, { opacity: 1, duration: 0.25 }, resT); - } - } - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmStormrail() { - // STORMRAIL: rain-washed lower third. Ambient rain = seeded thin streaks - // falling on repeating linear cycle tweens (pure f(t), one wind vector, - // mid-fall at t0); a second streak set DOUBLES the rain for ~1s after the - // strike. Body words arrive with the lightning-kiss motif at low amplitude - // (2-frame lit-bright pop + micro settle); emphasis = sheet-lightning double - // flash (the bg sky double-kisses at the same beats). Exits wash downward - // with the rain (y+22, blur). The visible line dims while the bolt lands and - // its text-shadow flips toward the strike for the flash frames. - const b = dna.body; - const r = b.rain || {}; - const A = dna.palette.accent; - const railTop = H - (b.bottomPx || 98); - const sgn = (dna.hero.params || {}).side === "right" ? -1 : 1; - const lineData = LINES.map((L) => ({ - id: "st" + L.id, - in: +L.in.toFixed(3), - // wash start: just before the next line — but a line facing dead air - // washes away early (the demo's r1 exits at lastWord + 1.08s) - out: +Math.min(L.out - 0.05, L.words[L.words.length - 1].end + 1.08, DUR - 0.2).toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - const css = ` - #stscrim { position:absolute; left:0; right:0; top:${H - 180}px; height:180px; opacity:0; - background:linear-gradient(to bottom, rgba(6,10,18,0) 0%, rgba(6,10,18,0.45) 45%, rgba(6,10,18,0.62) 100%); } - #rain { position:absolute; inset:0; opacity:${r.opacity ?? 0.08}; } - #rain2 { position:absolute; inset:0; opacity:0; } - .drop { position:absolute; left:0; top:0; width:2px; border-radius:1px; - background:linear-gradient(to bottom, rgba(200,222,244,0) 0%, rgba(214,232,250,0.95) 100%); } - .stline { position:absolute; left:${W / 2}px; top:${railTop}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', sans-serif; font-weight:700; font-size:${b.fontPx}px; line-height:1.15; - letter-spacing:${b.letterSpacing || "0.015em"}; color:${dna.palette.body}; - text-shadow: 0 6px 16px rgba(2,8,18,0.85), 0 2px 4px rgba(2,8,18,0.7), 0 0 14px ${A}47; } - .stline .w { display:inline-block; opacity:0; margin:0 0.16em; }`; - const html = - `
-
-` + - lineData.map((L) => `
`).join("\n") + - ` -
`; - const js = ` - // ---- body paradigm: STORMRAIL (lightning-kiss words, rain-wash exits, ambient rain) ---- -${!HEROLESS ? ` const I = ${heroIn.toFixed(3)};` : ""} - // ambient rain: seeded streaks on repeating linear cycles (f(t), no random at render) - function makeRain(container, n, seed, t0, t1) { - const rnd = mulberry32(seed); - for (let i = 0; i < n; i++) { - const el = document.createElement("div"); - el.className = "drop"; container.appendChild(el); - const x0 = 20 + rnd() * ${W - 40}, d = 0.55 + rnd() * 0.55; - const len = 46 + rnd() * 70, frac = rnd(); - const travel = ${H + 300}, dx = -160; // slanted fall, one wind vector - gsap.set(el, { height: len, rotation: 9, x: x0, y: -160 }); - let t = t0; - // partial first cycle so rain is mid-fall at t0 - tl.fromTo(el, { y: -160 + travel * frac, x: x0 + dx * frac }, - { y: ${H + 140}, x: x0 + dx, duration: d * (1 - frac), ease: "none" }, t); - t += d * (1 - frac); - while (t < t1) { - tl.fromTo(el, { y: -160, x: x0 }, - { y: ${H + 140}, x: x0 + dx, duration: d, ease: "none" }, t); - t += d; - } - } - } - makeRain(document.getElementById("rain"), ${r.count ?? 18}, ${r.seed ?? 9021}, 0, ${(DUR - 0.02).toFixed(2)}); -${ - !HEROLESS - ? ` makeRain(document.getElementById("rain2"), ${r.count ?? 18}, ${r.seed2 ?? 4477}, ${(heroIn - 0.11).toFixed(3)}, ${Math.min(heroIn + 1.24, DUR - 0.02).toFixed(3)}); - // rain doubles for ~1s after the strike - tl.set("#rain2", { opacity: 0.11 }, I + 0.02); - tl.to("#rain2", { opacity: 0, duration: 0.30 }, ${Math.min(heroIn + 1.02, DUR - 0.34).toFixed(3)});` - : "" -} - - // rail scrim (stable reading surface against the busy lower frame) - tl.to("#stscrim", { opacity: 1, duration: 0.20 }, 0.05); - tl.to("#stscrim", { opacity: 0, duration: 0.16 }, ${(DUR - 0.18).toFixed(3)}); - - const SRAIL = ${J(lineData)}; - SRAIL.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt]) => { - const s = document.createElement("span"); - s.className = "w"; s.textContent = txt; line.appendChild(s); - }); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.025); - L.words.forEach(([txt, st, em], wi) => { - const el = line.children[wi]; - // entrance = the apex motif at low amplitude: lit-bright pop + micro settle - tl.set(el, { opacity: 1, y: 4, scale: 1.06, filter: "brightness(2.2)", - transformOrigin: "50% 85%" }, st); - tl.to(el, { y: 0, scale: 1, duration: 0.12, ease: "power2.out" }, st + F); - tl.to(el, { filter: "brightness(1)", duration: 0.14, ease: "power1.out" }, st + F); - if (em && st + 0.20 + 3 * F < ${(DUR - 0.04).toFixed(2)}) { // sheet lightning: 2-frame double flash - const t0 = st + 0.20; - tl.set(el, { filter: "brightness(1.9)" }, t0); - tl.set(el, { filter: "brightness(1.0)" }, t0 + F); - tl.set(el, { filter: "brightness(1.8)" }, t0 + 2 * F); - tl.to(el, { filter: "brightness(1)", duration: 0.12 }, t0 + 3 * F); - } - }); - // EXIT: wash downward with the rain - tl.to(line, { y: 22, opacity: 0, filter: "blur(3px)", duration: 0.18, ease: "power1.in" }, L.out); - tl.set(line, { display: "none" }, Math.min(L.out + 0.20, ${(DUR - 0.02).toFixed(2)})); - }); -${ - !HEROLESS && b.yield - ? ` // rail yields while the bolt lands; the visible line's shadow flips toward - // the strike for the flash frames (light from the bolt side) - SRAIL.forEach((L) => { - if (L.in < I + 0.9 && L.out > I - 0.3) { - const dimT = Math.max(I - ${(b.yield.pre ?? 0.15).toFixed(2)}, L.in + 0.05); - if (L.out > dimT + 0.25) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.12 }, dimT); - const resT = I + ${(b.yield.post ?? 0.29).toFixed(2)}; - if (resT + 0.3 < L.out) tl.to("#" + L.id, { opacity: 1, duration: 0.10 }, resT); - } - } - if (L.in <= I - 2 * F && L.out > I) { - tl.set("#" + L.id, { textShadow: "${12 * sgn}px 4px 12px rgba(2,8,18,0.85), 0 0 14px ${A}73" }, I - 2 * F); - tl.set("#" + L.id, { textShadow: "0 6px 16px rgba(2,8,18,0.85), 0 2px 4px rgba(2,8,18,0.7), 0 0 14px ${A}47" }, I + 0.09); - } - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmHolorail() { - // HOLORAIL: a volumetric projection PLATE (scanlined glass slab with corner - // brackets + feed tag) is the stable reading surface; it boots like a - // projector turning ON (scaleY snap + 1-frame flicker) and breathes a slow - // luminance cycle. Body words boot with the apex motif at low amplitude: - // instant opacity + RISING sweep reveal (clip wipe), a 1-frame interference - // x-glitch, and a constant chromatic-fringe text-shadow. Emphasis words get - // a 2-frame projection DROPOUT that restores brighter, then settles. Each - // line drifts slowly in rotationY (it IS a projection) and exits with the - // projector-cut: brightness pop → collapse to a horizontal slit → to a dot. - const b = dna.body; - const A = dna.palette.accent, - MG = dna.palette.magenta || "#ff5fd6"; - const plateW = b.plateW || 980, - plateH = b.plateH || 96; - const plateY = H - (b.bottomPx || 108); // plate center - const lineY = plateY + (b.lineDy ?? 9); // line center sits low in the plate - const lineData = LINES.map((L, i) => ({ - id: "hl" + L.id, - // projector-cut start: completes (0.15s) before the next line boots; - // the last line keeps the demo's end-of-clip runway - exit: +(i + 1 < LINES.length ? L.out - 0.15 : Math.min(L.out + 0.07, DUR - 0.18)).toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - })); - const shadowBase = `-1.5px 0 0 ${A}8c, 1.5px 0 0 ${MG}6b, 0 0 16px ${A}80, 0 2px 8px rgba(1,10,16,0.85)`; - const shadowEm = `-1.5px 0 0 ${A}cc, 1.5px 0 0 ${MG}99, 0 0 26px ${dna.palette.glowEm || "#A0F2FF"}d9, 0 2px 8px rgba(1,10,16,0.85)`; - const css = ` - #railwrap { position:absolute; inset:0; } - #plate { position:absolute; left:${W / 2}px; top:${plateY}px; width:${plateW}px; height:${plateH}px; opacity:0; - border-radius:3px; - background: linear-gradient(180deg, rgba(4,22,33,0.46) 0%, rgba(6,30,44,0.55) 100%); - border: 1px solid ${A}52; - box-shadow: 0 0 26px rgba(60,170,210,0.20), inset 0 0 38px ${A}0f; } - #pscan { position:absolute; inset:0; border-radius:3px; - background: repeating-linear-gradient(180deg, ${A}00 0px, ${A}00 3px, ${A}12 3px, ${A}12 4px); } - #ptag { position:absolute; left:14px; top:7px; font-family:'${dna.fonts.tag}', sans-serif; - font-weight:400; font-size:11px; letter-spacing:0.32em; color:${A}99; } - .crn { position:absolute; width:11px; height:11px; } - .crn.a { left:-1px; top:-1px; border-left:2px solid ${A}cc; border-top:2px solid ${A}cc; } - .crn.b { right:-1px; top:-1px; border-right:2px solid ${A}cc; border-top:2px solid ${A}cc; } - .crn.c { left:-1px; bottom:-1px; border-left:2px solid ${A}cc; border-bottom:2px solid ${A}cc; } - .crn.d { right:-1px; bottom:-1px; border-right:2px solid ${A}cc; border-bottom:2px solid ${A}cc; } - .hln { position:absolute; left:${W / 2}px; top:${lineY}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', sans-serif; font-weight:500; font-size:${b.fontPx}px; - line-height:1.15; letter-spacing:${b.letterSpacing || "0.02em"}; } - .hln .w { display:inline-block; opacity:0; margin-right:0.3em; - color:${dna.palette.body}ed; - text-shadow: ${shadowBase}; }`; - const html = - `
-
-
-
${esc(theme.plateTag || b.tag || "VOLUMETRIC FEED // CH-07")}
-
-
-
-` + - lineData.map((L) => `
`).join("\n") + - ` -
`; - // plate breathe: finite yoyo cycles sized to the runway before the end cut - const pCut = +(DUR - 0.14).toFixed(3); - const breaths = Math.max(1, Math.floor((pCut - 0.5) / 0.8) - 1); - const js = ` - // ---- body paradigm: HOLORAIL (projection plate, sweep-boot words, projector-cut exits) ---- - gsap.set("#plate", { xPercent: -50, yPercent: -50, transformOrigin: "50% 50%" }); - - // plate boots like a projector turning ON (inverse of the projector-cut exit) - tl.set("#plate", { opacity: 1 }, 0.10); - tl.fromTo("#plate", { scaleY: 0.03 }, { scaleY: 1, duration: 0.13, ease: "expo.out" }, 0.10); - tl.set("#plate", { opacity: 0.35 }, 0.155); - tl.set("#plate", { opacity: 1 }, 0.195); - tl.to("#plate", { opacity: 0.93, duration: 0.8, ease: "sine.inOut", yoyo: true, repeat: ${breaths} }, 0.5); - - const HRAIL = ${J(lineData)}; - const HSH_BASE = ${J(shadowBase)}, HSH_EM = ${J(shadowEm)}; - HRAIL.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt], wi) => { - const s = document.createElement("span"); - s.className = "w"; s.textContent = txt; - if (wi === L.words.length - 1) s.style.marginRight = "0"; - line.appendChild(s); - }); - gsap.set(line, { xPercent: -50, yPercent: -50, transformPerspective: 700, transformOrigin: "50% 50%" }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.03); - - L.words.forEach(([txt, st, em], wi) => { - const el = line.children[wi]; - // BOOT (low-amplitude apex motif): instant opacity + vertical sweep reveal - tl.set(el, { opacity: 1, clipPath: "inset(-20% -10% 100% -10%)" }, st); - tl.to(el, { clipPath: "inset(-20% -10% -30% -10%)", duration: 0.15, ease: "power2.out" }, st); - tl.set(el, { clipPath: "none" }, st + 0.16); - // 1-frame interference glitch - tl.set(el, { x: 2 }, st + 0.05); - tl.set(el, { x: -2 }, st + 0.09); - tl.set(el, { x: 0 }, st + 0.13); - // EMPHASIS: 2-frame projection dropout, restores brighter (delay shrinks - // near the line's projector-cut so dropout+restore always complete) - if (em) { - const d = Math.min(${b.emphDelay ?? 0.34}, L.exit - st - 0.183); - if (d >= 0.083) { - tl.set(el, { opacity: 0.2 }, st + d); - tl.set(el, { opacity: 1, color: ${J(dna.palette.em || "#f4feff")}, textShadow: HSH_EM }, st + d + 0.083); - const sb = st + d + 0.51; - if (sb < L.exit - 0.05) - tl.to(el, { color: ${J((dna.palette.body || "#c7f1ff") + "ed")}, textShadow: HSH_BASE, - duration: Math.min(0.4, ${(DUR - 0.04).toFixed(2)} - sb), ease: "power1.in" }, sb); - } - } - }); - - // slow rotateY drift — it IS a projection - const dS = L.words[0][1] + 0.08; - const dD = Math.max(0.3, L.exit - dS - 0.04); - tl.to(line, { keyframes: { rotationY: [-3.5, 3.5, -2.5] }, duration: dD, ease: "none" }, dS); - - // EXIT: projector cut — line collapses to a bright slit, then to a dot - const ex = L.exit; - tl.set(line, { filter: "brightness(2.2)" }, ex); - tl.to(line, { scaleY: 0.045, duration: 0.07, ease: "power3.in" }, ex + 0.005); - tl.to(line, { scaleX: 0.015, duration: 0.06, ease: "power3.in" }, ex + 0.08); - tl.set(line, { opacity: 0, display: "none" }, ex + 0.15); - }); -${ - !HEROLESS && b.yield - ? ` // the whole rail (plate included) yields while the apex lands - tl.to("#railwrap", { opacity: ${b.yield.dim}, duration: 0.18, ease: "power1.in" }, ${(heroIn - (b.yield.pre ?? 0.18)).toFixed(3)}); - tl.to("#railwrap", { opacity: 1, duration: 0.22, ease: "power1.out" }, ${(heroIn + (b.yield.post ?? 0.37)).toFixed(3)});` - : "" -} - // end: the plate itself gets the projector cut - tl.set("#plate", { filter: "brightness(2.2)" }, ${pCut}); - tl.to("#plate", { scaleY: 0.03, duration: 0.07, ease: "power3.in" }, ${(pCut + 0.005).toFixed(3)}); - tl.to("#plate", { scaleX: 0.012, duration: 0.05, ease: "power3.in" }, ${(pCut + 0.08).toFixed(3)}); - tl.set("#plate", { opacity: 0 }, ${Math.min(pCut + 0.12, DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function paradigmPlanktonrail() { - // PLANKTONRAIL: deep-sea lower third on TWO coexisting row slots — even - // lines ride the upper row, odd lines the lower, so couplets share the - // water like drifting strata. Words GLOW ON like jellyfish (the apex bloom - // at low amplitude): 2-frame opacity + radial bloom from center (scale - // 0.92→1, blur 5→0, brightness 0.45→1) while a cyan glow text-shadow grows - // in; emphasis words pulse a slow DOUBLE-BEAT (jellyfish propulsion). Every - // line floats on a gentle y drift and exits by SINKING (+15px, dimming). - // Furniture: seeded plankton motes drift f(t) in the open water; the ones - // seeded in a ring around the apex get ATTRACTED to the bloom and brighten - // as it lands. The line feeding the apex dims while the bloom owns the - // frame (no restore — it exits dimmed, by design); a line entering during - // the hold arrives dimmed and restores once the bloom settles. - const b = dna.body; - const A = dna.palette.accent, - VIO = dna.palette.violet || "#9d7bff"; - const rowB = H - (b.bottomPx || 70); // lower row center - const rowA = rowB - (b.rowDy ?? 58); // upper row center - const m = b.motes || {}; - const yld = b.yield || {}; - // active line = the one feeding the apex (last line that starts before it) - const activeIdx = LINES.reduce((a, L, i) => (L.words[0].start < heroIn ? i : a), 0); - const lineData = LINES.map((L, i) => { - // two-row coexistence: a line clears when its ROW is next needed (line - // i+2) or ~0.3s after its couplet finishes speaking (staggered pair - // exits); a pre-apex leftover clears just before the bloom lands (the - // feeding line stays and yields instead); the last line floats to the end - const pairLast = LINES[Math.min(i - (i % 2) + 1, LINES.length - 1)]; - const pairEnd = pairLast.words[pairLast.words.length - 1].end; - let out = - i + 2 < LINES.length - ? Math.min(LINES[i + 2].in - 0.15, pairEnd + 0.28 + (i % 2) * 0.12) - : i + 1 < LINES.length - ? LINES[i + 1].words[0].start - 0.05 - : null; - if (i !== activeIdx && out != null && out > heroIn - 0.25 && L.in < heroIn) out = heroIn - 0.21; - return { - id: "pl" + L.id, - top: i % 2 ? rowB : rowA, - in: +L.in.toFixed(3), - out: out == null ? null : +Math.min(out, DUR - 0.36).toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - }; - }); - const shOn = `0 2px 10px rgba(1,10,20,0.85), 0 0 16px ${A}cc`; - const shEm = `0 2px 10px rgba(1,10,20,0.85), 0 0 18px ${A}f2, 0 0 34px ${VIO}8c`; - const css = ` - .mote { position:absolute; border-radius:50%; background:${dna.palette.mote || "#96f5e8"}f2; - box-shadow: 0 0 7px 2px ${A}bf; opacity:0; } - .pln { position:absolute; left:${W / 2}px; white-space:nowrap; - font-family:'${dna.fonts.body}', sans-serif; font-weight:400; font-size:${b.fontPx}px; - line-height:1.2; color:${dna.palette.body}; } - .pln .w { display:inline-block; position:relative; margin-right:0.30em; opacity:0; } - .pln .w:last-child { margin-right:0; } - .pln .ink { display:inline-block; - text-shadow: 0 2px 10px rgba(1,10,20,0.85), 0 0 0px ${A}00; } - .pln .w.em .ink { color:${dna.palette.em || "#f4fffd"}; - text-shadow: 0 2px 10px rgba(1,10,20,0.85), 0 0 0px ${A}00, 0 0 0px ${VIO}00; }`; - const html = - `
-` + - lineData - .map((L) => `
`) - .join("\n"); - const js = ` - // ---- body paradigm: PLANKTONRAIL (jellyfish glow-on, two-row float, sinking exits) ---- -${!HEROLESS ? ` const I = ${heroIn.toFixed(3)};` : ""} - const mrnd = mulberry32(${m.seed ?? 2929}); - const mf = document.getElementById("mfield"); - // plankton motes: seeded drift walks f(t); the first ${m.near ?? 5} seed a - // ring around the bloom heart and get ATTRACTED to it as the apex lands - const APX = ${HG.x}, APY = ${HG.y}; - for (let i = 0; i < ${m.count ?? 12}; i++) { - const near = ${HEROLESS ? "false" : `i < ${m.near ?? 5}`}; - const el = document.createElement("div"); - el.className = "mote"; mf.appendChild(el); - let L, T; - if (near) { - const ang = (i / ${m.near ?? 5}) * Math.PI * 2 + 0.55 + mrnd() * 0.5; - const r = (150 + mrnd() * 75) * ${(HG.fontPx / 120).toFixed(3)}; - L = APX + Math.cos(ang) * r * 1.35; - T = APY + Math.sin(ang) * r * 0.85; - } else { - L = 60 + mrnd() * ${W - 120}; - T = 60 + mrnd() * ${H - 260}; - } - L = Math.max(20, Math.min(${W - 25}, L)); T = Math.max(25, Math.min(${H - 175}, T)); - const s = 2 + Math.round(mrnd() * 2); - gsap.set(el, { width: s, height: s, left: L, top: T }); - const tin = 0.04 + mrnd() * 0.35; - tl.to(el, { opacity: 0.1, duration: 0.3, ease: "power1.out" }, tin); - // slow seeded drift walk - const a1 = (mrnd() - 0.5) * 36, a2 = a1 + (mrnd() - 0.5) * 36, a3 = a2 + (mrnd() - 0.5) * 30; - const b1 = (mrnd() - 0.5) * 28, b2 = b1 + (mrnd() - 0.5) * 28, b3 = b2 + (mrnd() - 0.5) * 24; - const dEnd = ${HEROLESS ? (DUR - 0.34).toFixed(3) : `near ? I - 0.25 : ${(DUR - 0.34).toFixed(3)}`}; - tl.to(el, { keyframes: { x: [a1, a2, a3], y: [b1, b2, b3], - opacity: [0.13, 0.07, 0.11] }, - duration: dEnd - (tin + 0.32), ease: "sine.inOut" }, tin + 0.32); -${ - !HEROLESS - ? ` if (near) { - // ATTRACTION: pulled toward the bloom, brightening - const tx = (APX - L) * 0.72 + (mrnd() - 0.5) * 24; - const ty = (APY - T) * 0.72 + (mrnd() - 0.5) * 18; - tl.to(el, { x: tx, y: ty, opacity: 0.42, scale: 1.7, - duration: 0.75, ease: "power2.in" }, I - 0.19 + i * 0.045); - tl.to(el, { keyframes: { x: [tx + 4, tx - 3, tx + 2], y: [ty - 4, ty + 3, ty - 2] }, - duration: 0.32, ease: "sine.inOut" }, ${Math.min(heroIn + 0.59, DUR - 0.42).toFixed(3)}); - tl.to(el, { y: ty + 18, opacity: 0, duration: 0.18, ease: "power1.in" }, ${(DUR - 0.22).toFixed(3)}); - } else { - tl.to(el, { y: "+=14", opacity: 0, duration: 0.16, ease: "power1.in" }, ${(DUR - 0.2).toFixed(3)}); - }` - : ` tl.to(el, { y: "+=14", opacity: 0, duration: 0.16, ease: "power1.in" }, ${(DUR - 0.2).toFixed(3)});` -} - } - - // ---- body lines: jellyfish glow-on, floating couplet rows, sinking exits ---- - const SH_ON = ${J(shOn)}, SH_EM = ${J(shEm)}; - const PRAIL = ${J(lineData)}; - PRAIL.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt, , em]) => { - const w = document.createElement("span"); - w.className = "w" + (em ? " em" : ""); - const ink = document.createElement("span"); ink.className = "ink"; - ink.textContent = txt; w.appendChild(ink); line.appendChild(w); - }); - gsap.set(line, { xPercent: -50, yPercent: -50 }); - - // gentle float while held (everything in the abyss floats) - const t0 = Math.max(0.02, L.words[0][1] - 0.02); - const D = (L.out ?? ${(DUR - 0.06).toFixed(3)}) - t0 - 0.04; - const yArr = D > 1.5 ? [-2, 2, -3, 1, 3, 0] : [-2, 1, -2, 0]; - tl.to(line, { keyframes: { y: yArr }, duration: D, ease: "sine.inOut" }, t0); - - L.words.forEach(([txt, st, em], wi) => { - const w = line.children[wi], ink = w.children[0]; - // GLOW ON: radial bloom from word center (the apex bloom at low amplitude) - tl.set(w, { opacity: 1 }, st - 0.01); - tl.fromTo(ink, { opacity: 0 }, { opacity: 1, duration: 0.083, ease: "none" }, st); - tl.fromTo(ink, { scale: 0.92, filter: "blur(5px) brightness(0.45)" }, - { scale: 1, filter: "blur(0px) brightness(1)", duration: 0.4, ease: "sine.out" }, st); - tl.to(ink, { textShadow: em ? SH_EM : SH_ON, duration: 0.4, ease: "sine.out" }, st); - // EMPHASIS: slow double-beat pulse (jellyfish propulsion) - if (em && st + 1.07 <= ${(DUR - 0.09).toFixed(3)}) { - tl.to(ink, { keyframes: { - filter: ["blur(0px) brightness(1.4)", "blur(0px) brightness(1.06)", - "blur(0px) brightness(1.5)", "blur(0px) brightness(1.12)", - "blur(0px) brightness(1)"], - scale: [1.035, 1.01, 1.05, 1.015, 1] }, - duration: 0.55, ease: "sine.inOut" }, st + 0.52); - } - }); - - // EXIT: light sinks — drift down +15 while dimming - if (L.out != null) { - tl.to(line, { y: 15, opacity: 0, duration: 0.3, ease: "power1.in" }, L.out); - tl.set(line, { display: "none" }, Math.min(L.out + 0.32, ${(DUR - 0.02).toFixed(2)})); - } - }); - -${ - !HEROLESS - ? ` // rail yields to the apex landing: the feeding line dims (and exits dimmed - // unless it has ≥0.9s of hold left); a line entering during the hold - // arrives at ${yld.enter ?? 0.8} and restores once the bloom settles - PRAIL.forEach((L, i) => { - if (i === ${activeIdx} && (L.out ?? 99) > I - ${(yld.pre ?? 0.17).toFixed(2)} + 0.25) { - tl.to("#" + L.id, { opacity: ${yld.dim ?? 0.55}, duration: 0.18, ease: "power1.out" }, I - ${(yld.pre ?? 0.17).toFixed(2)}); - if ((L.out ?? 99) > I + 1.2) - tl.to("#" + L.id, { opacity: 1, duration: 0.25, ease: "power1.out" }, I + 0.9); - } - if (L.in > I && L.in < I + 0.9) { - tl.set("#" + L.id, { opacity: ${yld.enter ?? 0.8} }, L.in); - tl.to("#" + L.id, { opacity: 1, duration: 0.25, ease: "power1.out" }, - Math.min(Math.max(I + ${(yld.post ?? 0.63).toFixed(2)}, L.in + 0.1), ${(DUR - 0.28).toFixed(2)})); - } - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmSheenrail() { - // SHEENRAIL: iridescent silk lower third on TWO coexisting row slots — even - // lines ride the upper row (H − bottomPx − rowDy), odd lines the lower - // (H − bottomPx), so couplets read together like a woven pair. Words are - // aurora-gradient ink (background-clip:text over a rose→teal→violet wash - // whose backgroundPosition DRIFTS f(t) across the whole clip — the body's - // hold life) above a blurred dark understroke; entrance = 2-frame opacity - // + y8 settle (the ribbon's flow at low amplitude); emphasis = ONE bright - // sheen sweep marching through the word + a brightness pulse. Exits - // dissolve UPWARD (y−12, blur 3, staggered) and each line releases 3-4 - // drifting light streaks that float up from its row. A soft radial band - // scrim sits under the rows (stable reading surface); the whole rail — - // band included — yields while the ribbon writes. Line scheduling mirrors - // planktonrail's two-row coexistence: a row clears when next needed (line - // i+2) or shortly after its couplet finishes speaking (staggered pair - // exits); the pre-apex leftover clears at heroIn−0.32 while the FEEDING - // line stays (it dims with the railwrap yield); the last line holds. - const b = dna.body; - const PAL = [dna.palette.rose, dna.palette.accent, dna.palette.violet]; - const rowB = H - (b.bottomPx || 76); // lower row TOP edge - const rowA = rowB - (b.rowDy ?? 58); // upper row TOP edge - const band = b.band || {}; - const bandW = band.w ?? 860, - bandH = band.h ?? 170; - const bandCy = Math.round((rowA + rowB + b.fontPx * 1.1) / 2); - const yld = b.yield || {}; - // active line = the one feeding the apex (last line that starts before it) - const activeIdx = LINES.reduce((a, L, i) => (L.words[0].start < heroIn ? i : a), 0); - const lineData = LINES.map((L, i) => { - const pairLast = LINES[Math.min(i - (i % 2) + 1, LINES.length - 1)]; - const pairEnd = pairLast.words[pairLast.words.length - 1].end; - let out = - i + 2 < LINES.length - ? Math.min(LINES[i + 2].in - 0.15, pairEnd + 0.23 + (i % 2) * 0.17) - : i + 1 < LINES.length - ? LINES[i + 1].words[0].start - 0.11 - : null; - if (i !== activeIdx && out != null && out > heroIn - 0.25 && L.in < heroIn) out = heroIn - 0.32; - return { - id: "sk" + L.id, - top: i % 2 ? rowB : rowA, - out: out == null ? null : +Math.min(out, DUR - 0.4).toFixed(3), - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - }; - }); - const css = ` - #skwrap { position:absolute; inset:0; } - #band { position:absolute; left:${W / 2}px; top:${bandCy}px; width:${bandW}px; height:${bandH}px; - margin-left:-${bandW / 2}px; margin-top:-${bandH / 2}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(6,10,28,0.55) 0%, rgba(6,10,28,0.3) 55%, rgba(6,10,28,0) 78%); } - .skl { position:absolute; left:${W / 2}px; white-space:nowrap; - font-family:'${dna.fonts.body}', serif; font-weight:500; font-size:${b.fontPx}px; - line-height:1.1; } - .skl .w { position:relative; display:inline-block; margin-right:0.3em; opacity:0; } - .skl .w:last-child { margin-right:0; } - .skl .sh { position:absolute; left:0; top:3px; color:rgba(4,8,22,0.7); - filter:blur(3px); z-index:0; } - .skl .grad { position:relative; z-index:1; - background-image: linear-gradient(100deg, ${PAL[0]} 0%, ${PAL[1]} 32%, ${PAL[2]} 64%, ${PAL[0]} 96%); - background-size: 300% 100%; - -webkit-background-clip: text; background-clip: text; color: transparent; } - .skl .shine { position:absolute; left:0; top:0; z-index:2; opacity:0; - background-image: linear-gradient(100deg, rgba(255,255,255,0) 40%, rgba(255,255,255,0.95) 50%, rgba(255,255,255,0) 60%); - background-size: 260% 100%; - -webkit-background-clip: text; background-clip: text; color: transparent; } - .streak { position:absolute; width:3px; border-radius:2px; opacity:0; filter:blur(2px); }`; - const html = - `
-
-` + - lineData - .map((L) => `
`) - .join("\n") + - ` -
`; - const js = ` - // ---- body paradigm: SHEENRAIL (flow-on entrance, sheen-sweep emphasis, dissolve-to-streaks exits) ---- -${!HEROLESS ? ` const I = ${heroIn.toFixed(3)};` : ""} - const srnd = mulberry32(${b.seed ?? 20260611}); - const stg = document.getElementById("stage"); - const PAL = ${J(PAL)}; - const SRAIL = ${J(lineData)}; - tl.to("#band", { opacity: 1, duration: 0.35, ease: "sine.out" }, 0.12); - const allGrads = []; - SRAIL.forEach((L) => { - const line = document.getElementById(L.id); - const wraps = []; - L.words.forEach(([txt, st, em]) => { - const w = document.createElement("span"); w.className = "w"; - const sh = document.createElement("span"); sh.className = "sh"; sh.textContent = txt; - const g = document.createElement("span"); g.className = "grad"; g.textContent = txt; - const sn = document.createElement("span"); sn.className = "shine"; sn.textContent = txt; - w.appendChild(sh); w.appendChild(g); w.appendChild(sn); - line.appendChild(w); wraps.push(w); allGrads.push(g); - // FLOW ON: 2-frame opacity + y8 settle (the ribbon's flow at low amplitude) - tl.fromTo(w, { opacity: 0 }, { opacity: 1, duration: 2 * F, ease: "none" }, st); - tl.fromTo(w, { y: 8 }, { y: 0, duration: 0.38, ease: "sine.out" }, st); - // EMPHASIS: the sheen pulses bright once through the word - if (em) { - const pt = st + 0.16; - tl.set(sn, { opacity: 1 }, pt); - tl.fromTo(sn, { backgroundPosition: "-80% 50%" }, - { backgroundPosition: "180% 50%", duration: 0.42, ease: "power2.inOut" }, pt); - tl.to(sn, { opacity: 0, duration: 0.12, ease: "none" }, pt + 0.34); - tl.to(g, { keyframes: { filter: ["brightness(1)", "brightness(1.55)", "brightness(1)"] }, - duration: 0.42, ease: "none" }, pt); - } - }); - gsap.set(line, { xPercent: -50 }); - // EXIT: the line dissolves upward and releases drifting light streaks - if (L.out != null) { - tl.to(wraps, { opacity: 0, y: -12, filter: "blur(3px)", - duration: 0.32, ease: "power1.in", stagger: 0.035 }, L.out); - tl.set(line, { display: "none" }, L.out + 0.6); - const nS = ${b.streaks ?? 4}; - for (let i = 0; i < nS; i++) { - const s = document.createElement("div"); s.className = "streak"; stg.appendChild(s); - const c = PAL[i % 3]; - const x = ${W / 2} + (i - (nS - 1) / 2) * 95 + (srnd() - 0.5) * 50; - const hh = 40 + Math.round(srnd() * 28); - gsap.set(s, { left: x, top: L.top + 14, height: hh, - background: "linear-gradient(to top, rgba(255,255,255,0) 0%, " + c + " 50%, rgba(255,255,255,0) 100%)" }); - tl.fromTo(s, { y: 14 }, - { keyframes: { opacity: [0, 0.7, 0], y: [14, -28, -78] }, - duration: 0.62, ease: "power1.out" }, Math.min(L.out + 0.04 + i * 0.05, ${(DUR - 0.66).toFixed(3)})); - } - } - }); - // continuous iridescent sheen drift f(t) — the body's hold life - tl.fromTo(allGrads, { backgroundPosition: "0% 50%" }, - { backgroundPosition: "300% 50%", duration: ${(DUR - 0.04).toFixed(3)}, ease: "none" }, 0); -${ - !HEROLESS - ? ` // rail yields — band included — while the ribbon writes (apex owns the frame) - tl.to("#skwrap", { opacity: ${yld.dim ?? 0.5}, duration: 0.2, ease: "sine.in" }, I - ${(yld.pre ?? 0.16).toFixed(2)}); - tl.to("#skwrap", { opacity: 1, duration: 0.3, ease: "sine.out" }, I + ${(yld.post ?? 0.62).toFixed(2)});` - : "" -}`; - return { css, html, js }; -} - -function paradigmScoperail() { - // SCOPERAIL: oscilloscope lower third. A dark phosphor scope band (HUD - // readouts, graticule) hosts an ALWAYS-ALIVE waveform — an SVG polyline - // rebuilt from baked point-set states (seeded pseudo-RMS envelope: speech - // grows it, silence flattens it, every word arrival kicks a local gaussian - // burst for ~3 frames; the hero words kick WIDE bursts where the trace - // surges off the scope to write). Body lines (phosphor mono) sit on the - // band above the trace and wipe in L→R over reserved-width slots (the apex - // pen-write at low amplitude) with a 2-frame just-traced flash; emphasis - // words get a ticking frequency-readout chip; the trig LED blinks on every - // word arrival. Lines collapse INTO the waveform on exit. At the FINAL word - // the trace explodes to max-amp chaos, flatlines, collapses to a single dot - // and `body.siglost` stamps — the scope dies with the clip. - const b = dna.body; - const A = dna.palette.accent, - BRT = dna.palette.bright || "#d6ffe4", - FLSH = dna.palette.flash || "#eafff2", - EM = dna.palette.em || "#ffb347", - HUD = dna.palette.hud || "#2f8f55"; - const bandH = b.bandH || 164; - const bandTop = H - bandH; - const waveH = b.waveH || 84; - const NZ = +LASTWORD.start.toFixed(3); // the scope-death beat - // line windows: exits collapse into the trace — early into dead air - // (lastWordStart+0.67), else just before the next line needs the slot - const lineData = LINES.map((L, i) => { - const lastSt = L.words[L.words.length - 1].start; - const next = LINES[i + 1]; - const out = next - ? +Math.min(next.in - 0.05, lastSt + 0.67).toFixed(3) - : +Math.min(NZ + 0.33, DUR - 0.2).toFixed(3); - return { - id: "sc" + L.id, - in: +L.in.toFixed(3), - out, - words: L.words.map((w) => [ - w.display, - +w.start.toFixed(3), - w.minor ? 1 : 0, - Math.abs(w.start - NZ) < 0.001 ? 1 : 0, // the death word settles hot - ]), - }; - }); - // waveform burst map BAKED from measured glyph metrics (slot centers) + - // the hero kick positions (the trace surges wide where the apex writes) - const GAPem = 0.32; - const burst = []; // [t, x, big] - LINES.forEach((L) => { - const ws = L.words.map((w) => wordPx(w.display, dna.fonts.body, b.fontPx, 0)); - const totalW = ws.reduce((a, c) => a + c, 0) + GAPem * b.fontPx * (L.words.length - 1); - let x = W / 2 - totalW / 2; - L.words.forEach((w, i) => { - burst.push([+w.start.toFixed(3), +(x + ws[i] / 2).toFixed(1), 0]); - x += ws[i] + GAPem * b.fontPx; - }); - }); - if (hero && !heroInline) - for (let k = 0; k < hero.len; k++) { - const hx = HG.x + (hero.len === 1 ? 0 : (k / (hero.len - 1)) * 0.6 * (HG.halfW || 300)); - burst.push([+tWords[hero.idx + k].start.toFixed(3), +hx.toFixed(1), 1]); - } - const css = ` - #scband { position:absolute; left:0; top:${bandTop}px; width:${W}px; height:${bandH}px; opacity:0; - background: rgba(0,12,4,0.58); border-top:1px solid ${A}4d; - box-shadow: 0 -8px 30px rgba(0,0,0,0.35); } - .schud { position:absolute; top:6px; font-family:'${dna.fonts.tag}', monospace; font-size:20px; - color:${HUD}; letter-spacing:2px; } - #schudL { left:24px; } - #schudR { right:24px; } - #sctrig { display:inline-block; width:10px; height:10px; border-radius:50%; - background:${EM}; box-shadow:0 0 6px ${EM}cc; margin-left:8px; opacity:0.45; } - #scgrat { position:absolute; left:0; top:${b.waveTop || 80}px; width:${W}px; height:${waveH}px; opacity:0.6; - background-image: - repeating-linear-gradient(90deg, ${A}12 0 1px, transparent 1px 80px), - linear-gradient(180deg, transparent ${Math.round(waveH / 2 - 1)}px, ${A}1a ${Math.round(waveH / 2 - 1)}px ${Math.round(waveH / 2 + 1)}px, transparent ${Math.round(waveH / 2 + 1)}px); } - #scwavewrap { position:absolute; left:0; top:${b.waveTop || 80}px; width:${W}px; height:${waveH}px; } - #scwave { filter: drop-shadow(0 0 5px ${A}bf); } - .scln { position:absolute; left:0; top:${b.lineDy || 34}px; width:${W}px; text-align:center; - font-family:'${dna.fonts.body}', monospace; font-size:${b.fontPx}px; line-height:${Math.round(b.fontPx * 1.1)}px; - color:${A}; text-shadow:0 0 8px ${A}73; - white-space:nowrap; opacity:0; } - .scln .w { display:inline-block; vertical-align:bottom; white-space:nowrap; - margin-right:${GAPem}em; position:relative; } - .scln .sz { visibility:hidden; } - .scln .clip { position:absolute; left:0; top:0; overflow:hidden; white-space:nowrap; width:0; } - .scchip { position:absolute; left:50%; top:-26px; width:130px; margin-left:-65px; - height:24px; font-family:'${dna.fonts.tag}', monospace; font-size:21px; - color:${EM}; text-shadow:0 0 6px ${EM}99; opacity:0; } - .scchip .cv { position:absolute; left:0; top:0; width:100%; text-align:center; opacity:0; } - #scdot { position:absolute; left:${W / 2 - 6}px; top:${bandTop + (b.waveTop || 80) + Math.round(waveH / 2) - 4}px; - width:9px; height:9px; border-radius:50%; background:${BRT}; opacity:0; - box-shadow:0 0 8px ${A}, 0 0 22px ${A}e6; } - #scsiglost { position:absolute; left:0; top:${bandTop + (b.waveTop || 80)}px; width:${W}px; text-align:center; - font-family:'${dna.fonts.tag}', monospace; font-size:24px; letter-spacing:6px; - color:${EM}; text-shadow:0 0 10px ${EM}b3; opacity:0; }`; - const html = - `
-
${esc(b.hudL || "SPECTRUM // CH1")}
-
${esc(b.hudR || FPS + ".0 kS/s · TRIG")}
-
-
- - - -
-` + - lineData.map((L) => `
`).join("\n") + - ` -
-
${esc(b.siglost || "— SIGNAL LOST —")}
-
`; - const js = ` - // ---- body paradigm: SCOPERAIL (trace-wipe words, waveform alive all clip) ---- - const rnd = mulberry32(${b.waveSeed || 7}); - const NZ = ${NZ.toFixed(3)}, ENDC = ${(DUR - 0.02).toFixed(3)}; - const BURST = ${J(burst)}; // [t, x, big] — word arrivals kick the trace - const allT = BURST.map((q) => q[0]); - const burstAt = {}; const bigAt = {}; - BURST.forEach(([t, x, big]) => { burstAt[t] = x; if (big) bigAt[t] = 1; }); - - // ===== baked waveform states (pure f(t) + seeded jitter; ~2 states/word frame) ===== - const timesSet = []; - let t0 = 0; - while (t0 < NZ - 0.015) { timesSet.push(t0); t0 += 1 / 12; } - allT.forEach((wt) => { [wt, wt + F, wt + 2 * F].forEach((x) => { if (x < NZ - 0.015) timesSet.push(x); }); }); - for (let te = NZ - 0.01; te <= Math.min(NZ + 0.311, ENDC); te += F) timesSet.push(te); - timesSet.push(Math.min(NZ + 0.325, ENDC), Math.min(NZ + 0.35, ENDC)); - timesSet.sort((a, b2) => a - b2); - const times = timesSet.filter((x, i) => i === 0 || x - timesSet[i - 1] > 0.02); - const NPTS = ${Math.round(W / 20) + 1}, MIDY = ${Math.round(waveH / 2)}; - function speechEnv(t) { - let e = 0; - allT.forEach((wt) => { - const g = Math.exp(-Math.pow((t - wt - 0.10) / 0.21, 2)); - if (g > e) e = g; - }); - return e; - } - const wavePts = []; - times.forEach((t) => { - const boom = t > NZ - 0.007 && t < NZ + 0.308; - const flat = t >= NZ + 0.32; - const baseAmp = flat ? 0.5 : (boom ? 34 : 2.2 + 15 * speechEnv(t)); - const pts = []; - for (let i = 0; i < NPTS; i++) { - const x = i * 20; - let amp = baseAmp; - if (!boom && !flat) { - allT.forEach((wt) => { - if (t >= wt - 0.005 && t <= wt + 0.13) { - const big = bigAt[wt]; - amp += (big ? 30 : 20) * Math.exp(-Math.pow((x - burstAt[wt]) / (big ? 240 : 95), 2)); - } - }); - } - const jit = (rnd() - 0.5) * 2; - let y = amp * (0.52 * Math.sin(i * 0.55 + t * 16.2 + 0.7) - + 0.42 * Math.sin(i * 1.27 - t * 23.5 + 2.1) - + (boom ? 0.85 : 0.42) * jit); - if (y > MIDY - 4) y = MIDY - 4; if (y < -(MIDY - 4)) y = -(MIDY - 4); - pts.push(x + "," + (MIDY + y).toFixed(1)); - } - wavePts.push([t, pts.join(" ")]); - }); - const scwave = document.getElementById("scwave"); - scwave.setAttribute("points", wavePts[0][1]); - wavePts.forEach(([t, str]) => { tl.set(scwave, { attr: { points: str } }, Math.min(t, ENDC)); }); - - // ===== scope power-on ===== - tl.fromTo("#scband", { opacity: 0 }, { opacity: 1, duration: 0.12, ease: "power1.out" }, 0.02); - tl.fromTo("#scwavewrap", { scaleX: 0.04, transformOrigin: "50% 50%" }, - { scaleX: 1, duration: 0.22, ease: "power2.out" }, 0.04); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // rail yields while the apex trace writes (band carries lines + wave + HUD) - tl.to("#scband", { opacity: ${b.yield.dim}, duration: 0.18, ease: "power1.in" }, ${Math.max(heroIn - (b.yield.pre || 0.13), 0.2).toFixed(3)}); - tl.to("#scband", { opacity: 1, duration: 0.25, ease: "power1.out" }, ${Math.min(heroIn + (b.yield.post || 0.97), DUR - 0.4).toFixed(3)});` - : "" -} - - // ===== body lines: trace-wipe entrances over reserved-width slots ===== - const SRAIL = ${J(lineData)}; - function chipVals(r, idx) { - if (idx % 2 === 0) { - let v = 150 + Math.round(r() * 250); const a = [v]; - v += 300 + Math.round(r() * 200); a.push(v); - v += 200 + Math.round(r() * 150); a.push(v); - return a.map((x) => x + " Hz"); - } - let v = 0.3 + Math.round(r() * 3) * 0.1; const a = [v]; - v += 0.4 + Math.round(r() * 2) * 0.1; a.push(v); - v += 0.2 + Math.round(r() * 2) * 0.1; a.push(v); - return a.map((x) => x.toFixed(1) + " kHz"); - } - const crnd = mulberry32(${b.chipSeed || 11}); - let chipIdx = 0; - SRAIL.forEach((L) => { - const line = document.getElementById(L.id); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.03); - L.words.forEach(([txt, wt, minor, death]) => { - // reserved-width slot: sizer keeps the centered line static (no - // re-center drift as words arrive); the clip wipes the word in over it. - const wrap = document.createElement("span"); wrap.className = "w"; - const sizer = document.createElement("span"); sizer.className = "sz"; - sizer.textContent = txt; - const clip = document.createElement("span"); clip.className = "clip"; - const inner = document.createElement("span"); - inner.textContent = txt; - clip.appendChild(inner); wrap.appendChild(sizer); wrap.appendChild(clip); - line.appendChild(wrap); - // entrance = apex motif at low amplitude: the trace draws it L→R - tl.fromTo(clip, { width: 0 }, { width: "auto", duration: 0.10, ease: "none" }, wt); - // phosphor just-traced flash (full brightness instantly, settle in 2 frames) - const settle = death - ? { color: ${J(EM)}, textShadow: "0 0 9px ${EM}8c" } - : { color: ${J(A)}, textShadow: "0 0 8px ${A}73" }; - tl.set(inner, { color: ${J(FLSH)}, textShadow: "0 0 16px ${BRT}f2" }, wt); - tl.set(inner, settle, wt + 2 * F); - // trigger LED blink on every word arrival - tl.set("#sctrig", { opacity: 1, scale: 1.35 }, wt); - tl.set("#sctrig", { opacity: 0.45, scale: 1 }, wt + 2 * F); - // emphasis: ticking frequency readout (seeded, ascending) - if (minor) { - const chip = document.createElement("span"); chip.className = "scchip"; - const cvs = chipVals(crnd, chipIdx++).map((v) => { - const s = document.createElement("span"); s.className = "cv"; s.textContent = v; - chip.appendChild(s); return s; - }); - wrap.appendChild(chip); - tl.set(chip, { opacity: 1 }, wt + 0.12); - cvs.forEach((s, i) => { - tl.set(s, { opacity: 1 }, wt + 0.12 + i * 2 * F); - if (i < cvs.length - 1) tl.set(s, { opacity: 0 }, wt + 0.12 + (i + 1) * 2 * F); - }); - } - }); - // exit: the line collapses INTO the waveform - tl.to(line, { y: 30, opacity: 0, duration: 0.13, ease: "power2.in" }, L.out); - }); - - // ===== the death beat: explosion / band shake / flatline / dot / siglost ===== - [[3, 0], [-4, 1], [3, 2], [-2, 3], [0, 4]].forEach(([dx, k]) => { - tl.set("#scband", { x: dx }, Math.min(NZ + k * 0.042, ENDC)); - }); - tl.set("#scband", { x: 0 }, Math.min(NZ + 0.21, ENDC)); - // trig LED panics, then dies - [0, 1, 2, 3].forEach((k) => { - tl.set("#sctrig", { opacity: k % 2 ? 0.2 : 1, background: ${J(dna.palette.panic || "#ff5f47")}, - boxShadow: "0 0 8px ${(dna.palette.panic || "#ff5f47") + "e6"}" }, Math.min(NZ + k * 2 * F, ENDC)); - }); - tl.set("#sctrig", { opacity: 0.18 }, Math.min(NZ + 0.35, ENDC)); - // flatline → trace shrinks to a single dot - tl.to("#scwavewrap", { scaleX: 0.015, duration: 0.055, ease: "power3.in", - transformOrigin: "50% 50%" }, Math.min(NZ + 0.365, ENDC - 0.06)); - tl.set("#scwavewrap", { opacity: 0 }, Math.min(NZ + 0.425, ENDC)); - tl.set("#scdot", { opacity: 1 }, Math.min(NZ + 0.39, ENDC)); - tl.set("#scdot", { opacity: 0.45 }, Math.min(NZ + 0.465, ENDC)); - tl.set("#scdot", { opacity: 1 }, Math.min(NZ + 0.49, ENDC)); - // SIGNAL LOST stamp (2-frame flicker in; clamped ≤ DUR−0.02) - tl.set("#scsiglost", { opacity: 1 }, Math.min(NZ + 0.43, ENDC - 2 * F)); - tl.set("#scsiglost", { opacity: 0.35 }, Math.min(NZ + 0.43 + F, ENDC - F)); - tl.set("#scsiglost", { opacity: 1 }, Math.min(NZ + 0.43 + 2 * F, ENDC));`; - return { css, html, js }; -} - -function paradigmPaperrail() { - // PAPERRAIL: stop-motion craft table — a kraft strip (torn top edge, washi- - // taped corners, handwritten tag) holds cream paper chips that are PLACED - // one by one: opacity full in 0 frames, y −16 + scale 1.06→1 with steps(2), - // seeded ±2.5° crooked = the papermat drop at low amplitude. The strip - // jitters ±0.7px every 4 frames (handmade weave); chips hold a rotation-only - // ~5fps wobble. Emphasis words get a washi-tape slap (chip pressed 1 frame); - // the FINAL word is an accent chip (sign-off); the hero slot keeps a red - // paper star (rail↔climax hand-off) that pulses as the apex chips land. - // Exits: chips peeled off (rotation −8°, y −40, steps(3)), staggered. - const b = dna.body; - const stripW = (b.strip && b.strip.w) || 1140; - const stripH = (b.strip && b.strip.h) || 88; - const SX = (b.strip && b.strip.x) ?? Math.round((W - stripW) / 2); - const ST = H - ((b.strip && b.strip.bottomPx) ?? 26) - stripH; - const k = (b.fontPx || 38) / 38; // chip furniture scales with the type - const r = (v) => Math.round(v * k); - const tapeDelay = b.tapeDelay ?? 0.25; - // hero hand-off slot: the line whose window holds the apex keeps a star chip - const heroLi = heroInline ? -1 : LINES.findIndex((L) => heroIn >= L.in - 0.01 && heroIn < L.out); - const lineData = LINES.map((L, li) => { - const n = L.words.length + (li === heroLi ? 1 : 0); - // peel (0.18s + stagger) always completes on frame; demo cadence L.out−0.04 - const xo = +( - li === LINES.length - 1 ? Math.min(L.out - 0.04, DUR - 0.2 - (n - 1) * 0.03) : L.out - 0.04 - ).toFixed(3); - const words = L.words.map((w, wi) => { - const isLast = li === LINES.length - 1 && wi === L.words.length - 1; - const kind = isLast ? 3 : w.minor ? 1 : 0; // 0 chip / 1 taped / 2 star / 3 accent - let tapeT = 0; - if (kind === 1) { - const tt = +Math.min(w.start + tapeDelay, xo - 0.2).toFixed(3); - if (tt >= w.start + 0.08) tapeT = tt; - } - return [w.display, +w.start.toFixed(3), kind, tapeT]; - }); - if (li === heroLi) { - const at = L.words.filter((w) => w.start < heroIn).length; - words.splice(at, 0, ["*", +heroIn.toFixed(3), 2, 0]); - } - return { id: "pl" + L.id, in: +L.in.toFixed(3), xo, words }; - }); - const css = ` - #pstrip { position:absolute; left:${SX}px; top:${ST}px; width:${stripW}px; height:${stripH}px; opacity:0; } - #pstrip .paper { position:absolute; inset:0; - background: linear-gradient(180deg, #bd9e6f 0%, #b89968 45%, #a8854f 100%); - box-shadow: inset 0 -4px 0 rgba(90,66,30,0.55); } - .pwt { position:absolute; width:84px; height:24px; opacity:0.62; background: rgba(255,99,84,0.85); } - .pwt i { position:absolute; inset:0; display:block; - background: repeating-linear-gradient(90deg, rgba(255,255,255,0.22) 0 6px, rgba(255,255,255,0) 6px 13px); } - #pwtL { left:-16px; top:-11px; } #pwtR { right:-14px; top:-9px; } - #ptag { position:absolute; right:30px; top:${stripH - 38}px; font-family:'${dna.fonts.tag}', cursive; - font-size:24px; color:${dna.palette.tag || "#503d20"}; opacity:0.85; white-space:nowrap; } - #plines { position:absolute; inset:0; } - .pline { position:absolute; left:${W / 2}px; top:${ST + 14}px; white-space:nowrap; opacity:0; } - .pchip { position:relative; display:inline-block; margin-right:${r(10)}px; padding:${r(5)}px ${r(14)}px ${r(7)}px; - background:${dna.palette.chip || "#f6edd8"}; border:1px solid ${dna.palette.chipEdge || "#cdb98e"}; border-radius:3px; - box-shadow: 0 3px 0 rgba(58,38,16,0.38); - font-family:'${dna.fonts.body}', sans-serif; font-weight:600; font-size:${b.fontPx}px; line-height:1.15; - color:${dna.palette.body}; opacity:0; } - .pchip.red { background:${dna.palette.accent}; border-color:${dna.palette.accentEdge || "#c93527"}; color:#fff3e4; } - .ptape { position:absolute; top:-10px; right:-15px; width:${r(58)}px; height:${r(18)}px; opacity:0; - background: rgba(255,79,63,0.66); } - .ptape i { position:absolute; inset:0; display:block; - background: repeating-linear-gradient(90deg, rgba(255,255,255,0.25) 0 5px, rgba(255,255,255,0) 5px 11px); } - .pstarw { position:relative; display:inline-block; width:${r(46)}px; height:${r(44)}px; - margin-right:${r(10)}px; vertical-align:${-r(7)}px; opacity:0; } - .pstar { position:absolute; inset:0; background:${dna.palette.accent}; - clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%); - filter: drop-shadow(0 3px 0 rgba(58,38,16,0.38)); }`; - const html = `
-
-
-
-
${esc(b.tag || "cut & paste · 12 fps")}
-
-
-${lineData.map((L) => `
`).join("\n")} -
`; - const dimT = +Math.max(0.15, heroIn - ((b.yield && b.yield.pre) || 0.2)).toFixed(3); - const resT = +(heroIn + ((b.yield && b.yield.post) || 0.9)).toFixed(3); - const js = ` - // ---- body paradigm: PAPERRAIL (chips placed steps(2) / peel-off exit) ---- - const RAILP = ${J(lineData)}; - const rrnd = mulberry32(${b.seed || 150372}); - // torn top edge on the kraft strip (sides/bottom are the table cut) - (function(){ - const pts = []; const SEG = 28; - for (let i = 0; i <= SEG; i++) - pts.push(((${stripW}/SEG)*i).toFixed(1) + "px " + Math.max(0, (rrnd()-0.5)*8 + 4).toFixed(1) + "px"); - pts.push("${stripW}px ${stripH}px", "0px ${stripH}px"); - document.querySelector("#pstrip .paper").style.clipPath = "polygon(" + pts.join(",") + ")"; - })(); - gsap.set("#pwtL", { rotation: -38 }); - gsap.set("#pwtR", { rotation: 33 }); - gsap.set("#ptag", { rotation: -2 }); - - // ===== STRIP: placed on the table, then handmade jitter every 4 frames ===== - tl.set("#pstrip", { opacity: 1 }, 0.10); - tl.fromTo("#pstrip", { y: ${stripH + 26} }, { y: 0, duration: 0.18, ease: "steps(3)" }, 0.10); - for (let t = 0.45; t < ${(DUR - 0.06).toFixed(3)}; t += 1/6) - tl.set("#pstrip", { x: (rrnd()-0.5)*1.4, y: (rrnd()-0.5)*1.4, rotation: (rrnd()-0.5)*0.36 }, t); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // rail yields while the apex chips land (furniture never contests the hero) - tl.to(["#pstrip", "#plines"], { opacity: ${b.yield.dim}, duration: 0.10 }, ${dimT}); -${resT + 0.3 < DUR ? ` tl.to(["#pstrip", "#plines"], { opacity: 1, duration: 0.22 }, ${resT});` : ""}` - : "" -} - - // ===== BODY: paper chips placed one by one ===== - RAILP.forEach((L) => { - const line = document.getElementById(L.id); - gsap.set(line, { xPercent: -50 }); - tl.set(line, { opacity: 1 }, L.in); - L.words.forEach(([txt, st, kind, tapeT], wi) => { - let el; - if (kind === 2) { // apex hand-off: red paper star in the slot - el = document.createElement("span"); el.className = "pstarw"; - const s = document.createElement("span"); s.className = "pstar"; - el.appendChild(s); line.appendChild(el); - // placement pulse when the apex word starts landing - tl.set(s, { scale: 1.18 }, st + 0.09); - tl.set(s, { scale: 1.06 }, st + 0.17); - tl.set(s, { scale: 1 }, st + 0.25); - } else { - el = document.createElement("span"); - el.className = "pchip" + (kind === 3 ? " red" : ""); - el.textContent = txt; - line.appendChild(el); - } - const r0 = (rrnd()-0.5)*5; // seeded ±2.5° crooked placement - gsap.set(el, { transformOrigin: "50% 80%" }); - // PLACED: the apex drop at low amplitude — opacity full in 0 frames - tl.set(el, { opacity: 1, rotation: r0 }, st); - tl.fromTo(el, { y: -16, scale: 1.06 }, { y: 0, scale: 1, duration: 0.12, ease: "steps(2)" }, st); - // handmade hold wobble (rotation only, ~5fps) - for (let t = st + 0.40; t < L.xo - 0.06; t += 0.21) - tl.set(el, { rotation: r0 + (rrnd()-0.5)*1.0 }, t); - // washi-tape slap pins the emphasis words - if (kind === 1 && tapeT > 0) { - const tape = document.createElement("span"); tape.className = "ptape"; - const ti = document.createElement("i"); tape.appendChild(ti); - el.appendChild(tape); - gsap.set(tape, { rotation: -36 }); - tl.set(tape, { opacity: 0.92 }, tapeT); - tl.fromTo(tape, { scale: 1.7 }, { scale: 1, duration: 0.0833, ease: "steps(2)" }, tapeT); - tl.set(el, { y: 2 }, tapeT); // chip pressed by the slap - tl.set(el, { y: 0 }, tapeT + 0.0833); - } - // EXIT: peeled off - tl.to(el, { rotation: r0 - 8, y: -40, opacity: 0, duration: 0.18, ease: "steps(3)" }, - L.xo + wi*0.03); - }); - });`; - return { css, html, js }; -} - -function paradigmPopuprail() { - // POPUPRAIL: pop-up book page — a cream page strip (center foldline) unfolds - // up from the bottom edge (scaleY back.out, the stage is built); words POP - // UP on a baseline hinge (rotationX 85→0, back.out = the centerfold motif at - // low amplitude) on two reading rows that alternate per line. Emphasis words - // land bigger with a contact squash the strip FEELS (1px dip), then flick- - // wobble; blue paper struts lean in behind emphasis + the sign-off word; the - // hero slot keeps a blue paper star (rail↔climax hand-off). Exits fold flat - // in an L→R wave (the page closing); on the final word the whole page TILTS - // (paper physics) and the strip itself folds shut on the last frame. - const b = dna.body; - const stripW = (b.strip && b.strip.w) || 1230; - const stripH = (b.strip && b.strip.h) || 124; - const rowY = { A: H - (b.rowA ?? 70), B: H - (b.rowB ?? 20) }; - const k = (b.fontPx || 42) / 42; // chip furniture scales with the type - const r = (v) => Math.round(v * k); - const emPx = b.emPx || Math.round((b.fontPx || 42) * 1.24); - const maxHold = b.maxHold ?? 0.95; - // hero hand-off slot: the line whose window holds the apex keeps a star chip - const heroLi = heroInline ? -1 : LINES.findIndex((L) => heroIn >= L.in - 0.01 && heroIn < L.out); - const lineData = LINES.map((L, li) => { - const lastSt = L.words[L.words.length - 1].start; - const n = L.words.length + (li === heroLi ? 1 : 0); - // fold as the next line begins, or after maxHold in silence; the fold wave - // + slot hide always complete by DUR−0.017 (demo cadence: L4 folds 5.76) - const foldT = +Math.min(L.out, lastSt + maxHold, DUR - 0.147 - 0.045 * (n - 1)).toFixed(3); - const words = L.words.map((w, wi) => { - const isLast = li === LINES.length - 1 && wi === L.words.length - 1; - const kind = isLast ? 2 : w.minor ? 1 : 0; // 0 plain | 1 emph | 2 emph-blue | 3 star - let wobT = 0, - wobD = 0, - strutT = 0; - if (kind === 1) { - // paper-flick after landing, squeezed to fit before the fold - const wt = +(w.start + 0.2).toFixed(3); - const wd = +Math.min(0.5, foldT - wt - 0.04).toFixed(2); - if (wd >= 0.15) { - wobT = wt; - wobD = wd; - } - } - if (kind >= 1) { - const st2 = +Math.min(w.start + (kind === 2 ? 0.15 : 0.26), foldT - 0.1).toFixed(3); - if (st2 >= w.start + 0.08) strutT = st2; - } - return [w.display, +w.start.toFixed(3), kind, wobT, wobD, strutT]; - }); - if (li === heroLi) { - const at = L.words.filter((w) => w.start < heroIn).length; - words.splice(at, 0, ["*", +heroIn.toFixed(3), 3, 0, 0, 0]); - } - return { id: "pu" + L.id, row: li % 2 === 0 ? "A" : "B", foldT, words }; - }); - const css = ` - #pupage { position:absolute; inset:0; } - #pustrip { position:absolute; left:${W / 2}px; top:${H}px; width:${stripW}px; height:${stripH}px; - opacity:0; border-radius:4px 4px 0 0; - background: linear-gradient(180deg, ${dna.palette.page || "#f7eed8"} 0%, ${dna.palette.page2 || "#f0e4c8"} 55%, ${dna.palette.page3 || "#e7d8b4"} 100%); - border-top: 2px solid ${dna.palette.pageEdge || "rgba(122,96,54,0.55)"}; - box-shadow: 0 -12px 26px rgba(18,12,5,0.38), inset 0 14px 18px rgba(255,255,248,0.5); } - #pufold { position:absolute; left:50%; top:0; bottom:0; width:3px; margin-left:-1px; - background: linear-gradient(90deg, rgba(120,95,55,0) 0%, rgba(120,95,55,0.30) 50%, rgba(255,252,240,0.5) 100%); } - .puline { position:absolute; left:${W / 2}px; white-space:nowrap; } - .puslot { display:inline-block; position:relative; margin-right:0.34em; vertical-align:baseline; } - .puw { display:inline-block; position:relative; z-index:1; opacity:0; - font-family:'${dna.fonts.body}', sans-serif; font-weight:600; font-size:${b.fontPx}px; - line-height:1.04; color:${dna.palette.body}; } - .puw.em { font-size:${emPx}px; font-weight:800; } - .puw.blue { color:${dna.palette.blue || dna.palette.accent}; } - .puw.star { width:${r(30)}px; height:${r(30)}px; background:${dna.palette.accent}; vertical-align:${-r(2)}px; - filter: drop-shadow(0 2px 2px rgba(60,40,15,0.35)); - clip-path: polygon(50% 0%,61% 35%,98% 35%,68% 57%,79% 91%,50% 70%,21% 91%,32% 57%,2% 35%,39% 35%); } - .pustrut { position:absolute; right:-8px; bottom:0; width:${r(19)}px; height:${r(16)}px; - background: linear-gradient(180deg,${dna.palette.strut1 || "#4f93c4"} 0%, ${dna.palette.strut2 || dna.palette.accent} 70%); - clip-path: polygon(0 100%, 100% 100%, 100% 0); opacity:0; z-index:0; }`; - const html = `
-
-${lineData.map((L) => `
`).join("\n")} -
`; - const js = ` - // ---- body paradigm: POPUPRAIL (baseline-hinge pop-ups / fold-flat exit) ---- - const RAILU = ${J(lineData)}; - const ROWY = ${J(rowY)}; - - // ===== PAGE STRIP: unfolds up from the bottom edge (the stage is built) ===== - gsap.set("#pustrip", { xPercent: -50, yPercent: -100, transformOrigin: "50% 100%", scaleY: 0.02 }); - tl.set("#pustrip", { opacity: 1 }, 0.14); - tl.to("#pustrip", { scaleY: 1, duration: 0.24, ease: "back.out(1.5)" }, 0.14); - // hold life: the whole page breathes very gently - tl.to("#pupage", { keyframes: { y: [0, -1.6, -0.4, -1.4, 0] }, - duration: ${Math.min(5.3, DUR - 0.75).toFixed(2)}, ease: "sine.inOut" }, 0.40); - - // ===== BODY: words pop up on the baseline hinge ===== - RAILU.forEach((L) => { - const line = document.getElementById(L.id); - line.style.top = ROWY[L.row] + "px"; - const els = L.words.map(([txt, st, kind]) => { - const slot = document.createElement("span"); slot.className = "puslot"; - let strut = null; - if (kind === 1 || kind === 2) { - strut = document.createElement("div"); strut.className = "pustrut"; - slot.appendChild(strut); - } - const w = document.createElement("span"); - w.className = "puw" + (kind === 1 ? " em" : kind === 2 ? " em blue" : kind === 3 ? " star" : ""); - if (kind !== 3) w.textContent = txt; - slot.appendChild(w); - line.appendChild(slot); - return { w, strut, slot }; - }); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - - L.words.forEach(([txt, st, kind, wobT, wobD, strutT], wi) => { - const { w, strut, slot } = els[wi]; - gsap.set(w, { transformPerspective: 650, transformOrigin: "50% 100%", rotationX: 85 }); - // POP UP — baseline hinge, paper overshoot; back-shadow grows as it rises - tl.set(w, { opacity: 1, textShadow: "0 0px 0px rgba(70,50,25,0)" }, st); - tl.to(w, { rotationX: 0, duration: 0.25, ease: "back.out(1.4)" }, st); - tl.to(w, { textShadow: "0 3px 5px rgba(70,50,25,0.38)", duration: 0.25, ease: "power1.out" }, st); - if (kind === 1 || kind === 2) { // contact squash on the big words - tl.set(w, { scaleX: 1.06, scaleY: 0.93 }, st + 0.12); - tl.to(w, { scaleX: 1, scaleY: 1, duration: 0.30, ease: "elastic.out(1, 0.4)" }, st + 0.16); - tl.set("#pustrip", { y: 1 }, st + 0.13); // the page feels the landing - tl.to("#pustrip", { y: 0, duration: 0.16, ease: "power2.out" }, st + 0.18); - } - if (wobT) tl.to(w, { keyframes: { rotationX: [0, -4, 2.8, -1.4, 0.5, 0] }, - duration: wobD, ease: "sine.inOut" }, wobT); - if (strut && strutT) { // visible paper strut leans in behind - gsap.set(strut, { transformOrigin: "50% 100%", scaleY: 0 }); - tl.set(strut, { opacity: 1 }, strutT); - tl.to(strut, { scaleY: 1, duration: 0.12, ease: "back.out(2)" }, strutT); - } - // EXIT — the page closes: words fold flat in an L→R wave - const ft = L.foldT + wi * 0.045; - tl.to(w, { rotationX: 88, duration: 0.12, ease: "power2.in" }, ft); - tl.to(w, { textShadow: "0 0px 0px rgba(70,50,25,0)", duration: 0.12 }, ft); - if (strut) tl.to(strut, { scaleY: 0, duration: 0.10, ease: "power2.in" }, ft); - tl.set(slot, { opacity: 0 }, ft + 0.13); - }); - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // APEX OWNS ITS WINDOW — page yields while the centerfold lands, restores - tl.to("#pupage", { opacity: ${b.yield.dim}, duration: 0.12, ease: "power1.out" }, ${(heroIn - (b.yield.pre || 0.03)).toFixed(3)}); - tl.to("#pupage", { opacity: 1, duration: 0.22, ease: "power1.in" }, ${(heroIn + (b.yield.post || 0.47)).toFixed(3)});` - : "" -} -${ - b.tilt !== false - ? ` - // paper-world physics: on the final word the whole page TILTS and slides - tl.to("#pupage", { rotation: 2, x: 6, transformOrigin: "50% 100%", - duration: 0.26, ease: "back.out(2.2)" }, ${(LASTWORD.start + 0.02).toFixed(3)});` - : "" -} - // ending: after the last fold the strip itself closes (book shut) - tl.to("#pustrip", { scaleY: 0.03, duration: 0.07, ease: "power3.in" }, ${(DUR - 0.082).toFixed(3)}); - tl.set("#pustrip", { opacity: 0 }, ${(DUR - 0.017).toFixed(3)});`; - return { css, html, js }; -} - -function paradigmChalkrail() { - // CHALKRAIL: night-lecture chalk band — a deep-green board strip (worn top - // hairline, eraser smudges, handwritten header tag, two chalk sticks) docked - // at the bottom edge holds reading rows that ACCUMULATE: lines fill the rows - // top→bottom in phases of rows.length; when the next phase needs the rows an - // ERASER SWIPE clears the board (a blurred light band sweeps across, the - // words SMEAR out scaleX 1.3 + blur(8), faint ghost smudges stay — chalk - // never fully erases). Words are chalk-written fast: 2-frame pop + scribble - // clip-reveal steps(4) + 6 seeded dust specks puffing at the base + seeded - // ±2° tilt = the chalkwrite verb at low amplitude. Emphasis = double - // underline dashes drawn beneath; the FINAL transcript word lands in yellow - // chalk (sign-off). Band yields during the apex landing, restores after. - const b = dna.body; - const stripW = (b.strip && b.strip.w) || 1200; - const stripH = (b.strip && b.strip.h) || 148; - const SX = (b.strip && b.strip.x) ?? Math.round((W - stripW) / 2); - const ST = H - ((b.strip && b.strip.bottomPx) ?? 0) - stripH; - const rows = b.rows || [26, 82]; - const R = rows.length; - const kw = stripW / 1200, - kh = stripH / 148; // furniture scales with the strip (demo 1200×148) - const lineData = LINES.map((L, li) => ({ - id: "cl" + L.id, - top: rows[li % R], - words: L.words.map((w, wi) => [ - w.display, - +w.start.toFixed(3), - w.minor ? 1 : 0, - li === LINES.length - 1 && wi === L.words.length - 1 ? 1 : 0, // yellow sign-off - ]), - })); - // eraser passes: one per phase boundary — swipe after the previous phase's - // last word ends, always landing clear of the next phase's first word - const erases = []; - for (let pi = R; pi < LINES.length; pi += R) { - const prevEnd = Math.max( - ...LINES.slice(pi - R, pi).map((L) => L.words[L.words.length - 1].end), - ); - const nextIn = LINES[pi].in; - const t = +Math.max( - prevEnd + 0.05, - Math.min(prevEnd + (b.eraseDelay ?? 0.23), nextIn - 0.9), - ).toFixed(3); - erases.push({ t, lines: lineData.slice(pi - R, pi).map((L) => L.id) }); - } - const css = ` - #cband { position:absolute; left:${SX}px; top:${ST}px; width:${stripW}px; height:${stripH}px; opacity:0; - background: linear-gradient(180deg, ${dna.palette.bandHi || "#23392d"} 0%, ${dna.palette.board || "#1d3328"} 45%, ${dna.palette.bandLo || "#16271f"} 100%); - border-radius:8px 8px 0 0; - box-shadow: inset 0 0 70px rgba(0,0,0,0.5), inset 0 14px 18px -12px rgba(0,0,0,0.6), - 0 -3px 18px rgba(0,0,0,0.35); } - #cband .hairline { position:absolute; top:0; left:0; right:0; height:1px; - background: rgba(240,245,235,0.14); } - #cband .smg { position:absolute; border-radius:50%; } - #csmg1 { left:${Math.round(520 * kw)}px; top:${Math.round(14 * kh)}px; width:${Math.round(300 * kw)}px; height:${Math.round(90 * kh)}px; transform:rotate(-4deg); - background: radial-gradient(50% 50% at 50% 50%, rgba(220,230,220,0.07) 0%, rgba(220,230,220,0) 70%); } - #csmg2 { left:${Math.round(880 * kw)}px; top:${Math.round(60 * kh)}px; width:${Math.round(260 * kw)}px; height:${Math.round(74 * kh)}px; transform:rotate(5deg); - background: radial-gradient(50% 50% at 50% 50%, rgba(220,230,220,0.06) 0%, rgba(220,230,220,0) 70%); } - #chdr { position:absolute; top:5px; left:28px; font-family:'${dna.fonts.tag || dna.fonts.body}', cursive; - font-size:23px; letter-spacing:1.5px; color:rgba(238,244,236,0.5); opacity:0; } - #cstickW { position:absolute; right:30px; bottom:12px; width:52px; height:9px; border-radius:4px; - background: linear-gradient(180deg, #f4f1e4 0%, #d9d4c2 100%); - transform: rotate(9deg); box-shadow: 0 2px 3px rgba(0,0,0,0.4); opacity:0; } - #cstickY { position:absolute; right:96px; bottom:11px; width:27px; height:8px; border-radius:4px; - background: linear-gradient(180deg, #efd680 0%, #d8ba55 100%); - transform: rotate(-5deg); box-shadow: 0 2px 3px rgba(0,0,0,0.4); opacity:0; } - .crow { position:absolute; left:30px; white-space:nowrap; - font-family:'${dna.fonts.body}', cursive; font-size:${b.fontPx}px; line-height:1.0; color:${dna.palette.body}; - text-shadow: ${b.glow || "0 0 7px rgba(250,250,240,0.28), 0 1px 0 rgba(255,255,255,0.10)"}; } - .crow .w { display:inline-block; position:relative; margin-right:0.35em; opacity:0; } - .crow .w .txt { display:inline-block; } - .crow .w.yel { color:${dna.palette.em || "#f3d96b"}; text-shadow: 0 0 8px ${(dna.palette.em || "#f3d96b") + "52"}, 0 1px 0 rgba(255,255,255,0.08); } - .crow .w .d { position:absolute; bottom:2px; width:3px; height:3px; border-radius:50%; - background:${dna.palette.dust || "#f1efe2"}; opacity:0; pointer-events:none; } - .crow .w svg.ul { position:absolute; left:2%; bottom:-8px; width:96%; height:18px; overflow:visible; } - .cghost { position:absolute; border-radius:50%; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(240,244,238,0.10) 0%, rgba(240,244,238,0) 70%); } - #cgh1 { left:${Math.round(110 * kw)}px; top:${Math.round(24 * kh)}px; width:${Math.round(430 * kw)}px; height:${Math.round(62 * kh)}px; } - #cgh2 { left:${Math.round(80 * kw)}px; top:${Math.round(80 * kh)}px; width:${Math.round(360 * kw)}px; height:${Math.round(56 * kh)}px; } - #ceraser { position:absolute; top:-8px; left:0; width:120px; height:${stripH + 16}px; opacity:0; - background: linear-gradient(100deg, rgba(236,242,236,0) 0%, rgba(236,242,236,0.30) 45%, rgba(236,242,236,0) 100%); - filter: blur(5px); }`; - const html = `
-
-
-
-
${esc(b.tag || "NIGHT LECTURE · wk 07")}
-
-
-${lineData.map((L) => `
`).join("\n")} -
-
-
-
`; - const js = ` - // ---- body paradigm: CHALKRAIL (chalk scribble pop / eraser-swipe phases) ---- - const RAILC = ${J(lineData)}; - const ERASES = ${J(erases)}; - const rrnd = mulberry32(${b.seed || 13}); - const SVGNS = "http://www.w3.org/2000/svg"; - - // ===== band furniture ===== - tl.fromTo("#cband", { opacity: 0, y: 26 }, { opacity: 1, y: 0, duration: 0.22, ease: "power2.out" }, 0.03); - tl.fromTo("#chdr", { opacity: 0 }, { opacity: 1, duration: 0.25 }, 0.30); - tl.fromTo("#cstickW", { opacity: 0 }, { opacity: 0.92, duration: 0.2 }, 0.36); - tl.fromTo("#cstickY", { opacity: 0 }, { opacity: 0.92, duration: 0.2 }, 0.42); - - // ===== body words: chalk-dust pop (entrance = the apex motif, low amplitude) ===== - RAILC.forEach((L) => { - const line = document.getElementById(L.id); - L.words.forEach(([txt, st, em, yel]) => { - const w = document.createElement("span"); w.className = "w" + (yel ? " yel" : ""); - const inner = document.createElement("span"); inner.className = "txt"; inner.textContent = txt; - w.appendChild(inner); line.appendChild(w); - gsap.set(w, { rotation: (rrnd() * 4 - 2), transformOrigin: "50% 100%" }); - gsap.set(inner, { clipPath: "inset(-30% 102% -30% -2%)" }); - // 2-frame pop + fast scribble reveal + tiny drop-settle - tl.fromTo(w, { opacity: 0 }, { opacity: 1, duration: 0.07, ease: "power1.in" }, st); - tl.to(inner, { clipPath: "inset(-30% -2% -30% -2%)", duration: 0.12, ease: "steps(4)" }, st); - tl.fromTo(w, { y: 4 }, { y: 0, duration: 0.2, ease: "power2.out" }, st); - // 6 seeded dust specks puff at the word base - for (let k = 0; k < 6; k++) { - const d = document.createElement("span"); d.className = "d"; - d.style.left = (6 + rrnd() * 84) + "%"; - w.appendChild(d); - tl.set(d, { opacity: 0.85 }, st + 0.02); - tl.to(d, { y: 12 + rrnd() * 16, x: rrnd() * 16 - 8, opacity: 0, - duration: 0.36 + rrnd() * 0.15, ease: "power1.in" }, st + 0.02); - } - // emphasis: double underline dashes drawn beneath - if (em) { - const svg = document.createElementNS(SVGNS, "svg"); - svg.setAttribute("class", "ul"); svg.setAttribute("viewBox", "0 0 100 18"); - svg.setAttribute("preserveAspectRatio", "none"); - const col = yel ? ${J(dna.palette.em || "#f3d96b")} : ${J(dna.palette.body)}; - [["M 3 5 C 28 2, 66 8, 97 4", Math.min(st + 0.22, ${(DUR - 0.3).toFixed(3)}), 0.12], - ["M 6 12 C 36 9, 62 15, 95 11", Math.min(st + 0.38, ${(DUR - 0.2).toFixed(3)}), 0.10]].forEach(([dd, tu, du]) => { - const p = document.createElementNS(SVGNS, "path"); - p.setAttribute("d", dd); p.setAttribute("fill", "none"); - p.setAttribute("stroke", col); p.setAttribute("stroke-width", "3"); - p.setAttribute("stroke-linecap", "round"); - p.setAttribute("vector-effect", "non-scaling-stroke"); - p.setAttribute("opacity", "0"); - svg.appendChild(p); - const len = p.getTotalLength(); - gsap.set(p, { strokeDasharray: len, strokeDashoffset: len }); - tl.set(p, { opacity: 0.9 }, tu); - tl.to(p, { strokeDashoffset: 0, duration: du, ease: "power2.in" }, tu); - }); - w.appendChild(svg); - } - }); - }); - - // ===== ERASER SWIPE between phases: light band sweeps, old words smear out ===== - ERASES.forEach((E, ei) => { - tl.set("#ceraser", { opacity: 1, x: -160 }, E.t); - tl.to("#ceraser", { x: ${stripW + 60}, duration: 0.42, ease: "power1.inOut" }, E.t); - tl.set("#ceraser", { opacity: 0 }, E.t + 0.44); - E.lines.forEach((id, r) => { - const kids = document.getElementById(id).children; - for (let i = 0; i < kids.length; i++) - tl.to(kids[i], { scaleX: 1.3, x: "+=24", opacity: 0, filter: "blur(8px)", - transformOrigin: "0% 80%", duration: 0.18, ease: "power2.in" }, - E.t + 0.03 + r * 0.01 + i * 0.06); - }); - // faint smudges the eraser leaves behind (stay) - if (ei === 0) { - tl.fromTo("#cgh1", { opacity: 0 }, { opacity: 0.8, duration: 0.25 }, E.t + 0.17); - tl.fromTo("#cgh2", { opacity: 0 }, { opacity: 0.8, duration: 0.25 }, E.t + 0.27); - } - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // APEX OWNS ITS WINDOW — band yields while the chalk word writes, restores - tl.to("#cband", { opacity: ${b.yield.dim}, duration: 0.14, ease: "power1.in" }, ${(heroIn - (b.yield.pre || 0.07)).toFixed(3)}); -${ - heroIn + (b.yield.post || 0.41) < DUR - 0.3 - ? ` tl.to("#cband", { opacity: 1, duration: 0.22, ease: "power1.out" }, ${(heroIn + (b.yield.post || 0.41)).toFixed(3)});` - : "" -}` - : "" -}`; - return { css, html, js }; -} - -function paradigmMarkerrail() { - // MARKERRAIL: street handstyle rail — marker words FLICK onto a stable - // bottom rail (opacity full in 1 frame + 1-frame squeak skew, seeded crooked - // rotation settling back.out — the spray-write verb at low amplitude); - // emphasis words take an alternating paint color (`palette.em`/`em2`) + a - // spray-underline SWOOSH (dash-revealed squiggle) with 8 seeded overspray - // dots; the FINAL transcript word lands BIG in `palette.em` with mini - // apex-impact physics (crush → squash → elastic — it rides the plate punch). - // Spent lines are ROLLER-BUFFED: a gray paint roller sweeps across, the - // words vanish under it and the wet smear lingers before fading; the last - // line is never buffed (the sign-off stays painted). Rail yields while the - // apex tag writes. - const b = dna.body; - const EMS = [ - dna.palette.em || dna.palette.accent, - dna.palette.em2 || dna.palette.em || dna.palette.accent, - ]; - let emIdx = 0; - const lineData = LINES.map((L, li) => ({ - id: "mr" + L.id, - in: +L.in.toFixed(3), - out: +L.out.toFixed(3), - last: li === LINES.length - 1 ? 1 : 0, - words: L.words.map((w, wi) => { - const signoff = li === LINES.length - 1 && wi === L.words.length - 1; - return [ - w.display, - +w.start.toFixed(3), - signoff ? EMS[0] : w.minor ? EMS[emIdx++ % EMS.length] : 0, - signoff ? 1 : 0, - ]; - }), - })); - const css = ` - .mline { position:absolute; left:${W / 2}px; top:${H - b.bottomPx}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', cursive; font-size:${b.fontPx}px; line-height:1.25; - color:${dna.palette.body}; - text-shadow: ${b.glow || "0 3px 12px rgba(0,0,0,0.72), 0 1px 3px rgba(0,0,0,0.6)"}; } - .mline .w { display:inline-block; opacity:0; margin-right:0.32em; position:relative; } - .mline .w:last-child { margin-right:0; } - .mroller { position:absolute; left:-14px; top:-8px; right:-14px; bottom:-8px; opacity:0; - background: linear-gradient(180deg, ${dna.palette.rollerHi || "#8d8a86"} 0%, ${dna.palette.rollerLo || "#6f6c69"} 45%, ${dna.palette.roller || "#807d79"} 100%); - border-radius:5px; } - .muline { position:absolute; left:-8%; top:100%; width:116%; height:26px; margin-top:-8px; - overflow:visible; } - .modot { position:absolute; width:5px; height:5px; border-radius:50%; opacity:0; }`; - const html = lineData.map((L) => `
`).join("\n"); - const js = ` - // ---- body paradigm: MARKERRAIL (marker flick in / roller buff out) ---- - const RAILM = ${J(lineData)}; - const DURM = ${(DUR - 0.02).toFixed(3)}; - const mrnd = mulberry32(${b.seed || 20260611}); - const SVGNSM = "http://www.w3.org/2000/svg"; - function mUnderline(span, color, t0) { - // spray underline swoosh: dash-revealed squiggle + seeded overspray dots - const svg = document.createElementNS(SVGNSM, "svg"); - svg.setAttribute("class", "muline"); - svg.setAttribute("viewBox", "0 0 120 26"); - svg.setAttribute("preserveAspectRatio", "none"); - const path = document.createElementNS(SVGNSM, "path"); - path.setAttribute("d", "M 5 13 C 28 20, 52 6, 78 12 S 108 16, 115 10"); - path.setAttribute("fill", "none"); path.setAttribute("stroke", color); - path.setAttribute("stroke-width", "8"); path.setAttribute("stroke-linecap", "round"); - path.setAttribute("opacity", "0"); - svg.appendChild(path); span.appendChild(svg); - const len = path.getTotalLength(); - gsap.set(path, { strokeDasharray: len, strokeDashoffset: len }); - tl.set(path, { opacity: 0.95 }, t0); - tl.to(path, { strokeDashoffset: 0, duration: 0.2, ease: "power2.out" }, t0); - for (let i = 0; i < 8; i++) { - const d = document.createElement("div"); - d.className = "modot"; d.style.background = color; span.appendChild(d); - const s = 3 + Math.round(mrnd() * 3); - gsap.set(d, { width: s, height: s, left: (4 + mrnd() * 92) + "%", - bottom: -(2 + mrnd() * 18) }); - const td = t0 + 0.03 + mrnd() * 0.15; - tl.set(d, { opacity: 0.9, scale: 0.4 }, td); - tl.to(d, { scale: 1.25, duration: 0.12, ease: "power2.out" }, td); - tl.to(d, { opacity: 0, duration: 0.3, ease: "power1.in" }, td + 0.12); - } - } - RAILM.forEach((L) => { - const line = document.getElementById(L.id); - const txt = document.createElement("div"); - txt.style.position = "relative"; line.appendChild(txt); - const roller = document.createElement("div"); - roller.className = "mroller"; line.appendChild(roller); - gsap.set(roller, { scaleX: 0, transformOrigin: "0% 50%" }); - L.words.forEach(([w]) => { - const s = document.createElement("span"); - s.className = "w"; s.textContent = w; txt.appendChild(s); - }); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.02); - L.words.forEach(([w, st, em, big], wi) => { - const el = txt.children[wi]; - const rot0 = (mrnd() - 0.5) * 12, rotF = (mrnd() - 0.5) * 4; - // FLICK IN: opacity full in 1 frame, squeak skew for 1 frame, back.out settle - tl.set(el, { opacity: 1, scale: big ? 1.5 : 1.18, rotation: rot0, skewX: 7, - color: em || ${J(dna.palette.body)}, transformOrigin: "50% 88%" }, st); - tl.set(el, { skewX: 0 }, st + F); - if (big) { // sign-off lands with the plate punch — mini apex-impact physics - tl.to(el, { scale: 1, duration: 0.09, ease: "power3.in" }, st + F); - tl.set(el, { scaleX: 1.1, scaleY: 0.9 }, st + F + 0.09); - tl.to(el, { scaleX: 1, scaleY: 1, duration: 0.26, ease: "elastic.out(1, 0.4)" }, st + F + 0.09 + 2 * F); - tl.to(el, { rotation: rotF, duration: 0.2, ease: "power2.out" }, st + F); - } else { - tl.to(el, { scale: 1, rotation: rotF, duration: 0.18, ease: "back.out(2.2)" }, st + F); - } - if (em && !big) mUnderline(el, em, Math.min(st + 0.22, ${(DUR - 0.5).toFixed(3)})); - }); - if (!L.last) { // BUFF EXIT: gray roller sweeps the line, smear lingers - const XO = L.out - 0.15; - tl.set(roller, { opacity: 0.92 }, XO); - tl.fromTo(roller, { scaleX: 0 }, { scaleX: 1, duration: 0.15, ease: "power2.in" }, XO); - tl.set(txt, { opacity: 0 }, XO + 0.15); - tl.to(roller, { opacity: 0.15, filter: "blur(2px)", duration: 0.22, ease: "power1.out" }, XO + 0.17); - tl.to(roller, { opacity: 0, duration: 0.35 }, Math.min(XO + 0.55, DURM - 0.36)); - tl.set(line, { display: "none" }, Math.min(XO + 0.95, DURM)); - } - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` // APEX OWNS ITS WINDOW — the line visible at the tag's onset yields. - // Restore only with runway before the buff (else the line exits dimmed). - RAILM.forEach((L) => { - if (L.in <= ${heroIn.toFixed(3)} && L.out > ${(heroIn - (b.yield.pre || 0.04)).toFixed(3)}) { - const dimT = Math.max(${(heroIn - (b.yield.pre || 0.04)).toFixed(3)}, L.in + 0.05); - const XO2 = L.out - 0.15; - if (XO2 > dimT + 0.2 || L.last) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.16 }, dimT); - const resT = ${(heroIn + (b.yield.post || 0.17)).toFixed(3)}; - if (L.last ? resT < DURM - 0.3 : resT + 0.15 < XO2) - tl.to("#" + L.id, { opacity: 1, duration: 0.18 }, resT); - } - } - });` - : "" -}`; - return { css, html, js }; -} - -function paradigmBrushrail() { - // BRUSHRAIL: washi paper band — a deckle-edged paper band (two faintly - // rotated under-sheets + a warm translucent main sheet) swipes in L→R behind - // a traveling brush-head shadow (the ink gesture at low amplitude); body - // words are brush-WIPED on (clip reveal 0.16s behind a per-word brush head) - // on centered replace-lines with seeded ±1° tilt; emphasis words get a - // double curved ink underline drawn beneath (fat wash + tight core); spent - // lines are wiped OFF right-to-left like a wet cloth (the reveal in reverse, - // an erase brush head riding the wipe); the band + the line under the - // gesture yield while the apex lands, and the band exits with the last line - // on one final R→L wipe. - const b = dna.body; - const stripW = (b.strip && b.strip.w) || 820; - const stripH = (b.strip && b.strip.h) || 90; - const SX = (b.strip && b.strip.x) ?? Math.round((W - stripW) / 2); - const ST = H - ((b.strip && b.strip.bottomPx) ?? 61) - stripH; - const CX = SX + Math.round(stripW / 2), - CY = ST + Math.round(stripH / 2); - const lineY = CY - 1; - const maxHold = b.maxHold ?? 0.78; - const lineData = LINES.map((L, li) => { - const lastSt = L.words[L.words.length - 1].start; - // erase: as the next line needs the surface, or after maxHold in silence; - // the LAST line is wiped with the band just before the clip ends - let eraseT, eraseEnd; - if (li === LINES.length - 1) { - eraseT = +(DUR - 0.142).toFixed(3); - eraseEnd = +(DUR - 0.032).toFixed(3); - } else { - eraseT = +Math.max(lastSt + 0.18, Math.min(L.out - 0.136, lastSt + maxHold)).toFixed(3); - eraseEnd = +Math.max(eraseT + 0.06, Math.min(L.out + 0.004, eraseT + 0.14)).toFixed(3); - } - return { - id: "br" + L.id, - eraseT, - eraseEnd, - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - }; - }); - const lastE = lineData[lineData.length - 1].eraseT; - const heroLi = heroInline ? -1 : LINES.findIndex((L) => heroIn >= L.in - 0.01 && heroIn < L.out); - const INKB = dna.palette.body || "#221a12"; // brush-head shadow = the body ink - const breD = Math.min(5.5, DUR - 0.55).toFixed(2); - const breN = Math.max(16, Math.round(breD * 11.6)); - const css = ` - #band { position:absolute; left:${CX}px; top:${CY}px; width:${stripW}px; height:${stripH}px; } - .bandu { position:absolute; inset:0; border-radius:8px; - background: linear-gradient(180deg, ${dna.palette.paperHi || "#efe8d7"} 0%, ${dna.palette.paperLo || "#e7dfcb"} 100%); } - #bandu1 { transform:rotate(-0.7deg) scale(1.012); opacity:0.42; } - #bandu2 { transform:rotate(0.5deg) scaleX(0.99); opacity:0.42; } - #bandmain { position:absolute; inset:0; border-radius:8px; - background: linear-gradient(180deg, ${dna.palette.sheetHi || "#f5efe2"}ed 0%, ${dna.palette.sheetLo || "#ece4d2"}ed 100%); - box-shadow: 0 5px 20px rgba(18,14,10,0.4), inset 0 0 26px rgba(120,98,70,0.18); } - .bandbh { position:absolute; top:-8%; width:30px; height:116%; opacity:0; - background: linear-gradient(90deg, ${dna.palette.bh || "#281e14"}00 0%, ${dna.palette.bh || "#281e14"}80 100%); - filter: blur(7px); } - .bline { position:absolute; left:${CX}px; top:${lineY}px; white-space:nowrap; opacity:0; - font-family:'${dna.fonts.body}', serif; font-weight:${b.weight || 600}; font-size:${b.fontPx}px; - line-height:1; color:${dna.palette.body}; - text-shadow: 0 1px 2px rgba(70,48,26,0.22); } - .bline .cell { display:inline-block; position:relative; margin-right:0.3em; } - .bline .wrap { display:inline-block; position:relative; } - .bline .bh { position:absolute; top:-14%; width:26px; height:128%; opacity:0.55; - background: linear-gradient(90deg, ${INKB}00 0%, ${INKB}8c 100%); - filter: blur(6px); } - .bline svg.ul { position:absolute; left:-3%; bottom:-12px; width:106%; height:14px; - overflow:visible; } - .bline .ebh { position:absolute; top:-18%; width:34px; height:136%; opacity:0; - background: linear-gradient(270deg, ${INKB}00 0%, ${INKB}80 100%); - filter: blur(7px); }`; - const html = `
-
-
-
-
-
-
-${lineData.map((L) => `
`).join("\n")} -
`; - const js = ` - // ---- body paradigm: BRUSHRAIL (brush-wipe reveals / wet-cloth wipe exits) ---- - const RAILB = ${J(lineData)}; - const brnd = mulberry32(${b.seed || 20260611}); - const SVGNSB = "http://www.w3.org/2000/svg"; - const ULD1 = "M 5 8 C 30 11.5, 68 4, 95 7"; - const ULD2 = "M 2 9 C 32 12.5, 66 4.5, 98 7.5"; - - // ===== BAND: swipes in L→R behind a brush head (the gesture, low amplitude) ===== - gsap.set("#band", { xPercent: -50, yPercent: -50, clipPath: "inset(0% 100% 0% 0%)" }); - tl.to("#band", { clipPath: "inset(0% 0% 0% 0%)", duration: 0.2, ease: "power2.out" }, 0.08); - tl.fromTo("#bandbh", { left: -30, opacity: 0.6 }, - { left: "100%", opacity: 0.6, duration: 0.2, ease: "power2.out" }, 0.08); - tl.set("#bandbh", { opacity: 0 }, 0.30); - // paper under light: the deckle under-sheet breathes faintly (baked f(t)) - const bnB = ${breN}, bvB = []; - for (let k = 0; k <= bnB; k++) bvB.push(0.40 + 0.05 * Math.sin(2 * Math.PI * 0.32 * (k / bnB * ${breD}))); - tl.to("#bandu1", { keyframes: { opacity: bvB }, duration: ${breD}, ease: "none" }, 0.3); - - // ===== BODY: words brush-wiped on, lines wiped off like a wet cloth ===== - RAILB.forEach((L) => { - const line = document.getElementById(L.id); - const rot = (brnd() - 0.5) * 2; // seeded ±1° tilt - L.words.forEach(([txt,, em]) => { - const cell = document.createElement("span"); cell.className = "cell"; - const wrap = document.createElement("span"); wrap.className = "wrap"; - const tx = document.createElement("span"); tx.textContent = txt; - const bh = document.createElement("div"); bh.className = "bh"; - wrap.appendChild(tx); wrap.appendChild(bh); cell.appendChild(wrap); - if (em) { // double curved ink underline - const svg = document.createElementNS(SVGNSB, "svg"); - svg.setAttribute("class", "ul"); svg.setAttribute("viewBox", "0 0 100 14"); - svg.setAttribute("preserveAspectRatio", "none"); - const mkp = (d, w, op) => { - const p = document.createElementNS(SVGNSB, "path"); - p.setAttribute("d", d); p.setAttribute("fill", "none"); - p.setAttribute("stroke", ${J(dna.palette.ulInk || dna.palette.body)}); - p.setAttribute("stroke-width", w); - p.setAttribute("stroke-opacity", op); p.setAttribute("stroke-linecap", "round"); - p.setAttribute("opacity", "0"); svg.appendChild(p); return p; - }; - cell._ulFat = mkp(ULD1, 7, 0.3); - cell._ulCore = mkp(ULD2, 2.6, 0.95); - cell.appendChild(svg); - } - line.appendChild(cell); - }); - const ebh = document.createElement("div"); ebh.className = "ebh"; - line.appendChild(ebh); - gsap.set(line, { xPercent: -50, yPercent: -50, rotation: rot }); - tl.set(line, { opacity: 1 }, L.words[0][1] - 0.02); - - L.words.forEach(([txt, st, em], wi) => { - const cell = line.children[wi]; - const wrap = cell.firstChild, bh = wrap.children[1]; - gsap.set(wrap, { clipPath: "inset(-14% 100% -14% 0%)" }); - tl.to(wrap, { clipPath: "inset(-14% 0% -14% 0%)", duration: 0.16, ease: "power2.out" }, st); - tl.fromTo(bh, { left: -26, opacity: 0.55 }, - { left: "100%", opacity: 0.55, duration: 0.16, ease: "power2.out" }, st); - tl.set(bh, { opacity: 0 }, st + 0.17); - if (em) { - [[cell._ulFat, 0.12], [cell._ulCore, 0.15]].forEach(([p, dly]) => { - const len = p.getTotalLength(); - const tu = Math.min(st + dly, ${(DUR - 0.3).toFixed(3)}); - gsap.set(p, { strokeDasharray: len, strokeDashoffset: len }); - tl.set(p, { opacity: 1 }, tu); - tl.to(p, { strokeDashoffset: 0, duration: 0.22, ease: "power2.out" }, tu); - }); - } - }); - - // EXIT: the reveal in reverse — a wet cloth wipes R→L, erase head riding - gsap.set(line, { clipPath: "inset(-30% 0% -30% 0%)" }); - tl.to(line, { clipPath: "inset(-30% 100% -30% 0%)", duration: L.eraseEnd - L.eraseT, - ease: "power2.in" }, L.eraseT); - tl.fromTo(ebh, { left: "100%", opacity: 0.5 }, - { left: -34, opacity: 0.5, duration: L.eraseEnd - L.eraseT, ease: "power2.in" }, L.eraseT); - tl.set(ebh, { opacity: 0 }, L.eraseEnd + 0.01); - tl.set(line, { opacity: 0 }, L.eraseEnd + 0.02); - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // APEX OWNS ITS WINDOW — band + the line under the gesture yield, band restores - tl.to(${heroLi >= 0 ? `["#band", "#br${heroLi}"]` : `"#band"`}, { opacity: ${b.yield.dim}, duration: 0.16 }, ${(heroIn - (b.yield.pre || 0.16)).toFixed(3)}); -${ - heroIn + (b.yield.post || 0.46) + 0.3 < DUR - ? ` tl.to("#band", { opacity: 1, duration: 0.18 }, ${(heroIn + (b.yield.post || 0.46)).toFixed(3)});` - : "" -}` - : "" -} - - // ending: the band itself is wiped off with the last line (one final R→L wipe) - tl.to("#band", { clipPath: "inset(0% 100% 0% 0%)", duration: 0.13, ease: "power2.in" }, ${lastE}); - tl.fromTo("#bandbh", { left: "100%", opacity: 0.6 }, - { left: -30, opacity: 0.6, duration: 0.13, ease: "power2.in" }, ${lastE}); - tl.set("#bandbh", { opacity: 0 }, ${Math.min(lastE + 0.14, DUR - 0.01).toFixed(3)});`; - return { css, html, js }; -} - -function paradigmInkrail() { - // INKRAIL: sumi ink on still water — up to three fixed reading ROWS at the - // bottom center (rows cycle in pairs, the closing line takes the third row, - // so the final thought ACCUMULATES instead of replacing) where Mincho-serif - // ink words BLEED in over a paper-white halo glow (opacity snaps in 2 - // frames; blur 12→0 + scale 1.25→1 carry the bleed — the apex bloom at low - // amplitude) while a duplicate blurred dark halo overshoots then tightens; - // an ink-settling RULE (gradient hairline) draws beneath each line; - // emphasis words shed a faint ink wisp curling off the word top; spent - // lines RE-DISSOLVE (blur up + spread + fade + slight rise — ink dispersing - // back into the water) as the line-after-next approaches (= the next - // occupant of their row); the closing lines persist to clip end; the rows - // visible under the bloom yield while the drop blooms. - const b = dna.body; - const rowGap = b.rowGap ?? 56; - const bottomPx = b.bottomPx ?? 36; // center of the LAST reading row - const n = LINES.length; - const base = n >= 3 ? 0 : 3 - n; // few lines sink to the lower rows - const lineData = LINES.map((L, li) => { - const slot = li === n - 1 && n >= 3 ? 2 : base + (li % 2); - let outT = null, - outDur = 0; - if (li + 2 < n) { - // re-dissolve as the line-after-next approaches; never dissolve mid-read - outDur = +Math.max(0.35, 0.5 - 0.05 * li).toFixed(2); - outT = +Math.max( - L.words[L.words.length - 1].start + 0.25, - LINES[li + 2].words[0].start - outDur - 0.05, - ).toFixed(3); - } - return { - id: "ik" + L.id, - in: +L.in.toFixed(3), - y: H - bottomPx - (2 - slot) * rowGap, - outT, - outDur, - words: L.words.map((w) => [w.display, +w.start.toFixed(3), w.minor ? 1 : 0]), - }; - }); - const INK = dna.palette.body; - const PAP = dna.palette.paper || "#fffaee", - PAP2 = dna.palette.paper2 || "#fff8e8"; - const css = ` - .irow { position:absolute; left:${W / 2}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.body}', serif; font-weight:${b.weight || 400}; - font-size:${b.fontPx}px; line-height:1.25; letter-spacing:${b.letterSpacing || "0.055em"}; - color:${INK}; } - .irow .w { display:inline-block; position:relative; margin-right:0.34em; } - .irow .w:last-child { margin-right:0; } - .irow .ink { position:relative; display:inline-block; opacity:0; - text-shadow: 0 0 5px ${PAP}, 0 0 14px ${PAP}f2, 0 0 30px ${PAP2}d9, 0 1px 2px ${PAP}e6; } - .irow .halo { position:absolute; left:0; top:0; opacity:0; color:${INK}; filter:blur(9px); } - .irule { position:absolute; left:50%; bottom:-7px; width:86%; height:2px; - margin-left:-43%; opacity:0; transform-origin:50% 50%; - background: linear-gradient(90deg, ${INK}00 0%, ${INK}8c 18%, ${INK}8c 82%, ${INK}00 100%); - box-shadow: 0 1px 7px ${PAP}8c; filter: blur(0.8px); } - .iwisp { position:absolute; left:50%; top:-16px; width:22px; height:28px; - margin-left:-11px; opacity:0; border:3px solid transparent; - border-top-color:${INK}8c; border-radius:50%; filter:blur(2px); }`; - const html = lineData - .map((L) => `
`) - .join("\n"); - const js = ` - // ---- body paradigm: INKRAIL (ink bleed-in / re-dissolve exits) ---- - const RAILI = ${J(lineData)}; - const IKLATE = ${(DUR - 0.84).toFixed(3)}; // late words bleed faster (resolve before clip end) - RAILI.forEach((L, li) => { - const line = document.getElementById(L.id); - const rule = document.createElement("div"); rule.className = "irule"; line.appendChild(rule); - L.words.forEach(([txt]) => { - const w = document.createElement("span"); w.className = "w"; - const halo = document.createElement("span"); halo.className = "halo"; halo.textContent = txt; - const ink = document.createElement("span"); ink.className = "ink"; ink.textContent = txt; - w.appendChild(halo); w.appendChild(ink); line.appendChild(w); - }); - gsap.set(line, { xPercent: -50, yPercent: -50 }); - tl.set(line, { opacity: 1 }, L.in); - L.words.forEach(([txt, st, em], wi) => { - const w = line.children[wi + 1]; // children[0] is the rule - const halo = w.children[0], ink = w.children[1]; - // BLEED IN: opacity snaps (2 frames); blur 12→0 + scale 1.25→1 carry the - // bleed (late words bleed faster so they fully resolve before clip end) - const late = st > IKLATE; - tl.fromTo(ink, { opacity: 0 }, { opacity: 1, duration: 0.083, ease: "none" }, st); - tl.fromTo(ink, { filter: "blur(12px)", scale: 1.25 }, - { filter: "blur(0px)", scale: 1, duration: late ? 0.4 : 0.6, ease: "power2.out", - transformOrigin: "50% 60%" }, st); - // the dark halo overshoots then tightens (the bloom motif, low amplitude) - tl.fromTo(halo, { opacity: em ? 0.55 : 0.5, scale: 1.5 }, - { scale: 1.04, opacity: em ? 0.3 : 0.25, duration: late ? 0.5 : 0.7, - ease: "power2.out", transformOrigin: "50% 60%" }, st); - // emphasis: a faint ink wisp curls off the word top (skipped near clip end) - if (em && st + 1.55 <= ${(DUR - 0.03).toFixed(3)}) { - const wsp = document.createElement("div"); wsp.className = "iwisp"; w.appendChild(wsp); - const dir = li % 2 === 0 ? 1 : -1; - tl.set(wsp, { opacity: 0.5, transformOrigin: "50% 50%" }, st + 0.55); - tl.fromTo(wsp, { y: 0, x: 0, rotation: 12 * dir, scaleY: 1 }, - { y: -38, x: 10 * dir, rotation: 92 * dir, scaleY: 1.55, - duration: 1.0, ease: "power1.out" }, st + 0.55); - tl.to(wsp, { opacity: 0, duration: 0.42, ease: "power1.in" }, st + 1.12); - } - }); - // ink-settling rule beneath the line - tl.set(rule, { opacity: 0.55 }, L.words[0][1] + 0.12); - tl.fromTo(rule, { scaleX: 0 }, { scaleX: 1, duration: 0.9, ease: "power2.out" }, - L.words[0][1] + 0.12); - // EXIT: re-dissolve — blur up + spread + fade + slight rise, ink dispersing - // (the closing lines persist — the final thought stays readable) - if (L.outT !== null) { - tl.to(line, { filter: "blur(9px)", scale: 1.13, opacity: 0, y: -8, - duration: L.outDur, ease: "power1.in", transformOrigin: "50% 50%" }, L.outT); - tl.set(line, { display: "none" }, L.outT + L.outDur + 0.02); - } - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` - // rows visible under the bloom yield while the drop blooms, restore after. - // Overlap guards: dim only after the line is IN with runway before its exit; - // restore only with clear runway (else the line exits dimmed — one owner). - RAILI.forEach((L) => { - const dimT = ${(heroIn + (b.yield.delay ?? 0.12)).toFixed(3)}; - if (L.in < dimT - 0.05 && (L.outT === null || L.outT > dimT + 0.35)) { - tl.to("#" + L.id, { opacity: ${b.yield.dim}, duration: 0.3, ease: "power1.out" }, dimT); - const resT = ${(heroIn + (b.yield.post ?? 1.07)).toFixed(3)}; - if (L.outT === null || resT + 0.33 < L.outT) - tl.to("#" + L.id, { opacity: 1, duration: 0.3, ease: "power1.out" }, resT); - } - });` - : "" -}`; - return { css, html, js }; -} - -// ---- ransom shared pieces: the cutout-chip recipes and the seeded paper-tear -// polygon are ONE paper stock used by both layers (ransomrail body chips in the -// fg, ransomnote letter chips in the bg) — emitted into each page separately -function ransomChipCss(ls) { - const p = dna.palette; - return ` - .ca { background:${p.paper || "#f5f1e4"}; color:${p.paperInk || "#17130d"}; font-family:'${dna.fonts.body}', sans-serif; letter-spacing:${ls}; } - .cb { background:${p.dark || "#141414"}; color:${p.darkInk || "#f7f5ef"}; font-family:'${dna.fonts.dark}', sans-serif; font-weight:800; } - .cc { background:${p.news || "#d8d3c5"}; color:${p.newsInk || "#262017"}; font-family:'${dna.fonts.news}', monospace; } - .cd { background:${p.accent || "#ffd23f"}; color:${p.accentInk || "#1c160c"}; font-family:'${dna.fonts.accent}', cursive; }`; -} -// seeded 12-vertex tear polygon — j() call order matches the demo exactly so -// identical seeds reproduce the demo's torn edges -const RANSOM_TEAR = `function tearPoly(r){ - const j = () => +(r()*5).toFixed(1); - const p = [[j(),j()],[33,j()],[66,j()],[100-j(),j()],[100-j(),33],[100-j(),66], - [100-j(),100-j()],[66,100-j()],[33,100-j()],[j(),100-j()],[j(),66],[j(),33]]; - return "polygon(" + p.map(q => q[0] + "% " + q[1] + "%").join(",") + ")"; - }`; - -function paradigmRansomrail() { - // RANSOMRAIL: kidnapper's collage — every transcript word is a cutout chip - // in one of 4 cycled recipes (paper/Anton, black/Inter-800, newsprint/ - // Special Elite, accent/Permanent Marker; emphasis words snap to the accent - // chip) PASTED along the bottom rail line with seeded crookedness, seeded - // ±px sizes and misaligned baselines — the paste is the apex slam motif at - // low amplitude (1f appear at scale 1.12 → power3.in crush → 2-frame contact - // squash → elastic settle). Emphasis = 1-frame RE-PASTE lift (shadow grows, - // rotation flips sign for good); exits = chips RIPPED off one by one with - // 1-frame paper-tear flashes under each; lines breathe through their hold; - // the whole railwrap yields while the apex letters slam behind the subject. - const b = dna.body; - const last = LINES.length - 1; - const lineData = LINES.map((L, li) => { - const n = L.words.length; - const stag = li === last ? 0.04 : 0.045; - const ripDur = li === last ? 0.12 : 0.14; - const lastSt = L.words[n - 1].start; - // rip cadence (demo): chips tear off just before the next line pastes — - // the rip tail overlaps the new line a beat (collage chaos, by design); - // a line whose last word just spoke waits lastWord+0.14 first - let ripStart = - li === last - ? Math.min(L.out - 0.04, DUR - 0.06 - ripDur - stag * (n - 1)) - : Math.max(lastSt + 0.14, LINES[li + 1].in - ripDur - stag * (n - 1) + 0.05); - ripStart = +Math.min(ripStart, DUR - 0.06 - ripDur - stag * (n - 1)).toFixed(3); - const words = L.words.map((w, wi) => { - const st = +w.start.toFixed(3); - const R = +Math.max(ripStart + stag * wi, st + 0.12).toFixed(3); - // re-paste lift: needs its own window before the chip's rip - let emphT = w.minor ? +Math.min(st + (b.emphDelay ?? 0.23), R - 0.27).toFixed(3) : 0; - if (emphT && emphT < st + 0.08) emphT = 0; - return [w.display, st, emphT, R, w.minor ? 1 : 0]; - }); - // hold life: gentle collage breathe on the whole line (demo cadence) - const bs = +(L.words[0].start + 0.08).toFixed(3); - const bd = +Math.min(1.8, ripStart - 0.03 - bs).toFixed(2); - return { id: "rr" + L.id, in: +L.in.toFixed(3), ripDur, words, bs, bd: bd >= 0.3 ? bd : 0 }; - }); - const css = ` - #rrailwrap { position:absolute; inset:0; } - .rline { position:absolute; left:${W / 2}px; top:${H - b.bottomPx}px; white-space:nowrap; } - .rline .w { display:inline-block; position:relative; margin:0 5px; } - .rflash { position:absolute; inset:-4px; background:${dna.palette.flash || "#fffdf2"}; opacity:0; z-index:0; } - .rmove { display:inline-block; position:relative; z-index:1; opacity:0; - filter: drop-shadow(0 5px 0 rgba(8,6,4,0.5)); } - .rchip { display:inline-block; line-height:1.05; padding:0.08em 0.16em 0.11em; - text-transform:${b.textTransform || "uppercase"}; } -${ransomChipCss(b.letterSpacing || "0.02em")}`; - const html = `
-${lineData.map((L) => `
`).join("\n")} -
`; - const js = ` - // ---- body paradigm: RANSOMRAIL (chips pasted crooked / ripped off with tear flashes) ---- - const RAILR = ${J(lineData)}; - const crnd = mulberry32(${b.seed || 3940}); - ${RANSOM_TEAR} - const HARDR = "drop-shadow(0 5px 0 rgba(8,6,4,0.5))"; - const LIFTR = "drop-shadow(0 14px 3px rgba(8,6,4,0.35))"; - const RECS = ["ca", "cb", "cc", "cd"]; - let recC = 0, recPrev = -1; // recipe cycle: emphasis snaps to the accent chip, - function nextRec(em) { // never two identical chips in a row - let rec = em ? 3 : recC % 4; - if (rec === recPrev) { recC++; rec = recC % 4; } - if (!em) recC++; - recPrev = rec; - return rec; - } - RAILR.forEach((L, li) => { - const line = document.getElementById(L.id); - gsap.set(line, { xPercent: -50, yPercent: -100 }); - L.words.forEach(([txt, st, emphT, R, em], wi) => { - const w = document.createElement("div"); w.className = "w"; - const fl = document.createElement("div"); fl.className = "rflash"; - fl.style.clipPath = tearPoly(crnd); - const mv = document.createElement("div"); mv.className = "rmove"; - const chip = document.createElement("div"); chip.className = "rchip " + RECS[nextRec(em)]; - chip.style.fontSize = (${b.fontPx} - 2 + Math.round(crnd() * 3) + (em ? 3 : 0)) + "px"; - chip.style.clipPath = tearPoly(crnd); - chip.textContent = txt; - mv.appendChild(chip); w.appendChild(fl); w.appendChild(mv); line.appendChild(w); - // seeded crookedness: rot sign alternates with line+word parity (demo), - // baseline shove dy leans the other way - const sgn = (li + wi) % 2 === 0 ? -1 : 1; - const rot = sgn * (2 + crnd() * 2.5); - const dy = -sgn * (1 + crnd() * 2); - // PASTE = apex slam motif at low amplitude - tl.set(mv, { opacity: 1, scale: 1.12, rotation: rot * 1.5, y: dy - 8 }, st); - tl.to(mv, { scale: 1, rotation: rot, y: dy, duration: 0.08, ease: "power3.in" }, st + 0.005); - tl.set(mv, { scaleX: 1.05, scaleY: 0.95 }, st + 0.09); - tl.to(mv, { scaleX: 1, scaleY: 1, duration: 0.22, ease: "elastic.out(1, 0.4)" }, st + 0.173); - // EMPHASIS = re-paste: 1-frame lift (shadow grows), rotation flips sign for good - if (emphT) { - tl.set(mv, { y: dy - 7, scale: 1.08, rotation: -rot, filter: LIFTR }, emphT); - tl.to(mv, { y: dy, scale: 1, duration: 0.09, ease: "power3.in" }, emphT + 0.083); - tl.set(mv, { filter: HARDR }, emphT + 0.175); - tl.set(mv, { scaleX: 1.04, scaleY: 0.96 }, emphT + 0.178); - tl.to(mv, { scaleX: 1, scaleY: 1, duration: 0.16, ease: "elastic.out(1, 0.4)" }, emphT + 0.262); - } - // EXIT = ripped off, paper-tear flash 1 frame under the chip - tl.set(fl, { opacity: 0.85 }, R); - tl.set(fl, { opacity: 0 }, R + 0.045); - tl.to(mv, { rotation: rot + (wi % 2 ? 16 : -17), y: dy - 30, opacity: 0, - duration: L.ripDur, ease: "power2.in" }, R); - }); - if (L.bd) tl.to(line, { keyframes: { scale: [1, 1.015, 1.005, 1.016, 1] }, - duration: L.bd, ease: "none" }, L.bs); - }); -${ - !HEROLESS && b.yield && !heroInline - ? ` // rail yields while the apex letters slam behind the subject (container - // opacity — never contests the per-chip channels) - tl.to("#rrailwrap", { opacity: ${b.yield.dim}, duration: 0.12 }, ${Math.max(0.05, heroIn - (b.yield.pre ?? 0.02)).toFixed(3)}); -${ - heroIn + (b.yield.post ?? 0.71) < DUR - 0.3 - ? ` tl.to("#rrailwrap", { opacity: 1, duration: 0.2 }, ${(heroIn + (b.yield.post ?? 0.71)).toFixed(3)});` - : "" -}` - : "" -}`; - return { css, html, js }; -} - -const PARADIGMS = { - rail: paradigmRail, - panel: paradigmPanel, - poem: paradigmPoem, - takeover: paradigmTakeover, - lastpage: paradigmLastpage, - flaprail: paradigmFlaprail, - ledboard: paradigmLedboard, - vhsrail: paradigmVhsrail, - hudrail: paradigmHudrail, - carbonstrip: paradigmCarbonstrip, - laserrail: paradigmLaserrail, - stormrail: paradigmStormrail, - holorail: paradigmHolorail, - planktonrail: paradigmPlanktonrail, - sheenrail: paradigmSheenrail, - scoperail: paradigmScoperail, - paperrail: paradigmPaperrail, - popuprail: paradigmPopuprail, - chalkrail: paradigmChalkrail, - markerrail: paradigmMarkerrail, - brushrail: paradigmBrushrail, - inkrail: paradigmInkrail, - ransomrail: paradigmRansomrail, -}; - -function setpieceCpslam() { - // CP-language EMBED climax: acid-yellow word slams in BEHIND the subject with - // REAL notch cuts (SVG mask = true transparency over footage), a chromatic - // split that settles to a PERMANENT registration error, seeded glitch ticks, - // and a glitch-out exit. The frame stays footage — the word is set dressing. - const h = dna.hero, - p = h.params || {}, - I = heroIn; - const YEL = dna.palette.body || "#FCEE0A", - CYN = "#00F0FF", - RED = "#FF003C"; - const srnd = (() => { - let a = p.seed || 2077; - return () => { - a |= 0; - a = (a + 0x6d2b79f5) | 0; - let t = Math.imul(a ^ (a >>> 15), 1 | a); - t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; - return ((t ^ (t >>> 14)) >>> 0) / 4294967296; - }; - })(); - const DISP = heroText.toUpperCase(), - hpx = HG.fontPx; - const halfW = HG.halfW || (DISP.length * 0.56 * hpx) / 2; - const BW = Math.round(halfW * 2 + 140), - BH = Math.round(hpx * 1.5); - const CX = BW - 80 > W ? W / 2 : Math.max(BW / 2 - 40, Math.min(W - BW / 2 + 40, HG.x)), - CY = HG.y; - // seeded diagonal cuts through the letter band (precision is not the point — - // the cuts read as stencil damage wherever they land) - const nN = Math.max(2, Math.floor(DISP.length / 2.2)); - const used = []; - while (used.length < nN) { - const i = Math.floor(srnd() * DISP.length); - if (!used.includes(i)) used.push(i); - } - const notches = used - .map((i, k) => { - const cx = BW / 2 - halfW + (i + 0.5) * 0.56 * hpx + (srnd() - 0.5) * 8; - const cy = BH / 2 + (k % 2 ? 0.24 : -0.27) * hpx + (srnd() - 0.5) * 10; - return ``; - }) - .join("\n "); - const lay = (id, fill) => - ``; - const css = ` - #cpband { position:absolute; left:0; top:-80px; width:100%; height:70px; opacity:0; - background: linear-gradient(180deg, rgba(0,240,255,0) 0%, rgba(0,240,255,0.4) 50%, rgba(0,240,255,0) 100%); } - #cps { position:absolute; left:${CX}px; top:${CY}px; width:0; height:0; opacity:0; } - #cpsW { position:absolute; left:0; top:0; transform:translate(-50%,-50%); - filter: drop-shadow(0 4px 18px rgba(0,0,0,0.5)); } - #cpkana { position:absolute; left:0; top:-${Math.round(hpx * 0.82)}px; transform:translate(-50%,-50%); - font-family:'Hiragino Sans','Hiragino Kaku Gothic ProN',sans-serif; font-weight:600; - font-size:20px; letter-spacing:0.5em; text-indent:0.5em; color:${YEL}; opacity:0; - white-space:nowrap; text-shadow: 0 2px 8px rgba(0,0,0,0.7); }`; - const html = `
-
- - - ${esc(DISP)} - ${notches} - - ${lay("cpC", CYN)} - ${lay("cpR", RED)} - ${lay("cpY", YEL)} - -
${esc(p.kana || "サイバーパンク")}
-
`; - // a climax is an EVENT: on long clips holding to clip-end turns it into - // wallpaper. Default hold ~2.6s after the slam; hero.exitAt / params.hold override. - const EX = theme.hero.exitAt ?? Math.min(heroOut - 0.2, I + (p.hold ?? 2.6)); - const js = ` - // ---- setpiece: CPSLAM (band charge -> crush slam -> permanent registration -> glitch-out) ---- - const I = ${I.toFixed(3)}; - const crnd = mulberry32(${p.seed || 2077}); - tl.set("#cpband", { opacity: 1 }, I - 0.35); - tl.fromTo("#cpband", { y: 0 }, { y: ${H + 160}, duration: 0.36, ease: "power1.in" }, I - 0.35); - tl.set("#cpband", { opacity: 0 }, I + 0.01); - // crush slam (weighted), chromatic layers split wide on impact - tl.set("#cps", { opacity: 1 }, I - 0.04); - tl.fromTo("#cpsW", { scale: 2.6, filter: "blur(9px) brightness(2.2) drop-shadow(0 4px 18px rgba(0,0,0,0.5))" }, - { scale: 1, filter: "blur(0px) brightness(1) drop-shadow(0 4px 18px rgba(0,0,0,0.5))", duration: 0.11, ease: "power4.in" }, I - 0.04); - tl.set("#cpsW", { scaleX: 1.09, scaleY: 0.93 }, I + 0.08); - tl.to("#cpsW", { scaleX: 1, scaleY: 1, duration: 0.46, ease: "elastic.out(1.05, 0.36)" }, I + 0.16); - // SVG children move via attr.transform ONLY (banned: gsap x/y component - // props on SVG children — getBBox parse path). Frame-quantized step chain - // replaces the 0.16s recoil tween (identical on screen at 24fps). - const RG = (dx, dy, at) => { tl.set("#cpC", { attr: { transform: "translate(" + dx + " " + dy + ")" } }, at); tl.set("#cpR", { attr: { transform: "translate(" + (-dx) + " " + (-dy) + ")" } }, at); }; - RG(9, 0, I - 0.04); - RG(6, 0, I + 0.02); RG(3, 0, I + 0.02 + F); RG(1, 0, I + 0.02 + 2 * F); RG(0, 0, I + 0.02 + 3 * F); - // ...then the print settles WRONG: permanent registration error (the look) - RG(2.5, -1, I + 0.3); - tl.fromTo("#cpkana", { opacity: 0 }, { opacity: 0.92, duration: 0.18 }, I + 0.22); - // living word: seeded glitch ticks (registration jolts / 1f slips) - let gt = I + 0.62; - while (gt < ${EX.toFixed(3)} - 0.25) { - if (crnd() < 0.55) { - RG(8, -1, gt); RG(2.5, -1, gt + F); - } else { - tl.set("#cps", { x: (crnd() - 0.5) * 10 }, gt); - tl.set("#cps", { x: 0 }, gt + F); - } - gt += 0.45 + crnd() * 0.6; - } - tl.to("#cpsW", { scale: 1.035, duration: 1.1, ease: "power1.inOut" }, I + 0.72); - // EXIT: glitch-out - const E = ${EX.toFixed(3)}; - tl.set("#cpkana", { opacity: 0 }, E); - RG(15, -1, E); - tl.set("#cps", { x: -7 }, E + F); - tl.set("#cps", { opacity: 0, display: "none" }, E + 2 * F);`; - return { css, html, js }; -} - -function setpieceSettle() { - const I = heroIn; - const E = theme.hero.exitAt ?? Math.min(heroOut, DUR - 0.12); - const ruleW = Math.round(2 * HG.halfW * 0.62); - const holdDur = Math.max(0.4, E - I - 0.85); - const css = ` - ${dna.plate.dim ? `#dimP { position:absolute; inset:0; opacity:0; background:#06080c; }` : ""} - #stl { position:absolute; left:${HG.x}px; top:${HG.y}px; transform:translate(-50%,-50%); } - #stl-w { font-family:'${dna.fonts.hero}', sans-serif; font-weight:700; font-size:${HG.fontPx}px; - line-height:1; letter-spacing:0.01em; white-space:nowrap; color:${dna.palette.body}; - text-shadow: 0 2px 18px rgba(0,0,0,0.5), 0 1px 4px rgba(0,0,0,0.35); opacity:0; } - #stl-rule { position:absolute; left:50%; bottom:-20px; transform:translateX(-50%); - width:0; height:3px; border-radius:2px; background:${dna.palette.accent}; - opacity:0.85; box-shadow: 0 1px 8px rgba(0,0,0,0.4); }`; - const html = ` ${dna.plate.dim ? `
` : ""} -
${heroDisplay.toUpperCase()}
`; - const js = ` - // ---- setpiece: SETTLE (quiet blur-settle + accent underline; restraint IS the style) ---- - const I = ${I.toFixed(3)}; -${ - dna.plate.dim - ? ` tl.fromTo("#dimP", { opacity: 0 }, { opacity: ${dna.plate.dim}, duration: 0.35, ease: "power2.in" }, I - 0.3); - tl.to("#dimP", { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(E + 0.02).toFixed(3)});` - : "" -} - // opacity lands in ~2 frames; the transform settles separately (no ghost ramp) - tl.fromTo("#stl-w", { opacity: 0 }, { opacity: 1, duration: 0.09, ease: "power1.out" }, I); - tl.fromTo("#stl-w", { y: 14, scale: 1.05, filter: "blur(9px)" }, - { y: 0, scale: 1, filter: "blur(0px)", duration: 0.45, ease: "power3.out" }, I); - tl.fromTo("#stl-rule", { width: 0 }, { width: ${ruleW}, duration: 0.35, ease: "expo.out" }, I + 0.28); - // hold life: one slow visible loom - tl.to("#stl", { scale: 1.018, duration: ${holdDur.toFixed(2)}, ease: "power1.inOut" }, I + 0.6); - // exit: soften and lift (asymmetric to the landing) - tl.to("#stl-rule", { width: 0, opacity: 0, duration: 0.2, ease: "power2.in" }, ${(E - 0.05).toFixed(3)}); - tl.to("#stl-w", { filter: "blur(5px)", duration: 0.22, ease: "power1.in" }, ${(E - 0.02).toFixed(3)}); - tl.to("#stl", { opacity: 0, y: -10, duration: 0.24, ease: "power2.in" }, ${E.toFixed(3)}); - tl.set("#stl", { display: "none" }, ${(E + 0.26).toFixed(3)});`; - return { css, html, js }; -} -function setpieceFlapboard() { - // SPLIT-FLAP DEPARTURES BOARD: floodlights swing on, the housing clacks down - // behind the subject, one giant flap tile per char flip-cycles seeded wrong - // glyphs then locks the real char left→right with clack rhythm; rule wipes, - // status ticker types on; one tile re-flutters during the hold; tiles flip - // to blank and the housing flips away. - const h = dna.hero, - p = h.params, - I = heroIn; - const N = heroText.length; - const gap = p.gap || 7; - const tileW = HG.tileW, - tileH = HG.tileH, - fpx = HG.fontPx; - const lockWin = p.lockWindow || 0.34; - const AIN = I - 0.15; - const lockEnd = I + lockWin; - const E = heroOut; - const headH = 34; - const boardH = 10 + headH + tileH + 18; - const boardW = HG.halfW * 2; - const ruleW = Math.round(boardW - 43); - const ruleY = Math.round(HG.y + boardH / 2 + 37); - const tagW = Math.round((p.tag || "").length * 19); - const flutterIdx = Math.min(N - 1, Math.floor(N * 0.6)); - const exit0 = E - ((N - 1) * 0.03 + 0.09); - const css = ` - #dimF { position:absolute; inset:0; opacity:0; background:#06080c; } - #scrimF { position:absolute; inset:0; opacity:0; - background: linear-gradient(180deg, rgba(5,7,11,0.72) 0%, rgba(5,7,11,0.3) 42%, - rgba(5,7,11,0) 68%); } - #glowF { position:absolute; inset:0; opacity:0; - background: radial-gradient(46% 38% at ${((HG.x / W) * 100).toFixed(1)}% ${((HG.y / H) * 100).toFixed(1)}%, rgba(255,196,110,0.5) 0%, - rgba(255,160,60,0.16) 55%, rgba(0,0,0,0) 78%); } - #persp { position:absolute; inset:0; perspective:950px; } - #board { position:absolute; left:${HG.x}px; top:${HG.y}px; opacity:0; transform-origin:50% 0%; - background: linear-gradient(180deg,#171B21 0%,#101319 100%); - border-radius:8px; border:1px solid #353C47; border-top:3px solid ${dna.palette.hot}; - padding:10px 20px 18px; - box-shadow: 0 18px 60px rgba(0,0,0,0.65), inset 0 1px 0 rgba(255,255,255,0.06); } - #bhead { display:flex; justify-content:space-between; align-items:baseline; gap:40px; - font-family:'${dna.fonts.tag}', sans-serif; font-weight:600; font-size:24px; - letter-spacing:4px; color:${dna.palette.hot}; opacity:0.9; padding:0 4px 8px; } - #bhead .r { color:#8A8F98; letter-spacing:3px; } - #slots { display:flex; gap:${gap}px; } - .atile { position:relative; width:${tileW}px; height:${tileH}px; perspective:620px; - border-radius:4px; background:#0A0D11; - box-shadow: inset 0 0 0 1px #1F242B, inset 0 5px 12px rgba(0,0,0,0.75); } - .aflap { position:absolute; inset:0; transform-origin:50% 0%; backface-visibility:hidden; - border-radius:4px; text-align:center; - background: linear-gradient(180deg,#343A43 0%,#272C34 48%,#1A1E25 52%,#242931 100%); - box-shadow: inset 0 0 0 1px rgba(0,0,0,0.55), inset 0 1px 0 rgba(255,255,255,0.08); - font-family:'${dna.fonts.hero}', sans-serif; font-size:${fpx}px; line-height:${tileH + 2}px; - color:${dna.palette.boardBone || dna.palette.body}; - text-shadow: 0 4px 14px rgba(0,0,0,0.55); } - .aflap::after { content:""; position:absolute; left:0; right:0; top:50%; height:2px; - margin-top:-1px; background:rgba(0,0,0,0.5); } - .ac { position:absolute; inset:0; } - .ac.wv { display:none; color:#C3C8D0; } - .ac.rl { visibility:hidden; } - #ruleF { position:absolute; left:${HG.x}px; top:${ruleY}px; width:${ruleW}px; height:3px; - margin-left:-${Math.round(ruleW / 2)}px; background:${dna.palette.hot}; opacity:0; transform-origin:50% 50%; - box-shadow: 0 0 12px ${dna.palette.hot}99; } - #tagwrapF { position:absolute; left:${HG.x}px; top:${ruleY + 14}px; transform:translateX(-50%); - overflow:hidden; white-space:nowrap; width:0; } - #tagF { font-family:'${dna.fonts.tag}', sans-serif; font-weight:600; font-size:27px; letter-spacing:7px; - color:${dna.palette.hot}; white-space:nowrap; text-shadow: 0 2px 8px rgba(0,0,0,0.7); }`; - const html = `
-
-
-
${esc(p.headerLeft || "★ DEPARTURES")}${esc(p.headerRight || "")}
-
-
-
-
- ${p.tag ? `
${esc(p.tag)}
` : ""}`; - const js = ` - // ---- setpiece: FLAPBOARD (housing clack → flip-cycle → lock left→right → board life) ---- - const I = ${I.toFixed(3)}, AIN = ${AIN.toFixed(3)}, LOCK0 = I, LSTEP = ${(lockWin / Math.max(1, N - 1)).toFixed(5)}; - const WORDB = ${J(heroText)}, BGLYPHS = ${J(p.glyphs || "ABCDEFGHIKLMNOPRSTUVXYZ0123456789")}; - const HOTB = ${J(dna.palette.hot)}, BONEB = ${J(dna.palette.boardBone || dna.palette.body)}; - const brnd = mulberry32(${p.seed || 8088}); - // scene reaction: floodlights swing onto the board - tl.fromTo("#dimF", { opacity: 0 }, { opacity: ${dna.plate.dim}, duration: 0.16, ease: "power2.in" }, AIN - 0.08); - tl.fromTo("#scrimF", { opacity: 0 }, { opacity: ${dna.plate.charge}, duration: 0.16, ease: "power2.in" }, AIN - 0.08); - tl.to("#dimF", { opacity: ${(dna.plate.dim * 0.59).toFixed(2)}, duration: 0.8, ease: "power2.out" }, ${(lockEnd - 0.23).toFixed(3)}); - tl.to("#scrimF", { opacity: ${(dna.plate.charge * 0.61).toFixed(2)}, duration: 0.8, ease: "power2.out" }, ${(lockEnd - 0.23).toFixed(3)}); - tl.to(["#dimF", "#scrimF"], { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(E - 0.39).toFixed(3)}); - // build the flap tiles (one per char; spaces are blank tiles) - const slots = document.getElementById("slots"); - const btiles = []; - for (let i = 0; i < WORDB.length; i++) { - const atile = document.createElement("div"); atile.className = "atile"; - if (WORDB[i] === " ") { - atile.style.width = Math.round(${tileW} * 0.45) + "px"; - slots.appendChild(atile); btiles.push(null); continue; - } - const flap = document.createElement("div"); flap.className = "aflap"; - const n = 3 + Math.floor(brnd() * 3); // 3-5 seeded wrong chars - const wrongs = []; - for (let k = 0; k < n; k++) { - const s = document.createElement("div"); s.className = "ac wv"; - s.textContent = BGLYPHS[Math.floor(brnd() * BGLYPHS.length)]; - flap.appendChild(s); wrongs.push(s); - } - const rl = document.createElement("div"); rl.className = "ac rl"; rl.textContent = WORDB[i]; - flap.appendChild(rl); - atile.appendChild(flap); slots.appendChild(atile); - btiles.push({ atile, flap, rl, wrongs, n }); - } - gsap.set("#board", { xPercent: -50, yPercent: -50 }); - // housing clacks down (the flap motif at housing scale) - tl.set("#board", { opacity: 1 }, AIN); - tl.fromTo("#board", { rotationX: -52 }, { rotationX: 0, duration: 0.13, ease: "power3.in" }, AIN); - tl.set("#board", { scaleX: 1.012, scaleY: 0.965 }, AIN + 0.13); - tl.to("#board", { scaleX: 1, scaleY: 1, duration: 0.28, ease: "elastic.out(1, 0.42)" }, AIN + 0.16); - // flip-cycle wrong chars, lock left→right with clack rhythm - btiles.forEach((T, i) => { - if (!T) return; - const Li = LOCK0 + i * LSTEP; - const Si = AIN + 0.035 + i * 0.008; - const cyc = (Li - Si) / T.n; - tl.set(T.wrongs[0], { display: "block" }, AIN); - tl.fromTo(T.flap, { rotationX: -85 }, { rotationX: 0, duration: cyc * 0.8, ease: "power1.in" }, Si); - for (let k = 1; k < T.n; k++) { - const c = Si + k * cyc; - tl.set(T.wrongs[k - 1], { display: "none" }, c); - tl.set(T.wrongs[k], { display: "block" }, c); - tl.fromTo(T.flap, { rotationX: -85 }, { rotationX: 0, duration: cyc * 0.8, ease: "power1.in" }, c); - } - // LOCK: real char drops in, hot flash, squash, elastic settle, cool to bone - tl.set(T.wrongs[T.n - 1], { display: "none" }, Li); - tl.set(T.rl, { visibility: "visible" }, Li); - tl.set(T.flap, { color: HOTB, filter: "brightness(2.1)" }, Li); - tl.fromTo(T.flap, { rotationX: -90 }, { rotationX: 0, duration: 0.075, ease: "power2.in" }, Li); - tl.set(T.atile, { scaleX: 1.05, scaleY: 0.92 }, Li + 0.075); - tl.to(T.atile, { scaleX: 1, scaleY: 1, duration: 0.3, ease: "elastic.out(1, 0.38)" }, Li + 0.1); - tl.to(T.flap, { color: BONEB, filter: "brightness(1)", duration: 0.45, ease: "power2.out" }, Li + 0.15); - }); - // clack rhythm: baked y-jitter on the housing across the lock window - tl.to("#board", { keyframes: { y: [0, 2, 0, 1.4, 0, 2, 0, 1.2, 0, 1.8, 0] }, - duration: ${(lockWin + 0.08).toFixed(2)}, ease: "none" }, LOCK0 - 0.01); - // lock-complete: the big clack (plate punch lands here) - tl.set("#board", { scaleX: 1.03, scaleY: 0.96 }, ${lockEnd.toFixed(3)}); - tl.to("#board", { scaleX: 1, scaleY: 1, duration: 0.42, ease: "elastic.out(1, 0.4)" }, ${(lockEnd + 0.03).toFixed(3)}); - tl.fromTo("#glowF", { opacity: 0 }, { opacity: 0.85, duration: 0.12, ease: "power2.out" }, ${lockEnd.toFixed(3)}); - tl.to("#glowF", { keyframes: { opacity: [0.85, 0.55, 0.7, 0.45, 0.6, 0.42, 0.5] }, - duration: ${Math.max(0.4, E - 0.49 - (lockEnd + 0.15)).toFixed(2)}, ease: "none" }, ${(lockEnd + 0.15).toFixed(3)}); - tl.fromTo("#ruleF", { scaleX: 0, opacity: 1 }, { scaleX: 1, duration: 0.3, ease: "expo.out" }, ${(lockEnd + 0.05).toFixed(3)}); -${p.tag ? ` tl.to("#tagwrapF", { width: ${tagW}, duration: 0.4, ease: "steps(16)" }, ${(lockEnd + 0.11).toFixed(3)});` : ""} - // hold life: loom + one mechanical re-flutter tic — boards do this - tl.to("#board", { scaleX: 1.022, scaleY: 1.022, duration: ${Math.max(0.4, Math.min(1.0, exit0 - lockEnd - 0.55)).toFixed(2)}, ease: "power1.inOut" }, ${(lockEnd + 0.5).toFixed(3)}); - const T6 = btiles[${flutterIdx}]; - if (T6 && ${(lockEnd + 1.0).toFixed(3)} < ${(exit0 - 0.2).toFixed(3)}) { - const ft = ${(lockEnd + 0.9).toFixed(3)}; - tl.set(T6.rl, { visibility: "hidden" }, ft); - tl.set(T6.wrongs[0], { display: "block" }, ft); - tl.fromTo(T6.flap, { rotationX: -70 }, { rotationX: 0, duration: 0.055, ease: "power1.in" }, ft); - tl.set(T6.wrongs[0], { display: "none" }, ft + 0.06); - tl.set(T6.rl, { visibility: "visible" }, ft + 0.06); - tl.fromTo(T6.flap, { rotationX: -80 }, { rotationX: 0, duration: 0.06, ease: "power2.in" }, ft + 0.06); - } - // exit: tiles flip to blank (0→90) cascading, housing flips away - tl.to("#glowF", { opacity: 0, duration: 0.3, ease: "power1.in" }, ${(E - 0.49).toFixed(3)}); - tl.to("#ruleF", { scaleX: 0, opacity: 0, duration: 0.12, ease: "power2.in" }, ${(E - 0.44).toFixed(3)}); -${p.tag ? ` tl.to("#tagwrapF", { width: 0, duration: 0.16, ease: "steps(8)" }, ${(E - 0.44).toFixed(3)});` : ""} - btiles.forEach((T, i) => { - if (!T) return; - tl.to(T.flap, { rotationX: 90, duration: 0.085, ease: "power2.in" }, ${exit0.toFixed(3)} + i * 0.03); - }); - tl.to("#board", { rotationX: -45, opacity: 0, duration: 0.13, ease: "power2.in" }, ${(E - 0.04).toFixed(3)}); - tl.set("#board", { display: "none" }, ${Math.min(E + 0.08, DUR - 0.015).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceLedwipe() { - // TRANSIT LED BOARD: cool scrim + dim charge the room, a departure-board - // panel EXPANDS upward (stepped paging motif), then the word lights - // column-by-column via a L→R illumination wipe (clipPath steps) inside a - // chasing LED-marquee border; PA "ding" = two brightness pulses; hold life = - // glow breathe + LED dropouts; exit pages the word up out of the panel and - // the panel collapses back down. - const h = dna.hero, - p = h.params, - I = heroIn; - const C = I + (p.wipeDur || 0.3); // wipe completes = contact - const E = heroOut; - const panelW = HG.panelW, - panelH = HG.panelH, - fpx = HG.fontPx; - const px = Math.round(HG.x - panelW / 2), - py = Math.round(HG.y - panelH / 2); - const spillW = panelW - 180, - spillH = Math.round(panelH * 1.9); - const exScroll = +(E - 0.72).toFixed(3); - const wipeSteps = Math.max(8, Math.round(heroText.length * 1.4)); - const A = dna.palette.accent, - HOT = dna.palette.hot, - GRN = dna.palette.green || "#36e57a"; - // marquee dot lattice scales with the panel; chase runs until the exit - const nTop = Math.max(10, Math.round(panelW / 45)); - const nSide = Math.max(2, Math.round((panelH - 19) / 52) - 1); - const kMax = Math.max(4, Math.floor((exScroll - (I - 0.01)) / 0.1)); - const css = ` - #scrimL { position:absolute; inset:0; opacity:0; - background: radial-gradient(120% 105% at 50% 40%, rgba(2,6,14,0) 30%, rgba(2,6,14,0.85) 100%); } - #dimL { position:absolute; inset:0; opacity:0; background:#020409; } - #spillL { position:absolute; left:${Math.round(HG.x - spillW / 2)}px; top:${Math.round(HG.y - spillH / 2)}px; - width:${spillW}px; height:${spillH}px; opacity:0; - background: radial-gradient(closest-side, ${A}4d, ${A}00 72%); } - #apxL { position:absolute; left:${px}px; top:${py}px; width:${panelW}px; height:${panelH}px; opacity:0; } - #panelL { position:absolute; inset:0; border-radius:8px; - background-color: rgba(8,8,11,0.93); - background-image: radial-gradient(${A}0e 1px, rgba(0,0,0,0) 1.4px); - background-size: 7px 7px; - border:2px solid ${A}4d; - box-shadow: 0 18px 50px rgba(0,0,0,0.55), inset 0 0 70px ${A}0d; } - .ldot { position:absolute; width:7px; height:7px; border-radius:50%; - background:${A}; opacity:0.18; box-shadow:0 0 6px ${A}8c; } - #ptagL, #gtagL { position:absolute; top:16px; font-family:'${dna.fonts.tag}', monospace; font-size:22px; - letter-spacing:0.18em; opacity:0; white-space:nowrap; } - #ptagL { left:28px; color:${A}9e; } - #gtagL { right:28px; color:${GRN}; text-shadow:0 0 8px ${GRN}80; } - #panwinL { position:absolute; left:24px; right:24px; top:44px; bottom:18px; overflow:hidden; } - #scrollL { position:absolute; inset:0; } - #ghostL, #awordL { position:absolute; left:50%; top:50%; - font-family:'${dna.fonts.hero}', monospace; font-size:${fpx}px; line-height:1; - letter-spacing:0.05em; white-space:nowrap; } - #ghostL { color:${A}; opacity:0; } - #awordL { color:${A}; opacity:0; - text-shadow: 0 0 18px ${A}8c, 0 0 2px ${HOT}cc; }`; - const html = `
-
-
-
${esc(p.headerLeft || "NOW ARRIVING ▸ 19:42")}
-
${esc(p.headerRight || "GATE A4")}
-
-
-
${esc(heroText)}
-
${esc(heroText)}
-
-
-
-
`; - const js = ` - // ---- setpiece: LEDWIPE (panel expands → L→R illumination wipe → PA ding → page-up exit) ---- - const I = ${I.toFixed(3)}, C = ${C.toFixed(3)}; - gsap.set("#panelL", { transformOrigin: "50% 100%", scaleY: 0 }); - gsap.set(["#ghostL", "#awordL"], { xPercent: -50, yPercent: -50 }); - - // ===== scene charge / release ===== - tl.fromTo("#scrimL", { opacity: 0 }, { opacity: ${dna.plate.charge}, duration: 0.30, ease: "power2.in" }, I - 0.31); - tl.fromTo("#dimL", { opacity: 0 }, { opacity: ${dna.plate.dim}, duration: 0.25, ease: "power2.in" }, I - 0.25); - tl.fromTo("#spillL", { opacity: 0 }, { opacity: 0.45, duration: 0.40, ease: "power2.out" }, I + 0.05); - tl.to("#spillL", { opacity: 0, duration: 0.35, ease: "power1.in" }, ${(E - 0.54).toFixed(3)}); - tl.to(["#scrimL", "#dimL"], { opacity: 0, duration: 0.40, ease: "power1.in" }, ${(E - 0.44).toFixed(3)}); - - // ===== board expands UPWARD (stepped paging motif, apex scale) ===== - tl.set("#apxL", { opacity: 1 }, I - 0.26); - tl.to("#panelL", { scaleY: 1, duration: 0.20, ease: "steps(6)" }, I - 0.25); - tl.set("#panelL", { borderColor: "${HOT}f2" }, I - 0.05); - tl.set("#panelL", { borderColor: "${A}4d" }, I + 0.07); - - // power-on boot: unlit LED cells + header tags flicker alive - tl.set("#ghostL", { opacity: 0.06 }, I - 0.045); - tl.set("#ghostL", { opacity: 0.13 }, I - 0.003); - tl.set(["#ptagL", "#gtagL"], { opacity: 0.4 }, I - 0.045); - tl.set(["#ptagL", "#gtagL"], { opacity: 0.9 }, I - 0.003); - - // ===== APEX: L→R illumination wipe — LEDs light column by column ===== - tl.set("#awordL", { opacity: 1, color: "${HOT}" }, I); - tl.fromTo("#awordL", { clipPath: "inset(0% 100% 0% 0%)" }, - { clipPath: "inset(0% 0% 0% 0%)", duration: ${(p.wipeDur || 0.3).toFixed(2)}, ease: "steps(${wipeSteps})" }, I); - tl.set("#awordL", { clipPath: "none" }, C + 0.05); // free the glow halo - tl.to("#awordL", { color: "${A}", duration: 0.60, ease: "power1.in" }, C + 0.05); // hot → amber cool - - // contact: squash held 2 frames, elastic settle (board cell flexes) - tl.set("#scrollL", { scaleX: 1.06, scaleY: 0.94 }, C); - tl.to("#scrollL", { scaleX: 1, scaleY: 1, duration: 0.42, ease: "elastic.out(1, 0.4)" }, C + 0.083); - - // PA "ding" = two quick brightness pulses - tl.set("#panwinL", { filter: "brightness(1.7)" }, C + 0.02); - tl.set("#panwinL", { filter: "brightness(1)" }, C + 0.10); - tl.set("#panwinL", { filter: "brightness(1.45)" }, C + 0.18); - tl.set("#panwinL", { filter: "brightness(1)" }, C + 0.26); -${ - C + 0.99 < exScroll - ? ` - // hold life: glow breathes + LED dropouts - tl.to("#awordL", { textShadow: "0 0 30px ${A}d9, 0 0 4px ${HOT}f2", - duration: 0.45, ease: "sine.inOut" }, C + 0.54); - tl.to("#awordL", { textShadow: "0 0 18px ${A}8c, 0 0 2px ${HOT}cc", - duration: 0.45, ease: "sine.inOut" }, C + 0.99); - tl.set("#awordL", { opacity: 0.82 }, C + 0.61); tl.set("#awordL", { opacity: 1 }, C + 0.652); - tl.set("#awordL", { opacity: 0.90 }, C + 1.04); tl.set("#awordL", { opacity: 1 }, C + 1.082); - tl.set("#ptagL", { opacity: 0.45 }, C + 0.41); tl.set("#ptagL", { opacity: 0.9 }, C + 0.452);` - : "" -} - - // ===== exit: word pages up out of the window, board collapses ===== - tl.to("#scrollL", { y: ${-(panelH - 62)}, duration: 0.22, ease: "steps(6)" }, ${exScroll.toFixed(3)}); - tl.set(["#ptagL", "#gtagL"], { opacity: 0 }, ${(exScroll + 0.2).toFixed(3)}); - tl.to("#panelL", { scaleY: 0, duration: 0.18, ease: "steps(6)" }, ${(exScroll + 0.24).toFixed(3)}); - tl.set("#apxL", { opacity: 0 }, ${(exScroll + 0.44).toFixed(3)}); - - // ===== chasing LED marquee border (8-phase set chain) ===== - const panelL = document.getElementById("panelL"); - const PW = ${panelW}, PH = ${panelH}, groups = [[], [], [], [], [], [], [], []]; - const pts = []; - for (let i = 0; i < ${nTop}; i++) pts.push([10 + i * (PW - 27) / ${nTop - 1}, 6]); // top L→R - for (let j = 0; j < ${nSide}; j++) pts.push([PW - 13, 6 + (j + 1) * (PH - 19) / ${nSide + 1}]); // right ↓ - for (let i = ${nTop - 1}; i >= 0; i--) pts.push([10 + i * (PW - 27) / ${nTop - 1}, PH - 13]); // bottom R→L - for (let j = ${nSide - 1}; j >= 0; j--) pts.push([6, 6 + (j + 1) * (PH - 19) / ${nSide + 1}]); // left ↑ - pts.forEach(([x, y], i) => { - const d = document.createElement("div"); - d.className = "ldot"; d.style.left = Math.round(x) + "px"; d.style.top = Math.round(y) + "px"; - d.style.opacity = "0"; panelL.appendChild(d); - groups[i % 8].push(d); - }); - groups.forEach((g) => tl.set(g, { opacity: 0.18 }, I - 0.02)); - for (let k = 0; k <= ${kMax}; k++) { - const t = I - 0.01 + k * 0.1; - for (let q = 0; q < 8; q++) { - const lit = (((q - k) % 8) + 8) % 8 < 2; - tl.set(groups[q], { opacity: lit ? 0.95 : 0.18 }, t); - } - }`; - return { css, html, js }; -} - -function setpieceVhsosd() { - // REC FREEZE: the word slams in as a huge camcorder OSD readout BEHIND the - // subject. Permanent lens vignette = the camcorder look; a backlight-comp - // scrim kills the bright sky behind the word. Arrival = tracking-sliced - // crush (3 horizontal clip-path bands sheared + blurred, power4.in) that - // SNAPS into register on the contact frame, squash → elastic settle; heavy - // red/cyan misregistration cools from ±arrival px to ±settled px and keeps - // BREATHING through the hold; tape-weave y jitter + slow loom; auto-iris - // pump (white wash up, dark dip, settle). Exit = REWIND streak left with a - // flat-white echo copy. - const h = dna.hero, - p = h.params, - I = heroIn; - const C = I + (p.crush ?? 0.1); // contact: slices snap into register - const X = theme.hero.exitAt ?? Math.min(heroOut, I + (p.hold ?? 1.69)); // REWIND - const clips = p.bandClips || [ - [0, 64], - [36, 30], - [70, 0], - ]; - const shear = p.bandShear || [-46, 40, -34]; - const mi = p.misregIn ?? 11, // arrival misregistration (px) - m = p.misreg ?? 3; // settled misregistration (px) - const RED = dna.palette.red || "#FF2E2E", - CYN = dna.palette.cyan || "#3FE8E8"; - const yPct = ((HG.y / H) * 100).toFixed(0); - const css = ` - #vig { position:absolute; inset:0; opacity:0; - background: radial-gradient(115% 100% at 50% 46%, rgba(0,0,0,0) 52%, rgba(0,0,0,${p.vignette ?? 0.34}) 100%); } - #vscrim { position:absolute; inset:0; opacity:0; - background: radial-gradient(58% 44% at 50% ${yPct}%, rgba(0,0,0,0.62) 0%, rgba(0,0,0,0.34) 55%, rgba(0,0,0,0) 78%); } - #iris { position:absolute; inset:0; opacity:0; background:#ffffff; } - #irisd { position:absolute; inset:0; opacity:0; background:#000000; } - #osdw, #oecho { position:absolute; left:${HG.x}px; top:${HG.y}px; opacity:0; } - .aw { position:absolute; left:0; top:0; white-space:nowrap; - font-family:'${dna.fonts.hero}', monospace; font-size:${HG.fontPx}px; line-height:1; - letter-spacing:0.02em; } - #mr { color:${RED}; opacity:0.55; } - #mc { color:${CYN}; opacity:0.55; } - .wb2 { color:${dna.palette.body}; text-shadow: 0 4px 24px rgba(0,0,0,0.6), 0 1px 4px rgba(0,0,0,0.45); } - ${clips.map((c, i) => `#vb${i + 1} { clip-path: inset(${c[0]}% 0 ${c[1]}% 0); }`).join("\n ")} - #oe { color:#ffffff; opacity:0.4; text-shadow:none; }`; - const html = `
-
-
-
-
${esc(heroText)}
-
${esc(heroText)}
- ${clips.map((_, i) => `
${esc(heroText)}
`).join("\n ")} -
-
-
${esc(heroText)}
-
-
`; - const bandIds = clips.map((_, i) => "#vb" + (i + 1)); - // hold life windows (clamped inside [contact, exit] so nothing fights the rewind) - const weaveTs = []; - const wv = p.weave || [-2, 1, -1, 2, -1, 1, -2, 0]; - for (let k = 0; k < wv.length; k++) { - const t = C + 0.19 + k * 0.17; - if (t < X - 0.05) weaveTs.push([+t.toFixed(3), wv[k]]); - } - const brDur = Math.min(1.3, X - (C + 0.21) - 0.05); - const loomDur = Math.min(0.92, X - (C + 0.64) - 0.03); - const js = ` - // ---- setpiece: VHSOSD (tracking-sliced OSD slam → misreg breathe → REWIND exit) ---- - const I = ${I.toFixed(3)}, C = ${C.toFixed(3)}, X = ${X.toFixed(3)}; - gsap.set(${J(["#mr", "#mc", ...bandIds, "#oe"])}, { xPercent:-50, yPercent:-50 }); - gsap.set("#weave", { x: 0, y: 0 }); - - // camcorder lens vignette — present the whole clip - tl.set("#vig", { opacity: 1 }, 0.02); - - // backlight-compensation scrim behind the word (the sky is bright up there) - tl.fromTo("#vscrim", { opacity: 0 }, { opacity: ${dna.plate.charge}, duration: 0.20, ease: "power2.in" }, I - 0.04); - tl.to("#vscrim", { opacity: ${(dna.plate.charge * 0.69).toFixed(2)}, duration: 0.8, ease: "power2.out" }, C + 0.35); - tl.to("#vscrim", { opacity: 0, duration: 0.30, ease: "power1.in" }, X); - - // ===== ARRIVAL: tracking-sliced crush, opacity 1 instantly ===== - tl.set("#osdw", { opacity: 1 }, I); - tl.fromTo("#osdw", { scale: 2.9 }, { scale: 1, duration: C - I, ease: "power4.in" }, I); - const SHEAR = ${J(shear)}; - ${J(bandIds)}.forEach((sel, i) => { - tl.fromTo(sel, { x: SHEAR[i], filter: "blur(10px) brightness(2.6)" }, - { x: Math.round(SHEAR[i] * 0.3), filter: "blur(1px) brightness(1.7)", duration: C - I, ease: "power4.in" }, I); - }); - tl.set("#mr", { x: -${mi} }, I); - tl.set("#mc", { x: ${mi} }, I); - - // SNAP into register on the contact frame + squash, elastic settle - tl.set(${J(bandIds)}, { x: 0, filter: "brightness(1.85)" }, C); - tl.set("#mr", { x: -${m} }, C); - tl.set("#mc", { x: ${m} }, C); - tl.set("#osdw", { scaleX: 1.10, scaleY: 0.90 }, C); - tl.to("#osdw", { scaleX: 1, scaleY: 1, duration: 0.50, ease: "elastic.out(1, 0.36)" }, C + 0.083); - tl.to(${J(bandIds)}, { filter: "brightness(1)", duration: 0.45, ease: "power2.out" }, C + 0.10); - - // AUTO-IRIS PUMP: wash up, then a dark dip, once - tl.to("#iris", { opacity: 0.20, duration: 0.12, ease: "sine.out" }, C + 0.04); - tl.to("#iris", { opacity: 0, duration: 0.33, ease: "power1.in" }, C + 0.16); - tl.to("#irisd", { opacity: ${dna.plate.dim}, duration: 0.28, ease: "sine.out" }, C + 0.55); - tl.to("#irisd", { opacity: 0, duration: 0.40, ease: "sine.in" }, C + 0.85); -${ - brDur > 0.3 - ? ` - // ===== HOLD LIFE: misregistration breathes, tape weave, slow loom ===== - tl.to("#mr", { keyframes: { x: [-${m}, -${(m * 1.53).toFixed(1)}, -${(m * 1.07).toFixed(1)}, -${(m * 1.67).toFixed(1)}, -${(m * 1.17).toFixed(1)}] }, duration: ${brDur.toFixed(2)}, ease: "none" }, C + 0.21); - tl.to("#mc", { keyframes: { x: [${m}, ${(m * 1.53).toFixed(1)}, ${(m * 1.07).toFixed(1)}, ${(m * 1.67).toFixed(1)}, ${(m * 1.17).toFixed(1)}] }, duration: ${brDur.toFixed(2)}, ease: "none" }, C + 0.21); - ${J(weaveTs)}.forEach(([t, v]) => tl.set("#weave", { y: v }, t));` - : "" -} -${ - loomDur > 0.3 - ? ` tl.to("#osdw", { keyframes: { scale: [1, 1.03, 1.015, 1.028] }, duration: ${loomDur.toFixed(2)}, ease: "none" }, C + 0.64);` - : "" -} - - // ===== EXIT: REWIND — streak left with echo copy ===== - tl.to("#osdw", { x: -190, scaleX: 1.3, opacity: 0, duration: 0.13, ease: "power2.in" }, X); - tl.set("#oecho", { opacity: 1 }, X); - tl.fromTo("#oe", { x: 0, opacity: 0.4 }, { x: -95, opacity: 0, duration: 0.18, ease: "power2.in" }, X + 0.01); - tl.set(["#osdw","#oecho"], { display: "none" }, X + 0.25);`; - return { css, html, js }; -} - -function setpieceBossintro() { - // BOSS INTRO (bg): the room darkens behind a CRT edge glow (cyan base wash, - // pulses on the last emphasis before the boss and spills magenta on the - // strobe + the final word), WARNING blinks 2x above the word rect, then - // ~COLS×ROWS seeded pixel blocks fall steps(3) into a tight matrix grid - // covering the word rect (1-frame white land tick each — the coin-blip motif - // at block scale), and the word flashes ON (instant, oversized, quantized - // crush → 2-frame squash → elastic settle) with chromatic ghost layers and a - // 3-frame palette strobe. Hold: quantized breathe + CRT glow cycle + baked - // block shimmer blinks. Exit: per-letter checkerboard dissolve; blocks drop - // away quantized. FG furniture (rides rail.html via fg parts): letterbox - // bars slam in with a 1-frame overshoot and a HI-SCORE odometer rolls - // top-right through the hold. - const h = dna.hero, - p = h.params || {}, - I = heroIn; - const CY = dna.palette.accent, - MG = dna.palette.magenta || "#FF2E88", - YL = dna.palette.yellow || "#FFE600"; - const FLASH = I + (p.flashDelay ?? 0.14); - const EX = theme.hero.exitAt ?? Math.min(heroOut - 0.2, I + (p.hold ?? 1.24)); - const ROWS = p.rows || 4; - const CWp = Math.round(HG.fontPx * 0.7), - CHp = Math.round(HG.fontPx * 0.5); - const COLS = Math.ceil((HG.halfW * 2 + 100) / CWp); - const X0 = Math.round(HG.x - (COLS * CWp) / 2), - Y0 = Math.round(HG.y - (ROWS * CHp) / 2); - // scene-reaction pulses: the edge glow pre-echoes the boss on the last - // emphasis word before the takeover; magenta answers on the final word - const minorsBefore = LINES.flatMap((L) => L.words).filter((w) => w.minor && w.start < I - 0.3); - const pulseT = minorsBefore.length ? minorsBefore[minorsBefore.length - 1].start : null; - const endPulse = - LASTWORD.start + 0.384 < DUR - 0.02 && LASTWORD.start > EX + 0.4 ? LASTWORD.start : null; - const lb = p.letterbox || 44; - const css = ` - #bdim { position:absolute; inset:0; opacity:0; - background:linear-gradient(180deg, rgba(2,3,12,0.66) 0%, rgba(2,3,12,0.40) 55%, rgba(2,3,12,0.30) 100%); } - #edgeC { position:absolute; inset:0; opacity:0; box-shadow: inset 0 0 130px ${CY}4d; } - #edgeM { position:absolute; inset:0; opacity:0; box-shadow: inset 0 0 130px ${MG}52; } - #blocks{ position:absolute; inset:0; } - .blk { position:absolute; opacity:0; } - #bossWord { position:absolute; left:${HG.x}px; top:${HG.y}px; opacity:0; } - .bw { position:absolute; left:0; top:0; white-space:nowrap; - font-family:'${dna.fonts.hero}', monospace; font-size:${HG.fontPx}px; line-height:1; } - #bwC { color:${CY}; opacity:0; } - #bwM { color:${MG}; opacity:0; } - #bwMain{ color:#ffffff; - text-shadow:0 6px 0 rgba(0,0,0,0.6), 0 0 16px rgba(0,0,0,0.9), 0 0 5px rgba(0,0,0,0.85); } - #bwMain .bl { display:inline-block; } - #warning { position:absolute; left:${HG.x}px; top:${Math.round(HG.y - HG.fontPx * 1.43)}px; opacity:0; - font-family:'${dna.fonts.tag}', monospace; font-size:26px; letter-spacing:0.4em; - color:${MG}; - text-shadow:0 0 14px rgba(0,0,0,0.95), 0 0 6px rgba(0,0,0,0.9), 0 4px 0 rgba(0,0,0,0.8); }`; - const html = `
-
-
-
-
-
${esc(heroText)}
-
${esc(heroText)}
-
-
-
${esc(p.tag || "WARNING")}
`; - const js = ` - // ---- setpiece: BOSSINTRO (dim + WARNING -> pixel-block assembly -> strobe flash) ---- - const I = ${I.toFixed(3)}, FLASH = ${FLASH.toFixed(3)}, OUT = ${EX.toFixed(3)}; - const CYc = ${J(CY)}, MGc = ${J(MG)}, YLc = ${J(YL)}, WHc = "#ffffff"; - const brnd = mulberry32(${p.seed || 13013}); - - // ===== scene reaction: CRT edge glow lives behind the subject ===== - tl.set("#edgeC", { opacity: 0.28 }, 0.05); -${ - pulseT != null - ? ` // pulse on the last emphasis before the boss - tl.set("#edgeC", { opacity: 0.62 }, ${pulseT.toFixed(3)}); - tl.set("#edgeC", { opacity: 0.28 }, ${(pulseT + 0.084).toFixed(3)});` - : "" -} - // boss dim: room darkens for the boss intro (helps a bright sky too) - tl.to("#bdim", { opacity: ${dna.plate.dim ?? 0.58}, duration: 0.12, ease: "power2.out" }, I - 0.15); - tl.set("#edgeC", { opacity: 0.8 }, FLASH); - tl.to("#edgeC", { opacity: 0.34, duration: 0.6, ease: "power2.out" }, FLASH + 0.08); - tl.set("#edgeM", { opacity: 0.5 }, FLASH + 0.084); // magenta strobe spill - tl.to("#edgeM", { opacity: 0, duration: 0.25, ease: "power1.out" }, FLASH + 0.126); - tl.to("#bdim", { opacity: 0, duration: 0.35, ease: "power1.inOut" }, OUT + 0.10); -${ - endPulse != null - ? ` // magenta answers on the final word - tl.set("#edgeM", { opacity: 0.55 }, ${endPulse.toFixed(3)}); - tl.to("#edgeM", { opacity: 0, duration: 0.3, ease: "power1.out" }, ${(endPulse + 0.084).toFixed(3)});` - : "" -} - - // ===== WARNING blinks 2x above the word ===== - tl.set("#warning", { opacity: 1 }, I - 0.135); - tl.set("#warning", { opacity: 0 }, I - 0.05); - tl.set("#warning", { opacity: 1 }, I + 0.035); - tl.set("#warning", { opacity: 0 }, I + 0.12); - gsap.set("#warning", { xPercent: -50, yPercent: -50 }); - - // ===== pixel-block boss assembly: blocks fall steps(3) into a tight grid ===== - const blocksEl = document.getElementById("blocks"); - const X0 = ${X0}, Y0 = ${Y0}, COLS = ${COLS}, ROWS = ${ROWS}, CW = ${CWp}, CH = ${CHp}; - for (let c = 0; c < COLS; c++) { - for (let r = 0; r < ROWS; r++) { - const b = document.createElement("div"); - b.className = "blk"; blocksEl.appendChild(b); - const s = 8 + Math.round(brnd() * 6); // 8–14px - const jx = Math.round((brnd() - 0.5) * 6), jy = Math.round((brnd() - 0.5) * 6); - const px = brnd(); - const col = px < 0.4 ? CYc : px < 0.78 ? MGc : px < 0.93 ? YLc : WHc; - gsap.set(b, { width: s, height: s, - left: X0 + c * CW + (CW - s) / 2 + jx, - top: Y0 + r * CH + (CH - s) / 2 + jy, - backgroundColor: col }); - const start = Math.min(I - 0.15 + c * 0.010 + brnd() * 0.04, FLASH - 0.10); - let dur = 0.12 + brnd() * 0.06; - if (start + dur > FLASH - 0.02) dur = FLASH - 0.02 - start; - const fall = 240 + brnd() * 260; - tl.set(b, { opacity: 0.9, y: -fall }, start); - tl.to(b, { y: 0, duration: dur, ease: "steps(3)" }, start); - // 1-frame white land tick (the coin-blip motif at block scale) - const land = start + dur; - tl.set(b, { backgroundColor: WHc }, land); - tl.set(b, { backgroundColor: col, opacity: 0.85 }, land + 0.042); - // hold shimmer: baked blink sets (no infinite repeats) - const t1 = FLASH + 0.11 + brnd() * 0.45, t2 = FLASH + 0.61 + brnd() * 0.4; - if (t1 + 0.083 < OUT) { tl.set(b, { opacity: 0.5 }, t1); tl.set(b, { opacity: 0.85 }, t1 + 0.083); } - if (t2 + 0.083 < OUT) { tl.set(b, { opacity: 0.55 }, t2); tl.set(b, { opacity: 0.85 }, t2 + 0.083); } - // exit: blocks drop off, quantized - const tE = Math.min(OUT + brnd() * 0.15, ${(DUR - 0.32).toFixed(2)}); - tl.to(b, { y: 220 + brnd() * 140, opacity: 0, duration: 0.2 + brnd() * 0.1, - ease: "steps(3)" }, tE); - } - } - - // ===== the word flashes ON over the block grid ===== - const main = document.getElementById("bwMain"); - const letters = []; - ${J(heroText)}.split("").forEach((ch) => { - const s = document.createElement("span"); - s.className = "bl"; s.textContent = ch === " " ? "\\u00a0" : ch; - main.appendChild(s); letters.push(s); - }); - gsap.set("#bwC", { xPercent: -50, yPercent: -50, x: -4 }); - gsap.set("#bwM", { xPercent: -50, yPercent: -50, x: 4 }); - gsap.set("#bwMain",{ xPercent: -50, yPercent: -50 }); - gsap.set("#bossWord", { transformOrigin: "50% 50%" }); - - // arrival: instant-on at full opacity, quantized crush, 2-frame squash, elastic settle - tl.set("#bossWord", { opacity: 1, scale: 1.15 }, FLASH); - tl.set(["#bwC", "#bwM"], { opacity: 0.85 }, FLASH); - tl.to("#bossWord", { scale: 1, duration: 0.1, ease: "steps(3)" }, FLASH); - tl.set("#bossWord", { scaleX: 1.07, scaleY: 0.92 }, FLASH + 0.1); - tl.to("#bossWord", { scaleX: 1, scaleY: 1, duration: 0.3, - ease: "elastic.out(1, 0.38)" }, FLASH + 0.142); - // 3-frame palette strobe (white -> cyan -> magenta -> white) - tl.set(main, { color: CYc }, FLASH + 0.042); - tl.set(main, { color: MGc }, FLASH + 0.084); - tl.set(main, { color: WHc }, FLASH + 0.126); - // hold life: quantized breathe + CRT glow cycle (emitted only with runway) - if (FLASH + 0.61 < OUT) { - tl.to("#bossWord", { scale: 1.016, duration: 0.4, ease: "sine.inOut", - repeat: 1, yoyo: true }, FLASH + 0.61); - } - const HALO = ", 0 6px 0 rgba(0,0,0,0.6), 0 0 16px rgba(0,0,0,0.9), 0 0 5px rgba(0,0,0,0.85)"; - [[0.2, CYc], [0.5, MGc], [0.8, CYc]].forEach(([dt, gc]) => { - if (FLASH + dt < OUT) tl.set(main, { textShadow: "0 0 22px " + gc + "d9" + HALO }, FLASH + dt); - }); - - // exit: checkerboard dissolve — letters vanish in 2 alternating set passes - letters.forEach((s, i) => { - tl.set(s, { opacity: 0 }, i % 2 === 0 ? OUT : OUT + 0.083); - }); - tl.set(["#bwC", "#bwM"], { opacity: 0 }, OUT + 0.042); - tl.set("#bossWord", { opacity: 0, display: "none" }, OUT + 0.17);`; - // fg furniture: letterbox bars + HI-SCORE odometer ride the fg alpha layer - // (in FRONT of the subject — the cabinet frames the player) - const fgCss = ` - #lbTop { position:absolute; left:0; top:-${lb}px; width:${W}px; height:${lb}px; background:#000; z-index:14; } - #lbBot { position:absolute; left:0; bottom:-${lb}px; width:${W}px; height:${lb}px; background:#000; z-index:14; } - #hi { position:absolute; right:36px; top:${lb + 18}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.tag}', monospace; font-size:18px; z-index:15; - text-shadow:0 3px 0 rgba(0,0,0,0.75), 0 0 10px rgba(0,0,0,0.6); } - #hi .lab { color:${CY}; margin-right:0.5em; } - #hi #hsv { color:${YL}; }`; - const fgHtml = `
-
-
HI-SCORE0000000
`; - const fgJs = ` - // ---- bossintro furniture (fg): letterbox slam + HI-SCORE odometer ---- - { - const BI = ${I.toFixed(3)}, BF = ${FLASH.toFixed(3)}, BO = ${EX.toFixed(3)}; - const hrnd = mulberry32(${(p.seed || 13013) + 7}); - // letterbox bars slam in (quantized), 1-frame overshoot, retract after - tl.to("#lbTop", { y: ${lb}, duration: 0.12, ease: "steps(3)" }, BI - 0.15); - tl.to("#lbBot", { y: -${lb}, duration: 0.12, ease: "steps(3)" }, BI - 0.15); - tl.set("#lbTop", { y: ${lb + 4} }, BI - 0.02); tl.set("#lbTop", { y: ${lb} }, BI + 0.022); - tl.set("#lbBot", { y: -${lb + 4} }, BI - 0.02); tl.set("#lbBot", { y: -${lb} }, BI + 0.022); - tl.to("#lbTop", { y: 0, duration: 0.15, ease: "steps(3)" }, BO + 0.13); - tl.to("#lbBot", { y: 0, duration: 0.15, ease: "steps(3)" }, BO + 0.13); - // HI-SCORE counter odometer-rolls during the hold - const hsv = document.getElementById("hsv"); - tl.set("#hi", { opacity: 1 }, BF + 0.03); - tl.fromTo("#hi", { scale: 0 }, { scale: 1, duration: 0.1, ease: "steps(2)", - transformOrigin: "100% 50%" }, BF + 0.03); - let score = 1370; - for (let t = BF + 0.09; t < BO - 0.03; t += 0.066) { - score += 4000 + Math.round(hrnd() * 5500); - tl.set(hsv, { textContent: String(score).padStart(7, "0") }, t); - } - tl.set("#hi", { color: "#ffffff" }, BO + 0.08); // 1-frame white tick out - tl.set("#hi", { opacity: 0 }, BO + 0.122); - }`; - return { css, html, js, fgCss, fgHtml, fgJs }; -} - -function setpieceRubberstamp() { - // RUBBER STAMP: the footage becomes an archival page at the apex — vignette - // charge (plate.charge) + manila sepia wash + a dim kick (plate.dim) that - // cools — then the verdict slams in BEHIND the subject as a bordered rubber - // stamp at params.rotation: crush 2.2→1 power4.in, 2-frame contact squash, - // double-strike ghost print, two thin-ink patches (clip-path circles in - // paper color), wet-ink saturate/brightness settle, and a paper indent - // shadow that blooms under the face. Stamps don't move: the hold is DEAD - // STILL, sold by the breathing indent + a slow paper loom. Exit at - // C + params.hold = mechanical 3-frame yank-down cut (the page is filed - // away); the archive plate releases 0.25s before it. - const h = dna.hero, - p = h.params || {}, - I = heroIn; - const C = I + (p.crush ?? 0.074); // stamp contact (plate punch lands here via punchOffset) - const X = theme.hero.exitAt ?? Math.min(heroOut - 0.06, C + (p.hold ?? 2.02)); - const ROT = p.rotation ?? -8; - const RED = dna.palette.accent || "#b3271e"; - const s = HG.fontPx / 120; // demo face was cut at 120px — chrome scales with it - const bw = Math.max(3, Math.round(6 * s)), - rad = Math.round(14 * s); - const padT = Math.round(20 * s), - padX = Math.round(40 * s), - padB = Math.round(14 * s); - const paperW = Math.round(HG.halfW * 2 * 1.18), - paperH = Math.round(HG.fontPx * 2.83); - const indW = Math.round(HG.halfW * 2 * 1.06), - indH = Math.round(HG.fontPx * 2.08); - const patches = p.patches || [ - [27, 36, 0.72], - [71, 68, 0.57], - ]; - const loomDur = Math.min(1.7, DUR - (C + 0.35) - 0.03); - const breDur = Math.min(1.6, DUR - (C + 0.45) - 0.03); - const css = ` - #dsep { position:absolute; inset:0; opacity:0; background:${dna.palette.paper || "#d8c49a"}; } - #dvig { position:absolute; inset:0; opacity:0; - background: radial-gradient(115% 100% at 50% 40%, rgba(0,0,0,0) 30%, rgba(20,14,8,0.85) 100%); } - #ddim { position:absolute; inset:0; opacity:0; background:#140d06; } - #dapex { position:absolute; left:${HG.x}px; top:${HG.y}px; width:0; height:0; } - #dpaper { position:absolute; width:${paperW}px; height:${paperH}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(222,203,160,0.92) 0%, rgba(216,196,154,0.55) 52%, rgba(216,196,154,0) 78%); } - #dindent { position:absolute; width:${indW}px; height:${indH}px; opacity:0; filter:blur(8px); - background: radial-gradient(50% 50% at 50% 50%, rgba(26,16,9,0.62) 0%, rgba(26,16,9,0.30) 48%, rgba(26,16,9,0) 72%); } - #dstamp { position:absolute; } - #dsface { position:relative; display:inline-block; } - .dface { font-family:'${dna.fonts.hero}', serif; font-size:${HG.fontPx}px; line-height:1; - white-space:nowrap; letter-spacing:0.015em; color:${RED}; - border:${bw}px solid currentColor; border-radius:${rad}px; - padding:${padT}px ${padX}px ${padB}px; } - #dghost, #dp1, #dp2 { position:absolute; inset:0; } - #dghost { opacity:0; } - #dp1 .dface, #dp2 .dface { color:rgba(219,199,156,0.55); } - #dp1 { clip-path: circle(${Math.round(patches[0][2] * HG.fontPx)}px at ${patches[0][0]}% ${patches[0][1]}%); } - #dp2 { clip-path: circle(${Math.round(patches[1][2] * HG.fontPx)}px at ${patches[1][0]}% ${patches[1][1]}%); }`; - const html = `
-
-
-
-
-
-
-
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
-
-
`; - const js = ` - // ---- setpiece: RUBBERSTAMP (archive charge → stamp crush → dead-still hold → filed away) ---- - const I = ${I.toFixed(3)}, C = ${C.toFixed(3)}, X = ${X.toFixed(3)}; - - // static geometry - gsap.set("#dpaper", { xPercent:-50, yPercent:-50, rotation: ${p.paperRot ?? 2.4} }); - gsap.set("#dindent", { xPercent:-50, yPercent:-50, rotation: ${ROT} }); - gsap.set("#dstamp", { xPercent:-50, yPercent:-50, rotation: ${ROT}, opacity: 0, - transformOrigin: "50% 50%" }); - gsap.set("#dghost", { x: ${Math.round(5 * s) || 5}, y: -${Math.round(4 * s) || 4}, rotation: 1.3 }); - - // ===== SCENE REACTION: the footage becomes an archive page ===== - tl.fromTo("#dvig", { opacity: 0 }, { opacity: ${dna.plate.charge}, duration: 0.18, ease: "power2.in" }, C - 0.18); - tl.fromTo("#dsep", { opacity: 0 }, { opacity: ${p.sepia ?? 0.14}, duration: 0.28, ease: "power1.out" }, C - 0.12); - tl.set("#ddim", { opacity: ${dna.plate.dim} }, C); - tl.to("#ddim", { opacity: ${(dna.plate.dim * 0.385).toFixed(2)}, duration: 0.5, ease: "power2.out" }, C + 0.05); - tl.to("#dvig", { opacity: ${(dna.plate.charge * 0.5).toFixed(2)}, duration: 0.8, ease: "power2.out" }, C + 0.12); - tl.to(["#dvig","#dsep","#ddim"], { opacity: 0, duration: 0.4, ease: "power1.in" }, X - 0.25); - - // the page lights up an instant before contact (what the stamp lands ON) - tl.fromTo("#dpaper", { opacity: 0, scale: 0.92 }, - { opacity: 0.6, scale: 1, duration: 0.10, ease: "expo.out" }, C - 0.05); - tl.to("#dpaper", { keyframes: { scale: [1, 1.016, 1.005, 1.018, 1.008, 1.015] }, - duration: ${loomDur.toFixed(2)}, ease: "none" }, C + 0.35); - - // ===== ARRIVAL: rubber stamp crush → contact squash → dead still ===== - tl.set("#dstamp", { opacity: 1, scale: 2.2 }, C - 0.115); - tl.to("#dstamp", { scale: 1, duration: 0.115, ease: "power4.in" }, C - 0.115); - tl.set("#dstamp", { scaleX: 1.07, scaleY: 0.93 }, C); // contact squash - tl.to("#dstamp", { scaleX: 1, scaleY: 1, duration: 0.09, ease: "power2.out" }, C + 0.083); - // double-strike ghost prints on contact - tl.set("#dghost", { opacity: 0.35 }, C); - // wet ink settles - tl.set("#dmain", { filter: "saturate(1.5) brightness(1.3)" }, C); - tl.to("#dmain", { filter: "saturate(1) brightness(1)", duration: 0.5, ease: "power2.out" }, C + 0.06); - - // paper indent shadow blooms under the stamp, then breathes (the hold-life; - // the stamp itself stays DEAD STILL) - tl.set("#dindent", { opacity: 0.5, scale: 0.7 }, C); - tl.to("#dindent", { scale: 1, opacity: 0.42, duration: 0.35, ease: "expo.out" }, C + 0.02); - tl.to("#dindent", { keyframes: { opacity: [0.42, 0.30, 0.40, 0.31, 0.38, 0.33] }, - duration: ${breDur.toFixed(2)}, ease: "none" }, C + 0.45); - - // ===== EXIT: page filed away — mechanical 3-frame yank-down cut ===== - tl.set("#dapex", { y: 10 }, X); - tl.set("#dapex", { y: 28, opacity: 0.5 }, X + F); - tl.set("#dapex", { opacity: 0 }, X + 2 * F);`; - return { css, html, js }; -} - -function setpieceLasercage() { - // LASER CAGE: concert blackout — the plate dims and haze cones breathe in - // the top corners; a 6-beam laser array (alternating accent/magenta, - // emitters along the top edge) snaps on and SWEEPS to converge on the word - // center, a hot core pops at convergence, and the word IGNITES behind the - // subject with an additive glow stack (wide blur + magenta fringe + tight - // blur + core): crush → contact squash → elastic settle + 2 controlled - // strobe pops. A criss-cross beam CAGE draws itself around the word rect - // and flickers; during the hold the array FANS OUT slowly behind the word - // (the iconic concert fan) while the word looms. Exit: the beams sweep away - // L→R carrying the letters (streak + blur) and the room lifts back up. - const I = heroIn; - const X0 = +(heroOut - 0.38).toFixed(3); // beams-carry-the-letters exit - const A = dna.palette.accent, - MG = dna.palette.magenta || "#ff4df0"; - const CORE = dna.palette.core || "#eefff5", - SOFT = dna.palette.glowSoft || "#c9ffe2"; - const fpx = HG.fontPx, - halfW = Math.round(HG.halfW), - cx = HG.x, - cy = HG.y; - // emitters along the top edge, initial aim points, fan-out floor targets - // (demo geometry expressed as frame fractions) - const EMX = [-0.023, 0.141, 0.352, 0.648, 0.859, 1.023].map((f) => Math.round(W * f)); - const EMY = [-20, -45, -55, -55, -45, -20]; - const STX = [0.164, 0.828, 0.313, 0.688, 0.406, 0.594].map((f) => Math.round(W * f)); - const FANX = [0.094, 0.258, 0.426, 0.574, 0.742, 0.906].map((f) => Math.round(W * f)); - const FANY = [0.75, 0.9, 0.97, 0.97, 0.9, 0.75].map((f) => Math.round(H * f)); - // beam-grid cage around the word rect (extents derive from halfW + fontPx) - const CAGE = [ - [cx - (halfW + 90), cy + 0.76 * fpx, cx + (halfW + 90), cy - 0.68 * fpx, A, 0.5], - [cx - (halfW + 90), cy - 0.68 * fpx, cx + (halfW + 90), cy + 0.76 * fpx, MG, 0.42], - [cx - (halfW - 80), cy + 1.0 * fpx, cx + (halfW - 80), cy - 0.92 * fpx, A, 0.5], - [cx - (halfW - 80), cy - 0.92 * fpx, cx + (halfW - 80), cy + 1.0 * fpx, MG, 0.42], - [cx - (halfW + 40), cy - 0.74 * fpx, cx + (halfW + 40), cy - 0.74 * fpx, A, 0.45], - [cx - (halfW + 40), cy + 0.82 * fpx, cx + (halfW + 40), cy + 0.82 * fpx, MG, 0.4], - ].map((c) => c.map((v) => (typeof v === "number" ? Math.round(v) : v))); - const spillW = 2 * halfW + 240, - spillH = Math.round(fpx * 5.2); - const hazeW = Math.round(W * 0.656), - hazeH = H + 60; - const blurBig = Math.round(0.22 * fpx), - blurTight = Math.max(3, Math.round(0.07 * fpx)), - fringeOff = Math.max(2, Math.round(0.03 * fpx)); - // hold-life choreography only with runway before the exit - const strobeTs = [I + 0.5, I + 1.08].filter((t) => t < X0 - 0.25); - const fanDur = +Math.max(0.4, Math.min(1.0, X0 - (I + 0.62 + 5 * 0.04) - 0.05)).toFixed(2); - const flickDur = +Math.max(0.4, Math.min(1.2, X0 - 0.05 - (I + 0.6))).toFixed(2); - const lstag = +Math.min( - 0.025, - Math.max(0.008, (DUR - 0.25 - (X0 + 0.02)) / Math.max(1, heroText.length - 1)), - ).toFixed(4); - const css = ` - #dimC { position:absolute; inset:0; background:#000; opacity:0; } - #hazeLc { position:absolute; left:-150px; top:-130px; width:${hazeW}px; height:${hazeH}px; opacity:0; - background: radial-gradient(58% 95% at 12% 4%, ${A}80 0%, ${A}00 68%); - filter: blur(10px); } - #hazeRc { position:absolute; right:-150px; top:-130px; width:${hazeW}px; height:${hazeH}px; opacity:0; - background: radial-gradient(58% 95% at 88% 4%, ${MG}6b 0%, ${MG}00 68%); - filter: blur(10px); } - #spillC { position:absolute; left:${cx}px; top:${cy}px; width:${spillW}px; height:${spillH}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${A}8c 0%, ${A}00 70%); - mix-blend-mode:screen; } - #lasersC { position:absolute; inset:0; } - #hotC { position:absolute; left:${cx}px; top:${cy}px; width:130px; height:130px; opacity:0; - background: radial-gradient(circle, rgba(235,255,244,0.95) 0%, ${A}99 42%, ${A}00 72%); - filter: blur(4px); mix-blend-mode:screen; } - #apexC { position:absolute; left:${cx}px; top:${cy}px; opacity:0; white-space:nowrap; - font-family:'${dna.fonts.hero}', sans-serif; font-size:${fpx}px; line-height:1; letter-spacing:0.02em; } - .clayer { position:absolute; left:0; top:0; } - #cglow { color:${A}; filter:blur(${blurBig}px); opacity:0; mix-blend-mode:screen; } - #cglow2 { color:${SOFT}; filter:blur(${blurTight}px); opacity:0; mix-blend-mode:screen; } - #cfringe{ color:${MG}; left:${fringeOff}px; top:${fringeOff}px; opacity:0; } - #cword { position:relative; color:${CORE}; - text-shadow: 0 0 16px ${A}d9, 0 0 44px ${A}80, 0 2px 8px rgba(0,0,0,0.55); } - #cword .L { display:inline-block; }`; - const html = `
-
-
- - - -
-
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
-
`; - const js = ` - // ---- setpiece: LASERCAGE (6-beam converge → ignite → cage → fan-out → carried exit) ---- - const I = ${I.toFixed(3)}, X0 = ${X0.toFixed(3)}; - const CACC = ${J(A)}, CMAG = ${J(MG)}; - const NSC = "http://www.w3.org/2000/svg"; - gsap.set("#apexC", { xPercent: -50, yPercent: -50, transformOrigin: "50% 50%" }); - gsap.set(["#spillC", "#hotC"], { xPercent: -50, yPercent: -50 }); - - // apex word as letters (for the carried-away exit) - const cw = document.getElementById("cword"); - const cletters = []; - for (const ch of ${J(heroText)}) { - const s = document.createElement("span"); - s.className = "L"; s.textContent = ch === " " ? "\\u00a0" : ch; - cw.appendChild(s); cletters.push(s); - } - - // ---- 6-beam array (emitters along the top edge, alternating accent/magenta) - const gB = document.getElementById("gB"), gC = document.getElementById("gC"); - const EM = ${J(EMX.map((x, i) => [x, EMY[i]]))}; - const STARTX = ${J(STX)}; - const FAN = ${J(FANX.map((x, i) => [x, FANY[i]]))}; - function mkLnC(parent, x1, y1, x2, y2, col, w) { - const l = document.createElementNS(NSC, "line"); - l.setAttribute("x1", x1); l.setAttribute("y1", y1); - l.setAttribute("x2", x2); l.setAttribute("y2", y2); - l.setAttribute("stroke", col); l.setAttribute("stroke-width", w); - l.setAttribute("stroke-linecap", "round"); - l.style.opacity = 0; parent.appendChild(l); return l; - } - const cbeams = []; - for (let i = 0; i < 6; i++) { - const col = i % 2 ? CMAG : CACC; - const halo = mkLnC(gB, EM[i][0], EM[i][1], STARTX[i], ${cy + 4}, col, 6); - const core = mkLnC(gB, EM[i][0], EM[i][1], STARTX[i], ${cy + 4}, col, 1.6); - core.style.filter = "drop-shadow(0 0 6px " + col + ")"; - cbeams.push([halo, core]); - } - - // ---- beam-grid cage around the word rect - const ccage = ${J(CAGE)}.map(([x1, y1, x2, y2, col, op]) => { - const el = mkLnC(gC, x1, y1, x2, y2, col, 1.2); - const len = Math.hypot(x2 - x1, y2 - y1); - el.setAttribute("stroke-dasharray", len); - el.setAttribute("stroke-dashoffset", len); - return { el, len, op }; - }); - - // ===== WORLD: concert blackout + haze cones - tl.fromTo("#dimC", { opacity: 0 }, { opacity: ${dna.plate.dim}, duration: 0.35, ease: "power1.out" }, 0.03); - tl.to(["#hazeLc","#hazeRc"], { opacity: 0.08, duration: 0.5, ease: "power1.out" }, 0.15); - - // ===== CHARGE: room deepens, 6 beams snap on and sweep to center - tl.to("#dimC", { opacity: ${dna.plate.charge}, duration: 0.26, ease: "power2.in" }, I - 0.31); - tl.to(["#hazeLc","#hazeRc"], { opacity: 0.10, duration: 0.28 }, I - 0.29); - cbeams.forEach((els, i) => { - const t0 = I - 0.26 + i * 0.022; - tl.set(els[0], { opacity: 0.26 }, t0); - tl.set(els[1], { opacity: 0.95 }, t0); - tl.to(els, { attr: { x2: ${cx}, y2: ${cy} }, duration: 0.16, ease: "power2.inOut" }, t0); - }); - tl.fromTo("#hotC", { opacity: 0, scale: 0.4 }, - { opacity: 0.6, scale: 1, duration: 0.1, ease: "power2.in" }, I - 0.11); - tl.to("#hotC", { scale: 2.8, opacity: 0, duration: 0.2, ease: "expo.out" }, I); - - // ===== IGNITE: crush in → contact squash → elastic settle; additive glow stack - tl.set("#apexC", { opacity: 1, scale: 1.16 }, I - 0.02); - tl.to("#apexC", { scale: 1, duration: 0.09, ease: "power4.in" }, I - 0.018); - tl.set("#apexC", { scaleX: 1.09, scaleY: 0.92 }, I + 0.08); - tl.to("#apexC", { scaleX: 1, scaleY: 1, duration: 0.5, ease: "elastic.out(1, 0.38)" }, I + 0.165); - tl.set("#cglow", { opacity: 0.95 }, I); - tl.set("#cglow2", { opacity: 0.60 }, I); - tl.set("#cfringe",{ opacity: 0.30 }, I); - tl.set("#cword", { filter: "brightness(1.9)" }, I); - tl.to("#cword", { filter: "brightness(1)", duration: 0.3, ease: "power2.out" }, I + 0.08); - tl.to("#cglow", { opacity: 0.55, duration: 0.45, ease: "power2.out" }, I + 0.15); - tl.to("#cglow2", { opacity: 0.38, duration: 0.45, ease: "power2.out" }, I + 0.15); - tl.set("#dimC", { opacity: ${(dna.plate.charge - 0.06).toFixed(2)} }, I + 0.05); - tl.to("#dimC", { opacity: ${(dna.plate.charge - 0.1).toFixed(2)}, duration: 0.8, ease: "power1.out" }, I + 0.2); - tl.set("#spillC", { opacity: 0.22 }, I + 0.02); - tl.to("#spillC", { opacity: 0.12, duration: 0.2, ease: "power2.out" }, I + 0.25); - - // ===== CAGE draws around the word - ccage.forEach((c, i) => { - const t = I + 0.08 + i * 0.03; - tl.set(c.el, { opacity: c.op }, t); - tl.to(c.el, { attr: { "stroke-dashoffset": 0 }, duration: 0.18, ease: "power2.out" }, t); - }); - tl.to(ccage.map((c) => c.el), - { keyframes: { opacity: [0.48, 0.36, 0.44, 0.34, 0.42, 0.38] }, duration: ${flickDur}, ease: "none" }, - I + 0.6); - - // ===== controlled strobe pops (with the ignite flash: events spread > 1s) - ${J(strobeTs.map((t) => +t.toFixed(3)))}.forEach((t) => { - tl.set("#apexC", { filter: "brightness(2.05)" }, t); - tl.set("#apexC", { filter: "brightness(1)" }, t + 0.05); - tl.set("#spillC", { opacity: 0.27 }, t); - tl.to("#spillC", { opacity: 0.12, duration: 0.3, ease: "power2.out" }, t + 0.05); - }); - - // ===== FAN OUT: the iconic fan opens behind the word during the hold - cbeams.forEach((els, i) => { - const t = I + 0.62 + i * 0.04; - tl.to(els, { attr: { x2: FAN[i][0], y2: FAN[i][1] }, duration: ${fanDur}, ease: "power1.inOut" }, t); - tl.to(els[0], { opacity: 0.18, duration: 0.4 }, t); - tl.to(els[1], { opacity: 0.50, duration: 0.4 }, t); - }); - tl.to(["#hazeLc","#hazeRc"], { opacity: 0.16, duration: 0.6, ease: "power1.inOut" }, I + 0.35); - - // ===== HOLD LIFE: loom breathe + glow flicker - tl.to("#apexC", { scale: 1.03, duration: 0.6, ease: "sine.inOut" }, I + 0.8); - tl.to("#apexC", { scale: 1.0, duration: 0.6, ease: "sine.inOut" }, I + 1.4); - tl.to("#cglow", { keyframes: { opacity: [0.55, 0.42, 0.52, 0.40, 0.48, 0.45] }, - duration: ${Math.min(1.15, Math.max(0.4, X0 - 0.06 - (I + 0.62))).toFixed(2)}, ease: "none" }, I + 0.62); - - // ===== EXIT: beams sweep away L→R carrying the letters - ccage.forEach((c, i) => { - tl.to(c.el, { attr: { "stroke-dashoffset": c.len }, duration: 0.16, ease: "power2.in" }, X0 + i * 0.02); - tl.set(c.el, { opacity: 0 }, X0 + i * 0.02 + 0.17); - }); - cletters.forEach((l, i) => { - tl.to(l, { x: 44, opacity: 0, filter: "blur(6px)", duration: 0.16, ease: "power2.in" }, - X0 + 0.02 + i * ${lstag}); - }); - tl.to(["#cglow","#cglow2","#cfringe"], { x: 60, opacity: 0, duration: 0.22, ease: "power2.in" }, X0 + 0.06); - cbeams.forEach((els, i) => { - tl.to(els, { attr: { x2: "+=${Math.round(W * 0.742)}" }, duration: 0.28, ease: "power2.in" }, X0 + 0.02 + i * 0.03); - tl.to(els, { opacity: 0, duration: 0.22 }, X0 + 0.04 + i * 0.03); - }); - tl.to("#spillC", { opacity: 0, duration: 0.25 }, X0 - 0.01); - tl.to("#dimC", { opacity: 0.12, duration: 0.4, ease: "power1.in" }, X0 + 0.06); - tl.to(["#hazeLc","#hazeRc"], { opacity: 0.03, duration: 0.4 }, X0 + 0.06); - tl.set("#apexC", { display: "none" }, ${(DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceBoltstrike() { - // THUNDER apex: the storm is the editor. A slate storm mood sits on the room - // from t=0 and the sky "kisses" (1-frame brighten) on every body word — - // double-kiss on emphasis words, re-flashes during the hold. Before the - // strike the room charge-dims under a radial word scrim; a hand-authored - // branched bolt (haze/glow/core stack) flashes 2 frames BEFORE the word - // (leader → return stroke at contact) with a sky flash, then the word slams - // in lit HARD (brightness 2.5 → 1) with its text-shadow flipped toward the - // bolt for the flash frames; an ozone under-glow blooms and breathes through - // the hold (loom + 2-frame lit blips on the sheet re-flashes); exit washes - // downward with the rain. - const p = dna.hero.params || {}, - I = heroIn; - const A = dna.palette.accent, // ozone / bolt haze - GL = dna.palette.glow || "#cfe8ff", // bolt glow - CORE = dna.palette.core || "#ffffff", // bolt core - HC = dna.palette.hero || dna.palette.body; - const EX = theme.hero.exitAt ?? Math.min(heroOut - 0.2, I + (p.hold ?? 2.05)); - const hpx = HG.fontPx, - halfW = HG.halfW || heroText.length * 0.28 * hpx; - // word scrim sized from the word rect (demo 1100×330 around a 720×145 word) - const scW = Math.round(2 * halfW + 380), - scH = Math.round(hpx * 2.28); - // hand-authored branched bolt (5-seg zigzag + 2 branches) measured off the - // demo cut — offsets from the word center in halfW (x) / fontPx (y) units; - // the leader always enters from above the frame - const sgn = p.side === "right" ? -1 : 1; - const kx = ((halfW || 360) / 360) * sgn, - ky = hpx / 145; - const pts = (arr, top) => - arr - .map(([dx, dy], k) => { - const x = HG.x + dx * kx; - let y = HG.y + dy * ky; - if (top && k === 0) y = Math.min(y, -25); - return `${Math.round(x)},${Math.round(y)}`; - }) - .join(" "); - const MAINP = pts( - [ - [-45, -282], - [-107, -134], - [-23, -56], - [-113, 66], - [-17, 150], - [-85, 268], - ], - true, - ); - const BAP = pts([ - [-107, -134], - [-183, -56], - [-157, 10], - ]); - const BBP = pts([ - [-113, 66], - [-187, 140], - [-163, 200], - ]); - const wS = (w) => (w * ky).toFixed(1); - const boltSvg = (color, w, wb) => - `` + - `` + - `` + - `` + - ``; - // the sky kisses on every BODY word (the hero word is consumed by the slam) - const kissData = LINES.flatMap((L) => - L.words.map((w) => [+w.start.toFixed(3), w.minor ? 1 : 0]), - ).filter(([t]) => t < DUR - 0.1); - const css = ` - #mood { position:absolute; inset:0; background:rgba(38,62,96,${p.mood ?? 0.1}); } - #dimP { position:absolute; inset:0; opacity:0; background:#0a1422; } - #kiss { position:absolute; inset:0; opacity:0; - background:linear-gradient(to bottom, rgba(222,236,255,0.95) 0%, rgba(222,236,255,0.40) 38%, rgba(222,236,255,0) 72%); } - #wordscrim { position:absolute; left:${HG.x}px; top:${HG.y}px; width:${scW}px; height:${scH}px; - margin-left:-${Math.round(scW / 2)}px; margin-top:-${Math.round(scH / 2)}px; opacity:0; border-radius:50%; - background:radial-gradient(50% 50% at 50% 50%, rgba(5,10,20,0.85) 0%, rgba(5,10,20,0.45) 55%, rgba(5,10,20,0) 100%); } - #apex { position:absolute; left:${HG.x}px; top:${HG.y}px; opacity:0; } - .aw { position:absolute; left:0; top:0; transform:translate(-50%,-50%); - font-family:'${dna.fonts.hero}', sans-serif; font-size:${hpx}px; line-height:1; - letter-spacing:0.012em; white-space:nowrap; } - #ozone { color:${A}; filter:blur(${Math.max(10, Math.round(26 * ky))}px); opacity:0; top:${Math.round(8 * ky)}px; } - #aword { color:${HC}; - text-shadow: 0 8px 26px rgba(3,8,18,0.85), 0 2px 6px rgba(3,8,18,0.7), 0 0 18px ${A}59; } - #bolt { position:absolute; inset:0; opacity:0; } - .boltlayer { position:absolute; inset:0; } - .boltlayer svg { position:absolute; inset:0; width:${W}px; height:${H}px; } - #boltHaze { filter:blur(16px); opacity:0.55; } - #boltGlow { filter:blur(5px); opacity:0.9; } - #skyflash { position:absolute; inset:0; opacity:0; - background:radial-gradient(120% 90% at 42% 22%, rgba(240,248,255,0.95) 0%, rgba(200,222,250,0.55) 45%, rgba(120,150,190,0) 100%); }`; - const html = `
-
-
-
-
-
${esc(heroText)}
-
${esc(heroText)}
-
-
-
${boltSvg(A, 22, 13)}
-
${boltSvg(GL, 9, 5)}
-
${boltSvg(CORE, 3.5, 2.2)}
-
-
`; - // breathe/loom clamp inside [contact, exit] for any clip length - const breDur = Math.max(0.6, Math.min(1.5, EX - 0.23 - (I + 0.3))); - const loomDur = Math.max(0.4, EX - 0.04 - (I + 0.74)); - const js = ` - // ---- setpiece: BOLTSTRIKE (storm charge → branched-bolt leader → word slams in lit) ---- - const I = ${I.toFixed(3)}, EXB = ${EX.toFixed(3)}; - - // distant lightning KISS: 1-frame sky brighten on every body word - const KISS = ${J(kissData)}; - KISS.forEach(([t, em]) => { - tl.set("#kiss", { opacity: 0.06 }, t); - tl.set("#kiss", { opacity: 0 }, t + F); - if (em && t + 0.20 + 3 * F < ${(DUR - 0.04).toFixed(2)}) { - // emphasis words get the sheet-lightning double kiss (matches the rail double flash) - const t0 = t + 0.20; - tl.set("#kiss", { opacity: 0.07 }, t0); - tl.set("#kiss", { opacity: 0 }, t0 + F); - tl.set("#kiss", { opacity: 0.06 }, t0 + 2 * F); - tl.set("#kiss", { opacity: 0 }, t0 + 3 * F); - } - }); - // sheet re-flashes during the apex hold - [I + 0.84, I + 1.44].forEach((t) => { - if (t < EXB - 0.2) { tl.set("#kiss", { opacity: 0.08 }, t); tl.set("#kiss", { opacity: 0 }, t + F); } - }); - - // CHARGE: the storm gathers before the strike (ends before the bolt frames) - tl.fromTo("#dimP", { opacity: 0 }, { opacity: ${dna.plate.charge || 0.3}, duration: 0.30, ease: "power2.in" }, I - 0.39); - tl.fromTo("#wordscrim", { opacity: 0 }, { opacity: 0.42, duration: 0.30, ease: "power2.in" }, I - 0.39); - - // THE STRIKE: bolt flashes 2 frames before the word, return stroke at contact - tl.set("#bolt", { opacity: 1 }, I - 2 * F); - tl.set("#bolt", { opacity: 0.35 }, I - F); - tl.set("#bolt", { opacity: 1 }, I); - tl.to("#bolt", { opacity: 0, duration: 0.07, ease: "power2.in" }, I + 0.045); - - tl.set("#skyflash", { opacity: 0.26 }, I - 2 * F); - tl.set("#skyflash", { opacity: 0.10 }, I - F); - tl.set("#skyflash", { opacity: 0.30 }, I + 0.02); - tl.to("#skyflash", { opacity: 0, duration: 0.22, ease: "expo.out" }, I + 0.06); - - // dim released by the flash, settles to a storm hold, lifts at the end - tl.set("#dimP", { opacity: 0.08 }, I - 2 * F); - tl.to("#dimP", { opacity: ${dna.plate.dim || 0.22}, duration: 0.25, ease: "power2.out" }, I + 0.10); - tl.to("#dimP", { opacity: 0, duration: 0.40, ease: "power1.in" }, EXB - 0.14); - tl.set("#wordscrim", { opacity: 0.32 }, I - 2 * F); - tl.to("#wordscrim", { opacity: 0.36, duration: 0.30 }, I + 0.10); - tl.to("#wordscrim", { opacity: 0, duration: 0.30 }, EXB - 0.04); - - // APEX WORD: slam transit → contact squash (2 frames) → elastic settle - tl.set("#apex", { opacity: 1 }, I - 2 * F); - tl.fromTo("#apex", { scale: 3.1 }, { scale: 1, duration: 0.105, ease: "power4.in" }, I - 2 * F); - tl.fromTo("#aword", { filter: "blur(14px) brightness(3.2)" }, - { filter: "blur(0px) brightness(2.5)", duration: 0.105, ease: "power4.in" }, I - 2 * F); - tl.set("#apex", { scaleX: 1.10, scaleY: 0.90 }, I + 0.025); - tl.to("#apex", { scaleX: 1, scaleY: 1, duration: 0.55, ease: "elastic.out(1.05, 0.34)" }, I + 0.025 + 2 * F); - // lit HARD for 2 frames, then cools - tl.to("#aword", { filter: "blur(0px) brightness(1)", duration: 0.45, ease: "power2.out" }, I + 0.025 + 2 * F); - - // SIGNATURE: shadow flips toward the bolt (light from the strike side) for the flash frames - tl.set("#aword", { textShadow: "${16 * sgn}px 6px 18px rgba(2,6,14,0.9), ${4 * sgn}px 2px 6px rgba(2,6,14,0.75), 0 0 26px ${A}b3" }, I - 2 * F); - tl.set("#aword", { textShadow: "0 8px 26px rgba(3,8,18,0.85), 0 2px 6px rgba(3,8,18,0.7), 0 0 18px ${A}59" }, I + 0.09); - - // ozone under-glow blooms with the hit, breathes during hold - tl.set("#ozone", { opacity: 0.85 }, I + 0.02); - tl.to("#ozone", { keyframes: { opacity: [0.85, 0.5, 0.65, 0.42, 0.55, 0.38] }, - duration: ${breDur.toFixed(2)}, ease: "none" }, I + 0.30); - tl.to("#ozone", { opacity: 0.32, duration: 0.18 }, EXB - 0.22); - - // hold life: loom + 2-frame lit blips on the sheet re-flashes - tl.to("#apex", { scale: 1.035, duration: ${loomDur.toFixed(2)}, ease: "power1.inOut" }, I + 0.74); - [[I + 0.84, 1.45], [I + 1.44, 1.35]].forEach(([t, b2]) => { - if (t < EXB - 0.2) { - tl.set("#aword", { filter: "brightness(" + b2 + ")" }, t); - tl.set("#aword", { filter: "brightness(1)" }, t + F); - } - }); - - // EXIT: washes downward with the rain - tl.to("#apex", { y: 38, opacity: 0, filter: "blur(6px)", duration: 0.22, ease: "power2.in" }, EXB); - tl.set("#apex", { display: "none" }, ${Math.min(EX + 0.26, DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceHoloboot() { - // HOLOGRAM apex: full volumetric boot behind the subject. A desk emitter dot - // pops, the projection cone SNAPS wide (scaleX expo), a seed beam fires up - // from the emitter, and the word boots with a RISING clip sweep (opacity is - // instant — the reveal is a wipe) into a 7-layer projection stack (dark - // backing shadow / wide glow / magenta+cyan chromatic fringes / core / - // scanline mask / climbing interference bands). Contact = over-bright flash - // + squash held 2 frames + elastic settle + 1-frame x interference jumps; - // fringes blow wide then settle to a constant registration offset. Hold - // life: bands climb, rotationY oscillates, glow/cone breathe, emitter dot - // pulses, slow loom; a hand "passes through" the projection (skew + blur + - // fringe blowout, pure projection logic). Exit: the projector cut — the - // word collapses to a horizontal line, then to the base dot. A second, - // smaller emitter cone rises from the desk under the holorail plate all - // video (the body rail is cast from the SAME projector grammar). - const p = dna.hero.params || {}, - I = heroIn; - const A = dna.palette.accent, - MG = dna.palette.magenta || "#ff5fd6"; - const GLOW = dna.palette.glow || "#3eccf2", - CORE = dna.palette.core || "#eafbff"; - const fpx = HG.fontPx, - halfW = Math.round(HG.halfW || heroText.length * 0.4 * fpx), - cx = HG.x, - cy = HG.y; - const k = fpx / 118; // demo scale unit (Orbitron 700 @ 118px) - // apex rig geometry derives from the word rect - const coneW = Math.min(2 * halfW + 80, W - 40); - const coneTop = Math.round(cy - 0.55 * fpx); - const emitY = Math.min(H - 30, Math.round(cy + 2.4 * fpx)); - const coneH = emitY - coneTop; - const beamTop = coneTop + 40, - beamH = emitY - beamTop; - const cxP = ((cx / W) * 100).toFixed(1), - cyP = ((cy / H) * 100).toFixed(1); - // body-zone projector under the holorail plate (cone behind the subject) - const plateBot = Math.round(H - (dna.body.bottomPx || 108) + (dna.body.plateH || 96) / 2); - const bcW = p.coneW || 800, - bcTop = plateBot - 4, - bcH = H - bcTop - 4; - // interference-band pitch scales with the type - const bandH = Math.max(20, Math.round(fpx * 0.39)); - const bp = (f) => Math.round(bandH * f); - // projector-cut exit + hold-life windows (all runway-clamped) - const cutT = +Math.min(heroOut - 0.22, DUR - 0.3).toFixed(3); - const C = I + 0.07; // contact - const holdD = +Math.max(0.6, Math.min(1.72, cutT - 0.05 - (I + 0.24))).toFixed(2); - const holdD2 = +Math.max(0.5, holdD - 0.1).toFixed(2); - const reactD = +Math.max(0.3, Math.min(0.9, cutT - 0.3 - (I + 0.24))).toFixed(2); - const loomD = +Math.min(0.62, Math.max(0.2, cutT - 0.3 - (I + 0.74))).toFixed(2); - // the hand-pass needs the loom done (scale channel) and clear exit runway - const passT = +Math.max(I + (p.passAt ?? 1.29), I + 1.25).toFixed(3); - const doPass = passT + 0.65 < cutT - 0.05; - const css = ` - #dimH { position:absolute; inset:0; opacity:0; background:#02101a; } - #scrimH { position:absolute; inset:0; opacity:0; - background: radial-gradient(58% 46% at ${cxP}% ${cyP}%, rgba(2,9,15,0.88) 0%, rgba(2,9,15,0.55) 48%, rgba(2,9,15,0) 78%); } - #bcone { position:absolute; left:${Math.round(W / 2 - bcW / 2)}px; top:${bcTop}px; width:${bcW}px; height:${bcH}px; opacity:0; - clip-path: polygon(0% 0%, 100% 0%, 51.6% 100%, 48.4% 100%); - background: linear-gradient(to top, ${A}4d 0%, ${A}1a 55%, ${A}05 100%); } - #bdot { position:absolute; left:${Math.round(W / 2 - 4.5)}px; top:${H - 10}px; width:9px; height:9px; border-radius:50%; - background:${dna.palette.dot || "#bff0ff"}; opacity:0; - box-shadow: 0 0 10px ${A}e6, 0 0 24px ${A}8c; } - #apxcone { position:absolute; left:${Math.round(cx - coneW / 2)}px; top:${coneTop}px; width:${coneW}px; height:${coneH}px; opacity:0; - clip-path: polygon(0% 0%, 100% 0%, 53% 100%, 47% 100%); - background: linear-gradient(to top, ${A}57 0%, ${A}1f 50%, ${A}05 100%); } - #apxbeam { position:absolute; left:${Math.round(cx - 2.5)}px; top:${beamTop}px; width:5px; height:${beamH}px; opacity:0; - background: linear-gradient(to top, ${CORE}f2, ${CORE}1f); - filter: blur(0.6px); } - #apxdot { position:absolute; left:${Math.round(cx - 6.5)}px; top:${emitY - 6}px; width:13px; height:13px; border-radius:50%; - background:${dna.palette.dotHot || "#dff8ff"}; opacity:0; - box-shadow: 0 0 12px ${A}f2, 0 0 34px ${A}99; } - #apx { position:absolute; left:${cx}px; top:${cy}px; opacity:0; } - #apxclip { position:relative; } - .aw { font-family:'${dna.fonts.hero}', sans-serif; font-weight:700; font-size:${fpx}px; line-height:1; - letter-spacing:0; white-space:nowrap; } - #adark { position:absolute; left:0; top:${Math.max(2, Math.round(3 * k))}px; color:rgba(1,12,20,0.92); - filter:blur(${Math.max(4, Math.round(7 * k))}px); transform:scale(1.03); } - #aglow { position:absolute; left:0; top:0; color:${GLOW}f2; - filter:blur(${Math.max(8, Math.round(16 * k))}px); transform:scale(1.05); opacity:0.55; } - #cmag { position:absolute; left:0; top:0; color:${MG}8c; } - #ccyn { position:absolute; left:0; top:0; color:${A}99; } - #acore { position:relative; color:${CORE}; - text-shadow: 0 0 22px ${A}73, 0 3px 14px rgba(1,10,16,0.55); } - #ascan { position:absolute; left:0; top:0; color:transparent; - -webkit-background-clip:text; background-clip:text; - background-image: repeating-linear-gradient(180deg, rgba(0,0,0,0) 0px, rgba(0,0,0,0) 2.5px, rgba(2,12,18,0.62) 2.5px, rgba(2,12,18,0.62) 4px); } - #abands { position:absolute; left:0; top:0; color:transparent; opacity:0; - -webkit-background-clip:text; background-clip:text; - background-image: repeating-linear-gradient(180deg, rgba(255,255,255,0) 0px, rgba(255,255,255,0) ${bp(0.717)}px, ${dna.palette.band || "#d8faff"}f2 ${bp(0.783)}px, ${dna.palette.band || "#d8faff"}f2 ${bp(0.87)}px, rgba(255,255,255,0) ${bp(0.935)}px, rgba(255,255,255,0) ${bandH}px); - background-size: 100% ${bandH}px; }`; - const html = `
-
-
-
-
-
-
-
-
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
${esc(heroText)}
-
-
`; - // body-projector flicker cycles, baked to the clip length - const coneFlicks = []; - for (let t = 0.6; t + 2.2 <= DUR - 0.25; t += 2.3) coneFlicks.push(+t.toFixed(2)); - const dotPulses = []; - let dt = 0.5; - for (; dt + 2.0 <= DUR - 0.3; dt += 2.15) dotPulses.push(+dt.toFixed(2)); - const dotTail = dt + 1.0 <= DUR - 0.24 ? +dt.toFixed(2) : null; - const js = ` - // ---- setpiece: HOLOBOOT (emitter pop → cone snap → seed beam → rising-sweep word boot) ---- - const I = ${I.toFixed(3)}, CUT = ${cutT.toFixed(3)}; - gsap.set("#apx", { xPercent: -50, yPercent: -50, transformPerspective: 900, transformOrigin: "50% 50%" }); - gsap.set("#apxcone", { transformOrigin: "50% 100%" }); - gsap.set("#apxbeam", { transformOrigin: "50% 100%" }); - gsap.set("#bcone", { transformOrigin: "50% 100%" }); - gsap.set("#apxclip", { clipPath: "inset(100% 0% 0% 0%)" }); - - // ===== body-zone projector boots with the rail (cone behind the subject) - tl.set("#bdot", { opacity: 1 }, 0.06); - tl.fromTo("#bdot", { scale: 0.2 }, { scale: 1, duration: 0.12, ease: "back.out(2)" }, 0.06); - tl.set("#bcone", { opacity: 0.9 }, 0.08); - tl.fromTo("#bcone", { scaleY: 0.05 }, { scaleY: 1, duration: 0.14, ease: "expo.out" }, 0.08); - tl.set("#bcone", { opacity: 0.5 }, 0.22); - tl.set("#bcone", { opacity: 0.9 }, 0.26); - ${J(coneFlicks)}.forEach((t, i) => { - tl.to("#bcone", { keyframes: { opacity: i % 2 ? [0.86, 0.72, 0.84, 0.7, 0.84] : [0.9, 0.74, 0.86, 0.72, 0.86] }, - duration: 2.2, ease: "none" }, t); - }); - ${J(dotPulses)}.forEach((t) => { - tl.to("#bdot", { keyframes: { scale: [1, 1.3, 1, 1.25, 1] }, duration: 2.0, ease: "none" }, t); - }); - ${dotTail != null ? `tl.to("#bdot", { keyframes: { scale: [1, 1.25, 1] }, duration: 1.0, ease: "none" }, ${dotTail});` : ""} - // projector cut at the very end - tl.to("#bcone", { opacity: 0, duration: 0.18, ease: "power1.in" }, ${(DUR - 0.2).toFixed(3)}); - tl.set("#bdot", { scale: 1.6 }, ${(DUR - 0.12).toFixed(3)}); - tl.set("#bdot", { opacity: 0 }, ${(DUR - 0.05).toFixed(3)}); - - // ===== scene reaction: the room dims while the volumetric apex burns - tl.fromTo("#scrimH", { opacity: 0 }, { opacity: ${dna.plate.scrim ?? 0.58}, duration: 0.34, ease: "power2.in" }, I - 0.21); - tl.set("#dimH", { opacity: ${dna.plate.charge ?? 0.28} }, I - 0.05); - tl.to("#dimH", { opacity: ${dna.plate.dim ?? 0.18}, duration: ${reactD}, ease: "power2.out" }, I + 0.24); - tl.to("#scrimH", { opacity: ${((dna.plate.scrim ?? 0.58) * 0.79).toFixed(2)}, duration: ${reactD}, ease: "power2.out" }, I + 0.24); - tl.to(["#dimH","#scrimH"], { opacity: 0, duration: 0.4, ease: "power1.in" }, CUT - 0.12); - - // ===== APEX: full volumetric boot - // 1. emitter dot pops, cone SNAPS wide - tl.set("#apxdot", { opacity: 1 }, I - 0.135); - tl.fromTo("#apxdot", { scale: 0.2 }, { scale: 1, duration: 0.12, ease: "back.out(2.4)" }, I - 0.135); - tl.set("#apxcone", { opacity: 1 }, I - 0.125); - tl.fromTo("#apxcone", { scaleX: 0.07 }, { scaleX: 1, duration: 0.11, ease: "expo.out" }, I - 0.125); - tl.set("#apxcone", { opacity: 0.55 }, I - 0.01); - tl.set("#apxcone", { opacity: 0.95 }, I + 0.035); - // 2. seed beam fires up from the emitter - tl.set("#apxbeam", { opacity: 1 }, I - 0.095); - tl.fromTo("#apxbeam", { scaleY: 0 }, { scaleY: 1, duration: 0.085, ease: "power3.in" }, I - 0.095); - tl.to("#apxbeam", { opacity: 0, duration: 0.3, ease: "power1.in" }, I + 0.11); - // 3. the word boots with a RISING sweep (opacity instant, reveal is a wipe) - tl.set("#apx", { opacity: 1 }, I - 0.055); - tl.to("#apxclip", { clipPath: "inset(0% 0% 0% 0%)", duration: 0.125, ease: "power2.in" }, I - 0.055); - tl.set("#apxclip", { clipPath: "none" }, I + 0.08); // free the glow bloom after the sweep - // 4. contact: over-bright flash + squash held 2 frames + elastic settle - tl.set("#apxclip", { filter: "brightness(2.3)" }, ${C.toFixed(3)}); - tl.to("#apxclip", { filter: "brightness(1)", duration: 0.36, ease: "power2.out" }, ${(C + 0.05).toFixed(3)}); - tl.set("#apx", { scaleX: 1.07, scaleY: 0.91 }, ${C.toFixed(3)}); - tl.to("#apx", { scaleX: 1, scaleY: 1, duration: 0.5, ease: "elastic.out(1, 0.38)" }, ${(C + 0.084).toFixed(3)}); - // interference glitch on arrival (1-frame x jumps) - tl.set("#apxclip", { x: 3 }, ${(C + 0.02).toFixed(3)}); - tl.set("#apxclip", { x: -3 }, ${(C + 0.062).toFixed(3)}); - tl.set("#apxclip", { x: 0 }, ${(C + 0.104).toFixed(3)}); - // chromatic fringes blow wide then settle to the constant offset - tl.fromTo("#cmag", { x: -8 }, { x: -2, duration: 0.4, ease: "power2.out" }, ${C.toFixed(3)}); - tl.fromTo("#ccyn", { x: 8 }, { x: 2, duration: 0.4, ease: "power2.out" }, ${C.toFixed(3)}); - - // ===== hold life: interference bands climb, rotateY oscillates, glow breathes, loom - tl.set("#abands", { opacity: 0.55, backgroundPosition: "0px 0px" }, I + 0.24); - tl.to("#abands", { backgroundPosition: "0px -${6 * bandH}px", duration: ${holdD}, ease: "none" }, I + 0.24); - tl.to("#apx", { keyframes: { rotationY: [0, 6, -7, 5, 0] }, duration: ${holdD}, ease: "none" }, I + 0.24); - tl.to("#aglow", { keyframes: { opacity: [0.55, 0.4, 0.52, 0.38, 0.5] }, duration: ${holdD2}, ease: "none" }, I + 0.29); - tl.to("#apxcone", { keyframes: { opacity: [0.95, 0.78, 0.9, 0.76, 0.88] }, duration: ${holdD2}, ease: "none" }, I + 0.29); - tl.to("#apxdot", { keyframes: { scale: [1, 1.4, 1, 1.35, 1, 1.3, 1] }, duration: ${holdD2}, ease: "none" }, I + 0.29); - ${loomD >= 0.2 ? `tl.to("#apx", { scale: 1.028, duration: ${loomD}, ease: "sine.inOut" }, I + 0.74);` : ""} -${ - doPass - ? ` - // ===== a hand "passes through" the projection: pure projection logic - const P = ${passT.toFixed(3)}; - tl.set("#apx", { skewX: 6 }, P); - tl.set("#apxclip", { filter: "blur(2.5px) brightness(1.35)" }, P); - tl.set("#cmag", { x: -7 }, P); - tl.set("#ccyn", { x: 7 }, P); - tl.set("#apx", { skewX: -4 }, P + 0.042); - tl.set("#apxclip", { filter: "blur(1px)" }, P + 0.083); - tl.set("#apx", { skewX: 0 }, P + 0.125); - tl.set("#apxclip", { filter: "none" }, P + 0.125); - tl.to("#cmag", { x: -2, duration: 0.18, ease: "power2.out" }, P + 0.05); - tl.to("#ccyn", { x: 2, duration: 0.18, ease: "power2.out" }, P + 0.05); - tl.set("#apx", { scaleY: 0.97 }, P + 0.13); - tl.to("#apx", { scaleY: 1, duration: 0.3, ease: "elastic.out(1, 0.4)" }, P + 0.172);` - : "" -} - - // ===== EXIT: projector cut — collapse to a horizontal line, then to the base dot - tl.set("#apxclip", { filter: "brightness(2.4)" }, CUT - 0.02); - tl.to("#apx", { scaleY: 0.018, duration: 0.09, ease: "power3.in" }, CUT); - tl.to("#apx", { scaleX: 0.015, duration: 0.075, ease: "power3.in" }, CUT + 0.10); - tl.set("#apx", { opacity: 0 }, CUT + 0.18); - tl.to("#apxcone", { opacity: 0, duration: 0.16, ease: "power1.in" }, CUT + 0.02); - tl.set("#apxdot", { scale: 2.2 }, CUT + 0.12); - tl.to("#apxdot", { opacity: 0, duration: 0.09, ease: "power2.in" }, CUT + 0.18);`; - return { css, html, js }; -} - -function setpieceBiobloom() { - // BIOLUME apex: a bioluminescent BLOOM behind the subject. The abyss grade - // (params.mood) + a breathing vignette sit on the room from t=0 — the world - // IS underwater before anything speaks. A creature pre-glow gathers with a - // double-beat anticipation and crushes to a point; a dark pocket scrim - // (plate.scrim) opens behind the word zone; the word CONDENSES in (scale - // 2.35 crush power4.in 0.11s, blur 15→2, brightness 2.6→1.7) → 2-frame - // contact squash → elastic settle while cyan light SPILLS onto the scene; - // 6 luminous tendrils (blurred SVG strokes, cyan/violet alternating) draw - // outward from the word rect, staggered; through the hold the glow breathes - // 8–14%, two counter-drifting caustic gradients shimmer over the text zone - // and the bloom drifts slowly with the current (params.drift). Exit: the - // light SINKS — every glowing thing drifts down while dimming. Tendril - // geometry is hand-authored from the demo and baked at compile time as - // offsets from the word center (halfW/x × fontPx/120 units, frame-clamped). - const p = dna.hero.params || {}, - I = heroIn; - const A = dna.palette.accent, - VIO = dna.palette.violet || "#9d7bff", - ICE = dna.palette.ice || "#8fe8ff", - CORE = dna.palette.core || "#f2fffd"; - const fpx = HG.fontPx, - halfW = Math.round(HG.halfW || heroText.length * 0.33 * fpx), - cx = HG.x, - cy = HG.y; - const ky = fpx / 120; // demo scale unit (Fredoka 700 @ 120px) - const demoHalf = (wordPx("RECOVER", dna.fonts.hero, 120, 0.01) || 562) / 2; - const kx = halfW / demoHalf; - const TX = (x) => Math.round(Math.max(16, Math.min(W - 16, cx + (x - 560) * kx))); - const TY = (y) => Math.round(Math.max(16, Math.min(H - 16, cy + (y - 300) * ky))); - // 6 tendril cubics: anchors on the word rect edge, filaments reaching out - const TENDRILS = [ - [ - [340, 268], - [255, 230], - [195, 185], - [135, 110], - ], - [ - [525, 244], - [500, 185], - [560, 140], - [520, 70], - ], - [ - [725, 262], - [795, 222], - [850, 180], - [915, 112], - ], - [ - [365, 332], - [280, 372], - [215, 425], - [150, 492], - ], - [ - [580, 352], - [605, 415], - [545, 465], - [585, 530], - ], - [ - [715, 335], - [790, 380], - [855, 425], - [920, 475], - ], - ].map((pts) => { - const q = pts.map(([x, y]) => TX(x) + " " + TY(y)); - return `M ${q[0]} C ${q[1]}, ${q[2]}, ${q[3]}`; - }); - const TCOL = [A, VIO, ICE, A, VIO, A]; - const C = +(I + (p.crush ?? 0.11)).toFixed(3); // contact - const SINK = +Math.min(heroOut - 0.2, DUR - 0.3).toFixed(3); - // tendril stagger auto-clamps so the last filament completes before the sink - const stag = +Math.max(0.02, Math.min(0.05, (SINK - 0.46 - (C + 0.02)) / 5)).toFixed(3); - const breatheD = +Math.min(0.72, Math.max(0.3, DUR - 0.06 - (C + 0.12))).toFixed(2); - const flickD = +Math.min(0.7, SINK - 0.02 - (C + 0.34)).toFixed(2); - const shimD = +Math.min(0.5, Math.max(0.2, SINK + 0.03 - (C + 0.21))).toFixed(2); - const driftD = +Math.min(0.64, Math.max(0.2, SINK - (I + 0.21))).toFixed(2); - const wordFlickT = I + 0.59 + 0.32 <= SINK + 0.05 ? +(I + 0.59).toFixed(3) : null; - // geometry derived from the word rect - const pkW = Math.round(2 * halfW + 280), - pkH = Math.round(2.5 * fpx); - const pgW = Math.round(1.083 * fpx), - pgH = Math.round(0.717 * fpx); - const cxP = ((cx / W) * 100).toFixed(1), - cyP = ((cy / H) * 100).toFixed(1); - const css = ` - #abyss { position:absolute; inset:0; opacity:${p.mood ?? 0.92}; - background:linear-gradient(180deg, rgba(3,11,26,0.52) 0%, rgba(3,11,26,0.30) 30%, - rgba(4,9,20,0.10) 52%, rgba(2,7,16,0.18) 78%, rgba(1,5,12,0.34) 100%); } - #vig { position:absolute; inset:0; opacity:0.75; - background:radial-gradient(120% 110% at 50% 46%, rgba(0,0,0,0) 36%, - rgba(2,8,20,0.45) 66%, rgba(1,4,12,0.95) 100%); } - #pocket { position:absolute; left:${cx - Math.round(pkW / 2)}px; top:${cy - Math.round(pkH / 2)}px; - width:${pkW}px; height:${pkH}px; opacity:0; - background:radial-gradient(50% 50% at 50% 50%, rgba(1,8,18,0.72) 0%, - rgba(1,8,18,0.40) 55%, rgba(1,8,18,0) 78%); } - #spill { position:absolute; inset:0; opacity:0; - background:radial-gradient(58% 46% at ${cxP}% ${cyP}%, ${A}80 0%, - ${A}2b 42%, ${A}00 74%); } - .cau { position:absolute; left:${Math.round(W * 0.0625)}px; top:${Math.round(H * 0.069)}px; - width:${Math.round(W * 0.781)}px; height:${Math.round(H * 0.75)}px; opacity:0; } - #cauA { background:radial-gradient(46% 42% at 42% 46%, ${ICE}d9 0%, ${ICE}00 68%); } - #cauB { background:radial-gradient(44% 46% at 58% 52%, ${VIO}bf 0%, ${VIO}00 66%); } - #preglow { position:absolute; left:${cx}px; top:${cy}px; width:${pgW}px; height:${pgH}px; - margin-left:-${Math.round(pgW / 2)}px; margin-top:-${Math.round(pgH / 2)}px; - border-radius:50%; opacity:0; - background:radial-gradient(50% 50% at 50% 50%, rgba(170,255,242,0.95) 0%, - ${A}80 45%, ${A}00 75%); - filter:blur(${Math.max(6, Math.round(10 * ky))}px); } - #tndwrap { position:absolute; inset:0; } - #tnd { position:absolute; inset:0; width:${W}px; height:${H}px; } - #gGlow { filter:blur(5px); } - #gCore { filter:blur(1.1px); } - #tnd path { fill:none; stroke-linecap:round; opacity:0; } - #apex { position:absolute; left:${cx}px; top:${cy}px; opacity:0; } - .aw { position:absolute; left:0; top:0; white-space:nowrap; - font-family:'${dna.fonts.hero}', sans-serif; font-weight:700; font-size:${fpx}px; - line-height:1; letter-spacing:0.01em; } - #aglow { color:${A}; filter:blur(${Math.max(10, Math.round(18 * ky))}px); opacity:0; } - #aword { color:${CORE}; - text-shadow: 0 0 ${Math.round(18 * ky)}px ${A}f2, 0 0 ${Math.round(46 * ky)}px ${A}8c, - 0 0 ${Math.round(100 * ky)}px ${VIO}80, 0 4px ${Math.round(22 * ky)}px rgba(1,8,16,0.7); }`; - const html = `
-
-
-
-
-
-
-
- - - - -
-
-
${esc(heroText)}
-
${esc(heroText)}
-
`; - const js = ` - // ---- setpiece: BIOBLOOM (pre-glow gathers → word condenses → tendrils draw → light sinks) ---- - const BI = ${I.toFixed(3)}, BC = ${C.toFixed(3)}, SINK = ${SINK.toFixed(3)}; - gsap.set(["#aglow", "#aword"], { xPercent: -50, yPercent: -50 }); - gsap.set("#apex", { transformOrigin: "0px 0px" }); - gsap.set("#preglow", { scale: 0.6 }); - - // ===== the abyss breathes (whole clip) ===== - tl.to("#vig", { keyframes: { opacity: [0.8, 0.72, 0.83, 0.74, 0.81, 0.76] }, - duration: ${(DUR - 0.09).toFixed(2)}, ease: "sine.inOut" }, 0.03); - - // ===== light tendrils (SVG, drawn outward from the word rect) ===== - const TND = ${J(TENDRILS)}; - const TCOL = ${J(TCOL)}; - const NS = "http://www.w3.org/2000/svg"; - const gGlow = document.getElementById("gGlow"); - const gCore = document.getElementById("gCore"); - const tpaths = []; - TND.forEach((d, i) => { - const mk = (g, w) => { - const pp = document.createElementNS(NS, "path"); - pp.setAttribute("d", d); pp.setAttribute("stroke", TCOL[i]); - pp.setAttribute("stroke-width", w); g.appendChild(pp); - const L = pp.getTotalLength(); - gsap.set(pp, { strokeDasharray: L, strokeDashoffset: L }); - return pp; - }; - tpaths.push([mk(gGlow, ${Math.max(6, Math.round(9 * ky))}), mk(gCore, ${Math.max(2, Math.round(3 * ky))})]); - }); - - // ===== anticipation: a creature approaches — double-beat pre-glow ===== - tl.to("#preglow", { keyframes: { opacity: [0.34, 0.14, 0.46, 0.34], - scale: [0.9, 0.72, 1.08, 0.95] }, - duration: 0.19, ease: "sine.inOut" }, ${Math.max(0.05, I - 0.31).toFixed(3)}); - tl.to("#preglow", { scale: 0.32, opacity: 0.95, duration: 0.1, ease: "power4.in" }, ${Math.max(0.17, I - 0.115).toFixed(3)}); - tl.set("#preglow", { opacity: 0 }, BI); - tl.to("#pocket", { opacity: ${dna.plate.scrim ?? 0.55}, duration: 0.22, ease: "power2.out" }, BI - 0.03); - - // ===== bloom arrival: crush -> contact squash (2f) -> elastic settle ===== - tl.set("#apex", { opacity: 1 }, BI); - tl.fromTo("#apex", { scale: 2.35 }, { scale: 1.0, duration: ${(C - I).toFixed(3)}, ease: "power4.in" }, BI); - tl.fromTo("#aword", { filter: "blur(15px) brightness(2.6)" }, - { filter: "blur(2px) brightness(1.7)", duration: ${(C - I).toFixed(3)}, ease: "power4.in" }, BI); - tl.set("#apex", { scaleX: 1.09, scaleY: 0.93 }, BC); - tl.set("#aword", { filter: "blur(0px) brightness(1.85)" }, BC); - tl.set("#aglow", { opacity: 0.9 }, BC); - tl.set("#spill", { opacity: 0.55 }, BC); - tl.to("#apex", { scaleX: 1, scaleY: 1, duration: 0.5, ease: "elastic.out(1, 0.42)" }, BC + 0.085); - tl.to("#aword", { filter: "blur(0px) brightness(1.45)", duration: 0.34, ease: "power2.out" }, BC + 0.1); - tl.to("#spill", { opacity: 0.2, duration: 0.12, ease: "expo.out" }, BC + 0.07); - - // ===== tendrils draw outward, staggered ===== - tpaths.forEach(([pg, pc], i) => { - const t0 = BC + 0.02 + i * ${stag}; - tl.set(pg, { opacity: 0.5 }, t0); - tl.set(pc, { opacity: 0.95 }, t0); - tl.to([pg, pc], { strokeDashoffset: 0, duration: 0.42, ease: "power2.out" }, t0); - }); -${ - flickD >= 0.25 - ? ` tl.to("#gGlow", { keyframes: { opacity: [0.78, 1, 0.72, 1, 0.82] }, - duration: ${flickD}, ease: "sine.inOut" }, BC + 0.34);` - : "" -} - - // ===== hold: glow breathes strongly (8-14%), caustics counter-drift ===== - tl.to("#aglow", { keyframes: { scale: [1.1, 1.04, 1.13, 1.07], - opacity: [0.78, 0.9, 0.7, 0.85] }, - duration: ${breatheD}, ease: "sine.inOut" }, BC + 0.12); -${ - wordFlickT != null - ? ` tl.to("#aword", { keyframes: { filter: ["blur(0px) brightness(1.6)", "blur(0px) brightness(1.4)", - "blur(0px) brightness(1.62)", "blur(0px) brightness(1.5)"] }, - duration: 0.32, ease: "sine.inOut" }, ${wordFlickT.toFixed(3)});` - : "" -} - tl.to("#cauA", { opacity: 0.06, duration: 0.3, ease: "power1.out" }, BC + 0.02); - tl.to("#cauB", { opacity: 0.06, duration: 0.3, ease: "power1.out" }, BC + 0.07); - tl.fromTo("#cauA", { x: -45 }, { x: 85, duration: ${Math.min(0.95, DUR - 0.06 - (C + 0.02)).toFixed(2)}, ease: "none" }, BC + 0.02); - tl.fromTo("#cauB", { x: 55 }, { x: -75, duration: ${Math.min(0.95, DUR - 0.06 - (C + 0.02)).toFixed(2)}, ease: "none" }, BC + 0.02); - tl.to("#spill", { keyframes: { opacity: [0.13, 0.19, 0.15] }, - duration: ${shimD}, ease: "sine.inOut" }, BC + 0.21); - // deep-sea current: the bloom drifts slowly, revealing letters from behind - // the subject (x channel otherwise unused on #apex) - tl.to("#apex", { x: ${p.drift ?? -30}, duration: ${driftD}, ease: "sine.out" }, BI + 0.21); - - // ===== exit: the light SINKS back into the deep ===== - tl.to("#tndwrap", { y: 14, opacity: 0, duration: 0.2, ease: "power2.in" }, SINK); - tl.to(["#cauA", "#cauB"], { opacity: 0, duration: 0.18, ease: "power1.in" }, SINK + 0.04); - tl.to(["#pocket", "#spill"], { opacity: 0, duration: 0.22, ease: "power1.in" }, SINK + 0.04); - tl.to("#apex", { y: 26, opacity: 0, duration: 0.2, ease: "power2.in" }, SINK + 0.06); - tl.to("#aword", { filter: "blur(6px) brightness(1.2)", duration: 0.2, ease: "power1.in" }, SINK + 0.06); - tl.set("#apex", { display: "none" }, ${Math.min(SINK + 0.28, DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceSilkribbon() { - // ---- setpiece: SILKRIBBON (aurora silk written into the night sky) ---- - // The hero word is WRITTEN behind the subject as a silk ribbon: sequential - // Hershey-stroke reveal (one per pen stroke, constant pen speed) in - // a blurred halo + tight core, BOTH stroked by ONE userSpaceOnUse aurora - // linearGradient (rose→teal→violet, reflect spread). SIGNATURE: the - // gradient's x1/x2 translate f(t) from I−0.07 to the end so the aurora - // colors FLOW THROUGH the drawn ribbon during the hold. A soft light mote - // (blurred halo + core dot) rides the pen, hops at lifts, and blooms out - // at the final stroke. Scene reaction: two huge aurora blobs drift the sky - // f(t) from t=0 (~params.wash) and DEEPEN as the ribbon writes; a top - // scrim (plate.scrim) charges in at I−0.34 (sky washout guard); a light - // spill tints the sky once the ribbon completes, flickering gently; the - // halo breathes through the hold. Gentle — no shake, no contact squash: - // the apex verb is the writing itself. - const h = dna.hero, - p = h.params, - I = heroIn; - // stroke path baked at COMPILE time — any word, zero tuning (drawon pattern) - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = HG.ribbonW || Math.min(p.targetWidth || 880, W - 240); - const svgW = tw + 130, - svgH = 280; - const D = execFileSync( - "python3", - [ - gen, - fontPath, - heroDisplay.toLowerCase(), - String(tw), - "200", - String(Math.round((svgW - tw) / 2)), - ], - { encoding: "utf8" }, - ).trim(); - const ENDT = +(DUR - 0.04).toFixed(3); - // writing window: keep the demo's 0.68s unless the hero lands too late to - // finish + hold before the end of the clip - const WIN = Math.min(p.window || 0.68, Math.max(0.36, ENDT - 0.42 - I)); - const ROSE = dna.palette.rose, - TEAL = dna.palette.accent, - VIO = dna.palette.violet, - DEEP = dna.palette.deep || "#070C24"; - const scrim = (dna.plate || {}).scrim ?? 0.72; - // aurora gradient span rides the ribbon ink (demo: 560 over 880, shift 1.5×span) - const gx1 = Math.round((svgW - tw) / 2), - span = Math.round(tw * 0.6364); - const spillW = tw + 60, - spillH = Math.round((tw + 60) * 0.51); - const css = ` - .aur { position:absolute; border-radius:50%; opacity:0; will-change:transform; } - #aurA { left:${Math.round(-0.141 * W)}px; top:${Math.round(-0.278 * H)}px; width:${Math.round(0.859 * W)}px; height:${Math.round(0.778 * H)}px; - background: radial-gradient(50% 50% at 50% 50%, ${TEAL}d9 0%, ${TEAL}00 70%); } - #aurB { left:${Math.round(0.406 * W)}px; top:${Math.round(-0.361 * H)}px; width:${Math.round(0.922 * W)}px; height:${Math.round(0.833 * H)}px; - background: radial-gradient(50% 50% at 50% 50%, ${ROSE}cc 0%, ${ROSE}00 70%); } - #apexScrim { position:absolute; left:0; top:0; width:${W}px; height:${Math.round(0.653 * H)}px; opacity:0; - background: linear-gradient(to bottom, ${DEEP}${Math.round(scrim * 255) - .toString(16) - .padStart(2, "0")} 0%, ${DEEP}${Math.round(scrim * 0.694 * 255) - .toString(16) - .padStart(2, "0")} 55%, ${DEEP}00 100%); } - #spill { position:absolute; left:${HG.x}px; top:${HG.y}px; width:${spillW}px; height:${spillH}px; - margin-left:-${Math.round(spillW / 2)}px; margin-top:-${Math.round(spillH / 2)}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${TEAL}80 0%, ${VIO}47 45%, ${ROSE}00 75%); } - #silk { position:absolute; left:${HG.x}px; top:${HG.y}px; margin-left:-${Math.round(svgW / 2)}px; - margin-top:-${Math.round(svgH / 2)}px; overflow:visible; } - #coreG { filter: drop-shadow(0 0 6px rgba(255,255,255,0.55)); }`; - const html = `
-
-
-
- - - - - - - - - - - - - - - - `; - const js = ` - // ---- setpiece: SILKRIBBON (sequential silk-stroke reveal, flowing aurora gradient) ---- - const I9 = ${I.toFixed(3)}, WIN = ${WIN.toFixed(3)}, DRAWN = I9 + WIN, ENDT = ${ENDT}; - const D = ${J(D)}; - - // aurora wash: 2 huge soft blobs drifting f(t) (baked keyframes, ease none) - tl.to("#aurA", { opacity: ${p.wash ?? 0.12}, duration: 0.5, ease: "sine.out" }, 0.05); - tl.to("#aurB", { opacity: ${p.wash ?? 0.12}, duration: 0.5, ease: "sine.out" }, 0.15); - tl.to("#aurA", { keyframes: { x: [0, 34, 58, 44, 16, -8, 0], y: [0, 10, 22, 30, 22, 8, 0] }, - duration: ENDT, ease: "none" }, 0); - tl.to("#aurB", { keyframes: { x: [0, -28, -52, -60, -38, -12, 0], y: [0, 14, 8, -6, -16, -8, 0] }, - duration: ENDT, ease: "none" }, 0); - // sky reaction: the aurora deepens while the ribbon writes - tl.to("#aurA", { opacity: ${p.deepen ?? 0.2}, duration: 0.5, ease: "sine.inOut" }, I9 - 0.1); - tl.to("#aurB", { opacity: ${p.deepen ?? 0.2}, duration: 0.5, ease: "sine.inOut" }, I9 - 0.05); - - // apex scrim charges in before the ribbon (sky washout guard) - tl.to("#apexScrim", { opacity: 1, duration: 0.38, ease: "sine.inOut" }, I9 - 0.34); - - // silk ribbon: sequential stroke draw-on, halo + core share the gradient - const subs = D.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNS = "http://www.w3.org/2000/svg"; - function mk(parent, d, w) { - const el = document.createElementNS(SVGNS, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", "url(#agrad)"); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); // hidden until its turn (kills round-cap dot) - document.getElementById(parent).appendChild(el); - return el; - } - const strokes = subs.map((d) => ({ halo: mk("haloG", d, ${p.haloWidth ?? 18}), - core: mk("coreG", d, ${p.coreWidth ?? 6}) })); - let total = 0; - strokes.forEach((s) => { s.len = s.core.getTotalLength(); total += s.len; }); - let t9 = I9; - strokes.forEach((s) => { - const d = WIN * s.len / total; - gsap.set([s.core, s.halo], { strokeDasharray: s.len, strokeDashoffset: s.len }); - tl.set([s.core, s.halo], { opacity: 1 }, t9); - tl.fromTo([s.core, s.halo], { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, t9); - // nib (a soft light mote) rides each stroke, hops at pen lifts - const n = Math.max(4, Math.round(s.len / 14)), xs = [], ys = []; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); - xs.push(pt.x); ys.push(pt.y); - } - tl.set(["#nib", "#nibCore"], { x: xs[0], y: ys[0] }, t9); - tl.to("#nib", { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, t9); - tl.to("#nibCore", { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, t9); - t9 += d; - }); - gsap.set(["#nib", "#nibCore"], { attr: { cx: 0, cy: 0 } }); - tl.set("#nib", { opacity: 0.85 }, I9 - 0.01); - tl.set("#nibCore", { opacity: 1 }, I9 - 0.01); - tl.to("#nib", { scale: 2.4, opacity: 0, duration: 0.22, ease: "sine.in", - transformOrigin: "50% 50%" }, DRAWN); - tl.to("#nibCore", { scale: 2.4, opacity: 0, duration: 0.16, ease: "sine.in", - transformOrigin: "50% 50%" }, DRAWN); - - // SIGNATURE: the gradient FLOWS through the drawn ribbon — translate the - // userSpaceOnUse gradient (x1/x2 together); reflect spread makes the aurora - // colors march continuously along the silk during the hold - tl.fromTo("#agrad", { attr: { x1: ${gx1}, x2: ${gx1 + span} } }, - { attr: { x1: ${gx1 - Math.round(1.5 * span)}, x2: ${gx1 + span - Math.round(1.5 * span)} }, - duration: ENDT - (I9 - 0.07), ease: "none" }, I9 - 0.07); - - // light spill tints the sky as the ribbon completes - tl.to("#spill", { opacity: ${p.spill ?? 0.3}, duration: 0.7, ease: "sine.out" }, I9 + 0.1); - if (ENDT - (I9 + 0.8) > 0.15) { - const SP = ${p.spill ?? 0.3}; - tl.to("#spill", { keyframes: { opacity: [SP, SP - 0.05, SP + 0.01, SP - 0.04, SP] }, - duration: ENDT - (I9 + 0.8), ease: "none" }, I9 + 0.8); - } - // hold life: the halo breathes gently (aurora shimmer) - if (ENDT - DRAWN > 0.1) - tl.to("#haloG", { keyframes: { opacity: [0.85, 0.7, 0.9, 0.72, 0.86] }, - duration: ENDT - DRAWN, ease: "none" }, DRAWN);`; - return { css, html, js }; -} - -function setpieceScopetrace() { - // ---- setpiece: SCOPETRACE (the trace leaps off the scope and WRITES the word) ---- - // A surge column jumps from the scope band up to the pen-start point, then - // the waveform WRITES the hero word in a thin phosphor stroke (sequential - // Hershey stroke reveal — core only, no halo: it is a trace, not a tube). - // The phosphor FILL flicker-arrives 2 frames + a 5-step blink AFTER the - // write completes (scope persistence), hums + breathes 1.6% through the - // hold, then the word COLLAPSES to a flatline (scaleY crush + horizontal - // flash) clearing before the next spoken word. Scene reaction: phosphor - // scrim + green spill behind the subject; a 1-frame green pulse answers the - // final transcript word (the scope-death beat the paradigm owns up front). - const h = dna.hero, - p = h.params, - I = heroIn; - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = HG.traceW; - // strip punctuation for the pen (the demo wrote "pixel size", period dropped) - const traceText = heroDisplay.toLowerCase().replace(/[^\p{L}\p{N} ']/gu, ""); - const svgW = tw + 140, - svgH = 320, - BY = 215, // local baseline; ink center ≈ BY − 28 (demo registration) - CY = BY - 28; - const D = execFileSync( - "python3", - [gen, fontPath, traceText, String(tw), String(BY), String(70)], - { encoding: "utf8" }, - ).trim(); - // surge column lands at the pen-start point (first M of the path) - const m0 = D.match(/M ([\d.]+) ([\d.]+)/); - const surgeX = Math.round(HG.x - svgW / 2 + (m0 ? +m0[1] : 70)); - const WIN = p.window || 0.6; - const FLICK = +(I + WIN + (p.flickGap ?? 0.12)).toFixed(3); - // exit: collapse to flatline CLEAR of the next spoken word (the demo's - // 3.33 before "It's" 3.545); falls back to the hero window end - const nextT = tWords - .filter((w) => w.start > hero.end + 0.01) - .map((w) => w.start) - .sort((a, b) => a - b)[0]; - let EXIT = nextT != null ? nextT - (p.clearGap ?? 0.215) : heroOut - 0.2; - EXIT = +Math.max(FLICK + 0.45, Math.min(EXIT, heroOut)).toFixed(3); - const A = dna.palette.accent, - BRT = dna.palette.bright || "#d6ffe4"; - const scrim = dna.plate.scrim ?? 0.62; - const ox = ((HG.x / W) * 100).toFixed(1), - oy = ((HG.y / H) * 100).toFixed(1); - const spillW = tw + 260, - spillH = Math.round((tw + 260) * 0.47); - const css = ` - #scdim { position:absolute; inset:0; opacity:0; - background: radial-gradient(90% 75% at ${ox}% ${oy}%, rgba(1,14,7,${scrim}) 0%, rgba(1,10,5,${(scrim * 0.55).toFixed(2)}) 60%, rgba(1,8,4,${(scrim * 0.19).toFixed(2)}) 100%); } - #scspill { position:absolute; left:${HG.x}px; top:${HG.y}px; width:${spillW}px; height:${spillH}px; - margin-left:-${Math.round(spillW / 2)}px; margin-top:-${Math.round(spillH / 2)}px; border-radius:50%; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${A}33 0%, ${A}00 70%); } - #scsurge { position:absolute; left:${surgeX}px; top:0; width:3px; height:${H}px; opacity:0; - background: linear-gradient(180deg, ${A}00 0%, ${BRT}f2 45%, ${A}80 100%); - box-shadow: 0 0 12px ${A}cc; } - #scblk { position:absolute; inset:0; } - #scsvg { position:absolute; left:${HG.x}px; top:${HG.y}px; margin-left:-${Math.round(svgW / 2)}px; - margin-top:-${CY}px; overflow:visible; } - #schaloG { filter: blur(7px); opacity:0.85; } - #sccoreG { filter: drop-shadow(0 0 4px ${BRT}e6) drop-shadow(0 0 14px ${A}); } - #scpen { filter: drop-shadow(0 0 7px #fff) drop-shadow(0 0 20px ${A}); } - #scflat { position:absolute; left:${Math.round(HG.x - (tw + 36) / 2)}px; top:${HG.y - 2}px; - width:${tw + 36}px; height:4px; opacity:0; - background:${BRT}; box-shadow: 0 0 18px ${A}, 0 0 42px ${A}b3; } - #scpulse { position:absolute; inset:0; opacity:0; - background: radial-gradient(70% 60% at 50% 60%, ${A}38 0%, rgba(0,0,0,0) 70%); }`; - const html = `
-
-
-
- - - - - -
-
-
`; - const js = ` - // ---- setpiece: SCOPETRACE (surge → pen write → fill flicker → hum → flatline) ---- - const I = ${I.toFixed(3)}, WIN = ${WIN}, DRAWN = I + WIN, FLICK = ${FLICK.toFixed(3)}, EXIT = ${EXIT.toFixed(3)}; - const D = ${J(D)}; - - // scene reaction: phosphor scrim + spill while the trace owns the room - tl.fromTo("#scdim", { opacity: 0 }, { opacity: 1, duration: 0.22, ease: "power2.in" }, I - 0.18); - tl.to("#scdim", { opacity: 0, duration: 0.30, ease: "power1.in" }, EXIT + 0.05); - tl.fromTo("#scspill", { opacity: 0 }, { opacity: ${p.spill ?? 0.55}, duration: WIN, ease: "power1.in" }, I); - tl.to("#scspill", { opacity: 0, duration: 0.18, ease: "power2.in" }, EXIT); - - // surge: the trace leaps up from the scope band to the pen-start point - tl.fromTo("#scsurge", { opacity: 0, scaleY: 0, transformOrigin: "50% 100%" }, - { opacity: 1, scaleY: 1, duration: 0.10, ease: "power3.in" }, I - 0.12); - tl.set("#scsurge", { opacity: 0 }, I + 0.04); - - // sequential stroke draw-on (one per pen lift; core writes, halo waits) - const subs = D.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNS = "http://www.w3.org/2000/svg"; - function mkP(parent, d, stroke, w) { - const el = document.createElementNS(SVGNS, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", stroke); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); - document.getElementById(parent).appendChild(el); - return el; - } - const strokes = subs.map((d) => ({ - halo: mkP("schaloG", d, ${J(A)}, ${p.haloWidth || 14}), - core: mkP("sccoreG", d, ${J(BRT)}, ${p.coreWidth || 4}), - })); - let total = 0; - strokes.forEach((s) => { s.len = s.core.getTotalLength(); total += s.len; }); - const scpen = document.getElementById("scpen"); - let t = I; - strokes.forEach((s) => { - const d = WIN * s.len / total; - gsap.set([s.core, s.halo], { strokeDasharray: s.len, strokeDashoffset: s.len }); - gsap.set(s.halo, { opacity: 0 }); // halo arrives at FLICK, not during write - tl.set(s.core, { opacity: 1 }, t); - tl.fromTo(s.core, { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, t); - tl.fromTo(s.halo, { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, t); - const n = Math.max(4, Math.round(s.len / 14)), xs = [], ys = []; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); - xs.push(pt.x); ys.push(pt.y); - } - tl.set(scpen, { x: xs[0], y: ys[0] }, t); - tl.to(scpen, { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, t); - t += d; - }); - gsap.set(scpen, { attr: { cx: 0, cy: 0 } }); - tl.set(scpen, { opacity: 1 }, I - 0.01); - tl.to(scpen, { scale: 2.4, opacity: 0, duration: 0.12, ease: "power2.in", - transformOrigin: "50% 50%" }, DRAWN); - - // fill flicker-on (halo = phosphor "fill"; full within 2 frames) - tl.set("#schaloG", { opacity: 0 }, 0); - const haloPaths = strokes.map(s => s.halo); - tl.set(haloPaths, { opacity: 1 }, FLICK - 2 * F); // pre-arm strokes - [[1, 0], [0.25, 1], [1, 2], [0.55, 3], [1, 4]].forEach(([o, k]) => { - tl.set("#schaloG", { opacity: o }, FLICK + k * F); - }); - tl.set("#sccoreG", { opacity: 0.55 }, FLICK + F); - tl.set("#sccoreG", { opacity: 1 }, FLICK + 2 * F); - - // hold life: glow hum + 1.6% breathe (breathe ends exactly at the collapse) - const humStart = FLICK + 5 * F, humDur = Math.max(0.2, EXIT - humStart); - const NH = Math.max(6, Math.round(humDur / (2 * F))); - const humVals = []; - for (let k = 0; k <= NH; k++) { - const tt = k / NH * humDur; - humVals.push(0.80 + 0.10 * Math.sin(2 * Math.PI * 7 * tt) + 0.06 * Math.sin(2 * Math.PI * 11.3 * tt + 0.9)); - } - tl.to("#schaloG", { keyframes: { opacity: humVals }, duration: humDur, ease: "none" }, humStart); - tl.fromTo("#scblk", { scale: 1, transformOrigin: "${ox}% ${oy}%" }, - { scale: 1.016, duration: humDur, ease: "sine.inOut" }, humStart); - - // exit: trace collapses back to a flatline (the scope takes the word back) - tl.to("#scblk", { scaleY: 0.02, duration: 0.14, ease: "power3.in", - transformOrigin: "${ox}% ${oy}%" }, EXIT); - tl.set("#scblk", { opacity: 0 }, EXIT + 0.15); - tl.set("#scflat", { opacity: 1 }, EXIT + 0.13); - tl.to("#scflat", { opacity: 0, scaleX: 0.1, duration: 0.16, ease: "power2.in", - transformOrigin: "50% 50%" }, EXIT + 0.15); - - // second beat: 1-frame phosphor pulse behind the subject on the death word - tl.set("#scpulse", { opacity: 1 }, ${Math.min(LASTWORD.start, DUR - 0.15).toFixed(3)}); - tl.set("#scpulse", { opacity: 0.4 }, ${Math.min(LASTWORD.start + F, DUR - 0.1).toFixed(3)}); - tl.set("#scpulse", { opacity: 0 }, ${Math.min(LASTWORD.start + 2 * F, DUR - 0.05).toFixed(3)});`; - return { css, html, js }; -} - -function setpiecePapermat() { - // STOP-MOTION PAPERCUT EMBED: a torn-edge kraft mat drops onto the scene - // (steps(2) slap), then one torn cream chip per char DROPS with steps(3) - // gravity + 1-frame overshoot, lands crooked (seeded ±3° ±4px), settles in - // three 12fps poses and holds an 8fps wobble (baked set chain) until the - // FINAL word bumps the table and the chips SCATTER off down-right - // (disperse-on-last-word). Scene reaction: warm vignette charges with the - // landing. All geometry derives from HG (papermat branch). - const p = dna.hero.params || {}, - I = heroIn; - const N = heroText.length; - const STEP = p.step ?? 0.09; - const tileW = HG.tileW, - tileH = HG.tileH, - fpx = HG.fontPx, - pitch = HG.pitch, - matW = HG.matW, - matH = HG.matH; - const matT = +Math.max(0.02, I - 0.212).toFixed(3); - // scatter trigger: the final word bumps the table (hero.exitAt overrides); - // the whole exit (chips 0.30 + mat sweep 0.26 at +0.21) lands inside DUR - const scatT = +Math.min( - Math.max( - I + (N - 1) * STEP + 0.5, - Math.min( - theme.hero.exitAt ?? LASTWORD.start + 0.02, - DUR - 0.48, - DUR - 0.32 - (N - 1) * 0.045, - ), - ), - DUR - 0.48, - ).toFixed(3); - const VIG = p.vig ?? 0.3; - const dropM = -(HG.y + matH / 2 + 50); // mat fully offscreen above - const dropL = -(HG.y + tileH / 2 + 100); // chips fully offscreen above - // tableau breathe windows (camera push feel), clamped before the scatter - const T1 = +(I + 0.83).toFixed(3); - const D1 = +Math.min(2.2, scatT - 0.3 - T1).toFixed(2); - const T2 = +(T1 + Math.max(0, D1)).toFixed(3); - const D2 = +Math.min(1.9, scatT - 0.15 - T2).toFixed(2); - const vigSettleT = +Math.min(matT + 0.79, scatT - 0.85).toFixed(3); - const css = ` - #vigP { position:absolute; inset:0; opacity:0; - background: radial-gradient(120% 105% at ${((HG.x / W) * 100).toFixed(0)}% ${((HG.y / H) * 100).toFixed(0)}%, rgba(0,0,0,0) 38%, rgba(26,16,5,0.85) 100%); } - #apx { position:absolute; left:${HG.x}px; top:${HG.y}px; width:0; height:0; } - #mat { position:absolute; left:${-Math.round(matW / 2)}px; top:${-Math.round(matH / 2)}px; width:${matW}px; height:${matH}px; } - #mat .pap { position:absolute; inset:0; background:linear-gradient(178deg,#bd9d6c 0%,#b08f5d 55%,#a17f4c 100%); } - #mat .pap2 { position:absolute; inset:7px; background:rgba(140,110,62,0.35); } - #matshad { position:absolute; left:${-Math.round(matW / 2) + 2}px; top:${Math.round(matH / 2) - 18}px; width:${matW + 6}px; height:30px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(25,15,5,0.55) 0%, rgba(25,15,5,0) 72%); - filter: blur(5px); } - .lshad { position:absolute; width:${Math.round(tileW * 1.08)}px; height:24px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, rgba(28,17,6,0.6) 0%, rgba(28,17,6,0) 70%); - filter: blur(4px); } - .lchip { position:absolute; width:${tileW}px; height:${tileH}px; } - .lchip .pap { position:absolute; inset:0; background:${dna.palette.paper || "#f8f0dd"}; } - .lchip .pap2 { position:absolute; inset:5px; background:${dna.palette.paper2 || "#efe3c6"}; } - .lchip .gl { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; - font-family:'${dna.fonts.hero}', sans-serif; font-size:${fpx}px; line-height:1; color:${dna.palette.ink || "#2b241b"}; }`; - const html = `
-
-
-
-
`; - const js = ` - // ---- setpiece: PAPERMAT (mat slap → stepped-gravity chip drops → 8fps wobble → table-bump scatter) ---- - const I = ${I.toFixed(3)}, STEP = ${STEP}, SCAT = ${scatT}; - const prnd = mulberry32(${p.seed || 151515}); - const apx = document.getElementById("apx"); - // seeded torn-paper polygon (px coords on a w×h box) - function torn(w, h, jag, sx, sy, rr){ - const pts = [], j = () => Math.min(jag, Math.max(0, jag*0.5 + (rr()-0.5)*jag)); - for (let i=0; i<=sx; i++) pts.push([(w/sx)*i, j()]); - for (let i=1; i<=sy; i++) pts.push([w - j(), (h/sy)*i]); - for (let i=sx-1; i>=0; i--) pts.push([(w/sx)*i, h - j()]); - for (let i=sy-1; i>=1; i--) pts.push([j(), (h/sy)*i]); - return "polygon(" + pts.map(q => q[0].toFixed(1)+"px "+q[1].toFixed(1)+"px").join(",") + ")"; - } - document.querySelector("#mat .pap").style.clipPath = torn(${matW}, ${matH}, 12, 12, 4, prnd); - document.querySelector("#mat .pap2").style.clipPath = torn(${matW - 14}, ${matH - 14}, 10, 12, 4, prnd); - - // ===== MAT: the animator slaps the backdrop down first ===== - gsap.set("#mat", { transformOrigin: "50% 100%" }); - tl.fromTo("#mat", { y: ${dropM}, rotation: -5 }, - { y: 6, rotation: -1.2, duration: 0.14, ease: "steps(2)" }, ${matT}); - tl.set("#mat", { scaleY: 0.97, scaleX: 1.02 }, ${(matT + 0.14).toFixed(3)}); - tl.set("#mat", { y: 0, scaleY: 1, scaleX: 1 }, ${(matT + 0.223).toFixed(3)}); - tl.set("#matshad", { opacity: 0.32 }, ${(matT + 0.14).toFixed(3)}); - for (let t = ${(matT + 0.54).toFixed(3)}; t < ${(scatT - 0.08).toFixed(3)}; t += 0.25) - tl.set("#mat", { x: (prnd()-0.5)*1.6, y: (prnd()-0.5)*1.6, rotation: -1.2 + (prnd()-0.5)*0.7 }, t); - // mat leaves last, swept off down-right - tl.to("#mat", { x: 430, y: ${H - 40}, rotation: 13, duration: 0.26, ease: "steps(3)" }, ${(scatT + 0.21).toFixed(3)}); - tl.set("#matshad", { opacity: 0 }, ${(scatT + 0.25).toFixed(3)}); - - // ===== SCENE REACTION: warm vignette charges with the landing ===== - tl.fromTo("#vigP", { opacity: 0 }, { opacity: ${VIG}, duration: 0.24, ease: "power2.in" }, ${matT}); - tl.to("#vigP", { opacity: ${(VIG * 0.4).toFixed(2)}, duration: 0.7, ease: "power2.out" }, ${vigSettleT}); - tl.to("#vigP", { opacity: 0, duration: 0.35, ease: "power1.in" }, ${(scatT - 0.11).toFixed(3)}); - - // ===== LETTERS: torn chips drop with stepped gravity ===== - const GLYPHS = ${J([...heroText])}; - GLYPHS.forEach((ch, i) => { - if (ch === " ") return; - const cx = (i - ${((N - 1) / 2).toFixed(1)}) * ${pitch} + (prnd()-0.5)*8; // seeded ±4px misalignment - const jy = (prnd()-0.5)*8; - const r0 = (prnd()-0.5)*6; // seeded ±3° crooked landing - const C = I + i * STEP; - - const shad = document.createElement("div"); - shad.className = "lshad"; - shad.style.left = (cx - ${Math.round((tileW * 1.08) / 2)}) + "px"; - shad.style.top = (${Math.round(tileH / 2) + 3} + jy*0.3) + "px"; - apx.appendChild(shad); - - const chip = document.createElement("div"); - chip.className = "lchip"; - chip.style.left = (cx - ${Math.round(tileW / 2)}) + "px"; - chip.style.top = (${-Math.round(tileH / 2)} + jy) + "px"; - const pap = document.createElement("div"); pap.className = "pap"; - const pap2 = document.createElement("div"); pap2.className = "pap2"; - const gl = document.createElement("div"); gl.className = "gl"; gl.textContent = ch; - pap.style.clipPath = torn(${tileW}, ${tileH}, 8, 6, 7, prnd); - pap2.style.clipPath = torn(${tileW - 10}, ${tileH - 10}, 6, 6, 7, prnd); - chip.appendChild(pap); chip.appendChild(pap2); chip.appendChild(gl); - apx.appendChild(chip); - gsap.set(chip, { transformOrigin: "50% 100%" }); - - // anticipation shadow blob appears on the landing spot 3 frames early - tl.set(shad, { opacity: 0.16, scaleX: 1.35 }, C - 0.125); - // DROP: two airborne poses then contact — steps(3) gravity, 1-frame overshoot - tl.fromTo(chip, { y: ${dropL}, rotation: r0 - 8 }, - { y: 8, rotation: r0, duration: 0.21, ease: "steps(3)" }, C - 0.21); - tl.set(chip, { scaleX: 1.07, scaleY: 0.90 }, C); // contact squash - tl.set(shad, { opacity: 0.50, scaleX: 1 }, C); // shadow grows on land - tl.set(chip, { y: -4, scaleY: 1.05, scaleX: 0.97 }, C + 0.0833); // 12fps settle pose 1 - tl.set(chip, { y: 2, scaleY: 0.98, scaleX: 1.01 }, C + 0.1667); // pose 2 - tl.set(chip, { y: 0, scaleY: 1, scaleX: 1 }, C + 0.25); // rest - tl.to(shad, { opacity: 0.34, duration: 0.3, ease: "power1.out" }, C + 0.30); - - // HOLD: 8fps wobble — baked sets every 3 frames (the stop-motion heartbeat) - for (let t = C + 0.50; t < SCAT - 0.13; t += 0.125) - tl.set(chip, { rotation: r0 + (prnd()-0.5)*1.4, x: (prnd()-0.5)*1.4, y: (prnd()-0.5)*1.4 }, t); - - // SCATTER on the final word — chips slide off-table down-right, steps(4) - const S = SCAT + i*0.045; - tl.to(chip, { x: 250 + prnd()*200, y: ${H - 110} + prnd()*110, rotation: r0 + 28 + prnd()*24, - duration: 0.30, ease: "steps(4)" }, S); - tl.set(shad, { opacity: 0 }, S + 0.06); - }); -${ - D1 >= 0.4 - ? ` - // hold loom: the whole tableau breathes very slowly (camera push feel) - tl.to("#apx", { scale: 1.016, duration: ${D1}, ease: "sine.inOut" }, ${T1}); -${D2 >= 0.3 ? ` tl.to("#apx", { scale: 1.004, duration: ${D2}, ease: "sine.inOut" }, ${T2});` : ""}` - : "" -} - // table bump, 1 frame before the scatter begins - tl.set("#apx", { y: 4 }, ${(scatT - 0.041).toFixed(3)}); - tl.set("#apx", { y: 0 }, ${(scatT + 0.001).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceCenterfold() { - // POP-UP BOOK CENTERFOLD: blue + cream 12-point paper starbursts unfold on a - // baseline hinge (scaleY 0.03→1 back.out, staggered), then the hero word - // pops up in hinged clip-path segments (rotationX 85→0, the body motif at - // full amplitude), kraft struts lean in, backdrop + word wobble-settle - // TOGETHER (one wrapper owns rotationX), breathe through the hold, and the - // whole centerfold folds flat at heroOut (the book closing). A dusk scrim - // charges behind it (bright-sky insurance). Geometry derives from HG. - const p = dna.hero.params || {}, - I = heroIn; - const segs = p.segs || 3, - stag = p.segStagger ?? 0.07; - const u = HG.burstR / 220; // prop scale (demo burst R 220) - const boxW = HG.boxW, - boxH = HG.boxH; - const cx = Math.round(boxW / 2), - cy = Math.round(boxH / 2); - const lineH = Math.round(HG.fontPx * 1.1667); - const wordTop = Math.round(cy - 24 * u - lineH / 2); // word center 24u above box center - const R1 = HG.burstR, - r1 = Math.round(0.673 * R1), - R2 = Math.round(0.9 * R1), - r2 = Math.round(0.555 * R1); - const strokeW = Math.max(2, Math.round(3 * u)); - // exit start: fold flat before the next sentence (demo 3.28 = heroOut−0.33), - // never before the pop + wobble have read, always complete by DUR−0.08 - const XO = +Math.max(I + (segs - 1) * stag + 0.45, Math.min(heroOut - 0.33, DUR - 0.39)).toFixed( - 3, - ); - const scrimT = +Math.max(0.02, I - 0.272).toFixed(3); - const blueT = +Math.max(0.04, I - 0.272).toFixed(3); - const wobT = +(I + 0.428).toFixed(3); - const wobD = +Math.min(0.7, XO - 0.05 - (I + 0.428)).toFixed(2); - const brT = +(I + 1.178).toFixed(3); - const brD = +Math.min(1.7, XO - 0.15 - (I + 1.178)).toFixed(2); - const segClips = Array.from({ length: segs }, (_, i) => { - const lp = ((i * 100) / segs).toFixed(1), - rp = (((segs - 1 - i) * 100) / segs).toFixed(1); - return ` #cfsg${i} { clip-path: inset(0 ${rp}% 0 ${lp}%); }`; - }).join("\n"); - const css = ` - #cfscrim { position:absolute; inset:0; opacity:0; - background: radial-gradient(46% 54% at ${((HG.x / W) * 100).toFixed(0)}% ${(((HG.y + 24 * u) / H) * 100).toFixed(0)}%, - rgba(16,24,42,0.62) 0%, rgba(16,24,42,0.34) 55%, rgba(16,24,42,0) 100%); } - #cf { position:absolute; left:${HG.x}px; top:${Math.round(HG.y + 24 * u)}px; width:${boxW}px; height:${boxH}px; } - #cfWob { position:absolute; inset:0; } - .cfburst { position:absolute; inset:0; opacity:0; } - #cfShadow { position:absolute; left:50%; top:${Math.round(cy + 172 * u)}px; width:${Math.round(380 * u)}px; height:${Math.round(30 * u)}px; - margin-left:${-Math.round(190 * u)}px; opacity:0; filter:blur(6px); border-radius:50%; - background: radial-gradient(closest-side, rgba(22,14,5,0.55), rgba(22,14,5,0)); } - .cfstrut { position:absolute; width:${Math.round(36 * u)}px; height:${Math.round(30 * u)}px; opacity:0; - background: linear-gradient(135deg,${dna.palette.kraft1 || "#a98f5e"} 0%, ${dna.palette.kraft2 || "#cdbb92"} 45%, ${dna.palette.kraft3 || "#e6d6af"} 100%); - filter: drop-shadow(0 2px 2px rgba(40,26,10,0.35)); - clip-path: polygon(0 100%, 100% 100%, 100% 0); } - #cfs1 { left:${Math.round(cx - 134 * u)}px; top:${Math.round(cy + 28 * u)}px; } - #cfs2 { left:${Math.round(cx + 98 * u)}px; top:${Math.round(cy + 28 * u)}px; transform:scaleX(-1); } - #cfword { position:absolute; left:0; right:0; top:${wordTop}px; height:${lineH}px; } - .cfseg { position:absolute; inset:0; opacity:0; text-align:center; - font-family:'${dna.fonts.hero}', sans-serif; font-weight:800; font-size:${HG.fontPx}px; - line-height:${lineH}px; letter-spacing:0.02em; color:${dna.palette.ink || dna.palette.body}; - text-shadow: 0 3px 10px rgba(56,38,14,0.32); } -${segClips}`; - const html = `
-
-
- - - - - - -
-
-
-
-${Array.from({ length: segs }, (_, i) => `
${esc(heroText)}
`).join("\n")} -
-
-
`; - const js = ` - // ---- setpiece: CENTERFOLD (starburst unfold → hinged segment pop → wobble-settle → fold flat) ---- - const I = ${I.toFixed(3)}, XO = ${XO}; - // deterministic starburst geometry (paper sun) - function starPts(cx, cy, n, R, r, rot) { - const p = []; - for (let i = 0; i < n * 2; i++) { - const a = rot + Math.PI * i / n, rad = (i % 2 === 0) ? R : r; - p.push((cx + Math.cos(a) * rad).toFixed(1) + "," + (cy + Math.sin(a) * rad).toFixed(1)); - } - return p.join(" "); - } - document.getElementById("cfpB").setAttribute("points", starPts(${cx}, ${cy}, 12, ${R1}, ${r1}, -Math.PI/2 + 0.13)); - document.getElementById("cfpC").setAttribute("points", starPts(${cx}, ${cy}, 12, ${R2}, ${r2}, -Math.PI/2)); - - gsap.set("#cf", { xPercent: -50, yPercent: -50 }); - gsap.set("#cfWob", { transformPerspective: 900, transformOrigin: "50% 82%" }); - gsap.set(".cfburst", { transformOrigin: "50% 90%", scaleY: 0.03 }); - gsap.set(".cfseg", { transformPerspective: 800, transformOrigin: "50% 100%", rotationX: 85 }); - gsap.set(".cfstrut", { transformOrigin: "50% 100%", scaleY: 0 }); - gsap.set("#cfShadow", { scaleX: 0.3 }); - - // scrim charges before the unfold (bright sky insurance) - tl.to("#cfscrim", { opacity: ${p.scrim ?? 0.42}, duration: 0.28, ease: "power2.out" }, ${scrimT}); - - // backdrop unfolds FIRST — baseline hinge, paper overshoot - tl.set("#cfbBlue", { opacity: 1 }, ${blueT}); - tl.to("#cfbBlue", { scaleY: 1, duration: 0.26, ease: "back.out(1.6)" }, ${blueT}); - tl.set("#cfbCream", { opacity: 1 }, ${(+blueT + 0.06).toFixed(3)}); - tl.to("#cfbCream", { scaleY: 1, duration: 0.26, ease: "back.out(1.6)" }, ${(+blueT + 0.06).toFixed(3)}); - tl.to("#cfShadow", { opacity: 0.45, scaleX: 1, duration: 0.30, ease: "power2.out" }, ${(+blueT + 0.03).toFixed(3)}); - - // the word pops up in hinged segments (left→right), staggered - for (let i = 0; i < ${segs}; i++) { - const t0 = I + i * ${stag}, el = "#cfsg" + i; - tl.set(el, { opacity: 1 }, t0); // 1 within 2 frames - tl.to(el, { rotationX: 0, duration: 0.26, ease: "back.out(1.4)" }, t0); - } - - // visible paper struts lean in behind the word - tl.set(".cfstrut", { opacity: 1 }, ${(I + 0.328).toFixed(3)}); - tl.to("#cfs1", { scaleY: 1, duration: 0.12, ease: "back.out(2)" }, ${(I + 0.328).toFixed(3)}); - tl.to("#cfs2", { scaleY: 1, duration: 0.12, ease: "back.out(2)" }, ${(I + 0.378).toFixed(3)}); -${ - wobD >= 0.2 - ? ` - // backdrop + word wobble-settle TOGETHER (one wrapper owns it) - tl.to("#cfWob", { keyframes: { rotationX: [0, -3.6, 2.4, -1.3, 0.6, 0] }, - duration: ${wobD}, ease: "sine.inOut" }, ${wobT});` - : "" -} -${ - brD >= 0.5 - ? ` - // hold life: slow paper breathing through the silence - tl.to("#cfWob", { keyframes: { rotationX: [0, 1.5, -1.1, 1.3, 0] }, - duration: ${brD}, ease: "sine.inOut" }, ${brT}); - tl.to("#cfShadow", { keyframes: { scaleX: [1, 1.05, 0.98, 1.04, 1] }, - duration: ${brD}, ease: "sine.inOut" }, ${brT});` - : "" -} - - // EXIT — the centerfold folds flat (book closing) - for (let i = 0; i < ${segs}; i++) { - const ft = XO + i * 0.05, el = "#cfsg" + i; - tl.to(el, { rotationX: 88, duration: 0.14, ease: "power2.in" }, ft); - tl.set(el, { opacity: 0 }, ft + 0.15); - } - tl.to(".cfstrut", { scaleY: 0, duration: 0.10, ease: "power2.in" }, XO + 0.02); - tl.to("#cfbCream", { scaleY: 0.03, duration: 0.13, ease: "power2.in" }, XO + 0.12); - tl.set("#cfbCream", { opacity: 0 }, XO + 0.26); - tl.to("#cfbBlue", { scaleY: 0.03, duration: 0.12, ease: "power2.in" }, XO + 0.18); - tl.set("#cfbBlue", { opacity: 0 }, XO + 0.31); - tl.to("#cfShadow", { opacity: 0, scaleX: 0.3, duration: 0.16, ease: "power1.in" }, XO + 0.14); - tl.to("#cfscrim", { opacity: 0, duration: 0.28, ease: "power1.in" }, XO + 0.02);`; - return { css, html, js }; -} - -function setpieceChalkwrite() { - // ---- setpiece: CHALKWRITE (the board grows and a hand WRITES the word) ---- - // The lower chalk band grows into a FULL deep-green board behind the subject - // 0.3s before the apex (scaleY power3.out from the bottom edge, the room - // dims with it); the hero word is HAND-WRITTEN in chalk — sequential Hershey - // stroke reveal (drawon pattern), dry/rough via seeded ±1px jitter baked - // onto every pen point, a blurred halo under a tight core, a chalk-stick - // nib riding the pen — while dust specks fall from the nib. On completion a - // hand-slap CLAP shakes the board 1 frame (the dust burst lives in the - // rail, in FRONT of the subject: fx.chalkclap), then TWO violent - // accelerating underlines slash beneath (nib rides them, dust kicks at the - // ends), the chalk flicks away, and the halo breathes through the hold with - // two slow motes drifting off the letters. - const h = dna.hero, - p = h.params, - I = heroIn; - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = HG.chalkW; - const x0 = Math.round(HG.x - tw / 2); - let D = execFileSync( - "python3", - [gen, fontPath, heroDisplay.toLowerCase(), String(tw), "450", String(x0)], - { encoding: "utf8" }, - ).trim(); - // register the measured ink box on HG (ink CENTER lands on HG.y), then the - // board rect, underlines and the fg clap all derive from the same box - const pts = [...D.matchAll(/[ML] ([-\d.]+) ([-\d.]+)/g)].map((m) => [+m[1], +m[2]]); - const ys0 = pts.map((q) => q[1]); - const dy = +(HG.y - (Math.min(...ys0) + Math.max(...ys0)) / 2).toFixed(1); - D = D.replace(/([ML]) ([-\d.]+) ([-\d.]+)/g, (m, c, x, y) => `${c} ${x} ${(+y + dy).toFixed(1)}`); - const inkTop = Math.min(...ys0) + dy, - inkBot = Math.max(...ys0) + dy, - inkH = inkBot - inkTop; - const inkL = Math.min(...pts.map((q) => q[0])), - inkR = Math.max(...pts.map((q) => q[0])); - // board: full strip width, grows from the bottom edge up past the ink - // (demo: ink top 320, board top 248 → gap 0.554 × ink height 130) - const stripW = (dna.body.strip && dna.body.strip.w) || 1200; - const SX = (dna.body.strip && dna.body.strip.x) ?? Math.round((W - stripW) / 2); - const boardTop = Math.max(40, Math.round(inkTop - (p.boardGap ?? 0.554) * Math.max(inkH, 90))); - const boardH = H - boardTop; - const kw = stripW / 1200, - kb = boardH / 472; // board furniture scales with the demo rect (1200×472) - const ENDT = +(DUR - 0.04).toFixed(3); - // writing window: keep the demo's 0.78s unless the hero lands too late to - // finish + underline + hold before the end of the clip - const WIN = Math.min(p.window || 0.78, Math.max(0.4, ENDT - 0.95 - I)); - const DRAWN = +(I + WIN).toFixed(3); - // hand-off to the fg dust clap: the pen's final contact point, at write end - HG.clapX = Math.round(pts[pts.length - 1][0]); - HG.clapY = Math.round(pts[pts.length - 1][1] + dy); - HG.clapT = DRAWN; - const CHALK = dna.palette.chalk || dna.palette.accent || "#fbf9ef"; - const DUST = dna.palette.dust || "#f6f4e9"; - const css = ` - #cwDim { position:absolute; inset:0; background:${p.dimColor || "rgba(4,14,9,0.95)"}; opacity:0; } - #cwVig { position:absolute; inset:0; opacity:0; - background: radial-gradient(75% 70% at 50% 45%, rgba(0,0,0,0) 55%, rgba(2,10,6,0.55) 100%); } - #cwUnit { position:absolute; inset:0; } - #cwBoard { position:absolute; left:${SX}px; top:${boardTop}px; width:${stripW}px; height:${boardH}px; - background: linear-gradient(180deg, ${dna.palette.boardHi || "#22392c"} 0%, ${dna.palette.board || "#1d3328"} 40%, ${dna.palette.boardLo || "#182b22"} 100%); - border-radius:6px 6px 0 0; - box-shadow: inset 0 0 90px rgba(0,0,0,0.55), 0 6px 24px rgba(0,0,0,0.45); } - #cwRim { position:absolute; top:0; left:0; right:0; height:7px; opacity:0.85; - border-radius:6px 6px 0 0; - background: linear-gradient(180deg, ${dna.palette.rim || "#8a6a48"} 0%, ${dna.palette.rimLo || "#5f452c"} 100%); } - #cwBoard .bsm { position:absolute; border-radius:50%; } - #cwBsm1 { left:${Math.round(120 * kw)}px; top:${Math.round(90 * kb)}px; width:${Math.round(430 * kw)}px; height:${Math.round(150 * kb)}px; transform:rotate(-5deg); - background: radial-gradient(50% 50% at 50% 50%, rgba(214,226,214,0.08) 0%, rgba(214,226,214,0) 70%); } - #cwBsm2 { left:${Math.round(660 * kw)}px; top:${Math.round(230 * kb)}px; width:${Math.round(380 * kw)}px; height:${Math.round(130 * kb)}px; transform:rotate(4deg); - background: radial-gradient(50% 50% at 50% 50%, rgba(214,226,214,0.07) 0%, rgba(214,226,214,0) 70%); } - #cwSvg { position:absolute; left:0; top:0; overflow:visible; } - #cwHaloG { opacity:${p.halo ?? 0.18}; } - #cwCoreG { opacity:0.92; }`; - const html = `
-
-
-
-
-
-
-
- - - - - - - - - - - -
`; - const js = ` - // ---- setpiece: CHALKWRITE (board grows; the hero word is hand-written in chalk) ---- - const I8 = ${I.toFixed(3)}, WIN8 = ${WIN.toFixed(3)}, DRAWN = ${DRAWN}, ENDT = ${ENDT}; - const D8 = ${J(D)}; - const crnd = mulberry32(${p.seed ?? 7}); - - // scene reaction: vignette early; the room dims as the board grows - tl.fromTo("#cwVig", { opacity: 0 }, { opacity: ${p.vig ?? 0.35}, duration: 0.35, ease: "power1.out" }, 0.10); - tl.fromTo("#cwDim", { opacity: 0 }, { opacity: ${p.dim ?? 0.22}, duration: 0.30, ease: "power1.in" }, ${(I - 0.3).toFixed(3)}); - - // the board grows taller 0.3s before the writing - gsap.set("#cwBoard", { scaleY: 0, transformOrigin: "50% 100%" }); - tl.to("#cwBoard", { scaleY: 1, duration: 0.30, ease: "power3.out" }, ${(I - 0.3).toFixed(3)}); - - // chalk strokes: dry/rough = baked ±1px y jitter on every pen point - const jrnd = mulberry32(${p.jitterSeed ?? 21}); - const jD = D8.replace(/([ML]) ([-\\d.]+) ([-\\d.]+)/g, - (m, c, x, y) => c + " " + x + " " + (parseFloat(y) + (jrnd()*2 - 1)).toFixed(1)); - const subs = jD.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNS8 = "http://www.w3.org/2000/svg"; - function mk(parent, d, stroke, w) { - const el = document.createElementNS(SVGNS8, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", stroke); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); - document.getElementById(parent).appendChild(el); - return el; - } - const strokes = subs.map((d) => ({ - halo: mk("cwHaloG", d, "#ffffff", ${p.haloWidth ?? 14}), - core: mk("cwCoreG", d, ${J(CHALK)}, ${p.coreWidth ?? 7}), - })); - let total = 0; - strokes.forEach((s) => { s.len = s.core.getTotalLength(); total += s.len; }); - const nib = document.getElementById("cwNib"); - gsap.set(nib, { rotation: -36, transformOrigin: "50% 50%" }); - let acc = 0; - const cum = []; // cumulative starts per stroke - strokes.forEach((s) => { cum.push(acc); acc += s.len; }); - strokes.forEach((s, si) => { - const d = WIN8 * s.len / total, st = I8 + WIN8 * cum[si] / total; - gsap.set([s.core, s.halo], { strokeDasharray: s.len, strokeDashoffset: s.len }); - tl.set([s.core, s.halo], { opacity: 1 }, st); - tl.fromTo([s.core, s.halo], { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, st); - const n = Math.max(4, Math.round(s.len / 14)), xs = [], ys = []; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); - xs.push(pt.x); ys.push(pt.y); - } - tl.set(nib, { x: xs[0], y: ys[0] }, st); - tl.to(nib, { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, st); - }); - tl.set(nib, { opacity: 1 }, I8 - 0.01); - - // ${p.dustN ?? 8} dust specks fall from the nib along the path - function speck(parent, x, y, r, fill) { - const c = document.createElementNS(SVGNS8, "circle"); - c.setAttribute("cx", x); c.setAttribute("cy", y); c.setAttribute("r", r); - c.setAttribute("fill", fill); c.setAttribute("opacity", "0"); - document.getElementById(parent).appendChild(c); - return c; - } - for (let k = 0; k < ${p.dustN ?? 8}; k++) { - const f = (k + 0.6) / ${p.dustN ?? 8}, target = f * total; - let si = 0; while (si < strokes.length - 1 && cum[si + 1] <= target) si++; - const pt = strokes[si].core.getPointAtLength(target - cum[si]); - const c = speck("cwDustG", pt.x, pt.y + 4, 1.6 + crnd() * 1.4, ${J(DUST)}); - const ts = I8 + f * WIN8; - tl.set(c, { opacity: 0.9 }, ts); - tl.to(c, { y: 26 + crnd() * 20, x: crnd() * 14 - 7, duration: 0.5, ease: "power1.in" }, ts); - tl.to(c, { opacity: 0, duration: 0.42, ease: "power1.in" }, ts + 0.08); - } - - // hand-slap CLAP: 1-frame board shake (dust burst lives in the rail, in front) - tl.set("#cwUnit", { y: 3 }, DRAWN); - tl.set("#cwUnit", { y: -2 }, DRAWN + F); - tl.set("#cwUnit", { y: 1 }, DRAWN + 2*F); - tl.set("#cwUnit", { y: 0 }, DRAWN + 3*F); - - // two violent underlines (fast accelerating slashes), seeded waviness - const UL = [ - { x1: ${Math.round(inkL + 14)}, x2: ${Math.round(inkR - 4)}, y: ${Math.round(inkBot + 30)}, n: 4, t: DRAWN + 0.09, dur: 0.10 }, - { x1: ${Math.round(inkL + 58)}, x2: ${Math.round(inkR - 44)}, y: ${Math.round(inkBot + 50)}, n: 3, t: DRAWN + 0.23, dur: 0.09 }, - ]; - UL.forEach((u) => { - if (u.t + u.dur > ENDT - 0.1) return; - let ud = "M " + u.x1 + " " + (u.y + (crnd()*9 - 4.5)).toFixed(1); - for (let k = 1; k <= u.n; k++) - ud += " L " + (u.x1 + (u.x2 - u.x1) * k / u.n).toFixed(1) + " " + (u.y + (crnd()*9 - 4.5)).toFixed(1); - const halo = mk("cwHaloG", ud, "#ffffff", ${p.haloWidth ?? 14}); - const core = mk("cwCoreG", ud, ${J(CHALK)}, ${(p.coreWidth ?? 7) + 1}); - const len = core.getTotalLength(); - gsap.set([core, halo], { strokeDasharray: len, strokeDashoffset: len }); - tl.set([core, halo], { opacity: 1 }, u.t); - tl.fromTo([core, halo], { strokeDashoffset: len }, - { strokeDashoffset: 0, duration: u.dur, ease: "power3.in" }, u.t); - // nib rides the slash - const n = 8, xs = [], ys = []; - for (let k = 0; k <= n; k++) { const pt = core.getPointAtLength(len * k / n); xs.push(pt.x); ys.push(pt.y); } - tl.set(nib, { x: xs[0], y: ys[0] }, u.t); - tl.to(nib, { keyframes: { x: xs, y: ys }, duration: u.dur, ease: "none" }, u.t); - // dust kicked up where the slash ends - for (let k = 0; k < 3; k++) { - const c = speck("cwDustG", xs[n] - 4 + crnd() * 8, ys[n], 1.4 + crnd(), ${J(DUST)}); - tl.set(c, { opacity: 0.85 }, u.t + u.dur); - tl.to(c, { y: 16 + crnd() * 14, x: crnd() * 18 - 6, opacity: 0, duration: 0.38, ease: "power1.in" }, u.t + u.dur); - } - }); - // chalk flicks away after the second underline - tl.to(nib, { x: "+=30", y: "+=22", scale: 2, opacity: 0, duration: 0.14, ease: "power2.in" }, - Math.min(DRAWN + 0.35, ENDT - 0.15)); - - // hold life: halo breathe (baked f(t), deterministic) - const humStart = Math.min(DRAWN + 0.46, ENDT - 0.3), humDur = ENDT - humStart; - const N8 = Math.max(6, Math.round(humDur / (2 * F))); - const humVals = []; - for (let k = 0; k <= N8; k++) { - const tt = k / N8 * humDur; - humVals.push(${p.halo ?? 0.18} + 0.05 * Math.sin(2 * Math.PI * 1.6 * tt) + 0.02 * Math.sin(2 * Math.PI * 3.7 * tt + 0.8)); - } - tl.to("#cwHaloG", { keyframes: { opacity: humVals }, duration: humDur, ease: "none" }, humStart); - // two slow motes drifting off the letters during the hold - [[humStart + 0.10, ${Math.round(inkL + 0.43 * (inkR - inkL))}], [humStart + 0.50, ${Math.round(inkL + 0.71 * (inkR - inkL))}]].forEach(([ts, mx]) => { - if (ts + 0.5 > ENDT) return; - const c = speck("cwDustG", mx + crnd() * 30, ${Math.round((inkTop + inkBot) / 2 + 42)}, 1.5 + crnd(), ${J(DUST)}); - tl.set(c, { opacity: 0.6 }, ts); - tl.to(c, { y: 30, x: crnd() * 10 - 5, opacity: 0, duration: 0.5, ease: "power1.in" }, ts); - });`; - return { css, html, js }; -} - -function setpieceSpraytag() { - // ---- setpiece: SPRAYTAG (a writer steps up and TAGS the hero word) ---- - // The dusk wall dims + a radial scrim charges as the writer steps up; the - // can RATTLES at the start point (seeded set-chain nib jitter), then the - // hero word is spray-written stroke by stroke — sequential Hershey dash - // reveal (drawon pattern) — as a TRIPLE stack per stroke: fat dark - // under-stroke (sky-contrast armor) + blurred overspray halo + wet paint - // core, the glowing nib riding each stroke. Seeded overspray dots pop near - // the nib as it passes; the nib throws off at the finish (the magenta splat - // lives in the rail, in FRONT of the subject: fx.paintsplat). Through the - // hold, seeded DRIPS grow from painted low points (signature) and the halo - // hums while the whole tag slowly looms. - const h = dna.hero, - p = h.params, - I = heroIn; - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = HG.sprayW; - const x0 = Math.round(HG.x - tw / 2); - let D = execFileSync( - "python3", - [gen, fontPath, heroDisplay.toLowerCase(), String(tw), "450", String(x0)], - { encoding: "utf8" }, - ).trim(); - // register the measured ink box on HG (ink CENTER lands on HG.y); the loom - // origin and the fg paint splat derive from the same box - const pts = [...D.matchAll(/[ML] ([-\d.]+) ([-\d.]+)/g)].map((m) => [+m[1], +m[2]]); - const ys0 = pts.map((q) => q[1]); - const dy = +(HG.y - (Math.min(...ys0) + Math.max(...ys0)) / 2).toFixed(1); - D = D.replace(/([ML]) ([-\d.]+) ([-\d.]+)/g, (m, c, x, y) => `${c} ${x} ${(+y + dy).toFixed(1)}`); - const ENDT = +(DUR - 0.04).toFixed(3); - // writing window: keep the demo's 0.58s unless the hero lands too late to - // finish + splat + drip before the end of the clip - const WIN = Math.min(p.window || 0.58, Math.max(0.35, ENDT - 0.55 - I)); - const DRAWN = +(I + WIN).toFixed(3); - // hand-off to the fg paint splat: the pen-finish point, at write end - HG.splatX = Math.round(pts[pts.length - 1][0]); - HG.splatY = Math.round(pts[pts.length - 1][1] + dy); - HG.splatT = DRAWN; - const PAINT = dna.palette.accent || "#ffd23f"; - const UNDER = dna.palette.under || "#241008"; - const NIB = dna.palette.nib || "#fff6d9"; - const css = ` - #stDim { position:absolute; inset:0; opacity:0; background:${p.dimColor || "#0a0608"}; } - #stScrim { position:absolute; inset:0; opacity:0; - background: radial-gradient(92% 78% at 50% 36%, rgba(0,0,0,0) 28%, rgba(10,4,12,0.78) 100%); } - #stWrap { position:absolute; inset:0; } - #stSvg { position:absolute; left:0; top:0; overflow:visible; } - #stCoreG { filter: drop-shadow(0 3px 7px rgba(0,0,0,0.55)); } - #stNib { filter: blur(0.8px) drop-shadow(0 0 9px ${PAINT}e6); } - .stdrip { position:absolute; height:0; opacity:0; - background: linear-gradient(180deg, ${PAINT} 0%, ${dna.palette.dripMid || "#eab928"} 78%, ${dna.palette.dripLo || "#d8a51d"} 100%); - border-radius: 0 0 4px 4px; - box-shadow: 0 2px 4px rgba(0,0,0,0.35); }`; - const html = `
-
- - - - - - - - - - - - -
`; - const js = ` - // ---- setpiece: SPRAYTAG (rattle → sequential spray write → drips + hum) ---- - const Ig = ${I.toFixed(3)}, WINg = ${WIN.toFixed(3)}, DRAWNg = ${DRAWN}, ENDTg = ${ENDT}; - const Dg = ${J(D)}; - const grnd = mulberry32(${p.seed ?? 140987}); - - // scene reaction: the wall darkens as the writer steps up (charge) - tl.fromTo("#stDim", { opacity: 0 }, { opacity: ${p.dim ?? 0.22}, duration: 0.40, ease: "power2.in" }, ${(I - 0.42).toFixed(3)}); - tl.fromTo("#stScrim", { opacity: 0 }, { opacity: ${p.scrim ?? 0.62}, duration: 0.40, ease: "power2.in" }, ${(I - 0.42).toFixed(3)}); - - // per-stroke TRIPLE stack (split at pen lifts) — sequential dash reveal - const subsG = Dg.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNSG = "http://www.w3.org/2000/svg"; - function mkG(parent, d, stroke, w) { - const el = document.createElementNS(SVGNSG, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", stroke); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); - document.getElementById(parent).appendChild(el); - return el; - } - const strokesG = subsG.map((d) => ({ - under: mkG("stUnderG", d, ${J(UNDER)}, ${p.underWidth ?? 21}), // dark edge — sky-contrast armor - halo: mkG("stHaloG", d, ${J(PAINT)}, ${p.haloWidth ?? 36}), // fat soft overspray spread - core: mkG("stCoreG", d, ${J(PAINT)}, ${p.coreWidth ?? 13}), // wet paint core - })); - let totalG = 0; - strokesG.forEach((s) => { s.len = s.core.getTotalLength(); totalG += s.len; }); - - // helper: point at a global arc-length along the whole word - function pointAtTotal(L) { - let acc = 0; - for (const s of strokesG) { - if (L <= acc + s.len) return s.core.getPointAtLength(L - acc); - acc += s.len; - } - return strokesG[strokesG.length - 1].core.getPointAtLength(strokesG[strokesG.length - 1].len); - } - - // ANTICIPATION: the can RATTLES at the start point before painting - const nibG = document.getElementById("stNib"); - gsap.set(nibG, { attr: { cx: 0, cy: 0 } }); - const p0g = pointAtTotal(0); - tl.set(nibG, { opacity: 1, x: p0g.x, y: p0g.y }, Ig - 0.30); - for (let k = 0; k < 6; k++) { // set-chain rattle (sanctioned jitter) - tl.set(nibG, { x: p0g.x + (grnd() - 0.5) * 10, y: p0g.y + (grnd() - 0.5) * 7 }, Ig - 0.28 + k * 2 * F); - } - tl.set(nibG, { x: p0g.x, y: p0g.y }, Ig - 0.02); - - // SEQUENTIAL spray write: constant pen speed, nib rides each stroke - let tg = Ig; - strokesG.forEach((s) => { - const d = WINg * s.len / totalG; - gsap.set([s.under, s.halo, s.core], { strokeDasharray: s.len, strokeDashoffset: s.len }); - tl.set([s.under, s.halo, s.core], { opacity: 1 }, tg); - tl.fromTo([s.under, s.halo, s.core], { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, tg); - const n = Math.max(4, Math.round(s.len / 14)), xs = [], ys = []; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); - xs.push(pt.x); ys.push(pt.y); - } - tl.set(nibG, { x: xs[0], y: ys[0] }, tg); - tl.to(nibG, { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, tg); - tg += d; - }); - // nib throw-off at the finish (the splat ring itself lives on the rail layer) - tl.to(nibG, { scale: 2.6, opacity: 0, duration: 0.12, ease: "power2.in", - transformOrigin: "50% 50%" }, DRAWNg); - - // OVERSPRAY: seeded dots popping near the nib as it passes - for (let i = 0; i < ${p.osprayN ?? 6}; i++) { - const c = document.createElementNS(SVGNSG, "circle"); - c.setAttribute("r", (2 + grnd() * 2.4).toFixed(1)); - c.setAttribute("fill", ${J(PAINT)}); c.setAttribute("opacity", "0"); - document.getElementById("stOsprayG").appendChild(c); - const f = 0.08 + 0.84 * grnd(); - const ti = Ig + WINg * f; - const pt = pointAtTotal(totalG * f); - const ox = (grnd() < 0.5 ? -1 : 1) * (9 + grnd() * 18); - const oy = (grnd() < 0.5 ? -1 : 1) * (7 + grnd() * 14); - tl.set(c, { opacity: 0.85 }, ti); - tl.fromTo(c, { attr: { cx: pt.x + ox, cy: pt.y + oy } }, - { attr: { cx: pt.x + ox * 1.9, cy: pt.y + oy * 1.9 }, - duration: 0.30, ease: "power2.out" }, ti); - tl.to(c, { opacity: 0, duration: 0.26, ease: "power1.in" }, ti + 0.05); - } - - // DRIPS (signature): seeded drips grow from painted low points and KEEP - // growing through the hold - const samplesG = []; - { let acc = 0; - strokesG.forEach((s) => { - const n = Math.max(6, Math.round(s.len / 10)); - for (let k = 0; k <= n; k++) { - const L = s.len * k / n; - const pt = s.core.getPointAtLength(L); - samplesG.push({ x: pt.x, y: pt.y, L: acc + L }); - } - acc += s.len; - }); - } - const maxYg = Math.max(...samplesG.map(q => q.y)); - const lowsG = samplesG.filter(q => q.y > maxYg - 8).sort((a, b) => a.x - b.x); - const pickedG = []; - for (let tries = 0; tries < 60 && pickedG.length < ${p.drips ?? 3}; tries++) { - const cand = lowsG[Math.floor(grnd() * lowsG.length)]; - if (cand && pickedG.every(q => Math.abs(q.x - cand.x) > 110)) pickedG.push(cand); - } - const stageG = document.getElementById("stage"); - pickedG.forEach((q) => { - const el = document.createElement("div"); - el.className = "stdrip"; stageG.appendChild(el); - const w = 6 + Math.round(grnd() * 3); - gsap.set(el, { left: q.x - w / 2, top: q.y - 4, width: w }); - const paintT = Ig + WINg * (q.L / totalG); - const start = Math.min(paintT + 0.22 + grnd() * 0.22, ENDTg - 0.3); - const dur = Math.min(1.25, ENDTg - start); - const hh = (36 + grnd() * 36) * Math.max(0.55, dur / 1.25); - tl.set(el, { opacity: 1 }, start); - tl.to(el, { height: hh, duration: dur, ease: "power1.in" }, start); - }); - - // HOLD LIFE: halo hum (baked f(t), deterministic) + slow loom on the whole tag - const humStartG = DRAWNg + 0.06, humDurG = Math.max(0.2, ENDTg - DRAWNg - 0.06); - const NG = Math.max(6, Math.round(humDurG / (2 * F))); - const humValsG = []; - for (let k = 0; k <= NG; k++) { - const tt = k / NG * humDurG; - humValsG.push(${p.haloOpacity ?? 0.5} + 0.07 * Math.sin(2 * Math.PI * 7 * tt) + 0.05 * Math.sin(2 * Math.PI * 11 * tt + 0.9)); - } - tl.to("#stHaloG", { keyframes: { opacity: humValsG }, duration: humDurG, ease: "none" }, humStartG); - gsap.set("#stWrap", { transformOrigin: "${HG.x}px ${HG.y}px" }); - tl.to("#stWrap", { scale: 1.014, duration: 0.5, ease: "power1.inOut" }, DRAWNg + 0.08);`; - return { css, html, js }; -} - -function setpieceBrushwrite() { - // ---- setpiece: BRUSHWRITE (sumi-e — ONE violent calligraphic gesture) ---- - // A warm paper wash charges behind the word; the brush SLAPS down at the - // first pen point (start-splat: irregular ink blob + seeded satellites — - // the fg fleck pass rides fx.brushflecks), then the hero word is written in - // ONE sequential gesture — Hershey dash reveal at constant pen speed — as a - // FOUR-layer stack per stroke (blurred bleed under fat/mid/core widths = - // pressure-tapered wet brush), the round ink nib riding the pen and - // flicking off at the finish. Spatter droplets eject perpendicular at the - // sharpest-curvature points of the gesture. Through the hold the ink - // BLEEDS into the paper (the blurred under-layer swells visible) and the - // whole work breathes; then the vermilion SEAL chop stamps beside the ink - // (power4 crush → 2-frame squash → elastic settle, red flecks kicked) — - // the plate punch lands on the chop contact. - const h = dna.hero, - p = h.params, - I = heroIn; - const fontPath = path.join(SKILL, "assets/strokefonts", dna.fonts.strokeFont); - const gen = path.join(SKILL, "scripts/gen-stroke-path.py"); - const tw = HG.brushW; - const x0 = Math.round(HG.x - tw / 2); - let D = execFileSync( - "python3", - [gen, fontPath, heroDisplay.toLowerCase(), String(tw), "450", String(x0)], - { encoding: "utf8" }, - ).trim(); - // register the measured ink box on HG (ink CENTER lands on HG.y); the wash, - // breathe origin, seal chop and the fg flecks all derive from the same box - const pts = [...D.matchAll(/[ML] ([-\d.]+) ([-\d.]+)/g)].map((m) => [+m[1], +m[2]]); - const ys0 = pts.map((q) => q[1]); - const dy = +(HG.y - (Math.min(...ys0) + Math.max(...ys0)) / 2).toFixed(1); - D = D.replace(/([ML]) ([-\d.]+) ([-\d.]+)/g, (m, c, x, y) => `${c} ${x} ${(+y + dy).toFixed(1)}`); - const inkBot = Math.max(...ys0) + dy; - const inkR = Math.max(...pts.map((q) => q[0])); - const ENDT = +(DUR - 0.04).toFixed(3); - // writing window: keep the demo's 0.45s unless the gesture lands too late to - // finish + seal + bleed before the end of the clip - const WIN = Math.min(p.window || 0.45, Math.max(0.3, ENDT - 0.9 - I)); - const DRAWN = +(I + WIN).toFixed(3); - // hand-off to the fg ink flecks: the brush's FIRST contact point, at slap-down - HG.fleckX = Math.round(pts[0][0]); - HG.fleckY = Math.round(pts[0][1] + dy); - HG.fleckT = +(I + 0.01).toFixed(3); - // seal chop: below-right of the ink (demo offsets), kept on frame - const SEALC = +(DRAWN + (p.sealDelay ?? 0.04)).toFixed(3); - const sealS = p.sealSize ?? 64; - const sealX = Math.min(W - 48, Math.max(60, Math.round(inkR + (p.sealDx ?? -103)))); - const sealY = Math.min(H - 80, Math.round(inkBot + (p.sealDy ?? 72))); - const INK = dna.palette.ink || "#19120b"; - const WASH = dna.palette.wash || "#f6f0e2"; - const WASH2 = dna.palette.wash2 || "#f4edde"; - const washW = tw + 380, - washH = p.washH ?? 420; - const bleedT = +(DRAWN + 0.1).toFixed(3); - const bleedDur = +Math.max(0.4, Math.min(1.7, ENDT - DRAWN - 0.1)).toFixed(2); - const breT = +Math.min(SEALC, ENDT - 0.4).toFixed(3); - const breDur = +Math.max(0.3, Math.min(1.78, ENDT - breT)).toFixed(2); - const breN = Math.max(8, Math.round(breDur / (2 * F))); - const css = ` - #bwWash { position:absolute; left:${HG.x}px; top:${HG.y}px; width:${washW}px; height:${washH}px; - margin-left:-${Math.round(washW / 2)}px; margin-top:-${Math.round(washH / 2)}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, - ${WASH}d9 0%, ${WASH2}73 52%, ${WASH2}00 75%); } - #bwSvg { position:absolute; left:0; top:0; overflow:visible; } - #bwSeal { position:absolute; left:${sealX}px; top:${sealY}px; width:${sealS}px; height:${sealS}px; opacity:0; - border-radius:6px; - background: radial-gradient(70% 70% at 42% 38%, ${dna.palette.seal || "#d24a32"} 0%, ${dna.palette.sealMid || "#c03422"} 62%, ${dna.palette.sealLo || "#a92a1a"} 100%); - box-shadow: 0 3px 10px rgba(20,10,6,0.45), inset 0 0 9px rgba(255,140,110,0.35); } - #bwSeal span { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; - font-family:'${dna.fonts.seal || dna.fonts.body}', serif; font-weight:700; - font-size:${Math.round(sealS * 0.656)}px; color:${dna.palette.sealText || "#f7efe2"}; } - .bwfleck { position:absolute; border-radius:50%; background:${dna.palette.sealMid || "#c03422"}; opacity:0; }`; - const html = `
- - - - - - - - - - - - - - - - -
${esc(p.sealGlyph || "観")}
`; - const js = ` - // ---- setpiece: BRUSHWRITE (slap-down → one gesture → bleed + seal chop) ---- - const Ib = ${I.toFixed(3)}, WINb = ${WIN.toFixed(3)}, DRAWNb = ${DRAWN}, ENDTb = ${ENDT}; - const Db = ${J(D)}; - const wrnd = mulberry32(${p.seed ?? 380611}); - - // scene reaction: the paper wash charges in just before the gesture - tl.fromTo("#bwWash", { opacity: 0 }, { opacity: ${p.wash ?? 0.34}, duration: 0.22, ease: "power2.in" }, ${(I - 0.18).toFixed(3)}); -${ - I + 1.3 < ENDT - ? ` tl.to("#bwWash", { opacity: ${p.washSettle ?? 0.27}, duration: ${Math.min(1.2, ENDT - I - 1.0).toFixed(2)}, ease: "power1.out" }, ${(I + 1.0).toFixed(3)});` - : "" -} - - // strokes split at pen lifts; FOUR stacked widths = pressure-tapered wet brush - const subsB = Db.split(/(?=M )/).map(s => s.trim()).filter(Boolean); - const SVGNSB2 = "http://www.w3.org/2000/svg"; - function mkB(parent, d, w, op) { - const el = document.createElementNS(SVGNSB2, "path"); - el.setAttribute("d", d); el.setAttribute("fill", "none"); - el.setAttribute("stroke", ${J(INK)}); el.setAttribute("stroke-width", w); - el.setAttribute("stroke-opacity", op); - el.setAttribute("stroke-linecap", "round"); el.setAttribute("stroke-linejoin", "round"); - el.setAttribute("opacity", "0"); - document.getElementById(parent).appendChild(el); - return el; - } - const strokesB = subsB.map((d) => ({ - bleed: mkB("bwBleedG", d, ${p.bleedWidth ?? 16}, 1), - fat: mkB("bwFatG", d, ${p.fatWidth ?? 18}, 0.25), - mid: mkB("bwMidG", d, ${p.midWidth ?? 10}, 0.6), - core: mkB("bwCoreG", d, ${p.coreWidth ?? 5}, 1), - })); - let totalB = 0; - strokesB.forEach((s) => { s.len = s.core.getTotalLength(); totalB += s.len; }); - - // start-splat: irregular ink blob at the first pen point (the brush SLAPS down) - const SXB = ${Math.round(pts[0][0])}, SYB = ${Math.round(pts[0][1] + dy)}; - (function buildSplat() { - const g = document.getElementById("bwSplatG"); - const main = document.createElementNS(SVGNSB2, "ellipse"); - main.setAttribute("cx", SXB - 4); main.setAttribute("cy", SYB + 2); - main.setAttribute("rx", 24); main.setAttribute("ry", 15); - main.setAttribute("transform", "rotate(-24 " + (SXB - 4) + " " + (SYB + 2) + ")"); - main.setAttribute("fill", ${J(INK)}); main.setAttribute("fill-opacity", "0.9"); - g.appendChild(main); - for (let i = 0; i < 5; i++) { - const c = document.createElementNS(SVGNSB2, "circle"); - const a = wrnd() * Math.PI * 2, dist = 16 + wrnd() * 26; - c.setAttribute("cx", SXB - 4 + Math.cos(a) * dist); - c.setAttribute("cy", SYB + 2 + Math.sin(a) * dist * 0.7); - c.setAttribute("r", (1.8 + wrnd() * 3.4).toFixed(1)); - c.setAttribute("fill", ${J(INK)}); c.setAttribute("fill-opacity", "0.85"); - g.appendChild(c); - } - })(); - tl.set("#bwSplatG", { opacity: 1 }, Ib); - tl.fromTo("#bwSplatG", { scale: 0.35, svgOrigin: "${Math.round(pts[0][0])} ${Math.round(pts[0][1] + dy)}" }, - { scale: 1, duration: 0.12, ease: "power3.out" }, Ib); - - // ONE sequential gesture: constant pen speed, the round ink nib riding - const nibB = document.getElementById("bwNib"); - let tb = Ib, accB = 0; - const curvB = []; // spatter candidates: {x,y,ang,dA,te} - strokesB.forEach((s) => { - const d = WINb * s.len / totalB; - const layers = [s.bleed, s.fat, s.mid, s.core]; - layers.forEach(pp => gsap.set(pp, { strokeDasharray: s.len, strokeDashoffset: s.len })); - tl.set(layers, { opacity: 1 }, tb); - tl.fromTo(layers, { strokeDashoffset: s.len }, - { strokeDashoffset: 0, duration: d, ease: "none" }, tb); - const n = Math.max(6, Math.round(s.len / 12)), xs = [], ys = []; - let prevAng = null; - for (let k = 0; k <= n; k++) { - const pt = s.core.getPointAtLength(s.len * k / n); - xs.push(pt.x); ys.push(pt.y); - if (k > 0) { - const ang = Math.atan2(ys[k] - ys[k-1], xs[k] - xs[k-1]); - if (prevAng !== null) { - let dA = Math.abs(ang - prevAng); if (dA > Math.PI) dA = 2 * Math.PI - dA; - if (dA > 0.55) - curvB.push({ x: xs[k-1], y: ys[k-1], ang: prevAng, dA, - te: Ib + WINb * (accB + s.len * (k-1) / n) / totalB }); - } - prevAng = ang; - } - } - tl.set(nibB, { x: xs[0], y: ys[0] }, tb); - tl.to(nibB, { keyframes: { x: xs, y: ys }, duration: d, ease: "none" }, tb); - tb += d; accB += s.len; - }); - gsap.set(nibB, { attr: { cx: 0, cy: 0 } }); - tl.set(nibB, { opacity: 1 }, Ib - 0.01); - // the brush lifts off with a flick at the end of the gesture - tl.to(nibB, { x: "+=42", y: "-=30", scale: 1.9, opacity: 0, duration: 0.1, - ease: "power2.in", transformOrigin: "50% 50%" }, DRAWNb); - - // spatter droplets ejected at the sharpest-curvature points of the gesture - curvB.sort((a, b) => b.dA - a.dA); - const pickedB = []; - for (const c of curvB) { - if (pickedB.length >= ${p.spatterN ?? 6}) break; - if (pickedB.every(q => Math.abs(q.te - c.te) > 0.045)) pickedB.push(c); - } - const spatB = document.getElementById("bwSpatG"); - pickedB.forEach((c) => { - if (c.te + 0.33 > ENDTb) return; - const el = document.createElementNS(SVGNSB2, "circle"); - el.setAttribute("cx", c.x); el.setAttribute("cy", c.y); - el.setAttribute("r", (2.2 + wrnd() * 2.2).toFixed(1)); - el.setAttribute("fill", ${J(INK)}); el.setAttribute("opacity", "0"); - spatB.appendChild(el); - const side = wrnd() > 0.5 ? 1 : -1; - const ea = c.ang + side * Math.PI / 2; - const dist = 34 + wrnd() * 60; - const dx = Math.cos(ea) * dist, dyv = Math.sin(ea) * dist - 18; - tl.set(el, { opacity: 1 }, c.te); - tl.to(el, { keyframes: { x: [0, dx * 0.6, dx], y: [0, dyv * 0.6, dyv + 22], - opacity: [1, 0.9, 0] }, - duration: 0.32, ease: "power2.out" }, c.te); - }); - - // HOLD: the ink BLEEDS into the paper (blurred under-layer swells) + breathe - tl.to("#bwBleedG", { opacity: ${p.bleed ?? 0.38}, duration: ${bleedDur}, ease: "sine.inOut" }, ${bleedT}); - const bNb = ${breN}, bValsB = []; - for (let k = 0; k <= bNb; k++) { - const tt = k / bNb * ${breDur}; - bValsB.push(1 + 0.006 * Math.sin(2 * Math.PI * ${p.breatheHz ?? 0.55} * tt)); - } - tl.to("#bwInkAll", { keyframes: { scale: bValsB }, duration: ${breDur}, ease: "none", - svgOrigin: "${HG.x} ${HG.y}" }, ${breT}); -${ - SEALC + 0.38 <= ENDT - ? ` - // vermilion SEAL chop stamps the work — the plate punch lands on the contact - gsap.set("#bwSeal", { xPercent: -50, yPercent: -50, rotation: -6, transformOrigin: "50% 50%" }); - tl.set("#bwSeal", { opacity: 1, scale: 1.7 }, ${(SEALC - 0.1).toFixed(3)}); - tl.to("#bwSeal", { scale: 1, duration: 0.09, ease: "power4.in" }, ${(SEALC - 0.095).toFixed(3)}); - tl.set("#bwSeal", { scaleX: 1.07, scaleY: 0.93 }, ${SEALC}); - tl.to("#bwSeal", { scaleX: 1, scaleY: 1, duration: 0.28, ease: "elastic.out(1, 0.4)" }, ${(SEALC + 0.08).toFixed(3)}); - { const stg = document.getElementById("stage"); - for (let i = 0; i < 3; i++) { - const el = document.createElement("div"); el.className = "bwfleck"; - stg.appendChild(el); - const s = 2 + Math.round(wrnd() * 2); - gsap.set(el, { width: s, height: s, left: ${sealX}, top: ${sealY} }); - const a = wrnd() * Math.PI * 2, dist = 32 + wrnd() * 38; - tl.set(el, { opacity: 0.9 }, ${(SEALC + 0.01).toFixed(3)}); - tl.to(el, { x: Math.cos(a) * dist, y: Math.sin(a) * dist + 12, opacity: 0, - duration: 0.3, ease: "power2.out" }, ${(SEALC + 0.01).toFixed(3)}); - } - }` - : "" -}`; - return { css, html, js }; -} - -function setpieceInkbloom() { - // INKWATER apex: a sumi ink drop falls into still water BEHIND the subject. - // Scene reaction: paper-white radial washes behind the two text zones — the - // body rows get a PERSISTENT paper backing from t≈0.15 (the closing lines - // keep their ground) and the apex zone charges just before the drop — plus - // a gentle vignette that STILLS the world while the ink blooms. The drop - // appears above the word point, swells, falls (power2.in, scaleY stretch), - // squashes on contact (2 frames) and merges into the bloom: 3 stacked - // blurred irregular ellipses scaling at different rates with counter- - // rotations + 2 thin concentric ripple rings expanding on the water - // surface; the hero words RESOLVE out of the blob (opacity snaps, blur - // 16→0 + scale 1.12→1 carries the bleed) — the first at contact, the - // following at their own spoken times; through the hold the glyph edges - // BREATHE (baked blur keyframes), the whole group looms 1.018 and faint - // ink wisps curl off the word top; exit: RE-DISSOLVE (blur up + spread + - // fade — the ink disperses back into the water), timed to clear before the - // next body line needs the reader. Blob / ring / wisp geometry is the - // demo's, scaled from the measured word rect (kx = halfW/demoHalf, - // ky = fontPx/132); the rail wash registers on the body row geometry. - const p = dna.hero.params || {}, - D = heroIn; - const INK = dna.palette.ink || dna.palette.body; - const PAP = dna.palette.paper || "#fffaee", - PAP2 = dna.palette.paper2 || "#fff8e8"; - const WASH = dna.palette.wash || "#fff9ee", - WAPX = dna.palette.washApex || "#fffaf0"; - const fpx = HG.fontPx, - halfW = Math.round(HG.halfW || heroDisplay.length * 0.25 * fpx), - cx = HG.x, - cy = HG.y; - const ky = fpx / 132; // demo scale unit (Shippori Mincho 700 @ 132px) - const demoHalf = (wordPx("pixel size.", dna.fonts.hero, 132, 0.02) || 650) / 2; - const kx = halfW / demoHalf; - const SX = (v) => Math.round(v * kx), - SY = (v) => Math.round(v * ky); - const C = +(D + (p.fall ?? 0.15)).toFixed(3); // contact with the water surface - // hero words resolve on their own spoken times (the first at contact) - const heroWords = heroDisplay.trim().split(/\s+/); - const RES = heroWords.map((wtx, k) => { - const tw = tWords[Math.min(hero.idx + k, hero.idx + hero.len - 1)]; - return +Math.max(C + 0.02, k === 0 ? 0 : tw.start).toFixed(3); - }); - // the bloom re-dissolves before the next body line needs the reader - const nextL = LINES.find((L) => L.words[0].start > hero.end + 0.05); - const XOUT = +Math.max( - C + 0.55, - Math.min( - D + (p.maxHold ?? 1.75), - nextL ? nextL.words[0].start - (p.clearGap ?? 0.24) : DUR - 0.6, - DUR - 0.6, - ), - ).toFixed(3); - const loomT = +(D + 0.373).toFixed(3), - loomD = +Math.min(1.3, XOUT - (D + 0.373) - 0.03).toFixed(2); - const vigOutT = +(XOUT - 0.15).toFixed(3), - vigOutD = +Math.min(0.6, DUR - 0.05 - (XOUT - 0.15)).toFixed(2); - // rail wash centers on the body reading rows (middle row) - const railY = H - ((dna.body && dna.body.bottomPx) ?? 36) - ((dna.body && dna.body.rowGap) ?? 56); - const wrW = p.washRailW ?? 1180, - wrH = p.washRailH ?? 300; - const waW = 2 * halfW + 370, - waH = p.washApexH ?? 430; - const blr = (v) => Math.max(8, SY(v)); - const css = ` - #ikvig { position:absolute; inset:0; opacity:0; - background: radial-gradient(115% 100% at 50% 40%, rgba(0,0,0,0) 42%, rgba(8,6,4,0.55) 100%); } - #ikwashRail { position:absolute; left:${W / 2}px; top:${railY}px; width:${wrW}px; height:${wrH}px; - margin-left:-${Math.round(wrW / 2)}px; margin-top:-${Math.round(wrH / 2)}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${WASH}7a 0%, ${WASH}3d 48%, ${WASH}00 75%); } - #ikwashApex { position:absolute; left:${cx}px; top:${cy}px; width:${waW}px; height:${waH}px; - margin-left:-${Math.round(waW / 2)}px; margin-top:-${Math.round(waH / 2)}px; opacity:0; - background: radial-gradient(50% 50% at 50% 50%, ${WAPX}4d 0%, ${WAPX}21 50%, ${WAPX}00 76%); } - #inkG { position:absolute; left:${cx}px; top:${cy}px; opacity:0; } - #ikdrop { position:absolute; left:${-SY(9)}px; top:${-SY(228)}px; width:${SY(18)}px; height:${SY(18)}px; - border-radius: 46% 54% 50% 50% / 38% 40% 62% 60%; - background:${INK}; opacity:0; box-shadow: 0 0 6px ${INK}73; } - .ikblob { position:absolute; opacity:0; background:${INK}; } - #ikb1 { left:${SX(-115)}px; top:${SY(-64)}px; width:${SX(230)}px; height:${SY(128)}px; - border-radius: 47% 53% 44% 56% / 58% 42% 60% 40%; filter: blur(${blr(16)}px); } - #ikb2 { left:${SX(-205)}px; top:${SY(-44)}px; width:${SX(190)}px; height:${SY(108)}px; - border-radius: 56% 44% 58% 42% / 44% 60% 40% 56%; filter: blur(${blr(20)}px); } - #ikb3 { left:${SX(-13)}px; top:${SY(-66)}px; width:${SX(206)}px; height:${SY(96)}px; - border-radius: 42% 58% 50% 50% / 62% 38% 56% 44%; filter: blur(${blr(24)}px); } - .ikring { position:absolute; left:${SX(-80)}px; top:${SY(-8)}px; width:${SX(160)}px; height:${SY(44)}px; - border-radius:50%; opacity:0; } - #ikr1 { border:2px solid ${INK}cc; filter: blur(1.2px); } - #ikr2 { border:2px solid ${INK}8c; filter: blur(2.2px); } - #ikword { position:absolute; left:0; top:0; white-space:nowrap; - transform: translate(-50%,-50%); - font-family:'${dna.fonts.hero}', serif; font-weight:700; - font-size:${fpx}px; line-height:1; letter-spacing:0.02em; color:${INK}; } - #ikword .ikw { display:inline-block; opacity:0; margin-right:0.30em; - text-shadow: 0 0 14px ${PAP}f2, 0 0 36px ${PAP2}b3, 0 2px 4px ${PAP}99; } - #ikword .ikw:last-child { margin-right:0; } - .ikwisp { position:absolute; width:${SY(30)}px; height:${SY(38)}px; opacity:0; - border:4px solid transparent; border-top-color:${INK}80; - border-radius:50%; filter: blur(2.5px); } - #ikwisp1 { left:${SX(-210)}px; top:${SY(-118)}px; } - #ikwisp2 { left:${SX(118)}px; top:${SY(-122)}px; }`; - const html = `
-
-
-
-
-
-
-
-
-
${heroWords.map((t, k) => `${esc(t)}`).join("")}
-
-
-
-
`; - const js = ` - // ---- setpiece: INKBLOOM (drop falls → ink blooms → words resolve → re-dissolve) ---- - // paper washes (the scene offers paper to the ink); the rail wash PERSISTS - tl.fromTo("#ikwashRail", { opacity: 0 }, { opacity: 1, duration: 0.5, ease: "power1.out" }, 0.15); - tl.fromTo("#ikwashApex", { opacity: 0 }, { opacity: 1, duration: 0.3, ease: "power1.out" }, ${Math.max(0.02, D - 0.077).toFixed(3)}); - tl.to("#ikwashApex", { opacity: 0, duration: 0.5, ease: "power1.in" }, ${XOUT}); - - // the world stills while the ink blooms - tl.to("#ikvig", { opacity: ${p.vig ?? 0.34}, duration: 0.45, ease: "power2.out" }, ${C}); - tl.to("#ikvig", { opacity: 0, duration: ${vigOutD}, ease: "power1.in" }, ${vigOutT}); - - // ===== drop: appears, swells, falls, squashes on contact, merges into the blob ===== - tl.set("#inkG", { opacity: 1 }, ${(D - 0.08).toFixed(3)}); - tl.set("#ikdrop", { opacity: 1, transformOrigin: "50% 50%" }, ${(D - 0.08).toFixed(3)}); - tl.fromTo("#ikdrop", { scale: 0.55 }, { scale: 1, duration: 0.08, ease: "power2.out" }, ${(D - 0.08).toFixed(3)}); - tl.to("#ikdrop", { y: ${SY(219)}, duration: ${(C - D).toFixed(3)}, ease: "power2.in" }, ${D.toFixed(3)}); - tl.to("#ikdrop", { scaleY: 1.45, scaleX: 0.8, duration: ${(C - D).toFixed(3)}, ease: "power2.in" }, ${D.toFixed(3)}); - tl.set("#ikdrop", { scaleX: 1.7, scaleY: 0.35 }, ${C}); // contact squash, 2 frames - tl.to("#ikdrop", { opacity: 0, duration: 0.07 }, ${(C + 0.083).toFixed(3)}); - - // ===== bloom: 3 stacked blurred ellipses, different rates; opacity snaps then decays ===== - const IKB = [["#ikb1", 0.82, 0.50, 3.0, -4, 5, 0, 1.15, 0.18, 1.05], - ["#ikb2", 0.62, 0.42, 2.4, 7, -7, 0.04, 1.35, 0.22, 1.15], - ["#ikb3", 0.50, 0.55, 3.8, -9, 8, 0.08, 1.50, 0.30, 1.20]]; - IKB.forEach(([sel, op, s0, s1, r0, r1, dt, gd, ft, fd]) => { - tl.set(sel, { opacity: op, transformOrigin: "50% 50%" }, ${C} + dt); - tl.fromTo(sel, { scale: s0, rotation: r0 }, - { scale: s1, rotation: r1, duration: gd, ease: "expo.out" }, ${C} + dt); - tl.to(sel, { opacity: 0, duration: fd, ease: "power1.in" }, ${C} + ft); - }); - - // ripple rings on the water surface - tl.set("#ikr1", { opacity: 0.7, transformOrigin: "50% 50%" }, ${(C + 0.02).toFixed(3)}); - tl.fromTo("#ikr1", { scale: 1 }, { scale: 7.2, duration: 1.45, ease: "expo.out" }, ${(C + 0.02).toFixed(3)}); - tl.to("#ikr1", { opacity: 0, duration: 1.25, ease: "power1.in" }, ${(C + 0.22).toFixed(3)}); - tl.set("#ikr2", { opacity: 0.5, transformOrigin: "50% 50%" }, ${(C + 0.16).toFixed(3)}); - tl.fromTo("#ikr2", { scale: 1 }, { scale: 9.6, duration: 1.7, ease: "power2.out" }, ${(C + 0.16).toFixed(3)}); - tl.to("#ikr2", { opacity: 0, duration: 1.4, ease: "power1.in" }, ${(C + 0.4).toFixed(3)}); - - // ===== the words resolve out of the blob (opacity snaps, BLUR carries the bleed) ===== - const IKRES = ${J(RES)}; - IKRES.forEach((rt, k) => { - const el = document.getElementById("ikw" + k); - const rd = Math.min(0.8, Math.max(0.3, ${XOUT} - rt - 0.25)); - tl.set(el, { opacity: 1, transformOrigin: "50% 60%" }, rt); - tl.fromTo(el, { scale: 1.12, filter: "blur(16px)" }, - { scale: 1, filter: "blur(0px)", duration: rd, ease: "power2.out" }, rt); - // hold life: glyph edges breathe (blur 0 → ~0.8 → 0, slow) - const bt = rt + Math.max(0.82, rd + 0.02), bd = k % 2 ? 0.5 : 0.66; - if (bt + bd <= ${XOUT} + 0.02) { - tl.to(el, { keyframes: { filter: ["blur(0px)","blur(0.8px)","blur(0.15px)","blur(0.7px)","blur(0px)"] }, - duration: bd, ease: "none" }, bt); - } - }); -${ - loomD >= 0.2 - ? ` // gentle loom on the group through the hold - tl.to("#inkG", { scale: 1.018, duration: ${loomD}, ease: "power1.inOut", transformOrigin: "50% 50%" }, ${loomT});` - : "" -} - - // faint ink wisps curl off the word top during the hold -${ - C + 0.573 + 0.6 <= XOUT - ? ` tl.set("#ikwisp1", { opacity: 0.45, transformOrigin: "50% 50%" }, ${(C + 0.573).toFixed(3)}); - tl.fromTo("#ikwisp1", { y: 0, x: 0, rotation: 14, scaleY: 1 }, - { y: -44, x: 12, rotation: 96, scaleY: 1.6, duration: 0.95, ease: "power1.out" }, ${(C + 0.573).toFixed(3)}); - tl.to("#ikwisp1", { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(C + 1.123).toFixed(3)});` - : "" -} -${ - C + 0.753 + 0.6 <= XOUT - ? ` tl.set("#ikwisp2", { opacity: 0.4, transformOrigin: "50% 50%" }, ${(C + 0.753).toFixed(3)}); - tl.fromTo("#ikwisp2", { y: 0, x: 0, rotation: -18, scaleY: 1 }, - { y: -40, x: -14, rotation: -98, scaleY: 1.5, duration: 0.9, ease: "power1.out" }, ${(C + 0.753).toFixed(3)}); - tl.to("#ikwisp2", { opacity: 0, duration: 0.38, ease: "power1.in" }, ${(C + 1.273).toFixed(3)});` - : "" -} - - // exit: re-dissolve — blur up + spread + fade, ink dispersing - tl.to("#inkG", { scale: 1.15, filter: "blur(11px)", opacity: 0, - duration: 0.52, ease: "power1.in" }, ${XOUT}); - tl.set("#inkG", { display: "none" }, ${Math.min(XOUT + 0.6, DUR - 0.02).toFixed(3)});`; - return { css, html, js }; -} - -function setpieceRansomnote() { - // ---- setpiece: RANSOMNOTE (letter-by-letter cutout slam → collective jolt → ripped off) ---- - // The hero word slams in BEHIND the subject as a ransom note: one cutout - // chip per letter (4 recipes cycled, seeded ±13% sizes / alternating-sign - // rotations / misaligned baselines), each slamming in oversized with a - // flight shadow that POPS tight on contact (power3.in crush → 2-frame - // squash → elastic settle) at S_i = I + 0.01 + step·i. When the LAST letter - // lands the whole word takes a collective 1-frame JOLT + a scene pulse - // (the plate punch anchors here — punchOffset is recomputed from the real - // letter count so the punch always lands on the jolt). Hold = slow loom - // keyframes (the crooked grid never straightens). Exit = letters RIPPED - // off one by one, a 1-frame paper-tear flash under each. Scene reaction = - // a collage scrim darkens the bright sky for the apex window. - const p = dna.hero.params || {}, - I = heroIn; - const STEP = p.step ?? 0.06, - CRUSH = p.crush ?? 0.09, - RSTAG = p.ripStag ?? 0.045; - const BASE = HG.fontPx; - const kf = BASE / 130; // chip chrome scales with the demo's 130px cut - const N = [...heroText].filter((c) => c !== " ").length; - const JOLT = +(I + 0.01 + STEP * (N - 1) + CRUSH).toFixed(3); - // rip schedule: letters tear off while the closing line speaks (demo: - // lastWord − 0.19), clamped so the last rip completes on frame and the - // note holds ≥0.45s after the jolt - let ripT = Math.min( - theme.hero.exitAt ?? LASTWORD.start - (p.ripLead ?? 0.19), - DUR - 0.22 - RSTAG * (N - 1), - ); - ripT = +Math.max(Math.min(ripT, DUR - 0.22 - RSTAG * (N - 1)), JOLT + 0.45).toFixed(3); - // the plate punch lands on the collective jolt, whatever the word length - if (dna.plate && dna.plate.punch) dna.plate.punchOffset = +(JOLT - I).toFixed(3); - const scrimT = +Math.max(0.02, I - 0.07).toFixed(3); - const loomT = +(JOLT + 0.1).toFixed(3); - const loomD = +Math.min(0.95, ripT - 0.08 - loomT).toFixed(2); - const css = ` - #rscrim { position:absolute; inset:0; opacity:0; - background: linear-gradient(180deg, rgba(12,8,5,0.66) 0%, rgba(12,8,5,0.48) 38%, - rgba(12,8,5,0.22) 62%, rgba(12,8,5,0.05) 100%); } - #rpulse { position:absolute; inset:0; opacity:0; background:rgba(10,6,3,0.75); } - #rnote { position:absolute; left:${HG.x}px; top:${HG.y}px; white-space:nowrap; } - .aw { display:inline-block; position:relative; margin:0 3px; } - .asp { display:inline-block; width:${Math.round(BASE * 0.3)}px; } - .aflash { position:absolute; inset:-5px; background:${dna.palette.flash || "#fffdf2"}; opacity:0; z-index:0; } - .awm { display:inline-block; position:relative; z-index:1; opacity:0; - filter: drop-shadow(0 ${Math.max(4, Math.round(7 * kf))}px 0 rgba(8,6,4,0.55)); } - .achip { display:inline-block; line-height:1.04; padding:0.05em 0.10em 0.09em; } -${ransomChipCss("0.01em")}`; - const html = `
-
-
`; - const js = ` - // ---- setpiece: RANSOMNOTE (letter chips slam → collective jolt → ripped off) ---- - const I = ${I.toFixed(3)}, STEP = ${STEP}, CRUSH = ${CRUSH}, RIPT = ${ripT}; - const arnd = mulberry32(${p.seed || 3939}); - ${RANSOM_TEAR} - const HARDA = "drop-shadow(0 ${Math.max(4, Math.round(7 * kf))}px 0 rgba(8,6,4,0.55))"; - const FLIGHTA = "drop-shadow(0 ${Math.max(10, Math.round(24 * kf))}px 5px rgba(8,6,4,0.30))"; - const group = document.getElementById("rnote"); - gsap.set(group, { xPercent: -50, yPercent: -50 }); - - // scene reacts: collage scrim darkens the bright sky for the apex window - tl.to("#rscrim", { opacity: ${p.scrim ?? 0.44}, duration: 0.12, ease: "power2.out" }, ${scrimT}); - - // ===== letter-by-letter ransom slam: S_k = I + 0.01 + STEP*k, contact = S_k + CRUSH - const RECSA = ["ca", "cb", "cc", "cd"]; - let k = 0; - ${J([...heroText])}.forEach((ch) => { - if (ch === " ") { - const sp = document.createElement("div"); sp.className = "asp"; - group.appendChild(sp); - return; - } - const aw = document.createElement("div"); aw.className = "aw"; - const fl = document.createElement("div"); fl.className = "aflash"; - fl.style.clipPath = tearPoly(arnd); - const mv = document.createElement("div"); mv.className = "awm"; - const chip = document.createElement("div"); chip.className = "achip " + RECSA[k % 4]; - chip.style.fontSize = Math.round(${BASE} * (0.85 + arnd() * 0.27)) + "px"; - chip.style.clipPath = tearPoly(arnd); - chip.textContent = ch; - mv.appendChild(chip); aw.appendChild(fl); aw.appendChild(mv); group.appendChild(aw); - // seeded crooked grid (demo grammar): rot sign alternates per letter, - // baseline shove dy leans the other way, the rip throws with the rot sign - const sgn = k % 2 ? 1 : -1; - const rot = sgn * (2 + arnd() * 3); - const dy = -sgn * (2 + arnd() * 4); - const rr = sgn * (15 + arnd() * 7); - const S = I + 0.01 + STEP * k, C = S + CRUSH; - tl.set(mv, { opacity: 1, scale: 1.5, rotation: rot * 1.8, y: dy - 20, filter: FLIGHTA }, S); - tl.to(mv, { scale: 1, rotation: rot, y: dy, duration: 0.085, ease: "power3.in" }, S + 0.005); - tl.set(mv, { filter: HARDA }, C); // shadow pop: snaps tight on contact - tl.set(mv, { scaleX: 1.07, scaleY: 0.93 }, C + 0.004); // contact squash, held 2 frames - tl.to(mv, { scaleX: 1, scaleY: 1, duration: 0.3, ease: "elastic.out(1, 0.4)" }, C + 0.087); - // ===== exit: RIPPED off one by one, tear flash 1 frame under each - const R = RIPT + ${RSTAG} * k; - tl.set(fl, { opacity: 0.85 }, R); - tl.set(fl, { opacity: 0 }, R + 0.045); - tl.to(mv, { rotation: rot + rr, y: dy - 34, opacity: 0, - duration: 0.16, ease: "power2.in" }, R); - k++; - }); - - // collective 1-frame jolt when the last letter lands + scene pulse - tl.set("#rnote", { y: 6 }, ${JOLT}); - tl.to("#rnote", { y: 0, duration: 0.14, ease: "power3.out" }, ${(JOLT + 0.042).toFixed(3)}); - tl.set("#rpulse", { opacity: ${p.pulse ?? 0.2} }, ${JOLT}); - tl.to("#rpulse", { opacity: 0, duration: 0.13, ease: "power1.out" }, ${(JOLT + 0.042).toFixed(3)}); -${ - loomD >= 0.35 - ? ` - // hold life: the pasted word looms (the crooked grid never straightens) - tl.to("#rnote", { keyframes: { scale: [1, 1.02, 1.006, 1.018, 1] }, - duration: ${loomD}, ease: "none" }, ${(JOLT + 0.1).toFixed(3)});` - : "" -} - tl.to("#rscrim", { opacity: 0, duration: 0.3, ease: "power1.in" }, ${(ripT + 0.06).toFixed(3)});`; - return { css, html, js }; -} - -const SETPIECES = { - detonation: setpieceDetonation, - decode: setpieceDecode, - drawon: setpieceDrawon, - cpslam: setpieceCpslam, - settle: setpieceSettle, - flapboard: setpieceFlapboard, - ledwipe: setpieceLedwipe, - vhsosd: setpieceVhsosd, - bossintro: setpieceBossintro, - rubberstamp: setpieceRubberstamp, - lasercage: setpieceLasercage, - boltstrike: setpieceBoltstrike, - holoboot: setpieceHoloboot, - biobloom: setpieceBiobloom, - silkribbon: setpieceSilkribbon, - scopetrace: setpieceScopetrace, - papermat: setpiecePapermat, - centerfold: setpieceCenterfold, - chalkwrite: setpieceChalkwrite, - spraytag: setpieceSpraytag, - brushwrite: setpieceBrushwrite, - inkbloom: setpieceInkbloom, - ransomnote: setpieceRansomnote, -}; - -if (!PARADIGMS[dna.body.paradigm]) - throw new Error("[make-theme] unknown body paradigm: " + dna.body.paradigm); -const body = PARADIGMS[dna.body.paradigm](); - -let setp = { css: "", html: "", js: "" }; -if (!heroInline && !HEROLESS) { - if (!SETPIECES[dna.hero.setpiece]) - throw new Error("[make-theme] unknown setpiece: " + dna.hero.setpiece); - setp = SETPIECES[dna.hero.setpiece](); -} -const fx = HEROLESS ? { css: "", html: "", js: "" } : frontFx(); - -// bg file: plate reaction + embedded setpiece (+ body if body.layer === "bg") -const bodyInBg = dna.body.layer === "bg"; -const poemScrimInBg = dna.body.paradigm === "poem" && dna.body.scrim; -let bgExtra = { css: "", html: "", js: "" }; -if (poemScrimInBg) { - // poem keeps its scrim BEHIND the subject (subject stays lit) while the poem - // itself rides the fg alpha layer - const bgScrimSide = typeof CLEARER !== "undefined" && CLEARER === "right" ? "right" : "left"; - bgExtra.css = ` - #pscrimBg { position:absolute; inset:0; opacity:0; - background: linear-gradient(${bgScrimSide === "left" ? "100deg" : "260deg"}, - rgba(4,8,16,${dna.body.scrim.opacity}) 0%, rgba(4,8,16,${(dna.body.scrim.opacity * 0.6).toFixed(2)}) 38%, rgba(4,8,16,0) 62%); }`; - bgExtra.html = `
`; - bgExtra.js = ` - tl.fromTo("#pscrimBg", { opacity: 0 }, { opacity: 1, duration: 0.6, ease: "power1.out" }, 0.15); - tl.to("#pscrimBg", { opacity: 0, duration: 0.4, ease: "power1.in" }, ${(LASTWORD.start + 0.15).toFixed(3)});`; -} - -const bgHtml = bgSkeleton( - [bgExtra.html, setp.html, bodyInBg ? body.html : ""].filter(Boolean).join("\n"), - [bgExtra.css, setp.css, bodyInBg ? body.css : ""].filter(Boolean).join("\n"), - [bgExtra.js, setp.js, bodyInBg ? body.js : ""].filter(Boolean).join("\n"), -); -fs.writeFileSync(path.join(PROJECT, "index.html"), bgHtml); - -// fg file (rail.html): body paradigm (when fg) + setpiece fg parts + front fx -// (a setpiece may emit fgHtml/fgCss/fgJs — e.g. a verbatim caption chip that -// must ride ABOVE the matte while the setpiece scenery stays embedded behind) -if (!bodyInBg || fx.html || fx.js || setp.fgHtml) { - const fgHtml = fgSkeleton( - [!bodyInBg ? body.html : "", setp.fgHtml || "", fx.html].filter(Boolean).join("\n"), - [!bodyInBg ? body.css : "", setp.fgCss || "", fx.css].filter(Boolean).join("\n"), - [!bodyInBg ? body.js : "", setp.fgJs || "", fx.js].filter(Boolean).join("\n"), - ); - fs.writeFileSync(path.join(PROJECT, "rail.html"), fgHtml); -} else if (fs.existsSync(path.join(PROJECT, "rail.html"))) { - fs.unlinkSync(path.join(PROJECT, "rail.html")); -} - -// _postfx.sh: plate reaction after the matte composite (subject+text move as one) -const P = HEROLESS ? { grain: dna.plate?.grain ?? 5 } : dna.plate || {}; -const grain = P.grain ?? 5; -const noise = grain === 0 ? "" : `,noise=alls=${grain}:allf=t+u`; -// punchOffset: themes whose impact is NOT the hero onset (e.g. flapboard's -// lock-complete clack) shift the plate punch anchor; default keeps onset+2f -const anchorT = (heroIn + (P.punchOffset ?? 0.045)).toFixed(3); -let filter; -// zoompan resamples EVERY frame (even z=1) -> run it 2x supersampled and -// lanczos back down so the always-on resample costs no sharpness (shake amps -// are in pixels -> doubled at 2x) -const SS = 2; -if (P.punch) { - const minor = P.minorPunch && LINES.find((L) => L.words.some((w) => w.minor)); - const minorT = minor ? (minor.words.find((w) => w.minor).start + 0.01).toFixed(3) : null; - filter = `scale=${W * SS}:${H * SS}:flags=lanczos,zoompan= - z='1+${P.punch}*exp(-${P.punchDecay || 9}*(time-${anchorT}))*between(time,${anchorT},${anchorT}+${P.shakeWindow || 0.6})${minorT ? `+${P.minorPunch}*exp(-10*(time-${minorT}))*between(time,${minorT},${minorT}+0.4)` : ""}': - x='iw/2-(iw/zoom/2)${P.shakeAmpX ? `+${P.shakeAmpX * SS}*exp(-${P.shakeDecay || 7}*(time-${anchorT}))*sin(2*PI*${P.shakeHz || 12}*(time-${anchorT}))*between(time,${anchorT},${anchorT}+${P.shakeWindow || 0.6})` : ""}': - y='ih/2-(ih/zoom/2)${P.shakeAmpY ? `+${P.shakeAmpY * SS}*exp(-${P.shakeDecay || 7}*(time-${anchorT}))*cos(2*PI*${((P.shakeHz || 12) * 1.31).toFixed(2)}*(time-${anchorT}))*between(time,${anchorT},${anchorT}+${P.shakeWindow || 0.6})` : ""}': - d=1:s=${W * SS}x${H * SS}:fps=${FPS},scale=${W}:${H}:flags=lanczos`; -} else if (P.pushIn) { - filter = `scale=${W * SS}:${H * SS}:flags=lanczos,zoompan=z='1+${P.pushIn}*time/${DUR.toFixed(2)}':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=1:s=${W * SS}x${H * SS}:fps=${FPS},scale=${W}:${H}:flags=lanczos`; -} else { - filter = `null`; -} -const rgba = P.rgbashift - ? `,rgbashift=rh=-${P.rgbashift}:bh=${P.rgbashift}:enable='between(t,${anchorT},${(heroIn + 0.125).toFixed(3)})+between(t,${(LASTWORD.start + 0.04).toFixed(3)},${(LASTWORD.start + 0.17).toFixed(3)})',format=yuv420p` - : ""; -fs.writeFileSync( - path.join(PROJECT, "_postfx.sh"), - `#!/usr/bin/env bash -# generated by make-theme.cjs — plate reaction for theme "${dna.name}" -set -euo pipefail -cd "$(dirname "$0")" -ffmpeg -y -v error -i final.mp4 -filter_complex " - [0:v]${filter}${rgba}${noise}[v]" \\ - -map "[v]" -map 0:a -c:v libx264 -crf 14 -preset slow -profile:v high -c:a copy \\ - final_fx.mp4 -echo "[postfx] ${dna.name} → final_fx.mp4" -`, -); - -console.log( - `[make-theme] ${dna.name}: index.html${!bodyInBg || fx.html ? " + rail.html" : ""} + _postfx.sh`, -); -console.log( - `[make-theme] body=${dna.body.paradigm}(${dna.body.layer}) hero=${HEROLESS ? "none (pure body)" : heroInline ? "inline:" + dna.hero.setpiece : dna.hero.setpiece + " @" + heroIn.toFixed(2) + "s"} lines=${LINES.length} dur=${DUR}s`, -); diff --git a/.agents/skills/embedded-captions/scripts/make-theme.test.mjs b/.agents/skills/embedded-captions/scripts/make-theme.test.mjs deleted file mode 100644 index fedc4d4..0000000 --- a/.agents/skills/embedded-captions/scripts/make-theme.test.mjs +++ /dev/null @@ -1,131 +0,0 @@ -import assert from "node:assert/strict"; -import { spawnSync } from "node:child_process"; -import { - cpSync, - mkdirSync, - mkdtempSync, - readFileSync, - readdirSync, - rmSync, - writeFileSync, -} from "node:fs"; -import { tmpdir } from "node:os"; -import { dirname, join, resolve } from "node:path"; -import test from "node:test"; -import { fileURLToPath } from "node:url"; - -const scriptsDir = dirname(fileURLToPath(import.meta.url)); -const skillDir = resolve(scriptsDir, ".."); -const fixturesDir = join(scriptsDir, "fixtures", "heroless"); -const makeTheme = join(scriptsDir, "make-theme.cjs"); -const themeNames = readdirSync(join(skillDir, "themes")) - .filter((name) => name.endsWith(".json")) - .map((name) => name.slice(0, -5)) - .sort(); -const expectedThemes = [ - "anchor", - "arcade", - "aurora", - "biolume", - "brush", - "chalkboard", - "dossier", - "graffiti", - "hologram", - "inkwater", - "laser", - "lastpage", - "neonsign", - "ordnance", - "papercut", - "popup", - "ransom", - "scoreboard", - "spectrum", - "stardust", - "stomp", - "terminal", - "thunder", - "transit", - "vhs", -]; -const fixtureTheme = JSON.parse(readFileSync(join(fixturesDir, "theme.json"), "utf8")); -const fixtureWords = fixtureTheme.lines.flat(); - -test("every embedded-caption theme compiles a sane heroless body timeline", async (t) => { - assert.deepEqual(themeNames, expectedThemes); - assert.equal(Object.hasOwn(fixtureTheme, "hero"), false); - - const workspace = mkdtempSync(join(tmpdir(), "embedded-captions-heroless-")); - t.after(() => rmSync(workspace, { recursive: true, force: true })); - - for (const themeName of themeNames) { - await t.test(themeName, () => { - const project = join(workspace, themeName); - cpSync(fixturesDir, project, { recursive: true }); - writeFileSync( - join(project, "theme.json"), - JSON.stringify({ ...fixtureTheme, dna: themeName }), - ); - - const result = spawnSync(process.execPath, [makeTheme, project], { - encoding: "utf8", - timeout: 10_000, - }); - assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`); - - const dna = JSON.parse(readFileSync(join(skillDir, "themes", `${themeName}.json`), "utf8")); - const bodyPage = dna.body.layer === "bg" ? "index.html" : "rail.html"; - const generated = readFileSync(join(project, bodyPage), "utf8"); - const generatedPages = readdirSync(project) - .filter((name) => name.endsWith(".html")) - .map((name) => readFileSync(join(project, name), "utf8")); - - assert.match(generated, /data-composition-id="main"[^>]+data-duration="6"/s); - assert.match(generated, /window\.__timelines\["main"\] = tl;/); - for (const word of fixtureWords) assert.match(generated, new RegExp(`\\b${word}\\b`, "i")); - for (const page of generatedPages) assert.doesNotMatch(page, /-99\d(?:\.\d+)?/); - }); - } -}); - -for (const heroless of [false, true]) { - for (const grain of [0, 3, undefined]) { - test(`postfx preserves grain ${grain} with heroless=${heroless}`, (t) => { - const workspace = mkdtempSync(join(tmpdir(), "embedded-captions-grain-")); - t.after(() => rmSync(workspace, { recursive: true, force: true })); - const project = join(workspace, "project"); - cpSync(fixturesDir, project, { recursive: true }); - mkdirSync(join(workspace, "scripts")); - mkdirSync(join(workspace, "themes")); - const compiler = join(workspace, "scripts", "make-theme.cjs"); - cpSync(makeTheme, compiler); - const dna = JSON.parse(readFileSync(join(skillDir, "themes", "anchor.json"), "utf8")); - dna.plate.grain = grain; - writeFileSync(join(workspace, "themes", "anchor.json"), JSON.stringify(dna)); - writeFileSync( - join(project, "theme.json"), - JSON.stringify({ - ...fixtureTheme, - dna: "anchor", - ...(heroless - ? {} - : { - hero: { match: "hero" }, - lines: fixtureTheme.lines.map((line) => line.filter((word) => word !== "hero")), - }), - }), - ); - const result = spawnSync(process.execPath, [compiler, project], { - encoding: "utf8", - timeout: 10_000, - }); - assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`); - const postfx = readFileSync(join(project, "_postfx.sh"), "utf8"); - if (grain === 0) assert.doesNotMatch(postfx, /noise=/); - else assert.match(postfx, new RegExp(`noise=alls=${grain ?? 5}:allf=t\\+u`)); - assert.doesNotMatch(postfx, /,\s*\[v\]/); - assert.match(postfx, heroless ? /\[0:v\]null/ : /zoompan=/); - }); - } -} diff --git a/.agents/skills/embedded-captions/scripts/matte.cjs b/.agents/skills/embedded-captions/scripts/matte.cjs deleted file mode 100644 index 56b6ec6..0000000 --- a/.agents/skills/embedded-captions/scripts/matte.cjs +++ /dev/null @@ -1,268 +0,0 @@ -#!/usr/bin/env node -/* - * matte.cjs — subject matting via hyperframes' built-in `remove-background` - * (rembg-equivalent u2net_human_seg, Apache-2.0, 320×320 input, ~9 fps on - * CoreML). Replaces the previous bundled PP-MattingV2 ONNX (34 MB asset + - * an onnxruntime inference loop in this script): one engine, zero bundled - * weights — the model auto-downloads once (~168 MB) to ~/.cache/hyperframes/. - * - * Semantics note (validated 2026-06-12 on 6 scenes + a cold-start E2E): a - * HUMAN segmenter by intent, not surgically. Thin offset furniture (mic boom - * arms) is usually excluded — captions render over it, behind the person — - * but large salient objects near the subject (a telescope rig) can still - * leak into the matte and occlude captions. Objects HELD by the subject - * (products, phones) may drop out intermittently, letting captions pass in - * front. Never assume: sample frames_fg/ before placing the hero. - * - * Pipeline: - * source.mp4 → hyperframes remove-background → ProRes 4444 .mov (lossless - * alpha; temp, deleted) → ffmpeg fps= → frames_fg/f_%04d.png. - * frames_bg/ is extracted at the same rate (preview tooling reads it). - * - * node matte.cjs - * Reads: /source.mp4 (any video in the project dir is adopted) - * Writes: /frames_fg/f_%04d.png (RGBA, subject opaque), - * /frames_bg/f_%04d.png, /matte.fps - * Env: HYPERFRAMES_ROOT — hyperframes checkout (default ~/Downloads/hyperframes) - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); -const cp = require("child_process"); - -const { hfCli } = require("./hf-cli.cjs"); - -function ensureSource(project) { - const src = path.join(project, "source.mp4"); - if (!fs.existsSync(src)) { - const found = fs - .readdirSync(project) - .filter((f) => /\.(mp4|mov|webm|mkv)$/i.test(f) && !f.startsWith("_")) - .map((f) => path.join(project, f))[0]; - if (!found) return src; - try { - fs.symlinkSync(path.basename(found), src); - } catch { - fs.copyFileSync(found, src); - } - console.log(`[matte] resolved source.mp4 -> ${path.basename(found)}`); - } - return src; -} - -function rateOf(expr) { - const [n, d] = String(expr || "").split("/"); - const f = parseFloat(n) / parseFloat(d || "1"); - return Number.isFinite(f) && f > 0 ? f : 0; -} - -// Prefer avg_frame_rate (frames/duration — the truth) over r_frame_rate (the -// container's nominal tick rate, which lies on VFR sources: a 24fps screen -// recording can carry r_frame_rate=60 and would 2.5x-desync the matte). -function probeRates(src) { - try { - const out = cp - .execFileSync("ffprobe", [ - "-v", - "0", - "-select_streams", - "v:0", - "-show_entries", - "stream=r_frame_rate,avg_frame_rate", - "-of", - "default=nk=1:nw=1", - "--", - src, - ]) - .toString() - .trim() - .split("\n"); - return { r: rateOf(out[0]), avg: rateOf(out[1]) }; - } catch { - return { r: 0, avg: 0 }; - } -} - -function probeFps(src) { - const { r, avg } = probeRates(src); - const f = avg || r; - return f > 0 ? Math.max(1, Math.round(f)) : 24; -} - -// VFR when nominal and actual disagree by >5% — the remove-background engine -// mishandles VFR timestamps (observed: 2251 fg frames vs 902 bg on one clip), -// so VFR sources get normalized to CFR before matting. -function isVfr(src) { - const { r, avg } = probeRates(src); - return r > 0 && avg > 0 && Math.abs(r - avg) / avg > 0.05; -} - -function extractFrames(src, dst, fps, extra = []) { - fs.mkdirSync(dst, { recursive: true }); - if (fs.readdirSync(dst).some((f) => f.endsWith(".png"))) return false; - cp.execFileSync( - "ffmpeg", - ["-y", "-i", src, "-vf", `fps=${fps}`, ...extra, path.join(dst, "f_%04d.png")], - { stdio: "ignore" }, - ); - return true; -} - -function countPngs(dir) { - try { - return fs.readdirSync(dir).filter((f) => f.endsWith(".png")).length; - } catch { - return 0; - } -} - -async function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: matte.cjs "); - process.exit(1); - } - const src = ensureSource(project); - if (!fs.existsSync(src)) { - console.error(`[matte] no source video found in ${project}`); - process.exit(2); - } - - const fpsFile = path.join(project, "matte.fps"); - // read-with-catch (no exists-then-read TOCTOU): a missing/corrupt fps file - // simply falls through to probing the source. - let fps = 0; - try { - fps = parseInt(fs.readFileSync(fpsFile, "utf8").replace(/\D/g, ""), 10) || 0; - } catch { - /* no cached fps — probe below */ - } - if (!fps) fps = probeFps(src); - fs.writeFileSync(fpsFile, String(fps)); - - const framesBg = path.join(project, "frames_bg"); - const framesFg = path.join(project, "frames_fg"); - if (extractFrames(src, framesBg, fps)) - console.log(`[matte] source fps=${fps} → frames_bg extracted`); - - const want = countPngs(framesBg); - if (want > 0 && countPngs(framesFg) >= want) { - console.log(`[matte] frames_fg already complete (${want} frames) — nothing to do`); - return; - } - - // 1) subject matte via hyperframes (ProRes 4444 keeps the alpha lossless). - // VFR sources are normalized to CFR first — remove-background trusts - // timestamps and emits a desynced frame count on VFR input (the ghost - // double-subject bug: the pasted matte runs at the wrong speed). - let matteSrc = src; - if (isVfr(src)) { - const cfr = path.join(project, "_src_cfr.mp4"); - if (!fs.existsSync(cfr)) { - console.log( - `[matte] VFR source detected (nominal != actual fps) → normalizing to ${fps}fps CFR for matting`, - ); - cp.execFileSync( - "ffmpeg", - [ - "-y", - "-i", - src, - "-fps_mode", - "cfr", - "-r", - String(fps), - "-c:v", - "libx264", - "-crf", - "16", - "-preset", - "fast", - "-an", - cfr, - ], - { stdio: "ignore" }, - ); - } - matteSrc = cfr; - } - const mov = path.join(project, "_matte_tmp.mov"); - const t0 = Date.now(); - const cached = fs.existsSync( - path.join( - os.homedir(), - ".cache", - "hyperframes", - "background-removal", - "models", - "u2net_human_seg.onnx", - ), - ); - console.log( - `[matte] hyperframes remove-background (u2net_human_seg${cached ? "" : "; first run downloads ~168 MB"})… model load takes ~1-2 min with no output — not hung`, - ); - const r = cp.spawnSync("node", [hfCli(), "remove-background", matteSrc, "-o", mov], { - stdio: ["ignore", "pipe", "pipe"], - encoding: "utf8", - }); - if (r.status !== 0 || !fs.existsSync(mov)) { - console.error("[matte] remove-background FAILED:"); - console.error((r.stderr || r.stdout || "").split("\n").slice(-8).join("\n")); - process.exit(4); - } - - // 2) burst to RGBA pngs at the project rate - fs.mkdirSync(framesFg, { recursive: true }); - cp.execFileSync( - "ffmpeg", - ["-y", "-i", mov, "-vf", `fps=${fps}`, "-pix_fmt", "rgba", path.join(framesFg, "f_%04d.png")], - { stdio: "ignore" }, - ); - fs.rmSync(mov, { force: true }); - - // 3) count parity with frames_bg. Composite overlays fg by INDEX at matte.fps, - // so any fg/bg count mismatch is a time desync (subject ghosting). Handle - // BOTH directions: pad when short, linearly remap when long — and shout - // when the mismatch is big enough to mean broken timestamps upstream. - let got = countPngs(framesFg); - const tol = Math.max(2, Math.round(want * 0.01)); - if (Math.abs(got - want) > tol) { - console.error( - `[matte] WARN frame-count desync: fg=${got} vs bg=${want} (tolerance ${tol}). ` + - `Reconciling by remap — if the source is VFR this run predates the CFR fix; ` + - `delete frames_fg/ frames_bg/ matte.fps and re-run matte.cjs.`, - ); - } - if (got > want && want > 0) { - // keep want frames sampled evenly across got (re-times fg onto the bg timeline) - const keep = []; - for (let j = 1; j <= want; j++) - keep.push(Math.min(got, Math.max(1, Math.round((j - 0.5) * (got / want))))); - const tmp = path.join(project, "_fg_remap"); - fs.mkdirSync(tmp, { recursive: true }); - keep.forEach((srcIdx, k) => { - fs.copyFileSync( - path.join(framesFg, `f_${String(srcIdx).padStart(4, "0")}.png`), - path.join(tmp, `f_${String(k + 1).padStart(4, "0")}.png`), - ); - }); - fs.rmSync(framesFg, { recursive: true, force: true }); - fs.renameSync(tmp, framesFg); - got = countPngs(framesFg); - } - while (got < want && got > 0) { - fs.copyFileSync( - path.join(framesFg, `f_${String(got).padStart(4, "0")}.png`), - path.join(framesFg, `f_${String(got + 1).padStart(4, "0")}.png`), - ); - got++; - } - console.log( - `[matte] done in ${((Date.now() - t0) / 1000).toFixed(1)}s → fg=${got} bg=${want} @ ${fps}fps${got === want ? " (parity ok)" : ""}`, - ); -} - -main().catch((e) => { - console.error("[matte]", e.message); - process.exit(1); -}); diff --git a/.agents/skills/embedded-captions/scripts/measure-layout.cjs b/.agents/skills/embedded-captions/scripts/measure-layout.cjs deleted file mode 100644 index 422294b..0000000 --- a/.agents/skills/embedded-captions/scripts/measure-layout.cjs +++ /dev/null @@ -1,294 +0,0 @@ -#!/usr/bin/env node -/** - * measure-layout.cjs — pixel-perfect bbox measurement using headless Chromium. - * - * Loads the compiled index.html, seeks the GSAP timeline to specified sample - * times, queries every .cap container + every .w word span via - * getBoundingClientRect(), writes results to _layout.json. - * - * check-occlusion.cjs then reads _layout.json + frames_fg/*.png and computes - * per-word occlusion against the actual subject silhouette (matte alpha via - * sharp) — pixel accurate, no char_ratio guessing. - * - * Usage: - * node measure-layout.cjs [times...] - * If no times given, samples groups['in', 'out'] midpoints. - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); - -// Locate hyperframes' bundled puppeteer. render-and-composite.sh exports -// HYPERFRAMES_ROOT; standalone we also try the in-repo path + ~/Downloads, and -// accept ANY puppeteer@* the bun store holds (not a pinned version). -const HF_ROOTS = [ - process.argv[2] && path.resolve(process.argv[2]), // project-owned helper dependencies - process.env.HYPERFRAMES_ROOT, - path.resolve(__dirname, "../../.."), // skills/embedded-captions/scripts → repo root if in-repo - path.join(os.homedir(), "Downloads", "hyperframes"), -].filter(Boolean); -let puppeteer = null; -for (const root of HF_ROOTS) { - const cands = [path.join(root, "node_modules", "puppeteer")]; - const bunDir = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bunDir)) { - for (const d of fs.readdirSync(bunDir)) { - if (d.startsWith("puppeteer@")) - cands.push(path.join(bunDir, d, "node_modules", "puppeteer")); - } - } - } catch { - /* ignore */ - } - for (const p of cands) { - try { - if (fs.existsSync(p)) { - puppeteer = require(p); - break; - } - } catch { - /* try next */ - } - } - if (puppeteer) break; -} -if (!puppeteer) { - console.error( - "[measure] could not locate puppeteer — install project dependencies per embedded-captions SKILL.md Runtime prerequisites", - ); - process.exit(3); -} - -// Resolve hyperframes' bundled GSAP. The templates load GSAP from a CDN -// (cdn.jsdelivr.net), but in headless Chromium that request can be slow or -// blocked — the page's inline `gsap.timeline()` then throws "gsap is not -// defined" and the occlusion gate hard-fails. We inject this local copy on -// every new document (before any page script runs) so window.gsap always -// exists, and abort the CDN request so the parser never stalls on it. The -// render path is unaffected — this is measurement-only. -let gsapSource = null; -for (const root of HF_ROOTS) { - const cands = [path.join(root, "node_modules", "gsap", "dist", "gsap.min.js")]; - const bunDir = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bunDir)) { - for (const d of fs.readdirSync(bunDir)) { - if (d.startsWith("gsap@")) - cands.push(path.join(bunDir, d, "node_modules", "gsap", "dist", "gsap.min.js")); - } - } - } catch { - /* ignore */ - } - for (const p of cands) { - try { - if (fs.existsSync(p)) { - gsapSource = fs.readFileSync(p, "utf8"); - break; - } - } catch { - /* try next */ - } - } - if (gsapSource) break; -} - -async function main() { - const projectDir = process.argv[2]; - if (!projectDir) { - console.error("usage: measure-layout.cjs [t1 t2 ...]"); - process.exit(1); - } - const indexPath = path.resolve(projectDir, "index.html"); - if (!fs.existsSync(indexPath)) { - console.error(`[measure] missing ${indexPath} — run make-composition.cjs first`); - process.exit(2); - } - - // Load plan to get groups + sample times - const planPath = path.join(projectDir, "plan.json"); - let plan = null; - if (fs.existsSync(planPath)) plan = JSON.parse(fs.readFileSync(planPath, "utf8")); - - // Determine sample times: per group, sample multiple points across [in, out] - // (catches subject motion within block, multi-frame validation). - const explicitTimes = process.argv.slice(3).map(Number).filter(Number.isFinite); - let sampleTimes = explicitTimes; - if (sampleTimes.length === 0 && plan?.groups) { - const allTimes = new Set(); - for (const g of plan.groups) { - const dur = g.out - g.in; - // 4 samples per group: 15%, 40%, 65%, 90% through window — covers entry/peak/exit - [0.15, 0.4, 0.65, 0.9].forEach((p) => allTimes.add(+(g.in + dur * p).toFixed(3))); - } - sampleTimes = [...allTimes].sort((a, b) => a - b); - } - - // Match render-and-composite's Chrome detection - const exe = - process.platform === "darwin" - ? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - : "/usr/bin/google-chrome"; - - const W = plan?.width || 720; - const H = plan?.height || 1290; - const FPS = plan?.fps || 24; - - const browser = await puppeteer.launch({ - headless: "new", - executablePath: fs.existsSync(exe) ? exe : undefined, - args: [ - "--disable-web-security", - "--allow-file-access-from-files", - `--window-size=${W},${H}`, - "--disable-dev-shm-usage", - ], - }); - try { - const page = await browser.newPage(); - await page.setViewport({ width: W, height: H, deviceScaleFactor: 1 }); - page.on("pageerror", (err) => console.error(`[browser-error] ${err.message}`)); - - // Inject local GSAP before any page script + abort the CDN - - `; - - const emitted = withPreviewGsapSri(html, servedAsset); - const expected = `sha384-${crypto.createHash("sha384").update(servedAsset).digest("base64")}`; - const gsapTag = emitted.match(/]*gsap[^>]*>/i)[0]; - - assert.equal(sriSha384(servedAsset), expected); - assert.match(gsapTag, new RegExp(`integrity="${expected}"`)); - assert.match(gsapTag, /crossorigin="anonymous"/); - assert.match(emitted, /app\.js" integrity="sha384-app" crossorigin="anonymous"/); -}); diff --git a/.agents/skills/embedded-captions/scripts/render-and-composite.sh b/.agents/skills/embedded-captions/scripts/render-and-composite.sh deleted file mode 100755 index e79ae51..0000000 --- a/.agents/skills/embedded-captions/scripts/render-and-composite.sh +++ /dev/null @@ -1,430 +0,0 @@ -#!/usr/bin/env bash -# End-to-end: hyperframes render + ffmpeg overlay matte → final.mp4 -# -# Usage: -# bash render-and-composite.sh [hyperframes-repo-path] -# -# Env: -# HYPERFRAMES_ROOT override the hyperframes checkout location - -set -euo pipefail - -PROJECT="${1:?usage: render-and-composite.sh [hyperframes-repo]}" -PROJECT="$(cd "$PROJECT" && pwd)" - -SKILL_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -HF_CLI="$(node "$SKILL_SCRIPT_DIR/hf-cli.cjs" "${2:-}")" -# Retain the explicit dependency-root override for source-checkout users. -if [[ -n "${2:-}" ]]; then export HYPERFRAMES_ROOT="$2"; fi -if [[ ! -d "$PROJECT/frames_fg" ]]; then - echo "[render] missing matte frames at $PROJECT/frames_fg — run matte.cjs first" >&2 - exit 1 -fi -# Which compiler owns this project? Cinematic = make-composition.cjs (plan.json). -# (Standard mode retired 2026-06-12 — rail-surface needs are served by theme -# DNAs like "anchor"; legacy standard.json projects re-render from their -# existing index.html or via the archived compiler in embedded-captions-archive.) -compiler_for() { - echo "make-composition.cjs" -} -if [[ ! -f "$PROJECT/index.html" ]]; then - if [[ -f "$PROJECT/plan.json" ]]; then - C="$(compiler_for)" - echo "[render] no index.html — auto-compiling via $C" - node "$(dirname "$0")/$C" "$PROJECT" - elif [[ -f "$PROJECT/cinematic.json" ]]; then - # cinematic.json-only project: the full compiler lowers blocks → plan.json → html - echo "[render] no index.html — auto-compiling via make-cinematic.cjs" - node "$(dirname "$0")/make-cinematic.cjs" "$PROJECT" - else - echo "[render] missing $PROJECT/index.html and standard.json/plan.json/cinematic.json — author + compile first" >&2 - exit 1 - fi -elif [[ -f "$PROJECT/cinematic.json" && "$PROJECT/cinematic.json" -nt "$PROJECT/index.html" ]]; then - echo "[render] cinematic.json newer than index.html — recompiling" - node "$(dirname "$0")/make-cinematic.cjs" "$PROJECT" -elif [[ -f "$PROJECT/plan.json" && "$PROJECT/plan.json" -nt "$PROJECT/index.html" ]]; then - C="$(compiler_for)" - echo "[render] plan.json newer than index.html — recompiling via $C" - node "$(dirname "$0")/$C" "$PROJECT" -else - # the COMPILERS themselves may have changed since this project last compiled — - # rendering stale HTML after a compiler fix silently re-ships the old bug - C="$(compiler_for)" - RECOMPILER="$C" - # for cinematic projects the FULL compiler is make-cinematic (compiler_for points - # at make-composition, which only re-emits html from an already-compiled plan) - if [[ -f "$PROJECT/cinematic.json" && "$C" == "make-composition.cjs" ]]; then RECOMPILER="make-cinematic.cjs"; fi - ENGINE="$(dirname "$0")/../modes/cinematic/engine.html" - if [[ "$(dirname "$0")/$RECOMPILER" -nt "$PROJECT/index.html" || "$(dirname "$0")/lib-dna.cjs" -nt "$PROJECT/index.html" || ( -f "$ENGINE" && "$ENGINE" -nt "$PROJECT/index.html" ) ]]; then - echo "[render] compiler/engine newer than index.html — recompiling via $RECOMPILER" - node "$(dirname "$0")/$RECOMPILER" "$PROJECT" - fi -fi - -# Embed template fonts BEFORE the gates + render. hyperframes only auto-supplies -# its ~18 canonical fonts; every other template family (Anton, Bangers, VT323, -# Press Start 2P, …) silently falls back to a generic font on a clean/offline/CI -# machine — it only "looks right" locally when that font happens to be installed -# as a system font. inject-fonts inlines the @font-face (base64 woff2, from -# modes/standard/fonts/fonts.css) for whatever non-canonical families each HTML -# actually uses, so measure-layout AND the capture see the true glyph metrics. -# Idempotent; a no-op when every font is canonical/system or already declared. -node "$(dirname "$0")/inject-fonts.cjs" "$PROJECT" \ - || echo "[render] (font embed skipped — inject-fonts.cjs/fonts.css unavailable)" >&2 - -# gate ledger — each gate appends one line; echoed as a summary before "done" -# (verdicts were drowning hundreds of lines up in ffmpeg logs) -GATES="$PROJECT/_gates.txt"; : > "$GATES" - -# Gate: plan.json word timings must align with transcript.json within 80ms. -# A caption whose animation fires 500ms before or after the word is spoken -# breaks the "belongs to the scene" illusion — hard fail, not a warning. -# Skip only if transcript.json is missing (custom mode without transcript). -if [[ -f "$PROJECT/plan.json" && -f "$PROJECT/transcript.json" ]]; then - if ! node "$(dirname "$0")/check-timing.cjs" "$PROJECT" --strict; then - echo "[render] ABORTED — fix plan.json word timings to match transcript.json, then re-run." >&2 - exit 2 - fi - echo "timing PASS (strict)" >> "$GATES" -fi - -# Gate: subject occlusion + frame-edge overflow — pixel-perfect via Chromium DOM -# rects (measure-layout.cjs) × the subject-matte alpha (sharp). Template mode only -# (skipped when plan.json is absent; custom mode uses check-overflow.cjs below). -if [[ -f "$PROJECT/plan.json" && -d "$PROJECT/frames_fg" ]]; then - # check-occlusion prints its verdict, then can intermittently hang on native - # (sharp/libvips) teardown — which would wedge the whole render. Run it under a - # watchdog: once the verdict is printed, a stuck exit can't block us. We read the - # pass/fail from its OUTPUT, not its exit code, so the hang is harmless. - OCC_LOG="$PROJECT/_occlusion.log" - node "$(dirname "$0")/check-occlusion.cjs" "$PROJECT" --strict > "$OCC_LOG" 2>&1 & - OCC_PID=$!; occ_t0=$SECONDS; OCC_RC=""; verdict_at="" - while kill -0 "$OCC_PID" 2>/dev/null; do - # mark when the verdict header is printed (analysis done). if-form: a failed grep - # must NOT trip set -e (it silently killed the whole render on fresh projects). - if [[ -z "$verdict_at" ]] && grep -qE '\[v2\].*word-fail' "$OCC_LOG" 2>/dev/null; then verdict_at=$SECONDS; fi - # verdict printed but still alive 8s later → native (sharp) teardown hang; or no - # verdict after 150s → measure/analysis stuck, which cannot count as a pass. - if { [[ -n "$verdict_at" ]] && (( SECONDS - verdict_at > 8 )); } || (( SECONDS - occ_t0 > 150 )); then - kill -9 "$OCC_PID" 2>/dev/null - if [[ -z "$verdict_at" ]]; then - OCC_RC=3 - echo "[render] occlusion gate timed out before its verdict — killed; analysis incomplete (rc=3)" >&2 - break - fi - if grep -q 'cap(s) FAIL' "$OCC_LOG"; then OCC_RC=2; else OCC_RC=0; fi - echo "[render] occlusion gate hung after verdict (sharp teardown) — killed zombie; verdict rc=$OCC_RC" >&2 - break - fi - sleep 2 - done - if [[ -z "$OCC_RC" ]]; then OCC_RC=0; wait "$OCC_PID" 2>/dev/null || OCC_RC=$?; fi # capture rc without tripping set -e - cat "$OCC_LOG" - if (( OCC_RC != 0 )); then - echo "[render] ABORTED — fix plan.json layout to reduce subject occlusion / frame-edge overflow, then re-run." >&2 - echo " Override: OCCLUSION_SKIP=1 bash render-and-composite.sh " >&2 - if [[ "${OCCLUSION_SKIP:-0}" != "1" ]]; then - exit 2 - fi - echo "[render] OCCLUSION_SKIP=1 set — continuing despite occlusion/overflow warnings." >&2 - echo "occlusion+overflow OVERRIDDEN (OCCLUSION_SKIP=1 — conscious accept)" >> "$GATES" - fi - if (( OCC_RC == 0 )); then echo "occlusion+overflow PASS" >> "$GATES"; fi -fi - -# Custom mode (no plan.json) skips the template gates above. Run a lightweight, -# mode-agnostic frame-overflow check as a WARNING only — custom designs may bleed -# off-frame intentionally, so it never aborts, but it surfaces captions that fall -# off the canvas (the failure we otherwise only catch by eye). -if [[ ! -f "$PROJECT/plan.json" && -f "$PROJECT/index.html" && -f "$(dirname "$0")/check-overflow.cjs" ]]; then - node "$(dirname "$0")/check-overflow.cjs" "$PROJECT" \ - || echo "[render] (overflow check skipped — Chromium/puppeteer unavailable)" >&2 - echo "overflow(index) checked (custom mode, warning-only)" >> "$GATES" -fi -# rail.html gets NO other automated coverage (the occlusion gate only reads plan.json -# caps) — run its overflow check whenever it exists. Was dead code inside the -# no-plan.json branch: Standard always HAS a derived plan.json, so it never ran. -if [[ -f "$PROJECT/rail.html" && -f "$(dirname "$0")/check-overflow.cjs" ]]; then - if node "$(dirname "$0")/check-overflow.cjs" "$PROJECT" rail.html; then - echo "overflow(rail) PASS" >> "$GATES" - else - echo "[render] (rail overflow check skipped — Chromium/puppeteer unavailable)" >&2 - echo "overflow(rail) skipped (infra)" >> "$GATES" - fi -fi - -# Standard hand-off gate: the PROMOTED climax word must NOT also be revealed in the -# rail during the climax's on-screen window (PIPELINE.md "Rail ↔ climax hand-off"). -# Hard-fails on a CONFIRMED duplicate; infra issues (no puppeteer, etc.) exit 0 and -# never block. Override with RAIL_CLIMAX_SKIP=1 for a deliberate exception. -if [[ -f "$PROJECT/rail.html" && -f "$PROJECT/index.html" && -f "$(dirname "$0")/check-rail-climax.cjs" ]]; then - if ! node "$(dirname "$0")/check-rail-climax.cjs" "$PROJECT"; then - echo "[render] ABORTED — the promoted climax word is duplicated in the rail." >&2 - echo " Apply the rail↔climax hand-off (PIPELINE.md), then re-run." >&2 - echo " Override: RAIL_CLIMAX_SKIP=1 bash render-and-composite.sh " >&2 - if [[ "${RAIL_CLIMAX_SKIP:-0}" != "1" ]]; then - exit 2 - fi - echo "[render] RAIL_CLIMAX_SKIP=1 — continuing despite the rail/climax duplicate." >&2 - echo "rail-climax OVERRIDDEN (RAIL_CLIMAX_SKIP=1)" >> "$GATES" - else - echo "rail-climax PASS (no duplicate reveal)" >> "$GATES" - fi -fi - -# FPS: matte.fps (written by matte.cjs at the source's NATIVE rate) is authoritative -# so the matte overlay stays frame-aligned with the render. Falls back to plan.fps / -# frame-count inference / 24. Warn if plan.json fps disagrees with the matte. -FPS="" -if [[ -f "$PROJECT/matte.fps" ]]; then - FPS="$(tr -dc '0-9' < "$PROJECT/matte.fps")" - if [[ -f "$PROJECT/plan.json" ]]; then - PFPS="$(node -e 'try{process.stdout.write(String(require(process.argv[1]).fps??""))}catch(e){}' "$PROJECT/plan.json" 2>/dev/null || true)" - if [[ -n "$PFPS" && "$PFPS" != "$FPS" ]]; then - echo "[render] WARN: plan.json fps=$PFPS != matte fps=$FPS — using matte fps to keep occlusion aligned" >&2 - fi - fi -fi -if [[ -z "$FPS" || "$FPS" == "0" ]]; then - if [[ -f "$PROJECT/plan.json" ]]; then - FPS="$(node -e 'process.stdout.write(String(require(process.argv[1]).fps??24))' "$PROJECT/plan.json")" - elif [[ -d "$PROJECT/frames_fg" ]]; then - N="$(ls "$PROJECT/frames_fg" | wc -l | tr -d ' ')" - DUR="$(grep -oE 'data-duration="[0-9.]+"' "$PROJECT/index.html" | head -1 | grep -oE '[0-9.]+' || echo '')" - if [[ -n "$DUR" && "$N" -gt 0 ]]; then - FPS="$(awk "BEGIN{printf \"%d\", $N/$DUR + 0.5}")" - else - FPS=24 - fi - else - FPS=24 - fi -fi - -# Caption layer: "bg" (classic embed — matte overlays subject on top of caps) -# or "fg" (captions always on top — announcement feel, used for 9:16 portraits -# where the subject fills the frame and bg mode loses too much to occlusion). -# Precedence: CLI env flag > plan.json > HTML data attribute > "bg". -CAPTION_LAYER="${CAPTION_LAYER_FLAG:-}" -if [[ -z "$CAPTION_LAYER" && -f "$PROJECT/plan.json" ]]; then - CAPTION_LAYER="$(node -e 'process.stdout.write(String(require(process.argv[1]).caption_layer??"bg"))' "$PROJECT/plan.json")" -fi -if [[ -z "$CAPTION_LAYER" && -f "$PROJECT/index.html" ]]; then - ATTR="$(grep -oE 'data-caption-layer="(bg|fg)"' "$PROJECT/index.html" | head -1 | grep -oE '(bg|fg)' || true)" - if [[ -n "$ATTR" ]]; then CAPTION_LAYER="$ATTR"; fi -fi -CAPTION_LAYER="${CAPTION_LAYER:-bg}" -echo "[render] caption_layer=$CAPTION_LAYER" - -BG="$PROJECT/bg_plus_caps.mp4" -FINAL="$PROJECT/final.mp4" - -# Snapshot the current index.html + plan.json into history/ so the user -# can recover a prior iteration's design after further edits overwrite it. -HISTORY_DIR="$PROJECT/history" -mkdir -p "$HISTORY_DIR" -STAMP="$(date +%Y%m%d-%H%M%S)" -cp "$PROJECT/index.html" "$HISTORY_DIR/index-${STAMP}.html" -cp "$PROJECT/plan.json" "$HISTORY_DIR/plan-${STAMP}.json" 2>/dev/null || true -echo "[render] snapshot → history/index-${STAMP}.html" - -echo "[render] hyperframes render @ ${FPS}fps" - -# Wait for the renderer's real exit status. File size cannot prove completion, -# and a portable process snapshot cannot safely recover a timed-out render tree. -# Cancellation/browser cleanup belongs to the CLI that owns those processes. -hf_render_dir() { - local out="$1" label="$2" proj="$3" fmt="${4:-}" - if [[ -n "$fmt" ]]; then - node "$HF_CLI" render --skill=embedded-captions --dir "$proj" --fps "$FPS" --format "$fmt" --crf 11 -o "$out" || return $? - else - node "$HF_CLI" render --skill=embedded-captions --dir "$proj" --fps "$FPS" --crf 11 -o "$out" || return $? - fi - [[ -f "$out" ]] -} - -# Link a project's assets into a shadow render dir EXCEPT the files we manage -# (the HTML we override + render outputs/intermediates). Links every other entry by -# its real name, so the shadow resolves whatever media the HTML references — including -# the ORIGINAL video filename `hyperframes init` scaffolds (e.g. clip.mp4), not just a -# fixed allow-list. Prevents the shadow-render 404 → silent/frozen output → abort. -link_assets() { # - local proj="$1" sh="$2" b - for p in "$proj"/*; do - [[ -e "$p" ]] || continue - b="$(basename "$p")" - case "$b" in - index.html|rail.html|index_fg.html|final.mp4|bg_plus_caps.mp4|fg_caps.mp4|rail.webm|history|_*) continue;; - esac - ln -sf "$p" "$sh/$b" - done -} - -# Hybrid renders need 2 independent hyperframes passes. They share no state, so -# we run them in parallel (one in the main PROJECT, one in a shadow dir with -# index_fg.html renamed to index.html). Saves ~half of the Chromium cost. -FG_SHADOW="" -if [[ -f "$PROJECT/index_fg.html" ]]; then - FG_SHADOW="$PROJECT/_fg_shadow" - rm -rf "$FG_SHADOW" && mkdir -p "$FG_SHADOW" - # Link shared assets (any media filename); copy index_fg.html into shadow as index.html. - link_assets "$PROJECT" "$FG_SHADOW" - cp "$PROJECT/index_fg.html" "$FG_SHADOW/index.html" - - FG_CAPS="$PROJECT/fg_caps.mp4" - echo "[render] hybrid fg/bg — launching both passes in parallel" - hf_render_dir "$BG" "bg_plus_caps" "$PROJECT" & - BG_PID=$! - hf_render_dir "$FG_CAPS" "fg_caps" "$FG_SHADOW" & - FG_PID=$! - # Wait for both; fail if either fails. - BG_RC=0; wait "$BG_PID" || BG_RC=$? - FG_RC=0; wait "$FG_PID" || FG_RC=$? - rm -rf "$FG_SHADOW" - if (( BG_RC != 0 )); then echo "[render] bg render failed" >&2; exit 1; fi - if (( FG_RC != 0 )); then echo "[render] fg render failed" >&2; exit 1; fi -elif [[ -f "$PROJECT/rail.html" ]]; then - # Standard mode: TWO independent hyperframes passes (base = index.html with the - # embed; rail = rail.html transparent). Each renders from its own shadow dir (the - # multiple-root ambiguity), and they share no state — run them IN PARALLEL like - # the fg-hybrid above (~halves the Chromium wall time). The rail webm is consumed - # by the composite stage below, which finds it already rendered. - BASE_SHADOW="$PROJECT/_base_shadow"; rm -rf "$BASE_SHADOW"; mkdir -p "$BASE_SHADOW" - link_assets "$PROJECT" "$BASE_SHADOW" - cp "$PROJECT/index.html" "$BASE_SHADOW/index.html" - RAIL_SHADOW="$PROJECT/_rail_shadow"; rm -rf "$RAIL_SHADOW"; mkdir -p "$RAIL_SHADOW" - link_assets "$PROJECT" "$RAIL_SHADOW" - cp "$PROJECT/rail.html" "$RAIL_SHADOW/index.html" - RAIL_WEBM="$PROJECT/rail.webm" - echo "[render] standard base + rail — launching both passes in parallel" - hf_render_dir "$BG" "bg_plus_caps" "$BASE_SHADOW" & - BASE_PID=$! - hf_render_dir "$RAIL_WEBM" "rail" "$RAIL_SHADOW" "webm" & - RAIL_PID=$! - BASE_RC=0; wait "$BASE_PID" || BASE_RC=$? - RAIL_RC=0; wait "$RAIL_PID" || RAIL_RC=$? - rm -rf "$BASE_SHADOW" "$RAIL_SHADOW" - if (( BASE_RC != 0 )); then echo "[render] bg render failed" >&2; exit 1; fi - if (( RAIL_RC != 0 )); then echo "[render] rail render failed" >&2; exit 1; fi -else - hf_render_dir "$BG" "bg_plus_caps" "$PROJECT" \ - || { echo "[render] bg render failed" >&2; exit 1; } -fi - -# Probe render dims for ffmpeg scale -W="$(ffprobe -v error -select_streams v:0 -show_entries stream=width -of default=nw=1:nk=1 -- "$BG")" -H="$(ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=nw=1:nk=1 -- "$BG")" - -# Clamp every composite to the matte (= source-video) length. The render uses -# plan.duration / data-duration, which can exceed the source (e.g. Whisper word -# timestamps overrun the clip). Past the source the a-roll is gone (black) but the -# matte overlay repeats its last frame → the tail shows the subject floating on -# black. frames_fg count/fps APPROXIMATES the source length, but fractional-rate -# sources (29.97) get over-extracted by integer-fps rounding (e.g. 544 frames for -# a 542-frame 18.085s clip -> 544/30 = 18.133s -> ~1.5 trailing BLACK frames after -# the a-roll stream ends). The true a-roll duration is authoritative: clamp to -# min(matte frames / fps, source duration). -MATTE_DUR="$(awk "BEGIN{printf \"%.3f\", $(ls "$PROJECT/frames_fg" | wc -l)/$FPS}")" -SRC_DUR="$(ffprobe -v error -show_entries format=duration -of csv=p=0 -- "$PROJECT/source.mp4" 2>/dev/null || true)" -if [[ -n "${SRC_DUR:-}" ]]; then - MATTE_DUR="$(awk "BEGIN{m=$MATTE_DUR; s=$SRC_DUR; printf \"%.3f\", (s>0 && s/dev/null | tr -dc '0-9.')" - if [[ -n "$BG_DUR" ]] && awk "BEGIN{exit !($BG_DUR < $MATTE_DUR - 0.3)}"; then - echo "[render] ⚠ background plate is ${BG_DUR}s but the clip is ${MATTE_DUR}s — the composition is shorter than the footage." >&2 - echo " The tail would show ONLY the foreground subject on black. FIX: set the composition" >&2 - echo " duration to the SOURCE clip length (data-duration on #root/#a-roll); captions may still" >&2 - echo " end earlier. Clamping output to ${BG_DUR}s for now to avoid the broken tail." >&2 - MATTE_DUR="$BG_DUR" - fi -fi - -# ───────────────────────────────────────────────────────────────────────────── -# STANDARD mode (rail + embed) — detected by rail.html. -# $BG = index.html rendered (source video + the embed climax). -# (1) overlay the subject matte so the subject occludes the climax (embed = behind). -# (2) render rail.html → transparent WebM (the verbatim rail). -# (3) alpha-composite the rail IN FRONT so it is never occluded (rail = on top). -# The existing Cinematic paths below are untouched. -if [[ -f "$PROJECT/rail.html" ]]; then - MATTED="$PROJECT/_matted.mp4" - if [[ "$CAPTION_LAYER" == "fg" ]]; then - # caption_layer:fg — the climax sits IN FRONT of the subject (no behind-subject - # embed possible, e.g. a frame-filling 9:16 subject). bg_plus_caps already has the - # climax drawn over the video, so we SKIP the matte overlay (which would push the - # subject back in front of it). The rail still overlays on top below. - echo "[render] STANDARD (rail + FRONT climax) — caption_layer=fg, matte overlay skipped (${W}x${H})" - cp "$BG" "$MATTED" - else - echo "[render] STANDARD (rail + embed) — embed behind subject, rail alpha-overlaid in front (${W}x${H})" - ffmpeg -y -i "$BG" \ - -framerate "$FPS" -i "$PROJECT/frames_fg/f_%04d.png" \ - -filter_complex "[1:v]scale=${W}:${H},format=yuva420p[m];[0:v][m]overlay=format=auto[v]" \ - -map "[v]" -map 0:a -r "$FPS" -t "$MATTE_DUR" -c:v libx264 -crf 11 -preset medium -c:a copy "$MATTED" - fi - - # rail.webm was already rendered IN PARALLEL with the base pass above. - RAIL_WEBM="$PROJECT/rail.webm" - [[ -f "$RAIL_WEBM" ]] || { echo "[render] rail.webm missing (parallel rail pass failed?)" >&2; exit 1; } - - # alpha-overlay the transparent rail in front of the matted video (force vp9 - # decode so the WebM alpha plane is honoured by overlay) - ffmpeg -y -i "$MATTED" -c:v libvpx-vp9 -i "$RAIL_WEBM" \ - -filter_complex "[0:v][1:v]overlay=format=auto[v]" \ - -map "[v]" -map 0:a -r "$FPS" -t "$MATTE_DUR" -c:v libx264 -crf 11 -preset medium -c:a copy "$FINAL" - rm -f "$MATTED" - if [[ -s "$GATES" ]]; then echo "[render] ── gates ──"; sed 's/^/[render] /' "$GATES"; fi -echo "[render] done → $FINAL" - exit 0 -fi - -# Decide composite mode: -# - If make-composition emitted index_fg.html (any group has layer:fg), -# use hybrid regardless of plan-level caption_layer. -# - Else if caption_layer=fg globally, skip matte. -# - Else (default), matte embed. -if [[ -f "$PROJECT/index_fg.html" ]]; then - # Hybrid: bg_plus_caps and fg_caps were both rendered above in parallel. - # Now composite: bg_plus_caps + matte (subject on top) + fg_caps (screen). - FG_CAPS="$PROJECT/fg_caps.mp4" - echo "[render] hybrid — composite (bg_plus_caps + matte + fg_caps[screen blend])" - # fg_caps is bright caption on pure black. blend=screen makes it behave - # like CSS mix-blend-mode: screen on the matted video — captions pick up - # scene luminance, NOT a flat opaque overlay (which looks sticker-like). - # Use rgb format to avoid YUV-space color drift, then convert back for libx264. - ffmpeg -y -i "$BG" \ - -framerate "$FPS" -i "$PROJECT/frames_fg/f_%04d.png" \ - -i "$FG_CAPS" \ - -filter_complex "[1:v]scale=${W}:${H},format=yuva420p[matte];[0:v][matte]overlay=format=auto,format=gbrp[matted];[2:v]format=gbrp[fg];[matted][fg]blend=all_mode=screen,format=yuv420p[v]" \ - -map "[v]" -map 0:a \ - -r "$FPS" -t "$MATTE_DUR" -c:v libx264 -crf 12 -preset medium -c:a copy \ - "$FINAL" -elif [[ "$CAPTION_LAYER" == "fg" ]]; then - # Global FG mode: skip matte overlay entirely. bg_plus_caps.mp4 already - # has captions on top of a-roll. Re-encode for consistency. - echo "[render] fg mode (global) — skipping matte, re-encoding ${W}x${H}" - ffmpeg -y -i "$BG" \ - -r "$FPS" -t "$MATTE_DUR" -c:v libx264 -crf 12 -preset medium -c:a copy \ - "$FINAL" -else - echo "[render] bg mode — overlay matte (${W}x${H})" - ffmpeg -y -i "$BG" \ - -framerate "$FPS" -i "$PROJECT/frames_fg/f_%04d.png" \ - -filter_complex "[1:v]scale=${W}:${H},format=yuva420p[fg];[0:v][fg]overlay=format=auto[v]" \ - -map "[v]" -map 0:a \ - -r "$FPS" -t "$MATTE_DUR" -c:v libx264 -crf 12 -preset medium -c:a copy \ - "$FINAL" -fi - -if [[ -s "$GATES" ]]; then echo "[render] ── gates ──"; sed 's/^/[render] /' "$GATES"; fi -echo "[render] done → $FINAL" diff --git a/.agents/skills/embedded-captions/scripts/render-and-composite.test.mjs b/.agents/skills/embedded-captions/scripts/render-and-composite.test.mjs deleted file mode 100644 index 9d25c9d..0000000 --- a/.agents/skills/embedded-captions/scripts/render-and-composite.test.mjs +++ /dev/null @@ -1,116 +0,0 @@ -import assert from "node:assert/strict"; -import { spawnSync } from "node:child_process"; -import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import test from "node:test"; - -const source = readFileSync(new URL("./render-and-composite.sh", import.meta.url), "utf8"); -const gateStart = source.indexOf( - 'if [[ -f "$PROJECT/plan.json" && -d "$PROJECT/frames_fg" ]]; then', -); -const gateEnd = source.indexOf("\n# Custom mode", gateStart); -assert.ok(gateStart >= 0 && gateEnd > gateStart, "occlusion gate must be present"); -const gate = source.slice(gateStart, gateEnd); - -function runGate(t, { output = "", exitCode, skip = false }) { - const root = mkdtempSync(join(tmpdir(), "hf-occlusion-gate-")); - t.after(() => rmSync(root, { recursive: true, force: true })); - const project = join(root, "project with spaces"); - mkdirSync(join(project, "frames_fg"), { recursive: true }); - writeFileSync(join(project, "plan.json"), "{}"); - writeFileSync( - join(root, "check-occlusion.cjs"), - `const fs = require("node:fs"); -fs.writeSync(1, ${JSON.stringify(output)}); -fs.writeFileSync(process.argv[2] + "/analyzer-ready", ""); -${exitCode === undefined ? "setInterval(() => {}, 1000);" : `process.exit(${exitCode});`} -`, - ); - // Run the production gate with a ready analyzer before advancing its Bash clock. - // A silent hanging analyzer must abort, never leave a PASS in the gate ledger. - const harness = join(root, "gate.sh"); - writeFileSync( - harness, - `#!/usr/bin/env bash -set -euo pipefail -PROJECT="$1" -GATES="$PROJECT/_gates.txt"; : > "$GATES" -OCC_PID="" -trap 'if [[ -n "$OCC_PID" ]]; then kill -9 "$OCC_PID" 2>/dev/null || true; wait "$OCC_PID" 2>/dev/null || true; fi' EXIT -sleep() { - ${exitCode === undefined ? 'while [[ ! -f "$PROJECT/analyzer-ready" ]]; do command sleep 0.01; done\n SECONDS=$((SECONDS + 10))' : "command sleep 0.01"} -} -${gate} -echo continued -`, - ); - const result = spawnSync("bash", [harness, project], { - encoding: "utf8", - timeout: 10000, - env: { ...process.env, OCCLUSION_SKIP: skip ? "1" : "0" }, - }); - assert.ifError(result.error); - return { ...result, ledger: readFileSync(join(project, "_gates.txt"), "utf8") }; -} - -const verdict = "[v2] fixture word-fail≥65% cap-fail≥55%\n"; -const failure = "[v2] 1 cap(s) FAIL: caption\n"; - -test("a timeout before any verdict aborts without recording PASS", (t) => { - const result = runGate(t, {}); - assert.equal(result.status, 2, result.stderr); - assert.equal(result.ledger, ""); - assert.doesNotMatch(result.stdout, /continued/); - assert.match(result.stderr, /timed out before.*verdict/); - assert.doesNotMatch(result.stderr, /hung after verdict/); -}); - -test("partial analysis output cannot make a timeout pass", (t) => { - const result = runGate(t, { output: "[v2] measuring layout\n" }); - assert.equal(result.status, 2, result.stderr); - assert.equal(result.ledger, ""); -}); - -test("a pre-verdict timeout can only continue as an explicit override", (t) => { - const result = runGate(t, { skip: true }); - assert.equal(result.status, 0, result.stderr); - assert.match(result.ledger, /occlusion\+overflow OVERRIDDEN/); - assert.doesNotMatch(result.ledger, /PASS/); - assert.match(result.stdout, /continued/); -}); - -test("a passing verdict still tolerates a native teardown hang", (t) => { - const result = runGate(t, { output: verdict }); - assert.equal(result.status, 0, result.stderr); - assert.equal(result.ledger, "occlusion+overflow PASS\n"); - assert.match(result.stdout, /continued/); -}); - -test("a failing verdict still aborts after a native teardown hang", (t) => { - const result = runGate(t, { output: verdict + failure }); - assert.equal(result.status, 2, result.stderr); - assert.equal(result.ledger, ""); - assert.doesNotMatch(result.stdout, /continued/); -}); - -test("a normally completed check records PASS", (t) => { - const result = runGate(t, { output: verdict, exitCode: 0 }); - assert.equal(result.status, 0, result.stderr); - assert.equal(result.ledger, "occlusion+overflow PASS\n"); - assert.doesNotMatch(result.stderr, /timed out|hung after verdict/); -}); - -test("a normally failed check aborts", (t) => { - const result = runGate(t, { output: verdict + failure, exitCode: 2 }); - assert.equal(result.status, 2, result.stderr); - assert.equal(result.ledger, ""); - assert.doesNotMatch(result.stderr, /timed out|hung after verdict/); -}); - -test("an analyzer error aborts without recording PASS", (t) => { - const result = runGate(t, { output: "[v2] cannot measure layout\n", exitCode: 1 }); - assert.equal(result.status, 2, result.stderr); - assert.equal(result.ledger, ""); - assert.doesNotMatch(result.stderr, /timed out|hung after verdict/); -}); diff --git a/.agents/skills/embedded-captions/scripts/render-theme.sh b/.agents/skills/embedded-captions/scripts/render-theme.sh deleted file mode 100644 index 68a3b42..0000000 --- a/.agents/skills/embedded-captions/scripts/render-theme.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -# render-theme.sh — compile + render + plate-reaction for THEME mode projects. -# bash render-theme.sh -# Project needs: theme.json, transcript.json, source.mp4, frames_fg/, matte.fps -# Output: final_fx.mp4 (final.mp4 = before plate reaction) -set -euo pipefail -PROJECT="${1:?usage: render-theme.sh }" -PROJECT="$(cd "$PROJECT" && pwd)" -SD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -node "$SD/make-theme.cjs" "$PROJECT" -# Gate honesty (cold-start E2E finding): theme mode enforces word timing at -# COMPILE time (sequential transcript matcher + verbatim completeness gate in -# make-theme.cjs — a mistimed/missing word is a compile error, not a render -# warning). The pixel occlusion gate is Cinematic-only; themes place heroes -# scene-aware (safe-zones) and are covered by overflow + rail-climax + the -# PAGEERROR gate below. -echo "[render-theme] gates: timing PASS (compile-enforced verbatim matcher)" -echo "[render-theme] gates: occlusion = scene-aware placement (pixel gate is Cinematic-only)" -RLOG="$PROJECT/_render-theme.log" -bash "$SD/render-and-composite.sh" "$PROJECT" 2>&1 | tee "$RLOG" -# GATE: a JS error in either generated layer silently yields a blank caption -# layer while every downstream gate still passes — fail loudly instead. -if grep -q "PAGEERROR" "$RLOG"; then - echo "[render-theme] FAIL — Browser PAGEERROR in a generated layer (see $RLOG)." >&2 - echo " The caption timeline did not build; the output is missing captions." >&2 - exit 2 -fi -if [[ -f "$PROJECT/_postfx.sh" ]]; then - bash "$PROJECT/_postfx.sh" -else - cp "$PROJECT/final.mp4" "$PROJECT/final_fx.mp4" -fi -echo "[render-theme] done → $PROJECT/final_fx.mp4 (DELIVERABLE: final_fx.mp4; final.mp4 is the pre-plate-reaction cut)" diff --git a/.agents/skills/embedded-captions/scripts/safe-zones.cjs b/.agents/skills/embedded-captions/scripts/safe-zones.cjs deleted file mode 100644 index 95f31ec..0000000 --- a/.agents/skills/embedded-captions/scripts/safe-zones.cjs +++ /dev/null @@ -1,816 +0,0 @@ -#!/usr/bin/env node -/* - * safe-zones.cjs — PRECOMPUTE where captions can safely go, from the subject matte. - * - * node safe-zones.cjs → safe-zones.json (global + per-sentence windows) + summary - * node safe-zones.cjs → just that time window's zones (ad-hoc query) - * - * The inverse of check-occlusion: read the silhouette FIRST and hand the author the - * clean regions + an embed-vs-fg verdict, so layout is right the first time instead of - * after N occlusion-failure rounds. - * - * Uses the per-pixel ALPHA matte (not a bounding box): a cell counts as subject only - * where the silhouette actually is, so the empty pocket beside the head / above the - * shoulders stays FREE (a bbox would wrongly claim it). The subject MOVES, so zones are - * computed PER TIME WINDOW (the union over just that window's frames), not one global box. - */ -const path = require("path"); -const fs = require("fs"); -const os = require("os"); - -const THRESH = 30 / 255; // a cell is "subject" if ≥12% covered at any sampled frame in the window -const SAMPLES = 48; // frames cached across the clip (windows aggregate the cached grids) - -const HF_ROOTS = [ - process.argv[2] && path.resolve(process.argv[2]), // project-owned helper dependencies - process.env.HYPERFRAMES_ROOT, - path.resolve(__dirname, "../../.."), - path.join(os.homedir(), "Downloads", "hyperframes"), -].filter(Boolean); -let sharp = null; -for (const root of HF_ROOTS) { - const cands = [path.join(root, "node_modules", "sharp")]; - const bunDir = path.join(root, "node_modules", ".bun"); - try { - if (fs.existsSync(bunDir)) - for (const d of fs.readdirSync(bunDir)) - if (d.startsWith("sharp@")) cands.push(path.join(bunDir, d, "node_modules", "sharp")); - } catch {} - for (const c of cands) { - try { - if (fs.existsSync(c)) { - sharp = require(c); - break; - } - } catch {} - } - if (sharp) break; -} - -// largest all-clear (1) rectangle within [c0,c1)×[r0,r1), in CELL units -function largestRect(safe, GW, c0, c1, r0, r1) { - const cols = c1 - c0; - const heights = new Array(cols).fill(0); - let best = { area: 0, x: 0, y: 0, w: 0, h: 0 }; - for (let r = r0; r < r1; r++) { - for (let cc = 0; cc < cols; cc++) heights[cc] = safe[r * GW + (c0 + cc)] ? heights[cc] + 1 : 0; - const st = []; - for (let cc = 0; cc <= cols; cc++) { - const h = cc < cols ? heights[cc] : 0; - let start = cc; - while (st.length && st[st.length - 1].h >= h) { - const top = st.pop(); - const area = top.h * (cc - top.i); - if (area > best.area) - best = { area, x: c0 + top.i, y: r - top.h + 1, w: cc - top.i, h: top.h }; - start = top.i; - } - st.push({ i: start, h }); - } - } - return best; -} - -// turn a max-coverage grid into {coverage, subject, zones, recommendation} -function analyze(occ, GW, GH, W, H, lum, lumSeries) { - const occCell = new Uint8Array(GW * GH); - for (let c = 0; c < GW * GH; c++) occCell[c] = occ[c] >= THRESH ? 1 : 0; - const safe = new Uint8Array(GW * GH); // 1-cell dilation margin around the silhouette - for (let y = 0; y < GH; y++) - for (let x = 0; x < GW; x++) { - let o = 0; - for (let dy = -1; dy <= 1 && !o; dy++) - for (let dx = -1; dx <= 1 && !o; dx++) { - const nx = x + dx, - ny = y + dy; - if (nx >= 0 && nx < GW && ny >= 0 && ny < GH && occCell[ny * GW + nx]) o = 1; - } - safe[y * GW + x] = o ? 0 : 1; - } - const occupied = occCell.reduce((a, b) => a + b, 0); - const coverage = occupied / (GW * GH); - let colMin = GW, - colMax = -1, - rowMin = GH, - rowMax = -1; - for (let x = 0; x < GW; x++) - for (let y = 0; y < GH; y++) - if (occCell[y * GW + x]) { - if (x < colMin) colMin = x; - if (x > colMax) colMax = x; - if (y < rowMin) rowMin = y; - if (y > rowMax) rowMax = y; - } - if (colMax < 0) { - colMin = 0; - colMax = -1; - rowMin = 0; - rowMax = -1; - } - const clearerSide = colMin >= GW - 1 - colMax ? "left" : "right"; - const cellW = W / GW, - cellH = H / GH; - // HERO anchor — where the ONE big promoted word should sit: ON the subject (centered, - // crossing it so the head/torso occludes the middle). The OPPOSITE of the clean zones - // above (those are for narration). A wide band ≈ centered on the subject, vertically - // crossing the head/upper torso. Only meaningful when there IS a subject. - let heroAnchor = null; - if (colMax >= 0) { - const subjCx = ((colMin + colMax + 1) / 2 / GW) * 100; - const subjWpct = ((colMax - colMin + 1) / GW) * 100; - const yTop = (rowMin / GH) * 100, - yBot = ((rowMax + 1) / GH) * 100; - const wPct = Math.round(Math.min(92, Math.max(58, subjWpct + 26))); - const xPct = Math.round(Math.min(98 - wPct, Math.max(2, subjCx - wPct / 2))); - const yPct = Math.round(yTop + (yBot - yTop) * 0.12); // band crosses the head / upper torso - let bandLuma = null; - if (lum) { - const y0 = Math.round((yPct / 100) * GH), - y1 = Math.min(GH, y0 + Math.max(2, Math.round(GH * 0.14))); - const x0 = Math.round((xPct / 100) * GW), - x1 = Math.min(GW, Math.round(((xPct + wPct) / 100) * GW)); - // luma of the BACKGROUND cells only — that's where the hero's glyphs are visible - // (the subject-occluded middle doesn't show text; averaging it in hides washout). - let s2 = 0, - n = 0; - for (let y = y0; y < y1; y++) - for (let x = x0; x < x1; x++) { - if (occCell[y * GW + x]) continue; - s2 += lum[y * GW + x]; - n++; - } - bandLuma = n ? Math.round(s2 / n) : null; - } - heroAnchor = { - centerXPct: +subjCx.toFixed(1), - plane: { xPct, yPct, wPct, align: "center" }, - ...(bandLuma != null ? { bandLuma, washoutRisk: bandLuma > 175 } : {}), - note: - "Place the ONE big hero here (centered on the subject); the head/torso occludes its middle (~30-55%) — that is the embed. Do NOT put the hero in a clean zone." + - (bandLuma != null && bandLuma > 175 - ? " ⚠ BAND IS BRIGHT (luma " + - bandLuma + - "): cream/screen text will wash out — lower the hero onto the darker subject body, or use a template/mode with opaque text." - : ""), - }; - } - const zoneLuma = (r) => { - if (!lum || r.area === 0) return null; - let s2 = 0, - n = 0; - for (let y = r.y; y < r.y + r.h; y++) - for (let x = r.x; x < r.x + r.w; x++) { - s2 += lum[y * GW + x]; - n++; - } - return n ? Math.round(s2 / n) : null; - }; - // a TIME-AVERAGED map walks a moving minefield: a dark wall swept by a bright - // moving object (handheld drift, screens) averages "clean" while peaking hot. - // peakLuma = p95 of the zone's per-sample mean over the window. - const zoneLumaPeak = (r) => { - if (!lumSeries || !lumSeries.length || r.area === 0) return null; - const means = lumSeries - .map((Lg) => { - let s2 = 0, - n = 0; - for (let y = r.y; y < r.y + r.h; y++) - for (let x = r.x; x < r.x + r.w; x++) { - s2 += Lg[y * GW + x]; - n++; - } - return n ? s2 / n : 0; - }) - .sort((a, b) => a - b); - return Math.round(means[Math.max(0, Math.ceil(means.length * 0.95) - 1)]); - }; - const toZone = (r) => - r.area === 0 - ? null - : { - xPct: +((r.x / GW) * 100).toFixed(1), - yPct: +((r.y / GH) * 100).toFixed(1), - wPct: +((r.w / GW) * 100).toFixed(1), - hPct: +((r.h / GH) * 100).toFixed(1), - areaPct: +(((r.w * r.h) / (GW * GH)) * 100).toFixed(1), - px: { - x: Math.round(r.x * cellW), - y: Math.round(r.y * cellH), - w: Math.round(r.w * cellW), - h: Math.round(r.h * cellH), - }, - ...(zoneLuma(r) != null - ? { - meanLuma: zoneLuma(r), - bright: zoneLuma(r) > 180, - ...(zoneLumaPeak(r) != null ? { peakLuma: zoneLumaPeak(r) } : {}), - } - : {}), - }; - const zones = { - largest: toZone(largestRect(safe, GW, 0, GW, 0, GH)), - left: toZone(largestRect(safe, GW, 0, Math.round(GW / 2), 0, GH)), - right: toZone(largestRect(safe, GW, Math.round(GW / 2), GW, 0, GH)), - top: toZone(largestRect(safe, GW, 0, GW, 0, Math.max(2, Math.round(GH * 0.38)))), - }; - // HUGGING zones — clean strips that ABUT the silhouette (the embed aesthetic wants - // text NEAR the subject, not parked in the farthest corner). Grown outward from the - // subject's edge at upper-body height; prefer these for narration. - const hug = (side) => { - if (colMax < 0) return null; - const pad = Math.max(1, Math.round(GW * 0.02)); - const y0 = rowMin, - y1 = Math.min(GH, rowMin + Math.max(3, Math.round((rowMax - rowMin + 1) * 0.45))); - let x0, x1; - if (side === "right") { - x0 = Math.min(GW - 1, colMax + 1 + pad); - x1 = GW - pad; - } else { - x1 = Math.max(1, colMin - pad); - x0 = pad; - } - if (x1 - x0 < Math.round(GW * 0.1)) return null; - // shrink until actually clean (≤8% occupied cells) - let occN = 0, - tot = 0; - for (let y = y0; y < y1; y++) - for (let x = x0; x < x1; x++) { - tot++; - if (occCell[y * GW + x]) occN++; - } - if (tot === 0 || occN / tot > 0.08) return null; - const r = { x: x0, y: y0, w: x1 - x0, h: y1 - y0, area: (x1 - x0) * (y1 - y0) }; - const z2 = toZone(r); - // GLYPHS must hug, not just the plane: in a wide column, text aligned to the far - // edge parks the words a third of the frame away from the subject. Align TOWARD - // the silhouette: right-side column → text-align:left (text starts beside the - // subject); left-side column → text-align:right. - if (z2) z2.align = side === "right" ? "left" : "right"; - return z2; - }; - zones.hugLeft = hug("left"); - zones.hugRight = hug("right"); - // HERO BAND PROFILE — per-height predicted occlusion of a centered hero band. The hero - // WANTS ~30–55% (occlusion IS the embed); fg is the LAST resort, only when no height - // achieves ≤62%. Even an 88%-coverage frame usually has a feasible band over the hairline. - let heroBands = null; - if (colMax >= 0) { - const bandH = Math.max(2, Math.round(GH * 0.13)); - const hx0 = Math.round(((heroAnchor ? heroAnchor.plane.xPct : 8) / 100) * GW); - const hx1 = Math.min( - GW, - Math.round(((heroAnchor ? heroAnchor.plane.xPct + heroAnchor.plane.wPct : 92) / 100) * GW), - ); - const profile = []; - for (let y0 = 0; y0 + bandH <= GH; y0 += Math.max(1, Math.round(GH * 0.02))) { - let n = 0, - occN = 0, - lsum = 0; - for (let y = y0; y < y0 + bandH; y++) - for (let x = hx0; x < hx1; x++) { - n++; - if (occCell[y * GW + x]) occN++; - if (lum) lsum += lum[y * GW + x]; - } - profile.push({ - topPct: +((y0 / GH) * 100).toFixed(1), - occPct: +((occN / n) * 100).toFixed(1), - ...(lum ? { bgLuma: Math.round(lsum / n) } : {}), - }); - } - const ok = profile.filter((b) => b.occPct >= 12 && b.occPct <= 62); - const best = (ok.length ? ok : profile).reduce((a, b) => - Math.abs(b.occPct - 40) < Math.abs(a.occPct - 40) ? b : a, - ); - heroBands = { feasible: ok.length > 0, best, profile }; - } - const big = zones.largest; - const embeddable = !!big && big.areaPct >= 8 && big.hPct >= 10 && big.wPct >= 18; - return { - coverage: +(coverage * 100).toFixed(1), - subject: { - colMinPct: +((colMin / GW) * 100).toFixed(1), - colMaxPct: +(((colMax + 1) / GW) * 100).toFixed(1), - clearerSide, - }, - zones, - heroAnchor, - heroBands, - recommendation: embeddable ? "embed" : "fg", - }; -} - -// ── SCENE OPTICS + PALETTE (v2) ────────────────────────────────────────────── -// Deterministic scene measurements that drive the DNA tokens, so "design that fits -// the scene" is a pipeline product, not agent inspiration: -// palette — dominant scene colors + a READABLE accent suggestion (sampled, then -// clamped to usable saturation/lightness) + warm/cool temperature -// optics — background vs subject sharpness (Laplacian proxy) → suggested text -// blur so embed type matches the scene's depth-of-field -// lighting — bright-side estimate → contact-shadow direction for embed type - -function rgb2hsv(r, g, b) { - r /= 255; - g /= 255; - b /= 255; - const mx = Math.max(r, g, b), - mn = Math.min(r, g, b), - d = mx - mn; - let h = 0; - if (d > 0) { - if (mx === r) h = ((g - b) / d) % 6; - else if (mx === g) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - if (h < 0) h += 360; - } - return { h, s: mx === 0 ? 0 : d / mx, v: mx }; -} -function hsv2hex(h, s, v) { - const c = v * s, - x = c * (1 - Math.abs(((h / 60) % 2) - 1)), - m = v - c; - let [r, g, b] = - h < 60 - ? [c, x, 0] - : h < 120 - ? [x, c, 0] - : h < 180 - ? [0, c, x] - : h < 240 - ? [0, x, c] - : h < 300 - ? [x, 0, c] - : [c, 0, x]; - const f = (n) => - Math.round((n + m) * 255) - .toString(16) - .padStart(2, "0"); - return `#${f(r)}${f(g)}${f(b)}`; -} - -// dominant colors + accent suggestion from the BACKGROUND cells of a mid frame -async function scenePalette(bgPath, occCell, GW, GH) { - const { data, info } = await sharp(bgPath) - .resize(GW, GH, { fit: "fill" }) - .removeAlpha() - .raw() - .toBuffer({ resolveWithObject: true }); - const ch = info.channels; - const cells = []; - for (let c = 0; c < GW * GH; c++) { - if (occCell && occCell[c]) continue; // background only - cells.push([data[c * ch], data[c * ch + 1], data[c * ch + 2]]); - } - if (!cells.length) return null; - // dominant: quantize to 3 bits/channel, top buckets by count - const buckets = new Map(); - for (const [r, g, b] of cells) { - const k = ((r >> 5) << 6) | ((g >> 5) << 3) | (b >> 5); - const e = buckets.get(k) || { n: 0, r: 0, g: 0, b: 0 }; - e.n++; - e.r += r; - e.g += g; - e.b += b; - buckets.set(k, e); - } - const hex = (e) => - "#" + - [e.r, e.g, e.b] - .map((x) => - Math.round(x / e.n) - .toString(16) - .padStart(2, "0"), - ) - .join(""); - const dominant = [...buckets.values()] - .sort((a, b) => b.n - a.n) - .slice(0, 3) - .map((e) => ({ hex: hex(e), sharePct: +((e.n / cells.length) * 100).toFixed(1) })); - // chromatic accent: hue histogram over saturated cells, weighted s·v - const bins = Array.from({ length: 12 }, () => ({ w: 0, h: 0, s: 0, v: 0, n: 0 })); - let warmW = 0, - coolW = 0; - for (const [r, g, b] of cells) { - const { h, s, v } = rgb2hsv(r, g, b); - if (h <= 90 || h >= 330) warmW += s * v; - else if (h >= 150 && h <= 300) coolW += s * v; - if (s < 0.18 || v < 0.12 || v > 0.97) continue; - const bi = Math.floor(h / 30) % 12, - w = s * v; - const B = bins[bi]; - B.w += w; - B.h += h * w; - B.s += s * w; - B.v += v * w; - B.n++; - } - const top = bins.reduce((a, b) => (b.w > a.w ? b : a)); - let accent = null; - if (top.w > 0.5 && top.n >= 3) { - const h = top.h / top.w, - s = top.s / top.w, - v = top.v / top.w; - // clamp to a readable accent: saturated enough to read as a choice, light enough to sit on video - accent = hsv2hex( - h, - Math.min(0.78, Math.max(0.5, s * 1.2)), - Math.min(0.8, Math.max(0.55, v * 1.15)), - ); - } - const temperature = warmW > coolW * 1.25 ? "warm" : coolW > warmW * 1.25 ? "cool" : "neutral"; - return { dominant, accentSuggestion: accent, temperature }; -} - -// Laplacian-stdev sharpness proxy of a region crop (full-res) -async function regionSharpness(imgPath, rect, W, H) { - const x = Math.max(0, Math.min(W - 2, Math.round(rect.x))), - y = Math.max(0, Math.min(H - 2, Math.round(rect.y))); - const w = Math.max(2, Math.min(W - x, Math.round(rect.w))), - h = Math.max(2, Math.min(H - y, Math.round(rect.h))); - // two passes: crop to a buffer FIRST, then convolve+stats on the crop — sharp's - // internal pipeline ordering otherwise convolves/stats the full frame and the two - // regions measure identical. - const crop = await sharp(imgPath) - .extract({ left: x, top: y, width: w, height: h }) - .png() - .toBuffer(); - const st = await sharp(crop) - .greyscale() - .convolve({ width: 3, height: 3, kernel: [0, 1, 0, 1, -4, 1, 0, 1, 0], scale: 1, offset: 128 }) - .stats(); - return st.channels[0].stdev; -} - -async function sceneOptics(project, bgPath, fgPath, zones, subjectBox, W, H) { - let bgSharp = null, - subjSharp = null; - const bigZone = zones && zones.largest && zones.largest.px; - try { - if (bigZone && bigZone.w >= 64 && bigZone.h >= 64) - bgSharp = await regionSharpness(bgPath, bigZone, W, H); - } catch {} - try { - if (subjectBox && subjectBox.w >= 64) - subjSharp = await regionSharpness(bgPath, subjectBox, W, H); - } catch {} - let suggestedTextBlurPx = 0, - ratio = null; - if (bgSharp != null && subjSharp != null && subjSharp > 1) { - ratio = +(bgSharp / subjSharp).toFixed(3); - // strong bokeh → text in that depth plane should soften to match - suggestedTextBlurPx = ratio < 0.35 ? 1.6 : ratio < 0.55 ? 1.0 : ratio < 0.8 ? 0.5 : 0; - } - return { - bgSharpness: bgSharp != null ? +bgSharp.toFixed(2) : null, - subjSharpness: subjSharp != null ? +subjSharp.toFixed(2) : null, - sharpnessRatio: ratio, - suggestedTextBlurPx, - }; -} - -// bright-side estimate from the luminance grid → contact-shadow vector (shadow falls AWAY from light) -function sceneLighting(lum, occCell, GW, GH) { - if (!lum) return null; - let sw = 0, - sx = 0, - sy = 0, - n = 0, - mean = 0; - for (let c = 0; c < GW * GH; c++) { - if (!occCell[c]) { - mean += lum[c]; - n++; - } - } - if (!n) return null; - mean /= n; - for (let y = 0; y < GH; y++) - for (let x = 0; x < GW; x++) { - const c = y * GW + x; - if (occCell[c]) continue; - const w = Math.max(0, lum[c] - mean); - sw += w; - sx += w * (x / GW - 0.5); - sy += w * (y / GH - 0.5); - } - if (sw < 1) return { lightFrom: "flat", shadow: { dx: 0, dy: 3 } }; - const lx = sx / sw, - ly = sy / sw; // light centroid offset from center, −0.5..0.5 - const mag = Math.hypot(lx, ly); - if (mag < 0.04) return { lightFrom: "frontal", shadow: { dx: 0, dy: 3 } }; - // shadow direction = opposite the light, scaled to a subtle px offset - const s = Math.min(1, mag / 0.25); - const dx = Math.round((-lx / mag) * 4 * s), - dy = Math.round(Math.max(1, (-ly / mag) * 4 * s + 2)); - const compass = - Math.abs(lx) > Math.abs(ly) * 1.8 - ? lx > 0 - ? "right" - : "left" - : Math.abs(ly) > Math.abs(lx) * 1.8 - ? ly > 0 - ? "below" - : "above" - : `${ly > 0 ? "lower" : "upper"}-${lx > 0 ? "right" : "left"}`; - return { lightFrom: compass, shadow: { dx, dy } }; -} - -// split the transcript into sentence windows (punctuation, or a > 0.7s gap) -function sentenceWindows(project) { - const tp = path.join(project, "transcript.json"); - if (!fs.existsSync(tp)) return []; - let words; - try { - words = (JSON.parse(fs.readFileSync(tp, "utf8")).words || []).filter((w) => w && "start" in w); - } catch { - return []; - } - const out = []; - let cur = []; - for (let i = 0; i < words.length; i++) { - cur.push(words[i]); - const w = words[i], - nx = words[i + 1]; - const ends = /[.!?…]$/.test((w.text || "").trim()); - const gap = nx ? nx.start - w.end > 0.7 : true; - if (ends || gap || !nx) { - if (cur.length) - out.push({ - in: +cur[0].start.toFixed(2), - out: +cur[cur.length - 1].end.toFixed(2), - text: cur.map((x) => x.text).join(" "), - }); - cur = []; - } - } - return out; -} - -async function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: safe-zones.cjs [in out]"); - process.exit(1); - } - const fgDir = path.join(project, "frames_fg"); - if (!fs.existsSync(fgDir)) { - console.error(`[safe-zones] no ${fgDir} — run matte.cjs first`); - process.exit(2); - } - if (!sharp) { - console.error( - "[safe-zones] sharp unavailable — install project dependencies per embedded-captions SKILL.md Runtime prerequisites", - ); - process.exit(0); - } - - const frames = fs - .readdirSync(fgDir) - .filter((f) => /\.png$/i.test(f)) - .sort(); - if (!frames.length) { - console.error("[safe-zones] no PNG frames"); - process.exit(2); - } - const meta = await sharp(path.join(fgDir, frames[0])).metadata(); - const W = meta.width, - H = meta.height; - const CELL = Math.max(W, H) / 48; - const GW = Math.max(8, Math.round(W / CELL)), - GH = Math.max(8, Math.round(H / CELL)); - let fps = 24; - try { - const f = parseFloat( - String(fs.readFileSync(path.join(project, "matte.fps"), "utf8")).replace(/[^\d.]/g, ""), - ); - if (f > 0) fps = f; - } catch {} - - const bgDir = path.join(project, "frames_bg"); - const hasBg = fs.existsSync(bgDir); - // cache evenly-sampled frame grids once (each = per-cell avg subject alpha 0..1, - // plus per-cell mean LUMINANCE from frames_bg — bright zones wash out cream/screen text) - const sampleIdx = [ - ...new Set( - Array.from({ length: SAMPLES }, (_, i) => - Math.min(frames.length - 1, Math.round((i / (SAMPLES - 1)) * (frames.length - 1))), - ), - ), - ]; - const grids = []; - for (const i of sampleIdx) { - const { data, info } = await sharp(path.join(fgDir, frames[i])) - .resize(GW, GH, { fit: "fill" }) - .raw() - .toBuffer({ resolveWithObject: true }); - const ch = info.channels, - g = new Float32Array(GW * GH); - for (let c = 0; c < GW * GH; c++) g[c] = (ch >= 4 ? data[c * ch + 3] : 255) / 255; - let lum = null; - if (hasBg && fs.existsSync(path.join(bgDir, frames[i]))) { - const { data: bd, info: bi } = await sharp(path.join(bgDir, frames[i])) - .resize(GW, GH, { fit: "fill" }) - .greyscale() - .raw() - .toBuffer({ resolveWithObject: true }); - const bch = bi.channels; - lum = new Float32Array(GW * GH); - for (let c = 0; c < GW * GH; c++) lum[c] = bd[c * bch]; - } - grids.push({ t: i / fps, g, lum }); - } - const lumWindow = (t0, t1) => { - const acc = new Float32Array(GW * GH); - let n = 0; - let inWin = grids.filter((s2) => s2.t >= t0 - 1e-6 && s2.t <= t1 + 1e-6 && s2.lum); - if (!inWin.length) inWin = grids.filter((s2) => s2.lum); - for (const s2 of inWin) { - for (let c = 0; c < GW * GH; c++) acc[c] += s2.lum[c]; - n++; - } - if (!n) return null; - for (let c = 0; c < GW * GH; c++) acc[c] /= n; - return acc; - }; - const lumSeriesWindow = (t0, t1) => { - let inWin = grids.filter((s2) => s2.t >= t0 - 1e-6 && s2.t <= t1 + 1e-6 && s2.lum); - if (!inWin.length) inWin = grids.filter((s2) => s2.lum); - return inWin.map((s2) => s2.lum); - }; - const occWindow = (t0, t1) => { - const occ = new Float32Array(GW * GH); - let inWin = grids.filter((s) => s.t >= t0 - 1e-6 && s.t <= t1 + 1e-6); - if (!inWin.length) { - // window between samples → use nearest grid - const mid = (t0 + t1) / 2; - inWin = [grids.reduce((a, b) => (Math.abs(b.t - mid) < Math.abs(a.t - mid) ? b : a))]; - } - for (const s of inWin) for (let c = 0; c < GW * GH; c++) if (s.g[c] > occ[c]) occ[c] = s.g[c]; - return occ; - }; - - // ad-hoc window query - const qIn = parseFloat(process.argv[3]), - qOut = parseFloat(process.argv[4]); - if (Number.isFinite(qIn) && Number.isFinite(qOut)) { - const a = analyze( - occWindow(qIn, qOut), - GW, - GH, - W, - H, - lumWindow(qIn, qOut), - lumSeriesWindow(qIn, qOut), - ); - console.log( - `[safe-zones] window ${qIn}-${qOut}s: ${a.recommendation.toUpperCase()} coverage ${a.coverage}% clearer:${a.subject.clearerSide}`, - ); - const z = a.zones; - for (const k of ["largest", "left", "right", "top"]) - if (z[k]) console.log(` ${k}: ${z[k].wPct}%×${z[k].hPct}% @ (${z[k].xPct}%,${z[k].yPct}%)`); - console.log(JSON.stringify({ in: qIn, out: qOut, ...a })); - return; - } - - const globalOcc = occWindow(-1e9, 1e9); - const globalLum = lumWindow(-1e9, 1e9); - const global = analyze(globalOcc, GW, GH, W, H, globalLum, lumSeriesWindow(-1e9, 1e9)); - const windows = sentenceWindows(project).map((s) => { - const a = analyze( - occWindow(s.in, s.out), - GW, - GH, - W, - H, - lumWindow(s.in, s.out), - lumSeriesWindow(s.in, s.out), - ); - return { - in: s.in, - out: s.out, - text: s.text.slice(0, 48), - coverage: a.coverage, - recommendation: a.recommendation, - clearerSide: a.subject.clearerSide, - zones: a.zones, - }; - }); - - // ── v2: palette / optics / lighting from the mid frame + global grids ─────── - let palette = null, - optics = null, - lighting = null; - try { - const occCellG = new Uint8Array(GW * GH); - for (let c = 0; c < GW * GH; c++) occCellG[c] = globalOcc[c] >= THRESH ? 1 : 0; - const midName = frames[Math.floor(frames.length / 2)]; - const midBg = path.join(bgDir, midName); - if (hasBg && fs.existsSync(midBg)) { - palette = await scenePalette(midBg, occCellG, GW, GH); - // subject bbox in px from the global occupancy grid - let cx0 = GW, - cx1 = -1, - cy0 = GH, - cy1 = -1; - for (let y = 0; y < GH; y++) - for (let x = 0; x < GW; x++) - if (occCellG[y * GW + x]) { - if (x < cx0) cx0 = x; - if (x > cx1) cx1 = x; - if (y < cy0) cy0 = y; - if (y > cy1) cy1 = y; - } - const subjectBox = - cx1 >= 0 - ? { - x: (cx0 / GW) * W, - y: (cy0 / GH) * H, - w: ((cx1 - cx0 + 1) / GW) * W, - h: ((cy1 - cy0 + 1) / GH) * H, - } - : null; - optics = await sceneOptics( - project, - midBg, - path.join(fgDir, midName), - global.zones, - subjectBox, - W, - H, - ); - lighting = sceneLighting(globalLum, occCellG, GW, GH); - } - } catch (e) { - console.error(`[safe-zones] scene optics skipped — ${e.message}`); - } - - const out = { - width: W, - height: H, - fps, - grid: { cols: GW, rows: GH }, - ...global, - palette, - optics, - lighting, - windows, - }; - fs.writeFileSync(path.join(project, "safe-zones.json"), JSON.stringify(out, null, 2)); - - const z = (n, zn) => - zn - ? `${n}: ${zn.wPct}%×${zn.hPct}% @ (${zn.xPct}%,${zn.yPct}%) [${zn.areaPct}%${zn.meanLuma != null ? ` · luma ${zn.meanLuma}${zn.bright ? " ⚠BRIGHT" : ""}` : ""}]` - : `${n}: —`; - console.log( - `[safe-zones] ${W}×${H} grid ${GW}×${GH} @ ${fps}fps · GLOBAL coverage ${global.coverage}% · clearer ${global.subject.clearerSide} · verdict ${global.recommendation.toUpperCase()}`, - ); - console.log( - ` ${z("largest", global.zones.largest)} | ${z("left", global.zones.left)} | ${z("right", global.zones.right)} | ${z("top", global.zones.top)}`, - ); - if (global.recommendation === "embed") { - console.log( - `[safe-zones] ✅ EMBED — NARRATION planes go in the clean zones (prefer ${global.subject.clearerSide}/top).`, - ); - if (global.heroAnchor) - console.log( - `[safe-zones] 🎯 HERO → centered ON the subject: plane ≈ x${global.heroAnchor.plane.xPct}% y${global.heroAnchor.plane.yPct}% w${global.heroAnchor.plane.wPct}% center · BIG (~0.22–0.34·h) · target ~30–55% occlusion${global.heroAnchor.bandLuma != null ? ` · band luma ${global.heroAnchor.bandLuma}${global.heroAnchor.washoutRisk ? " ⚠WASHOUT RISK — see heroAnchor.note" : ""}` : ""}`, - ); - if (global.heroBands) - console.log( - `[safe-zones] hero bands: best top ${global.heroBands.best.topPct}% (predicted occlusion ${global.heroBands.best.occPct}%) · bg-hero ${global.heroBands.feasible ? "FEASIBLE — keep the hero EMBEDDED (fg is last resort)" : "INFEASIBLE (no band ≤62%) → hero fg"}`, - ); - if (global.zones.hugLeft || global.zones.hugRight) - console.log( - `[safe-zones] hugging zones (narration belongs HERE, abutting the silhouette): L ${global.zones.hugLeft ? global.zones.hugLeft.wPct + "%×" + global.zones.hugLeft.hPct + "%@x" + global.zones.hugLeft.xPct + "%" + (global.zones.hugLeft.bright ? "⚠bright" : "") : "—"} · R ${global.zones.hugRight ? global.zones.hugRight.wPct + "%×" + global.zones.hugRight.hPct + "%@x" + global.zones.hugRight.xPct + "%" + (global.zones.hugRight.bright ? "⚠bright" : "") : "—"}`, - ); - } else { - console.log( - `[safe-zones] ⚠ FG — subject fills the frame; use caption_layer:"fg" (no clean region to embed behind).`, - ); - } - if (palette) - console.log( - `[safe-zones] 🎨 palette: dominant ${palette.dominant.map((d) => d.hex).join(" ")} · accent suggestion ${palette.accentSuggestion || "— (no chromatic anchor; use the DNA default)"} · ${palette.temperature}`, - ); - if (optics && optics.sharpnessRatio != null) - console.log( - `[safe-zones] 🔭 depth: bg/subject sharpness ${optics.sharpnessRatio} → embed text blur ${optics.suggestedTextBlurPx}px${optics.suggestedTextBlurPx ? " (match the scene's depth-of-field)" : " (scene is uniformly sharp)"}`, - ); - if (lighting) - console.log( - `[safe-zones] 💡 light from ${lighting.lightFrom} → contact shadow offset (${lighting.shadow.dx}px, ${lighting.shadow.dy}px)`, - ); - if (windows.length) { - console.log(`[safe-zones] per-sentence windows (place each group using ITS window's zones):`); - for (const w of windows) - console.log( - ` [${w.in}-${w.out}s] ${w.recommendation.toUpperCase()} cov ${w.coverage}% clear:${w.clearerSide} ${w.zones.largest ? `best ${w.zones.largest.wPct}%×${w.zones.largest.hPct}%@(${w.zones.largest.xPct}%,${w.zones.largest.yPct}%)` : ""} "${w.text}"`, - ); - } - console.log(`[safe-zones] → ${path.join(project, "safe-zones.json")}`); -} -main().catch((e) => { - console.error(`[safe-zones] (skipped — ${e.message})`); - process.exit(0); -}); diff --git a/.agents/skills/embedded-captions/scripts/transcribe.cjs b/.agents/skills/embedded-captions/scripts/transcribe.cjs deleted file mode 100644 index 0ceff74..0000000 --- a/.agents/skills/embedded-captions/scripts/transcribe.cjs +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/env node -/* - * transcribe.cjs — word-level transcription via hyperframes' native Whisper - * (replaces the Python ElevenLabs Scribe path; no Python, no API key). - * - * node transcribe.cjs [model] [language] - * Reads: /source.mp4 (audio track) - * Writes: /transcript.json — { text, language_code, words:[{text,start,end,type}] } - */ -const path = require("path"); -const fs = require("fs"); -const cp = require("child_process"); - -const { hfCli } = require("./hf-cli.cjs"); - -function ensureSource(project) { - const src = path.join(project, "source.mp4"); - if (fs.existsSync(src)) return src; - const EXCL = new Set(["final", "bg_plus_caps", "fg_caps", "audio"]); - let cands = fs - .readdirSync(project) - .filter( - (f) => - ["mp4", "mov", "webm", "mkv", "m4v"].includes(path.extname(f).slice(1).toLowerCase()) && - !EXCL.has(path.basename(f, path.extname(f))) && - !f.startsWith("index"), - ) - .map((f) => path.join(project, f)); - let found = cands.sort((a, b) => fs.statSync(b).size - fs.statSync(a).size)[0]; - if (found) { - try { - fs.symlinkSync(path.basename(found), src); - } catch { - fs.copyFileSync(found, src); - } - } - return src; -} -function _usableWords(d) { - return d && Array.isArray(d.words) && d.words.some((w) => w && "start" in w && "end" in w); -} -// Mean loudness of the audio, for the no-speech guard below. Silence → whisper -// hallucinates (famously "Thank you."), and the decision gate refuses "no speech". -function meanVolumeDb(audio) { - try { - // ffmpeg writes volumedetect stats to STDERR — capture it (spawnSync, no throw). - const r = cp.spawnSync( - "ffmpeg", - ["-hide_banner", "-nostats", "-i", audio, "-af", "volumedetect", "-f", "null", "-"], - { encoding: "utf8" }, - ); - const out = (r.stderr || "") + (r.stdout || ""); - const m = out.match(/mean_volume:\s*(-?[\d.]+) dB/); - return m ? parseFloat(m[1]) : null; - } catch { - return null; - } -} - -// Where does AUDIBLE content end? Whisper hallucinates trailing words over a silent -// tail (observed: "I'm sorry." repeated over dead air at a clip's end). silencedetect -// finds a terminal silence running to EOF; words "spoken" inside it are fabricated. -// Conservative: applause/music read as non-silence, so this fires only on truly dead -// tails. Returns {speechEnd, total} or null. -function audibleEnd(audio) { - try { - const r = cp.spawnSync( - "ffmpeg", - [ - "-hide_banner", - "-nostats", - "-i", - audio, - "-af", - "silencedetect=noise=-35dB:d=0.6", - "-f", - "null", - "-", - ], - { encoding: "utf8" }, - ); - const out = (r.stderr || "") + (r.stdout || ""); - const durM = out.match(/Duration:\s*(\d+):(\d+):([\d.]+)/); - const total = durM ? +durM[1] * 3600 + +durM[2] * 60 + +durM[3] : null; - if (total == null) return null; - const starts = [...out.matchAll(/silence_start:\s*([\d.]+)/g)].map((x) => +x[1]); - const ends = [...out.matchAll(/silence_end:\s*([\d.]+)/g)].map((x) => +x[1]); - if (!starts.length) return { speechEnd: total, total }; - const lastStart = starts[starts.length - 1]; - const closed = ends.some((e) => e > lastStart); // silence re-broken before EOF? - return { speechEnd: closed ? total : lastStart, total }; - } catch { - return null; - } -} - -function main() { - const project = path.resolve(process.argv[2] || ""); - if (!process.argv[2]) { - console.error("usage: transcribe.cjs [model] [language]"); - process.exit(1); - } - // Default = multilingual `small`, NOT `small.en`. Per media-use: ".en models - // mistranslate non-English and mis-handle accented speech; default to small (auto-detects - // language)." We hardcoded small.en before — it hallucinated a wrong transcript on an - // accented speaker. Pass `small.en` only for known-clean-English; tough accents → a larger model. - const model = process.argv[3] || process.env.WHISPER_MODEL || "small"; - const language = process.argv[4] || process.env.WHISPER_LANG || ""; - const out = path.join(project, "transcript.json"); - - // already in our schema? skip — but validate the SHAPE, not just the keys: - // `hyperframes init` drops a whisper.cpp segment/token-format transcript.json - // (offsets-in-ms, nested tokens) that can carry a `words` key yet poison the - // compilers. Only a word-level {text,start,end} array counts as normalized. - try { - const d = JSON.parse(fs.readFileSync(out, "utf8")); - const wordShaped = - d && - Array.isArray(d.words) && - d.words.length > 0 && - d.words.every( - (w) => - w && - typeof (w.text ?? w.word) === "string" && - Number.isFinite(w.start) && - Number.isFinite(w.end) && - w.end < 36000, // ms-offset formats blow past any sane seconds value - ); - if (wordShaped && d.language_code) { - console.log("[transcribe] already normalized, skipping"); - return; - } - if (d && !wordShaped) { - console.log( - "[transcribe] existing transcript.json is NOT word-level (init stub / segment format) — regenerating", - ); - } - } catch {} - - const src = ensureSource(project); - if (!fs.existsSync(src)) { - console.error(`[transcribe] no source in ${project}`); - process.exit(2); - } - const audio = path.join(project, "audio.mp3"); - // A stray audio.mp3 in the project makes lint call the render silent; only remove one this run made. - const audioIsScratch = !fs.existsSync(audio); - if (audioIsScratch) - cp.execFileSync( - "ffmpeg", - ["-y", "-i", src, "-vn", "-acodec", "libmp3lame", "-q:a", "2", audio], - { stdio: "ignore" }, - ); - - // ── engine: WhisperX (preferred — wav2vec2 forced alignment gives word timings far - // tighter than whisper.cpp's segment-interpolated ones; our gates are 80ms-strict) → - // fallback hyperframes whisper.cpp. Force with TRANSCRIBE_ENGINE=whisper|whisperx. - let words = null, - engine = null; - const wantWx = (process.env.TRANSCRIBE_ENGINE || "whisperx") === "whisperx"; - if (wantWx) { - try { - const wav = path.join(project, "_wx_audio.wav"); - cp.execFileSync("ffmpeg", ["-y", "-i", src, "-vn", "-ac", "1", "-ar", "16000", wav], { - stdio: "ignore", - }); - const outDir = path.join(project, "_wx_out"); - fs.mkdirSync(outDir, { recursive: true }); - const wxModel = model.replace(/\.en$/, ""); // whisperx model names are multilingual ids - // Pin whisperx so `uvx` fetches a reproducible build instead of resolving - // "latest" on every run (a supply-chain + determinism foot-gun). Override - // with $WHISPERX_VERSION if you've validated a different release. - const whisperxSpec = `whisperx==${process.env.WHISPERX_VERSION || "3.8.6"}`; - const wxArgs = [ - "--python", - "3.12", - "--from", - whisperxSpec, - "whisperx", - wav, - "--model", - wxModel, - "--device", - "cpu", - "--compute_type", - "int8", - "--output_dir", - outDir, - "--output_format", - "json", - "--no_align_deletes", - "--print_progress", - "False", - ]; - if (language) wxArgs.push("--language", language); - // strip our flag if this whisperx build doesn't know it - let r = cp.spawnSync("uvx", wxArgs, { encoding: "utf8", timeout: 600000 }); - if ((r.status || 0) !== 0 && /no_align_deletes/.test(r.stderr || "")) { - r = cp.spawnSync( - "uvx", - wxArgs.filter((a) => a !== "--no_align_deletes"), - { encoding: "utf8", timeout: 600000 }, - ); - } - if ((r.status || 0) !== 0) - throw new Error( - (r.stderr || "whisperx failed").split("\n").slice(-4).join(" ").slice(0, 300), - ); - const wxJson = JSON.parse(fs.readFileSync(path.join(outDir, "_wx_audio.json"), "utf8")); - const wx = []; - for (const seg of wxJson.segments || []) - for (const w of seg.words || []) { - // alignment occasionally yields a word with no timing (OOV) — interpolate from neighbors later; mark null now - wx.push({ text: String(w.word || "").trim(), start: w.start, end: w.end, type: "word" }); - } - // interpolate missing timings from neighbors (rare OOV/number cases) - for (let i = 0; i < wx.length; i++) { - if (wx[i].start == null || wx[i].end == null) { - const prevEnd = i > 0 ? wx[i - 1].end : 0; - const nextStart = wx.slice(i + 1).find((x) => x.start != null); - const ns = nextStart ? nextStart.start : prevEnd + 0.3; - wx[i].start = prevEnd; - wx[i].end = Math.max(prevEnd + 0.05, ns - 0.02); - } - } - if (wx.length) { - words = wx.filter((w) => w.text); - engine = `whisperx(${wxModel}+wav2vec2)`; - } - try { - fs.unlinkSync(wav); - } catch {} - } catch (e) { - console.error( - `[transcribe] whisperx unavailable (${String(e.message || e).slice(0, 160)}) — falling back to whisper.cpp`, - ); - } - } - - if (!words) { - // run hyperframes Whisper → writes a flat word array to /transcript.json - const cli = hfCli(); - const args = ["transcribe", audio, "-d", project, "--json", "--model", model]; - if (language) args.push("--language", language); - let info = {}; - try { - const so = cp.execFileSync("node", [cli, ...args], { encoding: "utf8" }); - const line = so.trim().split("\n").filter(Boolean).pop(); - info = JSON.parse(line); - } catch (e) { - console.error("[transcribe] hyperframes whisper failed:", e.message); - process.exit(1); - } - const flatPath = info.transcriptPath || out; - const flat = JSON.parse(fs.readFileSync(flatPath, "utf8")); - const arr = Array.isArray(flat) ? flat : flat.words || []; - words = arr - .filter((w) => (w.text ?? w.word) != null) - .map((w) => ({ - text: w.text ?? w.word, - start: w.start ?? w.t0, - end: w.end ?? w.t1, - type: "word", - })); - // Under the default --engine auto the CLI may have run Parakeet; it reports which. - engine = info.engine === "parakeet" ? `parakeet(${info.model})` : `whisper.cpp(${model})`; - } - - // Tail-hallucination guard: drop words whisper placed entirely inside a terminal - // silence (it fabricates e.g. repeated "I'm sorry." over dead air). Word START past - // the audible end (+0.4s slack) = fabricated; real final words start before it. - const ae = audibleEnd(audio); - let trimmedTail = 0; - if (ae && ae.speechEnd < ae.total - 0.8) { - const keep = words.filter((w) => w.start <= ae.speechEnd + 0.4); - trimmedTail = words.length - keep.length; - if (trimmedTail > 0) { - console.error( - `[transcribe] ⚠ trimmed ${trimmedTail} trailing word(s) starting after the audible end ` + - `(${ae.speechEnd.toFixed(2)}s; clip ${ae.total.toFixed(2)}s) — whisper hallucinates over silent tails.`, - ); - words = keep; - } - } - - if (audioIsScratch) fs.rmSync(audio, { force: true }); - - const text = words - .map((w) => w.text) - .join(" ") - .replace(/\s+([,.!?;:])/g, "$1") - .trim(); - fs.writeFileSync( - out, - JSON.stringify( - { - text, - language_code: language || "en", - engine, - words, - ...(trimmedTail ? { trimmed_tail_words: trimmedTail } : {}), - }, - null, - 2, - ), - ); - console.log(`[transcribe] ${engine} ${words.length} words → ${out}`); - console.log(`[transcribe] text: ${text.slice(0, 160)}${text.length > 160 ? "…" : ""}`); - - // No-speech guard: whisper returns confident hallucinations over silence (e.g. the - // whole clip as "Thank you."). The decision gate REFUSES "no speech" — operationalize - // it so an agent trusting the transcript can't sail past the gate. - const meanDb = meanVolumeDb(audio); - if (meanDb != null && meanDb < -45) { - console.error( - `\n[transcribe] ⚠ NEAR-SILENT AUDIO — mean ${meanDb.toFixed(1)} dB (real speech ≈ -16..-26 dB).`, - ); - console.error( - ` This transcript is almost certainly a Whisper hallucination, NOT real speech.`, - ); - console.error( - ` Per the decision gate, REFUSE "no speech" — confirm with \`ffmpeg -i -af silencedetect\`;`, - ); - console.error(` do NOT author captions from fabricated words.`); - } -} -main(); diff --git a/.agents/skills/embedded-captions/scripts/transcribe.test.mjs b/.agents/skills/embedded-captions/scripts/transcribe.test.mjs deleted file mode 100644 index 9b5bea3..0000000 --- a/.agents/skills/embedded-captions/scripts/transcribe.test.mjs +++ /dev/null @@ -1,69 +0,0 @@ -import assert from "node:assert/strict"; -import { execFileSync } from "node:child_process"; -import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import test from "node:test"; -import { fileURLToPath } from "node:url"; - -// A stub CLI answers as `transcribe --json` does when --engine auto ran Parakeet. -const STUB_CLI = ` -const fs = require("fs"), path = require("path"); -const project = process.argv[process.argv.indexOf("-d") + 1]; -const transcriptPath = path.join(project, "cli-words.json"); -fs.writeFileSync(transcriptPath, JSON.stringify([{ text: "hello", start: 0.1, end: 0.5 }])); -console.log(JSON.stringify({ ok: true, engine: "parakeet", model: "parakeet-tdt-0.6b-v3", transcriptPath })); -`; - -test("the CLI fallback labels the transcript with the engine the CLI ran", () => { - const root = mkdtempSync(join(tmpdir(), "embedded-captions-transcribe-")); - try { - const cliDir = join(root, "hf", "packages", "cli", "dist"); - mkdirSync(cliDir, { recursive: true }); - writeFileSync(join(cliDir, "cli.js"), STUB_CLI); - const project = join(root, "project"); - mkdirSync(project); - writeFileSync(join(project, "source.mp4"), ""); - writeFileSync(join(project, "audio.mp3"), ""); - execFileSync( - process.execPath, - [fileURLToPath(new URL("./transcribe.cjs", import.meta.url)), project], - { - stdio: "ignore", - env: { ...process.env, HYPERFRAMES_ROOT: join(root, "hf"), TRANSCRIBE_ENGINE: "whisper" }, - }, - ); - const transcript = JSON.parse(readFileSync(join(project, "transcript.json"), "utf8")); - assert.equal(transcript.engine, "parakeet(parakeet-tdt-0.6b-v3)"); - } finally { - rmSync(root, { recursive: true, force: true }); - } -}); - -test("the extracted audio scratch file does not outlive the run", () => { - const root = mkdtempSync(join(tmpdir(), "embedded-captions-transcribe-")); - try { - const cliDir = join(root, "hf", "packages", "cli", "dist"); - mkdirSync(cliDir, { recursive: true }); - writeFileSync(join(cliDir, "cli.js"), STUB_CLI); - const project = join(root, "project"); - mkdirSync(project); - execFileSync( - "ffmpeg", - ["-y", "-f", "lavfi", "-i", "sine=frequency=440:duration=1", join(project, "source.mp4")], - { stdio: "ignore" }, - ); - execFileSync( - process.execPath, - [fileURLToPath(new URL("./transcribe.cjs", import.meta.url)), project], - { - stdio: "ignore", - env: { ...process.env, HYPERFRAMES_ROOT: join(root, "hf"), TRANSCRIBE_ENGINE: "whisper" }, - }, - ); - assert.equal(existsSync(join(project, "audio.mp3")), false); - assert.equal(existsSync(join(project, "transcript.json")), true); - } finally { - rmSync(root, { recursive: true, force: true }); - } -}); diff --git a/.agents/skills/embedded-captions/themes/README.md b/.agents/skills/embedded-captions/themes/README.md deleted file mode 100644 index 11081b5..0000000 --- a/.agents/skills/embedded-captions/themes/README.md +++ /dev/null @@ -1,243 +0,0 @@ -# THEME mode — composed visual constitutions - -Theme mode is the third compiler (`scripts/make-theme.cjs`), beside Standard and -Cinematic. It exists because "mode" was a bundle of orthogonal axes pretending -to be one switch. A theme DNA composes its identity from registries implemented -ONCE in the compiler — **paradigms are the unit of code; DNAs are the unit of -identity**. A new look is a JSON file; only a genuinely new paradigm/setpiece -(rare) touches the compiler. - -``` -theme DNA = body PARADIGM how the transcript surface lives - × body LAYER fg-alpha (rail.html channel) | bg-embed - × hero SETPIECE the climax choreography - × front FX flash / rings / sparks / scanband / crowdflash / paflash (fg, over subject) - × PLATE budget charge-dim (in-page) + punch/shake/grain (_postfx.sh) - × LINKAGES declarative theme interactions -``` - -Standard and Cinematic were, in retrospect, two fixed points of this space. -Standard is now RETIRED (2026-06-12): its rail×embed-climax point is served by -the `anchor` theme (rail paradigm × settle setpiece — the quiet default). -Cinematic remains a separate compiler; do not re-implement it as a theme yet. - -## Unification roadmap (strangler fig — interface first, engines later) - -The user-facing model is already unified (SKILL.md Step 0): one catalog of -LOOKS; classic looks pick a DELIVERY (rail | column), themed looks bind their -own. "Standard/Cinematic" are delivery/compiler names, not modes. Remaining -phases, each gated on need — never rewrite for tidiness alone: - -- **Phase 2 — one authoring schema.** `lines`/`minors`/`hero` are already - ~90% shared between standard.json and theme.json; a router that translates a - single `caption.json` into the engine-specific file removes the last - user-visible seam. cinematic.json's blocks/planes are the odd one — map the - common fields, pass engine-specific ones through. -- **Phase 3 — engine convergence.** Port a classic delivery into make-theme - ONLY when something forces it (e.g. a classic DNA wants a plate budget or a - setpiece). Acceptance bar: blind A/B on the cap_multi regression scenes vs - the old compiler — swap engines only when indistinguishable or better. Until - then the old compilers are the reference implementation of 8 rounds of - validated typography (lockup/orbit, multi-climax, ratio-lock, per-plane - legibility, occlusion adjudication) — that machinery is the moat, not debt. - -## Body paradigms (registry) - -| paradigm | surface | layer | entrance verbs | exit verbs | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `rail` | lower-third lines, replace | fg | `stamp` (1f hot appear→crush→recoil→cool), `flick` (tube double-flick), `bootflick` (corrupted-cyan boot 1–2f → settles to UI color; minors keep a cyan/red registration shadow). `stamp` minors cool to `palette.minorCool` (default amber) | `drop` (mass falls), `powercut` (bright→ghost→off) | -| `panel` | docked glass console, accumulate + typed | fg | `type` (width steps per word, $ prompt, caret blinks) | hold | -| `poem` | open-space stanzas, accumulate; letters CONDENSE from seeded dust | fg | `condense` | `drift` (stanza hand-off) + optional dispersal linkage | -| `takeover` | full-frame hard-cut cards, plate dimmed throughout | bg | `cut` (+ tension `creep` before silences, auto-detected) | hard cut / blur dissolve | -| `lastpage` | manuscript rail (typed serif) + a seeded field of BLURRED apex-word instances haunting the room from t=0 | bg | typed rail; field breathes imperceptibly | rail fades; field resolves at apex (see `rackfocus`) | -| `flaprail` | split-flap word tiles on a chyron bar (tag + ROW flip-counter; optional odometer chip docks above the bar while the first emphasis line reads) | fg | `splitflap` (3 flips: wrong word → wrong word → real word clacks on hot, squash → elastic settle → cools to bone; emphasis tiles keep amber text + underline) | flip-to-blank cascade left→right (completes before the next line) | -| `ledboard` | amber LED departure strip docked lower-third (`body.board` geometry); lines page by vertical scroll-snap (steps(6)) inside the board window; furniture: green platform tag, ticking seconds clock (stacked digit reel), ⚠ DELAYED blinks then pages to ● ON TIME ~0.7s after the apex, idle LED shimmer in dead air ≥1.2s | fg | `ledwipe-mini` (per-word L→R LED column wipe, clipPath steps(len), + 1-frame arrival flicker; emphasis words get the LED-refresh double-blink; last word gets one late refresh) | scroll-snap page-up (next line pages in at the same instant) | -| `vhsrail` | camcorder-playback lower third: every word carries a PERMANENT 1px red+cyan misregistration fringe (split clip-path halves); furniture: ▶ PLAY / ◀◀ REW top-left (REW gag in dead air ≥0.7s + the final rewind), ● REC top-right through the apex window, green timestamp bottom-right with 1 Hz blinking colon, idle tape-drift line in long silences, plus apex-coupled artifacts (1-frame white tear band + head-switching noise bar at REC FREEZE, scrub lines at the apex band on the hero rewind) | fg | `trackglitch` (instant on + 2-frame y-shake + 1-frame band-slice shift of the word's bottom half; emphasis = PAUSE jitter ±1px y oscillation + white noise-band flicker) | REWIND streak left + flat-white echo copy + 2 scrub-line flickers | -| `hudrail` | arcade-cabinet HUD: whole frame plays through CRT overlays (scanlines `body.scan` + corner vignette); docked HUD bar (`body.bar` geometry, 2px accent border, glow) with `body.tags` 1UP / CREDIT furniture — the 1UP tag blinks on the classic 0.45s attract cadence all clip; HUD yields (`body.yield`) while the boss lands | fg | `coinpop` (instant-on + steps(2) scale pop from the baseline + 1-frame white coin-blip tick over the word; emphasis = 3-frame palette swap body→accent→magenta→body) | checkerboard dissolve (words vanish in 2 alternating 2-frame passes, line off ≤ DUR−0.02) | -| `carbonstrip` | cold-war case-file transcript strip docked on the clearer side (manila gradient, punch holes, faint red `body.watermark`, typed `body.header` that types on by width steps); lines live on up to `body.rows` fixed slots; PAGES (broken at full rows, dead-air gaps > 0.7s, and after the hero hand-off line — it is filed away while the stamp owns the frame); the strip top-shadow breathes during the stamp's dead-still hold and the strip yields (`body.yield`) while it lands; the final page is pulled with the whole strip at clip end | fg | `hammer` (per-char sets 30ms apart, scale 1.35→1 in one frame = the stamp motif at low amplitude; seeded ±1.2px baselines + seeded ribbon-ink opacity; every strike kicks the strip 1px — y-channel locked while the strip itself tweens; emphasis words get a red ink ellipse drawn around them, 0.25s) | X-row over-strike (3 chunks per line, 0.05s apart, lines 0.16s apart) → carriage yank-down feed → return; roomy cadence in dead air, compressed when the next page is close — always completes before the next page's first strike | -| `laserrail` | concert lower third: lines centered on a bottom rail (`body.bottomPx`), uppercase laser-green words with a neon text-glow; emphasis words render at `body.minorScale`× with a hotter glow; word centers are BAKED at compile time from the measured char-width table (`assets/fonts/char-widths.json`, ≤3px vs browser ground truth) so the beam aim can't be skewed by font-load timing; per-word furniture = two thin beams (accent from top-left, magenta from top-right) that sweep to CONVERGE on the word 2 frames early + a convergence flare; beams dim ×`yield.beamDim` inside the apex window and the visible line dims to `yield.dim` | fg | `igniteconverge` (beams converge at st−0.083 → flare pop → word snaps on at opacity 1 with brightness 1.85, crush 0.09s power3.in → 2-frame contact squash → elastic settle → brightness cools; emphasis = single 1-frame strobe off/on + lingering beams) | sweeper beam crosses L→R in 0.13s and each word streaks away (x+44, blur 5) as it passes; line off ≤ DUR−0.02 | - -| `stormrail` | rain-washed lower third: ambient rain = `body.rain.count` seeded thin streaks falling on repeating linear cycle tweens (pure f(t), one slanted wind vector, mid-fall at t=0); a second seeded set DOUBLES the rain for ~1s after the strike; lines sit on a bottom gradient scrim (stable reading surface); the visible line dims to `yield.dim` while the bolt lands and its text-shadow flips toward the strike (`hero.params.side`) for the flash frames | fg | `lightningpop` (the apex motif at low amplitude: instant on at brightness 2.2, y+4, scale 1.06 → 0.12s micro settle; emphasis = sheet-lightning double flash, 2-frame brightness 1.9/1.0/1.8 chain — the bg sky double-kisses at the same beats) | wash downward with the rain (y+22, blur 3, 0.18s power1.in); a line facing dead air washes early at lastWord+1.08s; line off ≤ DUR−0.02 | -| `holorail` | volumetric projection plate: a scanlined glass slab (`body.plateW`×`plateH`, centered at `H − bottomPx`) with corner brackets + feed tag (`body.tag` / `theme.plateTag` override) boots like a projector turning ON (scaleY 0.03→1 expo + 1-frame flicker) and breathes a finite yoyo luminance cycle sized to the clip length; lines sit centered IN the plate (`lineDy` below plate center) with a constant chromatic-fringe text-shadow (−1.5px accent / +1.5px magenta) and drift slowly in rotationY (it IS a projection); the whole railwrap — plate included — dims to `yield.dim` while the apex lands | fg | `sweepboot` (the apex motif at low amplitude: instant opacity + rising clip-wipe reveal 0.15s + 1-frame x interference glitch at st+0.05/0.09/0.13; emphasis = 2-frame projection DROPOUT at `body.emphDelay`, restores brighter in `palette.em` with a hotter fringe, then settles back — the delay auto-shrinks near the line's exit so dropout+restore always complete) | projector cut — brightness 2.2 pop → collapse to a horizontal slit (scaleY 0.045, 0.07s power3.in) → to a dot (scaleX 0.015, 0.06s) → off at exit+0.15; the plate itself gets the same cut at DUR−0.14 | -| `planktonrail` | deep-sea lower third on TWO coexisting row slots: even lines ride the upper row (`H − bottomPx − rowDy`), odd lines the lower (`H − bottomPx`) — couplets share the water like drifting strata. A line clears when its row is next needed (line i+2 in − 0.15) or ~0.3s after its couplet finishes speaking (staggered pair exits, +0.12s on odd rows); the pre-apex leftover clears at heroIn−0.21 while the FEEDING line (last to start before the apex) yields to `yield.dim` instead — no restore unless ≥1.2s of hold remains (it exits dimmed, by design); a line entering during the hold arrives at `yield.enter` and restores at I+`yield.post`; every line floats on a gentle y keyframe drift sized to its window. Furniture: `body.motes` = {count, near, seed} plankton motes on seeded drift walks f(t); the first `near` seed a ring around the apex heart (ring radius scales with hero fontPx/120) and get ATTRACTED to the bloom at I−0.19 (pulled 0.72× toward it, brightening to 0.42 at scale 1.7), wiggle through the hold, and sink at clip end | fg | `glowon` (the apex bloom at low amplitude: 2-frame opacity ramp + radial bloom from word center — scale 0.92→1, blur 5→0, brightness 0.45→1, 0.4s sine.out — while a cyan glow text-shadow grows in; emphasis = slow DOUBLE-BEAT propulsion pulse at st+0.52, 5-key brightness/scale 0.55s, guarded ≤ DUR−0.09) | light sinks — y+15 while dimming, 0.3s power1.in; the last line floats to the end of the clip; line off ≤ DUR−0.02 | -| `sheenrail` | iridescent silk lower third on TWO coexisting row slots: even lines ride the upper row (`H − bottomPx − rowDy`), odd lines the lower (`H − bottomPx`) — couplets read together like a woven pair. Words are aurora-gradient ink (background-clip:text over a rose→teal→violet 300% wash whose backgroundPosition drifts f(t) 0%→300% across the whole clip — the body's hold life) above a blurred dark understroke (top+3px, blur 3); a soft radial band scrim sits under the rows (stable reading surface). Line scheduling mirrors planktonrail: a row clears when next needed (line i+2 in − 0.15) or shortly after its couplet finishes speaking (pairEnd + 0.23 + 0.17 on odd rows); the pre-apex leftover clears at heroIn−0.32 while the FEEDING line stays and dims with the railwrap yield (`yield.dim` at I−`pre`, restore at I+`post` — band included); the last line holds to the end | fg | `flowon` (the ribbon's flow at low amplitude: 2-frame opacity + y8 settle 0.38s sine.out; emphasis = ONE bright sheen sweep — a white highlight marches through the word once at st+0.16 (backgroundPosition −80%→180%, 0.42s power2.inOut) + a brightness 1.55 pulse) | dissolve UPWARD — words to y−12, blur 3, 0.32s power1.in staggered 0.035; each line releases `body.streaks` seeded light streaks (rose/teal/violet verticals) that float up from its row (y 14→−78, 0.62s, start clamped ≤ DUR−0.66) | -| `scoperail` | oscilloscope lower third: a dark phosphor scope band (`body.bandH`, top border + glass shadow) hosts HUD readouts (`body.hudL` left, sample-rate `· TRIG` + amber trig LED right), a graticule, and an ALWAYS-ALIVE waveform — an SVG polyline rebuilt from baked point-set states (seeded pseudo-RMS envelope at ~12 states/s + 3-frame triplets on word arrivals: speech grows the amplitude, silence flattens it, every word kicks a local gaussian burst at its slot center — burst x BAKED at compile time from the measured char-width table; the hero words kick WIDE bursts spread from `HG.x` toward `HG.x + 0.6·halfW`, where the trace surges to write). Body lines sit centered on the band above the trace with reserved-width slots (sizer + clip — no re-center drift as words arrive); the whole band (lines + wave + HUD) dims to `yield.dim` while the apex writes. At the FINAL transcript word the scope DIES: band x-shake, trig LED panics red then dies, the trace explodes to max-amp chaos for ~0.3s, flatlines, collapses to a single dot (scaleX 0.015) and `body.siglost` stamps with a 2-frame flicker (all clamped ≤ DUR−0.02) | fg | `tracewipe` (the apex pen-write at low amplitude: clip wipes the word in L→R over 0.10s + a 2-frame just-traced flash — flash-white instantly, settle to phosphor green; the death word settles to `palette.em` amber; the trig LED blinks on every arrival; emphasis = a ticking frequency-readout chip above the word, 3 seeded ascending values stepping every 2 frames) | the line collapses INTO the waveform (y+30, 0.13s power2.in) — early into dead air (lastWordStart+0.67), else just before the next line needs the slot; the last line collapses as the trace flatlines (min(NZ+0.33, DUR−0.2)) | -| `paperrail` | stop-motion craft table: a kraft strip (torn top edge via seeded polygon clip-path, washi-taped corners, handwritten `body.tag` in the tag font) docked lower-third (`body.strip` geometry, centered by default); body words are cream paper chips (`palette.chip` on `palette.chipEdge` border, hard dy3 shadow) on centered replace-lines; the whole strip jitters ±0.7px every 4 frames (handmade stop-motion weave); the hero slot keeps a red paper star (`palette.accent`, rail↔climax hand-off) that pulses 1.18→1.06→1 as the apex chips land; the FINAL transcript word is an accent-red sign-off chip; emphasis words get a washi-tape slap (steps(2) scale 1.7→1 at `word.start + body.tapeDelay`, chip pressed 1 frame); strip + lines yield (`body.yield`) while the apex lands | fg | `place` (the papermat drop at low amplitude: opacity full in 0 frames + seeded ±2.5° rotation, y −16 + scale 1.06→1 steps(2) 0.12s; hold = rotation-only ~5fps wobble) | `peel` (rotation −8°, y −40, fade, steps(3), staggered 0.03s; last line clamped to finish on frame) | -| `popuprail` | pop-up book page: a cream page strip (`body.strip` geometry, center foldline, top border + paper glow inset) unfolds up from the bottom edge (scaleY 0.02→1 back.out at 0.14 — the stage is built) and hosts TWO reading rows (`body.rowA`/`rowB` px above H) that alternate per line; the whole page breathes a gentle y drift sized to the clip; the hero slot keeps a blue paper star chip (`palette.accent` clip-path star, rail↔climax hand-off — spliced into the line whose window holds heroIn); emphasis words land at `body.emPx` weight 800 with a contact squash (1.06/0.93 set → elastic settle) the strip FEELS (1px dip), then flick-wobble (5-key rotationX, squeezed to fit before the fold) with a blue paper strut leaning in behind (scaleY back.out(2)); the FINAL transcript word is a blue sign-off with a strut; page yields (`body.yield`) while the centerfold lands; on the final word the whole page TILTS 2° +x6 (paper physics, `body.tilt:false` opts out) and the strip folds shut on the last frame (scaleY power3.in ≤ DUR−0.017) | fg | `popup` (the centerfold motif at low amplitude: opacity 1 in 0 frames + rotationX 85→0 baseline hinge, 0.25s back.out(1.4), back-shadow grows as it rises) | `fold` (the page closing: rotationX 88 power2.in 0.12s, shadow off, L→R wave staggered 0.045s, slot hidden at +0.13; fold at next line in / lastWord+`body.maxHold` in silence, wave clamped ≤ DUR−0.017) | -| `chalkrail` | night-lecture chalk band: a deep-green board strip (`body.strip` geometry, worn top hairline, eraser smudges, handwritten `body.tag` header in the tag font, two chalk sticks bottom-right) docked at the bottom edge hosts `body.rows` reading rows that ACCUMULATE — lines fill the rows top→bottom in phases of rows.length; when the next phase needs the rows an ERASER SWIPE clears the board (blurred light band sweeps across 0.42s at `prevEnd + body.eraseDelay` clamped clear of the next phase, the old words SMEAR out scaleX 1.3 + x+24 + blur(8) staggered 0.06s, faint ghost smudges fade in and STAY — chalk never fully erases); the FINAL transcript word lands in yellow chalk (`palette.em` sign-off); the band yields (`body.yield`) while the apex writes | fg | `scribble` (the chalkwrite verb at low amplitude: 2-frame opacity pop + scribble clip-reveal steps(4) 0.12s + y4 drop-settle + 6 seeded dust specks puffing at the word base, seeded ±2° tilt; emphasis = double underline dashes drawn beneath at st+0.22/+0.38) | eraser-swipe smear between phases (scaleX 1.3, x+24, blur 8, power2.in 0.18s); the final phase holds to clip end | -| `markerrail` | street handstyle rail: centered marker lines on a bottom rail (`body.bottomPx`), `palette.body` cream paint with a heavy drop text-shadow; emphasis words take ALTERNATING paint colors (`palette.em`/`em2`, yellow/magenta) + a spray-underline SWOOSH (dash-revealed squiggle viewBox-stretched to the word) with 8 seeded overspray dots that pop and fade; the FINAL transcript word lands BIG (1.5×) in `palette.em` with mini apex-impact physics (crush 0.09s power3.in → 2-frame contact squash → elastic settle — it rides the plate punch); the line visible at the tag's onset yields (`body.yield`, restore only with runway before its buff — else it exits dimmed) | fg | `flick` (the spray-write verb at low amplitude: opacity full in 1 frame at scale 1.18, seeded ±6° rotation settling to ±2°, 1-frame squeak skewX 7, back.out(2.2) settle 0.18s) | ROLLER BUFF (gray paint roller scaleX-sweeps the line 0.15s power2.in, words vanish under it, the wet smear lingers at 0.15 + blur(2) before fading); the last line is never buffed — the sign-off stays painted | -| `brushrail` | washi paper band: a deckle-edged band (`body.strip` geometry, two faintly rotated `paperHi`→`paperLo` under-sheets at 0.42 + a translucent `sheetHi`→`sheetLo` main sheet with warm inset shadow) swipes in L→R behind a traveling brush-head shadow (clipPath wipe 0.2s power2.out + blurred `palette.bh` gradient head — the ink gesture at low amplitude), then the under-sheet breathes faintly (0.32 Hz baked f(t)); body lines are centered replace-lines on the band (`fonts.body` serif at `body.fontPx`/`body.weight`, seeded ±1° tilt); emphasis words get a DOUBLE curved ink underline (`palette.ulInk`, fat 7/0.3 wash + tight 2.6/0.95 core, dash-drawn at st+0.12/+0.15); band + the line under the gesture yield (`body.yield`) while the apex lands; the band exits with the last line on one final R→L wipe | fg | `brush-wipe` (the gesture at low amplitude: clipPath inset reveal L→R 0.16s power2.out with a blurred per-word brush-head shadow riding the reveal edge, then vanishing) | wet-cloth WIPE (the reveal in reverse: the line clipPath wipes R→L over 0.10–0.14s power2.in with an erase brush head riding it, at min(next line − 0.136, lastWord + `body.maxHold`); the LAST line and the band wipe together at DUR−0.142) | -| `inkrail` | sumi ink on still water: up to THREE fixed reading rows at the bottom center (`body.bottomPx` = last-row center, `body.rowGap` apart; rows cycle in pairs, the closing line takes the third row — the final thought ACCUMULATES instead of replacing); `fonts.body` Mincho serif at `body.fontPx`/`body.weight`/`body.letterSpacing`, `palette.body` ink over a paper-white text-shadow halo (`palette.paper`/`paper2` glow stack — readable on bright skies) with a duplicate blurred dark halo per word; an ink-settling RULE (86%-width gradient hairline, scaleX 0→1 over 0.9s) draws beneath each line at firstWord+0.12; emphasis words shed a faint ink wisp curling off the word top (st+0.55, ±dir by line parity, skipped near clip end); the rows visible under the bloom yield (`body.yield` — dim at heroIn+`delay`, restore at heroIn+`post` only with runway before the exit) | fg | `bleed` (the apex bloom at low amplitude: opacity snaps in 2 frames; blur 12→0 + scale 1.25→1 power2.out carry the bleed — late words bleed faster so they resolve before clip end; the dark halo overshoots scale 1.5→1.04 while its opacity decays 0.5→0.25) | RE-DISSOLVE (blur 9 + scale 1.13 + fade + y−8 power1.in — ink dispersing back into the water) as the line-after-next approaches (= the next occupant of its row, outDur 0.5−0.05·i, never mid-read); the closing TWO lines persist to clip end | -| `ransomrail` | kidnapper's collage rail: every transcript word is a cutout chip in one of 4 cycled recipes (cream/`fonts.body` Anton, black/`fonts.dark` Inter-800, newsprint/`fonts.news` Special Elite, accent/`fonts.accent` Permanent Marker — emphasis words snap to the accent chip, never two identical chips in a row) PASTED along the bottom rail line (`body.bottomPx`) with seeded crookedness (rot sign alternates with line+word parity, baseline dy leans the other way), seeded ±px sizes (`body.fontPx`−2..+1, emphasis +3) and torn edges (seeded 12-vertex tear polygon, same paper stock as the apex); chips carry a hard dy5 offset drop-shadow; lines breathe (5-key scale keyframes) through their hold; the whole railwrap yields (`body.yield`, container opacity — never contests per-chip channels) while the apex letters slam | fg | `paste` (the apex slam motif at low amplitude: opacity full in 1 frame at scale 1.12 / rot×1.5 / y−8 → power3.in crush 0.08s → 2-frame contact squash 1.05/0.95 → elastic settle; emphasis = 1-frame RE-PASTE lift at `body.emphDelay` — shadow grows to a flight blur, rotation flips sign for good, then crush + squash + elastic again, rip-runway-guarded) | RIPPED off one by one (rotation ±16/17° throw + y−30 + fade, power2.in, staggered 0.045s) with a 1-frame paper-tear flash under each chip — timed so the rip tail overlaps the next line's pastes a beat (collage chaos, by design); the last line tears off clamped to finish on frame | - -fg body uses the **rail.html alpha-webm channel** (true alpha — dark panels and -scrims work; never the screen-blend index_fg path, which can only add light). - -## Hero setpieces (registry) - -| setpiece | what happens | notes | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `detonation` | charge-dim → sheared stencil slices crush in hot → SNAP into register → squash → elastic settle → paint cools to bone → bars/ticks/designation-tag deploy → shear-apart exit | pairs with fx flash/rings/sparks + plate punch/shake | -| `decode` | slot-machine glyph reels (steps() ease, seek-safe) lock left→right with RGB jitter → lock snap → CRT power-off exit | pairs with `redact-until-hero` | -| `drawon` | the word is WRITTEN stroke-by-stroke from a single-line font (Hershey) — per-stroke paths revealed sequentially at constant pen speed, nib rides `getPointAtLength`, hops at pen lifts; then hum + buzz dip | any word, zero tuning: `gen-stroke-path.py` lays out glyph pen-paths at compile time | -| `cpslam` | acid-yellow stencil word slams in BEHIND the subject with REAL diagonal notch cuts (SVG mask = true transparency over footage), chromatic split that settles to a PERMANENT cyan/red registration error, seeded glitch ticks, katakana tag, glitch-out exit | bounded hold (~2.6s default, `params.hold` / `hero.exitAt` override) — a climax is an event, not wallpaper | -| `assembly` | (inline, poem) apex word condenses BIG while star particles fly into it | | -| `colorflip` | (inline, takeover) accent-color crush card + dim kick + squash/settle + loom | pairs with fx flash + plate punch/shake | -| `flapboard` | split-flap departures board takeover: floodlight dim/scrim swing on, the housing clacks down (rotationX, squash, elastic) behind the subject, one giant flap tile per char flip-cycles 3–5 seeded wrong glyphs then LOCKS left→right across `params.lockWindow` (hot flash → cools to bone) under baked clack y-jitter; lock-complete = big clack + amber glow flicker + rule wipe + steps() status-ticker; hold = loom + one tile re-flutter; exit = tiles flip to blank cascade, housing flips away | pairs with `fx.crowdflash` (pops at lock start/end) and `plate.punchOffset = lockWindow` so the plate punch lands on the lock-complete clack, not the hero onset | -| `ledwipe` | transit LED board takeover: cool scrim + dim charge, an amber dot-matrix panel EXPANDS upward (scaleY steps(6)) behind the subject, header tags + unlit LED ghost boot-flicker alive, then the word ILLUMINATES column-by-column (clipPath L→R, steps ≈ 1.4×chars over `params.wipeDur`) hot → cools to amber; contact = cell squash + elastic settle + PA "ding" double brightness pulse; an 8-phase chasing LED-marquee border runs to the exit; hold = glow breathe + seeded-look LED dropouts; exit = word pages up out of the window, panel collapses back down | pairs with `fx.paflash` (amber PA flash at wipe-complete contact). Panel geometry derives from fontPx (`panelH = 44 + 1.42×fontPx + 18`); `params.panelW` fixed, width-fit shrinks the type only. Plate: grain-only (no punch) is the demo register | -| `vhsosd` | REC FREEZE camcorder slam: permanent lens vignette (`params.vignette`) + backlight-comp scrim (peak = `plate.charge`, cools to 0.69×) kill the bright sky; the word crushes in as a huge OSD readout — 3 horizontal clip-path tracking bands (`params.bandClips`) sheared (`params.bandShear`) + blurred (power4.in over `params.crush`) SNAP into register on the contact frame, squash → elastic settle; red/cyan misregistration copies cool from ±`misregIn` to ±`misreg` px and keep BREATHING through the hold under tape-weave y jitter (`params.weave`) + slow loom; auto-iris pump (white wash 0.20, dark dip = `plate.dim`); exit at `I + params.hold` = REWIND streak left + flat-white echo copy | pairs with the `vhsrail` paradigm, which emits the fg REC-FREEZE artifacts (tear band, head-switching bar, apex scrub lines, ● REC) at the same I/X times. Plate: grain-only (no punch) is the demo register; hold-life keyframes auto-clamp inside [contact, exit] | -| `bossintro` | arcade BOSS INTRO: the room dims (gradient `plate.dim`) behind a CRT edge glow (cyan base wash that pulses on the last emphasis word before the boss and spills magenta on the strobe + the final word); `params.tag` (WARNING) blinks 2× above the word rect; ~COLS×ROWS (`params.rows`, cells 0.7×/0.5× fontPx) seeded pixel blocks fall steps(3) from above into a tight matrix grid covering the word rect, each landing with a 1-frame white tick; at `I + params.flashDelay` the word flashes ON (Press Start 2P, instant at opacity 1, scale 1.15 → steps(3) crush → 2-frame squash → elastic settle) with ±4px chromatic ghost layers + a 3-frame palette strobe (white→cyan→magenta→white); hold = quantized 1.6% breathe + CRT glow cycle + baked block shimmer blinks; exit at `I + params.hold` = per-letter checkerboard dissolve, blocks drop away steps(3) | pairs with the `hudrail` paradigm; emits fg furniture via setpiece fg parts: letterbox bars (`params.letterbox` px) slam in steps(3) with a 1-frame overshoot and retract after the exit, HI-SCORE odometer (accent label, yellow digits) rolls every 0.066s through the hold, 1-frame white tick out. `fx.coinflash` adds the 1-frame radial impact flash at the strike; plate punch anchors at `punchOffset` = `flashDelay` | -| `rubberstamp` | the footage becomes an archive page (vignette charge = `plate.charge`, manila sepia wash `params.sepia`, dim kick = `plate.dim` that cools to 0.385×) and the verdict slams in BEHIND the subject as a bordered rubber stamp at `params.rotation`: a manila paper wash lights an instant before contact, the stamp crushes 2.2→1 power4.in over 0.115s, 2-frame contact squash, double-strike ghost print (`opacity 0.35`, offset +5/−4 rot 1.3), two thin-ink patches (`params.patches` clip-path circles in paper color), wet-ink saturate/brightness settle, paper indent shadow bloom; stamps don't move — the hold is DEAD STILL, sold by the breathing indent + a slow paper loom; exit at `C + params.hold` = mechanical 3-frame yank-down cut (the page is filed away), the archive plate releases 0.25s before | contact `C = heroIn + params.crush`; pairs with `fx.inkflecks` (seeded red spatter at C, ballistic with gravity) and `plate.punchOffset = params.crush` so the plate punch lands on the stamp contact; pairs with the `carbonstrip` paradigm (strip yield + shade breathe anchor at the same C); face chrome (border, radius, padding, ghost offset) scales with fontPx from the 120px demo cut | -| `lasercage` | concert-blackout laser show: the plate dims to `plate.dim` at t=0 and deepens to `plate.charge` before the drop while haze cones breathe in the top corners; a 6-beam array (alternating accent/magenta, emitters along the top edge) snaps on at I−0.26 and SWEEPS to converge on the word center (staggered 0.022s), a hot core pops at convergence; the word IGNITES behind the subject as an additive glow stack (wide accent blur 0.22×fontPx + magenta fringe offset + tight soft blur + near-white core): scale 1.16 crush power4.in → 2-frame contact squash → elastic settle + 2 controlled strobe pops (brightness 2.05, 1s apart, runway-guarded); a criss-cross beam CAGE (6 lines derived from the word rect) draws itself dash-by-dash around the word and flickers; through the hold the array FANS OUT slowly to floor targets (the iconic concert fan) while the word looms; exit at `heroOut − 0.38` = cage un-draws, beams sweep away L→R (+0.74W) carrying the letters (per-letter streak + blur, stagger auto-clamped ≤ DUR), the room lifts back to 0.12 | word geometry is metric-exact via `assets/fonts/char-widths.json` (cage/spill/flash all derive from `halfW` + `fontPx`); pairs with `fx.laserflash` (accent contact flash at I+0.03, sized 2·halfW+80 × 4.8·fontPx) and the `laserrail` paradigm (same converge-ignite motif at low amplitude); plate punch anchors at `punchOffset` ≈ 0.07 (the ignite contact) | - -| `boltstrike` | THE STRIKE: a slate storm mood (`params.mood`) sits on the room from t=0 and the sky KISSES (1-frame 6% gradient brighten) on every body word — double-kiss on emphasis words, re-flashes at I+0.84/I+1.44 during the hold; the room charge-dims to `plate.charge` under a radial word scrim from I−0.39; a hand-authored branched bolt (5-seg zigzag + 2 branches, haze/glow/core SVG stack in `palette.accent`/`glow`/`core`) flashes 2 frames BEFORE the word — leader 1 → 0.35 → return stroke 1 at contact — with a sky flash; the word slams in (Anton scale 3.1 crush power4.in 0.105s, blur 14→0, brightness 3.2→2.5) → 2-frame contact squash → elastic settle, lit HARD for 2 frames then cools to 1; SIGNATURE: the word's text-shadow flips toward the bolt side for the flash frames; ozone under-glow (accent, blur 26×fontPx/145) blooms at contact and breathes (6-key opacity cycle) through the hold + slow loom + 2-frame lit blips on the sheet re-flashes; the dim releases at the flash, settles to a `plate.dim` storm hold and lifts before the exit; exit at `min(heroOut−0.2, I+params.hold)` = washes downward with the rain (y+38, blur 6) | bolt geometry is baked at compile time as offsets from the word center (halfW/360 × fontPx/145 units, `params.side` flips it); word rect is metric-exact via `assets/fonts/char-widths.json`; word scrim = 2·halfW+380 × 2.28·fontPx; pairs with `fx.strikeflash` (full-frame fg flash with the same leader/return flicker grammar) and the `stormrail` paradigm (rain doubles + shadow flip at the same I); plate punch anchors at `punchOffset` ≈ 0.02 (the return stroke) | -| `holoboot` | full volumetric boot behind the subject: a desk emitter dot pops (back.out scale), the projection cone SNAPS wide (scaleX 0.07→1 expo, 0.11s, then dips 0.55→0.95), a seed beam fires up from the emitter (scaleY power3.in, fades after contact), and the word boots with a RISING clip sweep (opacity instant at I−0.055, the reveal is the wipe) into a 7-layer projection stack (dark backing shadow / wide `palette.glow` blur / magenta + cyan chromatic fringes / `palette.core` word / scanline mask / climbing interference bands, band pitch 0.39×fontPx); contact at I+0.07 = brightness 2.3 flash + scaleX 1.07 / scaleY 0.91 squash held 2 frames + elastic settle + 1-frame x interference jumps; fringes blow ±8px then settle to the permanent ±2px registration offset; hold = bands climb −6 pitches, rotationY oscillates [0,6,−7,5,0], glow/cone breathe, emitter dot pulses, slow 1.028 loom; at `I + params.passAt` (≥ I+1.25, runway-guarded) a hand "passes through" the projection (skew 6/−4/0 + blur + fringe blowout + scaleY ripple — pure projection logic); exit at `min(heroOut−0.22, DUR−0.3)` = projector cut: brightness 2.4 → collapse to a horizontal line (scaleY 0.018) → to the base dot (scaleX 0.015), cone fades, dot pops 2.2× and dies. A second smaller emitter cone (`params.coneW`) rises from the desk under the holorail plate ALL video with baked flicker cycles + dot pulses, and gets its own projector cut at DUR−0.2 | word rect is metric-exact via `assets/fonts/char-widths.json` (cone width 2·halfW+80, emitter at cy+2.4·fontPx, all rig geometry derives from `halfW` + `fontPx`; scene scrim is a radial centered on the hero's frame fractions); pairs with `fx.holoflash` (cyan fg lock flash at I+0.075, radial at the same hero fractions) and the `holorail` paradigm (same sweep-boot + interference-glitch motif at low amplitude; the body cone is aimed at ITS plate); plate: grain-only (no punch) is the demo register, scene reaction = `plate.scrim`/`charge`/`dim` | -| `biobloom` | bioluminescent BLOOM behind the subject: the abyss grade (`params.mood`) + a breathing vignette (6-key opacity cycle sized to the clip) sit on the room from t=0 — the world is underwater before anything speaks; a creature pre-glow (1.083×/0.717× fontPx ellipse) gathers with a double-beat anticipation at I−0.31 and crushes to a point at I−0.115; a dark pocket scrim (`plate.scrim`, 2·halfW+280 × 2.5·fontPx) opens behind the word zone at I−0.03; the word CONDENSES in (scale 2.35 crush power4.in over `params.crush`, blur 15→2, brightness 2.6→1.7) → 2-frame contact squash (1.09/0.93) → elastic settle while cyan light SPILLS onto the scene (radial at the hero's frame fractions: snap 0.55 at contact → 0.2 → shimmer keyframes); 6 luminous tendrils (paired blurred SVG strokes — glow w9/blur5 + core w3/blur1.1, accent/violet/ice alternating) draw outward from the word rect staggered 0.05s (stagger auto-clamps so the last filament completes before the sink); hold = glow breathes 8–14% (4-key scale/opacity), glow-layer flicker, two counter-drifting caustic gradients shimmer over the text zone, the bloom drifts slowly with the current (`params.drift` on the x channel); exit at `min(heroOut−0.2, DUR−0.3)` = the light SINKS — tendrils (via their HTML wrapper, never gsap-y on inner SVG), caustics, pocket, spill and the word all drift down (+14/+26) while dimming, word blurs out | tendril geometry is hand-authored from the demo and baked at compile time as offsets from the word center (x scaled by halfW/demoHalf, y by fontPx/120, endpoints frame-clamped); word rect is metric-exact via `assets/fonts/char-widths.json` (0.01em tracking); pairs with `fx.sporeburst` (seeded spore puffs burst PAST the bloom at contact in the fg layer, ballistic with slight sink) and the `planktonrail` paradigm (same glow-on motif at low amplitude + mote attraction anchored at the same I); plate: pushIn+grain (no punch) is the demo register — the demo's postfx profile was `push` | -| `silkribbon` | aurora silk WRITTEN into the night sky behind the subject: the hero word is a sequential Hershey-stroke reveal (one `` per pen stroke at constant pen speed, `gen-stroke-path.py` baked at compile time — any word, zero tuning) in a blurred halo (`params.haloWidth`, feGaussianBlur 7) + tight core (`params.coreWidth`, white drop-shadow), BOTH stroked by ONE userSpaceOnUse rose→teal→violet linearGradient with reflect spread; SIGNATURE: the gradient's x1/x2 translate f(t) from I−0.07 to the clip end (shift 1.5× the gradient span) so the aurora colors FLOW THROUGH the drawn ribbon during the hold; a soft light mote (blurred halo + core dot) rides the pen, hops at lifts, and blooms out 2.4× at the final stroke; scene reaction = two huge aurora blobs (teal top-left / rose top-right, frame-fraction geometry) drift the sky f(t) from t=0 at `params.wash` and DEEPEN to `params.deepen` as the ribbon writes, a top scrim (`plate.scrim`, 0.653H) charges in at I−0.34 (sky washout guard), a light spill (`params.spill`) tints the sky at I+0.1 once the ribbon completes and flickers gently, and the halo breathes (5-key opacity cycle) through the hold; gentle — no shake, no contact squash: the apex verb is the writing itself; writing window = `params.window` clamped so the ribbon finishes + holds before ENDT = DUR−0.04 | canvas/gradient/spill all derive from `params.targetWidth` (demo: 880 ink on a 1010×280 canvas, baseline 200; svgW = tw+130, spill = (tw+60)×0.51, gradient span = 0.6364·tw), centered at the scene-aware HG (pref top 18, the sky band — same as drawon); pairs with `fx.silkmotes` (seeded aurora motes rise near the ribbon during the hold, fg layer, demo spread fractions keep the face gap) and the `sheenrail` paradigm (same flow motif at low amplitude); plate: pushIn+grain (no punch) is the demo register — the demo's postfx profile was `push` | -| `scopetrace` | the scope's own trace LEAPS off the band and WRITES the hero word behind the subject: a surge column (3px, bottom-anchored scaleY pop, landing at the pen-start point parsed from the baked path) jumps from the scope band at I−0.12; the word is a sequential Hershey-stroke reveal (one `` per pen lift at constant pen speed, `gen-stroke-path.py` baked at compile time — any word, zero tuning; punctuation stripped for the pen) drawn CORE-ONLY in a thin phosphor stroke (`params.coreWidth`, bright `palette.bright` + accent drop-shadows — it is a trace, not a tube), nib rides `getPointAtLength` and pops 2.4× at DRAWN; the phosphor FILL (blurred halo strokes, `params.haloWidth`, blur 7) flicker-arrives AFTER the write at FLICK = DRAWN+`params.flickGap` (pre-arm 2 frames early, 5-step 1/0.25/1/0.55/1 blink, core dips 0.55 for a frame); hold = glow hum (7 Hz + 11.3 Hz sine keyframes, f(t)) + 1.6% breathe on an HTML wrapper with transformOrigin at the hero's frame fractions, ending exactly at the collapse; exit = the word COLLAPSES to a flatline (wrapper scaleY 0.02, 0.14s power3.in, same origin) + a horizontal flash bar (2·halfW wide at the word center) that shrinks out — scheduled at nextSpokenWord − `params.clearGap` (clamped ≥ FLICK+0.45, ≤ heroOut) so the trace clears BEFORE the next line speaks; scene reaction = phosphor radial scrim (`plate.scrim` at the hero fractions, I−0.18 → EXIT+0.05) + green spill sized from targetWidth (`params.spill`); second beat: a 1-frame phosphor pulse answers the FINAL transcript word — the same death beat the scoperail finale owns | trace geometry derives from `params.targetWidth` (svgW = tw+140, local baseline 215, ink center ≈ baseline−28 — the demo registration; surge x parsed from the first `M` of the path); centered at the scene-aware HG (pref top 25, ink height 115); pairs with the `scoperail` paradigm (tracewipe = the same pen-write at low amplitude; the paradigm's hero waveform kicks fire at the same word onsets) and needs no front fx; plate: grain-only (no punch) is the demo register | -| `papermat` | STOP-MOTION PAPERCUT behind the subject: a torn-edge kraft mat (two seeded torn polygon layers) DROPS from above with steps(2) gravity and slaps down (squash → rest, soft blob shadow); then one torn cream chip per char (`palette.paper`/`paper2`, hero-font ink `palette.ink`) drops with steps(3) gravity + 1-frame overshoot at `I + i·params.step`, each announced by an anticipation shadow 3 frames early, landing crooked (seeded ±3° ±4px), settling through three 12fps poses, then holding an 8fps wobble (baked set chain — the stop-motion heartbeat) while the whole tableau breathes 1.6% (camera-push loom); scene reaction = a warm vignette (`params.vig`) charging with the landing; on the FINAL word the table BUMPS (y4, 1 frame) and the chips SCATTER off down-right steps(4) staggered 0.045s, the mat swept off last (disperse-on-last-word, `hero.exitAt` overrides) | chip geometry derives from `hero.fontPx` (demo ratios: tile 0.91×/1.31× fontPx, pitch tile+14, mat N·pitch+80 × 1.846× fontPx), width-fit shrinks type and chips together; pairs with `fx.paperscraps` (paper scraps puff at each chip contact, fg) and the `paperrail` paradigm (same place verb at low amplitude); plate: grain only is the demo register | -| `centerfold` | POP-UP BOOK CENTERFOLD behind the subject: blue + cream 12-point paper starbursts (deterministic starPts polygon, `palette.accent`/`cream` fills with kraft-edge strokes) unfold on a baseline hinge (scaleY 0.03→1 back.out(1.6), cream staggered +0.06) starting I−0.272 while a blob shadow grows beneath; the hero word pops up at I in `params.segs` hinged clip-path segments (rotationX 85→0 back.out(1.4) staggered `params.segStagger` — the body's popup verb at full amplitude); two kraft struts lean in at I+0.33; backdrop + word wobble-settle TOGETHER (one `#cfWob` wrapper owns rotationX, 6-key) then breathe through the hold (word 5-key rotationX + shadow scaleX, both auto-squeezed into the window); scene reaction = a dusk radial scrim at the hero's frame fractions (`params.scrim`, bright-sky insurance) charging with the unfold; exit = the whole spread folds FLAT (segments rotationX 88 staggered, struts/bursts scaleY collapse cream-then-blue, scrim out) at `max(I+segStagger·(segs−1)+0.45, min(heroOut−0.33, DUR−0.39))` — the book closes before the next sentence | burst geometry derives from the word rect (metric-exact via char-widths: burstR = clamp(1.83·fontPx, 0.59·wordW, 0.42·H), box 2R+180 × 2R+fontPx, demo props scale at burstR/220), width-fit shrinks the type first; pairs with `fx.confetti` (seeded ballistic paper confetti launched from the hinge line at I+0.128, fg) and the `popuprail` paradigm (same baseline-hinge verb at low amplitude); plate: grain only is the demo register | -| `chalkwrite` | NIGHT LECTURE behind the subject: the lower chalk band grows into a FULL deep-green board (scaleY 0→1 power3.out from the bottom edge at I−0.3, the room dims `params.dim` + vignette `params.vig` with it); the hero word is HAND-WRITTEN in chalk — sequential Hershey stroke reveal (drawon pattern, `gen-stroke-path.py` baked at compile time), dry/rough via seeded ±1px jitter on every pen point (`params.jitterSeed`), a blurred halo (`params.haloWidth`, feGaussianBlur 3.2, group opacity `params.halo`) under a tight core (`params.coreWidth`), a chalk-stick nib (rotated rect) riding the pen — while `params.dustN` dust specks fall from the nib along the path; at write-complete a hand-slap CLAP shakes the board 1 frame (set-chain y 3/−2/1/0; the dust burst lives in the rail, in FRONT: `fx.chalkclap`), then TWO violent accelerating underlines slash beneath (seeded waviness, power3.in, the nib rides them, dust kicks at the ends), the chalk flicks away, and the halo breathes (baked 1.6/3.7 Hz f(t)) through the hold with two slow motes drifting off the letters | geometry registers on the MEASURED ink box (the stroke path is parsed at compile time; ink CENTER lands on scene-aware HG.y, pref top 44): the board rect (`params.boardGap`×inkH above the ink, bottom flush with the frame, width = the body strip), the underlines (inkL+14→inkR−4 at inkBot+30/+50) and the fg clap point (the pen's LAST contact point → HG.clapX/Y/T) all derive from it; x defaults to the board's LEFT margin + tw/2 — a hand writes from the left, never centered on the subject (`theme.hero.x` overrides); pairs with `fx.chalkclap` (12 seeded radial dust specks + a blurred puff at DRAWN, fg) and the `chalkrail` paradigm (same scribble verb at low amplitude); plate: grain only is the demo register; needs `python3` | -| `spraytag` | STREET TAG behind the subject: the dusk wall dims (`params.dim`) + a radial scrim charges (`params.scrim`) at I−0.42 as the writer steps up; the can RATTLES at the pen-start point (6 seeded set-chain nib jitters, I−0.30→I−0.02), then the hero word is spray-written stroke by stroke — sequential Hershey dash reveal at constant pen speed (`gen-stroke-path.py` baked at compile time) — as a TRIPLE stack per stroke: fat dark under-stroke `palette.under` (`params.underWidth`, sky-contrast armor) + blurred overspray halo (`params.haloWidth`, feGaussianBlur 7, group opacity `params.haloOpacity`) + wet paint core (`params.coreWidth`, drop-shadow), the glowing nib (r9, `palette.nib`) riding each stroke; `params.osprayN` seeded overspray dots pop near the nib as it passes; nib throws off 2.6× at DRAWN; through the hold `params.drips` seeded DRIPS (paint→`dripMid`→`dripLo` gradient bars) grow from painted low points (x-separated >110px) and KEEP growing, the halo hums (7/11 Hz baked f(t)) and the whole tag looms 1.014; writing window = `params.window` (demo 0.58s) clamped so write + splat + drip fit before ENDT = DUR−0.04 | geometry registers on the MEASURED ink box (ink CENTER lands on scene-aware HG.y, pref top 26 — the sky band, crossing the subject silhouette is the point; tag centers on the hero anchor, `targetWidth` capped at W−140); the pen-finish point is baked onto HG.splatX/Y/T for the fg splat; pairs with `fx.paintsplat` (hot `em2` ring + paint ring + seeded ballistic droplets at DRAWN, fg, in FRONT of the subject) and the `markerrail` paradigm (same flick verb at low amplitude); plate: punch with `punchOffset` ≈ window+0.05 so the punch lands on the splat, not the hero onset; needs `python3` | -| `brushwrite` | SUMI-E GESTURE behind the subject: a warm paper wash (`palette.wash`/`wash2` radial, `targetWidth`+380 × `params.washH`) charges at I−0.18 to `params.wash`, settling to `params.washSettle` through the hold; the brush SLAPS down at the first pen point — a start-SPLAT (irregular ink ellipse rotated −24° + 5 seeded satellite dots, scale 0.35→1 power3.out 0.12s; the fg fleck pass rides `fx.brushflecks`) — then the hero word is written in ONE sequential gesture (Hershey dash reveal at constant pen speed, `gen-stroke-path.py` baked at compile time) as a FOUR-layer stack per stroke: blurred bleed (`params.bleedWidth`, feGaussianBlur 6, group hidden until the hold) under fat/mid/core widths (`fatWidth` 0.25 / `midWidth` 0.6 / `coreWidth` 1.0 stroke-opacity = pressure-tapered wet brush), the round ink nib (r7.5, `palette.nib`) riding the pen and flicking off (+42,−30, scale 1.9) at DRAWN; ≤`params.spatterN` spatter droplets eject PERPENDICULAR at the sharpest-curvature points of the gesture (angle-delta > 0.55 rad, te-separated > 0.045s); through the hold the ink BLEEDS into the paper (bleed group fades to `params.bleed` over ≤1.7s) and the whole work breathes 0.6% (`params.breatheHz` baked f(t), svgOrigin = ink center); then the vermilion SEAL chop (`params.sealGlyph`, `palette.seal`/`sealMid`/`sealLo` radial face, `fonts.seal` glyph) stamps at DRAWN+`params.sealDelay` — power4.in crush 0.09s → 2-frame squash → elastic settle + 3 seeded red flecks — skipped entirely if the clip ends too soon; writing window = `params.window` (demo 0.45s) clamped so write + seal + bleed fit before ENDT = DUR−0.04 | geometry registers on the MEASURED ink box (ink CENTER lands on scene-aware HG.y, pref top 19 — the sky band, crossing the subject silhouette is the point; gesture centers on the hero anchor, `targetWidth` capped at W−240 — on scenes with a dark object near the pen start, set `theme.hero.x` so the slap-down lands clear, like the demo's 864); the pen-START point is baked onto HG.fleckX/Y/T for the fg flecks and the seal sits at (inkR−103, inkBot+72) clamped on frame (`params.sealDx/sealDy` override); pairs with `fx.brushflecks` (seeded upward ballistic ink flecks at the slap-down, fg, in FRONT of the subject) and the `brushrail` paradigm (same brush-wipe verb at low amplitude); plate: punch with `punchOffset` ≈ window+`sealDelay` so the punch lands on the seal CONTACT, not the hero onset; needs `python3` | -| `ransomnote` | RANSOM NOTE slam behind the subject: one cutout chip per letter (4 recipes cycled, seeded ±13% sizes around `hero.fontPx`, alternating-sign rotations ±2–5°, misaligned baselines ±2–6px, seeded tear-polygon edges) slams in oversized (scale 1.5, rot×1.8, flight drop-shadow) at S_k = I + 0.01 + `params.step`·k, crushes power3.in over 0.085s, and on contact the shadow POPS tight (1-frame filter swap) → 2-frame squash 1.07/0.93 → elastic settle; when the LAST letter lands the whole word takes a collective 1-frame JOLT (y6 → power3.out) + a scene pulse (`params.pulse` full-frame dark blink); hold = slow 5-key loom (the crooked grid never straightens); exit = letters RIPPED off one by one (rot+±15–22° throw, y−34, fade, 1-frame tear flash under each) at ripT = min(lastWord − `params.ripLead`, DUR-clamped), ≥ jolt+0.45; scene reaction = collage scrim (`params.scrim` top-dark gradient) charges at I−0.07, out with the rip | width-fit measures each glyph IN ITS OWN recipe font (`assets/fonts/char-widths.json`) + 0.20em chip padding + 6px margins so the collage never overflows; chip chrome (shadows, space width) scales with fontPx from the 130px demo cut; the setpiece RECOMPUTES `plate.punchOffset` = 0.01 + step·(N−1) + crush from the real letter count so the plate punch always lands on the collective jolt, whatever the hero word length; pairs with the `ransomrail` paradigm (same paste verb + tear flashes at low amplitude, same recipe classes/seeded tear polygon emitted into both layers); no front fx — the flashes live inside the chips | -| `inkbloom` | INK DROP IN STILL WATER behind the subject: paper-white radial washes charge the two text zones (`palette.wash` rail wash from t≈0.15, PERSISTS to clip end so the closing body lines keep their ground — it registers on the body row geometry `body.bottomPx`/`rowGap`; `palette.washApex` apex wash at I−0.077, out with the bloom) and a gentle vignette (`params.vig`) STILLS the world while the ink blooms; the drop (ink teardrop, `params.fall` 0.15s) appears above the word point at I−0.08, swells, falls power2.in with a scaleY stretch, squashes 1.7/0.35 on contact (2 frames) and merges into the BLOOM — 3 stacked blurred irregular ink ellipses (`palette.ink`, opacity snaps 0.82/0.62/0.5 then decays) scaling at different rates with counter-rotations (expo.out 1.15/1.35/1.5s) + 2 thin concentric ripple rings expanding 7.2×/9.6× on the water surface; the hero words RESOLVE out of the blob (opacity snaps, blur 16→0 + scale 1.12→1 power2.out) — the FIRST at contact+0.02, the following at their own spoken times (multi-word hero, per-word hand-off); through the hold the glyph edges BREATHE (baked 5-key blur keyframes per word, alternating 0.66/0.5s), the group looms 1.018 and two faint ink wisps curl off the word top (C+0.573/C+0.753, fit-guarded); exit: RE-DISSOLVE (blur 11 + scale 1.15 + fade, 0.52s power1.in) at XOUT = min(I+`params.maxHold`, next body line − `params.clearGap`, DUR−0.6) — the ink clears before the next thought needs the reader | geometry derives from the measured word rect (`assets/fonts/char-widths.json`; kx = halfW/demoHalf, ky = fontPx/132 scale the demo's blob/ring/wisp anchors; pref top 25 — the sky band, crossing the subject silhouette is the point); dark `palette.ink` + its paper washes carry the contrast on bright skies; pairs with the `inkrail` paradigm (same bleed verb at low amplitude); plate: quiet `pushIn`, no punch — the bloom is liquid, not percussive | - -Inline setpieces (`hero.inline: true`) live inside the body paradigm — the hero -word stays in `lines`. Embed setpieces own the word: leave it OUT of `lines` -(rail↔climax hand-off), except `panel` + `redact-until-hero`, where the words -appear in the log as `█████` until the decode locks. - -A setpiece may additionally return `fgCss/fgHtml/fgJs` — those parts are merged -into the fg alpha page (rail.html), for furniture that must ride ABOVE the matte -(e.g. a verbatim chip that may never be occluded) while the setpiece scenery -stays embedded behind the subject. - -## Linkages - -- `redact-until-hero` — panel log shows hero words as blocks; un-redacts at lock -- `corrupt-on-last-word` — panel jitters + hue-shifts on the final word -- `disperse-on-last-word` — every visible poem letter scatters back to dust -- `field-is-the-apex` — (lastpage) the blurred future-field rack-focuses at the - apex: every faint line was the apex word all along; the main instance holds, - the rest re-blur and die - -## Hard rules inherited (do not relax) - -- determinism: paused GSAP on `window.__timelines["main"]`, seeded PRNG only, - set-chains / keyframes, no Math.random/Date.now/CSS-keyframes -- 80 ms word sync (timings come from transcript.json via the strict matcher; - any uncovered transcript word is a compile ERROR — verbatim completeness) -- apex owns the frame: fg furniture must avoid the setpiece rect or yield - (`body.yield`) during the hero window -- plate punch/shake ALWAYS post-composite (`_postfx.sh`) so subject + text + - plate move as one photographed frame (matte never desyncs) - -## SVG gotchas (paid for, do not rediscover) - -- dash patterns restart on EVERY subpath → sequential per-stroke paths, never - one dashoffset across a multi-stroke word -- round linecap renders a DOT at dashoffset=len → hide each stroke until its turn -- inline-block trailing spaces collapse → word gaps via margin, not text spaces -- SVG-font glyph y is UP → flip when converting (gen-stroke-path.py does) -- NEVER gsap x/y/scale on raw SVG children: it runs `_parseTransform`/getBBox, and - zero-area shapes (fan-kit slivers) trip GSAP's bbox hack → `appendChild` on a - null docElement in injected-gsap contexts (preview-frames, renderer). Jitter - SVG pieces via `attr:{transform:"translate(...)"}` only; scale/loom belongs on - an HTML wrapper div. Nuance: a ROOT `` inside a div has null - ownerSVGElement → GSAP classifies it as HTML (CSS transforms, no getBBox), so - scale/skew on the svg root is safe — but copying that onto an inner `` - becomes the fatal class. attr transforms can't TWEEN — use frame-quantized - step chains (identical on screen at 24fps) - -## Timeline ownership rules (audit-derived, do not relax) - -- ONE owner per (target, property) at any instant. A duration tween re-renders - every tick until it ends — any set/tween on the same property inside that - window gets visually overwritten a frame later (1-frame ghosts, flash-backs). - Known shapes: yield dim vs line exit; yield restore vs powercut set-chain; - per-word line-y bounces with word gaps < 0.22s. The rail emitter guards these - (bounce ownership tracker, dim clamped ≥ line-in, restore only with ≥0.3s - runway before exit — else the line exits dimmed, by design). -- Inverted clamps: `Math.max(lo, Math.min(hi, x))` with lo > hi silently pins to - lo. When a lockup is wider than the frame, CENTER it (x = W/2) instead of - clamping — decorative bleed must be symmetric. -- The overflow gate only measures elements with direct text nodes — SVG-painted - setpieces (mask text + rects) are invisible to it. Do not read its "ok" as - proof for svg lockups; judge those on the preview frames. - -## theme.json — full schema - -```json -{ "dna": "", // required - "lines": [["word","word",...], ...], // required — verbatim transcript tokens, in order, - // INCLUDING punctuation ("size.", "noise.") - "minors": ["word", ...], // optional — theme's inline emphasis treatment - "hero": { "match": "word or phrase", // required — exact transcript tokens (case-insensitive, - // punctuation-stripped match); first occurrence wins - "text": "DISPLAY FORM", // optional display override - "out": 5.9, "exitAt": 3.3 }, // optional window overrides (seconds) - "width": 1280, "height": 720, // optional, default 1280x720 (theme DNAs are tuned - // for 16:9; vertical needs a DNA variant) - "fps": 24, // optional — matte.fps is AUTHORITATIVE when present - "panelHeader": "..." } // optional (panel paradigm) -``` - -Scene awareness (inherited from the existing typography system): when -`safe-zones.json` is present the compiler re-anchors the hero setpiece to the -measured occlusion bands (`heroBands.profile`, 18–55% occlusion, closest to the -setpiece's preferred height) and `heroAnchor.centerXPct`, width-fits the hero -font to the actual word, and docks panel/poem furniture on -`subject.clearerSide`. Explicit `theme.json` values > scene auto > DNA fallback. - -Expected (benign) log noise: `[Browser:REQUESTFAILED] GET source.mp4 -net::ERR_ABORTED` during the fg-layer page load, reel-glyph overflow lint -lines, and `media_missing_data_start` — all cosmetic; the render is good if -render-theme.sh exits 0 and prints the gates summary. - -## Authoring a project (this is ALL a user writes) - -`/theme.json`: - -```json -{ - "dna": "ordnance", - "lines": [ - ["The", "stars", "were", "only", "limited"], - ["by", "the", "pixel", "size."], - ["It's"], - ["what", "you", "can", "actually"], - ["recover", "from", "the", "noise."] - ], - "minors": ["stars"], - "hero": { "match": "remarkable" } -} -``` - -- `lines` follow the transcript verbatim, in order (compile error otherwise); - every transcript word must be covered by `lines` ∪ `hero.match` — the example - above omits "remarkable" from `lines` precisely because `hero.match` covers it - (it slots between `["It's"]` and `["what",...]`) -- leave the hero word(s) out of `lines` for embed setpieces; keep them for - inline setpieces and for panel+redact -- `takeover`: each line is one CARD — group by beat (1–2 words), not subtitle - length; `panel` scrolls automatically past ~5 lines (terminal scroll) -- the ordnance "charge" is an edge vignette + rail yield (the center stays - clean by design) — judge it at the frame corners, not the center -- `minors`: words that get the theme's inline emphasis treatment -- preview first: `node scripts/make-theme.cjs ` then - `node scripts/preview-frames.cjs ...` (Visual QA) -- then: `bash scripts/render-theme.sh ` → **`final_fx.mp4`** (the - deliverable; `final.mp4` is pre-plate-reaction) - -Prereqs identical to other modes — `prepare.sh` outputs: transcript.json, -frames_fg/, matte.fps, safe-zones.json (scene awareness), source.mp4. -frames_bg/ is only needed by preview-frames.cjs, not by the render. - -## Adding a theme DNA - -Copy a `themes/*.json`, change identity fields. You may ONLY combine existing -paradigm/setpiece/linkage names — if the look you want needs a new mechanism, -that is a registry contribution (this file + make-theme.cjs), reviewed like an -engine change. A DNA that needs per-word visual tuning to ship is rejected: -**any input, zero hand-fixing** is the acceptance bar (the draw-on lesson). diff --git a/.agents/skills/embedded-captions/themes/anchor.json b/.agents/skills/embedded-captions/themes/anchor.json deleted file mode 100644 index 4b45e0a..0000000 --- a/.agents/skills/embedded-captions/themes/anchor.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "anchor", - "voice": "the quiet professional — a verbatim rail that simply reads (2-frame fade-ups, accent emphasis), and one climax that settles into the scene behind the subject with a drawn accent underline. No spectacle: discipline IS the style. This is the conservative default that replaced Standard mode.", - "when": "explainers, tutorials, product walkthroughs, corporate and news-adjacent clips — anywhere every word must be read and nothing should show off. Pick it when unsure.", - "register": "calm", - "fonts": { "body": "Sora", "hero": "Sora", "tag": "Sora" }, - "palette": { "body": "#F2EFE9", "accent": "#D9B98C", "em": "#EFCB9A" }, - "body": { - "paradigm": "rail", - "layer": "fg", - "fontPx": 46, - "bottomPx": 96, - "letterSpacing": "0.012em", - "entrance": "fade", - "exit": "fade", - "minorScale": 1.0, - "yield": { "dim": 0.55, "pre": 0.2, "post": 0.9 } - }, - "hero": { - "setpiece": "settle", - "layer": "bg", - "fontPx": 150, - "params": {} - }, - "plate": { "dim": 0.16, "pushIn": 0.012, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/arcade.json b/.agents/skills/embedded-captions/themes/arcade.json deleted file mode 100644 index 614f1bc..0000000 --- a/.agents/skills/embedded-captions/themes/arcade.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "arcade", - "voice": "8-bit cabinet attract mode — the whole frame plays through a CRT (scanlines + vignette) above a bordered HUD bar (1UP blinking on the classic cadence, CREDIT 01) where every word coin-pops in on steps(2) with a 1-frame white blip; emphasis words run a cyan→magenta palette swap. The apex is a BOSS INTRO behind the subject: the room dims, WARNING blinks twice, ~64 seeded pixel blocks fall quantized into a matrix grid over the word rect, then the word flashes ON in Press Start 2P with chromatic ghost layers + a 3-frame palette strobe while letterbox bars slam in and a HI-SCORE odometer rolls top-right; everything dissolves checkerboard and the blocks drop away.", - "when": "gaming, retro-tech, playful hype, launches, achievement/level-up beats, '像素/街机/8-bit/打游戏' asks — anything that should read as an arcade cabinet boss fight. Loud register; the boss dim + dark HUD bar bring their own contrast on bright skies.", - "register": "loud", - "fonts": { "body": "Press Start 2P", "hero": "Press Start 2P", "tag": "Press Start 2P" }, - "palette": { - "body": "#FFFFFF", - "accent": "#00E5FF", - "magenta": "#FF2E88", - "yellow": "#FFE600", - "credit": "#7ADCFF" - }, - "body": { - "paradigm": "hudrail", - "layer": "fg", - "fontPx": 26, - "bar": { "h": 70, "inset": 24, "bottom": 50 }, - "tags": { "left": "1UP", "right": "CREDIT 01" }, - "scan": 0.06, - "textTransform": "uppercase", - "yield": { "dim": 0.55, "pre": 0.09, "post": 1.04 } - }, - "hero": { - "setpiece": "bossintro", - "layer": "bg", - "fontPx": 84, - "params": { - "seed": 13013, - "rows": 4, - "tag": "WARNING", - "flashDelay": 0.14, - "hold": 1.24, - "letterbox": 44 - } - }, - "fx": { "coinflash": 0.55 }, - "plate": { - "dim": 0.58, - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.14, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/aurora.json b/.agents/skills/embedded-captions/themes/aurora.json deleted file mode 100644 index dec8193..0000000 --- a/.agents/skills/embedded-captions/themes/aurora.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "aurora", - "voice": "polar-night elegance — the sky is alive and every caption is woven light. Two huge aurora blobs drift the top of frame all clip; body words are silk serif ink whose rose→teal→violet sheen drifts continuously through the letters (emphasis words get one bright highlight sweep), lines share two coexisting rows like a woven couplet and dissolve UPWARD into drifting light streaks. The apex is a SILK RIBBON: the hero word is hand-WRITTEN into the sky behind the subject stroke by stroke (single-line script font, blurred halo + bright core, a light mote riding the pen) — and the signature: the aurora gradient keeps FLOWING through the drawn ribbon during the hold while a soft spill tints the sky and light motes rise past the subject. Gentle — no shake.", - "when": "dreamy / romantic / wonder content, night-sky and travel pieces, poetry, weddings, elegant brand films, '极光/丝带/优雅手写字幕' asks — anything that should feel written by light rather than printed. Soft register; the apex scrim + dark understroke carry contrast on bright skies.", - "register": "elegant", - "fonts": { "body": "Cormorant Garamond", "strokeFont": "HersheyScript1.svg" }, - "palette": { - "body": "#F2EFF7", - "rose": "#FF9EC4", - "accent": "#7FE0D4", - "violet": "#B9A8FF", - "deep": "#070C24" - }, - "body": { - "paradigm": "sheenrail", - "layer": "fg", - "fontPx": 48, - "bottomPx": 76, - "rowDy": 58, - "band": { "w": 860, "h": 170 }, - "streaks": 4, - "seed": 20260611, - "yield": { "dim": 0.5, "pre": 0.16, "post": 0.62 } - }, - "hero": { - "setpiece": "silkribbon", - "layer": "bg", - "params": { - "targetWidth": 880, - "window": 0.68, - "haloWidth": 18, - "coreWidth": 6, - "wash": 0.12, - "deepen": 0.2, - "spill": 0.3 - } - }, - "fx": { "silkmotes": 6, "seed": 20260612 }, - "plate": { "scrim": 0.72, "pushIn": 0.012, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/biolume.json b/.agents/skills/embedded-captions/themes/biolume.json deleted file mode 100644 index d4a6079..0000000 --- a/.agents/skills/embedded-captions/themes/biolume.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "biolume", - "voice": "deep-sea bioluminescence — the clip sinks into an abyss grade with a breathing vignette and every caption is a living light. Body words GLOW ON like jellyfish (2-frame opacity + radial bloom from center while a cyan glow breathes in), emphasis words pulse a slow double-beat (propulsion), lines float on a gentle drift across two coexisting rows and SINK away dimming; seeded plankton motes drift the open water and the ones ringing the apex get pulled into the bloom. The apex is a bioluminescent BLOOM behind the subject: a creature pre-glow double-beats and crushes to a point, the word condenses in, six luminous tendrils draw outward like filaments while caustics shimmer and cyan light spills onto the scene — then all the light sinks back into the deep.", - "when": "ocean / nature / science-wonder docs, dreamy or meditative monologues, slow night-time reveals, 'underwater / 深海 / 发光水母' asks — anything that should feel alive and submerged rather than printed. Soft register; the abyss grade + pocket scrim make their own contrast on bright scenes.", - "register": "dreamy", - "fonts": { "body": "Fredoka", "hero": "Fredoka", "tag": "Fredoka" }, - "palette": { - "body": "#E9FFFA", - "accent": "#6DF2E0", - "violet": "#9D7BFF", - "ice": "#8FE8FF", - "core": "#F2FFFD", - "em": "#F4FFFD", - "mote": "#96F5E8", - "spore": "#BDFFF4" - }, - "body": { - "paradigm": "planktonrail", - "layer": "fg", - "fontPx": 44, - "bottomPx": 70, - "rowDy": 58, - "motes": { "count": 12, "near": 5, "seed": 2929 }, - "yield": { "dim": 0.55, "pre": 0.17, "enter": 0.8, "post": 0.63 } - }, - "hero": { - "setpiece": "biobloom", - "layer": "bg", - "fontPx": 120, - "params": { "crush": 0.11, "drift": -30, "mood": 0.92 } - }, - "fx": { "sporeburst": 7, "seed": 2930 }, - "plate": { "scrim": 0.55, "pushIn": 0.012, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/brush.json b/.agents/skills/embedded-captions/themes/brush.json deleted file mode 100644 index d5ea0d9..0000000 --- a/.agents/skills/embedded-captions/themes/brush.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "brush", - "voice": "sumi-e study — the lower third is a washi paper band (deckle-edged under-sheets, warm translucent sheet) where every word is brush-WIPED on behind a traveling brush-head shadow in a Mincho serif, seeded ±1° tilt; emphasis words get a double curved ink underline drawn beneath, and spent lines are wiped OFF right-to-left like a wet cloth. At the apex a warm paper wash charges behind the subject and the hero word is written in ONE violent calligraphic gesture — a pressure-tapered wet brush (four stacked stroke widths) slapping down on a start-splat, spattering droplets at the sharpest curves, ink flecks kicking past the subject — then the ink BLEEDS into the paper through the hold and a vermilion SEAL chop stamps the work with the plate punch.", - "when": "calm-authority explainers, craft / design / philosophy / Japan-adjacent content, tea-ceremony-paced brand films, meditation and writing channels — anything that wants ink-and-paper elegance with one violent flourish. The dark ink needs a mid/bright scene band (the paper wash supplies its own ground on bright skies).", - "register": "contemplative-elegant", - "fonts": { - "body": "Shippori Mincho", - "seal": "Shippori Mincho", - "strokeFont": "HersheyScript1.svg" - }, - "palette": { - "ink": "#19120b", - "nib": "#1a130c", - "body": "#221a12", - "ulInk": "#2a1c12", - "bh": "#281e14", - "paperHi": "#efe8d7", - "paperLo": "#e7dfcb", - "sheetHi": "#f5efe2", - "sheetLo": "#ece4d2", - "wash": "#f6f0e2", - "wash2": "#f4edde", - "seal": "#d24a32", - "sealMid": "#c03422", - "sealLo": "#a92a1a", - "sealText": "#f7efe2", - "accent": "#c03422" - }, - "body": { - "paradigm": "brushrail", - "layer": "fg", - "fontPx": 44, - "weight": 600, - "strip": { "w": 820, "h": 90, "bottomPx": 61 }, - "maxHold": 0.78, - "seed": 20260611, - "yield": { "dim": 0.55, "pre": 0.16, "post": 0.46 } - }, - "hero": { - "setpiece": "brushwrite", - "layer": "bg", - "params": { - "targetWidth": 760, - "window": 0.45, - "bleedWidth": 16, - "fatWidth": 18, - "midWidth": 10, - "coreWidth": 5, - "spatterN": 6, - "wash": 0.34, - "washSettle": 0.27, - "washH": 420, - "bleed": 0.38, - "breatheHz": 0.55, - "sealGlyph": "観", - "sealDelay": 0.04, - "sealSize": 64, - "seed": 380611 - } - }, - "fx": { "brushflecks": 6, "seed": 20260611 }, - "plate": { - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.49, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/chalkboard.json b/.agents/skills/embedded-captions/themes/chalkboard.json deleted file mode 100644 index 9b9d509..0000000 --- a/.agents/skills/embedded-captions/themes/chalkboard.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "chalkboard", - "voice": "night lecture — the lower third is a worn deep-green chalk band where every word is SCRIBBLED in fast chalk (2-frame pop + scribble reveal + dust puff, seeded crooked), emphasis gets double underline dashes and the final word lands in yellow chalk; between sentences an ERASER SWIPE smears the old words off and leaves ghost smudges. At the apex the band grows into a full blackboard behind the subject and the hero word is HAND-WRITTEN 130px tall in chalk stroke by stroke (jittered nib, dust falling from the pen), finished with a hand-slap dust clap and two violent underlines, then the halo breathes.", - "when": "education/explainers, science and lecture content, teacher channels, documentary asides, 'professor energy' brand spots. Reads as handwriting, so it suits thoughtful pacing; the deep-green board supplies its own contrast on bright scenes.", - "register": "scholarly-warm", - "fonts": { "body": "Caveat", "tag": "Caveat", "strokeFont": "HersheyScript1.svg" }, - "palette": { - "body": "#f3f6ee", - "em": "#f3d96b", - "accent": "#fbf9ef", - "chalk": "#fbf9ef", - "dust": "#f6f4e9", - "board": "#1d3328", - "boardHi": "#22392c", - "boardLo": "#182b22", - "bandHi": "#23392d", - "bandLo": "#16271f", - "rim": "#8a6a48", - "rimLo": "#5f452c" - }, - "body": { - "paradigm": "chalkrail", - "layer": "fg", - "fontPx": 52, - "strip": { "w": 1200, "h": 148, "bottomPx": 0 }, - "rows": [26, 82], - "tag": "OBSERVATORY — NIGHT LECTURE · wk 07", - "seed": 13, - "eraseDelay": 0.23, - "yield": { "dim": 0.55, "pre": 0.07, "post": 0.41 } - }, - "hero": { - "setpiece": "chalkwrite", - "layer": "bg", - "params": { - "targetWidth": 860, - "window": 0.78, - "coreWidth": 7, - "haloWidth": 14, - "halo": 0.18, - "dustN": 8, - "seed": 7, - "jitterSeed": 21, - "dim": 0.22, - "vig": 0.35, - "boardGap": 0.554 - } - }, - "fx": { "chalkclap": 12, "seed": 13 }, - "plate": { "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/dossier.json b/.agents/skills/embedded-captions/themes/dossier.json deleted file mode 100644 index 7ccecf4..0000000 --- a/.agents/skills/embedded-captions/themes/dossier.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "dossier", - "voice": "cold-war case file — the clip is typed onto a manila transcript strip (carbon Special Elite hammered in char by char on seeded baselines, red ink circles around the evidence), and the verdict lands as a RUBBER STAMP behind the subject: the footage goes sepia-archival, the stamp crushes in at -8°, double-strike ghost, thin-ink patches, then holds DEAD STILL — sold only by a breathing paper indent — until the page is filed away with a mechanical yank.", - "when": "investigations, exposés, true-crime, document-driven storytelling, 'the record shows' narration, declassified/archival framing. Works on any luma (the manila strip is self-lit; the stamp brings its own sepia charge).", - "register": "archival-noir", - "fonts": { "body": "Special Elite", "hero": "Special Elite", "tag": "Special Elite" }, - "palette": { - "body": "#2b2722", - "accent": "#b3271e", - "paper": "#d8c49a", - "ink": "#8a6f3f", - "fleck": "#8e1f17" - }, - "body": { - "paradigm": "carbonstrip", - "layer": "fg", - "fontPx": 40, - "strip": { "w": 764, "h": 132, "bottomPx": 4 }, - "rows": [36, 82], - "header": "CASE N°018 — TRANSCRIPT OF RECORDING", - "watermark": "CONFIDENTIAL", - "seed": 180618, - "yield": { "dim": 0.55, "pre": 0.02, "post": 0.41 } - }, - "hero": { - "setpiece": "rubberstamp", - "layer": "bg", - "fontPx": 120, - "params": { - "crush": 0.074, - "hold": 2.02, - "rotation": -8, - "paperRot": 2.4, - "sepia": 0.14, - "patches": [ - [27, 36, 0.72], - [71, 68, 0.57] - ] - } - }, - "fx": { "inkflecks": 12, "seed": 180618 }, - "plate": { - "charge": 0.32, - "dim": 0.26, - "punch": 0.04, - "punchOffset": 0.074, - "punchDecay": 9, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/graffiti.json b/.agents/skills/embedded-captions/themes/graffiti.json deleted file mode 100644 index 8422739..0000000 --- a/.agents/skills/embedded-captions/themes/graffiti.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "graffiti", - "voice": "street bombing run — the lower third is a marker rail where words FLICK on crooked like fast handstyles (1-frame squeak skew, seeded rotation, back.out settle); emphasis words take alternating paint colors (yellow/magenta) with a spray-underline swoosh + overspray dots, spent lines are ROLLER-BUFFED away by a gray paint roller whose wet smear lingers, and the final word lands BIG in yellow with the punch. At the apex a writer steps up behind the subject: the dusk wall dims, the can RATTLES, and the hero word is spray-TAGGED stroke by stroke in fat yellow paint (dark under-stroke armor + soft overspray halo + glowing nib), drips grow from the low points through the hold and a magenta paint splat pops at the pen-finish.", - "when": "street culture, hip-hop / rap, sneaker and fashion drops, urban sports, skate/BMX, rebellious brand spots — anything that wants real handstyle energy. Loud register; the dark under-stroke armors the tag against bright skies.", - "register": "loud-street", - "fonts": { - "body": "Permanent Marker", - "tag": "Permanent Marker", - "strokeFont": "HersheyScript1.svg" - }, - "palette": { - "body": "#f7f2e7", - "accent": "#ffd23f", - "em": "#ffd23f", - "em2": "#ff2e88", - "under": "#241008", - "nib": "#fff6d9", - "dripMid": "#eab928", - "dripLo": "#d8a51d", - "rollerHi": "#8d8a86", - "rollerLo": "#6f6c69", - "roller": "#807d79" - }, - "body": { - "paradigm": "markerrail", - "layer": "fg", - "fontPx": 46, - "bottomPx": 98, - "seed": 20260611, - "yield": { "dim": 0.5, "pre": 0.04, "post": 0.17 } - }, - "hero": { - "setpiece": "spraytag", - "layer": "bg", - "params": { - "targetWidth": 1000, - "window": 0.58, - "underWidth": 21, - "haloWidth": 36, - "coreWidth": 13, - "haloOpacity": 0.5, - "osprayN": 6, - "drips": 3, - "seed": 140987, - "dim": 0.22, - "scrim": 0.62 - } - }, - "fx": { "paintsplat": 6, "seed": 20260611 }, - "plate": { - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.63, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/hologram.json b/.agents/skills/embedded-captions/themes/hologram.json deleted file mode 100644 index 67d3313..0000000 --- a/.agents/skills/embedded-captions/themes/hologram.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "hologram", - "voice": "volumetric projection — every caption is LIGHT cast from an emitter. The body rail is a scanlined projection plate fed by a desk cone; words boot with a rising sweep + 1-frame interference glitch + chromatic fringe, emphasis words drop out for 2 frames and restore brighter, lines drift in rotationY and exit with the projector cut (collapse to a slit, then a dot). The apex is the full volumetric boot: emitter dot pop, cone snap, seed beam, 7-layer hologram word with climbing interference bands; a hand passes through it before the projector cuts it to the base dot.", - "when": "tech / sci-fi / AI / product-reveal explainers, futuristic UI talk, space and imaging content — anything that should feel projected rather than printed. Sleek register. Needs a lower frame edge for the emitter dots; the apex scrim makes its own contrast on bright scenes.", - "register": "sleek", - "fonts": { "body": "Orbitron", "hero": "Orbitron", "tag": "Orbitron" }, - "palette": { - "body": "#C7F1FF", - "accent": "#7AE8FF", - "magenta": "#FF5FD6", - "glow": "#3ECCF2", - "core": "#EAFBFF", - "em": "#F4FEFF", - "glowEm": "#A0F2FF", - "band": "#D8FAFF", - "dot": "#BFF0FF", - "dotHot": "#DFF8FF" - }, - "body": { - "paradigm": "holorail", - "layer": "fg", - "fontPx": 38, - "bottomPx": 108, - "plateW": 980, - "plateH": 96, - "lineDy": 9, - "letterSpacing": "0.02em", - "tag": "VOLUMETRIC FEED // CH-07", - "emphDelay": 0.34, - "yield": { "dim": 0.5, "pre": 0.18, "post": 0.37 } - }, - "hero": { - "setpiece": "holoboot", - "layer": "bg", - "fontPx": 118, - "params": { "passAt": 1.29, "coneW": 800 } - }, - "fx": { "holoflash": 0.5 }, - "plate": { "scrim": 0.58, "charge": 0.28, "dim": 0.18, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/inkwater.json b/.agents/skills/embedded-captions/themes/inkwater.json deleted file mode 100644 index 69dbafc..0000000 --- a/.agents/skills/embedded-captions/themes/inkwater.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "inkwater", - "voice": "sumi ink dropped in still water — the scene offers paper-white radial washes to the text zones, then Mincho-serif ink words BLEED into a lower-third of three fixed reading rows (blur + scale carry the bleed over a paper-glow halo, a dark blurred halo overshoots and tightens, an ink-settling hairline draws under each line, emphasis words shed a curling ink wisp) and spent lines re-dissolve upward like ink dispersing. At the apex a dark drop falls into the frame, hits an invisible water surface at the word point and BLOOMS — three stacked blurred ink ellipses at different rates, two thin ripple rings — and the hero words resolve out of the blob (blur 16→0) on their own spoken times while the world stills under a gentle vignette; through the hold the glyph edges breathe and the ink finally re-dissolves before the next thought needs the reader.", - "when": "contemplative, literary or scientific-wonder narration, astronomy / nature / memory / essay films, poetry and slow-craft channels — anything spoken quietly that wants one liquid, meditative event instead of an impact. Dark ink needs a mid/bright scene band (the paper washes supply their own ground on bright skies).", - "register": "contemplative-still", - "fonts": { "body": "Shippori Mincho", "hero": "Shippori Mincho" }, - "palette": { - "body": "#14110e", - "ink": "#14110e", - "paper": "#fffaee", - "paper2": "#fff8e8", - "wash": "#fff9ee", - "washApex": "#fffaf0", - "accent": "#14110e" - }, - "body": { - "paradigm": "inkrail", - "layer": "fg", - "fontPx": 46, - "weight": 400, - "letterSpacing": "0.055em", - "rowGap": 56, - "bottomPx": 36, - "yield": { "dim": 0.5, "delay": 0.12, "post": 1.07 } - }, - "hero": { - "setpiece": "inkbloom", - "layer": "bg", - "fontPx": 132, - "params": { - "fall": 0.15, - "maxHold": 1.75, - "clearGap": 0.24, - "vig": 0.34, - "washRailW": 1180, - "washRailH": 300, - "washApexH": 430 - } - }, - "fx": {}, - "plate": { "pushIn": 0.012, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/laser.json b/.agents/skills/embedded-captions/themes/laser.json deleted file mode 100644 index 1df1583..0000000 --- a/.agents/skills/embedded-captions/themes/laser.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "laser", - "voice": "concert laser rig — the room goes to blackout and the light operator types the transcript. Every body word is IGNITED where two thin beams (green from the top-left, magenta from the top-right) converge on it two frames early: flare pop, snap-on in laser green, single strobe on emphasis; a sweeper beam carries each line away. The apex is the drop: a 6-beam array sweeps to one hot point, the word ignites behind the subject in an additive glow stack with two controlled strobe pops, a criss-cross beam cage draws itself around it, then the array fans out slow and wide during the hold before the beams sweep everything off L→R.", - "when": "music, nightlife, festivals, drops, hype reveals, tech keynote 'one more thing' beats — anything that should read as a light show. Loud register; the concert blackout makes its own contrast on any plate (bright skies included).", - "register": "loud", - "fonts": { "body": "Audiowide", "hero": "Audiowide", "tag": "Audiowide" }, - "palette": { - "body": "#58ff9d", - "accent": "#58ff9d", - "magenta": "#ff4df0", - "core": "#eefff5", - "glowSoft": "#c9ffe2" - }, - "body": { - "paradigm": "laserrail", - "layer": "fg", - "fontPx": 40, - "bottomPx": 98, - "letterSpacing": "0.02em", - "wordGapEm": 0.24, - "textTransform": "uppercase", - "minorScale": 1.325, - "yield": { "dim": 0.5, "beamDim": 0.55, "pre": 0.04, "post": 0.9 } - }, - "hero": { - "setpiece": "lasercage", - "layer": "bg", - "fontPx": 100, - "params": {} - }, - "fx": { "laserflash": 0.85 }, - "plate": { - "charge": 0.46, - "dim": 0.3, - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.07, - "shakeAmpX": 5, - "shakeAmpY": 4, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.5, - "grain": 5 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/lastpage.json b/.agents/skills/embedded-captions/themes/lastpage.json deleted file mode 100644 index 45be4ee..0000000 --- a/.agents/skills/embedded-captions/themes/lastpage.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "lastpage", - "voice": "the speaker reads from a manuscript that already exists \u2014 a blurred future-transcript haunts the room all video; one rack-focus reveals every faint line was the apex word. The future was only ever one sentence.", - "when": "visionary thesis, prophecy-toned founder talks, trailers, literary content. Mid/dark scenes (the field needs air).", - "register": "literary-prophetic", - "fonts": { - "body": "Cormorant Garamond" - }, - "palette": { - "body": "#F0E9D8" - }, - "body": { - "paradigm": "lastpage", - "layer": "bg", - "fontPx": 44, - "bottomPx": 96, - "fieldCount": 9, - "fieldBlur": 9, - "seed": 4242 - }, - "hero": { - "setpiece": "rackfocus", - "inline": true, - "params": {}, - "maxHold": 0 - }, - "fx": {}, - "plate": { - "pushIn": 0.012, - "grain": 6 - }, - "linkages": ["field-is-the-apex"] -} diff --git a/.agents/skills/embedded-captions/themes/neonsign.json b/.agents/skills/embedded-captions/themes/neonsign.json deleted file mode 100644 index 9093860..0000000 --- a/.agents/skills/embedded-captions/themes/neonsign.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "neonsign", - "voice": "sign district at dusk \u2014 body lines are warm tube light flicking on word by word and dying like power cuts; the apex is a hand-bent neon tube WRITTEN onto the scene stroke by stroke (single-line font draw-on), then it hums.", - "when": "lifestyle, night/dusk scenes, music, fashion, mood pieces. Needs a darker or dusk backdrop for the glow to read; rose accent loves cool/dusk palettes.", - "register": "creator-warm", - "fonts": { - "body": "Space Grotesk", - "strokeFont": "HersheyScript1.svg" - }, - "palette": { - "body": "#ffe9d6", - "accent": "#ff3fae", - "em": "#ff9ed2" - }, - "body": { - "paradigm": "rail", - "layer": "fg", - "fontPx": 46, - "bottomPx": 98, - "letterSpacing": "0.02em", - "entrance": "flick", - "exit": "powercut", - "emScale": 1.18, - "rule": { - "width": 560, - "color": "#ff9ed2" - }, - "glow": "0 0 7px rgba(255,214,170,0.65), 0 0 22px rgba(255,180,120,0.35), 0 2px 10px rgba(0,0,0,0.55)" - }, - "hero": { - "setpiece": "drawon", - "layer": "bg", - "x": 560, - "y": 200, - "params": { - "targetWidth": 640, - "window": 0.78, - "tubeWidth": 7, - "haloWidth": 22, - "hum": true, - "buzzDipAt": -0.18, - "rotate": -3, - "spill": 0.38 - }, - "maxHold": 0 - }, - "fx": {}, - "plate": { - "pushIn": 0.012, - "grain": 5 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/ordnance.json b/.agents/skills/embedded-captions/themes/ordnance.json deleted file mode 100644 index 6491180..0000000 --- a/.agents/skills/embedded-captions/themes/ordnance.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "ordnance", - "voice": "military marking system — everything has mass. Body words STAMP in and cool from hot amber to bone; the apex is a sliced stencil stamp that detonates: sheared slices snap into register, paint cools, positioning bars + designation tag deploy, the room reacts.", - "when": "punchy announcements, hype, product drops, sports, anything that should hit. Loud register. Needs a scene that tolerates a charge-dim (any luma).", - "register": "loud", - "fonts": { "body": "Anton", "hero": "Anton", "tag": "Space Grotesk" }, - "palette": { "body": "#EDE6D8", "hot": "#FFB347", "accent": "#FFB347" }, - "body": { - "paradigm": "rail", - "layer": "fg", - "fontPx": 56, - "bottomPx": 102, - "letterSpacing": "0.03em", - "textTransform": "uppercase", - "entrance": "stamp", - "exit": "drop", - "minorScale": 1.4, - "yield": { "dim": 0.45, "pre": 0.2, "post": 0.9 } - }, - "hero": { - "setpiece": "detonation", - "layer": "bg", - "x": 640, - "y": 268, - "fontPx": 178, - "params": { - "slices": [ - [0, 61.5], - [40.5, 27.5], - [74.5, 0] - ], - "sliceShear": [-46, 52, -58], - "bars": true, - "barWidth": 760, - "barDy": 124, - "ticks": true, - "tag": "APEX-01" - } - }, - "fx": { "flash": 0.97, "rings": 2, "sparks": 26, "embers": 7, "seed": 20260611 }, - "plate": { - "charge": 0.5, - "dim": 0.32, - "punch": 0.045, - "punchDecay": 9, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/papercut.json b/.agents/skills/embedded-captions/themes/papercut.json deleted file mode 100644 index c704bdb..0000000 --- a/.agents/skills/embedded-captions/themes/papercut.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "papercut", - "voice": "stop-motion paper craft — the frame becomes an animator's table. Body words are cream paper chips PLACED one by one on a kraft strip (steps(2) drop, seeded crooked, handmade jitter weave, washi-tape slaps on emphasis, accent-red sign-off chip); the apex is a torn kraft mat slapped down behind the subject where torn-edge letter chips DROP with stepped gravity, land crooked, wobble at 8fps, then a table bump scatters them off-frame on the final word. A red paper star stands in for the hero word on the rail (rail↔climax hand-off).", - "when": "craft/DIY, kids and family content, indie product demos, behind-the-scenes, maker channels — anything warm and handmade that suits a 12fps stop-motion heartbeat. Playful register; needs a lower third that tolerates a kraft-paper strip.", - "register": "playful", - "fonts": { "body": "Inter", "hero": "Anton", "tag": "Caveat" }, - "palette": { - "body": "#2b241b", - "ink": "#2b241b", - "accent": "#ff4f3f", - "accentEdge": "#c93527", - "chip": "#f6edd8", - "chipEdge": "#cdb98e", - "paper": "#f8f0dd", - "paper2": "#efe3c6", - "tag": "#503d20" - }, - "body": { - "paradigm": "paperrail", - "layer": "fg", - "fontPx": 38, - "strip": { "w": 1140, "h": 88, "bottomPx": 26 }, - "tag": "cut & paste · 12 fps", - "tapeDelay": 0.25, - "seed": 150372, - "yield": { "dim": 0.6, "pre": 0.2, "post": 0.9 } - }, - "hero": { - "setpiece": "papermat", - "layer": "bg", - "fontPx": 130, - "params": { "step": 0.09, "seed": 151515, "vig": 0.3 } - }, - "fx": { "paperscraps": 3, "seed": 150372 }, - "plate": { "grain": 6 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/popup.json b/.agents/skills/embedded-captions/themes/popup.json deleted file mode 100644 index d8e1092..0000000 --- a/.agents/skills/embedded-captions/themes/popup.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "popup", - "voice": "a pop-up book opens inside the frame — body words POP UP on a baseline hinge (rotationX back.out, paper overshoot) along a cream page strip that unfolds from the bottom edge (center foldline, two reading rows); emphasis words land bigger with a contact squash the page FEELS, then flick-wobble with a paper strut leaning in behind. The apex is THE CENTERFOLD: blue + cream paper starbursts unfold behind the subject, the hero word pops up in three hinged segments, struts appear, backdrop + word wobble-settle together and breathe — then the whole spread folds flat (the book closing). A blue paper star holds the hero slot on the rail (rail↔climax hand-off); paper confetti flicks past the subject at the pop.", - "when": "kids and family content, storytelling, education, greeting-card and wholesome brand spots, picture-book or craft channels — anything warm, rounded and gentle that suits a paper toy theater. Playful register; needs a lower third that tolerates a cream paper strip.", - "register": "playful", - "fonts": { "body": "Baloo 2", "hero": "Baloo 2", "tag": "Baloo 2" }, - "palette": { - "body": "#33271a", - "ink": "#33271a", - "accent": "#6cb6e3", - "accentEdge": "#3f7fae", - "blue": "#2e7cb3", - "page": "#f7eed8", - "page2": "#f0e4c8", - "page3": "#e7d8b4", - "pageEdge": "rgba(122,96,54,0.55)", - "cream": "#f6ecd4", - "creamEdge": "#8a6f45", - "kraft1": "#a98f5e", - "kraft2": "#cdbb92", - "kraft3": "#e6d6af", - "strut1": "#4f93c4", - "strut2": "#6cb6e3", - "conf": ["#f6ecd4", "#6cb6e3", "#e3d2ac", "#f6ecd4", "#6cb6e3", "#33271a", "#f6ecd4", "#e3d2ac"] - }, - "body": { - "paradigm": "popuprail", - "layer": "fg", - "fontPx": 42, - "emPx": 52, - "strip": { "w": 1230, "h": 124 }, - "rowA": 70, - "rowB": 20, - "maxHold": 0.95, - "yield": { "dim": 0.55, "pre": 0.03, "post": 0.47 } - }, - "hero": { - "setpiece": "centerfold", - "layer": "bg", - "fontPx": 120, - "params": { "segs": 3, "segStagger": 0.07, "scrim": 0.42 } - }, - "fx": { "confetti": 8, "seed": 360372 }, - "plate": { "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/ransom.json b/.agents/skills/embedded-captions/themes/ransom.json deleted file mode 100644 index 5f70993..0000000 --- a/.agents/skills/embedded-captions/themes/ransom.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "ransom", - "voice": "kidnapper's collage — every word is a cutout chip clipped from a different page (cream Anton, black Inter, newsprint typewriter, accent-yellow marker) and PASTED crooked on the rail with torn edges and misaligned baselines; emphasis words get a 1-frame re-paste lift, spent chips are RIPPED off with paper-tear flashes. The apex: the sky darkens behind a collage scrim and the hero word slams in letter by letter as a ransom note — each letter a different chip, flight shadow popping tight on contact — then the whole word JOLTS as the last letter lands (the plate punches with it), looms crooked through the hold, and is torn off chip by chip.", - "when": "true crime, mystery / thriller content, heist energy, punk / DIY zine aesthetics, edgy product drops, unhinged-comedy hooks, \"勒索信/剪贴/拼贴字幕\" asks. Loud register; the solid chip backgrounds carry their own contrast on any scene.", - "register": "loud-collage", - "fonts": { - "body": "Anton", - "hero": "Anton", - "dark": "Inter", - "news": "Special Elite", - "accent": "Permanent Marker" - }, - "palette": { - "body": "#f5f1e4", - "paper": "#f5f1e4", - "paperInk": "#17130d", - "dark": "#141414", - "darkInk": "#f7f5ef", - "news": "#d8d3c5", - "newsInk": "#262017", - "accent": "#ffd23f", - "accentInk": "#1c160c", - "flash": "#fffdf2" - }, - "body": { - "paradigm": "ransomrail", - "layer": "fg", - "fontPx": 46, - "bottomPx": 56, - "letterSpacing": "0.02em", - "emphDelay": 0.23, - "seed": 3940, - "yield": { "dim": 0.5, "pre": 0.02, "post": 0.71 } - }, - "hero": { - "setpiece": "ransomnote", - "layer": "bg", - "fontPx": 130, - "params": { - "step": 0.06, - "crush": 0.09, - "ripStag": 0.045, - "ripLead": 0.19, - "scrim": 0.44, - "pulse": 0.2, - "seed": 3939 - } - }, - "fx": {}, - "plate": { - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.64, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/scoreboard.json b/.agents/skills/embedded-captions/themes/scoreboard.json deleted file mode 100644 index 3ac0800..0000000 --- a/.agents/skills/embedded-captions/themes/scoreboard.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "scoreboard", - "voice": "stadium split-flap departures board — every body word is a mechanical flap tile on a chyron bar that flip-cycles two seeded wrong words before clacking onto the real one (hot amber flash, cools to bone); a ROW counter flips at each line change and an odometer chip rolls beside the first emphasis line. The apex is a board takeover behind the subject: floodlights swing on, a giant departures housing clacks down, one huge flap tile per letter flip-cycles wrong glyphs then locks the word left→right under a crowd-flash, the status ticker types on, one tile re-flutters during the hold.", - "when": "sports, transit/travel, scores, countdowns, announcements and reveals — anything that should read as DEPARTURES-board mechanical. Loud register; needs a lower third that tolerates a dark chyron bar.", - "register": "loud", - "fonts": { "body": "Teko", "hero": "Anton", "tag": "Teko" }, - "palette": { - "body": "#F5EEDD", - "hot": "#FFB347", - "accent": "#FFB347", - "grey": "#B9BEC7", - "boardBone": "#F6EFDF" - }, - "body": { - "paradigm": "flaprail", - "layer": "fg", - "fontPx": 48, - "barH": 96, - "letterSpacing": "1px", - "seed": 808, - "chyron": { "tag": "DEPARTURES", "counter": "ROW" }, - "chip": { "label": "LIMIT", "value": "1.2", "unit": "PX", "x": 884, "y": 563 }, - "yield": { "dim": 0.55, "pre": 0.07, "post": 0.47 } - }, - "hero": { - "setpiece": "flapboard", - "layer": "bg", - "fontPx": 138, - "params": { - "seed": 8088, - "glyphs": "ABCDEFGHIKLMNOPRSTUVXYZ0123456789", - "lockWindow": 0.34, - "gap": 7, - "headerLeft": "★ DEPARTURES", - "headerRight": "GATE 06 22:40", - "tag": "STATUS // NOW BOARDING" - } - }, - "fx": { "crowdflash": [0.5, 0.45] }, - "plate": { - "charge": 0.62, - "dim": 0.34, - "punch": 0.045, - "punchDecay": 9, - "punchOffset": 0.34, - "shakeAmpX": 7, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 6 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/spectrum.json b/.agents/skills/embedded-captions/themes/spectrum.json deleted file mode 100644 index 796c721..0000000 --- a/.agents/skills/embedded-captions/themes/spectrum.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "spectrum", - "voice": "an oscilloscope is listening — a dark scope band hosts an always-alive waveform (speech grows it, silence flattens it, every word kicks a local burst) and body words are traced on in phosphor mono with a just-traced flash; the apex is the trace itself LEAPING off the scope to hand-write the hero word in a thin phosphor stroke, fill flicker, hum, then collapse to a flatline — and on the final word the whole trace explodes, flatlines to a single dot and stamps SIGNAL LOST.", - "when": "science / signal / audio / measurement / astronomy explainers, data-nerd content, retro-lab or synth aesthetics, \"示波器/波形/信号字幕\" asks. The band brings its own dark glass; bright scenes fine.", - "register": "tech-retro", - "fonts": { "body": "VT323", "tag": "VT323", "strokeFont": "HersheyScript1.svg" }, - "palette": { - "body": "#4dff88", - "accent": "#4dff88", - "bright": "#d6ffe4", - "flash": "#eafff2", - "em": "#ffb347", - "hud": "#2f8f55", - "panic": "#ff5f47" - }, - "body": { - "paradigm": "scoperail", - "layer": "fg", - "fontPx": 40, - "bandH": 164, - "waveTop": 80, - "waveH": 84, - "lineDy": 34, - "hudL": "SPECTRUM // CH1", - "siglost": "— SIGNAL LOST —", - "waveSeed": 7, - "chipSeed": 11, - "yield": { "dim": 0.52, "pre": 0.13, "post": 0.97 } - }, - "hero": { - "setpiece": "scopetrace", - "layer": "bg", - "params": { - "targetWidth": 720, - "window": 0.6, - "flickGap": 0.12, - "clearGap": 0.215, - "coreWidth": 4, - "haloWidth": 14, - "spill": 0.55 - } - }, - "fx": {}, - "plate": { "scrim": 0.62, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/stardust.json b/.agents/skills/embedded-captions/themes/stardust.json deleted file mode 100644 index 55777d4..0000000 --- a/.agents/skills/embedded-captions/themes/stardust.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "stardust", - "voice": "celestial condensation — letters condense out of drifting dust into an accumulating poem; the apex assembles from inbound star particles; on the final word the entire visible poem disperses back into dust (semantic exit).", - "when": "introspective, poetic, memory, science-wonder monologues. The poem column needs one clear side; a soft gradient scrim (behind the subject) handles bright skies.", - "register": "poetic", - "fonts": { "body": "Cormorant Garamond" }, - "palette": { "body": "#f7f0dd" }, - "body": { - "paradigm": "poem", - "layer": "fg", - "fontPx": 58, - "left": 84, - "stanzaTops": [110, 222, 292], - "entrance": "condense", - "exit": "drift", - "bigScale": 2.0, - "emScale": 1.38, - "scrim": { "side": "left", "opacity": 0.62 }, - "seed": 777 - }, - "hero": { - "setpiece": "assembly", - "inline": true, - "params": { "particles": 22, "spread": 150 } - }, - "fx": {}, - "plate": { "pushIn": 0.01, "grain": 5 }, - "linkages": ["disperse-on-last-word"] -} diff --git a/.agents/skills/embedded-captions/themes/stomp.json b/.agents/skills/embedded-captions/themes/stomp.json deleted file mode 100644 index cd8b37b..0000000 --- a/.agents/skills/embedded-captions/themes/stomp.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "stomp", - "voice": "full-frame typographic takeover — every beat is a hard-cut center card over a dimmed plate; a long-held card creeps with tension into a true VOID, then the apex detonates in the accent color; the final word dissolves to blur.", - "when": "hooks, manifestos, ads, hype openers. The plate runs dimmed throughout — content where the words ARE the show. Body stays bg (text behind the subject is the identity).", - "register": "takeover", - "fonts": { "body": "Anton" }, - "palette": { "body": "#F5F1E8", "accent": "#FF5C39" }, - "body": { - "paradigm": "takeover", - "layer": "bg", - "anchors": [ - [640, 330], - [612, 302], - [668, 358], - [640, 388], - [618, 336] - ], - "baseDim": 0.42, - "entrance": "cut", - "creepScale": 1.1, - "hotSnap": 1.18, - "sizes": { "function": 150, "content": 200, "minor": 230 } - }, - "hero": { - "setpiece": "colorflip", - "inline": true, - "fontPx": 196, - "params": { "crushFrom": 2.6, "dimKick": 0.62, "flash": 0.9, "dissolveLast": true } - }, - "fx": { "flash": 0.9 }, - "plate": { - "punch": 0.05, - "punchDecay": 9, - "shakeAmpX": 8, - "shakeAmpY": 5, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.6, - "grain": 7, - "minorPunch": 0.02 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/terminal.json b/.agents/skills/embedded-captions/themes/terminal.json deleted file mode 100644 index 7f6a1e1..0000000 --- a/.agents/skills/embedded-captions/themes/terminal.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "terminal", - "voice": "console session — the transcript is a signal log typed into a docked glass panel; the apex decodes out of noise as slot-machine glyph reels, and the log REDACTS the apex words (█████) until the decode locks. The feed corrupts on the final word.", - "when": "tech, data, AI, engineering, investigative explainers. Cool scenes preferred (the cyan is scene-motivated on cool/dusk palettes).", - "register": "creator-tech", - "fonts": { "body": "VT323", "hero": "Orbitron", "tag": "VT323" }, - "palette": { - "body": "#bfeefe", - "accent": "#66e0ff", - "magenta": "#ff5fd6", - "panelBg": "rgba(2,14,22,0.62)", - "prompt": "#4d7f93" - }, - "body": { - "paradigm": "panel", - "layer": "fg", - "fontPx": 34, - "panel": { "left": 36, "bottom": 30, "width": 470, "header": "SIGNAL LOG_" }, - "entrance": "type", - "exit": "hold", - "caret": true, - "yield": { "dim": 0.68 } - }, - "hero": { - "setpiece": "decode", - "layer": "bg", - "x": 660, - "y": 255, - "fontPx": 112, - "params": { - "glyphs": "X017#%/<>+=*KZR", - "brackets": true, - "lockStagger": 0.045, - "exit": "crt-off", - "seed": 99 - } - }, - "fx": { "scanband": true, "lockflash": 0.55 }, - "plate": { - "dim": 0.22, - "punch": 0.016, - "punchDecay": 10, - "shakeAmpX": 0, - "shakeAmpY": 0, - "rgbashift": 4, - "grain": 6 - }, - "linkages": ["redact-until-hero", "corrupt-on-last-word"] -} diff --git a/.agents/skills/embedded-captions/themes/thunder.json b/.agents/skills/embedded-captions/themes/thunder.json deleted file mode 100644 index 8779715..0000000 --- a/.agents/skills/embedded-captions/themes/thunder.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "thunder", - "voice": "the storm is the editor — slate storm mood on the room, ambient slanted rain in front of the subject, and the sky 'kisses' (1-frame brighten) on every body word. Body words arrive on a rain-scrimmed lower third with a lit-bright lightning pop; emphasis words get a sheet-lightning double flash mirrored by a double sky-kiss. The apex is THE STRIKE: a hand-authored branched bolt flashes two frames before the word, then the word slams in lit HARD with its shadow flipped toward the bolt, ozone under-glow breathing through the hold while the rain doubles; everything washes downward with the rain.", - "when": "dramatic reveals, storm/weather content, epic hype beats, trailer-toned monologues, anything that should land like a thunderclap. Loud register; the charge-dim + word scrim make their own contrast on any plate (bright skies included).", - "register": "loud", - "fonts": { "body": "Sora", "hero": "Anton", "tag": "Sora" }, - "palette": { - "body": "#EEF4FB", - "hero": "#F2F7FF", - "accent": "#9FD0FF", - "glow": "#CFE8FF", - "core": "#FFFFFF" - }, - "body": { - "paradigm": "stormrail", - "layer": "fg", - "fontPx": 44, - "bottomPx": 98, - "letterSpacing": "0.015em", - "rain": { "count": 18, "opacity": 0.08, "seed": 9021, "seed2": 4477 }, - "yield": { "dim": 0.5, "pre": 0.15, "post": 0.29 } - }, - "hero": { - "setpiece": "boltstrike", - "layer": "bg", - "fontPx": 145, - "params": { "mood": 0.1, "side": "left", "hold": 2.05 } - }, - "fx": { "strikeflash": 0.55 }, - "plate": { - "charge": 0.3, - "dim": 0.22, - "punch": 0.04, - "punchDecay": 9, - "punchOffset": 0.02, - "shakeAmpX": 5, - "shakeAmpY": 4, - "shakeHz": 12, - "shakeDecay": 7, - "shakeWindow": 0.5, - "grain": 5 - }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/transit.json b/.agents/skills/embedded-captions/themes/transit.json deleted file mode 100644 index 8f3bcdb..0000000 --- a/.agents/skills/embedded-captions/themes/transit.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "transit", - "voice": "amber LED departure board — the whole video is a station PA system. Body words light column-by-column (L→R LED wipe + 1-frame arrival flicker) on a docked departure strip whose lines page in/out by scroll-snap; furniture: green platform tag, ticking seconds clock, a ⚠ DELAYED → ● ON TIME swap gag after the apex. The apex is a board takeover behind the subject: a big LED panel expands upward inside a chasing marquee border, the word illuminates column-by-column under a PA flash + two brightness 'ding' pulses, glow breathes with LED dropouts, then the word pages up and the panel collapses.", - "when": "travel/transit, announcements, schedules, countdowns, retro-terminal or arcade registers — anything that should read as an amber dot-matrix station board. Mid-loud register; needs a lower third that tolerates a dark LED strip.", - "register": "loud", - "fonts": { "body": "VT323", "hero": "VT323", "tag": "VT323" }, - "palette": { - "body": "#FFB000", - "hot": "#FFE9B8", - "accent": "#FFB000", - "green": "#36E57A", - "warn": "#FF9E3D" - }, - "body": { - "paradigm": "ledboard", - "layer": "fg", - "fontPx": 46, - "letterSpacing": "0.05em", - "board": { "left": 140, "width": 1000, "h": 116, "bottom": 30 }, - "header": { - "plt": "PLT 4", - "clockPrefix": "19:42:0", - "statusWait": "⚠ DELAYED", - "statusOk": "● ON TIME" - }, - "yield": { "dim": 0.5, "pre": 0.2, "post": 0.9 } - }, - "hero": { - "setpiece": "ledwipe", - "layer": "bg", - "x": 620, - "y": 444, - "fontPx": 120, - "params": { - "panelW": 1080, - "wipeDur": 0.3, - "headerLeft": "NOW ARRIVING ▸ 19:42", - "headerRight": "GATE A4" - } - }, - "fx": { "paflash": 0.5 }, - "plate": { "charge": 0.5, "dim": 0.2, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/embedded-captions/themes/vhs.json b/.agents/skills/embedded-captions/themes/vhs.json deleted file mode 100644 index 188c21d..0000000 --- a/.agents/skills/embedded-captions/themes/vhs.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "vhs", - "voice": "camcorder tape playback — the whole frame is a VHS deck. A permanent lens vignette and OSD furniture (▶ PLAY, ● REC, green blinking timestamp) frame the clip; body words are an OSD lower third with a permanent 1px red+cyan misregistration fringe, arriving by tracking glitch (instant on + 2-frame y-shake + 1-frame band-slice shift) and exiting as REWIND streaks with flat-white echoes + scrub lines; the deck flips PLAY→REW in dead air. The apex is REC FREEZE: a 1-frame white tear band + head-switching noise bar, then the word slams in as a huge OSD readout behind the subject — three tracking-sliced bands shear in and SNAP into register, heavy red/cyan misregistration cools and keeps breathing through the hold under tape-weave jitter and an auto-iris pump, then the whole readout REWINDS off left.", - "when": "retro / nostalgia / found-footage / home-video registers, music and lifestyle edits, '90s tech content, '录像带/VHS/复古/DV' asks — anything that should read as a tape being played back. Mid-loud register; the backlight-comp scrim makes its own contrast on bright skies.", - "register": "retro-analog", - "fonts": { "body": "VT323", "hero": "VT323", "tag": "VT323" }, - "palette": { - "body": "#F2F2EE", - "hot": "#FFFFFF", - "accent": "#D9F7D2", - "red": "#FF2E2E", - "cyan": "#3FE8E8", - "green": "#B9FFB0" - }, - "body": { - "paradigm": "vhsrail", - "layer": "fg", - "fontPx": 44, - "bottomPx": 108, - "letterSpacing": "0.04em", - "osd": { "ts": ["JUN.11 2026 PM 7", "42"] }, - "yield": { "dim": 0.55, "pre": 0.02, "post": 0.9 } - }, - "hero": { - "setpiece": "vhsosd", - "layer": "bg", - "x": 640, - "y": 268, - "fontPx": 150, - "params": { - "bandClips": [ - [0, 64], - [36, 30], - [70, 0] - ], - "bandShear": [-46, 40, -34], - "misregIn": 11, - "misreg": 3, - "weave": [-2, 1, -1, 2, -1, 1, -2, 0], - "vignette": 0.34, - "crush": 0.1, - "hold": 1.69 - } - }, - "plate": { "charge": 0.55, "dim": 0.12, "grain": 5 }, - "linkages": [] -} diff --git a/.agents/skills/faceless-explainer/SKILL.md b/.agents/skills/faceless-explainer/SKILL.md deleted file mode 100644 index eeadfba..0000000 --- a/.agents/skills/faceless-explainer/SKILL.md +++ /dev/null @@ -1,241 +0,0 @@ ---- -name: faceless-explainer -description: "Turn arbitrary text — an article, notes, a topic, a brief — into a faceless explainer video: there is no site or footage to capture, so the visuals are invented per scene (typography, abstract graphics, diagrams, data-viz). Use for topic explainers, concept breakdowns, how-tos, listicles. Not a video built from a website (/product-launch-video — promo or tour). Unclear → /hyperframes." ---- - -**Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below. - -> **First, keep this skill fresh — confirm with the user before running:** `npx hyperframes skills update faceless-explainer`. A fast no-op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them. - -> **media-use**: Before sourcing audio/images/logos, call `/media-use` to resolve BGM/SFX/images from the HeyGen catalog and brand logos from their official sources. Run `--adopt` first to register existing assets. See `/media-use` skill. When the host app provides its own music or sound-effect tools, use those for music and sound effects. - -# Faceless Explainer to HyperFrames - -Use this skill to turn a body of text into an explainer video: pick a design system, plan a teaching story, and build it frame by frame in HyperFrames. **Faceless** means every visual is invented downstream — there is no capture step and no real asset inventory. - -> **The front door is `/hyperframes`.** You are the orchestrator. Run each step, verify its gate, and only then continue. This skill is for **explaining a topic from text, with no product and no website to capture**. Any other intent, a bare "make a video", or any uncertainty → read `/hyperframes` first — the intent layer owns every route decision, and a fresh creation arriving here without `BRIEF.md` goes through it anyway (Setup's opening rule). - -You are the orchestrator. Work in `videos//`. Run steps in order and pass each gate before continuing. User-gated steps are Step 0, Step 3, and Step 6. Read `../hyperframes/references/brief-contract.md` before Step 0 — it defines the gate types and how `BRIEF.md`'s `flow`/`storyboard` derive the mode that governs the Step 3/4/6 gates. Do every step yourself except Step 5, where you dispatch one sub-agent per frame. Do not put design or motion rules here; those live in the frame-worker sub-agent, this skill's local `../hyperframes-animation/rules/` + `../hyperframes-animation/blueprints/`, and `hyperframes-creative`. - -Workflow: Step 0 setup → `hyperframes.json`; Step 1 brief → `capture/extracted/`; Step 2 design system → `frame.md`; Step 3 storyboard/script → `STORYBOARD.md` and `SCRIPT.md`; Step 3.1 audio → `audio_meta.json`; Step 4 visual design → enriched `STORYBOARD.md`; Step 5 frames → `compositions/frames/NN-*.html` and `index.html`; Step 6 final render → `renders/video.mp4`. - ---- - -## Step 0: Setup - -Goal: Enter with a confirmed brief, create the HyperFrames project, and make the brief durable. - -**The brief is confirmed by the intent layer, not by questions asked here.** Opening rule, in order: **(1)** `BRIEF.md` exists → read it and ask nothing — the brief is settled, and its `flow`/`storyboard` derive the mode (brief contract § 1). **(2)** No `BRIEF.md` but the project exists (`hyperframes.json` / `STORYBOARD.md` on disk) → resume from the storyboard's frontmatter and the recorded preferences; never re-interrogate a half-built project. **(3)** Neither — a fresh creation request that arrived here directly → read `/hyperframes` and run its intent layer (`references/intent-interview.md`): it checks recipes and remembered defaults, conducts this route's questions (`../hyperframes/references/routes/faceless-explainer.md`), and hands back the locked brief. Edit requests skip all of this — go do the edit. - -Initialize only if `hyperframes.json` is missing. Name `` from the topic in kebab-case, such as `compound-interest-explained`; never use workspace name or timestamp. - -`npx hyperframes init "videos/" --non-interactive --example=blank --skill=faceless-explainer` — `init` checks the installed skills against the latest on GitHub and updates the global set if any are out of date. - -After init, let `` be `videos/` and run every subsequent relative-path command with that directory as its working directory. In the commands below, `.` means ``; never write `.media`, `capture`, or output files in the caller directory. - -**Write `BRIEF.md` immediately after init** (never before — `init` refuses a non-empty directory): the intent layer's locked brief, shape per `../hyperframes/references/brief-format.md`. Resolve `` as the installed `/media-use` skill directory. Then record each preference-backed answer with `node /scripts/prefs.mjs record --hyperframes .` (`brief-format.md` names the subset). If the intent layer adopted a recipe, run `node /scripts/recipe.mjs use --hyperframes . --name `; it copies its `frame.md` into the project (Step 2 is then skipped) and returns the skeletons Step 3 drafts from. A recipe fills answers, not approvals; the review gates still run. - -**Show sign-in status before proceeding past Setup** — run `npx hyperframes auth status` and relay its output verbatim. It reports whether voice/BGM will use HeyGen or local engines and, when signed out, how to sign in. Apply one branch: - -- **Collaborative:** wait for the user to sign in or explicitly choose `offline` / `go`. -- **Autonomous:** state the status and continue through the available local engines. - -Do not silently omit a required capability when no offline provider exists; surface the blocker. Do not fold this decision into another question or write keys into a per-repo `.env`. Auth ownership and offline fallbacks: `/media-use` `references/setup-providers.md` § Providers. - -**Gate:** `hyperframes.json` and `BRIEF.md` exist; the preference-backed answers were recorded (brief contract § 2); sign-in status was shown (signed in, or continuing offline). - ---- - -## Step 1: Brief (no capture) - -Goal: Fold the user's text into the project as the source of information. There is **no website capture and no real assets** — this is a faceless explainer. - -Save the user's full input verbatim, then create the synthetic capture package by hand: - -- `capture/extracted/visible-text.txt` — the full article / notes / topic / brief, verbatim. This is the source of **information**, not a story template (Step 3 reshapes it). -- `capture/extracted/tokens.json` — `{ "title": "", "description": "", "colors": [], "fonts": [] }`. Fill `title`/`description` from the brief. Leave `colors`/`fonts` empty unless the user explicitly gave brand colors or fonts — then add them (the design preset supplies a complete palette regardless). - -If the user pasted a script or wants their wording kept, save it verbatim as `user_script.txt`; `VO_MODE` (verbatim or restructured) comes from `BRIEF.md` — the intent layer asks it when a script arrives. Ask once here only if the brief somehow lacks it, and store the answer for Step 3. - -Do **not** run `npx hyperframes capture` (there is no URL). Do not create `asset-descriptions.md` or populate `capture/assets/` — faceless visuals are invented in Steps 4-5, not captured. The one exception: if the user supplied a real image, place it under `public/` and note it for Step 3. - -**Gate:** `capture/extracted/visible-text.txt` and `capture/extracted/tokens.json` exist; you can state the explainer's topic and audience in one clear sentence. - ---- - -## Step 2: Design System - -Goal: Choose one shipped frame preset; a script turns it into this video's `frame.md` + caption skin. - -When `BRIEF.md` names a `style_preset` — the user picked it by eye from the showcases at the intent layer — use it; the judgment call is yours only when the brief is silent. Then you make the one call — **which preset**: read `../hyperframes-creative/references/design-spec.md` and browse `../hyperframes-creative/frame-presets/`; pick the preset whose look best fits the topic, tone, and audience. Then run: - -```bash -node /scripts/build-frame.mjs --preset --hyperframes . -``` - -The script does the rest deterministically: copies the preset's `FRAME.md` → `frame.md` and **remixes** it onto any brand tokens in `capture/extracted/tokens.json` (brand colors mapped onto the preset's color keys by role; the preset's display + body fonts swapped for the brand's), copies the preset's caption skin to `.hyperframes/caption-skin.html`, and self-validates (exits 1 on a broken mapping). Proceed as soon as it exits 0 — no hand-editing of the spec. - -A faceless explainer usually has **no brand colors/fonts** (`tokens.json` colors/fonts empty) → the script keeps the preset's own palette, a complete shippable design. Only when the user named brand colors/fonts add them to `tokens.json` before running, and only adjust `frame.md` by hand afterward if a mapping truly needs it. - -**Gate:** `build-frame.mjs` exited 0 — `frame.md` exists from a named preset, and (when the preset ships one) `.hyperframes/caption-skin.html` exists as the caption skin source; the chosen preset was recorded as a preference (`--key style_preset --workflow `, brief contract § 2). - ---- - -## Step 3: Storyboard and Script - -Goal: Turn the text into an approved frame-by-frame teaching plan. - -Read `../hyperframes-creative/references/story-spine.md` (hook language, value-before-evidence, storyboard-as-proposal, source-traceable visuals), `references/story-design.md`, `../hyperframes-animation/blueprints-index.md`, `../hyperframes/references/storyboard-format.md`, and `../hyperframes/references/script-format.md`. Use them to write `STORYBOARD.md` and, when narration is needed, `SCRIPT.md`. Set the frontmatter `duration:` from the brief's `length` — a rough expectation; assembly reports where the cut lands against it. - -Use `story-design.md` for the explainer structure (concept / how-to / listicle / story), hook strategy, clarity techniques, emotional beats, the type-enum mapping, and `VO_MODE`. The video's sequence comes from **narrative design, not the input text's paragraph order** — reorder, merge, omit, compress. As a **soft guide**, consult the role→blueprint menu in `../hyperframes-animation/blueprints-index.md`: for each beat, write the voiceover in the shape its candidate blueprint implies and tag that candidate `blueprint:` id when one fits. Teaching truth still decides which beats exist — never force a beat to fit a blueprint, and never invent a beat just because a proven shape is available. Faceless visuals are invented downstream, so frames do **not** carry an asset inventory: leave `asset_candidates` empty unless the user supplied a real `public/` image. Use the exact required fields from the storyboard and script references. - -After drafting, run the review loop's plan pass — `../hyperframes/references/review-loop.md` § 1: present the plan as a proposal, and ask the two questions — approve or change, and **sketches first** (recommended) or skip. Feedback arrives as a chat reply; loop until approved. This is a **checkpoint gate** (brief contract § 1): in autonomous mode there is nothing to ask — post the same summary as a heads-up and proceed; sketches collapse into the build, and the final preview with its one question comes at Step 6. - -**Gate:** `STORYBOARD.md` exists, every frame has the required narrative fields, `SCRIPT.md` exists when narration is needed, and the user approved the frame-by-frame plan (autonomous: the summary was posted as a heads-up). - ---- - -## Step 3.1: Audio - -Goal: Generate narration, word timings, music, and audio metadata from the approved script. - -Start audio after Step 3 approval. Run it in the background, then continue to Step 4. (Sign-in status was already shown in Step 0; the engine falls back automatically.) - -**Choose the narration voice from the user's ask before invoking.** If the request named a voice, gender, or tone, pick a matching voice id and pass it with `--voice `. The pipeline default is otherwise **Marcia (female)** on HeyGen / `am_michael` on Kokoro — so a request like "a male voice" is silently ignored unless you pass the flag. Voice ids are provider-specific; resolve against whichever provider Step 0's sign-in status selected: **HeyGen** (signed in) via `node /audio/scripts/heygen-tts.mjs --list` (or `GET /v3/voices?engine=starfish`); **Kokoro** (offline) via the voice table in `/audio/references/tts.md` (prefixes `am_`/`bm_` male, `af_`/`bf_` female). When the user expressed no preference, fall back to the remembered voice (brief contract § 2) before the pipeline default, and say which one you used; omit `--voice` only when neither names one. When the user explicitly picked a voice this run, record it (`prefs.mjs record --key voice`). - -`node /scripts/audio.mjs --script ./SCRIPT.md --storyboard ./STORYBOARD.md --hyperframes . --out ./audio_meta.json --voice &` - -The audio script handles narration, word timings, BGM lookup from HeyGen's music library, and timing metadata. BGM mood comes from the storyboard's `music:` field. This uses the HeyGen Audio API for retrieval, not generation, and the same `~/.heygen` credential as TTS. For provider details, read `../media-use/audio/references/tts.md`. When the host app's own tools make the music or a sound effect, put the file under assets/ and list it in the audio_meta.json file marked `"source": "host"`: music as `bgm` `{ "path": "assets/…", "source": "host" }` with `music: none` in the storyboard; a sound as an `sfx` entry `{ "frame": , "file": "assets/…", "offset_s": 0, "duration_s": , "source": "host" }`. Every audio pass keeps these, and a frame with a host sound gets no looked-up cue. - -If there is no narration and no `SCRIPT.md`, skip voice generation. BGM may still run if the storyboard has a music mood. - -**The canonical fully-silent marker** (shared across the workflows that reuse this audio model): `music: none` in the STORYBOARD.md top YAML block, no `SCRIPT.md`, **and** no `sfx:` cues or host audio. That combination marks the project silent — no narration, no BGM, no SFX. `audio.mjs` recognizes it and generates nothing (it removes any stale `audio_meta.json`; an absent `audio_meta.json` is what assemble treats as silent), so this step is a clean skip. Without narration but with `sfx:` cues or host audio the film is not silent: `audio.mjs` writes the audio_meta.json file for `fetch-sfx` to fill. `music: none` with narration keeps TTS and turns only BGM off. Use exactly this spelling — don't improvise other markers. - -**Gate:** audio job has started, or the project is marked silent (`music: none`, no `SCRIPT.md`, no `sfx:` cues or host audio). - ---- - -## Step 4: Frame Visual Design - -Goal: Add the visual direction, layout intent, and motion choices to each storyboard frame. - -**Sketch the storyboard sheet first (collaborative only).** The moment the plan is approved, run the sketch pass — `../hyperframes/references/review-loop.md` § 2 (don't wait on Step 3.1; the stills don't use timings): pose every frame yourself in its composition, mount each in `index.html` at its planned start, snapshot all the stills in one run and write the board, `boards/storyboard.html` (`../hyperframes-creative/references/storyboard-recipe.md`), mark each `built`, pause for the one layout question when every frame is `built`, and revise only the frames named until the board is confirmed. Only then write the visual design below onto the confirmed layouts. In autonomous mode, or when the user chose to skip sketches at Step 3, skip this pass — frames go straight from `outline` to `animated` at Step 5. - -Edit `STORYBOARD.md` in place. Do not create another storyboard. Use `frame.md` as source of truth for color, type, layout feel, and style. - -Read `references/visual-design.md`, `../hyperframes-animation/blueprints-index.md`, `references/motion-language.md`, and `../hyperframes-animation/rules-index.md`. Use `visual-design.md` for the method (the time-coded shot sequence, the inline Layout vocabulary, and the invented-visual treatment), plus the required `## Video direction` block. Use `../hyperframes-animation/blueprints-index.md` to pick each frame's shot shape. Use `motion-language.md` (the motion vocabulary + the motion doctrine) and `../hyperframes-animation/rules-index.md` (valid rule names) for motion — do not invent motion names. - -**Search the live catalog before you invent any named look.** A faceless explainer invents every visual, which is exactly when a hand-authored rebuild of an existing block is most likely. For every look, effect, treatment or transition the brief names — "CRT scanlines", "glitch", "film grain", "shimmer sweep", "confetti burst" — run `npx hyperframes catalog --query "" --json` and read the top results BEFORE you write that look into `STORYBOARD.md`. The search needs **nothing installed**: no project, no prior `add`, no account. It ranks the whole hosted registry (~400 blocks and components) from any directory. A block that already does the job becomes the frame's `focal` — name it here; Step 5 pre-installs it once before dispatch and its worker customizes it. Invent a visual only after a search for it came back with nothing that fits. - -For every frame, write a **time-coded shot sequence** into `STORYBOARD.md` per `visual-design.md`'s method: pick the frame's blueprint (or compose), instantiate it with THIS frame's **invented** content, and pace each Scene's reveal to the voiceover so the frame develops across its full duration instead of front-loading then freezing. Because the explainer is faceless, `focal`/`roles` name the **invented visual elements** (a hero word, a diagram node, a data-viz series) — you are designing them, not selecting captured assets. State layout and motion **inline** per Scene (vocabularies in `visual-design.md` and `motion-language.md`). Add one video-wide `## Video direction` block. - -Do not change story, script, `transition_in`, or the source text. Do not write HTML in this step beyond the sketch pass's poses. There is **no asset-staging step** — faceless visuals are built by the workers in Step 5. If the user supplied a real `public/` image, reference it by path in the relevant frame's `focal`/`roles`; otherwise nothing to stage. - -**Gate:** every frame has a time-coded shot sequence whose reveals are paced to the voiceover (no front-loading); each frame names its invented `focal` and/or `roles`; `## Video direction` exists. Collaborative: the sketch sheet was confirmed. - ---- - -## Step 5: Build Frames - -Goal: Build every storyboard frame as an HTML composition and assemble the playable video. - -Wait for Step 3.1 audio to finish if audio was started. Then sync durations and fetch SFX; skip both if silent. - -`node /scripts/audio.mjs sync-durations --audio-meta ./audio_meta.json --storyboard ./STORYBOARD.md` - -`node /scripts/audio.mjs fetch-sfx --storyboard ./STORYBOARD.md --hyperframes .` - -Duration sync is mechanical: real voice duration wins; silent frames keep estimates; never hand-edit synced durations. - -**Pre-install the registry blocks** named across `STORYBOARD.md` once, before dispatch, so parallel workers don't race on the registry: - -`for b in ; do npx hyperframes add "$b"; done` - -Before dispatch, read `../hyperframes/references/subagent-dispatch.md`. Build the per-frame packets and the worker role payload: - -`node /scripts/frame-packets.mjs --project "$PROJECT_DIR" --storyboard "$PROJECT_DIR/STORYBOARD.md"` - -The builder writes one bounded packet per frame under `.hyperframes/frame-packets/` (the frame's exact storyboard block + the blueprint body + every cited rule recipe, inlined) and `_role.md` (`../hyperframes/references/frame-worker-core.md` + this skill's `sub-agents/frame-worker.md`, concatenated verbatim — the complete worker role). Dispatch one sub-agent per frame, in parallel if possible; otherwise run workers in waves. Each worker gets exactly one frame: its prompt carries `_role.md` and that frame's packet — paste both in full, or hand the two file paths for the worker to read first (equivalent; the worker starts from exactly those two documents either way) — plus a dispatch context with `PROJECT_DIR`, `frame_id`, whether the frame has a **confirmed sketch** on disk (the worker dresses that layout rather than redrawing it — frame-worker core § When a confirmed sketch exists), canvas size, and caption status + keep-out band if captions are enabled. - -Workers read only their packet and `frame.md`; they never open `STORYBOARD.md` or the skill documents (the packet inlines what was selected upstream). Each worker writes only `compositions/frames/NN-*.html`. Workers must never edit `STORYBOARD.md`. - -**Full-bleed backgrounds ride on a `class="clip"` layer, never the `#root`.** A frame's ground (color field / gradient / grid) is its own full-duration background clip — a `background` set on the `#root` / `data-composition-id` element is clip-gated to the frame's window and is not a dependable ground, so dark content can land on the black host `body` and render invisible. The video's base ground is painted by the assembler from `frame.md`'s `canvas` color onto the index `#root`. (Full rule + self-check: `../hyperframes/references/frame-worker-core.md`.) - -As each worker returns, the orchestrator marks that frame as `animated` in `STORYBOARD.md`. - -After audio timings exist, build captions in the background and assemble the index: - -`node /scripts/captions.mjs build --storyboard ./STORYBOARD.md --audio-meta ./audio_meta.json --hyperframes . --out ./caption_groups.json &` - -`node /scripts/assemble-index.mjs --storyboard ./STORYBOARD.md --hyperframes .` - -`captions.mjs` uses the project's `.hyperframes/caption-skin.html` (copied in Step 2) as the caption look, injecting brand tokens from `frame.md`; with no skin present it renders the built-in default pill. `captions: skipped ()` is valid. Continue without captions when explicitly skipped. - -**Gate:** every frame is marked `animated` (collaborative: the sketch sheet was confirmed at Step 4), `index.html` exists, and captions are built or explicitly skipped. - ---- - -## Step 6: Finalize - -Goal: Verify the assembled video, get user approval, and render the final MP4. - -Inject transitions, run checks, pause for review, then render. - -`node /scripts/transitions.mjs inject --storyboard ./STORYBOARD.md --hyperframes .` - -`node /scripts/transitions.mjs verify --storyboard ./STORYBOARD.md --index ./index.html` - -`npx hyperframes lint` - -`npx hyperframes check` - -`npx hyperframes snapshot --at ` - -`snapshot` stitches the captured frames into one contact sheet (`.hyperframes/artifacts/snapshots//contact-sheet.jpg`; the command prints the path). Glance at it; if nothing is obviously broken, move on — don't linger here. - -If a command fails, surface stderr and stop — don't pile on recovery commands. Fix it yourself: the cheapest safe edit to `compositions/frames/NN-*.html`, then rerun the failed check. - -**Known false-positive — do not chase it.** `check` may report a handful of `text_box_overflow` findings of ~1–4px on the **caption** highlight words (selector `#caption-word-*` / `.caption-line`). The caption pill uses a deliberately snug `line-height` (set once in `scripts/captions.mjs`) and has **no `overflow:hidden`**, so a heavy display glyph's ink spills a few px into the pill's own padding — nothing is actually clipped. Treat these as expected and proceed. Do **not** inflate the caption `line-height` (it balloons the pill, which is worse). Only act on a `text_box_overflow` when it names a **frame** element (`#el-NN-*`), not a caption word. - -After checks pass, pause for user review — the review loop's final look (`../hyperframes/references/review-loop.md` § 4): one question, on the final Studio preview — render now, or what changes? (Autonomous: the same, as the one kept question — open the preview even though the user didn't ask for one.) Then deliver the MP4 with the contact sheet and the frame ids so revisions can target a single frame. - -Preview: `npx hyperframes preview --background` - -Render only after user approval (autonomous mode: after the render-or-changes question): - -`npx hyperframes render --skill=faceless-explainer --quality high --output renders/video.mp4` - -Do not rerun `lint`, `check`, or `snapshot` after rendering unless the user asks. - -**Gate:** `lint` and `check` passed and the snapshots were inspected before render; user approved at the review pause (autonomous: checks passed and the delivery includes the contact sheet); `renders/video.mp4` exists. Final reply states MP4 path and final duration. - ---- - -## Quick Reference - -**Formats:** landscape `1920x1080`; portrait `1080x1920`; square `1080x1080` — derived from the destination (brief contract § 2). Set the format once in the storyboard frontmatter. - -**Faceless deltas vs a captured-asset workflow:** no Step 1 capture (synthetic `tokens.json` + `visible-text.txt`); no `asset-descriptions.md` and no `capture/assets/`; no asset-staging in Step 4; `asset_candidates` empty by default; every visual is invented by the Step 5 workers (typography / abstract graphics / diagrams / data-viz). A user-supplied `public/` image is the only real asset path. - -**Background scripts:** the workflow ships only these under `scripts/`: `build-frame` for adopting + brand-remixing a frame preset into `frame.md` (+ caption skin); `audio` for TTS, transcription, BGM, SFX, and duration syncing; `captions`; `transitions` for inject and verify; and `assemble-index`. Everything else is the `hyperframes` CLI. - -The reusable, domain-agnostic shot shapes live in `../hyperframes-animation/blueprints/` (indexed by `../hyperframes-animation/blueprints-index.md`). - -| Read | When | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `[../hyperframes/references/brief-contract.md](../hyperframes/references/brief-contract.md)` | Gate types, mode derivation from `BRIEF.md`, field semantics. | -| `[../hyperframes-creative/references/story-spine.md](../hyperframes-creative/references/story-spine.md)` | Step 3: story doctrine — hook language, value-before-evidence, proposal shape, source-traceable visuals. | -| `[../hyperframes-creative/frame-presets/](../hyperframes-creative/frame-presets/)` | Step 2: choose and adopt a frame preset. | -| `[../hyperframes-creative/references/design-spec.md](../hyperframes-creative/references/design-spec.md)` | Step 2: apply brand tokens correctly. | -| `[references/story-design.md](references/story-design.md)` | Step 3: plan the explainer story. | -| `[../hyperframes-animation/blueprints-index.md](../hyperframes-animation/blueprints-index.md)` | Step 3: role→blueprint menu. Step 4: pick the shot shape. | -| `[../hyperframes/references/storyboard-format.md](../hyperframes/references/storyboard-format.md)` | Step 3: write `STORYBOARD.md`. | -| `[../hyperframes/references/script-format.md](../hyperframes/references/script-format.md)` | Step 3: write `SCRIPT.md`. | -| `[../media-use/audio/references/tts.md](../media-use/audio/references/tts.md)` | Step 3.1: choose or understand TTS providers and voices. | -| `[references/visual-design.md](references/visual-design.md)` | Step 4: write the frame's shot sequence (+ Layout vocabulary). | -| `[references/motion-language.md](references/motion-language.md)` | Step 4: the motion vocabulary + the motion doctrine. | -| `[references/cut-catalog.md](references/cut-catalog.md)` | Step 4-5: the cut catalog (worker builds within-frame seams). | -| `[../hyperframes-animation/rules-index.md](../hyperframes-animation/rules-index.md)` + `[../hyperframes-animation/rules/](../hyperframes-animation/rules/)` | Step 5: local rule recipe bodies for the cited motions. | -| `[../hyperframes/references/frame-worker-core.md](../hyperframes/references/frame-worker-core.md)` | Step 5: the shared worker contract (packet builder prepends it to the delta). | -| `[sub-agents/frame-worker.md](sub-agents/frame-worker.md)` | Step 5: the workflow's frame-worker delta. | -| `[../hyperframes/references/subagent-dispatch.md](../hyperframes/references/subagent-dispatch.md)` | Step 5: dispatch sub-agents safely. | diff --git a/.agents/skills/faceless-explainer/references/cut-catalog.md b/.agents/skills/faceless-explainer/references/cut-catalog.md deleted file mode 100644 index 10dd441..0000000 --- a/.agents/skills/faceless-explainer/references/cut-catalog.md +++ /dev/null @@ -1,215 +0,0 @@ -# Cut catalog — within-frame seams (worker-built) - -> **A worker build-recipe (Step 5) — the sibling of `../../hyperframes-animation/rules/`, not a second motion doc.** These are within-frame cuts the **frame worker builds INSIDE its own composition** (Z-scale + blur + opacity tweens, or per-word x-staggers, all on the frame's own paused GSAP timeline). They are **not** the between-frame transition: story owns that via `transition_in`, which the harness's injector stamps from a **separate registry vocabulary** (`crossfade` / `blur-crossfade` / `push-slide` / `zoom-through` / `squeeze`) — the catalog names here (**cut-the-curve / inverse-zoom / waterfall**) are **not** valid `transition_in` values. Use this catalog when a frame's shot sequence has an internal seam — a within-scene text/element swap, a **Scene-to-Scene** cut (a `Scene` is a time window WITHIN one frame, **not** a frame-to-frame boundary), or a text-to-text line change — and you want it to read as one continuous move instead of a hard slideshow cut. (`zoom-through` lives in both worlds: a whole-frame wrapper transition in the registry, an element-level Z-cut here — same idea, different scope.) - -Four techniques that create depth and continuity: - -1. **Zoom-Through** — within-scene text swaps, Z-axis, moving TOWARD the viewer -2. **Inverse Zoom-Through** — Z-axis swaps moving AWAY from the viewer -3. **Cut the Curve** — between-scene transitions on x/y -4. **Waterfall Cut** — word-by-word cut-the-curve with staggered exits and entries - -All four are the same underlying principle: **cut at peak velocity, match direction and -speed on both sides of the cut.** The differences are axis, scope, and granularity. - -**Choosing which at a seam:** for an UNFINISHED phrase (building one larger idea across -several visually distinct scenes that still approach the same point — multi-line text, a -run of consecutive cards) use **cut-the-curve** / **waterfall**. For a STATE CHANGE (turning -to a NEW part of the video — most often hook → context, between two distinct chapters) use -**zoom-through**, and **inverse zoom-through** for an arrival / payoff beat. Chain these so -the frame's internal seams feel like one camera moving through the content. - ---- - -## Blur Logic (applies to all Z-axis variants) - -Blur sells the speed at the cut, but it must scale with the SUBJECT SIZE: - -| Subject | Peak blur | Why | -| ------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Text-scale (headline, line, word group) | **10px** | At 20px text smears into illegibility — the eye loses the word it was tracking and the cut reads as a glitch, not speed. At 20px letterforms go mushy mid-cut; 10px keeps them readable. | -| Full-frame surface (terminal window, card, screenshot) | **18–20px** | Big surfaces have edges and texture that survive heavy blur; lighter blur on a full-frame move reads as a rendering hiccup instead of motion. | - -Both sides of a cut use the SAME peak blur — the value must match at the swap frame. -Apply blur to the WRAPPER, never to individual children. - ---- - -## 1. Zoom-Through (forward) - -### The Problem - -Text enters, holds, exits. Then next text enters, holds, exits. Each text block is -independent — no depth, no continuity. The video feels like a slideshow. - -### The Principle - -A velocity-matched cut on the Z-axis. You **never see both texts at the same time.** The -outgoing text scales toward the viewer (accelerating), blur and opacity peak at the cut -point hiding a hard swap, and the incoming text continues scaling up from behind -(decelerating into the focal plane). One continuous forward motion, two different texts. - -### The Three Phases - -**Phase 1: Exit** — text accelerates forward (toward viewer) - -- Scale: `1.0 -> 1.2`, Blur: `0px -> 10px` (text-scale; see Blur Logic), Opacity: `1.0 -> 0.15` -- Scale/blur easing: `power3.in` (steep acceleration) -- Opacity easing: `none` (linear — even dimming, separated from scale) -- Duration: 0.2s - -**Phase 2: Hard cut** at peak velocity + peak blur - -- Outgoing: `opacity: 0` (instant via `tl.set`) -- Incoming: `opacity: 0.15, scale: 0.75, blur: 10px` (instant via `tl.set`) -- All properties match at the cut: blur, opacity, and scale DIRECTION (both scaling up) - -**Phase 3: Entry** — text continues forward (growing into focal plane) - -- Scale: `0.75 -> 1.0`, Blur: `10px -> 0px`, Opacity: `0.15 -> 1.0` -- Easing: `expo.out` (steep initial burst matching exit velocity, long settle) -- Duration: 0.5s - -### Why Opacity Must Be Separate on Exit - -Scale uses `power3.in` but that keeps opacity near 1.0 for most of the tween. Splitting -opacity to its own tween with linear ease makes the dimming even. On entry, all properties -can share `expo.out`. - ---- - -## 2. Inverse Zoom-Through (backward) - -The mirror: the camera "pulls back" instead of pushing through. The outgoing element -RECEDES away from the viewer; the incoming element arrives OVERSIZED (as if it had been -just behind the camera) and retracts into the focal plane. Both move in the shrinking -direction — same-direction rule preserved, just reversed. - -**When to use over the forward variant:** arrival beats. The incoming element lands with -presence because it comes from larger-than-frame — right for a payoff line ("That changes -today."), a giant reply, or a held end-state. Forward zoom-through reads as _progressing -through_ content; inverse reads as _arriving at_ content. - -### The Three Phases - -**Phase 1: Exit** — element recedes (away from viewer) - -- Scale: `1.0 -> 0.8`, Blur: `0px -> 10px` (text-scale) -- Scale/blur easing: `power3.in`; Opacity: `1.0 -> 0.15` on `none` (separate tween) -- Duration: 0.2s - -**Phase 2: Hard cut** - -- Outgoing: `opacity: 0` via `tl.set` -- Incoming: `opacity: 0.15, scale: 1.25, blur: 10px` via `tl.set` - -**Phase 3: Entry** — incoming retracts into place - -- Scale: `1.25 -> 1.0`, Blur: `10px -> 0px`, Opacity: `0.15 -> 1.0` -- Easing: `expo.out`, Duration: 0.5s - ---- - -## 3. Cut the Curve (Scene Transitions) - -### The Principle - -Use cut-the-curve for **all scene-to-scene transitions** on x and y axes. The outgoing -scene's hero element accelerates in one direction, the cut lands mid-motion, and the -incoming scene's hero element continues moving in the **same direction** and decelerates. -Nothing exits fully off-screen and nothing enters from fully off-screen — **speed plus -opacity fading trick the eye**; the partial moves are enough. - -### Same Path, Same Direction - -If Scene A's hero slides left, Scene B's hero enters from the right and continues sliding -left. Both move leftward. One continuous motion. - -| Direction | Scene A exit | Scene B entry start | Scene B entry end | -| --------- | -------------- | ------------------- | ----------------- | -| Leftward | `x: 0 -> -230` | `x: +230` | `x: 0` | -| Rightward | `x: 0 -> +230` | `x: -230` | `x: 0` | -| Upward | `y: 0 -> -230` | `y: +230` | `y: 0` | -| Downward | `y: 0 -> +230` | `y: -230` | `y: 0` | - -### Velocity matching via mirrored eases - -The cleanest match: exit `power4.in` and entry `power4.out` with the SAME distance and -duration — mathematically the two halves of one `power4.inOut` composite, so the entering -element picks up at exactly the 50% point of the notional path at identical velocity -(e.g. 230px / 0.3s ≈ 3,070 px/s at the cut on both sides). - -The fade trick: the exit's opacity completes at ~25–30% of its travel (fade duration -≈ 0.18–0.3s vs motion 0.3–0.34s) — the element vanishes while still visibly accelerating, -and nothing has to reach the frame edge. Entry fades IN fast from ~0.35 under its -deceleration. Time the LAST fading element to die right at the hard cut — gaps where -nothing is moving read as awkward dead air. - -### Rules - -- Use cut-the-curve for all scene transitions — it's the default, not an accent -- Same direction on both sides; mirrored `.in`/`.out` eases, same distance + duration -- Exit duration short (0.2–0.4s), entry duration >= exit duration -- Partial travel + fade, never full off-screen moves - ---- - -## 4. Waterfall Cut (word-by-word cut-the-curve) - -Cut-the-curve at WORD granularity — the strongest version of the leftward cut for -text-to-text seams. Each word of the outgoing line ramps out on its own pronounced curve; -each word of the incoming line cascades in mid-flight. The stagger turns the cut into a -wave the eye rides across the seam. - -### Exit (per word) - -- Motion: `x: 0 -> -230` over 0.34s on **power4.in** — a much more pronounced ramp than - the usual power2: the word barely creeps, then RIPS -- Fade: `opacity -> 0` over 0.18s (separate tween, `power1.in`) — completes when the word - is only ~25–30% into its travel -- Stagger: reading order, ~0.022s per word, timed so the LAST word finishes fading right - at the hard cut - -### Entry (per word) - -- `fromTo x: +230 -> 0, opacity: 0.35 -> 1` over 0.3s on **power4.out** — the mirrored - back half of the composite; every word ignites already moving at matched velocity -- Waterfall stagger with SHRINKING gaps (start 0.05s, multiply by ~0.84 per word) so the - cascade accelerates across the line — the cascade should speed up word over word, not run - at a flat per-word delay -- Pre-set all words to `x: +230, opacity: 0` at build time — `immediateRender: false` - alone leaves un-started words sitting visible at rest during the stagger window - -### Whole-line variant - -A single-line beat (e.g. a big intro line) exits as one group with the same pronounced -ramp, but stretch its fade to ~0.3s ending ~0.02s before the cut — a lone element that -fades early leaves dead air that a word cascade would have covered. - ---- - -## Choosing a Variant - -| | Zoom-Through | Inverse Zoom | Cut the Curve | Waterfall Cut | -| -------------- | --------------------------- | --------------------------- | ----------------- | ------------------------- | -| Scope | Within-scene text swap | Arrival/payoff beat | Between scenes | Text-to-text seam | -| Axis | Z, toward viewer | Z, away from viewer | X / Y | X, per-word | -| Peak blur | 10px text / 20px full-frame | 10px text / 20px full-frame | none required | none (fade does the work) | -| Opacity at cut | 0.15 | 0.15 | exit faded by cut | last word dies at cut | -| Feel | progressing through | arriving at | carried sideways | a wave across the seam | - ---- - -## Anti-Patterns - -| Don't | Why | Instead | -| ---------------------------------------- | ------------------------------------------- | ------------------------------------------------------ | -| Two texts visible during a zoom-through | Overlapping text breaks the Z-axis illusion | Hard cut at blur peak, one text at a time | -| 20px blur on text-scale subjects | Letterforms smear; reads as a glitch | 10px for text, 18–20px only full-frame | -| Elements on different paths across a cut | Eye tracks one direction, cut goes another | Same property, same direction | -| Mismatched blur/opacity at the swap | Visible flash or brightness jump | Identical values at the cut frame | -| Gentle easing on entry (`power2.out`) | Entry velocity feels slower than exit | Mirror the exit: `power4.out` / `expo.out` | -| Full off-screen exits / entries | Wastes time and breaks the speed illusion | Partial travel + early fade | -| Lone element fading long before its cut | Dead air at the seam | Fade ends ~0.02s before the cut, or use a word cascade | -| Zoom-through on body text | Small text at 0.75 scale is unreadable | Only headlines and short phrases | -| Scene cuts without cut-the-curve | Static cuts feel like a slideshow | Cut-the-curve is the default | diff --git a/.agents/skills/faceless-explainer/references/motion-language.md b/.agents/skills/faceless-explainer/references/motion-language.md deleted file mode 100644 index 75a9e4e..0000000 --- a/.agents/skills/faceless-explainer/references/motion-language.md +++ /dev/null @@ -1,156 +0,0 @@ -# Motion language — the move vocabulary + the motion doctrine + the seek-safe core - -> The motion layer for **Step 4 (Visual design)**. When you write a frame's **time-coded shot sequence**, you name each scene's move **inline from the vocabulary below** — a named palette of the moves the golden corpus actually uses. Each move carries the **backing rule id** in this skill's local `../../hyperframes-animation/rules/`; cite that id so the move resolves to a real recipe when a **frame worker** implements it in Step 5 (the worker reads the rule body in `../../hyperframes-animation/rules/.md` — it reproduces the move, it does not guess from the name). You name motion by **role / move name**, never by raw GSAP curve, ms, or stagger formula — the worker maps the curve. Between-frame **transitions are not yours**: story names `transition_in`, the harness injects it; that injected transition **is** the frame's exit. For cuts a worker builds INSIDE a frame (within-scene swaps, scene-to-scene seams), see the catalog in `cut-catalog.md`. - -A good explainer feels like one continuous film — one camera, one motion feel, **smooth and timed to the voiceover** — not a pile of slides that animate once and freeze. In an explainer the development _is_ the teaching: the formula assembling, the diagram gaining a layer, the count-up landing. The doctrine in Part 2 is load-bearing: when in doubt, do what it says. - ---- - -# Part 1 — the move vocabulary - -Reach into this palette when naming a scene's motion. Pick the move that matches the beat, name it in the shot sequence, and cite the rule id after `→`. The blueprints (`../../hyperframes-animation/blueprints/`) name these same moves in their `rule mapping`; you're drawing from one shared palette. Compose 2–4 across a shot's scenes (entrance → sequential reveal → settle), not all at once. - -## Kinetic type - -- **hard-cut / flash word-swap** — a word or line replaces the previous one on an instant cut (no fade/roll); the swap itself is the beat. → `discrete-text-sequence` -- **in-place token cycle** — a fixed line holds and only its variable slot changes, token → token → token. → `discrete-text-sequence` -- **per-word staggered reveal** — a phrase assembles word-by-word (or chunk-by-chunk), each landing on its own beat. → `dynamic-content-sequencing` -- **kinetic beat-slam** — short phrases slam in on a shared percussive beat array, each with a distinct entrance, resolving on a locked finale; the recipe for "punchy / rhythmic" taglines. → `kinetic-beat-slam` - -## Typewriter - -- **type-on with caret** — text types in character-by-character behind a blinking caret. → `discrete-text-sequence` (+ `context-sensitive-cursor` for the caret blink / color) -- **backspace-and-retype** — the line types, deletes the last word(s), and retypes a new one (typo-correction, reframe). → `discrete-text-sequence` (+ `context-sensitive-cursor`) - -## Count-up / data - -- **value-scaled counter** — a number counts up and its font size grows with the value, so the climb itself escalates. → `counting-dynamic-scale` -- **bars / progress / star wipe** — a number paired with a graphic that fills: bar-height stagger, a progress bar / ring filling, a fractional star-rating wipe. → `stat-bars-and-fills` - -## Reveal / decode - -- **3D char flip-decode** — characters flip in 3D and resolve from scrambled glyphs to the real text (decryption feel). → `hacker-flip-3d` -- **SVG self-draw** — an outline / icon / ring draws itself stroke-by-stroke. → `svg-path-draw` - -## Camera - -- **push / focus / drift** — a sequential camera move on the frame root (pull-back → focus → push) plus continuous micro-drift; the cinematic baseline. → `multi-phase-camera` -- **zoom-to-target** — zoom into a non-centered element (scale + counter-translate to keep it framed). → `coordinate-target-zoom` -- **pan / focus-lock** — a virtual camera transforming one `.world` wrapper to pan / zoom / lock onto a region. → `viewport-change` -- **camera-cursor-tracking** — the viewport locks to a moving focal point (a typing cursor), static framing then focal-locked tracking. → `camera-cursor-tracking` - -## Layout motion - -- **cluster→outward expansion** — elements start clustered at center and expand outward to their final positions in lockstep. → `center-outward-expansion` -- **orbit** — elements flip in from 3D space and settle into a continuous elliptical orbit (entry flips in-place at the orbital position). → `orbit-3d-entry` -- **split-tilt cards** — two cards side-by-side with opposing rotationY tilts, entering from their respective sides (comparison / before-after). → `split-tilt-cards` -- **logo/avatar ring + connectors** — avatars or logos on an elliptical ring with SVG connection lines to a center point, staggered entry. → `avatar-cloud-network` - -## Surface / UI - -- **3D page-scroll reveal** — a full webpage as a tilted 3D card whose internal content scrolls to reveal specific sections. → `3d-page-scroll` -- **cursor click + ripple** — a cursor moves to a target, depresses with it on click, and emits an expanding ripple. → `cursor-click-ripple` -- **button press** — a tactile press: compression then spring recovery, optional release burst / glow. → `press-release-spring` (or `physics-press-reaction` for a click that compresses cursor + target together) -- **keyword glow** — keywords light up with glow + scale + color on an attack-decay-rest envelope, synced to a word rail. → `asr-keyword-glow` - -## Morph / handoff - -- **scale-swap** — two elements at the same screen center hand off: the outgoing cluster shrinks + fades as the incoming one arrives. → `scale-swap-transition` -- **card morph-anchor** — a container morphs apparent size + corner radius + surface between two shots, then fades to reveal the real target beneath (HyperFrames uses uniform `scale`, not `width`/`height`). → `card-morph-anchor` - -## Seam cuts (worker-built, inside a frame) - -The velocity-matched cuts a worker authors between a frame's own Scenes. Name the seam in the shot sequence; the recipe is in the catalog, not a single `../../hyperframes-animation/rules/` id. - -- **zoom-through / inverse zoom-through** — a within-scene swap on the Z-axis; forward reads "progressing through", inverse reads "arriving at" (payoff). → `cut-catalog.md` -- **cut-the-curve** — a scene-to-scene cut where both sides move the same direction at matched velocity. → `cut-catalog.md` -- **waterfall cut** — cut-the-curve at word granularity, a wave across a text-to-text seam. → `cut-catalog.md` - -## Emphasis / marker - -- **highlight / circle / burst / scribble** — a marker-drawn emphasis on a word or element: yellow highlight sweep, hand-drawn circle, radiating burst, scribble, or rough sketch-outline. → `css-marker-patterns` - -## Aliveness during a hold (use sparingly — see Part 2) - -- **subtle jitter** — the sanctioned way to keep a settled frame alive: a small, low-amplitude positional/scale jitter on the held element. The motion-graphics trick that reads "alive" without reading "weak." → `sine-wave-loop` (low-amplitude register) -- **live SVG internals** — internal SVG parts move so an icon feels alive (rotating hands, oscillating blades, pulsing dots, dash-flow); fine because it's the subject doing something, not a card breathing. → `svg-icon-enrichment` -- **finite bounded ambient** — a single bounded breathe/drift on ONE held hero, only when genuinely needed; de-emphasized — prefer sequential reveal or jitter first. → `sine-wave-loop` - -## The added moves — now backed by local rules - -Five moves the golden corpus needs were added to this skill's `../../hyperframes-animation/rules/`, rounding out the vocabulary above: - -- **depth-of-field / selective-blur** — blur the off-focus subset to spotlight the focal element → `depth-of-field-blur` -- **motion-blur streak** — directional velocity blur on a fast fly-in / camera push-through → `motion-blur-streak` -- **3D depth scatter-assemble** — glyphs/elements scatter into a tumbling 3D cloud, then reassemble → `depth-scatter-assemble` -- **spring-pop entrance** — the canonical entrance pop; default to a smooth long-tail settle, overshoot only when explicitly playful → `spring-pop-entrance` -- **ambient glow / bloom** — un-triggered soft glow blooming behind a static hero → `ambient-glow-bloom` - ---- - -# Part 2 — the motion doctrine (load-bearing) - -These four rules are the difference between a clip that reads as a serious explainer and one that reads as an agent-made PowerPoint. Follow them as written. - -## 1. Smooth beats bouncy — `power3` is the default - -Elements should use **long-tail decel curves that let them settle smoothly. `power3` is enough in most cases.** No bouncy, no overshoot, no `back.out` / `bounce.out` / `elastic.out` as a default. - -Bouncy is the **#1 instant turn-off** in user-made Remotion / HyperFrames videos, and the agent almost never gets it right — it thinks bouncy adds emphasis, but it buys that emphasis at the cost of cleanliness. The serious motion-design shops feel the same. **Smooth always wins.** Overshoot is demoted to a **rare, explicitly-playful exception** (a consumer/fun logo slam, a deliberate bell-hit) — never the house style. Name the intent as a long-tail settle; the worker maps `power3` (or `expo.out` on a fast arrival). See `../../hyperframes-animation/rules/spring-pop-entrance.md` — it now leads with the smooth settle. (The exact form of that settle is a critically-damped spring; the worker has a baked, seek-safe `springEase` — ζ=1 — in `../../hyperframes-animation/adapters/gsap-easing-and-stagger.md` → Spring Eases for when the settle is the hero. Real physics, same doctrine — not a license for bounce.) - -## 2. Sequential reveal in the back ~50%, timed to the voiceover - -This is the anti-PowerPoint mechanism — sharper than "put development in the middle." - -- **Don't dump everything on screen in the first ~25%** of the scene. Rushing all content in up front is exactly what forces the slideshow feel. -- **Reveal each piece — a line, a card, even an h1 — when the voiceover mentions it**, sequencing reveals across the **later ~50%** of the scene. Same amount of agent work, but the cut becomes coherent and gains rhythm. -- **Less is more.** Fewer things on screen, each arriving on its VO beat, beats a full canvas that animated once and froze. - -Practically: a frame's shot sequence front-loads almost nothing — the entrance carries only what the VO is saying at t=0, and the rest of the elements wait in the timeline for their spoken cue. A reveal maps onto a development-class move from Part 1 (`per-word staggered reveal`, `cluster→outward expansion`, a `count-up`, an `asr-keyword-glow` synced to the word rail). - -## 3. No lazy breathing, no bad pan/push — "no motion over bad motion" - -The agent's two reflexive ways to fake "aliveness" both read cheap: - -- **No lazy breathing.** Scaling cards/text up and down in a circular loop to look "alive" is the cheap tell. Don't reach for it. -- **No bad slow pan / push in the back half.** A slow pan or push on elements in the later ~50% of a scene **disrupts the viewer's sightline and causes eye discomfort** — it actively makes the frame worse, not better. - -The fix for both is the same: **stagger element reveals in time with the script** (rule 2). And the governing principle: **"I'd rather have NO motion than BAD motion."** A held, still frame is better than a frame kept "alive" by breathing or a drifting camera. The **only sanctioned aliveness** during a hold is **subtle jitter** — a small low-amplitude jitter that keeps a frame from feeling dead without looking weak (it's in current video work now). Everything else holds. - -## 4. Internal seams are velocity-matched cuts - -When a frame has an internal seam — a within-scene swap, a Scene-to-Scene cut, a text-to-text line change — make it a **velocity-matched cut**, not a hard slideshow cut: cut at peak velocity, match direction and speed on both sides. The catalog (the four techniques, the blur logic, and which to use when) is `cut-catalog.md`; the moves are listed under **Seam cuts** in Part 1. - -## One-line summary - -Smooth long-tail (`power3`) over bouncy; reveal sequentially in the back ~50% timed to the VO (not dumped in the first 25%); no lazy breathing and no bad slow pan/push — prefer stillness, with subtle jitter as the only aliveness; cut at peak velocity with matched direction/speed (→ `cut-catalog.md`). - ---- - -# Part 3 — the seek-safe core (hard rules) - -The frame is a **paused GSAP timeline seeked frame-by-frame**, so some "continuous" intents from a real-time engine can't render — don't name them. These are non-negotiable regardless of doctrine. - -- **No infinite / forever motion** — "particles loop endlessly," "logo rotates forever," "marquee on repeat." Any aliveness (the subtle jitter, a live SVG internal, a needed bounded ambient) is a **finite tween over the hold**, never `repeat` / `yoyo`. -- **No randomness or wall-clock** — no `Math.random` particle fields, no `Date.now` drift. Every render must be identical; name deterministic motion only (stagger and any variation derive from the element index). -- **Entrances use `fromTo`** — state the from-state explicitly so a seek to `t=0` lands the element correctly; never rely on a CSS-hidden start (it renders visible before the tween claims it, and flickers under seek). -- **No CSS `transition` / `@keyframes` for motion** — CSS animation runs on the browser clock, independent of the HF seek clock; it desyncs and flickers. Drive all motion inside the paused GSAP timeline. -- **Entrance + sequential reveal only — no mid-video exit.** The frame unmounts via the harness transition; that injected `transition_in` **is** the exit. Exit motion belongs only to the final frame. (Worker-built seam cuts in `cut-catalog.md` are within-frame, not the frame's exit.) - -## Forbidden — the failure modes - -**Slideshow (the primary failure):** everything dumped on screen in the first ~25%; content enters then freezes; nothing revealed on its VO cue. Fix with rule 2 (sequential reveal timed to the VO). - -**Cheap aliveness:** circular breathing as "life"; a slow pan/push in the back half disrupting the eye; many elements floating independently as "motion." Fix with rule 3 (stillness + subtle jitter only). - -**Bouncy:** `back.out` / `bounce.out` / `elastic.out` as the default entrance; hand-keyed overshoot. Fix with rule 1 (`power3` long-tail; overshoot only when explicitly playful). - -**Always:** no `repeat` / `yoyo`; no `Math.random` / `Date.now`; no all-elements-entering-simultaneously (sequence or stagger). - -## Naming motion in a shot — example - -> Scene 1 (0.0–1.0s): solid field; hero headline enters via **per-word staggered reveal** (`dynamic-content-sequencing`) on a smooth long-tail settle (`power3`); slow **push** on the root (`multi-phase-camera`) holds steady — no back-half re-push. -> Scene 2 (1.0–3.0s): as the VO names each step, five mechanism nodes reveal **sequentially** via **cluster→outward expansion** (`center-outward-expansion`), then a **value-scaled counter** (`counting-dynamic-scale`) ticks up beneath them — the back-half reveal, timed to the script, not dumped at t=0. -> Scene 3 (3.0–4.2s): hold on the result; **keyword glow** (`asr-keyword-glow`) lands on the payoff word as the VO says it; settles and holds still — at most **subtle jitter** (`sine-wave-loop`, low amplitude) keeps it alive; no breathing, no drift. - -Name the move + its rule id (or `cut-catalog.md` for a seam cut) per scene; let the worker pick curves, ms, and stagger — defaulting to `power3`. diff --git a/.agents/skills/faceless-explainer/references/story-design.md b/.agents/skills/faceless-explainer/references/story-design.md deleted file mode 100644 index 29fd26c..0000000 --- a/.agents/skills/faceless-explainer/references/story-design.md +++ /dev/null @@ -1,255 +0,0 @@ -# Story design — faceless explainer video - -Use this reference in Step 3 to write `STORYBOARD.md` and `SCRIPT.md` for a faceless explainer — a topic, concept, how-to, listicle, or narrative explainer built from text, with **no product, no website, and no captured assets**. - -This file defines the story: what the video teaches, in what order, and why each frame exists. It does not define layout, visual effects, animation, or final markdown schemas. For exact file syntax, follow `../../hyperframes/references/storyboard-format.md` and `../../hyperframes/references/script-format.md`. - -## Read first - -Read these inputs before writing: - -1. `hyperframes.json` — locked brief: angle, length, aspect ratio, language. -2. `frame.md` — tone, mood, design system, and register. -3. `capture/extracted/visible-text.txt` — the article / notes / topic / brief (the source of **information**). -4. `user_script.txt` and `VO_MODE`, when the user pasted a script. - -There is no `asset-descriptions.md` and no `capture/assets/` to inspect — this is faceless. Every visual is invented downstream (Steps 4-5); your job here is the **narrative**, not a visual asset list. - -## Output - -Create two files: - -- `STORYBOARD.md` — the teaching plan, one frame per beat. -- `SCRIPT.md` — the locked narration, only for spoken frames. - -Every storyboard frame must include the required fields from the storyboard format reference, plus the narrative metadata below. - -## Core rule - -An article is an information dump. A video is a guided act of understanding. - -Do not follow paragraph order. Reorder, merge, omit, and compress the source text into a clear teaching sequence. Strip the asides; surface the spine. **The single most common failure is paraphrasing the article in order — do not do that.** The input text is the source of information, not a story template. - -## Step 3 method - -### 1. Extract the teaching truth - -From the brief and text, identify: - -- Audience — who the video is speaking to, and what they already (don't) know. -- Gap or stakes — the confusion, question, or "why care" the explanation resolves. -- Thesis — the one-line idea the viewer should walk away with. -- Spine — the 3-6 ideas (mechanisms / steps / items / beats) that build to the thesis. -- Evidence — the concrete numbers, examples, comparisons, or worked cases that ground it. -- Landing — the takeaway or the call to think / try / act. - -Write the storyboard around the thesis, not around the article's sections. - -### 2. Match the register to `frame.md` - -Use `frame.md` as a soft guide — the visual system tunes the **voice**, not the structure: - -| `frame.md` signal | Story effect | -| ------------------------------ | -------------------------------------- | -| warm, handmade, notes-like | plain, considered, low-hype; humane | -| bold, poster-like, declarative | short punchy beats, confident claims | -| friendly, polished, modern | approachable direct address, lighter | -| literary, technical-but-human | thoughtful, precise; safe for code/dev | - -The teaching truth decides the arc. The visual system tunes the voice. - -### 3. Choose one explainer structure - -Pick **one** structure (or explicitly name a compound). Do not splice phases from different structures — each is a complete path through understanding. - -| Structure | "It is…" | Use when the payload is… | Body shape | -| ------------------- | ------------------------------------------------ | ----------------------------------------------------------- | -------------------------------------------------------------------- | -| `concept-explainer` | "what is X, and why does it matter" | one idea/term/phenomenon the audience half-knows | name concept → reveal mechanism layer by layer → land implication | -| `how-to-process` | "here is how to do / how X works," ordered steps | a procedure or mechanism with a clear start→finish | a 3-6 step sequence on a consistent visual stage, one move each | -| `listicle` | "N things about X" | a set of parallel, co-equal items (tips, mistakes, reasons) | hook → N roughly co-equal items → wrap; rule-of-three is strongest | -| `story-explainer` | teach through a narrative arc | case studies, histories, cautionary tales | setup → tension → turn → resolution → lesson; the lesson generalizes | - -**Choosing:** one idea to understand → concept; an ordered procedure → how-to; parallel co-equal items → listicle; a concrete narrative/case → story. - -**Compounds** layer an outer arc with an inner rhythm — e.g. `concept-explainer with process` (ordered steps inside the mechanism phase), `story-explainer with how-to`. Set `arc` in the frontmatter to the chosen structure (or ` with `). The downstream visual phase reads it for pacing: a process inner rhythm means tighter seams on a consistent stage and shorter frames. - -### 4. Build the frame sequence - -Each frame needs one clear job. Avoid frames that only say "more detail" or "another point." - -For every frame, define (use the storyboard format's fields, with these narrative additions in the frame's metadata + prose): - -- `type` — one of `hook | pain_point | product_intro | feature_showcase | benefit_highlight | social_proof | branding | cta`. This enum is shared with the downstream visual layer for pacing; **repurpose** it for teaching per the mapping below. -- `persuasion` — a **named** rhetorical / clarity technique (see catalog), not "explain the idea." -- `beat` — the target feeling (see vocabulary). -- `scene` — a one-line visual idea, not detailed composition. -- `voiceover` — spoken guide text, or empty for silent frames. -- `transition_in` — a registry transition name (see Transitions). -- `blueprint` _(optional candidate)_ — consult the role→blueprint menu in `../../hyperframes-animation/blueprints-index.md`; when a proven shape fits this beat, tag its id (a tag, not a commitment — Step 4 confirms or overrides). Then **write the `voiceover` in the shape that blueprint implies**, so the line is reveal-ready before Step 4 ever runs. Teaching truth still decides which beats exist — never invent, drop, or bend a beat just to fit a shape; omit `blueprint` and write the line plainly when none fits. - -In the prose under each frame, state: - -- `narrativeRole` — the scene's **job** in the explanation (e.g. "Concretizes compound interest as a snowball," not "Shows a chart"). -- `keyMessage` — the one thing the viewer should understand after this frame (one sentence). - -### Type-enum repurposing (shared enum → explainer roles) - -The enum is shared with the downstream visual layer; map your explainer roles onto it so downstream pacing matches the frame's job: - -| Explainer role you want | Use `type` | Why this value | -| -------------------------------- | ------------------- | -------------------------------------------------------------------- | -| Hook / curiosity gap | `hook` | The high-leverage opening 3-5s. | -| Pain / problem / why-care | `pain_point` | The friction or gap the explanation resolves. | -| Name the core concept | `product_intro` | "Introduce the protagonist" — here the protagonist is the **idea**. | -| Mechanism / step / item | `feature_showcase` | A unit of the body — one move of a process, one mechanism, one item. | -| Implication / payoff / "so what" | `benefit_highlight` | The consequence or value of understanding. | -| Evidence / example / data point | `social_proof` | A concrete grounding: a number, a worked example, a comparison. | -| Thesis / takeaway / principle | `branding` | The philosophical landing — the generalizable idea, the one line. | -| Call to think / try / act | `cta` | The closing ask — try it, watch for it, question it. | - -The body is usually a run of `feature_showcase` (steps/mechanisms/items), interleaved with `benefit_highlight` (implications) and `social_proof` (examples/data). At least one `feature_showcase` or `product_intro` should exist (every explainer has a body and a named idea). - -## Hook strategy - -Pick one opening strategy for the first 3-5 seconds. For explainers the hook opens a cognitive gap or stakes: - -| Strategy | Use when | Example | -| ---------------------- | -------------------------------------------------- | ---------------------------------------------------------------- | -| Shocking statistic | A credible number quantifies the stakes. | "90% of plastic ever made has never been recycled." | -| Rhetorical question | Create an immediate cognitive gap. | "Why does time seem to speed up as you get older?" | -| Counterintuitive claim | The truth contradicts common belief. | "Adding more lanes to a highway makes traffic worse." | -| Pain validation | The audience already feels the confusion. | "Everyone says 'just diversify' — nobody says what that means." | -| Visceral metaphor | The idea is abstract and needs to become concrete. | "Your attention is a spotlight, and apps fight over the switch." | -| Concept announcement | The term itself is the subject; make it memorable. | "There's a word for this: the bystander effect." | -| Direct address | The audience is clearly defined. | "If you've ever rage-quit a recipe halfway — this is for you." | -| Imagine / scenario | A thought experiment frames the whole piece. | "Imagine money that loses value if you don't spend it." | -| Stakes / consequence | The "why care now" is a real cost or risk. | "Get this one step wrong and the whole batch is ruined." | - -The hook must create curiosity, tension, or stakes. Do not open with a generic definition. Per `../../hyperframes-creative/references/story-spine.md`: the hook speaks the viewer's language (the payoff of understanding, never the source text's section headings), and the thesis (`message`) lands by beat 2 — the explanation after that is its evidence. - -## Clarity / rhetoric technique catalog - -`persuasion` is a **named technique** — how this frame makes the idea land or clear — not a vague intent. Combine when several are active (e.g. "Analogy + progressive disclosure"). - -| Family | Techniques | -| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **Make-concrete** | Analogy / metaphor · Concretization (abstract → tangible object) · Worked example with real numbers · Anchoring on a familiar referent | -| **Reveal-in-order** | Progressive disclosure (one term/layer at a time) · Build-up (simple → general case) · Signposting ("first… then… finally") | -| **Contrast** | Before/after · Common-belief vs reality · Comparison of two options · Counterexample (here is when it breaks) | -| **Structure** | Rule of three · Numbered enumeration · Question→answer pairing · Frame-then-fill (state the shape, then populate it) | -| **Evidence** | Statistical proof · Citation / source · Demonstration (show the mechanism running) · Causal chain (A → B → C) | -| **Memory & landing** | Callback (return to the hook's image) · Distillation (compress to one line) · Coined term / mnemonic · Generalization (specific → principle) | - -When no catalog technique fits, name a new one inline and explain its mechanism (e.g. "Subtractive framing: define the concept by what it is _not_ first"). Never write generic "explain the idea." - -## Emotional beats - -`beat` is one word or a short compound phrase (e.g. "Curiosity and clarity"). Avoid generic "positive" / "interested." Explainers ride a comprehension arc: - -- **Negative valley** — _open the gap_ (hook / pain_point): curiosity · puzzlement · surprise · tension · concern · skepticism · recognition · intrigue -- **Pivot** — _orient_ (product_intro / concept-naming): clarity · orientation · anticipation · focus -- **Build** — _build understanding_ (feature_showcase / benefit_highlight / social_proof): comprehension · "aha" · confidence · fascination · foresight · momentum · conviction · delight · unease (for a caveat) · mastery -- **Resolution** — _land_ (branding / cta / final): clarity · satisfaction · resolve · inspiration · inevitability · "now I get it" - -Compound beats are often strongest, e.g. "Surprise + recognition", "Comprehension + delight." - -## The body is a sequence, not a single frame - -An explainer's core is almost always **3-6 body frames on a consistent visual stage**, each advancing one mechanism / step / item / layer, building understanding cumulatively. A single isolated body frame rarely teaches anything. - -- **concept-explainer:** name the concept (`product_intro`) → reveal the mechanism layer by layer (a run of `feature_showcase`, interleaving `benefit_highlight` for "so what" and `social_proof` for a grounding example). -- **how-to-process:** `feature_showcase` per step, ordered, on one stage. Carry the object being acted on across adjacent steps (see Continuity). -- **listicle:** `feature_showcase` per item; items are parallel, so default to `cut` / `push-slide` between them. -- **story-explainer:** frames follow the beats (setup / tension / turn / resolution / lesson); types map per the table (`pain_point` for tension, `branding` for the lesson). - -## Continuity across frames (no worker grouping) - -This framework builds **one frame per worker** — there is no "continue run" that hands several frames to one worker. A sequence of frames reads as one continuous shot through two storyboard-level levers, both yours: - -1. **A consistent stage** — consecutive body frames share the same composition idea (same diagram growing, same number line, same desk), stated in each frame's `scene` so Step 4 and the workers keep the stage stable. -2. **A consistent transition** — pick one seam type for a sequence (usually `push-slide ` for ordered steps, `crossfade` for a soft layer reveal) and repeat it across the run, so the frames feel like one flow rather than separate slides. - -When a single element genuinely _transforms_ between two ideas (a diagram node becomes a chart bar, a formula becomes its result), keep it within **one frame** as a development beat (entrance → the transform → settle) rather than splitting it across a seam — the worker owns that motion. Note the intent in the frame's `scene` / narrative; Step 4 turns it into a time-coded shot sequence (instantiating the candidate `blueprint`). - -## Transitions - -Use only registry transition names in `transition_in`: - -`cut | crossfade | blur-crossfade | push-slide LEFT | push-slide RIGHT | push-slide UP | push-slide DOWN | zoom-through | squeeze` - -Pick 2-3 transition types for the whole video and repeat them. Frame 1 uses `cut` as a placeholder (there is no previous frame). Match the seam to the narrative: ordered steps → a consistent `push-slide`; a soft layer reveal or atmosphere shift → `crossfade` / `blur-crossfade`; zooming into a detail or pulling back → `zoom-through`; a clean topic switch or new list item → `cut`. - -## Faceless visuals — no asset inventory - -Every visual is invented downstream from each frame's `narrativeRole` / `keyMessage` / `scene` — typography, abstract graphics, diagrams, data-viz are all first-class. Therefore: - -- Do **not** write an `asset_candidates` line describing intended diagrams or typography as if they were files. Visual intent belongs in `scene` + `narrativeRole`; the visual phase reads those. -- The **only** real asset is a user-supplied image already placed at `public/`. Then add one line `asset_candidates: public/ — <≤25 words: what it is>`. Never invent paths or reference `capture/`. - -## Script rules - -### If there is no pasted script - -Write tight per-frame narration: - -- 1-2 sentences per spoken frame; usually 6-20 words. -- Concrete and human; teach, don't read the article aloud. -- **Write each line as discrete cues, not one run-on breath.** Step 5 reveals each on-screen piece _when the voiceover names it_ (the anti-PowerPoint mechanism). A line with clear phrase boundaries — "First the snowball — then the hill — then the speed" — hands the shot its reveal cadence for free; a single long clause leaves the frame nothing to pace to. -- **Strong** (concretization): "Compound interest isn't addition, it's a snowball — every turn picks up the snow from the last, then more." -- **Weak** (article-paraphrase): "The study, published in 2019, examined three cohorts and found that…" — that is reading, not explaining. - -Avoid: "Unlock the power of…", "Seamless experience", long noun-phrase lists, a frame that is only a filler bridge ("Or…"). - -**Silent frames are allowed and common in explainers** — a diagram assembling itself, a worked example animating, a beat of held tension before a turn. Set `voiceover` empty and leave the frame out of `SCRIPT.md`; then `narrativeRole` + `persuasion` must carry what the script doesn't say. - -### If `VO_MODE = restructure` - -Treat `user_script.txt` as source material. Rewrite, reorder, merge, or omit to fit the chosen structure and target length. - -### If `VO_MODE = verbatim` - -Do not rewrite the user's words. Segment the script into frame-sized chunks at sentence or paragraph boundaries (you may split a long sentence at a natural clause boundary, but do not change words). Final duration follows the provided script. - -## Music & silence - -The storyboard's top YAML block carries a `music:` field — the BGM mood the audio step retrieves against (e.g. `music: confident minimal tech underscore`). Omitting it falls back to `message:` → `arc:` → a neutral default, so BGM plays unless turned off explicitly. - -- **`music: none`** — BGM off (narration, if any, still runs). -- **`music: none` + no `SCRIPT.md` + no `sfx:` cues or host audio** — the canonical **fully-silent marker**: no narration, no BGM, no SFX. `audio.mjs` generates nothing and the audio step is a clean skip. Use exactly this spelling when the user asks for a silent / music-free video. - -## Frame template - -Use the exact fields required by the core storyboard format. This is the narrative shape each frame should satisfy: - -```md -## Frame N — Short name - -- scene: one clear visual idea -- voiceover: "spoken guide text, or empty" -- duration: rough estimate in seconds -- transition_in: crossfade -- status: outline -- src: compositions/frames/NN-short-name.html -- type: feature_showcase -- persuasion: Progressive disclosure -- beat: comprehension -- blueprint: dataviz-countup — candidate shape from the role→blueprint menu; omit when none fits - -narrativeRole: What this frame does in the viewer's understanding. -keyMessage: The one idea the viewer should remember. -``` - -## Final checklist - -Before asking for user approval, verify: - -- One explainer structure is named (compound only when explicitly named); the sequence is narrative-driven, not paragraph-order-driven. -- The opening uses a named hook strategy. -- Each frame has one job; the body builds cumulatively (a run of `feature_showcase` / `benefit_highlight` / `product_intro`), not a single isolated body frame. -- Every frame has `type`, `persuasion` (a named technique from the catalog), and `beat` (specific, not generic). -- Each `voiceover` is phrase-segmented into cues (each a piece Step 5 can reveal on), not one run-on clause; a candidate `blueprint:` is tagged wherever a proven shape fits, and omitted where none does. -- The emotional arc has meaningful variation matching the structure. -- Transitions use only registry names and repeat 2-3 types; frame 1 is `cut`. -- A consistent stage + consistent transition carry any multi-frame sequence; a genuine element transform stays inside one frame. -- `asset_candidates` is absent (faceless) except a real user-supplied `public/`. -- `SCRIPT.md` contains only locked spoken narration; silent frames are intentional and omitted from it. diff --git a/.agents/skills/faceless-explainer/references/visual-design.md b/.agents/skills/faceless-explainer/references/visual-design.md deleted file mode 100644 index d16e98a..0000000 --- a/.agents/skills/faceless-explainer/references/visual-design.md +++ /dev/null @@ -1,146 +0,0 @@ -# Visual design — faceless-explainer per-frame shot method - -> The method behind **Step 4 (Frame visual design)**. You (the orchestrator) read it to **enrich `STORYBOARD.md` frames in place** — story-design wrote the skeleton (each frame's `scene`, `voiceover`, `transition_in`, the narrative fields, and optionally a candidate blueprint id); you add how each frame **looks and moves**. The unit you write per frame is a **time-coded shot sequence** — a shot directed across its whole duration, not a static slide. You write **no HTML** (that's the frame workers). Because the explainer is **faceless, every visual is invented** — typography, abstract graphics, diagrams, data-viz — so you **design** the visual elements rather than select captured assets (there is no `capture/` to read). `frame.md` is your palette/type truth by role. Layout is a compact vocabulary in this file (the **Layout** section below), stated inline per Scene; motion vocabulary + the motion doctrine + the seek-safe core → `motion-language.md`; the proven shapes → `../../hyperframes-animation/blueprints-index.md` + `blueprints/.md`; concrete rules resolve in Step 5 from this skill's local `../../hyperframes-animation/rules/`. Adding palette theory or a generic font rule here? Wrong home — `frame.md` + `hyperframes-creative`. - -## The unit is a time-coded shot sequence - -A frame's visual layer is **a sequence of time windows paced to the voiceover**, not a bag of effect tags. The failure that reads as PowerPoint is **front-loading**: the agent rushes the whole canvas on screen in the first ~25%, and then it just sits. A time-coded shot sequence written **against the VO** makes that impossible: each window states what is on screen and what is moving, and **nothing appears before the voiceover reaches it.** In an explainer the development _is_ the teaching — the formula assembling term by term, the diagram gaining a layer, the count-up landing the statistic. Let the build _be_ the message. - -Write each frame as a handful of windows cued by the spoken line: - -``` -Scene 1 (0.0–Xs): only what the VO is saying at t=0 enters — never the whole canvas -Scene 2 (Xs–Ys): the next piece reveals as the VO names it (a line / layer / node / stat) - … one window per spoken cue — as many or as few as the line calls for -Scene N (…–end): content has resolved; hold the read (stillness; subtle jitter at most) -``` - -- Each `Scene` line names **what's on screen**, **what moves in this window**, and **where it sits** (layout, inline). Times are real seconds across the frame's `duration`. -- **Pace reveals to the voiceover; never front-load.** This is the core anti-PowerPoint mechanism (→ `motion-language.md` Part 2 Rule 2). At t=0 show only what the VO is saying then; reveal each further piece — a line, a layer, even an h1 — **when the VO names it**, spreading reveals across the shot and especially the **back ~50%**. **The window count = the number of spoken cues the line calls for** — a two-beat line is two windows, a five-item enumeration is five or six. There is **no fixed count and no mandatory "middle" act**; the only sin is dumping everything up front. (A **silent** frame — a diagram assembling itself, a worked example animating — paces its reveals to the beat instead of the VO; same discipline, no spoken cue.) -- **End on a held read.** Once the content has resolved it holds and reads — **prefer stillness to bad motion**: no forced camera drift, no lazy breathing, no back-half pan/push; at most a subtle jitter keeps it alive (→ `motion-language.md`). On a short shot the final reveal and the hold are the **same window** — the hold is not a separate mandatory act. Only the final frame has a real exit; every other frame's exit is the harness transition (story's `transition_in`). -- A **deliberately held** frame — content already revealed, now reading still — is legitimate and often right (a climax, a breather, a beat of held tension before a turn). The failure is never "too still"; it is **front-loaded-then-frozen** (everything dumped by ~25%, nothing cued to the VO). Place held beats deliberately for rhythm so the video isn't uniformly busy (allocate them in `## Video direction`). Reveal pacing + holds + the idle budget → `motion-language.md`. - -## Pick the shape — instantiate a blueprint - -Don't invent each shot from scratch. The frame's **role** (its `type` / `beat`) points to a proven shape: - -1. **Match the role to a blueprint.** Open `../../hyperframes-animation/blueprints-index.md`, find the frame's role in the **role→blueprint menu**, and pick the blueprint whose intent fits this beat (story may already have named a candidate id — confirm or override it). Read that `blueprints/.md`: it is a short, domain-agnostic, **time-coded shot template with `[slots]`** and a named **signature move** (the thing that makes the shape itself — the SVG ring, the push-THROUGH, the in-place token swap). - -2. **Instantiate its `[slots]` with THIS frame's invented content** — three postures: - - **Reproduce** — the blueprint fits the beat and your content maps onto its slots cleanly. Fill every `[slot]` with this frame's word / shape / stat and follow its Scene timing. Write the resulting Scene lines. - - **Adapt** — the _structure_ fits but the content / element-count / surface doesn't (or you want a fresher surface to avoid templating). State **what you keep / what you change** in one line, then write the adapted Scene lines. You may extend or vary; you may **never** drop the **signature move** (drop it and you picked the wrong blueprint), and you keep the reveals **paced to the VO** — never collapse the shape to a single front-loaded dump. - - **Compose** — no blueprint fits the beat. Build the shot from the **motion vocabulary** in `motion-language.md`: still pace the reveals to the VO across the shot, never fire everything at t=0. Mark it `blueprint: compose`. - -3. **Keep the signature move.** Whichever posture, the blueprint's signature move (named in its file) is the spine of the shot — it usually lands on the shot's key reveal. Carry it through. - -The blueprint's own Scene lines, motion vocabulary, and `rule mapping` are your raw material; you are choosing a shape and casting this frame's invented content into it, not copying an engineering spec. - -## What you add to each frame - -Story-design's `## Frame N` block already carries the narrative. You append the shot. Story's `scene` / `voiceover` / `transition_in` / role fields stay untouched. - -``` -## Frame 3 — How interest compounds -- scene: a snowball rolls downhill, gaining a labeled ring each turn ← refine only if it could read sharper -- voiceover: "…" ← story's; leave it -- transition_in: crossfade ← story's; leave it -- type: feature_showcase ← story's -- persuasion: Concretization + progressive disclosure -- beat: comprehension -- blueprint: dataviz-countup (Adapt) ← you add: the id you instantiated (or "compose") -- focal: the snowball ← you add: the INVENTED hero element of this beat -- roles: snowball = foreground subject · hill = background gradient (dim ~40%) · ring labels = supporting ← you add: role per invented element -- sfx: whoosh-soft, tick ← you add: the sound the beat wants (fetched + mounted at root; never yours to embed) - -Adapt: keep the count-up-ring signature; the trend chart becomes the snowball's labeled rings climbing. -Scene 1 (0.0–1.2s): solid hill gradient (dim ~40%); the snowball seats upper-left, a circular progress ring + bold center number anchor it — Centered template, ~50% of frame. Slow push-in runs underneath. -Scene 2 (1.2–3.4s): as the VO names each turn, the snowball rolls down and gains one labeled ring per turn (layer-reveal); a small total ticks up beside it (the count-up reveals on its spoken cue, not at t=0). Asymmetric 60/40, 3 depth layers. -Scene 3 (3.4–5.0s): land the final ring emphasis dead-center, accent glow blooms behind it and holds; the total reads clean and STILL — no continuing push, no breathing (a held beat beats bad motion). The stillness reads against the prior motion. -``` - -The lightweight tags: - -- **`blueprint:`** — the id you instantiated (with `(Reproduce)` / `(Adapt)`), or `compose`. One id per frame. -- **`focal:`** — which **invented** element is the hero of this beat (a hero word, a diagram node, a chart series, a coined-term card). -- **`roles:`** — each invented element's role: `foreground subject` (the thing the eye lands on, text laid around it) · `background` (full-bleed field / gradient / grid, dim 30–50%) · `supporting` (labels, secondary shapes, ambient layers). Since there are no captured assets, you are **designing** these elements, not selecting them — keep them **few and load-bearing**. A user-supplied `public/` image, if any (named in story's `asset_candidates`), is treated as the `focal` cutout or a `background`. -- **`sfx:`** — name the sound the beat wants (an impact for a slam, a whoosh for a push, a tick for a count). The audio script's `fetch-sfx` pass retrieves it and the assembler mounts it at the root — you only **name** it, never embed an `
directly in -// , no