Merge pull request 'fix issues according to client feedback' (#27) from arya-branch into main
Reviewed-on: #27
This commit is contained in:
@@ -126,7 +126,7 @@ export function EnhancedTestimonials() {
|
|||||||
style={{
|
style={{
|
||||||
transform: `rotate(${cardRotation}deg) translateY(${cardOffset}px)`,
|
transform: `rotate(${cardRotation}deg) translateY(${cardOffset}px)`,
|
||||||
transformOrigin: 'center center',
|
transformOrigin: 'center center',
|
||||||
minHeight: '480px',
|
minHeight: '360px',
|
||||||
background: `
|
background: `
|
||||||
radial-gradient(circle at 20% 80%, rgba(255, 248, 235, 0.8) 0%, transparent 50%),
|
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%),
|
radial-gradient(circle at 80% 20%, rgba(250, 245, 230, 0.6) 0%, transparent 50%),
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -112,7 +112,7 @@ export function LandingMagicItinerary() {
|
|||||||
>
|
>
|
||||||
<Wand2 className="w-6 h-6 text-warm-coral drop-shadow-lg" />
|
<Wand2 className="w-6 h-6 text-warm-coral drop-shadow-lg" />
|
||||||
</motion.div>
|
</motion.div>
|
||||||
<span className="font-semibold text-gray-800">AI-Powered Magic Itinerary</span>
|
<span className="font-semibold text-gray-800">Magic Itinerary</span>
|
||||||
<motion.div
|
<motion.div
|
||||||
className="w-2 h-2 bg-warm-coral rounded-full"
|
className="w-2 h-2 bg-warm-coral rounded-full"
|
||||||
animate={{
|
animate={{
|
||||||
@@ -131,7 +131,7 @@ export function LandingMagicItinerary() {
|
|||||||
viewport={{ once: true }}
|
viewport={{ once: true }}
|
||||||
>
|
>
|
||||||
<span className="font-light">Plan Your</span>{' '}
|
<span className="font-light">Plan Your</span>{' '}
|
||||||
<span className="font-bold italic bg-gradient-to-r from-warm-coral via-orange-500 to-rose-500 bg-clip-text pr-2 text-transparent drop-shadow-lg">
|
<span className="font-bold italic bg-gradient-to-r via-orange-500 to-rose-500 bg-clip-text pr-2 text-transparent drop-shadow-lg">
|
||||||
Dream Journey
|
Dream Journey
|
||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
@@ -250,7 +250,7 @@ export function LandingMagicItinerary() {
|
|||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
withShine={true}
|
withShine={true}
|
||||||
className="py-6 px-14 rounded-full text-lg font-bold bg-gradient-to-r from-warm-coral via-orange-500 to-rose-500 hover:from-warm-coral/90 hover:via-orange-500/90 hover:to-rose-500/90 shadow-2xl hover:shadow-warm-coral/50 transition-all hover:scale-105 hover:-translate-y-1"
|
className="py-6 px-14 rounded-full text-lg font-bold bg-gradient-to-r via-orange-500 to-rose-500 hover:from-warm-coral/90 hover:via-orange-500/90 hover:to-rose-500/90 shadow-2xl hover:shadow-warm-coral/50 transition-all hover:scale-105 hover:-translate-y-1"
|
||||||
>
|
>
|
||||||
<span className="flex items-center gap-3">
|
<span className="flex items-center gap-3">
|
||||||
<Wand2 className="w-5 h-5" />
|
<Wand2 className="w-5 h-5" />
|
||||||
@@ -258,11 +258,11 @@ export function LandingMagicItinerary() {
|
|||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<p className="text-gray-600 text-sm flex items-center gap-2">
|
{/* <p className="text-gray-600 text-sm flex items-center gap-2">
|
||||||
<Sparkles className="w-4 h-4 text-warm-coral" />
|
<Sparkles className="w-4 h-4 text-warm-coral" />
|
||||||
<span>Free to use • No credit card required</span>
|
<span>Free to use • No credit card required</span>
|
||||||
<Sparkles className="w-4 h-4 text-warm-coral" />
|
<Sparkles className="w-4 h-4 text-warm-coral" />
|
||||||
</p>
|
</p> */}
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -150,10 +150,10 @@ export function LandingVarietyOfAdventures() {
|
|||||||
const extendedCategories = [...melbourneCategories, ...melbourneCategories, ...melbourneCategories];
|
const extendedCategories = [...melbourneCategories, ...melbourneCategories, ...melbourneCategories];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-20 lg:py-28 bg-white overflow-hidden">
|
<section className="lg: bg-white overflow-hidden">
|
||||||
<div className="container mx-auto px-4">
|
<div className="container mx-auto px-4">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="text-center mb-16 max-w-4xl mx-auto">
|
<div className="text-center mb-2 max-w-4xl mx-auto">
|
||||||
<motion.h2
|
<motion.h2
|
||||||
className="font-poppins text-2xl md:text-3xl lg:text-4xl leading-tight text-foreground mb-6"
|
className="font-poppins text-2xl md:text-3xl lg:text-4xl leading-tight text-foreground mb-6"
|
||||||
initial={{ opacity: 0, y: 30 }}
|
initial={{ opacity: 0, y: 30 }}
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ export function LoginModal({ isOpen, onClose }: LoginModalProps) {
|
|||||||
|
|
||||||
login(userData);
|
login(userData);
|
||||||
toast.success("User Logged in successfully")
|
toast.success("User Logged in successfully")
|
||||||
|
navigate("/passes")
|
||||||
}
|
}
|
||||||
onClose();
|
onClose();
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
|
|||||||
@@ -120,17 +120,17 @@ export default function Navbar({
|
|||||||
melbourneLabel: 'How It Works'
|
melbourneLabel: 'How It Works'
|
||||||
},
|
},
|
||||||
// Position 2
|
// Position 2
|
||||||
{
|
|
||||||
label: 'Magic Itinerary',
|
|
||||||
path: '/landing-magic-itinerary',
|
|
||||||
isShared: false
|
|
||||||
},
|
|
||||||
// Position 3
|
// Position 3
|
||||||
{
|
{
|
||||||
label: 'Whats Included',
|
label: 'Whats Included',
|
||||||
path: '/whats-included',
|
path: '/whats-included',
|
||||||
isShared: false
|
isShared: false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Magic Itinerary',
|
||||||
|
path: '/landing-magic-itinerary',
|
||||||
|
isShared: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'FAQ',
|
label: 'FAQ',
|
||||||
path: '/faq',
|
path: '/faq',
|
||||||
@@ -529,7 +529,7 @@ export default function Navbar({
|
|||||||
? 'Melbourne CityCards Logo'
|
? 'Melbourne CityCards Logo'
|
||||||
: 'CityCards Logo'
|
: 'CityCards Logo'
|
||||||
}
|
}
|
||||||
className="h-14 w-auto"
|
className="h-17 w-auto"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou
|
|||||||
const nextCard = attractionCards[(currentCardIndex + 1) % attractionCards.length];
|
const nextCard = attractionCards[(currentCardIndex + 1) % attractionCards.length];
|
||||||
const thirdCard = attractionCards[(currentCardIndex + 2) % attractionCards.length];
|
const thirdCard = attractionCards[(currentCardIndex + 2) % attractionCards.length];
|
||||||
|
|
||||||
|
const cityName = localStorage.getItem("cityName")
|
||||||
return (
|
return (
|
||||||
<div className="relative w-full min-h-[90vh] overflow-hidden flex items-center bg-gradient-to-br from-orange-50 via-white to-rose-50">
|
<div className="relative w-full min-h-[90vh] overflow-hidden flex items-center bg-gradient-to-br from-orange-50 via-white to-rose-50">
|
||||||
{/* Gradient Background Elements */}
|
{/* Gradient Background Elements */}
|
||||||
@@ -109,7 +110,7 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou
|
|||||||
>
|
>
|
||||||
<Wand2 className="w-5 h-5 text-primary drop-shadow-lg" />
|
<Wand2 className="w-5 h-5 text-primary drop-shadow-lg" />
|
||||||
</motion.div>
|
</motion.div>
|
||||||
<span className="font-poppins font-semibold text-gray-800">AI-Powered Planning</span>
|
<span className="font-poppins font-semibold text-gray-800">Smart Planning</span>
|
||||||
<motion.div
|
<motion.div
|
||||||
className="w-1.5 h-1.5 bg-primary rounded-full"
|
className="w-1.5 h-1.5 bg-primary rounded-full"
|
||||||
animate={{
|
animate={{
|
||||||
@@ -130,14 +131,14 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p className="font-poppins text-lg md:text-xl font-normal leading-relaxed text-gray-600 mb-8">
|
<p className="font-poppins text-lg md:text-xl font-normal leading-relaxed text-gray-600 mb-8">
|
||||||
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.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Quick Features */}
|
{/* Quick Features */}
|
||||||
<div className="space-y-3 mb-8">
|
<div className="space-y-3 mb-8">
|
||||||
{[
|
{[
|
||||||
{ icon: <Sparkles className="w-5 h-5" />, text: 'AI-powered smart suggestions' },
|
{ icon: <Sparkles className="w-5 h-5" />, text: 'Smart suggestions' },
|
||||||
{ icon: <MapPin className="w-5 h-5" />, text: '40+ top Melbourne attractions' },
|
{ icon: <MapPin className="w-5 h-5" />, text: `40+ top ${cityName} attractions` },
|
||||||
{ icon: <Calendar className="w-5 h-5" />, text: 'Flexible & customizable plans' }
|
{ icon: <Calendar className="w-5 h-5" />, text: 'Flexible & customizable plans' }
|
||||||
].map((feature, index) => (
|
].map((feature, index) => (
|
||||||
<motion.div
|
<motion.div
|
||||||
@@ -173,10 +174,10 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou
|
|||||||
<span className="relative z-10">Create My Itinerary</span>
|
<span className="relative z-10">Create My Itinerary</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<p className="font-poppins text-sm text-gray-600 font-normal flex items-center gap-2">
|
{/* <p className="font-poppins text-sm text-gray-600 font-normal flex items-center gap-2">
|
||||||
<Sparkles className="w-4 h-4 text-primary" />
|
<Sparkles className="w-4 h-4 text-primary" />
|
||||||
<span>Free • Takes less than 2 minutes</span>
|
<span>Free • Takes less than 2 minutes</span>
|
||||||
</p>
|
</p> */}
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export function WhatsIncludedHero({ onCreateItineraryClick }: WhatsIncludedHeroP
|
|||||||
>
|
>
|
||||||
{/* Main Heading */}
|
{/* Main Heading */}
|
||||||
<h1 className="font-poppins text-4xl sm:text-5xl md:text-6xl w-full leading-tight mb-6">
|
<h1 className="font-poppins text-4xl sm:text-5xl md:text-6xl w-full leading-tight mb-6">
|
||||||
<span className="font-light">One pass.</span>{' '}
|
<span className="font-light">One CityCard</span>{' '}
|
||||||
<span className="font-bold italic pr-2 bg-gradient-to-r from-primary via-orange-500 to-rose-500 bg-clip-text text-transparent">
|
<span className="font-bold italic pr-2 bg-gradient-to-r from-primary via-orange-500 to-rose-500 bg-clip-text text-transparent">
|
||||||
Everything you
|
Everything you
|
||||||
</span>{' '}
|
</span>{' '}
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { ArrowRight, Check, CreditCard, DollarSign, MapPin, Palette, Sparkles, Ticket, Zap } from 'lucide-react';
|
import { ArrowRight, Check, CreditCard, DollarSign, MapPin, Palette, Sparkles, Ticket, Zap } from 'lucide-react';
|
||||||
import { AnimatePresence, motion } from 'motion/react';
|
import { AnimatePresence, motion } from 'motion/react';
|
||||||
import { useEffect, useState } from 'react';
|
import { use, useEffect, useState } from 'react';
|
||||||
import { Layout } from '../Layout';
|
import { Layout } from '../Layout';
|
||||||
import { ImageWithFallback } from '../components/figma/ImageWithFallback';
|
import { ImageWithFallback } from '../components/figma/ImageWithFallback';
|
||||||
import { MobileAppSection } from '../components/MobileAppSection';
|
import { MobileAppSection } from '../components/MobileAppSection';
|
||||||
import { TrustSection } from '../components/TrustSection';
|
import { TrustSection } from '../components/TrustSection';
|
||||||
import { Button } from '../components/ui/button';
|
import { Button } from '../components/ui/button';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
interface User {
|
interface User {
|
||||||
email: string;
|
email: string;
|
||||||
@@ -68,6 +69,8 @@ export function DiscoverPage({
|
|||||||
const [direction, setDirection] = useState(0);
|
const [direction, setDirection] = useState(0);
|
||||||
const [activeStep, setActiveStep] = useState(0);
|
const [activeStep, setActiveStep] = useState(0);
|
||||||
|
|
||||||
|
const navigate =useNavigate();
|
||||||
|
|
||||||
const handleStepInView = (index: number) => {
|
const handleStepInView = (index: number) => {
|
||||||
setActiveStep(index);
|
setActiveStep(index);
|
||||||
};
|
};
|
||||||
@@ -687,8 +690,8 @@ export function DiscoverPage({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
onClick={onPassesClick}
|
onClick={()=>navigate('/passes')}
|
||||||
className="w-full py-6 rounded-full font-poppins font-semibold text-lg bg-gray-900 hover:bg-black text-white transition-all duration-300"
|
className="cursor-pointer w-full py-6 rounded-full font-poppins font-semibold text-lg bg-gray-900 hover:bg-black text-white transition-all duration-300"
|
||||||
>
|
>
|
||||||
VIEW FLEXI OPTIONS
|
VIEW FLEXI OPTIONS
|
||||||
</Button>
|
</Button>
|
||||||
@@ -743,8 +746,8 @@ export function DiscoverPage({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
onClick={onPassesClick}
|
onClick={()=>navigate('/passes')}
|
||||||
className="w-full py-6 rounded-full font-poppins font-semibold text-lg bg-primary hover:bg-primary/90 text-white transition-all duration-300"
|
className=" cursor-pointer w-full py-6 rounded-full font-poppins font-semibold text-lg bg-primary hover:bg-primary/90 text-white transition-all duration-300"
|
||||||
>
|
>
|
||||||
VIEW UNLIMITED OPTIONS
|
VIEW UNLIMITED OPTIONS
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ export function MagicItineraryPage({
|
|||||||
currentPage,
|
currentPage,
|
||||||
user
|
user
|
||||||
}: MagicItineraryPageProps) {
|
}: MagicItineraryPageProps) {
|
||||||
|
const cityName = localStorage.getItem("cityName") || "your city";
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<Layout activeCity="Landingpage" onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} user={user}>
|
<Layout activeCity="Landingpage" onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} user={user}>
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ export function PassesPage({
|
|||||||
<Clock className="w-7 h-7" strokeWidth={1.5} />
|
<Clock className="w-7 h-7" strokeWidth={1.5} />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 w-full">
|
<div className="flex-1 w-full">
|
||||||
<h3 className="font-merchant text-2xl text-gray-900 mb-3">Calendar Days Policy</h3>
|
<h3 className="font-merchant text-xl text-gray-900 mb-3">Calendar Days Policy</h3>
|
||||||
<p className="font-poppins text-gray-600 leading-relaxed mb-6">
|
<p className="font-poppins text-gray-600 leading-relaxed mb-6">
|
||||||
Unlimited passes work on a <span className="font-medium text-gray-900">consecutive calendar day basis</span>, not 24-hour periods. Your pass expires at 11:59 PM on your final day.
|
Unlimited passes work on a <span className="font-medium text-gray-900">consecutive calendar day basis</span>, not 24-hour periods. Your pass expires at 11:59 PM on your final day.
|
||||||
</p>
|
</p>
|
||||||
@@ -452,7 +452,7 @@ export function PassesPage({
|
|||||||
<Shield className="w-7 h-7" strokeWidth={1.5} />
|
<Shield className="w-7 h-7" strokeWidth={1.5} />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h3 className="font-merchant text-2xl text-gray-900 mb-3">60-Minute Adventure Gap</h3>
|
<h3 className="font-merchant text-xl text-gray-900 mb-3">60-Minute Adventure Gap</h3>
|
||||||
<p className="font-poppins text-gray-600 leading-relaxed">
|
<p className="font-poppins text-gray-600 leading-relaxed">
|
||||||
To keep the journey smooth for everyone, there's a simple <span className="font-medium text-gray-900">60-minute wait</span> between scanning your pass at attractions.
|
To keep the journey smooth for everyone, there's a simple <span className="font-medium text-gray-900">60-minute wait</span> between scanning your pass at attractions.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user