diff --git a/plugins/droid-control/ARCHITECTURE.md b/plugins/droid-control/ARCHITECTURE.md index ddc85e3..ba9409d 100644 --- a/plugins/droid-control/ARCHITECTURE.md +++ b/plugins/droid-control/ARCHITECTURE.md @@ -141,7 +141,7 @@ The `Showcase` composition in `remotion/src/compositions/Showcase.tsx` is the on | Layer | Purpose | Controlled by | |---|---|---| | Background + FloatingParticles | Preset-driven warmth or coolness | `preset` | -| TitleCard / FanningRotorOutro | Opening and closing cards | `title`, `subtitle`, `speedNote` | +| TitleCard / DroidOutro | Opening and closing cards (outro plays fanning rotor → crossfade → DROID wordmark) | `title`, `subtitle`, `speedNote` | | Window chrome + layouts | `SingleLayout` or `SideBySideLayout` | `layout`, `labels`, `objectFit` | | ZoomEffect / SpotlightOverlay / KeystrokeOverlay / SectionHeader | Timed in-scene overlays | `effects`, `keys`, `sections` | | CodeAnnotationOverlay | Timed syntax-highlighted code cards | `codeAnnotations` | diff --git a/plugins/droid-control/remotion/src/components/BigDroidLogoOutro.tsx b/plugins/droid-control/remotion/src/components/BigDroidLogoOutro.tsx deleted file mode 100644 index 5d427a2..0000000 --- a/plugins/droid-control/remotion/src/components/BigDroidLogoOutro.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import { AbsoluteFill, useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Palette } from '../lib/palettes'; - -export const BigDroidLogoOutro: React.FC<{ - palette: Palette; -}> = ({ palette }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - // Scale up from 0.8 to 1.0, fade in - const progress = interpolate(frame, [0, 1.5 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const scale = interpolate(progress, [0, 1], [0.8, 1.0]); - const opacity = progress; - - const asciiLogo = ` - █████████ █████████ ████████ ███ █████████ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ █████████ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - █████████ ███ ███ ████████ ███ █████████ - `.trim(); - - return ( - -
- {asciiLogo} -
-
- AUTONOMOUS ENGINEERING -
-
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/FanningRotorOutro.tsx b/plugins/droid-control/remotion/src/components/DroidOutro.tsx similarity index 56% rename from plugins/droid-control/remotion/src/components/FanningRotorOutro.tsx rename to plugins/droid-control/remotion/src/components/DroidOutro.tsx index 91f518a..716ea38 100644 --- a/plugins/droid-control/remotion/src/components/FanningRotorOutro.tsx +++ b/plugins/droid-control/remotion/src/components/DroidOutro.tsx @@ -2,12 +2,18 @@ import React from 'react'; import { AbsoluteFill, useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; import type { Palette } from '../lib/palettes'; import { RotorMark } from './RotorMark'; +import { DroidWordmark } from './DroidWordmark'; -export const FanningRotorOutro: React.FC<{ +export const DroidOutro: React.FC<{ palette: Palette; }> = ({ palette }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); + const rotorCenterX = 303.105; + const rotorCenterY = 319.528; + const rotorCenterXPercent = (rotorCenterX / 613) * 100; + const rotorCenterYPercent = (rotorCenterY / 650) * 100; + const topRightSliceYPercent = ((rotorCenterY - (613 - rotorCenterX)) / 650) * 100; // Phase 1: Fan out the 8 triangles (0s to 1.5s) const fanDuration = 1.5 * fps; @@ -47,17 +53,13 @@ export const FanningRotorOutro: React.FC<{ left: '50%', width: '613px', height: '650px', - marginLeft: '-306.5px', - marginTop: '-325px', - transformOrigin: '50% 50%', + marginLeft: `${-rotorCenterX}px`, + marginTop: `${-rotorCenterY}px`, + transformOrigin: `${rotorCenterX}px ${rotorCenterY}px`, transform: `scale(${scaleProgress}) rotate(${rotationProgress}deg)`, opacity, mixBlendMode: 'screen', - // A 45-degree pie slice capturing exactly one blade (top-right) - // 50% 50% = center - // 100% 50% = straight right - // 100% 2.85% = exactly 45 degrees up (y = 18.5px out of 650px) - clipPath: 'polygon(50% 50%, 100% 50%, 100% 2.85%)', + clipPath: `polygon(${rotorCenterXPercent}% ${rotorCenterYPercent}%, 100% ${rotorCenterYPercent}%, 100% ${topRightSliceYPercent}%)`, }} > @@ -76,16 +78,6 @@ export const FanningRotorOutro: React.FC<{ extrapolateRight: 'clamp', }); - const asciiLogo = ` - █████████ █████████ ████████ ███ █████████ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ █████████ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - █████████ ███ ███ ████████ ███ █████████ - `.trim(); - return ( - {/* The ASCII Droid layer */} + {/* The ASCII Droid wordmark layer */}
-
- {asciiLogo} -
-
- AUTONOMOUS ENGINEERING -
+
); diff --git a/plugins/droid-control/remotion/src/components/DroidWordmark.tsx b/plugins/droid-control/remotion/src/components/DroidWordmark.tsx new file mode 100644 index 0000000..63f73ce --- /dev/null +++ b/plugins/droid-control/remotion/src/components/DroidWordmark.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import type { Palette } from '../lib/palettes'; + +const DROID_ASCII = ` + ██████████ ██████████ ██████████ ███ ██████████ + ███ ███ ███ ███ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ███ ███ + ███ ███ ██████████ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ███ ███ + ██████████ ███ ███ ██████████ ███ ██████████ +`.trim(); + +export const DroidWordmark: React.FC<{ + palette: Palette; + logoColor?: string; + taglineColor?: string; +}> = ({ palette, logoColor, taglineColor }) => ( +
+
+ {DROID_ASCII} +
+
+ AUTONOMOUS ENGINEERING +
+
+); diff --git a/plugins/droid-control/remotion/src/compositions/Showcase.tsx b/plugins/droid-control/remotion/src/compositions/Showcase.tsx index ec88b08..dfd9f67 100644 --- a/plugins/droid-control/remotion/src/compositions/Showcase.tsx +++ b/plugins/droid-control/remotion/src/compositions/Showcase.tsx @@ -29,7 +29,7 @@ import { ColorGradeOverlay } from '../components/ColorGradeOverlay'; import { Watermark } from '../components/Watermark'; import { ZoomEffect } from '../components/ZoomEffect'; import { SectionTransitionOverlay } from '../components/SectionTransition'; -import { FanningRotorOutro } from '../components/FanningRotorOutro'; +import { DroidOutro } from '../components/DroidOutro'; import { CodeAnnotationOverlay } from '../components/CodeAnnotationOverlay'; export const showcaseSchema = z.object({ @@ -331,7 +331,7 @@ export const ShowcaseComposition: React.FC> = ( {/* Outro card */} -