diff --git a/src/App.tsx b/src/App.tsx index 9958a64..a2d385b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,7 +3,6 @@ import './App.css' import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import OpenLayerMap from './components/UI/Map/OpenLayerMap'; import ArchitecturalShowcase from './components/UI/Homepage/showcase'; - function App() { diff --git a/src/components/UI/Homepage/showcase.tsx b/src/components/UI/Homepage/showcase.tsx index 532a0f0..7b51fe5 100644 --- a/src/components/UI/Homepage/showcase.tsx +++ b/src/components/UI/Homepage/showcase.tsx @@ -5,19 +5,21 @@ const ArchitecturalShowcase: React.FC = () => { const [heroVisible, setHeroVisible] = useState(false); const [imageVisible, setImageVisible] = useState(false); const [purposeVisible, setPurposeVisible] = useState(false); + const [servicesVisible, setServicesVisible] = useState(false); useEffect(() => { document.body.style.margin = '0'; document.body.style.padding = '0'; document.body.style.overflow = 'hidden'; - + const timer1 = setTimeout(() => setIsLoaded(true), 200); const timer2 = setTimeout(() => setHeroVisible(true), 600); const timer3 = setTimeout(() => setImageVisible(true), 1200); const timer4 = setTimeout(() => setPurposeVisible(true), 1800); - const timer5 = setTimeout(() => { + const timer5 = setTimeout(() => setServicesVisible(true), 2400); + const timer6 = setTimeout(() => { document.body.style.overflow = 'auto'; - }, 2000); + }, 2600); return () => { clearTimeout(timer1); @@ -25,34 +27,81 @@ const ArchitecturalShowcase: React.FC = () => { clearTimeout(timer3); clearTimeout(timer4); clearTimeout(timer5); + clearTimeout(timer6); }; }, []); const globalStyles = ` - body, html, #root { + html, body, #root { margin: 0; padding: 0; - width: 100vw; - height: 100vh; - + max-width: 100vw; + width: 100%; + height: 100%; + min-height: 100vh; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + overflow-x: hidden; + } + + * { + box-sizing: border-box; + } + /* Responsive CSS */ + + @media (max-width: 768px) { + /* Services grid single column */ + .services-grid { + grid-template-columns: 1fr !important; + gap: 2rem !important; + } + + /* Hide nav links (you can replace with hamburger menu) */ + .nav-links { + display: none !important; + } + + /* Hero Section Padding */ + .hero-content { + padding: 0 1rem; + } + + /* Hero Title */ + .hero-title { + font-size: 2.5rem !important; + line-height: 1.1 !important; + } + + /* Hero Subtitle */ + .hero-subtitle { + font-size: 1rem !important; + } + + /* CTA Button full width and centered content */ + .cta-btn { + width: 100% !important; + justify-content: center !important; + } + + /* Image container adjustments */ + .image-container { + padding: 0 1rem !important; + max-width: 100% !important; + } } `; const styles = { showcase: { fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", - minHeight: '100vh', + height: '100vh', backgroundColor: '#fafafa', margin: 0, padding: 0, - border: 'none', - outline: 'none', opacity: isLoaded ? 1 : 0, transform: isLoaded ? 'translateY(0) scale(1)' : 'translateY(50px) scale(0.95)', transition: 'all 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)', }, - header: { position: 'fixed' as const, top: 0, @@ -66,7 +115,6 @@ const ArchitecturalShowcase: React.FC = () => { transition: 'all 0.8s cubic-bezier(0.34, 1.26, 0.64, 1)', transitionDelay: '0.3s', }, - nav: { display: 'flex', alignItems: 'center', @@ -75,7 +123,6 @@ const ArchitecturalShowcase: React.FC = () => { maxWidth: '1400px', margin: '0 auto', }, - logo: { display: 'flex', alignItems: 'center', @@ -88,12 +135,10 @@ const ArchitecturalShowcase: React.FC = () => { transition: 'all 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55)', transitionDelay: '0.5s', }, - logoIcon: { fontSize: '1.2rem', animation: isLoaded ? 'pulse 2s infinite' : 'none', }, - navLinks: { display: 'flex', listStyle: 'none', @@ -101,7 +146,6 @@ const ArchitecturalShowcase: React.FC = () => { padding: 0, gap: '2rem', }, - navLink: { color: '#4a4a4a', textDecoration: 'none', @@ -113,23 +157,6 @@ const ArchitecturalShowcase: React.FC = () => { transform: isLoaded ? 'translateY(0)' : 'translateY(-20px)', transitionDelay: '0.7s', }, - - contactBtn: { - backgroundColor: '#1a1a1a', - color: 'white', - border: 'none', - padding: '0.75rem 1.5rem', - borderRadius: '50px', - fontSize: '0.9rem', - fontWeight: 500, - cursor: 'pointer', - transition: 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)', - fontFamily: 'inherit', - opacity: isLoaded ? 1 : 0, - transform: isLoaded ? 'translateX(0) scale(1)' : 'translateX(30px) scale(0.8)', - transitionDelay: '0.8s', - }, - hero: { display: 'flex', flexDirection: 'column' as const, @@ -139,31 +166,30 @@ const ArchitecturalShowcase: React.FC = () => { textAlign: 'center' as const, padding: '0 2rem', paddingTop: '80px', + opacity: heroVisible ? 1 : 0, + transform: heroVisible ? 'translateY(0)' : 'translateY(60px)', + transition: 'all 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)', }, - heroContent: { - maxWidth: '800px', + maxWidth: '900px', margin: '0 auto', }, - heroTitle: { - fontSize: 'clamp(2.5rem, 5vw, 4rem)', + fontSize: 'clamp(2.5rem, 5vw, 4.5rem)', fontWeight: 300, lineHeight: 1.2, color: '#1a1a1a', margin: '0 0 1.5rem 0', letterSpacing: '-0.02em', }, - heroSubtitle: { - fontSize: 'clamp(1.1rem, 2vw, 1.3rem)', + fontSize: 'clamp(1.1rem, 2vw, 1.4rem)', color: '#6a6a6a', lineHeight: 1.6, - margin: '0 0 2.5rem 0', + margin: '0 0 3rem 0', fontWeight: 400, - maxWidth: '600px', + maxWidth: '700px', }, - ctaBtn: { display: 'inline-flex', alignItems: 'center', @@ -171,7 +197,7 @@ const ArchitecturalShowcase: React.FC = () => { backgroundColor: '#1a1a1a', color: 'white', border: 'none', - padding: '1rem 2rem', + padding: '1.2rem 2.5rem', borderRadius: '50px', fontSize: '1rem', fontWeight: 500, @@ -180,20 +206,17 @@ const ArchitecturalShowcase: React.FC = () => { fontFamily: 'inherit', boxShadow: '0 4px 20px rgba(26, 26, 26, 0.15)', }, - ctaArrow: { fontSize: '1.2rem', transition: 'transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)', }, - imageSection: { - padding: '4rem 2rem', + padding: '5rem 2rem', backgroundColor: '#ffffff', opacity: imageVisible ? 1 : 0, transform: imageVisible ? 'translateY(0)' : 'translateY(80px)', transition: 'all 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)', }, - imageContainer: { maxWidth: '1200px', margin: '0 auto', @@ -204,14 +227,12 @@ const ArchitecturalShowcase: React.FC = () => { transition: 'all 1s cubic-bezier(0.25, 0.46, 0.45, 0.94)', transitionDelay: '0.2s', }, - heroImage: { width: '100%', height: 'auto', display: 'block', transition: 'transform 0.6s ease', }, - purpose: { padding: '6rem 2rem', backgroundColor: '#fafafa', @@ -220,108 +241,116 @@ const ArchitecturalShowcase: React.FC = () => { transition: 'all 1s cubic-bezier(0.25, 0.46, 0.45, 0.94)', textAlign: 'center' as const, }, - purposeContent: { - maxWidth: '1200px', + maxWidth: '1000px', margin: '0 auto', }, - purposeTitle: { - fontSize: 'clamp(2rem, 4vw, 2.5rem)', + fontSize: 'clamp(2rem, 4vw, 3rem)', fontWeight: 300, color: '#1a1a1a', - margin: '0 0 1.5rem 0', + margin: '0 0 2rem 0', letterSpacing: '-0.01em', }, - purposeDescription: { - fontSize: '1.1rem', + fontSize: '1.2rem', color: '#6a6a6a', - lineHeight: 1.6, + lineHeight: 1.7, margin: '0', maxWidth: '800px', }, - servicesSection: { padding: '8rem 2rem', - backgroundColor: '#fffff', + backgroundColor: '#ffffff', position: 'relative' as const, + minHeight: '100vh', + display: 'flex', + alignItems: 'center', + opacity: servicesVisible ? 1 : 0, + transform: servicesVisible ? 'translateY(0)' : 'translateY(80px)', + transition: 'all 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)', }, - servicesContainer: { maxWidth: '1400px', margin: '0 auto', - position: 'relative' as const, + width: '100%', }, - servicesHeader: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'flex-start', - marginBottom: '4rem', + textAlign: 'center' as const, + marginBottom: '5rem', position: 'relative' as const, }, - - servicesTitle: { fontSize: 'clamp(2.5rem, 5vw, 4rem)', - fontWeight: 400, - color: '#666', + fontWeight: 300, + color: '#1a1a1a', lineHeight: 1.2, - margin: 0, - textAlign: 'center' as const, - flex: 1, - letterSpacing: '-0.01em', + margin: '0 0 1.5rem 0', + letterSpacing: '-0.02em', }, - - viewAllBtn: { - backgroundColor: 'transparent', - border: 'none', - fontSize: '0.9rem', - color: '#666', - fontWeight: 500, - cursor: 'pointer', - textDecoration: 'underline', - fontFamily: 'inherit', - position: 'absolute' as const, - top: 0, - right: 0, + servicesSubtitle: { + fontSize: '1.2rem', + color: '#6a6a6a', + lineHeight: 1.6, + maxWidth: '600px', + margin: '0 auto', }, - servicesGrid: { display: 'grid', - gridTemplateColumns: 'repeat(3, 1fr)', - gap: '2rem', - marginTop: '2rem', + gridTemplateColumns: 'repeat(auto-fit, minmax(350px, 1fr))', + gap: '3rem', + marginTop: '3rem', }, - serviceCard: { backgroundColor: 'transparent', - padding: 60, + padding: '2.5rem 2rem', + borderRadius: '20px', position: 'relative' as const, + transition: 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)', + border: '1px solid rgba(0, 0, 0, 0.08)', + height: '100%', + display: 'flex', + flexDirection: 'column' as const, + }, + serviceIcon: { + fontSize: '3rem', + marginBottom: '1.5rem', + color: '#1a1a1a', }, - serviceTitle: { - fontSize: 'clamp(1.8rem, 3vw, 2.5rem)', - fontWeight: 400, - color: '#666', - lineHeight: 1.2, - margin: 0, + fontSize: 'clamp(1.5rem, 2.5vw, 1.8rem)', + fontWeight: 500, + color: '#1a1a1a', + lineHeight: 1.3, + margin: '0 0 1.5rem 0', letterSpacing: '-0.01em', - minHeight: '120px', }, - - serviceDescription: { fontSize: '1rem', - color: '#666', + color: '#6a6a6a', lineHeight: 1.6, - margin: '0 0 2rem 0', + margin: '0', flex: 1, }, - + footer: { + padding: '4rem 2rem 2rem', + backgroundColor: '#1a1a1a', + color: '#ffffff', + textAlign: 'center' as const, + }, + footerContent: { + maxWidth: '1200px', + margin: '0 auto', + }, + footerText: { + fontSize: '0.9rem', + color: '#9a9a9a', + margin: 0, + }, }; + // Event Handlers for hovers omitted for brevity — keep them from your original code + const handleNavLinkHover = (e: React.MouseEvent) => { e.currentTarget.style.color = '#1a1a1a'; }; @@ -330,18 +359,6 @@ const ArchitecturalShowcase: React.FC = () => { e.currentTarget.style.color = '#4a4a4a'; }; - const handleContactBtnHover = (e: React.MouseEvent) => { - e.currentTarget.style.backgroundColor = '#333333'; - e.currentTarget.style.transform = 'translateY(-2px)'; - e.currentTarget.style.boxShadow = '0 8px 25px rgba(26, 26, 26, 0.25)'; - }; - - const handleContactBtnLeave = (e: React.MouseEvent) => { - e.currentTarget.style.backgroundColor = '#1a1a1a'; - e.currentTarget.style.transform = 'translateY(0)'; - e.currentTarget.style.boxShadow = 'none'; - }; - const handleCtaBtnHover = (e: React.MouseEvent) => { e.currentTarget.style.backgroundColor = '#333333'; e.currentTarget.style.transform = 'translateY(-3px)'; @@ -366,59 +383,74 @@ const ArchitecturalShowcase: React.FC = () => { e.currentTarget.style.transform = 'scale(1)'; }; + const handleServiceCardHover = (e: React.MouseEvent) => { + e.currentTarget.style.transform = 'translateY(-8px)'; + e.currentTarget.style.boxShadow = '0 20px 40px rgba(0, 0, 0, 0.1)'; + e.currentTarget.style.backgroundColor = '#fafafa'; + }; + + const handleServiceCardLeave = (e: React.MouseEvent) => { + e.currentTarget.style.transform = 'translateY(0)'; + e.currentTarget.style.boxShadow = 'none'; + e.currentTarget.style.backgroundColor = 'transparent'; + }; + return ( <>