Skip to content

feat(script): atmospheres + transitions + kinetic templates (stop the slideshow)#7

Merged
cuio merged 1 commit intomainfrom
feat/visual-sota-stop-the-slideshow
Apr 25, 2026
Merged

feat(script): atmospheres + transitions + kinetic templates (stop the slideshow)#7
cuio merged 1 commit intomainfrom
feat/visual-sota-stop-the-slideshow

Conversation

@cuio
Copy link
Copy Markdown
Owner

@cuio cuio commented Apr 25, 2026

Summary

Three slices that together kill the "slideshow" look in rendered output. Templates carry visible motion, scene boundaries are cinematic, and every scene now has an ambient backdrop that hijacks peripheral attention.

Slice 4 — Per-scene atmosphere system

  • New packages/core/src/script/atmosphere/ registry with five presets:
    • studio-flat — no-op (use when brand requires the cleanest possible flat look)
    • aurora — rotating conic gradient + pulsing radial glows; dramatic
    • gradient-mesh — four drifting radial gradients; subtle
    • particle-field — two tiled SVG dot layers on GPU transforms (no per-particle DOM)
    • noise-grain — dense grain + vignette, slow drift
  • Pure CSS with @keyframes scoped per-scene id; no GSAP, no JS runtime cost, can't fight the runtime ticker.
  • mix-blend-mode picked per bg luma — multiply on light bg, screen on dark — so colors actually stain instead of overlay-washing out.
  • assembleMaster injects atmosphere as the first child of every scene div via a single regex replace; templates stay untouched.
  • defaultAtmosphereForTemplate maps template type → preset id (hooks/quote/outro → aurora, chart/comparison → gradient-mesh, callout/aroll → particle-field). Planner can override via scene.props.background.

Slice 5 — Cinematic transitions between scenes

  • SceneTransition extended: cut | fade | wipe-left | wipe-right | zoom-in | zoom-out | whip-pan.
  • New packages/core/src/script/transitions/index.ts with per-type durations + defaultTransitionForTemplate.
  • assembleMaster bakes transitionIn + transitionInMs into the SCENES array embedded in the player.
  • forceSync rewritten: per-scene role (hidden / active / entering / exiting) and per-type CSS application (opacity, transform, clip-path). Outgoing scene cross-exits during the entering scene's window so audio stays locked to scene boundaries.

Slice 6 — Kinetic upgrades for the workman templates

These two templates carried 40-60% of screen time as static text on flat color — the slideshow offenders.

  • aroll-text: per-word title reveal with overflow-clipped slide-up spans (newsroom feel), animated accent rule wipe, eyebrow side-rule, per-word body fade.
  • concept-callout: numbered items become circular badges with halo glow that stamp in with back.out(2) overshoot, a vertical accent spine draws downward as badges drop, item labels reveal per-word.

Test plan

  • Reassembled my-first-video (12 scenes) — atmosphere injected on every scene, distribution matches template type
  • Wipe-left transition between s01 (chart) → s02 (callout) verified mid-flight: s01 right 70% visible, s02 entering from left 30%, sharp clip boundary
  • Aurora preset visible on dark theme (purple/teal blooms over black) and on cream theme (warm/cool radial blooms via multiply blend)
  • Upgraded callout shows red badges with halo, vertical spine, particle atmosphere — no longer reads as a slide
  • Upgraded aroll-text shows per-word title reveal, accent word in red, side-rule eyebrow, body fade
  • Lint, format check, typecheck all pass

Notes

  • Atmosphere intensity tuned for current cream theme to be tasteful — on a dark theme (HyperSpeedrun electric purple/cyan brief) it reads dramatically. The brand-color extraction work (slice 7 in the broader plan) will let dark-themed projects show the full impact.
  • The cinematography section in the playbook (slice 8) will teach the planner when to override default atmosphere/transition picks. Defaults are sensible without it.

Three slices that together kill the "slideshow" look in rendered output.

Slice 4 — Per-scene atmosphere system:
- New packages/core/src/script/atmosphere/ registry with five presets:
  studio-flat (no-op), aurora (rotating conic gradient), gradient-mesh
  (drifting radial gradients), particle-field (two tiled SVG dot layers
  on GPU transforms — no per-particle DOM), noise-grain (dense grain +
  vignette, drifting).
- Each preset is pure CSS with @Keyframes scoped per-scene id; no GSAP,
  no JS runtime cost, can't fight the runtime ticker.
- mix-blend-mode picked per bg luma — multiply on light, screen on dark
  — so colors actually stain instead of overlay-washing.
- assembleMaster injects atmosphere as the first child of every scene
  div via a single HTML replace; templates stay untouched.
- defaultAtmosphereForTemplate maps template type → preset id so the
  planner doesn't have to think about it. Planner can override via
  scene.props.background.

Slice 5 — Cinematic transitions between scenes:
- SceneTransition union extended: cut, fade, wipe-left, wipe-right,
  zoom-in, zoom-out, whip-pan.
- New packages/core/src/script/transitions/index.ts holds per-type
  durations + defaultTransitionForTemplate.
- assembleMaster bakes transitionIn + transitionInMs into the SCENES
  array embedded in the player.
- forceSync rewritten: per-scene role (hidden/active/entering/exiting)
  and per-type CSS application (opacity, transform, clip-path). The
  outgoing scene cross-exits during the entering scene's window so audio
  stays locked to scene boundaries.

Slice 6 — Kinetic upgrades for the workman templates that carried
40-60% of screen time as static text on flat color:
- aroll-text: per-word title reveal with overflow-clipped slide-up
  spans (newsroom feel), animated accent rule wipe, eyebrow side-rule,
  per-word body fade.
- concept-callout: numbered items become circular badges with halo
  glow that stamp in with back-overshoot, a vertical accent spine
  draws downward as badges drop, item labels reveal per-word.

Verified: the assembled my-first-video plays cross-fades, wipe-lefts
between callout and chart scenes, zoom-ins on comparison, and the
upgraded callout/aroll templates carry visible motion the originals
lacked.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant