// @ts-nocheck
// ============================================================================
// MOTION GRAPHICS · OBSIDIAN ORBIT — Scene 10 / COPY DRAFT PROMPT (10s, 300f)
//
// "Keynote object-worship". ONE hero artifact: a glass slab whose face is the
// "Copy Draft Prompt" panel. A solid monolithic script block sits on the face
// under a primary CTA button. On the CLICK beat the button depresses, a prompt
// token flies off + a clipboard pulse rings out ("Copied"), and the solid
// script block FRACTURES — splitting along seams into a clean row of FOUR
// numbered scene cards. The breakdown made literal: one block of intent →
// discrete, ordered scenes. The WORLD orbits (never the camera) in slow
// hold→ease arcs; billboarded spec Callouts fire on leader lines ("STEP 1",
// "COPY DRAFT PROMPT", "4 SCENES"); the angle-tracked sheen rakes the turn; the
// slab settles front-on for the payoff with an impact + shockwave as the cards
// lock into their row.
//
// Built ENTIRELY on the Plinth module (mirrors ObsidianOrbit.tsx's contract) +
// the shared Chronixel engine. CSS-3D only, deterministic, no WebGL.
// ============================================================================
import React from "react";
import { AbsoluteFill, useCurrentFrame, useVideoConfig } from "remotion";
import {
Plinth,
OrbitWorld,
Extrude,
Callout,
DustMotes,
} from "../../plinth/plinth";
import { C, withAlpha, ACCENT_GRAD } from "../../chronixel/theme";
import { FONT, MONO } from "../../chronixel/fonts";
import {
beat,
clamp01,
mix,
osc,
enter,
springAt,
EASE,
SPRING,
} from "../../chronixel/motion";
import { Shockwave, GlowPulse, LightSweep } from "../../chronixel/fx";
/* ----------------------------------------------------------------------------
A small mono eyebrow tag pinned top-left over the void — frames the beat.
-------------------------------------------------------------------------- */
const Eyebrow: React.FC<{ at: number; children: React.ReactNode }> = ({
at,
children,
}) => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
return (
{children}
);
};
/* ============================================================================
COPY DRAFT PROMPT. Hero = the "Copy Draft Prompt" slab. A solid script block
under a primary CTA. On the CLICK the button depresses, a prompt token copies
(clipboard pulse), and the block fractures into a row of 4 numbered scene
cards — the breakdown made literal. World orbits, callouts fire, slab settles.
========================================================================== */
export const MgOrbitScene10CopyPrompt: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const t = frame / fps;
const CLICK = 4.6; // the click beat (seconds) — button press + copy
const LOCK = 7.8; // the apex lock-in beat — cards settle into their row
// --- face choreography -------------------------------------------------
const blockIn = beat(frame, fps, 0.8, 2.0, EASE.out); // solid script block lands
const btnIn = beat(frame, fps, 1.8, 2.8, EASE.backOut); // CTA button arrives
const btnHint = 0.5 + 0.5 * osc(t, 1.4); // gentle pre-click pulse
const press = beat(frame, fps, CLICK, CLICK + 0.18, EASE.out); // button depress
const release = beat(frame, fps, CLICK + 0.18, CLICK + 0.4, EASE.out);
const btnPress = press - release; // 0→1→0 quick depress
// clipboard "copied" pulse ring + token fly
const copyP = beat(frame, fps, CLICK, CLICK + 0.6, EASE.out);
const copyLife = clamp01(1 - (t - CLICK) / 1.2) * (t >= CLICK ? 1 : 0);
const tokenP = beat(frame, fps, CLICK + 0.02, CLICK + 0.55, EASE.expoOut);
// the FRACTURE: the solid block splits into the 4-card row after the click.
const fractureP = beat(frame, fps, CLICK + 0.18, CLICK + 1.6, EASE.expoOut);
// --- the lock-in: a weighty spring settle on the apex -------------------
const stamp = springAt(frame, fps, LOCK, SPRING.HEAVY); // 0→1 weighty settle
const stampScale = mix(1.1, 1, clamp01(stamp)); // slams down to rest
const flash = clamp01(1 - (t - LOCK) / 0.45) * (t >= LOCK ? 1 : 0);
const riser = beat(frame, fps, LOCK - 1.4, LOCK, EASE.out); // build into apex
const lockRing = clamp01(stamp);
const ringPulse = 0.5 + 0.5 * osc(t, 3);
// hold→ease orbit: reads the face on the way in, a turn through the fracture,
// then a final arc that settles to centre (0°) right at the lock — the payoff.
const legs = [
{ arc: -18, hold: 0.6, travel: 2.2 },
{ arc: 24, hold: 1.0, travel: 2.4 },
{ arc: -6, hold: 0.5, travel: 1.7 }, // lands ~0° near LOCK
];
const scriptLines = [0.9, 0.72, 0.86, 0.64, 0.8];
// the four scene cards the block fractures into. seam = where the block was
// cut; offset = how far each shard slides out into its slot in the row.
const cards = [
{ n: 1, label: "INTRO" },
{ n: 2, label: "PROBLEM" },
{ n: 3, label: "DEMO" },
{ n: 4, label: "OUTRO" },
];
const HeroFace = (
{/* panel title bar */}
draft-prompt.txt
{fractureP > 0.5 ? "4 SCENES" : "1 BLOCK"}
{/* the body region — holds the solid block, which fractures into cards */}
{/* SOLID SCRIPT BLOCK — one monolith of intent. Fades/contracts as it
fractures so the row of cards takes its place. */}
{scriptLines.map((w, i) => {
const lp = clamp01((blockIn - i * 0.1) / 0.6);
return (
);
})}
{/* the FRACTURED ROW — 4 numbered scene cards split out of the block. */}
{cards.map((card, i) => {
// each shard staggers out, sliding from the block centre to its slot
// and dropping its fracture seam — reads as a clean split.
const cp = clamp01((fractureP - i * 0.1) / 0.6);
const fromCenter = (i - 1.5) * 24; // pull toward centre pre-split
return (
{/* numbered index — the ordered breakdown */}
{card.n}
);
})}
{/* PRIMARY CTA — "Copy Draft Prompt". Depresses on the click beat; a
prompt token flies off + a clipboard pulse rings out. */}
{/* clipboard glyph */}
{copyP > 0.4 && copyLife > 0.05 ? "Copied!" : "Copy Draft Prompt"}
{/* clipboard pulse ring radiating from the button on copy */}
{/* the prompt token copying out — a small chip flying up to the clipboard */}
PROMPT
{/* the lock ring that snaps tight on the apex beat */}
);
return (
Copy Draft Prompt
{/* riser glow swelling behind the hero into the apex */}
{/* click flash + apex impact / shockwave */}
{HeroFace}
{/* billboarded spec callouts firing at orbit waypoints */}
{/* flat masked mirror sibling — re-renders the hero, simplified & matte */}
{HeroFace}
);
};
export default MgOrbitScene10CopyPrompt;