diff --git a/src/components/EnhancedTestimonials.tsx b/src/components/EnhancedTestimonials.tsx index a49643b..ce90c18 100644 --- a/src/components/EnhancedTestimonials.tsx +++ b/src/components/EnhancedTestimonials.tsx @@ -126,7 +126,7 @@ export function EnhancedTestimonials() { style={{ transform: `rotate(${cardRotation}deg) translateY(${cardOffset}px)`, transformOrigin: 'center center', - minHeight: '480px', + minHeight: '360px', background: ` radial-gradient(circle at 20% 80%, rgba(255, 248, 235, 0.8) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba(250, 245, 230, 0.6) 0%, transparent 50%), diff --git a/src/components/HowItWorks.tsx b/src/components/HowItWorks.tsx index a4e680a..1f58f5a 100644 --- a/src/components/HowItWorks.tsx +++ b/src/components/HowItWorks.tsx @@ -2,7 +2,7 @@ import { CreditCard, MapPin, Calendar, Zap, ChevronLeft, ChevronRight, Smartphon import { useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { ImageWithFallback } from './figma/ImageWithFallback'; -import { useLocation } from 'react-router-dom'; +import { useLocation, useNavigate } from 'react-router-dom'; const steps = [ { @@ -51,7 +51,8 @@ const steps = [ export function HowItWorks() { const [activeStep, setActiveStep] = useState(0); // Start with first step active - + const navigate=useNavigate() + const cityName = localStorage.getItem("cityName") || "Melbourne"; const location = useLocation() const nextStep = () => { @@ -82,7 +83,7 @@ export function HowItWorks() {

How Your{' '} {!location.pathname.includes("landing") && - Melbourne + {cityName} } City Card{' '} Works. @@ -96,7 +97,7 @@ export function HowItWorks() {
{/* Desktop Layout */}
- + {/* Left Panel - Section Header */}
@@ -148,7 +149,7 @@ export function HowItWorks() { }} /> ))} - + {/* Selection wave effect */}
- + {/* Active selection indicator */}
)} - + {currentStep.id === 2 && ( // Select Pass - Card selection animation (larger version)
@@ -206,7 +207,7 @@ export function HowItWorks() { />
)} - + {currentStep.id === 3 && ( // Plan Journey - Calendar animation (larger version)
@@ -233,7 +234,7 @@ export function HowItWorks() {
)} - + {currentStep.id === 4 && ( // Download App - Complete app download experience
@@ -241,7 +242,7 @@ export function HowItWorks() {
{/* App Store Header */}
- + {/* App Listing */}
@@ -250,7 +251,7 @@ export function HowItWorks() {
- + {/* Download Button */}
- + {/* Download Progress Indicator */} - + {/* Phone with Installing App */}
{/* Phone Screen */} @@ -314,7 +315,7 @@ export function HowItWorks() { ease: "easeOut" }} /> - + {/* Installation Progress Circle */}
- + {/* Phone Home Button */}
- + {/* Download Success Animation */} - + {/* Download Arrow */} - + - + {/* Success Particles */} {[...Array(4)].map((_, idx) => ( )} - + {currentStep.id === 5 && ( // Explore & Enjoy - Floating heart (larger version)
@@ -413,7 +414,7 @@ export function HowItWorks() { >
- +
@@ -442,7 +443,7 @@ export function HowItWorks() { ))}
)} - + {currentStep.id === 6 && ( // Download App - App download animation (larger version)
@@ -464,7 +465,7 @@ export function HowItWorks() { ease: "backOut" }} /> - + {/* Download progress bar */}
- + {/* Home button */}
- + {/* Download arrow animation */} - + - + {/* Success particles */} {[...Array(3)].map((_, idx) => ( goToStep(index)} - className={`h-1.5 rounded-full transition-all duration-200 ${ - index === activeStep ? 'bg-primary w-6' : 'bg-gray-200 w-1.5 hover:bg-gray-300' - }`} + className={`h-1.5 rounded-full transition-all duration-200 ${index === activeStep ? 'bg-primary w-6' : 'bg-gray-200 w-1.5 hover:bg-gray-300' + }`} /> ))}
- + + + + {activeStep === 0 && ( + + {/* Step 1: City Selection Website Interface */} +
+ + {/* Website Header */} +
+
+
+
+
+ CityCards +
+ +
+ Cities + Passes + About + +
+
+ + {/* Main Content Area */} +
+ + {/* Hero Section */} +
+

+ Choose Your{' '} + Adventure +

+

Explore amazing cities with our curated travel passes

+
+ + {/* Search Bar */} + +
+ +
+ + + +
+
- {/* Main Content Area */} -
- - {/* Hero Section */} -
-

- Choose Your{' '} - Adventure -

-

Explore amazing cities with our curated travel passes

-
- - {/* Search Bar */} + {/* City Grid */} +
+ {[ + { name: 'Sydney', attractions: '200+ Attractions', image: 'https://images.unsplash.com/photo-1624138784614-87fd1b6528f8?w=200&h=150&fit=crop', popular: true }, + { name: 'Melbourne', attractions: '150+ Attractions', image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=200&h=150&fit=crop', popular: false }, + { name: 'Brisbane', attractions: '120+ Attractions', image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=200&h=150&fit=crop', popular: false }, + { name: 'Perth', attractions: '90+ Attractions', image: 'https://images.unsplash.com/photo-1544735716-392fe2489ffa?w=200&h=150&fit=crop', popular: false } + ].map((city, idx) => ( -
- -
- - - + {city.popular && ( + + + -
+ + )} + +
+ +
+
+ +
+

{city.name}

+

{city.attractions}

+ + + Explore City +
- - {/* City Grid */} -
- {[ - { name: 'Sydney', attractions: '200+ Attractions', image: 'https://images.unsplash.com/photo-1624138784614-87fd1b6528f8?w=200&h=150&fit=crop', popular: true }, - { name: 'Melbourne', attractions: '150+ Attractions', image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=200&h=150&fit=crop', popular: false }, - { name: 'Brisbane', attractions: '120+ Attractions', image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=200&h=150&fit=crop', popular: false }, - { name: 'Perth', attractions: '90+ Attractions', image: 'https://images.unsplash.com/photo-1544735716-392fe2489ffa?w=200&h=150&fit=crop', popular: false } - ].map((city, idx) => ( - - {city.popular && ( - - - - - - )} - -
- -
-
- -
-

{city.name}

-

{city.attractions}

- - - Explore City - -
- - ))} -
- - {/* Filter Tabs */} -
- {['All Cities', 'Popular', 'New'].map((filter, idx) => ( - - {filter} - - ))} -
-
+ ))}
- - )} - {activeStep === 1 && ( - - {/* Step 2: Pass Selection & Pricing Interface */} -
- - {/* Website Header */} -
-
-
-
-
- CityCards -
-
- ← Back -
Sydney
-
-
- - {/* Main Content */} -
- - {/* Header */} -
-

- Choose Your{' '} - Pass -

-

Select the perfect pass for your Sydney adventure

-
- - {/* Pass Cards */} -
- {[ - { - name: '1-Day Pass', - price: '$49', - originalPrice: '$65', - savings: 'Save $16', - features: ['15+ Attractions', 'Skip Lines', 'Mobile Pass'], - popular: false, - color: 'from-blue-500 to-blue-600' - }, - { - name: '3-Day Pass', - price: '$99', - originalPrice: '$150', - savings: 'Save $51', - features: ['30+ Attractions', 'Skip Lines', 'Mobile Pass', 'Free Transit', 'Bonus Tours'], - popular: true, - color: 'from-primary to-secondary' - }, - { - name: '7-Day Pass', - price: '$149', - originalPrice: '$220', - savings: 'Save $71', - features: ['50+ Attractions', 'Skip Lines', 'Mobile Pass', 'Free Transit', 'All Tours', 'VIP Access'], - popular: false, - color: 'from-purple-500 to-purple-600' - } - ].map((pass, idx) => ( - - {pass.popular && ( - - Most Popular - - )} - - {/* Card Header */} -
-

{pass.name}

-
- {pass.price} -
- {pass.originalPrice} - {pass.savings} -
-
-
- - {/* Features */} -
- {pass.features.slice(0, 4).map((feature, featureIdx) => ( - -
- {feature} - - ))} - {pass.features.length > 4 && ( -
- +{pass.features.length - 4} more... -
- )} -
- - {/* Select Button */} -
- - Select Pass - -
-
- ))} -
- - {/* Trust Indicators */} -
-
-
-
- - - -
- Free cancellation within 24h -
-
- ★★★★★ - 4.8 (2.1k reviews) -
-
-
- - {/* Comparison Toggle */} - + {['All Cities', 'Popular', 'New'].map((filter, idx) => ( + - + {filter} + + ))} +
+
+
+
+ )} + + {activeStep === 1 && ( + + {/* Step 2: Pass Selection & Pricing Interface */} +
+ + {/* Website Header */} +
+
+
+
+
+ CityCards +
+
+ ← Back +
Sydney
+
+
+ + {/* Main Content */} +
+ + {/* Header */} +
+

+ Choose Your{' '} + Pass +

+

Select the perfect pass for your Sydney adventure

+
+ + {/* Pass Cards */} +
+ {[ + { + name: '1-Day Pass', + price: '$49', + originalPrice: '$65', + savings: 'Save $16', + features: ['15+ Attractions', 'Skip Lines', 'Mobile Pass'], + popular: false, + color: 'from-blue-500 to-blue-600' + }, + { + name: '3-Day Pass', + price: '$99', + originalPrice: '$150', + savings: 'Save $51', + features: ['30+ Attractions', 'Skip Lines', 'Mobile Pass', 'Free Transit', 'Bonus Tours'], + popular: true, + color: 'from-primary to-secondary' + }, + { + name: '7-Day Pass', + price: '$149', + originalPrice: '$220', + savings: 'Save $71', + features: ['50+ Attractions', 'Skip Lines', 'Mobile Pass', 'Free Transit', 'All Tours', 'VIP Access'], + popular: false, + color: 'from-purple-500 to-purple-600' + } + ].map((pass, idx) => ( + + {pass.popular && ( + + Most Popular + + )} + + {/* Card Header */} +
+

{pass.name}

+
+ {pass.price} +
+ {pass.originalPrice} + {pass.savings} +
+
+
+ + {/* Features */} +
+ {pass.features.slice(0, 4).map((feature, featureIdx) => ( + +
+ {feature} + + ))} + {pass.features.length > 4 && ( +
+ +{pass.features.length - 4} more... +
+ )} +
+ + {/* Select Button */} +
+ + Select Pass + +
+ ))} +
+ + {/* Trust Indicators */} +
+
+
+
+ + + +
+ Free cancellation within 24h +
+
+ ★★★★★ + 4.8 (2.1k reviews) +
-
- )} - {activeStep === 2 && ( - - {/* Step 3: Journey Planning & Calendar Interface */} -
- - {/* Website Header */} -
-
-
-
-
- CityCards -
-
- ← Back -
3-Day Pass Selected
-
+ {/* Comparison Toggle */} + + + +
+
+
+ )} + + {activeStep === 2 && ( + + {/* Step 3: Journey Planning & Calendar Interface */} +
+ + {/* Website Header */} +
+
+
+
+ CityCards +
+
+ ← Back +
3-Day Pass Selected
+
+
- {/* Main Content */} -
- - {/* Header */} -
-

- Plan Your{' '} - Journey -

-

Choose your travel dates and create your itinerary

+ {/* Main Content */} +
+ + {/* Header */} +
+

+ Plan Your{' '} + Journey +

+

Choose your travel dates and create your itinerary

+
+ + {/* Two Column Layout */} +
+ + {/* Calendar Section */} +
+ {/* Month Navigation */} +
+ + + + + + +

December 2024

+ + + + + +
- {/* Two Column Layout */} -
- - {/* Calendar Section */} -
- {/* Month Navigation */} -
- - - - - - -

December 2024

- - - - - - -
- - {/* Calendar Grid */} -
- {/* Weekday Headers */} -
- {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((day) => ( -
- {day} -
- ))} + {/* Calendar Grid */} +
+ {/* Weekday Headers */} +
+ {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((day) => ( +
+ {day}
- - {/* Calendar Days */} -
- {[ - null, null, null, null, null, 1, 2, - 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, - 31 - ].map((date, idx) => { - const isSelected = date === 15 || date === 16 || date === 17; - const isToday = date === 12; - const isAvailable = date && date > 11; - - return ( - + + {/* Calendar Days */} +
+ {[ + null, null, null, null, null, 1, 2, + 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, + 31 + ].map((date, idx) => { + const isSelected = date === 15 || date === 16 || date === 17; + const isToday = date === 12; + const isAvailable = date && date > 11; + + return ( + - {date} - - ); - })} -
-
-
- - {/* Itinerary Section */} -
-
-

Your Itinerary

-

3 days selected

-
- - {/* Itinerary Items */} -
- {[ - { - day: 'Day 1', - date: 'Dec 15', - attractions: ['Opera House', 'Harbour Bridge', 'Circular Quay'], - color: 'bg-blue-100 text-blue-600' - }, - { - day: 'Day 2', - date: 'Dec 16', - attractions: ['Bondi Beach', 'Art Gallery', 'Darling Harbour'], - color: 'bg-green-100 text-green-600' - }, - { - day: 'Day 3', - date: 'Dec 17', - attractions: ['Blue Mountains', 'Wildlife Park', 'Scenic Railway'], - color: 'bg-purple-100 text-purple-600' - } - ].map((day, dayIdx) => ( - -
-
- {day.day} -
- {day.date} -
- -
- {day.attractions.map((attraction, attractionIdx) => ( - -
- {attraction} -
- ))} -
+ {date}
- ))} -
+ ); + })} +
+
+
- {/* Add Activity Button */} - +
+

Your Itinerary

+

3 days selected

+
+ + {/* Itinerary Items */} +
+ {[ + { + day: 'Day 1', + date: 'Dec 15', + attractions: ['Opera House', 'Harbour Bridge', 'Circular Quay'], + color: 'bg-blue-100 text-blue-600' + }, + { + day: 'Day 2', + date: 'Dec 16', + attractions: ['Bondi Beach', 'Art Gallery', 'Darling Harbour'], + color: 'bg-green-100 text-green-600' + }, + { + day: 'Day 3', + date: 'Dec 17', + attractions: ['Blue Mountains', 'Wildlife Park', 'Scenic Railway'], + color: 'bg-purple-100 text-purple-600' + } + ].map((day, dayIdx) => ( + - + Add activity - -
+
+
+ {day.day} +
+ {day.date} +
+ +
+ {day.attractions.map((attraction, attractionIdx) => ( + +
+ {attraction} +
+ ))} +
+ + ))}
- {/* Continue Button */} - + + Add activity + +
+
+ + {/* Continue Button */} + + + +
+
+ + )} + + {activeStep === 3 && ( + + {/* Step 4: Digital Pass Activation & QR Code */} +
+ + {/* Website Header */} +
+
+
+
+
+ CityCards +
+
+ ✓ Payment Complete +
+
+ + {/* Main Content */} +
+ + {/* Success Header */} +
+ + + + + + +

+ Your Pass is{' '} + Ready! +

+

Access your digital pass instantly

+
+ + {/* Two Column Layout */} +
+ + {/* Left: Digital Pass Card */} + + {/* Background Pattern */} +
+
+
+
+ + {/* Pass Header */} +
+
+
+

Sydney 3-Day Pass

+

CityCards Premium

+
+
+ + + + +
+
+ + {/* Pass Details */} +
+
+ Valid From: + Dec 15, 2024 +
+
+ Valid Until: + Dec 17, 2024 +
+
+ Attractions: + 30+ included +
+
+ + {/* Pass Number */} +
+

Pass ID

+

SYD-2024-12-001234

+
+
+
+ + {/* Right: QR Code & Instructions */} +
+ + {/* QR Code */} +
+ + {/* QR Code Grid */} +
+ {[...Array(144)].map((_, idx) => { + const patterns = [ + // Corner patterns (top-left, top-right, bottom-left) + ...[0, 1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 17, 18, 24, 25, 26, 27, 28, 29, 30, 36, 37, 38, 39, 40, 41, 42, 48, 49, 50, 51, 52, 53, 54, 60, 61, 62, 63, 64, 65, 66, 72, 73, 74, 75, 76, 77, 78], + ...[5, 6, 7, 8, 9, 10, 11, 17, 18, 19, 20, 21, 22, 23, 29, 30, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 46, 47, 53, 54, 55, 56, 57, 58, 59, 65, 66, 67, 68, 69, 70, 71, 77, 78, 79, 80, 81, 82, 83], + ...[66, 67, 68, 69, 70, 71, 72, 78, 79, 80, 81, 82, 83, 84, 90, 91, 92, 93, 94, 95, 96, 102, 103, 104, 105, 106, 107, 108, 114, 115, 116, 117, 118, 119, 120, 126, 127, 128, 129, 130, 131, 132, 138, 139, 140, 141, 142, 143, 144], + // Data pattern + ...[8, 9, 15, 16, 21, 22, 27, 28, 33, 34, 39, 40, 45, 46, 51, 52, 57, 58, 63, 64, 69, 70, 75, 76, 81, 82, 87, 88, 93, 94, 99, 100, 105, 106, 111, 112, 117, 118, 123, 124, 129, 130, 135, 136, 141, 142] + ]; + const isActive = patterns.includes(idx) || Math.random() > 0.6; + + return ( + + ); + })} +
+ + {/* Corner Detection Squares */} +
+
+
+
+
+
+
+
+
+
+ +

Scan to Access

+

Show this QR code at each attraction

+
+ + {/* Usage Instructions */} +
+ {[ + { icon: '📱', text: 'Add to Apple/Google Wallet', status: 'ready' }, + { icon: '📧', text: 'Email sent to john@example.com', status: 'sent' }, + { icon: '📲', text: 'Download mobile app for offline access', status: 'optional' } + ].map((instruction, idx) => ( + + {instruction.icon} + {instruction.text} + {instruction.status === 'ready' && ( + + + + + + )} + {instruction.status === 'sent' && ( +
+ + + + +
+ )} +
+ ))} +
+
+
+ + {/* Action Buttons */} +
+ + View Itinerary + + + + Start Exploring + +
+
+
+
+ )} + + {activeStep === 4 && ( + + {/* Step 5: Live Mobile App Experience */} +
+ + {/* Phone Frame */} + + {/* Phone Screen */} +
+ + {/* Status Bar */} +
+ 9:41 AM +
+
+
+
+
+
+
+
+
+
+ + {/* App Header */} +
+
+
+ + + + +
+ Opera House +
+ - + + +
-
-
- )} - - {activeStep === 3 && ( - - {/* Step 4: Digital Pass Activation & QR Code */} -
- - {/* Website Header */} -
-
-
-
-
- CityCards -
-
- ✓ Payment Complete -
-
{/* Main Content */} -
- - {/* Success Header */} -
+
+ + {/* Attraction Image */} +
+ +
+ + {/* Check-in Status */} - - + + + Checked In - -

- Your Pass is{' '} - Ready! -

-

Access your digital pass instantly

- {/* Two Column Layout */} -
- - {/* Left: Digital Pass Card */} - - {/* Background Pattern */} -
-
-
+ {/* Attraction Info */} +
+
+
+

Sydney Opera House

+

Iconic performing arts venue

- - {/* Pass Header */} -
-
-
-

Sydney 3-Day Pass

-

CityCards Premium

-
-
- - - - -
-
- - {/* Pass Details */} -
-
- Valid From: - Dec 15, 2024 -
-
- Valid Until: - Dec 17, 2024 -
-
- Attractions: - 30+ included -
-
- - {/* Pass Number */} -
-

Pass ID

-

SYD-2024-12-001234

-
+
+
Free Entry
+
with CityPass
- +
- {/* Right: QR Code & Instructions */} -
- - {/* QR Code */} -
- + {[ + { icon: '🎫', label: 'Show Pass', active: true }, + { icon: '📍', label: 'Directions', active: false }, + { icon: '📱', label: 'Audio Guide', active: false } + ].map((action, idx) => ( + + {action.icon} + {action.label} + + ))} +
+ + {/* Progress Stats */} +
+
+ Today's Progress + 3 of 8 attractions +
+ +
+ - {/* QR Code Grid */} -
- {[...Array(144)].map((_, idx) => { - const patterns = [ - // Corner patterns (top-left, top-right, bottom-left) - ...[0,1,2,3,4,5,6, 12,13,14,15,16,17,18, 24,25,26,27,28,29,30, 36,37,38,39,40,41,42, 48,49,50,51,52,53,54, 60,61,62,63,64,65,66, 72,73,74,75,76,77,78], - ...[5,6,7,8,9,10,11, 17,18,19,20,21,22,23, 29,30,31,32,33,34,35, 41,42,43,44,45,46,47, 53,54,55,56,57,58,59, 65,66,67,68,69,70,71, 77,78,79,80,81,82,83], - ...[66,67,68,69,70,71,72, 78,79,80,81,82,83,84, 90,91,92,93,94,95,96, 102,103,104,105,106,107,108, 114,115,116,117,118,119,120, 126,127,128,129,130,131,132, 138,139,140,141,142,143,144], - // Data pattern - ...[8,9,15,16,21,22,27,28,33,34,39,40,45,46,51,52,57,58,63,64,69,70,75,76,81,82,87,88,93,94,99,100,105,106,111,112,117,118,123,124,129,130,135,136,141,142] - ]; - const isActive = patterns.includes(idx) || Math.random() > 0.6; - - return ( - - ); - })} -
- - {/* Corner Detection Squares */} -
-
-
-
-
-
-
-
-
-
- -

Scan to Access

-

Show this QR code at each attraction

+ />
- {/* Usage Instructions */} -
- {[ - { icon: '📱', text: 'Add to Apple/Google Wallet', status: 'ready' }, - { icon: '📧', text: 'Email sent to john@example.com', status: 'sent' }, - { icon: '📲', text: 'Download mobile app for offline access', status: 'optional' } - ].map((instruction, idx) => ( - - {instruction.icon} - {instruction.text} - {instruction.status === 'ready' && ( - - - - - - )} - {instruction.status === 'sent' && ( -
- - - - -
- )} -
- ))} +
+ ✓ Opera House + Next: Harbour Bridge
+
- {/* Action Buttons */} -
- + {[ + { icon: '🗺️', label: 'Map', active: true }, + { icon: '🎫', label: 'Pass', active: false }, + { icon: '📅', label: 'Plan', active: false }, + { icon: '👤', label: 'Profile', active: false } + ].map((tab, idx) => ( + - View Itinerary - - - - Start Exploring - -
+ {tab.icon} + {tab.label} + + ))} +
+ + {/* Home Indicator */} +
+
+ + + {/* Floating Notifications */} + +
+
+ + + +
+
+
Check-in successful!
+
Enjoy the Opera House
- )} +
+
+ )} - {activeStep === 4 && ( - - {/* Step 5: Live Mobile App Experience */} -
- - {/* Phone Frame */} + {activeStep === 5 && ( + + {/* Step 6: App Store Download Experience */} +
+ + {/* Two Column Layout */} +
+ + {/* Left: App Store Interface */} +
+ + {/* App Store Header */} - {/* Phone Screen */} -
- - {/* Status Bar */} -
- 9:41 AM -
-
-
-
-
-
-
-
-
+ {/* Store Header */} +
+
+ + +
+ App Store +
- {/* App Header */} -
-
-
- - - - -
- Opera House -
+ {/* App Listing */} +
+
+ {/* App Icon */} - - - +
+
+
-
- {/* Main Content */} -
- - {/* Attraction Image */} -
- -
- - {/* Check-in Status */} - +

CityCards

+

Travel & Navigation

+
+
+ {'★★★★★'.split('').map((star, idx) => ( + {star} + ))} +
+ 4.8 + (2.1K) +
+ + {/* Download Button */} + - - - - Checked In -
-
- - {/* Attraction Info */} -
-
-
-

Sydney Opera House

-

Iconic performing arts venue

-
-
-
Free Entry
-
with CityPass
-
-
- - {/* Quick Actions */} -
- {[ - { icon: '🎫', label: 'Show Pass', active: true }, - { icon: '📍', label: 'Directions', active: false }, - { icon: '📱', label: 'Audio Guide', active: false } - ].map((action, idx) => ( - - {action.icon} - {action.label} - - ))} -
- - {/* Progress Stats */} -
-
- Today's Progress - 3 of 8 attractions -
- -
- -
- -
- ✓ Opera House - Next: Harbour Bridge -
-
+ GET +
- {/* Bottom Tab Bar */} -
- {[ - { icon: '🗺️', label: 'Map', active: true }, - { icon: '🎫', label: 'Pass', active: false }, - { icon: '📅', label: 'Plan', active: false }, - { icon: '👤', label: 'Profile', active: false } - ].map((tab, idx) => ( + {/* App Screenshots Preview */} +
+ {[0, 1, 2].map((screenshot, idx) => ( - {tab.icon} - {tab.label} + {/* Mini screenshot content */} +
+
+
+
+
+
+
+
))}
- - {/* Home Indicator */} -
- {/* Floating Notifications */} + {/* Download Progress */} -
-
- - - -
-
-
Check-in successful!
-
Enjoy the Opera House
-
-
-
-
- - )} - - {activeStep === 5 && ( - - {/* Step 6: App Store Download Experience */} -
- - {/* Two Column Layout */} -
- - {/* Left: App Store Interface */} -
- - {/* App Store Header */} +
+
+
+
+

Downloading CityCards...

+

47.2 MB of 52.1 MB

+
+
+ +
+ - {/* Store Header */} -
-
- - - -
- App Store -
+ /> +
+ +
- {/* App Listing */} -
-
- {/* App Icon */} + {/* Right: Phone with App Installation */} +
+ + {/* Phone Screen */} +
+ + {/* Wallpaper */} +
+ + {/* Status Bar */} +
+ 9:41 AM +
+
+
+
+
+
+
+ + {/* App Grid */} +
+
+ {[ + { name: 'Phone', color: 'bg-green-500', installing: false }, + { name: 'Messages', color: 'bg-green-400', installing: false }, + { name: 'Camera', color: 'bg-gray-600', installing: false }, + { name: 'Photos', color: 'bg-yellow-500', installing: false }, + { name: 'Maps', color: 'bg-blue-500', installing: false }, + { name: 'Weather', color: 'bg-blue-400', installing: false }, + { name: 'CityCards', color: 'bg-gradient-to-br from-primary to-secondary', installing: true }, + { name: 'Settings', color: 'bg-gray-500', installing: false } + ].map((app, idx) => ( -
-
-
-
- - {/* App Info */} -
-

CityCards

-

Travel & Navigation

-
-
- {'★★★★★'.split('').map((star, idx) => ( - {star} - ))} -
- 4.8 - (2.1K) -
- - {/* Download Button */} - - GET - -
-
- - {/* App Screenshots Preview */} -
- {[0, 1, 2].map((screenshot, idx) => ( - - {/* Mini screenshot content */} -
-
-
-
-
-
+ {app.installing ? ( + <> + {/* Installation Progress Circle */} + +
+
-
- - ))} -
+ + ) : ( +
+ )} +
+ ))}
- +
- {/* Download Progress */} - -
- -
-
-
-

Downloading CityCards...

-

47.2 MB of 52.1 MB

-
-
- -
- -
-
+ {/* Dock */} +
+ {[0, 1, 2, 3].map((dockApp) => ( +
+ ))} +
+ + {/* Home Indicator */} +
- - {/* Right: Phone with App Installation */} -
- - {/* Phone Screen */} -
- - {/* Wallpaper */} -
- - {/* Status Bar */} -
- 9:41 AM -
-
-
-
-
-
-
- - {/* App Grid */} -
-
- {[ - { name: 'Phone', color: 'bg-green-500', installing: false }, - { name: 'Messages', color: 'bg-green-400', installing: false }, - { name: 'Camera', color: 'bg-gray-600', installing: false }, - { name: 'Photos', color: 'bg-yellow-500', installing: false }, - { name: 'Maps', color: 'bg-blue-500', installing: false }, - { name: 'Weather', color: 'bg-blue-400', installing: false }, - { name: 'CityCards', color: 'bg-gradient-to-br from-primary to-secondary', installing: true }, - { name: 'Settings', color: 'bg-gray-500', installing: false } - ].map((app, idx) => ( - - {app.installing ? ( - <> - {/* Installation Progress Circle */} - -
-
-
- - ) : ( -
- )} -
- ))} -
-
- - {/* Dock */} -
- {[0, 1, 2, 3].map((dockApp) => ( -
- ))} -
- - {/* Home Indicator */} -
-
-
-
-
- - {/* Success Notification */} - - - - - CityCards installed successfully! - - {/* Bottom Text */} -
- - Ready to explore! Open the app to start your adventure - -
+
+ + {/* Success Notification */} + + + + + CityCards installed successfully! - )} - + + {/* Bottom Text */} +
+ + Ready to explore! Open the app to start your adventure + +
+
+ + )} +
@@ -2120,13 +2118,12 @@ export function HowItWorks() {
- + -

+ {/*

Free to use • No credit card required -

+

*/}
diff --git a/src/components/LandingVarietyOfAdventures.tsx b/src/components/LandingVarietyOfAdventures.tsx index 4af0519..7d0dc42 100644 --- a/src/components/LandingVarietyOfAdventures.tsx +++ b/src/components/LandingVarietyOfAdventures.tsx @@ -150,10 +150,10 @@ export function LandingVarietyOfAdventures() { const extendedCategories = [...melbourneCategories, ...melbourneCategories, ...melbourneCategories]; return ( -
+
{/* Header */} -
+
diff --git a/src/components/PersonalizedTourHero.tsx b/src/components/PersonalizedTourHero.tsx index 1d93534..ae2927a 100644 --- a/src/components/PersonalizedTourHero.tsx +++ b/src/components/PersonalizedTourHero.tsx @@ -73,6 +73,7 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou const nextCard = attractionCards[(currentCardIndex + 1) % attractionCards.length]; const thirdCard = attractionCards[(currentCardIndex + 2) % attractionCards.length]; + const cityName = localStorage.getItem("cityName") return (
{/* Gradient Background Elements */} @@ -109,7 +110,7 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou > - AI-Powered Planning + Smart Planning

- Let AI craft a personalized journey tailored to your interests, timeline, and travel style. Get the perfect itinerary in minutes. + Craft a personalized journey tailored to your interests, timeline, and travel style. Get the perfect itinerary in minutes.

{/* Quick Features */}
{[ - { icon: , text: 'AI-powered smart suggestions' }, - { icon: , text: '40+ top Melbourne attractions' }, + { icon: , text: 'Smart suggestions' }, + { icon: , text: `40+ top ${cityName} attractions` }, { icon: , text: 'Flexible & customizable plans' } ].map((feature, index) => ( Create My Itinerary -

+ {/*

Free • Takes less than 2 minutes -

+

*/}
diff --git a/src/components/WhatsIncludedHero.tsx b/src/components/WhatsIncludedHero.tsx index aed0156..52f7be7 100644 --- a/src/components/WhatsIncludedHero.tsx +++ b/src/components/WhatsIncludedHero.tsx @@ -100,7 +100,7 @@ export function WhatsIncludedHero({ onCreateItineraryClick }: WhatsIncludedHeroP > {/* Main Heading */}

- One pass.{' '} + One CityCard{' '} Everything you {' '} diff --git a/src/pages/DiscoverPage.tsx b/src/pages/DiscoverPage.tsx index 73a9ad0..85c1fc8 100644 --- a/src/pages/DiscoverPage.tsx +++ b/src/pages/DiscoverPage.tsx @@ -1,11 +1,12 @@ import { ArrowRight, Check, CreditCard, DollarSign, MapPin, Palette, Sparkles, Ticket, Zap } from 'lucide-react'; import { AnimatePresence, motion } from 'motion/react'; -import { useEffect, useState } from 'react'; +import { use, useEffect, useState } from 'react'; import { Layout } from '../Layout'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { MobileAppSection } from '../components/MobileAppSection'; import { TrustSection } from '../components/TrustSection'; import { Button } from '../components/ui/button'; +import { useNavigate } from 'react-router-dom'; interface User { email: string; @@ -68,6 +69,8 @@ export function DiscoverPage({ const [direction, setDirection] = useState(0); const [activeStep, setActiveStep] = useState(0); + const navigate =useNavigate(); + const handleStepInView = (index: number) => { setActiveStep(index); }; @@ -687,8 +690,8 @@ export function DiscoverPage({

@@ -743,8 +746,8 @@ export function DiscoverPage({
diff --git a/src/pages/MagicItineraryPage.tsx b/src/pages/MagicItineraryPage.tsx index 95eacf0..b9368c9 100644 --- a/src/pages/MagicItineraryPage.tsx +++ b/src/pages/MagicItineraryPage.tsx @@ -75,6 +75,7 @@ export function MagicItineraryPage({ currentPage, user }: MagicItineraryPageProps) { + const cityName = localStorage.getItem("cityName") || "your city"; return ( diff --git a/src/pages/PassesPage.tsx b/src/pages/PassesPage.tsx index 17a978c..04dcbb4 100644 --- a/src/pages/PassesPage.tsx +++ b/src/pages/PassesPage.tsx @@ -415,7 +415,7 @@ export function PassesPage({
-

Calendar Days Policy

+

Calendar Days Policy

Unlimited passes work on a consecutive calendar day basis, not 24-hour periods. Your pass expires at 11:59 PM on your final day.

@@ -452,7 +452,7 @@ export function PassesPage({
-

60-Minute Adventure Gap

+

60-Minute Adventure Gap

To keep the journey smooth for everyone, there's a simple 60-minute wait between scanning your pass at attractions.