chore: commit all pending changes
211
docs/CODEX_SHARE_CARD_REDESIGN_PROMPT.md
Normal file
@@ -0,0 +1,211 @@
|
||||
# Prompt: Redesign All Shareable Cards — Premium Sports-Media Aesthetic
|
||||
|
||||
## Project Context
|
||||
|
||||
This is an iOS SwiftUI app (`SportsTime.xcodeproj`) for planning multi-stop sports road trips. The app generates shareable image cards (1080x1920 Instagram-story size) for achievements, stadium progress, and trip summaries. These cards are rendered via SwiftUI `ImageRenderer` and exported as UIImages.
|
||||
|
||||
**Build command:**
|
||||
```bash
|
||||
xcodebuild -project SportsTime.xcodeproj -scheme SportsTime -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' build
|
||||
```
|
||||
|
||||
## Files to Modify (all under `SportsTime/Export/Sharing/`)
|
||||
|
||||
1. `ShareableContent.swift` — Theme definition and shared types
|
||||
2. `ShareCardSportBackground.swift` — Card backgrounds
|
||||
3. `ShareCardComponents.swift` — Reusable header, footer, stats, progress ring, map snapshot generator
|
||||
4. `AchievementCardGenerator.swift` — 4 achievement card types + badge + confetti
|
||||
5. `ProgressCardGenerator.swift` — Stadium progress card
|
||||
6. `TripCardGenerator.swift` — Trip summary card
|
||||
|
||||
## Current State (What Exists)
|
||||
|
||||
The cards currently work but look generic — flat linear gradients, basic system fonts, simple circles, scattered sport icons. The goal is to make them look like ESPN broadcast graphics meets a premium travel app.
|
||||
|
||||
### Key Types You'll Reference (defined elsewhere, don't modify):
|
||||
|
||||
```swift
|
||||
// Sport enum — .mlb, .nba, .nhl, .nfl, .mls, .wnba, .nwsl
|
||||
// Each has: .iconName (SF Symbol), .rawValue ("MLB"), .displayName, .color
|
||||
|
||||
// ShareTheme — has: gradientColors, accentColor, textColor, secondaryTextColor, useDarkMap
|
||||
// 8 preset themes: .dark, .light, .midnight, .forest, .sunset, .berry, .ocean, .slate
|
||||
|
||||
// ShareCardDimensions — cardSize (1080x1920), mapSnapshotSize, routeMapSize, padding (60)
|
||||
|
||||
// AchievementDefinition — has: name, description, iconName, iconColor, sport, category
|
||||
// AchievementProgress — has: definition, earnedAt (Date?)
|
||||
|
||||
// LeagueProgress — has: sport, visitedStadiums, totalStadiums, completionPercentage,
|
||||
// stadiumsVisited: [Stadium], stadiumsRemaining: [Stadium]
|
||||
|
||||
// Trip — has: stops, uniqueSports, cities, totalDistanceMiles, totalGames, formattedDateRange
|
||||
// TripStop — has: city, coordinate, arrivalDate, departureDate
|
||||
|
||||
// Color(hex:) initializer exists in Theme.swift
|
||||
|
||||
// Stadium — has: latitude, longitude
|
||||
```
|
||||
|
||||
## Design Direction
|
||||
|
||||
**Aesthetic: "Stadium Broadcast"** — bold condensed type, layered depth, geometric sport motifs, premium stat presentation. Each card should feel like a TV broadcast graphic.
|
||||
|
||||
**Key Principles:**
|
||||
- Strong typographic hierarchy: `.heavy` for headers, `.black` + `.rounded` for numbers, `.light` for descriptions
|
||||
- Three-layer backgrounds: base gradient → geometric pattern → vignette overlay
|
||||
- Sport-specific geometric patterns (diamond lattice for MLB, hexagonal for NBA, ice-crystal for NHL)
|
||||
- "Glass panel" containers: `surfaceColor` fill (textColor at 0.08 opacity) + `borderColor` stroke (textColor at 0.15)
|
||||
- Gold/metallic accents (`#FFD700`, `#B8860B`) for milestones and 100% completion
|
||||
- Tracked ALL CAPS labels for category text
|
||||
- Maps framed with themed borders and subtle shadows
|
||||
|
||||
## Detailed Spec Per File
|
||||
|
||||
### 1. ShareableContent.swift — Add Theme Helper Extensions
|
||||
|
||||
Add these computed properties to `ShareTheme` (after the existing `theme(byId:)` method):
|
||||
|
||||
```swift
|
||||
var surfaceColor: Color // textColor.opacity(0.08) — glass panel fill
|
||||
var borderColor: Color // textColor.opacity(0.15) — panel borders
|
||||
var glowColor: Color // accentColor.opacity(0.4) — for glow effects
|
||||
var highlightGradient: [Color] // [accentColor, accentColor.opacity(0.6)]
|
||||
var midGradientColor: Color // blend of the two gradient colors — for richer angular gradients
|
||||
```
|
||||
|
||||
You'll also need a `Color.blendedWith(_:fraction:)` helper that interpolates between two colors using `UIColor.getRed`.
|
||||
|
||||
### 2. ShareCardSportBackground.swift — Three-Layer Background System
|
||||
|
||||
Replace the current flat gradient + scattered icons with a `ZStack` of three layers:
|
||||
|
||||
**Layer 1 — Angular gradient:** Use `AngularGradient` (not linear) with the theme's two gradient colors plus the derived midGradientColor. Overlay a semi-transparent `LinearGradient` to soften it.
|
||||
|
||||
**Layer 2 — Sport geometric pattern:** Use `Shape` protocol to draw repeating geometric paths:
|
||||
- **MLB:** Diamond/rhombus lattice (rotated squares in a grid, ~60pt spacing, staggered rows)
|
||||
- **NBA/WNBA:** Hexagonal honeycomb (6-sided shapes, ~40pt size)
|
||||
- **NHL:** Angled slash lines (~36pt spacing, rotated ~35 degrees via `CGAffineTransform`)
|
||||
- **NFL/MLS/NWSL/default:** Diagonal stripes (~48pt spacing, 45 degrees)
|
||||
- All rendered at 0.06-0.08 opacity using `theme.textColor`
|
||||
|
||||
**Layer 3 — Edge vignette:** `RadialGradient` from `.clear` center to `.black.opacity(0.4)` at edges. Start radius ~200, end radius ~900.
|
||||
|
||||
**Important:** The `ShareCardBackground` wrapper view should now always use `ShareCardSportBackground` (even for no sports — just use the default stripe pattern). This means empty sports set should still get the angular gradient + stripes + vignette.
|
||||
|
||||
### 3. ShareCardComponents.swift — Premium Shared Components
|
||||
|
||||
**ShareCardHeader:**
|
||||
- Sport icon inside a filled `RoundedRectangle(cornerRadius: 18)` (not a Circle), with accent color at 0.25 opacity, 80x80pt, subtle shadow
|
||||
- Title: `.system(size: 44, weight: .heavy, design: .default)` — NOT rounded
|
||||
- Thin accent-colored `Rectangle` below (200pt wide, 2pt tall)
|
||||
|
||||
**ShareCardFooter:**
|
||||
- Thin horizontal rule above (textColor at 0.15 opacity)
|
||||
- "SPORTSTIME" in `.system(size: 18, weight: .bold)` with `.tracking(6)` in accent color
|
||||
- "Plan your stadium adventure" in `.system(size: 16, weight: .light)`
|
||||
- Compact — no sport icon in the footer
|
||||
|
||||
**ShareStatsRow — "Broadcast Stats Panel":**
|
||||
- `HStack(spacing: 0)` with each stat taking `maxWidth: .infinity`
|
||||
- Thin vertical `Rectangle` dividers between stats (accent color at 0.4 opacity, 1pt wide, 60pt tall)
|
||||
- Stat value: `.system(size: 48, weight: .black, design: .rounded)` in accent color
|
||||
- Stat label: `.system(size: 16, weight: .medium)` ALL CAPS with `.tracking(2)` in secondaryTextColor
|
||||
- Whole row in a glass panel: `surfaceColor` fill, `borderColor` stroke, cornerRadius 20
|
||||
|
||||
**ShareProgressRing:**
|
||||
- `lineWidth: 32` (thicker than before)
|
||||
- Track ring: `surfaceColor` (not just accent at low opacity)
|
||||
- Glow behind progress arc: same arc shape but with `glowColor`, lineWidth + 12, `.blur(radius: 10)`
|
||||
- Tick marks at 25/50/75%: short radial lines on the track ring (textColor at 0.2 opacity)
|
||||
- Center number: `.system(size: 108, weight: .black, design: .rounded)`
|
||||
- "of XX": `.system(size: 28, weight: .light)`
|
||||
|
||||
**ShareMapSnapshotGenerator (UIKit CoreGraphics drawing):**
|
||||
- Stadium dots: 20pt diameter with 2pt white ring border. Visited ones get a small white checkmark drawn on top.
|
||||
- Route line: 6pt width (was 4pt)
|
||||
- City labels: Draw text size dynamically using `NSString.size(withAttributes:)`, then draw a rounded-rect background sized to fit. Use "START" and "END" labels for first/last stops. Use `.heavy` weight font.
|
||||
|
||||
### 4. AchievementCardGenerator.swift — Badge, Confetti, All 4 Card Types
|
||||
|
||||
**AchievementBadge:**
|
||||
- Outer gradient ring: `LinearGradient` of iconColor → iconColor.opacity(0.5), stroke width = size * 0.025
|
||||
- Inner fill: `RadialGradient` of iconColor.opacity(0.3) → iconColor.opacity(0.1)
|
||||
- Icon: size * 0.45 (slightly larger than current 0.4)
|
||||
- For earned achievements: thin gold (#FFD700) outer ring at full size
|
||||
- Subtle drop shadow on the whole badge
|
||||
- **New parameter:** `isEarned: Bool` (the old badge only took `definition` and `size`)
|
||||
|
||||
**ConfettiBurst — "Pyrotechnics":**
|
||||
- 36 particles (was 24)
|
||||
- 4 shape types: Circle, 6-pointed star (custom `StarShape`), Diamond (rotated rect), thin streamer Rectangle
|
||||
- Two burst rings: inner (150-350pt from center) and outer (380-550pt, at 0.6 opacity)
|
||||
- `goldHeavy: Bool` parameter — when true, uses gold palette (#FFD700, #FFC107, #FFE082, #B8860B, #FF6B35)
|
||||
- **Use deterministic seeded random** (hash-based, not `CGFloat.random`) so the layout is consistent across renders. Formula: `abs(seed &* 2654435761) % range`
|
||||
|
||||
**Spotlight Card:**
|
||||
- Blurred glow circle (glowColor, 420pt, blur 40) behind the badge
|
||||
- Decorative flanking lines: two 100pt accent-colored rectangles with a small circle between them
|
||||
- Achievement name: `.system(size: 52, weight: .heavy)` (NOT rounded)
|
||||
- Description: `.system(size: 26, weight: .light)`
|
||||
- Earned date in a pill: Capsule with surfaceColor fill + borderColor stroke
|
||||
|
||||
**Milestone Card:**
|
||||
- "MILESTONE" label: `.system(size: 26, weight: .black)`, tracking 6, in gold (#FFD700), with text shadow
|
||||
- Double ring around badge: gold outer (5pt, LinearGradient gold→darkGold), accent inner (3pt)
|
||||
- Badge at 460pt
|
||||
- Name text has a `RoundedRectangle` background with gold gradient (0.15→0.05 opacity)
|
||||
- Confetti with `goldHeavy: true`
|
||||
- Earned date in gold pill (gold text, gold-tinted capsule)
|
||||
|
||||
**Collection Card:**
|
||||
- Year in huge type: `.system(size: 72, weight: .black, design: .rounded)` in accent color
|
||||
- Sport label below in ALL CAPS tracked secondary text
|
||||
- 3-column `LazyVGrid` with each cell being a glass panel (surfaceColor + borderColor) containing badge (180pt) + name (2 lines)
|
||||
- Bottom: count in accent-tinted pill ("12 UNLOCKED" in tracked bold text)
|
||||
|
||||
**Context Card:**
|
||||
- Glass header bar (full-width RoundedRectangle, surfaceColor fill): badge (130pt) + name + "UNLOCKED" tracked text
|
||||
- Dotted connection line: 5 small circles vertically (accent at 0.3 opacity)
|
||||
- Map snapshot with shadow
|
||||
- Trip name in a glass banner at bottom ("Unlocked during" light + trip name bold)
|
||||
|
||||
### 5. ProgressCardGenerator.swift — Stadium Progress Card
|
||||
|
||||
- Custom header (not ShareCardHeader): sport icon in rounded rect + "STADIUM QUEST" in `.system(size: 36, weight: .heavy)` with `.tracking(3)`
|
||||
- If 100% complete: "COMPLETED" badge in gold capsule at top
|
||||
- Progress ring (redesigned version)
|
||||
- Below ring: percentage number in `.system(size: 56, weight: .black, design: .rounded)` + "% COMPLETE" tracked
|
||||
- Broadcast stats panel: visited / remain / trips
|
||||
- Map with themed border; gold border if complete
|
||||
- If 100% complete: swap accent color to gold for the progress ring
|
||||
|
||||
### 6. TripCardGenerator.swift — Trip Summary Card
|
||||
|
||||
- Title: "MY [SPORT] ROAD TRIP" (ALL CAPS) via ShareCardHeader
|
||||
- Map: larger frame (maxHeight: 680), with border and shadow
|
||||
- Date range: in a glass pill (Capsule with surfaceColor + borderColor)
|
||||
- Broadcast stats panel: miles / games / cities
|
||||
- City journey trail: horizontal `ScrollView` with numbered city badges
|
||||
- Each city: `HStack` of numbered circle (accent fill, white number) + 3-letter city abbreviation, inside a glass rounded rect
|
||||
- Arrow connectors between cities (SF Symbol `arrow.right`)
|
||||
|
||||
## Important Patterns
|
||||
|
||||
- All views use `ShareCardBackground(theme:sports:)` as background
|
||||
- All views are framed to `ShareCardDimensions.cardSize` (1080x1920)
|
||||
- All card views are `private struct` — only the `*Content` structs are public
|
||||
- Rendering happens via `ImageRenderer(content:)` with `scale = 3.0`
|
||||
- Keep all existing public API signatures unchanged (the `*Content` structs and their `render(theme:)` methods)
|
||||
- Glass panels = surfaceColor fill + borderColor stroke + corner radius 16-20
|
||||
- `ShareCardSportBackground`, `ShareCardBackground`, `ShareCardHeader`, `ShareCardFooter`, `ShareStatsRow`, `ShareProgressRing`, `ShareMapSnapshotGenerator` are NOT private — they're used across files
|
||||
- Achievement badge, confetti, star shape are private to AchievementCardGenerator
|
||||
|
||||
## Verification
|
||||
|
||||
After implementation, build with:
|
||||
```bash
|
||||
xcodebuild -project SportsTime.xcodeproj -scheme SportsTime -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' build
|
||||
```
|
||||
|
||||
The build must succeed with zero errors.
|
||||
109
docs/STORYBOARD_PACK.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# SportsTime Ad Storyboard Pack (10 Videos)
|
||||
|
||||
**Format:** 9:16 vertical (1080x1920), 30fps
|
||||
**Duration:** 12-16 seconds each
|
||||
**Date:** 2026-02-07
|
||||
|
||||
## Assumptions
|
||||
- App populated with 2026 season data across all 7 sports
|
||||
- Pro subscription unlocked for recording
|
||||
- 3+ saved trips exist (East Coast 5-city, Cross-Country, Regional 3-city)
|
||||
- 1+ group poll with 3 trip options and 4+ votes
|
||||
- 5-10 stadium visits logged across MLB/NBA for progress footage
|
||||
- 2-3 achievements earned (First Stadium, 5 Stadiums, one division)
|
||||
- Dark mode unless specified; animated background ON
|
||||
- All recordings are native screen recordings, scaled to 1080x1920 in post
|
||||
|
||||
---
|
||||
|
||||
## SECTION 0: FEATURE SHOWCASE DEFINITIONS
|
||||
|
||||
| Feature ID | Feature Name | User Outcome | Exact In-App Proof Moment | Why It Matters In Ad | Required Clip IDs | Overlay Copy (max 7 words) | Priority | Evidence File Path(s) |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| F01 | Trip Planning Wizard | Plan a multi-stop trip in minutes | Home > "Start Planning" > wizard steps > "Plan Trip" > results | Core value prop | CLIP-002,003,004,005,006,031 | "Plan your dream sports trip" | P1 | `Features/Trip/Views/Wizard/TripWizardView.swift` |
|
||||
| F02 | Schedule Browsing | Browse games across 7 sports | Schedule tab > sport chips > scroll game list | Shows data depth | CLIP-015,016,017 | "Every game. Every sport." | P1 | `Features/Schedule/Views/ScheduleListView.swift` |
|
||||
| F03 | Route Map | See optimized route on map | Trip Detail > hero map with golden polylines + markers | Visual hero shot | CLIP-009 | "Your route, optimized" | P1 | `Features/Trip/Views/TripDetailView.swift` |
|
||||
| F04 | Day-by-Day Itinerary | See full schedule with games + travel | Trip Detail > scroll day cards with games, travel | Tangible trip output | CLIP-011,012 | "Every day planned" | P1 | `Features/Trip/Views/TripDetailView.swift` |
|
||||
| F05 | Multiple Trip Options | Choose from ranked itineraries | After planning > options screen with sort/filter | Algorithm intelligence | CLIP-007 | "Pick your perfect route" | P2 | `Features/Trip/Views/TripOptionsView.swift` |
|
||||
| F06 | Save Trip | Save trip with one tap | Trip Detail > tap heart > spring animation | Low-friction commitment | CLIP-013 | "Save it. Go later." | P1 | `Features/Trip/Views/TripDetailView.swift` |
|
||||
| F07 | Stadium Progress | Track visited stadiums per league | Progress tab > rings + map + lists | Gamification, retention | CLIP-018,019,020 | "Track every stadium" | P2 | `Features/Progress/Views/ProgressTabView.swift` |
|
||||
| F08 | Achievements | Earn badges for milestones | Achievements grid > gold rings > detail sheet | Reward psychology | CLIP-021,022 | "Earn badges. Complete leagues." | P2 | `Features/Progress/Views/AchievementsListView.swift` |
|
||||
| F09 | Group Polls | Let friends vote on trip options | My Trips > create poll > share code > vote > results | Social/viral hook | CLIP-023,024,025,026 | "Plan trips with friends" | P2 | `Features/Polls/Views/PollDetailView.swift` |
|
||||
| F10 | PDF Export | Export magazine-style PDF | Trip Detail > export > progress overlay > complete | Premium utility | CLIP-027 | "Export your playbook" | P3 | `Export/PDFGenerator.swift` |
|
||||
| F11 | Share Cards | Share progress on social media | Share button > preview card > share sheet | Viral/social proof | CLIP-028 | "Share your adventure" | P3 | `Export/Sharing/ShareCardComponents.swift` |
|
||||
| F12 | Multi-Sport Coverage | 7 sports, 150+ stadiums | Wizard sport step > 7 checkboxes / Schedule chips | Breadth differentiator | CLIP-005,015,016 | "7 sports. 150+ stadiums." | P1 | `Core/Models/Domain/Sport.swift` |
|
||||
| F13 | Trip Score | Quality rating for trip plan | Trip Detail > score card with letter grade | Intelligence signal | CLIP-014 | "AI-scored trip quality" | P3 | `Planning/Scoring/TripScorer.swift` |
|
||||
| F14 | Route Stats | Cities, games, miles, hours at a glance | Trip Detail > stats row with icon pills | Quick comprehension | CLIP-010 | "See the full picture" | P2 | `Features/Trip/Views/TripDetailView.swift` |
|
||||
| F15 | EV Charging | EV charging stops along route | Trip Detail > travel segment > expand chargers | Modern differentiator | CLIP-034 | "EV-friendly road trips" | P3 | `Core/Models/Domain/TravelSegment.swift` |
|
||||
| F16 | Planning Modes | Date Range, Game First, Follow Team, Team First | Wizard > select planning mode | Flexibility | CLIP-003,029,030 | "Plan it your way" | P2 | `Features/Trip/Views/Wizard/TripWizardView.swift` |
|
||||
| F17 | Featured Trips | Browse curated suggestions by region | Home > featured trips carousel > swipe | Discovery/inspiration | CLIP-036 | "Get inspired" | P3 | `Features/Home/Views/HomeView.swift` |
|
||||
| F18 | Travel Segments | Driving distance/time between cities | Trip Detail > travel card (CityA > CityB + stats) | Practical logistics | CLIP-035 | "Know every mile" | P3 | `Features/Trip/Views/TripDetailView.swift` |
|
||||
|
||||
### Feature Coverage Rules
|
||||
|
||||
**Must appear in 3+ videos (P1):**
|
||||
- F01 (Trip Planning Wizard): V01, V02, V03, V04, V08, V10
|
||||
- F03 (Route Map): all 10 videos
|
||||
- F04 (Itinerary): V01, V04, V05, V06, V07, V08, V09
|
||||
- F06 (Save Trip): V01, V02, V03, V04, V05, V06, V08, V10
|
||||
- F12 (Multi-Sport): V01, V02, V03, V04, V08, V09, V10
|
||||
|
||||
**Can appear in 1-2 videos (P2/P3):**
|
||||
- F05 (Options): V02, V04
|
||||
- F07 (Progress): V01, V05
|
||||
- F08 (Achievements): V01, V05
|
||||
- F09 (Group Polls): V06
|
||||
- F10 (PDF Export): V07
|
||||
- F11 (Share Cards): V05, V07
|
||||
- F13 (Trip Score): V03, V09
|
||||
- F15 (EV Charging): V03, V09
|
||||
- F16 (Planning Modes): V02, V10
|
||||
|
||||
**Feature pairings (same video):**
|
||||
- F03 + F04 + F14: "trip output" trio (V01, V07, V09)
|
||||
- F01 + F05 + F06: "planning flow" trio (V02, V04)
|
||||
- F07 + F08 + F11: "gamification" trio (V05)
|
||||
- F02 + F12: "breadth" pair (V04, V08)
|
||||
- F03 + F18 + F15: "route detail" trio (V03, V09)
|
||||
|
||||
---
|
||||
|
||||
## SECTION 1: MASTER REUSABLE CLIP LIBRARY
|
||||
|
||||
| Clip ID | Screen | Exact Action to Record | Start State | End State | Raw Length | Capture Notes | Reused In |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| CLIP-001 | Home tab | App on home screen; animated background plays, hero card visible | Home tab selected, top of page | Hero card + top of featured section | 4s | No notifications. Let animated icons float 2 full cycles. Finger off screen. | V01,V02,V10 |
|
||||
| CLIP-002 | Home tab | Tap orange "Start Planning" button; wizard sheet rises | Hero card centered | Wizard modal sheet rising | 3s | Tap center of button. Wait for full spring animation + sheet appear. | V01,V02,V03,V04,V08,V10 |
|
||||
| CLIP-003 | Trip Wizard | Select "Date Range" planning mode radio button | Wizard open, no mode selected | "Date Range" highlighted blue | 2s | All modes deselected at start. Single clean tap. | V02,V10 |
|
||||
| CLIP-004 | Trip Wizard | Pick start date then end date using date pickers | Date step visible, no dates | Both dates selected, validation green | 4s | Dates 10+ days apart. Use dates with known games. Smooth date picker scrolls. | V02,V10 |
|
||||
| CLIP-005 | Trip Wizard | Tap 3 sport chips: MLB > NBA > NHL, each highlights | Sports step, none selected | 3 sports selected, colored chips | 3s | Pause 0.3s between taps. Tap center of each chip. | V01,V02,V03,V04,V08,V10 |
|
||||
| CLIP-006 | Trip Wizard | Tap "Plan Trip" button; loading spinner appears | Review step, all fields valid | Spinner active, "Generating..." | 3s | All required fields filled. Get button press + spinner start. | V02,V03 |
|
||||
| CLIP-007 | Trip Options | Options screen appears; 3+ cards with staggered entrance | Loading completes | 3+ option cards with stats visible | 3s | Ensure planning produces 3+ options. Capture staggered entrance. | V02,V04 |
|
||||
| CLIP-009 | Trip Detail | Map hero with golden route polylines and stop markers; zoom settles | Trip detail loaded | Map rendered with all routes + markers | 5s | Trip with 4-6 stops. Wait for polylines to render. Let map settle. **Most reused clip.** | All 10 |
|
||||
| CLIP-010 | Trip Detail | Stats row: calendar+days, mappin+cities, court+games, road+miles, car+hours | Header area visible | Stats row centered and readable | 3s | Trip with 5+ cities, 8+ games, 1000+ mi. | V03,V07,V09 |
|
||||
| CLIP-011 | Trip Detail | Scroll itinerary: Day 1 header, 2-3 game cards with sport color bars, matchups | Itinerary top | 2-3 game cards readable | 5s | Scroll slowly, constant speed. Different sport games for color variety. | V01,V04,V05,V06,V07,V08,V09 |
|
||||
| CLIP-012 | Trip Detail | Continue scrolling: travel segment + Day 2-3 games | After Day 1 | Travel card + Day 2 header + games | 5s | Same session as CLIP-011. Maintain scroll speed. | V07,V09 |
|
||||
| CLIP-013 | Trip Detail | Tap heart/save button; spring animation, heart fills red | Heart visible (outline) | Heart filled red, spring complete | 2s | Heart button clearly visible. Clean tap. Full spring animation (0.5s). | V01,V02,V03,V04,V05,V06,V08,V10 |
|
||||
| CLIP-014 | Trip Detail | Trip score card: large letter grade + 4 sub-scores | Scrolled to score section | Score card fully visible | 3s | Trip that scores A or A+. All 4 sub-scores readable. | V03,V09 |
|
||||
| CLIP-015 | Schedule tab | Tab loads: sport chips + initial game list with 2-3 games | Schedule tab selected | Chips + first game rows loaded | 3s | Games loaded. MLB pre-selected. | V04,V08 |
|
||||
| CLIP-016 | Schedule tab | Tap through 3 sport filters: MLB > NBA > NHL; list updates each | MLB selected | NHL selected, its games visible | 5s | Pause 0.8s per sport for list update. Team color dots change. | V04,V08 |
|
||||
| CLIP-017 | Schedule tab | Scroll game list showing 5-6 rows with badges, times, stadiums | One sport's games loaded | 5-6 rows scrolled | 4s | Scroll at reading speed. "TODAY" badge on one game. | V04,V08 |
|
||||
| CLIP-018 | Progress tab | Tab loads: league buttons with progress rings filling | Progress tab selected | Rings animated, sport buttons visible | 4s | 5-10 stadiums visited for ring progress. Capture ring fill on load. | V01,V05 |
|
||||
| CLIP-019 | Progress tab | Stadium map: green visited dots + gray unvisited dots | Map section visible | US map with colored dots | 3s | Visits in different regions for spread. Let map settle. | V05 |
|
||||
| CLIP-020 | Progress tab | Scroll visited stadium chips: green checkmarks, names, cities | Visited section header | 3-4 chips scrolled | 3s | 4+ stadiums visited. Scroll left slowly. Checkmarks visible. | V05 |
|
||||
| CLIP-021 | Achievements | Grid: 4-6 badges, mix of earned (gold ring) and locked | Achievements loaded | Grid with gold + locked badges | 4s | 2-3 achievements earned. Gold glow visible. | V01,V05 |
|
||||
| CLIP-022 | Achievements | Tap earned badge; detail sheet slides up with badge + date | Grid visible | Sheet open, "Earned on [date]" visible | 3s | Tap a visually appealing badge. Get sheet animation. | V05 |
|
||||
| CLIP-023 | My Trips tab | 3+ saved trip cards + "Group Polls" section header | Tab selected | Cards + poll section visible | 3s | 3+ saved trips. Cards show varied cities. Poll header in frame. | V06 |
|
||||
| CLIP-024 | Poll creation | Select 2-3 trips; checkmark on each selection | Poll sheet open | 2-3 trips checked | 3s | Pause between taps. Get checkmark animation. | V06 |
|
||||
| CLIP-025 | Poll detail | Share code card: large "AB3K7X" in orange monospace | Poll detail loaded | Code clearly readable | 3s | Use existing poll. Orange text readable. | V06 |
|
||||
| CLIP-026 | Poll detail | Voting results: bars fill, rank medals appear | Results section visible | Bars filled, rankings visible | 4s | 3+ votes. Capture bar animation. Get trophy/medal icons. | V06 |
|
||||
| CLIP-027 | Trip Detail | Tap export; progress overlay: ring fills, step text changes | Toolbar visible | Overlay at ~50-100% | 4s | Must be Pro. Capture ring fill + "Preparing > Rendering > Complete" text. | V07 |
|
||||
| CLIP-028 | Share preview | Preview card displayed with visual, "Share" button below | Share sheet open | Card preview visible | 3s | Trigger from progress share. Get rendered card. | V05,V07 |
|
||||
| CLIP-029 | Trip Wizard | Select "Game First" planning mode | Wizard open, no mode selected | "Game First" highlighted | 2s | Record separately from CLIP-003. | V10 |
|
||||
| CLIP-030 | Trip Wizard | Game picker: type team name, select 2 games | Game picker, search empty | 2 games checked | 4s | Type "Yankees" or similar. Tap 2 games. | V10 |
|
||||
| CLIP-031 | Trip Wizard | Select regions: tap East + Central | Regions step, none selected | East + Central highlighted | 2s | Clean taps on region chips. | V10 |
|
||||
| CLIP-034 | Trip Detail | EV charger section expands: green dots + charger names + type badges | Travel segment, EV collapsed | 2-3 chargers visible | 3s | Trip with EV enabled. Segment with 2+ chargers. | V03,V09 |
|
||||
| CLIP-035 | Trip Detail | Travel segment card: car icon, "Boston > New York", "215 mi - 3h 45m" | Scrolled to travel segment | Card centered and readable | 3s | Recognizable cities. Card centered. | V03,V09 |
|
||||
| CLIP-037 | Trip Detail | Sport badges row: colored capsules ("MLB", "NBA", "NHL") | Header area | Badge capsules visible | 2s | Multi-sport trip (3+ sports). Color variety. | V08,V09 |
|
||||
|
||||
**Total unique clips: 33**
|
||||
350
docs/STORYBOARD_PRODUCTION.md
Normal file
@@ -0,0 +1,350 @@
|
||||
# SECTION 3: REUSE MATRIX
|
||||
|
||||
Rows = Clip IDs, Columns = Videos. Cell = timecode range where used. Empty = not used.
|
||||
|
||||
| Clip ID | V01 | V02 | V03 | V04 | V05 | V06 | V07 | V08 | V09 | V10 | Total Uses |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| CLIP-001 | 0.0-1.5 | 0.0-1.0 | — | — | — | — | — | — | — | 0.0-1.0 | 3 |
|
||||
| CLIP-002 | 1.5-2.5 | 1.0-2.0 | 0.0-1.0 | 5.0-6.0 | — | — | — | 6.0-7.0 | — | 1.0-2.0 | 6 |
|
||||
| CLIP-003 | — | 2.0-3.0 | — | — | — | — | — | — | — | 2.0-3.0 | 2 |
|
||||
| CLIP-004 | — | 3.0-4.5 | — | — | — | — | — | — | — | 6.0-7.0 | 2 |
|
||||
| CLIP-005 | 2.5-4.0 | 4.5-5.5 | 1.0-2.0 | 6.0-7.0 | — | — | — | 7.0-8.0 | — | 8.5-9.5 | 6 |
|
||||
| CLIP-006 | — | 5.5-7.0 | 2.0-3.0 | — | — | — | — | — | — | — | 2 |
|
||||
| CLIP-007 | — | 7.0-8.5 | — | 7.0-8.0 | — | — | — | — | — | — | 2 |
|
||||
| CLIP-009 | 4.0-6.0 | 8.5-10.5 | 3.0-5.5 | 8.0-10.0 | 10.5-12.0 | 7.0-9.0 | 0.0-1.5 | 8.0-10.0 | 0.0-2.0 | 9.5-11.0 | **10** |
|
||||
| CLIP-010 | — | — | 5.5-7.0 | — | — | — | 9.5-11.0 | — | 2.0-3.5 | — | 3 |
|
||||
| CLIP-011 | 6.0-8.0 | — | — | 10.0-12.0 | — | 9.0-10.5 | 1.5-3.5 | 11.0-13.0 | 4.5-7.5 | — | **7** (tied 2nd) |
|
||||
| CLIP-012 | — | — | — | — | — | — | 3.5-5.5 | — | 7.5-10.0 | — | 2 |
|
||||
| CLIP-013 | 11.0-12.0 | 10.5-11.5 | 11.5-12.5 | 12.0-12.5 | 12.0-13.0 | 10.5-11.5 | — | 13.0-13.5 | — | 11.0-12.0 | **8** |
|
||||
| CLIP-014 | — | — | 10.0-11.5 | — | — | — | — | — | 13.0-14.5 | — | 2 |
|
||||
| CLIP-015 | — | — | — | 0.0-1.5 | — | — | — | 0.0-1.5 | — | — | 2 |
|
||||
| CLIP-016 | — | — | — | 1.5-3.5 | — | — | — | 1.5-4.5 | — | — | 2 |
|
||||
| CLIP-017 | — | — | — | 3.5-5.0 | — | — | — | 4.5-6.0 | — | — | 2 |
|
||||
| CLIP-018 | 8.0-9.5 | — | — | — | 0.0-2.0 | — | — | — | — | — | 2 |
|
||||
| CLIP-019 | — | — | — | — | 2.0-4.0 | — | — | — | — | — | 1 |
|
||||
| CLIP-020 | — | — | — | — | 4.0-5.5 | — | — | — | — | — | 1 |
|
||||
| CLIP-021 | 9.5-11.0 | — | — | — | 5.5-7.5 | — | — | — | — | — | 2 |
|
||||
| CLIP-022 | — | — | — | — | 7.5-9.0 | — | — | — | — | — | 1 |
|
||||
| CLIP-023 | — | — | — | — | — | 0.0-1.5 | — | — | — | — | 1 |
|
||||
| CLIP-024 | — | — | — | — | — | 1.5-3.5 | — | — | — | — | 1 |
|
||||
| CLIP-025 | — | — | — | — | — | 3.5-5.0 | — | — | — | — | 1 |
|
||||
| CLIP-026 | — | — | — | — | — | 5.0-7.0 | — | — | — | — | 1 |
|
||||
| CLIP-027 | — | — | — | — | — | — | 5.5-8.0 | — | — | — | 1 |
|
||||
| CLIP-028 | — | — | — | — | 9.0-10.5 | — | 8.0-9.5 | — | — | — | 2 |
|
||||
| CLIP-029 | — | — | — | — | — | — | — | — | — | 3.0-4.5 | 1 |
|
||||
| CLIP-030 | — | — | — | — | — | — | — | — | — | 4.5-6.0 | 1 |
|
||||
| CLIP-031 | — | — | — | — | — | — | — | — | — | 7.0-8.5 | 1 |
|
||||
| CLIP-034 | — | — | 8.5-10.0 | — | — | — | — | — | 11.5-13.0 | — | 2 |
|
||||
| CLIP-035 | — | — | 7.0-8.5 | — | — | — | — | — | 10.0-11.5 | — | 2 |
|
||||
| CLIP-037 | — | — | — | — | — | — | — | 10.0-11.0 | 3.5-4.5 | — | 2 |
|
||||
|
||||
### Summary Stats
|
||||
|
||||
| Metric | Value |
|
||||
|---|---|
|
||||
| **Total unique clips** | 33 |
|
||||
| **Clips used in 2+ videos** | 22 (67%) |
|
||||
| **Clips used in 1 video only** | 11 (33%) |
|
||||
| **Total shot placements** | 83 |
|
||||
| **Reused placements** (from multi-use clips) | 72 (87%) |
|
||||
| **Total video duration** | 143s |
|
||||
| **Seconds from shared clips** | ~124s (87%) |
|
||||
| **Seconds from single-use clips** | ~19s (13%) |
|
||||
| **Footage reuse rate** | **87%** (target was 70%) |
|
||||
| **Most reused clip** | CLIP-009 (map hero) — all 10 videos |
|
||||
| **2nd most reused** | CLIP-013 (save heart) — 8 videos |
|
||||
| **3rd most reused** | CLIP-011 (itinerary scroll) — 7 videos |
|
||||
|
||||
### Net New Clips Per Video
|
||||
|
||||
| Video | Total Clips Used | Net New (single-use) | % Shared |
|
||||
|---|---|---|---|
|
||||
| V01 | 8 | 0 | 100% |
|
||||
| V02 | 9 | 0 | 100% |
|
||||
| V03 | 9 | 0 | 100% |
|
||||
| V04 | 9 | 0 | 100% |
|
||||
| V05 | 8 | 3 (019,020,022) | 63% |
|
||||
| V06 | 7 | 4 (023,024,025,026) | 43% |
|
||||
| V07 | 6 | 1 (027) | 83% |
|
||||
| V08 | 9 | 0 | 100% |
|
||||
| V09 | 8 | 0 | 100% |
|
||||
| V10 | 10 | 3 (029,030,031) | 70% |
|
||||
|
||||
---
|
||||
|
||||
# SECTION 4: CAPTURE DAY SHOT LIST
|
||||
|
||||
Record in app-flow order to minimize navigation. Grouped by screen to batch efficiently.
|
||||
|
||||
## Group A: Home Tab (3 clips)
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | CLIP-001 | 1. Open app, ensure Home tab selected. 2. Scroll to top if needed. 3. Wait for animated background to cycle. 4. Record 4s with finger off screen. | Normal | 2 | Don't touch screen. No notifications. Ensure hero card text fully visible. |
|
||||
| 2 | CLIP-002 | 1. Position so hero card "Start Planning" button is centered. 2. Tap button cleanly in center. 3. Hold recording through sheet rise animation. | Normal | 3 | Don't tap edge of button. Wait for full spring animation. Don't dismiss the sheet yet. |
|
||||
| 3 | — | Dismiss wizard sheet (prep for next group). | — | — | — |
|
||||
|
||||
## Group B: Trip Wizard - Date Range Mode (5 clips)
|
||||
|
||||
Start fresh: Tap "Start Planning" from home, then record each step.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 4 | CLIP-003 | 1. Wizard open, no mode selected. 2. Tap "Date Range" radio button. 3. Hold 0.5s showing blue highlight. | Normal | 2 | Ensure all modes deselected at start. Single clean tap. |
|
||||
| 5 | CLIP-004 | 1. Scroll to Dates step. 2. Tap start date picker, scroll to target month, tap day. 3. Tap end date picker, scroll, tap day. 4. Dates should be 10-14 days apart. | Slow | 3 | Smooth date picker scrolling. Don't overshoot months. Pick dates with games (e.g., late June for MLB). |
|
||||
| 6 | CLIP-005 | 1. Scroll to Sports step. 2. Tap MLB chip (pause 0.3s). 3. Tap NBA chip (pause 0.3s). 4. Tap NHL chip. | Normal | 2 | Even spacing between taps. Tap center of chips. All 3 should show selected state. |
|
||||
| 7 | CLIP-031 | 1. Scroll to Regions step. 2. Tap "East" chip. 3. Tap "Central" chip. | Normal | 2 | Clean taps. Both chips highlighted after. |
|
||||
| 8 | CLIP-006 | 1. Scroll to Review step. 2. Verify all fields valid (no red text). 3. Tap orange "Plan Trip" button. 4. Hold through loading spinner. | Normal | 2 | All fields must be valid. Get button press animation + spinner. Don't stop recording until spinner visible. |
|
||||
|
||||
## Group C: Trip Wizard - Game First Mode (2 clips)
|
||||
|
||||
Dismiss and re-open wizard for fresh state.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 9 | CLIP-029 | 1. Wizard open, no mode selected. 2. Tap "Game First" radio button. | Normal | 2 | Must be different recording from CLIP-003. |
|
||||
| 10 | CLIP-030 | 1. Game picker visible. 2. Tap search field, type "Yankees" (or similar popular team). 3. Wait for results. 4. Tap first game (checkmark appears). 5. Tap second game. | Slow | 3 | Type slowly for readability. Pause after each selection. Get checkmark animations. |
|
||||
|
||||
## Group D: Trip Options (1 clip)
|
||||
|
||||
Let the planning engine complete from Group B's recording, or trigger a fresh plan.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 11 | CLIP-007 | 1. Planning completes. 2. Trip Options screen loads. 3. Record the staggered card entrance (3+ options). | Normal | 2 | Ensure planning produces 3+ options (use broad date range + multiple sports). Capture entrance animation. |
|
||||
|
||||
## Group E: Trip Detail - Map & Header (5 clips)
|
||||
|
||||
Select a trip with 4-6 stops, multiple sports, 1000+ miles, EV charging enabled.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 12 | CLIP-009 | 1. Open trip detail. 2. Let map render fully (golden polylines + all markers). 3. Record 5s of settled map. | Normal | 3 | **Critical clip.** Wait for ALL polylines. Let map zoom settle. No touch. Use trip with 4-6 stops for visual density. |
|
||||
| 13 | CLIP-010 | 1. Scroll to show stats row (just below map). 2. Hold with stats centered and readable. | Normal | 2 | All 5 stat pills visible. Numbers should be impressive (5+ cities, 8+ games). |
|
||||
| 14 | CLIP-037 | 1. Sport badges row visible below header. 2. Hold showing colored capsules. | Normal | 1 | Use multi-sport trip (3+ sports). |
|
||||
| 15 | CLIP-014 | 1. Scroll to trip score card. 2. Hold showing letter grade + 4 sub-scores. | Normal | 2 | Trip must score A or A+. All sub-scores readable. |
|
||||
| 16 | CLIP-013 | 1. Scroll back up so heart button visible. 2. Tap heart. 3. Hold through spring animation + red fill. | Normal | 3 | Heart must start unfilled. Clean single tap. Full spring animation (0.5s). |
|
||||
|
||||
## Group F: Trip Detail - Itinerary Scroll (5 clips)
|
||||
|
||||
Same trip as Group E. Record as one continuous take, then cut in post.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 17 | CLIP-011 | 1. Start at itinerary top. 2. Scroll slowly downward. 3. Pass Day 1 header, then 2-3 game cards with sport color bars. | Slow | 3 | Constant scroll speed. Don't pause. Different sports for color variety. Record as part of continuous scroll. |
|
||||
| 18 | CLIP-012 | 1. Continue scrolling from CLIP-011. 2. Travel segment appears (car icon, city>city). 3. Day 2 header + games. | Slow | (same take) | Maintain same speed. Get travel card clearly visible. |
|
||||
| 19 | CLIP-035 | 1. Pause scroll on a travel segment. 2. Hold with card centered: "Boston > New York, 215 mi, 3h 45m". | Normal | 2 | Recognizable cities. Card fully readable. |
|
||||
| 20 | CLIP-034 | 1. Find travel segment with EV chargers (collapsed). 2. Tap expand chevron. 3. Green dots + charger names + type badges appear. | Normal | 2 | Trip must have EV enabled and segment with 2+ chargers. Get expand animation. |
|
||||
|
||||
## Group G: Trip Detail - Export (1 clip)
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 21 | CLIP-027 | 1. Tap export button in toolbar. 2. Progress overlay appears: ring fills, step text changes ("Preparing..." > "Rendering..." > percentage). 3. Record until ~50-100% or complete. | Normal | 2 | Must be Pro. Capture ring fill animation + changing text. Don't dismiss until good footage captured. |
|
||||
|
||||
## Group H: Schedule Tab (3 clips)
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 22 | CLIP-015 | 1. Tap Schedule tab. 2. Sport chips load + game list populates. 3. Record initial loaded state with MLB pre-selected. | Normal | 2 | Ensure games loaded. Get chips + first 2-3 game rows. |
|
||||
| 23 | CLIP-016 | 1. Starting with MLB selected. 2. Tap NBA chip (pause 0.8s, list updates). 3. Tap NHL chip (pause 0.8s, list updates). 4. Tap MLS chip (pause 0.8s). | Slow | 3 | Pause long enough for list refresh animation. Get team color dots changing. Record one continuous take. |
|
||||
| 24 | CLIP-017 | 1. One sport selected, game list visible. 2. Scroll down through 5-6 game rows. 3. Try to have a "TODAY" badge visible. | Normal | 2 | Reading-speed scroll. Badges, times, stadiums readable. |
|
||||
|
||||
## Group I: Progress Tab (3 clips)
|
||||
|
||||
Ensure 5-10 stadium visits logged beforehand.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 25 | CLIP-018 | 1. Tap Progress tab. 2. League selector loads with progress rings filling. 3. Record the ring fill animation. | Normal | 3 | Must be Pro. Rings need visible fill (not empty, not 100%). Capture the animation on load. |
|
||||
| 26 | CLIP-019 | 1. Scroll to stadium map. 2. Green dots (visited) + gray dots (unvisited) across US. 3. Hold. | Normal | 2 | Visits in different regions. Let map settle. |
|
||||
| 27 | CLIP-020 | 1. Scroll to visited stadiums section. 2. Horizontal scroll through chips (green checkmarks, names). | Normal | 2 | 4+ visited for visual content. Slow left scroll on chips. |
|
||||
|
||||
## Group J: Achievements (2 clips)
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 28 | CLIP-021 | 1. Navigate to Achievements list. 2. Record grid: gold-ringed earned badges + locked badges. | Normal | 2 | 2-3 earned. Gold glow visible. Mix of earned + locked. |
|
||||
| 29 | CLIP-022 | 1. Tap one earned achievement badge. 2. Detail sheet slides up: large badge, description, "Earned on [date]". | Normal | 2 | Tap visually appealing badge. Capture full sheet animation. |
|
||||
|
||||
## Group K: Polls (4 clips)
|
||||
|
||||
Create poll with 3 trip options + 4 votes beforehand.
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 30 | CLIP-023 | 1. Tap My Trips tab. 2. Record showing 3+ saved trip cards + "Group Polls" section. | Normal | 2 | 3+ trips visible. Poll section in frame. |
|
||||
| 31 | CLIP-024 | 1. Tap "+" to create poll. 2. Select 2-3 trips (checkmark per selection). | Normal | 2 | Pause between taps. Get checkmark animation. |
|
||||
| 32 | CLIP-025 | 1. Open existing poll detail. 2. Share code card: "AB3K7X" in large orange text. | Normal | 1 | Code clearly readable at 9:16 scale. |
|
||||
| 33 | CLIP-026 | 1. Scroll to results section. 2. Progress bars fill, rank medals visible. | Normal | 2 | Need 3+ votes for animated bars. Trophy/medal icons visible. Capture fill animation. |
|
||||
|
||||
## Group L: Share (1 clip)
|
||||
|
||||
| # | Clip ID | Recording Steps | Speed | Takes | Mistakes to Avoid |
|
||||
|---|---|---|---|---|---|
|
||||
| 34 | CLIP-028 | 1. From Progress tab, tap Share button. 2. Share preview card renders. 3. Hold showing card preview + "Share" button. | Normal | 2 | Get a clean rendered card. Alternatively trigger from Trip Detail share. |
|
||||
|
||||
**Total recordings: 34 clips across ~12 screen groups**
|
||||
**Estimated recording time: 45-60 minutes** (with setup, navigation, retakes)
|
||||
|
||||
---
|
||||
|
||||
# SECTION 5: REMOTION HANDOFF NOTES
|
||||
|
||||
## V01: "The Full Play"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `the-full-play` |
|
||||
| **Background** | Dark gradient base (#0D0D0D to #1A1A2E), subtle animated particles |
|
||||
| **Type style** | Bold sans-serif (Inter Black or SF Pro Display Heavy). Hook text: 48px, centered. Feature labels: 24px, positioned above clip. |
|
||||
| **Transitions** | Whip-pan (fast horizontal slide, 4-6 frame duration). Between map/itinerary: zoom-through. |
|
||||
| **Overlays** | Feature name labels fade in 0.2s before clip, persist during clip. Orange (#FF6B35) accent underline on each label. |
|
||||
| **Audio** | Upbeat electronic, 120-130 BPM. Bass drop at 4.0s (map reveal). Bell ding at 12.0s (CTA). |
|
||||
|
||||
## V02: "Zero to Trip"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `zero-to-trip` |
|
||||
| **Background** | Clean dark (#111111), minimal distractions — let app speak |
|
||||
| **Type style** | Monospaced step counter in top-right corner (SF Mono, 16px, white 60% opacity). "Step 1", "Step 2" etc. Hook: casual handwritten feel (36px). |
|
||||
| **Transitions** | Direction-matched swipes: each clip enters from the direction of wizard flow (bottom-up for sheet, left-right for steps). 6-8 frame duration. |
|
||||
| **Overlays** | Step counter persistent. "3 routes found!" text pops in with scale animation at 7.0s. |
|
||||
| **Audio** | Building momentum track. Each step gets a click. Swell builds through steps. Pop SFX at 7.0s. Bass at 8.5s. |
|
||||
|
||||
## V03: "Route Revealed"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `route-revealed` |
|
||||
| **Background** | Deep navy (#0A1628) to suggest nighttime/maps aesthetic |
|
||||
| **Type style** | Elegant serif (Playfair Display or NYT Cheltenham). Hook: 40px, centered, letter-spaced +2px. Feature labels: 20px italic. |
|
||||
| **Transitions** | Slow dissolves (12-15 frame crossfade). Map reveal: slow iris-open or expanding circle. |
|
||||
| **Overlays** | "Optimizing..." text with pulsing opacity during CLIP-006. Minimal text — let visuals breathe. Gold route line motif in lower third. |
|
||||
| **Audio** | Cinematic ambient, slow build. Soft piano or strings. Bass swell at 3.0s (map). No hard beats until score reveal. |
|
||||
|
||||
## V04: "Every Game"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `every-game` |
|
||||
| **Background** | Dark with sports broadcast aesthetic — subtle grid lines, ticker feel |
|
||||
| **Type style** | Condensed sports font (Oswald Bold or ESPN-style). Hook: 52px, caps. "Browse 1000+ games": scrolling ticker at bottom. |
|
||||
| **Transitions** | Horizontal swipes matching sport filter direction. Quick cuts (3-4 frames) between schedule and planning. |
|
||||
| **Overlays** | Sport color bar at top edge that changes color with each sport filter tap (MLB red > NBA orange > NHL blue). "1000+" counter animates up. |
|
||||
| **Audio** | Sports broadcast energy, stadium crowd ambience layer. Whoosh per sport switch. Scoreboard-style ticking for game scroll. |
|
||||
|
||||
## V05: "Stadium Quest"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `stadium-quest` |
|
||||
| **Background** | Dark with gold particle effects (#FFD700 particles floating) |
|
||||
| **Type style** | Achievement-unlock style: bold rounded (Nunito Black). Hook: 44px. Badge labels: pop-in scale animation. Gold color for earned text. |
|
||||
| **Transitions** | Pop/bounce (spring curve, overshoot 1.2x then settle). Scale-in for each new section. |
|
||||
| **Overlays** | Gold ring motif around clip borders when showing achievements. Sparkle particles on earned badges. Progress bar graphic overlaid at bottom during map shot. |
|
||||
| **Audio** | Gamification music — playful, achievement-y (think mobile game victory). Ring fill SFX (ascending tone). Unlock jingle at 7.5s. |
|
||||
|
||||
## V06: "Squad Goals"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `squad-goals` |
|
||||
| **Background** | Dark with gradient purple-to-blue social vibe (#2D1B69 to #1B3A69) |
|
||||
| **Type style** | Rounded friendly (Poppins SemiBold). Hook: 44px. Labels in chat-bubble containers (rounded rect, white bg, dark text). |
|
||||
| **Transitions** | Slide-in from alternating sides (left, right, left) like a conversation. Share code: pop-in with bounce. |
|
||||
| **Overlays** | Chat-bubble-style containers for text labels. Share code gets highlighted glow. Vote bars use gradient fills (gold for winner). Confetti particle burst on "Winning trip". |
|
||||
| **Audio** | Upbeat social/fun track. Message "sent" SFX at 3.5s. Drum roll building at 5.0s. Celebration SFX at 7.0s. |
|
||||
|
||||
## V07: "Your Playbook"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `your-playbook` |
|
||||
| **Background** | Warm dark cream/paper tone (#1C1A17), suggests printed document |
|
||||
| **Type style** | Serif editorial (Georgia or Lora). Hook: 38px, centered, elegant. "Export as PDF" in small caps. |
|
||||
| **Transitions** | Page-turn effect (3D perspective rotation) between itinerary clips. Slide-reveal for export overlay. |
|
||||
| **Overlays** | Subtle paper texture overlay at 5% opacity. Magazine crop-mark motif in corners. PDF icon graphic animates in during export clip. |
|
||||
| **Audio** | Premium/sophisticated — soft jazz or lo-fi. Paper turn SFX. Completion chime at export finish. |
|
||||
|
||||
## V08: "All Sports"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `all-sports` |
|
||||
| **Background** | Dark base, full-screen color-wipe transitions using sport brand colors |
|
||||
| **Type style** | Bold condensed (Bebas Neue or Impact). Hook: 56px, caps, white on sport-color bg. Sport names: 36px in sport's color. |
|
||||
| **Transitions** | Color-wipe: each sport transition wipes screen in that sport's brand color (MLB red wipe > NBA orange wipe > NHL blue wipe). Fast, 4-5 frames. |
|
||||
| **Overlays** | Sport color bar across full top during each sport section. Sport icon (SF Symbol) animates in corner during filter taps. "One trip. Every sport." fades in over badges. |
|
||||
| **Audio** | High-energy, fast tempo (140+ BPM). Stadium horn hit per sport switch. Bass drop at map reveal. |
|
||||
| **Sport brand colors** | MLB: #E31937, NBA: #F58426, NHL: #0038A8, NFL: #013369, MLS: #80B214, WNBA: #BF2F38, NWSL: #0D5C63 |
|
||||
|
||||
## V09: "Day by Day"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `day-by-day` |
|
||||
| **Background** | Clean dark (#111827), calendar/planner aesthetic |
|
||||
| **Type style** | Clean sans-serif (Inter Regular). Hook: 36px serif for contrast. "Day 1" / "Day 2" labels: 20px, monospaced, left-aligned with calendar icon. |
|
||||
| **Transitions** | Continuous vertical scroll simulation — each clip enters from bottom, exits top. No hard cuts in itinerary section. Slow dissolves for non-itinerary clips. |
|
||||
| **Overlays** | Day number labels appear pinned to left edge as itinerary scrolls. Subtle dotted timeline line along left side connecting days. Green accent dot on EV section. |
|
||||
| **Audio** | Calm, organized — ambient electronic or lo-fi beat. Soft "day change" chime at 7.5s. Green ding at 11.5s (EV). |
|
||||
|
||||
## V10: "Your Rules"
|
||||
|
||||
| Attribute | Specification |
|
||||
|---|---|
|
||||
| **Composition name** | `your-rules` |
|
||||
| **Background** | Dark with split-screen capability (#0F0F0F), morph-ready |
|
||||
| **Type style** | Variable weight (Inter Thin to Inter Black). Hook: 42px, weights animate thin>bold. "Pick dates?" / "Pick games?": toggle-switch style labels that flip. |
|
||||
| **Transitions** | Morph/crossfade: each planning mode morphs into the next (shared elements stay, different elements cross-dissolve). 8-10 frame duration. Mode switch uses flip animation. |
|
||||
| **Overlays** | Toggle-switch graphic that flips between mode names. Region selection gets a mini-map outline overlay. "Built your way" text morphs letter-by-letter. |
|
||||
| **Audio** | Empowering/confident track. Toggle "click" SFX at each mode switch. Build through options. Bass drop at map (9.5s). |
|
||||
|
||||
---
|
||||
|
||||
## Global Remotion Notes
|
||||
|
||||
**Shared across all compositions:**
|
||||
- All clips are `<OffthreadVideo>` components with `startFrom` and `endAt` for trimming
|
||||
- CTA end card is a shared `<CTAEndCard>` component accepting `headlineText` and `ctaStyle` props
|
||||
- Text overlays use `<spring>` for entrance animations (config: damping 12, mass 0.5)
|
||||
- All text should have slight text-shadow for readability over app footage (0 2px 8px rgba(0,0,0,0.8))
|
||||
- Background audio per video: separate audio file, normalized to -14 LUFS
|
||||
- SFX layer: separate track, timed to frame
|
||||
- Export at 30fps, 1080x1920, H.264 for social, ProRes for archival
|
||||
- Each composition accepts `clipDirectory` prop pointing to recorded footage folder
|
||||
|
||||
**Composition ID naming:** All IDs use lowercase + hyphens only (Remotion constraint). No underscores.
|
||||
|
||||
**Suggested project structure:**
|
||||
```
|
||||
src/
|
||||
compositions/
|
||||
TheFullPlay.tsx
|
||||
ZeroToTrip.tsx
|
||||
RouteRevealed.tsx
|
||||
EveryGame.tsx
|
||||
StadiumQuest.tsx
|
||||
SquadGoals.tsx
|
||||
YourPlaybook.tsx
|
||||
AllSports.tsx
|
||||
DayByDay.tsx
|
||||
YourRules.tsx
|
||||
components/
|
||||
shared/
|
||||
CTAEndCard.tsx
|
||||
TextOverlay.tsx
|
||||
ClipPlayer.tsx
|
||||
SportColorWipe.tsx
|
||||
transitions/
|
||||
WhipPan.tsx
|
||||
ColorWipe.tsx
|
||||
PageTurn.tsx
|
||||
MorphFade.tsx
|
||||
clips/ <- recorded footage
|
||||
audio/
|
||||
music/ <- per-video background tracks
|
||||
sfx/ <- shared SFX library
|
||||
```
|
||||
234
docs/STORYBOARD_VIDEOS.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# SECTION 2: VIDEO STORYBOARDS
|
||||
|
||||
---
|
||||
|
||||
## V01: "The Full Play"
|
||||
|
||||
**Concept:** Fast-paced montage showcasing the full breadth of SportsTime
|
||||
**Creative angle:** Rapid-fire tour of every major feature in one video
|
||||
**Target duration:** 15s
|
||||
**Primary feature:** F01 (Trip Planning) | **Secondary:** F07 (Progress), F08 (Achievements)
|
||||
**Design language:** Bold sans-serif, kinetic text reveals, whip-pan cuts, energetic/aspirational
|
||||
**Hook (first 1.5s):** "Plan Epic Sports Road Trips" — large kinetic text over animated home background
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why this shot exists |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.5 | 1.5s | CLIP-001 | Home screen, animated sports icons float, hero card | — | **"Plan Epic Sports Road Trips"** | Fade from black, text kinetic reveal word-by-word | Upbeat music starts, bass swell | Hook — establishes identity and visual polish |
|
||||
| 1.5-2.5 | 1.0s | CLIP-002 | Tap "Start Planning", wizard sheet rises | F01 | — | Quick zoom-cut, sheet slides up | Click SFX | Shows primary CTA action |
|
||||
| 2.5-4.0 | 1.5s | CLIP-005 | Select MLB > NBA > NHL sport chips | F12 | "7 Sports" | Whip pan in | Tap SFX x3 rapid | Shows multi-sport breadth |
|
||||
| 4.0-6.0 | 2.0s | CLIP-009 | Map hero with golden routes + stop markers | F03 | "Optimized Routes" | Zoom-through into map | Bass drop on reveal | Hero visual — the money shot |
|
||||
| 6.0-8.0 | 2.0s | CLIP-011 | Scroll itinerary with game cards (sport color bars) | F04 | "Day-by-Day Plans" | Slide up transition | Steady beat | Shows tangible output |
|
||||
| 8.0-9.5 | 1.5s | CLIP-018 | Progress rings filling for stadiums | F07 | "Track Progress" | Quick cut | Ding SFX | Gamification hook |
|
||||
| 9.5-11.0 | 1.5s | CLIP-021 | Achievement badges grid (gold earned + locked) | F08 | "Earn Badges" | Pop/bounce transition | Achievement SFX | Reward psychology |
|
||||
| 11.0-12.0 | 1.0s | CLIP-013 | Heart/save tap, spring animation | F06 | — | Quick cut | Tap + whoosh | Emotional micro-moment |
|
||||
| 12.0-15.0 | 3.0s | — | App icon + "SportsTime" + App Store badge | — | **"Plan Your Trip Today"** | Scale-in with orange glow, hold | Music resolve, bell ding | CTA |
|
||||
|
||||
---
|
||||
|
||||
## V02: "Zero to Trip"
|
||||
|
||||
**Concept:** Watch a complete trip planned start-to-finish in one seamless flow
|
||||
**Creative angle:** Speed and ease — the whole journey in 14 seconds
|
||||
**Target duration:** 14s
|
||||
**Primary feature:** F01 (Planning Wizard) | **Secondary:** F16 (Planning Modes), F05 (Options)
|
||||
**Design language:** Continuous flow, direction-matched swipes, step counter in corner, efficient/satisfying
|
||||
**Hook (first 1.0s):** "Watch This" — casual, scroll-stopping
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.0 | 1.0s | CLIP-001 | Home screen, hero card | — | **"Watch This"** | Quick fade in | Anticipation build | Hook — creates curiosity |
|
||||
| 1.0-2.0 | 1.0s | CLIP-002 | Tap "Start Planning" | F01 | "Step 1" (small) | Sheet slide up matches direction | Click SFX | Start the flow |
|
||||
| 2.0-3.0 | 1.0s | CLIP-003 | Select "Date Range" mode | F16 | "Step 2" | Cross-dissolve | Tap SFX | Mode selection |
|
||||
| 3.0-4.5 | 1.5s | CLIP-004 | Pick start + end dates | F01 | "Step 3" | Smooth swipe | Scroll SFX | Date selection |
|
||||
| 4.5-5.5 | 1.0s | CLIP-005 | Tap MLB + NBA + NHL | F12 | "Step 4" | Smooth swipe | Tap SFX x3 | Sport selection |
|
||||
| 5.5-7.0 | 1.5s | CLIP-006 | Tap "Plan Trip", spinner | F01 | "Step 5" | Button press effect | Building swell | Trigger planning |
|
||||
| 7.0-8.5 | 1.5s | CLIP-007 | Trip options appear, staggered cards | F05 | "3 routes found!" | Cards slide in from bottom | Pop SFX per card | Algorithm output |
|
||||
| 8.5-10.5 | 2.0s | CLIP-009 | Map hero golden routes | F03 | "Your Trip" | Zoom into map | Bass drop | The payoff |
|
||||
| 10.5-11.5 | 1.0s | CLIP-013 | Save trip (heart) | F06 | — | Quick cut | Heart beat SFX | Commitment |
|
||||
| 11.5-14.0 | 2.5s | — | App icon + "60 Seconds to Your Dream Trip" | — | **"Download SportsTime"** | Scale-in, hold | Music resolve | CTA |
|
||||
|
||||
---
|
||||
|
||||
## V03: "Route Revealed"
|
||||
|
||||
**Concept:** Cinematic focus on the visual beauty of route planning and map output
|
||||
**Creative angle:** Let the map breathe — wanderlust energy
|
||||
**Target duration:** 14s
|
||||
**Primary feature:** F03 (Route Map) | **Secondary:** F13 (Trip Score), F15 (EV Charging)
|
||||
**Design language:** Cinematic, minimal elegant serif, slow dissolves and zooms, wanderlust tone
|
||||
**Hook (first 1.0s):** "Your Route" — minimal, elegant
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.0 | 1.0s | CLIP-002 | Tap "Start Planning" | F01 | **"Your Route"** (serif) | Slow fade in | Soft cinematic music | Hook — premium tone |
|
||||
| 1.0-2.0 | 1.0s | CLIP-005 | Select sports (quick) | F12 | — | Dissolve | Soft taps | Brief planning context |
|
||||
| 2.0-3.0 | 1.0s | CLIP-006 | Tap "Plan Trip" + loading | F01 | "Optimizing..." | Slow dissolve | Building swell | Anticipation |
|
||||
| 3.0-5.5 | 2.5s | CLIP-009 | Map: golden routes appear, markers settle | F03 | — | Slow zoom-in, no text | Bass drop on render | THE shot — cinematic route reveal |
|
||||
| 5.5-7.0 | 1.5s | CLIP-010 | Stats: 5 cities, 8 games, 1200 mi | F14 | — | Gentle slide up | Subtle data SFX | Route context |
|
||||
| 7.0-8.5 | 1.5s | CLIP-035 | Travel: Boston > New York, 215 mi | F18 | "Every mile mapped" | Slide | Soft whoosh | Route detail |
|
||||
| 8.5-10.0 | 1.5s | CLIP-034 | EV chargers expand (green dots) | F15 | "EV-ready routes" | Expand animation | Green ding | Modern differentiator |
|
||||
| 10.0-11.5 | 1.5s | CLIP-014 | Trip score card: "A" grade | F13 | — | Dissolve | Achievement tone | Quality signal |
|
||||
| 11.5-12.5 | 1.0s | CLIP-013 | Save (heart tap) | F06 | — | Quick cut | Heart beat | Commitment |
|
||||
| 12.5-14.0 | 1.5s | — | "SportsTime" + App Store | — | **"Plan Your Route"** | Fade to brand | Music resolve | CTA |
|
||||
|
||||
---
|
||||
|
||||
## V04: "Every Game"
|
||||
|
||||
**Concept:** The massive game database and filtering power
|
||||
**Creative angle:** Sports broadcast aesthetic — ticker style, data richness
|
||||
**Target duration:** 14s
|
||||
**Primary feature:** F02 (Schedule) | **Secondary:** F12 (Multi-Sport), F04 (Itinerary)
|
||||
**Design language:** Sports ticker font, horizontal swipes matching filter direction, powerful/comprehensive
|
||||
**Hook (first 1.5s):** "Every Game. Every Sport." — bold statement
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.5 | 1.5s | CLIP-015 | Schedule tab, sport chips + game list | F02 | **"Every Game. Every Sport."** | Horizontal wipe in | Broadcast music | Hook — data depth |
|
||||
| 1.5-3.5 | 2.0s | CLIP-016 | Tap MLB > NBA > NHL, list updates | F12 | — | Horizontal swipes per tap | Tap SFX + list refresh | Breadth dynamically |
|
||||
| 3.5-5.0 | 1.5s | CLIP-017 | Scroll game list (badges, times) | F02 | "Browse 1000+ games" | Vertical scroll | Scroll SFX | Data richness |
|
||||
| 5.0-6.0 | 1.0s | CLIP-002 | Tap "Start Planning" | F01 | "Then plan a trip" | Quick cut | Click | Transition to planning |
|
||||
| 6.0-7.0 | 1.0s | CLIP-005 | Select sports | F12 | — | Swipe | Taps | Quick planning |
|
||||
| 7.0-8.0 | 1.0s | CLIP-007 | Trip options appear | F05 | — | Cards pop in | Pop SFX | Results |
|
||||
| 8.0-10.0 | 2.0s | CLIP-009 | Map with routes | F03 | "Your optimized route" | Zoom into map | Bass drop | Map reveal |
|
||||
| 10.0-12.0 | 2.0s | CLIP-011 | Scroll itinerary games | F04 | — | Slide up | Steady beat | The plan |
|
||||
| 12.0-12.5 | 0.5s | CLIP-013 | Save (heart, quick) | F06 | — | Quick cut | Tap | Micro-moment |
|
||||
| 12.5-14.0 | 1.5s | — | CTA | — | **"Download SportsTime"** | Scale-in | Resolve | CTA |
|
||||
|
||||
---
|
||||
|
||||
## V05: "Stadium Quest"
|
||||
|
||||
**Concept:** Gamification angle — collect stadiums, earn badges, track progress
|
||||
**Creative angle:** Achievement-unlock aesthetic, gold accents, reward psychology
|
||||
**Target duration:** 15s
|
||||
**Primary feature:** F07 (Progress) | **Secondary:** F08 (Achievements), F11 (Share)
|
||||
**Design language:** Pop/bounce animations, achievement-unlock text style, playful/rewarding
|
||||
**Hook (first 2.0s):** "Track Every Stadium You Visit" — clear value
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-2.0 | 2.0s | CLIP-018 | Progress rings fill on sport buttons | F07 | **"Track Every Stadium You Visit"** | Pop/bounce entrance, rings animate | Achievement music, ring SFX | Hook — gamification promise |
|
||||
| 2.0-4.0 | 2.0s | CLIP-019 | Stadium map (green + gray dots) | F07 | "Your stadium map" | Zoom-to-map | Ping per dot | Visual scope |
|
||||
| 4.0-5.5 | 1.5s | CLIP-020 | Scroll visited chips (green checks) | F07 | — | Horizontal scroll | Scroll SFX | Visited status |
|
||||
| 5.5-7.5 | 2.0s | CLIP-021 | Achievement grid (gold + locked) | F08 | "Earn achievements" | Pop/scale transition | Unlock jingle | Badge showcase |
|
||||
| 7.5-9.0 | 1.5s | CLIP-022 | Tap badge > detail sheet | F08 | — | Sheet slide up | Ding on reveal | Detail moment |
|
||||
| 9.0-10.5 | 1.5s | CLIP-028 | Share preview card | F11 | "Share your quest" | Slide-in right | Share whoosh | Social angle |
|
||||
| 10.5-12.0 | 1.5s | CLIP-009 | Map with routes (plan more trips) | F03 | — | Dissolve | Soft swell | Connect progress to trips |
|
||||
| 12.0-13.0 | 1.0s | CLIP-013 | Save trip | F06 | — | Quick cut | Heart beat | Continuity |
|
||||
| 13.0-15.0 | 2.0s | — | CTA | — | **"Start Your Stadium Quest"** | Pop-in with gold glow | Resolve + achievement tone | CTA matches gamification |
|
||||
|
||||
---
|
||||
|
||||
## V06: "Squad Goals"
|
||||
|
||||
**Concept:** Social angle — plan trips with friends, vote together
|
||||
**Creative angle:** Messaging/social aesthetic, conversational rhythm
|
||||
**Target duration:** 14s
|
||||
**Primary feature:** F09 (Group Polls) | **Secondary:** F03 (Map), F04 (Itinerary)
|
||||
**Design language:** Rounded friendly type, slide-ins from sides, chat-bubble feel, fun/collaborative
|
||||
**Hook (first 1.5s):** "Plan Trips With Friends" — social proof
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.5 | 1.5s | CLIP-023 | My Trips + saved trips + poll section | F09 | **"Plan Trips With Friends"** | Slide in from left | Social music | Hook — social angle |
|
||||
| 1.5-3.5 | 2.0s | CLIP-024 | Poll creation: select 2-3 trips | F09 | "Create a poll" | Slide transition | Check SFX per pick | Poll setup |
|
||||
| 3.5-5.0 | 1.5s | CLIP-025 | Share code: "AB3K7X" large | F09 | "Share the code" | Pop-in animation | Message SFX | Shareable moment |
|
||||
| 5.0-7.0 | 2.0s | CLIP-026 | Results: bars fill, medals appear | F09 | "Friends vote" | Bars animate in sequence | Drum roll > ding | Payoff — who won |
|
||||
| 7.0-9.0 | 2.0s | CLIP-009 | Winner trip's map | F03 | "Winning trip" | Zoom into map | Celebration SFX | The chosen trip |
|
||||
| 9.0-10.5 | 1.5s | CLIP-011 | Scroll winning trip itinerary | F04 | — | Slide up | Beat | What you'll do |
|
||||
| 10.5-11.5 | 1.0s | CLIP-013 | Save trip | F06 | — | Quick cut | Heart beat | Commitment |
|
||||
| 11.5-14.0 | 2.5s | — | CTA | — | **"Gather Your Squad"** | Slide-in, group icon | Resolve | CTA matches social |
|
||||
|
||||
---
|
||||
|
||||
## V07: "Your Playbook"
|
||||
|
||||
**Concept:** The trip document you take with you — export and share
|
||||
**Creative angle:** Premium magazine/document aesthetic, polished and professional
|
||||
**Target duration:** 13s
|
||||
**Primary feature:** F10 (PDF Export) | **Secondary:** F11 (Share), F04 (Itinerary)
|
||||
**Design language:** Serif headlines, page-turn transitions, deliberate pacing, premium tone
|
||||
**Hook (first 1.5s):** "Take Your Trip Plan Anywhere" — utility focus
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.5 | 1.5s | CLIP-009 | Map hero establishing shot | F03 | **"Take Your Trip Plan Anywhere"** (serif) | Slow zoom, serif text | Premium music | Hook — utility/premium |
|
||||
| 1.5-3.5 | 2.0s | CLIP-011 | Scroll itinerary Day 1 | F04 | — | Slide up from map | Page turn SFX | What gets exported |
|
||||
| 3.5-5.5 | 2.0s | CLIP-012 | Continue: travel + Day 2 | F04 | "Every detail" | Continuous scroll | Paper slide SFX | Depth |
|
||||
| 5.5-8.0 | 2.5s | CLIP-027 | Export: overlay ring fills, text changes | F10 | "Export as PDF" | Match app animation | Swell > ding at done | Export is the feature |
|
||||
| 8.0-9.5 | 1.5s | CLIP-028 | Share preview card | F11 | "Share anywhere" | Slide-in bottom | Share whoosh | Distribution |
|
||||
| 9.5-11.0 | 1.5s | CLIP-010 | Stats row (cities, games, miles) | F14 | — | Dissolve | Soft data SFX | Grounds value |
|
||||
| 11.0-13.0 | 2.0s | — | CTA | — | **"Your Trip. Your Playbook."** | Page-turn to CTA | Resolve | CTA matches premium |
|
||||
|
||||
---
|
||||
|
||||
## V08: "All Sports"
|
||||
|
||||
**Concept:** Rapid showcase of all 7 sports — color explosion, sport-branded
|
||||
**Creative angle:** Dynamic sport cycling, each sport gets its brand color
|
||||
**Target duration:** 15s
|
||||
**Primary feature:** F12 (Multi-Sport) | **Secondary:** F02 (Schedule), F04 (Itinerary)
|
||||
**Design language:** Bold condensed type, color-wipe between sport colors, dynamic/colorful
|
||||
**Hook (first 1.5s):** "7 Sports. 150+ Stadiums." — bold data point
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.5 | 1.5s | CLIP-015 | Schedule tab, sport chips | F02 | **"7 Sports. 150+ Stadiums."** | Color-wipe entrance | High-energy music | Hook — scale |
|
||||
| 1.5-4.5 | 3.0s | CLIP-016 | Cycle MLB > NBA > NHL filters | F12 | Sport name flashes per tap | Color-wipe per sport color | Bass hit per switch | Dynamic showcase |
|
||||
| 4.5-6.0 | 1.5s | CLIP-017 | Scroll games for current sport | F02 | — | Vertical scroll | Scroll SFX | Game data |
|
||||
| 6.0-7.0 | 1.0s | CLIP-002 | Tap "Start Planning" | F01 | "Mix them all" | Quick cut | Click | Transition |
|
||||
| 7.0-8.0 | 1.0s | CLIP-005 | Select multiple sports | F12 | — | Color flash per sport | Rapid taps | Multi-sport pick |
|
||||
| 8.0-10.0 | 2.0s | CLIP-009 | Map with multi-sport route | F03 | — | Zoom into map | Bass drop | Route reveal |
|
||||
| 10.0-11.0 | 1.0s | CLIP-037 | Sport badges (MLB+NBA+NHL capsules) | F12 | "One trip. Every sport." | Slide up | Pop SFX | Variety on one trip |
|
||||
| 11.0-13.0 | 2.0s | CLIP-011 | Scroll itinerary (mixed sport cards) | F04 | — | Slide up | Beat | Varied game cards |
|
||||
| 13.0-13.5 | 0.5s | CLIP-013 | Save (heart, quick) | F06 | — | Quick cut | Heart | Micro-moment |
|
||||
| 13.5-15.0 | 1.5s | — | CTA | — | **"Every Sport. One App."** | Color-wipe to CTA | Resolve | CTA matches multi-sport |
|
||||
|
||||
---
|
||||
|
||||
## V09: "Day by Day"
|
||||
|
||||
**Concept:** Slow, deliberate scroll through a beautiful itinerary — the details matter
|
||||
**Creative angle:** Calendar aesthetic, organized and thorough
|
||||
**Target duration:** 16s
|
||||
**Primary feature:** F04 (Itinerary) | **Secondary:** F13 (Score), F15 (EV), F18 (Travel)
|
||||
**Design language:** Clean sans-serif, day headers prominent, continuous scroll, detailed/organized
|
||||
**Hook (first 2.0s):** "Every Detail. Planned." — clean confidence
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-2.0 | 2.0s | CLIP-009 | Map hero establishing trip | F03 | **"Every Detail. Planned."** (serif) | Slow zoom, clean text | Calm organized music | Hook — detail-oriented |
|
||||
| 2.0-3.5 | 1.5s | CLIP-010 | Stats row (cities, games, miles) | F14 | — | Gentle slide up | Data SFX | Trip overview |
|
||||
| 3.5-4.5 | 1.0s | CLIP-037 | Sport badges row | F12 | — | Dissolve | Soft pop | Sports context |
|
||||
| 4.5-7.5 | 3.0s | CLIP-011 | Slow scroll Day 1: header, game cards | F04 | "Day 1" (small) | Continuous vertical scroll | Gentle scroll SFX | Deep itinerary |
|
||||
| 7.5-10.0 | 2.5s | CLIP-012 | Continue: travel, Day 2 header, games | F04 | "Day 2" (small) | Continuous scroll | SFX at day change | Multi-day continuity |
|
||||
| 10.0-11.5 | 1.5s | CLIP-035 | Travel detail (city>city, miles, time) | F18 | "Know every mile" | Highlight zoom | Distance SFX | Logistics |
|
||||
| 11.5-13.0 | 1.5s | CLIP-034 | EV chargers expand | F15 | "EV charging included" | Expand animation | Green ding | Modern feature |
|
||||
| 13.0-14.5 | 1.5s | CLIP-014 | Trip score "A" grade | F13 | "Trip quality: A" | Dissolve | Achievement tone | Quality signal |
|
||||
| 14.5-16.0 | 1.5s | — | CTA | — | **"Plan Every Detail"** | Scroll-to-reveal | Resolve | CTA matches detail |
|
||||
|
||||
---
|
||||
|
||||
## V10: "Your Rules"
|
||||
|
||||
**Concept:** All the ways to personalize — planning modes, filters, preferences
|
||||
**Creative angle:** Toggle/switch aesthetic, before/after reveals, empowering
|
||||
**Target duration:** 14s
|
||||
**Primary feature:** F16 (Planning Modes) | **Secondary:** F01 (Wizard), F12 (Multi-Sport)
|
||||
**Design language:** Variable weight type, morph/crossfade between states, empowering/flexible
|
||||
**Hook (first 1.0s):** "Your Trip. Your Rules." — empowering
|
||||
|
||||
| Timecode | Dur | Clip ID | On-screen action | Feature | Text overlay | Motion/transition | Audio cue | Why |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0.0-1.0 | 1.0s | CLIP-001 | Home screen, hero visible | — | **"Your Trip. Your Rules."** | Morph-fade in | Empowering music | Hook — personalization |
|
||||
| 1.0-2.0 | 1.0s | CLIP-002 | Tap "Start Planning" | F01 | — | Morph transition | Click | Open wizard |
|
||||
| 2.0-3.0 | 1.0s | CLIP-003 | Select "Date Range" mode | F16 | "Pick dates?" | Morph/crossfade | Tap | Mode A |
|
||||
| 3.0-4.5 | 1.5s | CLIP-029 | Select "Game First" mode | F16 | "Pick games?" | Quick morph | Tap + morph SFX | Mode B |
|
||||
| 4.5-6.0 | 1.5s | CLIP-030 | Game picker: search, select 2 games | F16 | — | Slide | Search + check SFX | Game-first detail |
|
||||
| 6.0-7.0 | 1.0s | CLIP-004 | Pick dates (abbreviated) | F01 | — | Swipe | Scroll SFX | Dates for any mode |
|
||||
| 7.0-8.5 | 1.5s | CLIP-031 | Select regions: East + Central | F01 | "Choose your region" | Morph | Tap SFX | Geographic filtering |
|
||||
| 8.5-9.5 | 1.0s | CLIP-005 | Select sports (quick) | F12 | — | Swipe | Taps | Sport choice |
|
||||
| 9.5-11.0 | 1.5s | CLIP-009 | Map with routes (result) | F03 | "Built your way" | Zoom into map | Bass drop | Customization payoff |
|
||||
| 11.0-12.0 | 1.0s | CLIP-013 | Save (heart) | F06 | — | Quick cut | Heart | Commitment |
|
||||
| 12.0-14.0 | 2.0s | — | CTA | — | **"Your Trip. Your Way."** | Morph reveal | Resolve | CTA matches personalization |
|
||||
BIN
docs/SportsTime_Feature_Deck.pptx
Normal file
BIN
docs/SportsTime_Marketing_Deck.pptx
Normal file
BIN
docs/SportsTime_Pitch_Deck.pptx
Normal file
252
docs/generate_sportstime_pitch.scpt
Normal file
@@ -0,0 +1,252 @@
|
||||
using terms from application "Keynote"
|
||||
|
||||
on set_slide_size(the_doc, the_width, the_height)
|
||||
tell application "Keynote"
|
||||
set width of the_doc to the_width
|
||||
set height of the_doc to the_height
|
||||
end tell
|
||||
end set_slide_size
|
||||
|
||||
on add_full_bleed_image(theSlide, imagePath)
|
||||
tell application "Keynote"
|
||||
tell theSlide
|
||||
make new image with properties {file:POSIX file imagePath, position:{0, 0}, width:1920, height:1080}
|
||||
end tell
|
||||
end tell
|
||||
end add_full_bleed_image
|
||||
|
||||
on add_image(theSlide, imagePath, posX, posY, imgWidth, imgHeight)
|
||||
tell application "Keynote"
|
||||
tell theSlide
|
||||
make new image with properties {file:POSIX file imagePath, position:{posX, posY}, width:imgWidth, height:imgHeight}
|
||||
end tell
|
||||
end tell
|
||||
end add_image
|
||||
|
||||
on style_title(theSlide, titleText, posX, posY, boxW, boxH, fontSize)
|
||||
tell application "Keynote"
|
||||
tell theSlide
|
||||
set position of default title item to {posX, posY}
|
||||
set width of default title item to boxW
|
||||
set height of default title item to boxH
|
||||
set object text of default title item to titleText
|
||||
set font of object text of default title item to "Avenir Next Heavy"
|
||||
set size of object text of default title item to fontSize
|
||||
set color of object text of default title item to {65535, 65535, 65535}
|
||||
end tell
|
||||
end tell
|
||||
end style_title
|
||||
|
||||
on style_body(theSlide, bodyText, posX, posY, boxW, boxH, fontSize)
|
||||
tell application "Keynote"
|
||||
tell theSlide
|
||||
set position of default body item to {posX, posY}
|
||||
set width of default body item to boxW
|
||||
set height of default body item to boxH
|
||||
set object text of default body item to bodyText
|
||||
set font of object text of default body item to "Avenir Next Regular"
|
||||
set size of object text of default body item to fontSize
|
||||
set color of object text of default body item to {56000, 56000, 56000}
|
||||
end tell
|
||||
end tell
|
||||
end style_body
|
||||
|
||||
on add_text_item(theSlide, textValue, posX, posY, boxW, boxH, fontName, fontSize, colorValue)
|
||||
tell application "Keynote"
|
||||
tell theSlide
|
||||
set t to make new text item with properties {object text:textValue, position:{posX, posY}, width:boxW, height:boxH}
|
||||
set font of object text of t to fontName
|
||||
set size of object text of t to fontSize
|
||||
set color of object text of t to colorValue
|
||||
end tell
|
||||
end tell
|
||||
end add_text_item
|
||||
|
||||
on add_badge(theSlide, badgeText, posX, posY)
|
||||
my add_text_item(theSlide, badgeText, posX, posY, 460, 54, "Avenir Next Demi Bold", 28, {65535, 36200, 12800})
|
||||
end add_badge
|
||||
|
||||
on decorate_with_logo(theSlide, logoPath)
|
||||
my add_image(theSlide, logoPath, 1740, 48, 120, 120)
|
||||
end decorate_with_logo
|
||||
|
||||
on make_styled_slide(theDoc, bgPath, logoPath)
|
||||
tell application "Keynote"
|
||||
set s to make new slide at end of slides of theDoc
|
||||
end tell
|
||||
my add_full_bleed_image(s, bgPath)
|
||||
my decorate_with_logo(s, logoPath)
|
||||
return s
|
||||
end make_styled_slide
|
||||
|
||||
on run argv
|
||||
set currentStep to "start"
|
||||
try
|
||||
if (count of argv) is 0 then
|
||||
error "Usage: osascript generate_sportstime_pitch.scpt /absolute/path/to/SportsTime_Pitch.key"
|
||||
end if
|
||||
|
||||
set output_path to item 1 of argv
|
||||
set project_root to "/Users/treyt/Desktop/code/SportsTime"
|
||||
|
||||
set logo_main to project_root & "/SportsTime/Assets.xcassets/AppIcon.appiconset/master.png"
|
||||
set logo_orbit to project_root & "/SportsTime/Assets.xcassets/AppIcon-orbit.appiconset/icon.png"
|
||||
|
||||
set bg3 to project_root & "/docs/pitch_assets/bg/frame_3_bg.jpg"
|
||||
set bg8 to project_root & "/docs/pitch_assets/bg/frame_8_bg.jpg"
|
||||
set bg13 to project_root & "/docs/pitch_assets/bg/frame_13_bg.jpg"
|
||||
set bg18 to project_root & "/docs/pitch_assets/bg/frame_18_bg.jpg"
|
||||
set bg23 to project_root & "/docs/pitch_assets/bg/frame_23_bg.jpg"
|
||||
set bg29 to project_root & "/docs/pitch_assets/bg/frame_29_bg.jpg"
|
||||
set bg35 to project_root & "/docs/pitch_assets/bg/frame_35_bg.jpg"
|
||||
set bg41 to project_root & "/docs/pitch_assets/bg/frame_41_bg.jpg"
|
||||
set bg48 to project_root & "/docs/pitch_assets/bg/frame_48_bg.jpg"
|
||||
set bg55 to project_root & "/docs/pitch_assets/bg/frame_55_bg.jpg"
|
||||
set bg63 to project_root & "/docs/pitch_assets/bg/frame_63_bg.jpg"
|
||||
set bg71 to project_root & "/docs/pitch_assets/bg/frame_71_bg.jpg"
|
||||
|
||||
set frame3 to project_root & "/docs/pitch_assets/frames/frame_3.png"
|
||||
set frame8 to project_root & "/docs/pitch_assets/frames/frame_8.png"
|
||||
set frame13 to project_root & "/docs/pitch_assets/frames/frame_13.png"
|
||||
set frame18 to project_root & "/docs/pitch_assets/frames/frame_18.png"
|
||||
set frame23 to project_root & "/docs/pitch_assets/frames/frame_23.png"
|
||||
set frame29 to project_root & "/docs/pitch_assets/frames/frame_29.png"
|
||||
set frame35 to project_root & "/docs/pitch_assets/frames/frame_35.png"
|
||||
set frame41 to project_root & "/docs/pitch_assets/frames/frame_41.png"
|
||||
set frame48 to project_root & "/docs/pitch_assets/frames/frame_48.png"
|
||||
set frame55 to project_root & "/docs/pitch_assets/frames/frame_55.png"
|
||||
set frame63 to project_root & "/docs/pitch_assets/frames/frame_63.png"
|
||||
set frame71 to project_root & "/docs/pitch_assets/frames/frame_71.png"
|
||||
|
||||
set currentStep to "create document"
|
||||
tell application "Keynote"
|
||||
activate
|
||||
set deck to make new document with properties {document theme:theme "Basic Black"}
|
||||
end tell
|
||||
|
||||
set currentStep to "set slide size"
|
||||
my set_slide_size(deck, 1920, 1080)
|
||||
|
||||
set currentStep to "slide 1"
|
||||
-- Slide 1: Cover
|
||||
my add_full_bleed_image(slide 1 of deck, bg63)
|
||||
my add_image(slide 1 of deck, logo_orbit, 128, 104, 168, 168)
|
||||
my decorate_with_logo(slide 1 of deck, logo_main)
|
||||
my style_title(slide 1 of deck, "SportsTime", 120, 308, 940, 140, 104)
|
||||
my style_body(slide 1 of deck, "Plan multi-stop sports trips in minutes." & return & "Choose dates. Follow games. Drive smarter.", 124, 466, 880, 260, 42)
|
||||
my add_image(slide 1 of deck, frame63, 1160, 90, 396, 860)
|
||||
my add_image(slide 1 of deck, frame55, 1518, 168, 320, 694)
|
||||
my add_badge(slide 1 of deck, "Investor Pitch Deck", 124, 236)
|
||||
|
||||
set currentStep to "slide 2"
|
||||
-- Slide 2: Problem
|
||||
set s2 to my make_styled_slide(deck, bg3, logo_main)
|
||||
my style_title(s2, "The Problem", 120, 132, 820, 120, 72)
|
||||
my style_body(s2, "Fans use too many tools to build one trip." & return & "• Schedules in one app" & return & "• Routes in another" & return & "• Notes in a spreadsheet", 124, 290, 780, 430, 38)
|
||||
my add_image(s2, frame8, 1060, 110, 410, 886)
|
||||
my add_image(s2, frame3, 1470, 220, 320, 694)
|
||||
my add_badge(s2, "Fragmented Planning Kills Conversion", 124, 92)
|
||||
|
||||
set currentStep to "slide 3"
|
||||
-- Slide 3: Solution
|
||||
set s3 to my make_styled_slide(deck, bg13, logo_main)
|
||||
my style_title(s3, "One App. Full Trip Plan.", 120, 132, 950, 130, 70)
|
||||
my style_body(s3, "SportsTime combines schedules, routing, and itinerary output." & return & "Users go from idea to bookable plan in a single flow.", 124, 300, 860, 260, 36)
|
||||
my add_image(s3, frame13, 1120, 92, 396, 860)
|
||||
my add_image(s3, frame18, 1500, 210, 300, 650)
|
||||
my add_badge(s3, "From Search to Itinerary", 124, 92)
|
||||
|
||||
set currentStep to "slide 4"
|
||||
-- Slide 4: How It Works
|
||||
set s4 to my make_styled_slide(deck, bg18, logo_main)
|
||||
my style_title(s4, "How It Works", 120, 122, 760, 120, 68)
|
||||
my style_body(s4, "1. Pick planning mode and date range" & return & "2. Filter sports and games" & return & "3. Review route + itinerary options" & return & "4. Save and share", 124, 272, 700, 420, 36)
|
||||
my add_image(s4, frame18, 930, 138, 300, 650)
|
||||
my add_image(s4, frame23, 1240, 108, 320, 694)
|
||||
my add_image(s4, frame29, 1570, 172, 300, 650)
|
||||
my add_badge(s4, "4-Step Core Loop", 124, 84)
|
||||
|
||||
set currentStep to "slide 5"
|
||||
-- Slide 5: Planning Modes
|
||||
set s5 to my make_styled_slide(deck, bg23, logo_main)
|
||||
my style_title(s5, "5 Planning Modes", 120, 132, 760, 120, 68)
|
||||
my style_body(s5, "By Dates | By Games | By Route" & return & "Follow Team | By Teams", 124, 292, 780, 180, 40)
|
||||
my add_text_item(s5, "Matches real fan intent, not one fixed workflow.", 124, 462, 760, 120, "Avenir Next Demi Bold", 30, {65535, 39000, 12000})
|
||||
my add_image(s5, frame29, 1080, 96, 396, 860)
|
||||
my add_image(s5, frame35, 1460, 188, 300, 650)
|
||||
my add_badge(s5, "Flexible Planning = Higher Completion", 124, 92)
|
||||
|
||||
set currentStep to "slide 6"
|
||||
-- Slide 6: Date-Driven UX
|
||||
set s6 to my make_styled_slide(deck, bg29, logo_main)
|
||||
my style_title(s6, "Date-Driven Planning", 120, 132, 850, 120, 66)
|
||||
my style_body(s6, "Choose a travel window, then discover game combinations" & return & "that are actually drivable and time-feasible.", 124, 292, 860, 220, 34)
|
||||
my add_text_item(s6, "This is the ad hook: choose dates -> follow games.", 124, 520, 900, 110, "Avenir Next Demi Bold", 30, {65535, 39000, 12000})
|
||||
my add_image(s6, frame41, 1120, 94, 396, 860)
|
||||
my add_image(s6, frame48, 1500, 216, 290, 628)
|
||||
my add_badge(s6, "Core Conversion Moment", 124, 92)
|
||||
|
||||
set currentStep to "slide 7"
|
||||
-- Slide 7: Itinerary Output
|
||||
set s7 to my make_styled_slide(deck, bg35, logo_main)
|
||||
my style_title(s7, "Itinerary in Seconds", 120, 132, 840, 120, 66)
|
||||
my style_body(s7, "Auto-ranked options show stops, games, and drive segments." & return & "Users compare routes without doing manual math.", 124, 292, 820, 230, 34)
|
||||
my add_image(s7, frame35, 1060, 96, 396, 860)
|
||||
my add_image(s7, frame55, 1450, 220, 290, 628)
|
||||
my add_badge(s7, "Route Quality + Speed", 124, 92)
|
||||
|
||||
set currentStep to "slide 8"
|
||||
-- Slide 8: Retention Surfaces
|
||||
set s8 to my make_styled_slide(deck, bg41, logo_main)
|
||||
my style_title(s8, "Retention Surfaces", 120, 132, 860, 120, 66)
|
||||
my style_body(s8, "Beyond planning: progress tracking, achievements," & return & "saved trips, and repeat planning behavior.", 124, 292, 820, 220, 34)
|
||||
my add_image(s8, frame41, 1020, 96, 396, 860)
|
||||
my add_image(s8, frame63, 1400, 216, 290, 628)
|
||||
my add_badge(s8, "Plan -> Track -> Share -> Replan", 124, 92)
|
||||
|
||||
set currentStep to "slide 9"
|
||||
-- Slide 9: Shareability
|
||||
set s9 to my make_styled_slide(deck, bg48, logo_main)
|
||||
my style_title(s9, "Built-In Shareability", 120, 132, 860, 120, 66)
|
||||
my style_body(s9, "Trip cards and PDF exports make plans social." & return & "Every shared itinerary becomes organic distribution.", 124, 292, 840, 220, 34)
|
||||
my add_image(s9, frame48, 1060, 96, 396, 860)
|
||||
my add_image(s9, frame29, 1460, 216, 290, 628)
|
||||
my add_badge(s9, "Viral Output Layer", 124, 92)
|
||||
|
||||
set currentStep to "slide 10"
|
||||
-- Slide 10: Technical Moat
|
||||
set s10 to my make_styled_slide(deck, bg55, logo_main)
|
||||
my style_title(s10, "Technical Moat", 120, 132, 800, 120, 64)
|
||||
my style_body(s10, "Offline-first data + sync architecture:" & return & "• Bundled canonical sports data" & return & "• SwiftData local persistence" & return & "• CloudKit refresh in background", 124, 292, 860, 320, 34)
|
||||
my add_image(s10, frame55, 1080, 96, 396, 860)
|
||||
my add_badge(s10, "Reliability Drives Trust", 124, 92)
|
||||
|
||||
set currentStep to "slide 11"
|
||||
-- Slide 11: Business Model
|
||||
set s11 to my make_styled_slide(deck, bg71, logo_main)
|
||||
my style_title(s11, "Monetization + GTM", 120, 132, 860, 120, 64)
|
||||
my style_body(s11, "Freemium acquisition -> Pro conversion" & return & "• Subscription products already integrated" & return & "• Performance creative via short-form video" & return & "• Community and share-led growth loops", 124, 292, 860, 330, 34)
|
||||
my add_image(s11, frame71, 1080, 96, 396, 860)
|
||||
my add_badge(s11, "Scale Through Content + Conversion", 124, 92)
|
||||
|
||||
set currentStep to "slide 12"
|
||||
-- Slide 12: Ask
|
||||
set s12 to my make_styled_slide(deck, bg8, logo_orbit)
|
||||
my add_image(s12, logo_main, 130, 92, 156, 156)
|
||||
my style_title(s12, "The Ask", 120, 282, 760, 120, 84)
|
||||
my style_body(s12, "Funding to scale paid growth, creative velocity," & return & "and product execution against retention KPIs.", 124, 454, 900, 220, 40)
|
||||
my add_text_item(s12, "Next: replace with your live traction metrics before meetings.", 124, 704, 980, 90, "Avenir Next Demi Bold", 30, {65535, 39000, 12000})
|
||||
my add_image(s12, frame8, 1210, 100, 396, 860)
|
||||
my add_badge(s12, "SportsTime", 124, 236)
|
||||
|
||||
set currentStep to "save"
|
||||
tell application "Keynote"
|
||||
save deck in POSIX file output_path
|
||||
close deck
|
||||
end tell
|
||||
on error errMsg number errNum
|
||||
error "Step: " & currentStep & " | " & errMsg & " (" & errNum & ")"
|
||||
end try
|
||||
end run
|
||||
|
||||
end using terms from
|
||||
BIN
docs/pitch_assets/bg/frame_13_bg.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/pitch_assets/bg/frame_18_bg.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/pitch_assets/bg/frame_23_bg.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/pitch_assets/bg/frame_29_bg.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/pitch_assets/bg/frame_35_bg.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/pitch_assets/bg/frame_3_bg.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
docs/pitch_assets/bg/frame_41_bg.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/pitch_assets/bg/frame_48_bg.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
docs/pitch_assets/bg/frame_55_bg.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/pitch_assets/bg/frame_63_bg.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/pitch_assets/bg/frame_71_bg.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/pitch_assets/bg/frame_8_bg.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/pitch_assets/frames/frame_13.png
Normal file
|
After Width: | Height: | Size: 610 KiB |
BIN
docs/pitch_assets/frames/frame_18.png
Normal file
|
After Width: | Height: | Size: 619 KiB |
BIN
docs/pitch_assets/frames/frame_23.png
Normal file
|
After Width: | Height: | Size: 610 KiB |
BIN
docs/pitch_assets/frames/frame_29.png
Normal file
|
After Width: | Height: | Size: 620 KiB |
BIN
docs/pitch_assets/frames/frame_3.png
Normal file
|
After Width: | Height: | Size: 711 KiB |
BIN
docs/pitch_assets/frames/frame_35.png
Normal file
|
After Width: | Height: | Size: 589 KiB |
BIN
docs/pitch_assets/frames/frame_41.png
Normal file
|
After Width: | Height: | Size: 648 KiB |
BIN
docs/pitch_assets/frames/frame_48.png
Normal file
|
After Width: | Height: | Size: 579 KiB |
BIN
docs/pitch_assets/frames/frame_55.png
Normal file
|
After Width: | Height: | Size: 843 KiB |
BIN
docs/pitch_assets/frames/frame_63.png
Normal file
|
After Width: | Height: | Size: 838 KiB |
BIN
docs/pitch_assets/frames/frame_71.png
Normal file
|
After Width: | Height: | Size: 813 KiB |
BIN
docs/pitch_assets/frames/frame_8.png
Normal file
|
After Width: | Height: | Size: 618 KiB |