From 1dca601314e2e065320763da8ac8aa588587c889 Mon Sep 17 00:00:00 2001 From: Nika Siradze Date: Sun, 13 Sep 2026 14:17:51 +0400 Subject: [PATCH 1/5] Keep a clip's own words out of the part of the frame the app has spent A vertical clip is never watched on its own. YouTube draws a title, a handle and a link chip across the bottom, an action rail up the right, and a phone crops the outer ninth of the width before any of that. Measured off a Shorts screenshot: a viewer's chrome starts 1498 down a 1920 frame and the rail runs from x 817 to the edge. Cards and captions were being written into all of it. SAFE reserves that band, and safeFor reads which reservation a frame is owed off its own shape, so a landscape clip does not guard against furniture that is not drawn in a player. Captions hold above the line instead of dropping to the bottom edge while a card is up, and the band the speaker loses comes off its own floor rather than out of the caption. Every preset card is measured now, not just the scene. Five bullets or a quote that runs to nine lines used to draw straight through the captions; they borrow the scene's estimator and shrink the type, or take the whole frame when shrinking would put them below the floor of the fit. Also in here, because they are the same frame: - Captions take the show's colours. A style shipped with its own palette, so every clip carried two accents: a yellow sweep under a green figure. - An outlined caption style, for a whole line at a time over an uncovered shot. - place: "over" writes a card into the shot with a scrim instead of a panel, and falls back to the panel when the shot has no room for it. - bleed gives a picture or footage the whole frame, which is what dropping the speaker was for. A band too short to read still bleeds on its own. - emphasis takes up to three phrases and colours them where they stand, so a sentence can land on two without being rewritten. - The logo and the topic chip stopped sharing a corner at the same inset. --- backend/cli.py | 12 +- backend/clip_studio.py | 2 +- cli/VERSION | 2 +- package-lock.json | 4 +- package.json | 2 +- remotion/src/CaptionedClip.tsx | 121 ++++-- remotion/src/cards.ts | 32 +- remotion/src/components/BrandedCaptions.tsx | 6 +- remotion/src/components/Cards.tsx | 401 ++++++++++++++++---- remotion/src/components/HormoziCaptions.tsx | 2 +- remotion/src/components/NameCard.tsx | 5 +- remotion/src/components/Scene.tsx | 8 +- remotion/src/components/SubtleCaptions.tsx | 20 +- remotion/src/components/TopicChip.tsx | 13 +- remotion/src/motion.ts | 2 + remotion/src/scene.ts | 77 +++- remotion/src/types.ts | 148 +++++++- 17 files changed, 726 insertions(+), 131 deletions(-) diff --git a/backend/cli.py b/backend/cli.py index 98fec7c..54c62f5 100644 --- a/backend/cli.py +++ b/backend/cli.py @@ -3923,7 +3923,7 @@ def print_help(): print(f" {green}-n{reset}, {green}--top{reset} {gray}{reset} Export top N clips {dim}(default: 5){reset}") print(f" {green}-o{reset}, {green}--output{reset} {gray}{reset} Output directory {dim}(default: ./clips){reset}") print(f" {green}-p{reset}, {green}--preset{reset} {gray}{reset} Load a saved preset") - print(f" {green}--caption-style{reset} {gray}