Update src/app/booking/page.tsx

This commit is contained in:
2026-03-14 05:31:26 +00:00
parent 29f95bf118
commit ce87861567

View File

@@ -2,19 +2,31 @@
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleFullscreen from '@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen';
import ContactForm from '@/components/form/ContactForm';
import ContactText from '@/components/sections/contact/ContactText';
import HeroLogo from '@/components/sections/hero/HeroLogo';
import ContactCenter from '@/components/sections/contact/ContactCenter';
import FooterSimple from '@/components/sections/footer/FooterSimple';
import { Calendar } from 'lucide-react';
import { useState } from 'react';
import { Calendar, Clock, Users, Palette, CheckCircle } from 'lucide-react';
export default function BookingPage() {
const [formData, setFormData] = useState({
eventType: '',
eventDate: '',
eventTime: '',
guestCount: '',
budget: '',
notes: '',
});
const [submitted, setSubmitted] = useState(false);
const navItems = [
{ name: "Home", id: "home" },
{ name: "Services", id: "services" },
{ name: "Home", id: "/" },
{ name: "Services", id: "/#services" },
{ name: "Gallery", id: "/gallery" },
{ name: "Packages", id: "packages" },
{ name: "About", id: "about" },
{ name: "Book Event", id: "/booking" },
{ name: "Packages", id: "/#packages" },
{ name: "About", id: "/#about" },
{ name: "Booking", id: "/booking" },
{ name: "Contact", id: "/contact" },
];
@@ -30,10 +42,10 @@ export default function BookingPage() {
},
{
title: "Company", items: [
{ label: "About Us", href: "/about" },
{ label: "About Us", href: "/#about" },
{ label: "Gallery", href: "/gallery" },
{ label: "Packages", href: "/packages" },
{ label: "FAQ", href: "#faq" },
{ label: "Packages", href: "/#packages" },
{ label: "FAQ", href: "/#faq" },
{ label: "Contact", href: "/contact" },
],
},
@@ -56,6 +68,29 @@ export default function BookingPage() {
},
];
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
setSubmitted(true);
setTimeout(() => setSubmitted(false), 5000);
};
const availableDates = [
{ date: '2025-02-15', available: true },
{ date: '2025-02-16', available: false },
{ date: '2025-02-17', available: true },
{ date: '2025-02-22', available: true },
{ date: '2025-02-23', available: true },
{ date: '2025-03-01', available: true },
{ date: '2025-03-02', available: false },
{ date: '2025-03-08', available: true },
{ date: '2025-03-09', available: true },
];
return (
<ThemeProvider
defaultButtonVariant="shift-hover"
@@ -78,69 +113,183 @@ export default function BookingPage() {
/>
</div>
<div id="booking-form" data-section="booking-form" className="mx-auto px-4 md:px-6 py-16">
<div className="max-w-2xl mx-auto">
<ContactForm
title="Book Your Event"
description="Get started with a quick inquiry. We'll follow up with you within 24 hours with availability and pricing details tailored to your event."
tag="Lead Generation"
tagIcon={Calendar}
inputPlaceholder="Your email address"
buttonText="Get Started"
termsText="By submitting this form, you agree to be contacted about your event booking inquiry. We respect your privacy."
centered={true}
useInvertedBackground={false}
onSubmit={(email) => {
console.log('Booking inquiry from:', email);
}}
className="w-full"
titleClassName="text-4xl font-extrabold mb-4"
descriptionClassName="text-lg opacity-90 mb-8"
tagClassName="mb-4"
formWrapperClassName="mt-8"
/>
</div>
<div id="hero-booking" data-section="hero-booking" className="mx-auto px-4 md:px-6">
<HeroLogo
logoText="Event Booking"
description="Secure your date and customize your face painting and body art experience. Check availability, fill out your booking form, and let's create something amazing."
buttons={[{ text: "Scroll to Book", href: "#booking-form" }]}
buttonAnimation="blur-reveal"
showDimOverlay={false}
ariaLabel="Booking page hero section"
className="min-h-screen flex items-center justify-center"
containerClassName="text-center"
descriptionClassName="text-lg opacity-90 max-w-2xl mx-auto"
logoContainerClassName="mb-6"
logoClassName="text-5xl md:text-6xl font-extrabold"
/>
</div>
<div id="booking-features" data-section="booking-features" className="mx-auto px-4 md:px-6 py-16">
<div id="availability-calendar" data-section="availability-calendar" className="mx-auto px-4 md:px-6 py-16">
<div className="max-w-4xl mx-auto">
<h2 className="text-3xl font-extrabold mb-12 text-center">Our Booking Process</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="p-6 bg-gradient-to-br from-blue-50 to-cyan-50 rounded-lg">
<div className="text-4xl font-extrabold text-blue-600 mb-4">1</div>
<h3 className="text-xl font-bold mb-3">Submit Inquiry</h3>
<p className="text-opacity-80">Fill out our quick booking form with your event details and preferred date.</p>
<h2 className="text-4xl font-extrabold mb-4 text-center">Availability Calendar</h2>
<p className="text-lg opacity-90 text-center mb-12 max-w-2xl mx-auto">Check our availability and select your preferred event date. Green indicates available dates, red shows booked slots.</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="space-y-4">
<div className="flex items-center gap-3 p-3 bg-green-100 rounded-lg">
<div className="w-4 h-4 bg-green-500 rounded"></div>
<span className="text-sm font-medium">Available</span>
</div>
<div className="flex items-center gap-3 p-3 bg-red-100 rounded-lg">
<div className="w-4 h-4 bg-red-500 rounded"></div>
<span className="text-sm font-medium">Booked</span>
</div>
</div>
<div className="p-6 bg-gradient-to-br from-purple-50 to-pink-50 rounded-lg">
<div className="text-4xl font-extrabold text-purple-600 mb-4">2</div>
<h3 className="text-xl font-bold mb-3">Get Quote</h3>
<p className="text-opacity-80">We'll review your event details and send you a custom quote within 24 hours.</p>
</div>
<div className="p-6 bg-gradient-to-br from-green-50 to-emerald-50 rounded-lg">
<div className="text-4xl font-extrabold text-green-600 mb-4">3</div>
<h3 className="text-xl font-bold mb-3">Confirm Booking</h3>
<p className="text-opacity-80">Once confirmed, we'll send you all the details and setup information for your event.</p>
<div className="grid grid-cols-3 gap-2">
{availableDates.map((slot) => {
const date = new Date(slot.date);
return (
<button
key={slot.date}
className={`p-3 rounded-lg font-semibold text-sm transition-all ${
slot.available
? 'bg-green-100 text-green-900 hover:bg-green-200 cursor-pointer'
: 'bg-red-100 text-red-900 cursor-not-allowed opacity-50'
}`}
disabled={!slot.available}
>
{date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}
</button>
);
})}
</div>
</div>
</div>
</div>
<div id="booking-contact" data-section="booking-contact" className="mx-auto px-4 md:px-6">
<ContactText
text="Prefer to discuss your event first? Contact us directly and let's create something amazing together."
animationType="background-highlight"
background={{ variant: "radial-gradient" }}
useInvertedBackground={false}
buttons={[
{ text: "Call Us", href: "tel:+15551234567" },
{ text: "Email Us", href: "mailto:paintasy@events.com" },
]}
ariaLabel="Booking contact call-to-action section"
containerClassName="py-16"
contentClassName="max-w-3xl mx-auto"
textClassName="text-4xl font-extrabold text-center"
buttonContainerClassName="flex flex-col sm:flex-row gap-4 justify-center mt-8"
/>
<div id="booking-form" data-section="booking-form" className="mx-auto px-4 md:px-6 py-16">
<div className="max-w-2xl mx-auto">
<h2 className="text-4xl font-extrabold mb-4 text-center">Booking Form</h2>
<p className="text-lg opacity-90 text-center mb-12">Tell us about your event and we'll customize the perfect package for you.</p>
{submitted ? (
<div className="bg-green-100 border-2 border-green-500 rounded-lg p-8 text-center">
<CheckCircle className="w-12 h-12 text-green-600 mx-auto mb-4" />
<h3 className="text-2xl font-bold mb-2">Booking Request Submitted!</h3>
<p className="text-lg opacity-90">We'll contact you within 24 hours to confirm your event details and finalize your booking.</p>
</div>
) : (
<form onSubmit={handleSubmit} className="space-y-6 bg-white bg-opacity-5 backdrop-blur-sm p-8 rounded-lg border border-white border-opacity-10">
<div>
<label htmlFor="eventType" className="block text-sm font-semibold mb-2">Event Type *</label>
<select
id="eventType"
name="eventType"
value={formData.eventType}
onChange={handleInputChange}
required
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all"
>
<option value="">Select event type</option>
<option value="birthday">Birthday Party</option>
<option value="festival">Festival/Outdoor Event</option>
<option value="corporate">Corporate Event</option>
<option value="wedding">Wedding/Reception</option>
<option value="other">Other</option>
</select>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="eventDate" className="block text-sm font-semibold mb-2 flex items-center gap-2">
<Calendar className="w-4 h-4" /> Event Date *
</label>
<input
type="date"
id="eventDate"
name="eventDate"
value={formData.eventDate}
onChange={handleInputChange}
required
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all"
/>
</div>
<div>
<label htmlFor="eventTime" className="block text-sm font-semibold mb-2 flex items-center gap-2">
<Clock className="w-4 h-4" /> Event Time *
</label>
<input
type="time"
id="eventTime"
name="eventTime"
value={formData.eventTime}
onChange={handleInputChange}
required
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all"
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="guestCount" className="block text-sm font-semibold mb-2 flex items-center gap-2">
<Users className="w-4 h-4" /> Expected Guest Count *
</label>
<input
type="number"
id="guestCount"
name="guestCount"
value={formData.guestCount}
onChange={handleInputChange}
placeholder="e.g., 30"
required
min="1"
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all"
/>
</div>
<div>
<label htmlFor="budget" className="block text-sm font-semibold mb-2 flex items-center gap-2">
<Palette className="w-4 h-4" /> Budget (Optional)
</label>
<input
type="text"
id="budget"
name="budget"
value={formData.budget}
onChange={handleInputChange}
placeholder="e.g., $200-300"
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all"
/>
</div>
</div>
<div>
<label htmlFor="notes" className="block text-sm font-semibold mb-2">Additional Notes</label>
<textarea
id="notes"
name="notes"
value={formData.notes}
onChange={handleInputChange}
placeholder="Tell us about your vision, themes, special requests, etc."
rows={4}
className="w-full px-4 py-2 rounded-lg bg-white bg-opacity-10 border border-white border-opacity-20 focus:outline-none focus:border-opacity-50 transition-all resize-none"
/>
</div>
<button
type="submit"
className="w-full bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-bold py-3 px-6 rounded-lg transition-all duration-300 transform hover:scale-105"
>
Submit Booking Request
</button>
<p className="text-sm opacity-75 text-center">* Required fields. We'll contact you shortly to confirm and discuss details.</p>
</form>
)}
</div>
</div>
<div id="footer-booking" data-section="footer-booking" className="mx-auto px-4 md:px-6">
@@ -157,4 +306,4 @@ export default function BookingPage() {
</div>
</ThemeProvider>
);
}
}