// @ts-nocheck // ============================================================================ // MOTION GRAPHICS · OBSIDIAN ORBIT — Scene 06 / PROJECT CREATED (11s, 330f) // // "Keynote object-worship". ONE hero artifact: a FILE-TREE slab. A thick glass // slab whose face is a software file-tree — a root folder "Motion Graphics" // that UNFOLDS open, then core files (remotion / director / episodes) CASCADE // in one by one, each stamped with a green tick. Order-from-nothing: the empty // slab fills with structure as the WORLD orbits (never the camera) in slow // hold→ease arcs. Billboarded spec Callouts fire on drawn leader lines at // waypoints ("PROJECT READY", "CORE FILES"); the angle-tracked sheen rakes the // turn; a settle/lock-in on the apex where the tree completes — the payoff — // then it rests, sheen tracking the final turn. // // 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"; const GREEN = "#54a06f"; // SEMANTIC.success — desaturated tick green /* ---------------------------------------------------------------------------- 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}
); }; /* ---------------------------------------------------------------------------- A tiny folder glyph that swings OPEN as `open` goes 0→1 (the lid hinges up). -------------------------------------------------------------------------- */ const FolderGlyph: React.FC<{ open: number; color: string }> = ({ open, color, }) => (
{/* back wall of the folder */}
{/* tab */}
{/* hinging front flap — swings open on `open` */}
); /* ---------------------------------------------------------------------------- A small green tick that draws in with a scale/pop. -------------------------------------------------------------------------- */ const Tick: React.FC<{ p: number }> = ({ p }) => (
); /* ============================================================================ PROJECT CREATED. Hero = the file-tree artifact. An extruded glass slab whose face is a software file-tree: root folder "Motion Graphics" unfolds, then the core files cascade in (remotion / director / episodes), each green-ticked. The world orbits in, callouts fire ("PROJECT READY", "CORE FILES"), and the tree LOCKS complete on the apex with an impact — then settles. ========================================================================== */ export const MgOrbitScene06ProjectCreated: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const t = frame / fps; const LOCK = 8.2; // the apex lock-in beat (seconds) — the payoff // --- face choreography ------------------------------------------------- const rootIn = beat(frame, fps, 1.0, 1.9, EASE.backOut); // root row drops in const rootOpen = beat(frame, fps, 1.8, 2.7, EASE.out); // root folder unfolds const connP = beat(frame, fps, 2.4, 3.2, EASE.out); // the tree spine draws // core files cascade in, staggered, each with a green tick after it lands. const files = [ { name: "remotion", ext: "/", at: 2.9 }, { name: "director", ext: "/", at: 3.6 }, { name: "episodes", ext: "/", at: 4.3 }, ]; // --- 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.12, 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 so the slab reads its face on the way in, then a final arc // that settles to centre (0°) right at the lock — the snap-to-camera payoff. const legs = [ { arc: -22, hold: 0.5, travel: 2.6 }, { arc: 30, hold: 1.2, travel: 2.8 }, { arc: -8, hold: 0.6, travel: 1.7 }, // lands ~0° near LOCK ]; const HeroFace = (
{/* window chrome bar — reads as a file explorer panel */}
explorer
{/* ROOT ROW — the project folder that unfolds open */}
Motion Graphics
/
{/* the tree spine + the cascading core files */}
{/* vertical spine of the tree, drawing down from the root */}
{files.map((f) => { const rowP = beat(frame, fps, f.at, f.at + 0.6, EASE.backOut); const tickP = beat(frame, fps, f.at + 0.5, f.at + 1.0, EASE.out); const folderOpen = beat(frame, fps, f.at + 0.3, f.at + 0.9, EASE.out); return (
{/* elbow connector from the spine to this row */}
{f.name} {f.ext}
); })}
{/* the lock ring that snaps tight on the apex beat */}
); return ( Project Created {/* riser glow swelling behind the hero into the apex */} {/* impact flash + shockwave on the lock-in payoff */} {HeroFace} {/* billboarded spec callouts firing at orbit waypoints */} {/* flat masked mirror sibling — re-renders the hero, simplified & matte */} {HeroFace} ); }; export default MgOrbitScene06ProjectCreated;