// @ts-nocheck // ============================================================================ // MOTION GRAPHICS · OBSIDIAN ORBIT — Scene 07 / LOCAL LINK (9s, 270f) // // "Keynote object-worship". ONE hero artifact: the BROWSER slab. A thick glass // slab whose face is a browser frame — traffic-light dots, an address-bar pill, // an empty page. A cursor glides to the pill and PASTES a "localhost" link; on // the ENTER beat a LightSweep rakes across the page and the product DASHBOARD // reveals inside (sidebar + KPI cards + a chart). The WORLD orbits (never the // camera) in slow hold→ease arcs; spec Callouts billboard on drawn leader lines // ("localhost", "READY TO START"); the angle-tracked sheen rakes the turn. A // weighty lock-in settles the slab front-on on the payoff with an impact + // shockwave, then it holds — sheen tracking the final turn. // // Built ENTIRELY on the Plinth module (mirrors ObsidianOrbit.tsx + Scene03'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}
); }; /* ============================================================================ LOCAL LINK. Hero = the BROWSER artifact. A glass slab whose face is a browser window: chrome draws on, a cursor pastes a "localhost" link into the address pill, ENTER fires a light sweep, and the product DASHBOARD reveals inside. The world orbits, callouts fire, then the slab LOCKS front-on with an impact on the payoff ("READY TO START"). ========================================================================== */ export const MgOrbitScene07LocalLink: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const t = frame / fps; // --- beat timeline (seconds) ------------------------------------------ const CHROME = 0.5; // browser chrome draws on const URLAT = 2.7; // cursor pastes the localhost URL const ENTER = 4.6; // enter key → page loads const LOCK = 6.9; // apex lock-in / settle on the dashboard payoff // --- face choreography ------------------------------------------------- const chromeP = beat(frame, fps, CHROME, CHROME + 1.0, EASE.backOut); // window builds const cursorP = beat(frame, fps, 1.4, URLAT, EASE.inOut); // cursor glides to the pill const urlP = clamp01((t - URLAT) / 0.9); // url chars paste/type in const pillFlash = beat(frame, fps, URLAT, URLAT + 0.35, EASE.out); // pill pulses on paste const reveal = beat(frame, fps, ENTER, ENTER + 1.0, EASE.expoOut); // dashboard wipes in // --- 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: reads the browser face on the way in, settles to 0° at the // lock — the snap-to-camera payoff on the live dashboard. const legs = [ { arc: -22, hold: 0.5, travel: 2.2 }, { arc: 26, hold: 1.0, travel: 2.6 }, { arc: -7, hold: 0.5, travel: 1.6 }, // lands ~0° near LOCK ]; // the localhost link, typed character-by-character into the pill. const URL = "http://localhost:3000"; const urlChars = Math.round(URL.length * urlP); // dashboard KPI cards + a tiny bar chart, revealed by the light sweep. const kpis = [ { label: "USERS", val: "12.4k" }, { label: "BUILD", val: "OK" }, { label: "UPTIME", val: "100%" }, ]; const bars = [0.42, 0.66, 0.5, 0.84, 0.6, 0.95]; const HeroFace = (
{/* browser window */}
{/* ---- title bar : traffic lights + address pill ---- */}
{["#ff5f57", "#febc2e", "#28c840"].map((c, i) => (
))}
{/* address-bar pill holding the localhost link */}
{/* a small lock / local glyph */}
0 ? C.text : C.textFaint, whiteSpace: "nowrap", }} > {urlChars > 0 ? URL.slice(0, urlChars) : "search or enter address"} {urlP > 0 && urlP < 1 ? ( ) : null}
{/* ---- page body : empty → dashboard reveal ---- */}
{/* loading shimmer line that races across just before the reveal */}
ENTER - 0.25 ? 1 : 0), }} /> {/* the DASHBOARD inside, wiped in by the light sweep */}
{/* sidebar */}
Dashboard
{[0, 1, 2, 3].map((i) => (
))}
{/* main panel : KPI row + chart */}
{kpis.map((k, i) => (
{k.label}
{k.val}
))}
{/* a tiny bar chart */}
{bars.map((b, i) => { const grow = clamp01((reveal - i * 0.06) / 0.5); return (
); })}
{/* the cursor that glides over to the pill and pastes the link */}
{/* the lock ring that snaps tight on the apex beat */}
); return ( Open The Dashboard {/* riser glow swelling behind the hero into the apex */} {/* the ENTER → page-load light sweep, and the lock-in impact */} {HeroFace} {/* billboarded spec callouts firing at orbit waypoints */} {/* flat masked mirror sibling — re-renders the hero, simplified & matte */} {HeroFace} ); }; export default MgOrbitScene07LocalLink;