// @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) => (
))}
{/* 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;