feat(remotion): shared FinishPass cinematic grade (quality floor) + @remotion/lottie

The single highest-ROI quality lift — one finish applied at the FlexStory level
lifts all 12 blocks at once, no per-block change:
- GRADE_FILTER: a headless-safe colour grade (contrast/saturation/lift) applied as
  a CSS `filter` on the content root — backdrop-filter does NOT render in headless
  Chrome, so the grade lives on the content, not an overlay.
- FinishPass: split-tone (cool-shadows multiply + warm-highlights screen) + a soft
  brand duotone + top light-bloom, layered over each scene.
- Installed @remotion/lottie@4.0.290 (artist-made animations — next lever).

Verified: visible richer/graded look on CharacterScene + Slideshow, subtle enough
to suit the muted palette, consistent across blocks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-24 23:35:08 +03:30
parent 8f34c3175f
commit b1a51cb01b
2 changed files with 27 additions and 1 deletions
@@ -6,6 +6,7 @@ import { FONT } from "../lib/fonts";
import { useLayout } from "../lib/aspect";
import { getBlock } from "../scenes/registry";
import { withDefaults, clampDuration } from "../scenes/types";
import { FinishPass, GRADE_FILTER } from "../scenes/chrome";
/**
* FlexStory — the scene sequencer. A template is `scenes: SceneInstance[]`; this
@@ -78,7 +79,7 @@ export const FlexStory: React.FC<Props> = (props) => {
});
return (
<AbsoluteFill style={{ backgroundColor: colors.backgroundColor, fontFamily: FONT }}>
<AbsoluteFill style={{ backgroundColor: colors.backgroundColor, fontFamily: FONT, filter: GRADE_FILTER }}>
{music ? <Audio src={resolveAudio(music)} loop volume={musicVolume} /> : null}
{scenes.map((sc, i) => {
@@ -101,6 +102,9 @@ export const FlexStory: React.FC<Props> = (props) => {
</Sequence>
))
: null}
{/* Cinematic finish over every scene — the shared quality floor. */}
<FinishPass colors={colors} />
</AbsoluteFill>
);
};