feat: add marketing video mode and Remotion marketing video project

Add debug-only Marketing Video Mode toggle that enables hands-free
screen recording across the app: auto-scrolling Featured Trips carousel,
auto-filling trip wizard, smooth trip detail scrolling via CADisplayLink,
and trip options auto-sort with scroll.

Add Remotion marketing video project with 6 scene compositions using
image sequences extracted from screen recordings, varied phone entrance
animations, and deduped frames for smooth playback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-13 12:07:35 -06:00
parent 67965cbac6
commit 5f5b137e64
655 changed files with 4008 additions and 63 deletions

View File

@@ -231,8 +231,9 @@ struct TripOptionsView: View {
}
var body: some View {
ScrollViewReader { proxy in
ScrollView {
LazyVStack(spacing: 16) {
VStack(spacing: 16) {
// Hero header
VStack(spacing: 8) {
Image(systemName: "point.topright.arrow.triangle.backward.to.point.bottomleft.scurvepath.fill")
@@ -291,8 +292,27 @@ struct TripOptionsView: View {
}
}
.padding(.bottom, Theme.Spacing.xxl)
Color.clear.frame(height: 1).id("tripOptionsBottom")
}
.themedBackground()
#if DEBUG
.onAppear {
if UserDefaults.standard.bool(forKey: "marketingVideoMode") && !hasAppliedDemoSelection {
hasAppliedDemoSelection = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
Theme.Animation.withMotion(.easeInOut(duration: 0.3)) {
sortOption = .mostGames
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
withAnimation(.easeInOut(duration: 20.0)) {
proxy.scrollTo("tripOptionsBottom", anchor: .bottom)
}
}
}
}
#endif
} // ScrollViewReader
.navigationDestination(isPresented: $showTripDetail) {
if let trip = selectedTrip {
TripDetailView(trip: trip)