Update favicon and logo from SVG to WebP format

Replace puffin-logo.svg with puffinOffset.webp in both the favicon link and JSON-LD structured data to use WebP image format instead of SVG.
This commit is contained in:
Matt 2025-06-03 18:45:33 +02:00
parent eccfe856b1
commit 7484824246
4 changed files with 495 additions and 139 deletions

View File

@ -115,21 +115,33 @@ function App() {
}; };
return ( return (
<div className="min-h-screen bg-gradient-to-b from-blue-50 to-green-50"> <div className="min-h-screen bg-gradient-to-br from-slate-50 via-blue-50 to-cyan-50 wave-pattern">
<header className="bg-white shadow-sm relative"> <header className="glass-nav shadow-luxury relative z-50 sticky top-0">
<div className="max-w-7xl mx-auto px-4 py-4 sm:px-6 lg:px-8"> <div className="max-w-7xl mx-auto px-4 py-3 sm:px-6 lg:px-8">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div <motion.div
className="flex items-center space-x-3 cursor-pointer" className="flex items-center space-x-3 cursor-pointer group"
onClick={() => handleNavigate('home')} onClick={() => handleNavigate('home')}
whileHover={{ scale: 1.02 }}
transition={{ type: "spring", stiffness: 400, damping: 17 }}
> >
<img <motion.img
src="/puffinOffset.webp" src="/puffinOffset.webp"
alt="Puffin Offset Logo" alt="Puffin Offset Logo"
className="h-8 w-auto" className="h-10 w-auto transition-transform duration-300 group-hover:scale-110"
initial={{ opacity: 0, rotate: -10 }}
animate={{ opacity: 1, rotate: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
/> />
<h1 className="text-xl font-bold text-gray-900">Puffin Offset</h1> <motion.h1
</div> className="text-xl font-bold heading-luxury"
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
>
Puffin Offset
</motion.h1>
</motion.div>
{/* Mobile menu button */} {/* Mobile menu button */}
<button <button
@ -140,31 +152,26 @@ function App() {
</button> </button>
{/* Desktop navigation */} {/* Desktop navigation */}
<nav className="hidden sm:flex space-x-4"> <nav className="hidden sm:flex space-x-2">
<button {['calculator', 'how-it-works', 'about', 'contact'].map((page, index) => (
onClick={() => handleNavigate('calculator')} <motion.button
className={`text-gray-600 hover:text-gray-900 ${currentPage === 'calculator' ? 'font-semibold' : ''}`} key={page}
> onClick={() => handleNavigate(page as any)}
Calculator className={`px-4 py-2 rounded-xl font-medium transition-all duration-300 ${
</button> currentPage === page
<button ? 'bg-gradient-to-r from-blue-600 to-blue-700 text-white shadow-lg'
onClick={() => handleNavigate('how-it-works')} : 'text-slate-600 hover:text-slate-900 hover:bg-white/60'
className={`text-gray-600 hover:text-gray-900 ${currentPage === 'how-it-works' ? 'font-semibold' : ''}`} }`}
> whileHover={{ scale: 1.05 }}
How it Works whileTap={{ scale: 0.95 }}
</button> initial={{ opacity: 0, y: -10 }}
<button animate={{ opacity: 1, y: 0 }}
onClick={() => handleNavigate('about')} transition={{ duration: 0.4, delay: 0.6 + index * 0.1 }}
className={`text-gray-600 hover:text-gray-900 ${currentPage === 'about' ? 'font-semibold' : ''}`} >
> {page === 'how-it-works' ? 'How it Works' :
About page.charAt(0).toUpperCase() + page.slice(1)}
</button> </motion.button>
<button ))}
onClick={() => handleNavigate('contact')}
className={`text-gray-600 hover:text-gray-900 ${currentPage === 'contact' ? 'font-semibold' : ''}`}
>
Contact
</button>
</nav> </nav>
</div> </div>
@ -233,11 +240,73 @@ function App() {
</AnimatePresence> </AnimatePresence>
</main> </main>
<footer className="bg-white mt-16"> <footer className="bg-gradient-to-r from-slate-900 via-blue-900 to-slate-900 mt-16 relative overflow-hidden">
<div className="max-w-7xl mx-auto px-4 py-8 sm:px-6 lg:px-8"> <div className="absolute inset-0 bg-[url('data:image/svg+xml,%3csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3e%3cg fill='none' fill-rule='evenodd'%3e%3cg fill='%23ffffff' fill-opacity='0.03'%3e%3cpath d='m36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e')] opacity-20"></div>
<p className="text-center text-gray-500"> <div className="relative max-w-7xl mx-auto px-4 py-12 sm:px-6 lg:px-8">
Powered by Wren Carbon Offset Projects <div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-8">
</p> <motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
viewport={{ once: true }}
>
<div className="flex items-center space-x-3 mb-4">
<img
src="/puffinOffset.webp"
alt="Puffin Offset Logo"
className="h-8 w-auto"
/>
<h3 className="text-xl font-bold text-white">Puffin Offset</h3>
</div>
<p className="text-slate-300 leading-relaxed">
The world's most exclusive carbon offsetting platform for superyacht owners and operators.
</p>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
viewport={{ once: true }}
className="text-center md:text-left"
>
<h4 className="text-lg font-semibold text-white mb-4">Services</h4>
<ul className="space-y-2 text-slate-300">
<li className="hover:text-yellow-400 transition-colors cursor-pointer">Carbon Calculator</li>
<li className="hover:text-yellow-400 transition-colors cursor-pointer">Offset Portfolio</li>
<li className="hover:text-yellow-400 transition-colors cursor-pointer">Fleet Management</li>
<li className="hover:text-yellow-400 transition-colors cursor-pointer">Custom Solutions</li>
</ul>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
viewport={{ once: true }}
className="text-center md:text-left"
>
<h4 className="text-lg font-semibold text-white mb-4">Sustainability Partners</h4>
<p className="text-slate-300 mb-4">
Powered by verified carbon offset projects through Wren Climate
</p>
<div className="text-xs text-slate-400">
All projects are verified to international standards
</div>
</motion.div>
</div>
<motion.div
className="border-t border-slate-700 pt-8 text-center"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.6 }}
viewport={{ once: true }}
>
<p className="text-slate-400">
© 2024 Puffin Offset. Luxury meets sustainability.
</p>
</motion.div>
</div> </div>
</footer> </footer>
</div> </div>

View File

@ -1,12 +1,31 @@
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef, useState } from 'react';
import { Anchor, Globe, BarChart } from 'lucide-react'; import { Anchor, Globe, BarChart, Waves, Shield, Award, ArrowRight, Compass, Ship, Leaf } from 'lucide-react';
import { motion } from 'framer-motion'; import { motion, useScroll, useTransform } from 'framer-motion';
interface Props { interface Props {
onNavigate: (page: 'home' | 'calculator' | 'how-it-works' | 'about' | 'contact') => void; onNavigate: (page: 'home' | 'calculator' | 'how-it-works' | 'about' | 'contact') => void;
} }
export function Home({ onNavigate }: Props) { export function Home({ onNavigate }: Props) {
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
const heroRef = useRef<HTMLDivElement>(null);
const { scrollYProgress } = useScroll({
target: heroRef,
offset: ["start start", "end start"]
});
const y = useTransform(scrollYProgress, [0, 1], ["0%", "30%"]);
const opacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
useEffect(() => {
const handleMouseMove = (e: MouseEvent) => {
setMousePosition({ x: e.clientX, y: e.clientY });
};
window.addEventListener('mousemove', handleMouseMove);
return () => window.removeEventListener('mousemove', handleMouseMove);
}, []);
const handleCalculateClick = () => { const handleCalculateClick = () => {
onNavigate('calculator'); onNavigate('calculator');
setTimeout(() => { setTimeout(() => {
@ -58,118 +77,194 @@ export function Home({ onNavigate }: Props) {
}; };
return ( return (
<div className="max-w-7xl mx-auto"> <div className="relative">
{/* Luxury Hero Section */}
<motion.div <motion.div
className="relative mb-16" ref={heroRef}
initial={{ opacity: 0 }} className="relative h-[90vh] overflow-hidden parallax-container"
animate={{ opacity: 1 }} style={{ y, opacity }}
transition={{ duration: 0.8 }}
> >
<div className="relative h-[500px]"> {/* Background Image with Parallax */}
<motion.img <motion.div
initial={{ scale: 1.1, opacity: 0.8 }} className="absolute inset-0"
animate={{ scale: 1, opacity: 1 }} style={{
transition={{ duration: 2.5, ease: "easeOut" }} backgroundImage: "url('https://images.unsplash.com/photo-1544551763-46a013bb70d5?auto=format&fit=crop&q=80&w=2070')",
src="https://images.unsplash.com/photo-1567899378494-47b22a2ae96a?auto=format&fit=crop&q=80" backgroundSize: "cover",
alt="Luxury yacht on calm waters" backgroundPosition: "center",
className="absolute inset-0 w-full h-full object-cover" backgroundAttachment: "fixed"
/> }}
<motion.div initial={{ scale: 1.1 }}
initial={{ opacity: 0 }} animate={{ scale: 1 }}
animate={{ opacity: 1 }} transition={{ duration: 3, ease: "easeOut" }}
transition={{ duration: 1.5, delay: 0.5 }} />
className="absolute inset-0 bg-gradient-to-br from-blue-500/20 via-transparent to-green-500/20"
/> {/* Elegant Overlay */}
</div> <div className="absolute inset-0 bg-gradient-to-br from-slate-900/70 via-blue-900/50 to-transparent" />
<div className="absolute inset-0 flex items-end pb-16">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center"> {/* Floating Elements */}
<motion.h1 <motion.div
className="absolute top-20 right-20 w-2 h-2 bg-yellow-400 rounded-full opacity-60"
animate={{
x: mousePosition.x * 0.02,
y: mousePosition.y * 0.02,
}}
transition={{ type: "spring", stiffness: 50, damping: 20 }}
/>
{/* Hero Content */}
<div className="relative h-full flex items-center justify-center">
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<motion.div
initial={{ opacity: 0, y: 50 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 1, delay: 0.5 }}
className="mb-8"
>
<motion.h1
className="text-6xl sm:text-7xl lg:text-8xl font-bold mb-6"
style={{
background: "linear-gradient(135deg, #ffffff 0%, #e0f2fe 50%, #fcd34d 100%)",
backgroundClip: "text",
WebkitBackgroundClip: "text",
WebkitTextFillColor: "transparent",
textShadow: "0 4px 8px rgba(0,0,0,0.3)"
}}
>
Luxury Meets
<br />
<span className="text-gradient-gold">Sustainability</span>
</motion.h1>
<motion.p
className="text-xl sm:text-2xl text-slate-200 max-w-4xl mx-auto leading-relaxed mb-12"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 1, delay: 1 }}
>
The world's most exclusive carbon offsetting platform for superyacht owners and operators
</motion.p>
</motion.div>
<motion.div
className="flex flex-col sm:flex-row gap-6 justify-center items-center"
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ transition={{ duration: 0.8, delay: 1.3 }}
duration: 0.8,
delay: 0.2,
ease: [0.22, 1, 0.36, 1]
}}
className="text-5xl font-bold text-white mb-8 drop-shadow-lg"
> >
Set Sail Sustainably with Carbon Offsetting for Superyachts <motion.button
</motion.h1> onClick={handleCalculateClick}
<motion.p className="btn-premium text-lg px-8 py-4"
initial={{ opacity: 0, y: 20 }} whileHover={{ scale: 1.05, boxShadow: "0 10px 30px rgba(30, 64, 175, 0.4)" }}
animate={{ opacity: 1, y: 0 }} whileTap={{ scale: 0.95 }}
transition={{ >
duration: 0.6, Calculate Your Impact
delay: 0.6, <ArrowRight className="ml-2 inline" size={20} />
ease: [0.22, 1, 0.36, 1] </motion.button>
}}
className="text-xl text-white max-w-3xl mx-auto leading-relaxed drop-shadow-lg" <motion.button
> onClick={handleLearnMoreClick}
Luxury and environmental responsibility can go hand in hand when you choose to offset the carbon footprint of your superyacht adventures. className="btn-secondary text-lg px-8 py-4"
</motion.p> whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
>
Discover More
</motion.button>
</motion.div>
</div> </div>
</div> </div>
</motion.div> </motion.div>
<motion.div {/* Features Section with Luxury Styling */}
className="grid grid-cols-1 md:grid-cols-2 gap-12 mb-16" <div className="py-16 relative">
variants={staggerContainer}
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.3 }}
>
<motion.div <motion.div
className="bg-white rounded-xl shadow-lg p-8" className="text-center mb-16"
variants={fadeInUp} initial={{ opacity: 0, y: 30 }}
initial="rest" whileInView={{ opacity: 1, y: 0 }}
whileInView="rest" transition={{ duration: 0.8 }}
viewport={{ once: true }} viewport={{ once: true }}
whileHover="hover"
> >
<motion.div variants={scaleOnHover} className="h-full"> <h2 className="text-5xl font-bold heading-luxury mb-6">
<div className="flex items-center space-x-4 mb-6"> Exclusive Maritime Solutions
<motion.div </h2>
initial={{ rotate: -10, opacity: 0 }} <p className="text-xl text-slate-600 max-w-3xl mx-auto">
whileInView={{ rotate: 0, opacity: 1 }} Experience the pinnacle of sustainable luxury with our premium carbon offsetting services
transition={{ duration: 0.5, delay: 0.2 }} </p>
viewport={{ once: true }}
>
<Globe className="text-blue-600" size={32} />
</motion.div>
<h2 className="text-2xl font-bold text-gray-900">Flexible Offsetting Solutions</h2>
</div>
<p className="text-gray-600 leading-relaxed text-justify">
With Puffin's carbon offsetting program, it's simple to mitigate the environmental impact of a yacht's use by supporting impactful international projects. Whether you want to offset a portion of a single trip, a season, or a yacht's full annual emissions, Puffin gives you the flexibility to offset as much or as little as you like.
</p>
</motion.div>
</motion.div> </motion.div>
<motion.div <motion.div
className="bg-white rounded-xl shadow-lg p-8" className="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-16"
variants={fadeInUp} variants={staggerContainer}
initial="rest" initial="hidden"
whileInView="rest" whileInView="visible"
viewport={{ once: true }} viewport={{ once: true, amount: 0.2 }}
whileHover="hover"
> >
<motion.div variants={scaleOnHover} className="h-full"> <motion.div
<div className="flex items-center space-x-4 mb-6"> className="luxury-card p-8"
variants={fadeInUp}
whileHover="hover"
>
<motion.div variants={scaleOnHover} className="h-full text-center">
<motion.div <motion.div
initial={{ rotate: 10, opacity: 0 }} className="w-16 h-16 bg-gradient-to-br from-blue-500 to-blue-600 rounded-full flex items-center justify-center mx-auto mb-6"
initial={{ rotate: -10, opacity: 0 }}
whileInView={{ rotate: 0, opacity: 1 }} whileInView={{ rotate: 0, opacity: 1 }}
transition={{ duration: 0.5, delay: 0.3 }} transition={{ duration: 0.6, delay: 0.2 }}
viewport={{ once: true }} viewport={{ once: true }}
> >
<BarChart className="text-green-600" size={32} /> <Waves className="text-white" size={28} />
</motion.div> </motion.div>
<h2 className="text-2xl font-bold text-gray-900">Your Values, Your Choice</h2> <h3 className="text-2xl font-bold heading-luxury mb-4">Flexible Solutions</h3>
</div> <p className="text-slate-600 leading-relaxed">
<p className="text-gray-600 leading-relaxed text-justify"> Tailor your offsetting to match your yachting lifestyle - from single trips to full annual emissions coverage.
Our portfolios are designed to resonate with the values of our most environmentally-conscious clients, ensuring contributions align with their passion for a better planet. Our science-based, verified carbon offsetting projects have a real and ongoing impact in the fight against climate change. </p>
</p> </motion.div>
</motion.div>
<motion.div
className="luxury-card p-8"
variants={fadeInUp}
whileHover="hover"
>
<motion.div variants={scaleOnHover} className="h-full text-center">
<motion.div
className="w-16 h-16 bg-gradient-to-br from-yellow-400 to-yellow-500 rounded-full flex items-center justify-center mx-auto mb-6"
initial={{ rotate: 10, opacity: 0 }}
whileInView={{ rotate: 0, opacity: 1 }}
transition={{ duration: 0.6, delay: 0.4 }}
viewport={{ once: true }}
>
<Shield className="text-slate-800" size={28} />
</motion.div>
<h3 className="text-2xl font-bold heading-luxury mb-4">Verified Impact</h3>
<p className="text-slate-600 leading-relaxed">
Science-based projects with transparent reporting ensure your investment creates real environmental change.
</p>
</motion.div>
</motion.div>
<motion.div
className="luxury-card p-8"
variants={fadeInUp}
whileHover="hover"
>
<motion.div variants={scaleOnHover} className="h-full text-center">
<motion.div
className="w-16 h-16 bg-gradient-to-br from-green-500 to-green-600 rounded-full flex items-center justify-center mx-auto mb-6"
initial={{ rotate: -5, opacity: 0 }}
whileInView={{ rotate: 0, opacity: 1 }}
transition={{ duration: 0.6, delay: 0.6 }}
viewport={{ once: true }}
>
<Award className="text-white" size={28} />
</motion.div>
<h3 className="text-2xl font-bold heading-luxury mb-4">Premium Service</h3>
<p className="text-slate-600 leading-relaxed">
White-glove service designed for discerning yacht owners who demand excellence in sustainability.
</p>
</motion.div>
</motion.div> </motion.div>
</motion.div> </motion.div>
</motion.div> </div>
<motion.div <motion.div
className="bg-white rounded-xl shadow-lg p-12 mb-16 text-center" className="bg-white rounded-xl shadow-lg p-12 mb-16 text-center"

View File

@ -94,7 +94,7 @@ export function TripCalculator({ vesselData, onOffsetClick }: Props) {
return ( return (
<motion.div <motion.div
className="bg-white rounded-lg shadow-xl p-6 max-w-2xl w-full mt-8" className="luxury-card p-8 max-w-4xl w-full mt-8"
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ transition={{
@ -102,14 +102,22 @@ export function TripCalculator({ vesselData, onOffsetClick }: Props) {
ease: [0.22, 1, 0.36, 1] ease: [0.22, 1, 0.36, 1]
}} }}
> >
<div className="flex items-center justify-between mb-6"> <div className="flex items-center justify-between mb-8">
<h2 className="text-2xl font-bold text-gray-800">Carbon Offset Calculator</h2> <motion.h2
<motion.div className="text-3xl font-bold heading-luxury"
initial={{ rotate: -10, opacity: 0 }} initial={{ opacity: 0, x: -20 }}
animate={{ rotate: 0, opacity: 1 }} animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.5, delay: 0.2 }} transition={{ duration: 0.6, delay: 0.2 }}
> >
<Route className="text-blue-500" size={24} /> Premium Carbon Calculator
</motion.h2>
<motion.div
className="w-12 h-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-full flex items-center justify-center"
initial={{ rotate: -10, opacity: 0, scale: 0.8 }}
animate={{ rotate: 0, opacity: 1, scale: 1 }}
transition={{ duration: 0.6, delay: 0.3, type: "spring", stiffness: 300 }}
>
<Route className="text-white" size={20} />
</motion.div> </motion.div>
</div> </div>

View File

@ -1,3 +1,187 @@
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
/* Custom CSS Variables for Luxury Yacht Club Theme */
:root {
--navy-deep: #0F172A;
--ocean-blue: #1E40AF;
--ocean-light: #3B82F6;
--gold-accent: #F59E0B;
--gold-light: #FCD34D;
--gray-sophisticated: #64748B;
--gray-light: #E2E8F0;
--white-tinted: #F8FAFC;
}
/* Global Styles */
* {
scroll-behavior: smooth;
}
body {
background: linear-gradient(135deg, var(--white-tinted) 0%, #E0F2FE 100%);
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
/* Custom Glassmorphism Classes */
.glass-card {
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.18);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
}
.glass-nav {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
}
/* Premium Button Styles */
.btn-premium {
background: linear-gradient(135deg, var(--ocean-blue) 0%, var(--ocean-light) 100%);
color: white;
padding: 12px 32px;
border-radius: 12px;
font-weight: 600;
letter-spacing: 0.025em;
border: none;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 15px 0 rgba(30, 64, 175, 0.3);
position: relative;
overflow: hidden;
}
.btn-premium::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
.btn-premium:hover::before {
left: 100%;
}
.btn-premium:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px 0 rgba(30, 64, 175, 0.4);
}
.btn-secondary {
background: linear-gradient(135deg, var(--gold-accent) 0%, var(--gold-light) 100%);
color: var(--navy-deep);
padding: 12px 32px;
border-radius: 12px;
font-weight: 600;
letter-spacing: 0.025em;
border: none;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 15px 0 rgba(245, 158, 11, 0.3);
position: relative;
overflow: hidden;
}
.btn-secondary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px 0 rgba(245, 158, 11, 0.4);
}
/* Custom Shadow Classes */
.shadow-luxury {
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.shadow-premium {
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
}
/* Wave Pattern Background */
.wave-pattern {
background-image: url("data:image/svg+xml,%3csvg width='100' height='20' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='m0 10c20-10 20 10 40 0s20 10 40 0 20-10 20 0v10h-100z' fill='%23ffffff' fill-opacity='0.03'/%3e%3c/svg%3e");
background-repeat: repeat-x;
background-position: bottom;
}
/* Premium Card Styles */
.luxury-card {
background: linear-gradient(145deg, #ffffff 0%, #f8fafc 100%);
border: 1px solid rgba(226, 232, 240, 0.8);
border-radius: 20px;
box-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.1);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
}
.luxury-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--gold-accent), transparent);
opacity: 0;
transition: opacity 0.3s ease;
}
.luxury-card:hover::before {
opacity: 1;
}
.luxury-card:hover {
transform: translateY(-8px);
box-shadow: 0 20px 40px -5px rgba(0, 0, 0, 0.15);
border-color: rgba(30, 64, 175, 0.2);
}
/* Typography Enhancements */
.heading-luxury {
background: linear-gradient(135deg, var(--navy-deep) 0%, var(--ocean-blue) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-weight: 700;
letter-spacing: -0.025em;
}
.text-gradient-gold {
background: linear-gradient(135deg, var(--gold-accent) 0%, var(--gold-light) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-weight: 600;
}
/* Parallax Container */
.parallax-container {
position: relative;
overflow: hidden;
transform-style: preserve-3d;
}
/* Custom Scrollbar */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: var(--gray-light);
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, var(--ocean-blue), var(--ocean-light));
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, var(--navy-deep), var(--ocean-blue));
}