// @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 */}
{/* ROOT ROW — the project folder that unfolds open */}
{/* 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;