Phase 1: Logo, Auszeichnung, Scroll-Animationen, Copyright 2025, nur echtes Testimonial
This commit is contained in:
126
src/App.tsx
126
src/App.tsx
@@ -1,28 +1,49 @@
|
|||||||
import { useState } from 'react';
|
import { useState, useEffect, useRef } from 'react';
|
||||||
import { ChevronDown, Check, Plus, Minus } from 'lucide-react';
|
import { ChevronDown, Check, Plus, Minus } from 'lucide-react';
|
||||||
|
|
||||||
|
// Custom hook for scroll animations
|
||||||
|
function useScrollAnimation() {
|
||||||
|
const ref = useRef<HTMLDivElement>(null);
|
||||||
|
const [isVisible, setIsVisible] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
([entry]) => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
setIsVisible(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ threshold: 0.1 }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ref.current) {
|
||||||
|
observer.observe(ref.current);
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => observer.disconnect();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return { ref, isVisible };
|
||||||
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [activeTestimonial, setActiveTestimonial] = useState(0);
|
const [activeTestimonial, setActiveTestimonial] = useState(0);
|
||||||
const [openFaq, setOpenFaq] = useState<number | null>(null);
|
const [openFaq, setOpenFaq] = useState<number | null>(null);
|
||||||
|
|
||||||
|
// Scroll animation refs
|
||||||
|
const problemSection = useScrollAnimation();
|
||||||
|
const solutionSection = useScrollAnimation();
|
||||||
|
const timelineSection = useScrollAnimation();
|
||||||
|
const pricingSection = useScrollAnimation();
|
||||||
|
const testimonialSection = useScrollAnimation();
|
||||||
|
const faqSection = useScrollAnimation();
|
||||||
|
|
||||||
const testimonials = [
|
const testimonials = [
|
||||||
{
|
{
|
||||||
quote: "Wir haben das SunHouse mit der Familie schon zweimal besucht und waren restlos überzeugt von der ganzheitlichen Technik und dem Wohlbehagen.",
|
quote: "Wir haben das SunHouse mit der Familie schon zweimal besucht und waren restlos überzeugt von der ganzheitlichen Technik und dem Wohlbehagen.",
|
||||||
author: "Tom Anand",
|
author: "Tom Anand",
|
||||||
title: "Zukunftsforscher und Indienexperte",
|
title: "Zukunftsforscher und Indienexperte",
|
||||||
company: ""
|
company: ""
|
||||||
},
|
|
||||||
{
|
|
||||||
quote: "Das SunHouse ist das erste Projekt, bei dem ich merkte: Das ist nicht nur Haus. Das ist Geschäftsmodell.",
|
|
||||||
author: "Thomas K.",
|
|
||||||
title: "Entwickler, Frankfurt",
|
|
||||||
company: "Real Estate Developer mit 8.000+ LinkedIn Followern"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
quote: "Das sollte Standard sein. Manfred zeigt, wie Kommunen ihre Energieunabhängigkeit erreichen.",
|
|
||||||
author: "Bürgermeister R.",
|
|
||||||
title: "Bürgermeister, Baden-Württemberg",
|
|
||||||
company: "Stadt mit 50.000+ Einwohnern"
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -46,7 +67,7 @@ function App() {
|
|||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen">
|
<div className="min-h-screen scroll-smooth">
|
||||||
{/* SECTION 1: HERO */}
|
{/* SECTION 1: HERO */}
|
||||||
<section className="relative min-h-screen flex items-center justify-center bg-gray-900">
|
<section className="relative min-h-screen flex items-center justify-center bg-gray-900">
|
||||||
<div
|
<div
|
||||||
@@ -55,6 +76,15 @@ function App() {
|
|||||||
></div>
|
></div>
|
||||||
<div className="absolute inset-0 bg-black opacity-60"></div>
|
<div className="absolute inset-0 bg-black opacity-60"></div>
|
||||||
|
|
||||||
|
{/* Logo top left */}
|
||||||
|
<div className="absolute top-6 left-6 z-20">
|
||||||
|
<img
|
||||||
|
src="/Sunhouse-energy-logo-02.png"
|
||||||
|
alt="SunHouse Energy Logo"
|
||||||
|
className="h-12 md:h-16 w-auto"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="relative z-10 max-w-5xl mx-auto px-4 text-center">
|
<div className="relative z-10 max-w-5xl mx-auto px-4 text-center">
|
||||||
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6 leading-tight">
|
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6 leading-tight">
|
||||||
Autark leben erleben
|
Autark leben erleben
|
||||||
@@ -75,11 +105,18 @@ function App() {
|
|||||||
↓ Führung Buchen (€79 oder Gruppe)
|
↓ Führung Buchen (€79 oder Gruppe)
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div className="inline-block bg-white bg-opacity-20 backdrop-blur-sm px-6 py-3 rounded-full">
|
<div className="flex flex-col md:flex-row items-center justify-center gap-4">
|
||||||
|
<div className="bg-white bg-opacity-20 backdrop-blur-sm px-6 py-3 rounded-full">
|
||||||
<p className="text-white text-sm md:text-base">
|
<p className="text-white text-sm md:text-base">
|
||||||
⭐ 40.000+ LinkedIn Follower | Expertenrat seit 40 Jahren
|
40.000+ LinkedIn Follower | Expertenrat seit 40 Jahren
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<img
|
||||||
|
src="/Arbeitgeber-der-Zukunft-kompakt.png"
|
||||||
|
alt="Auszeichnung: Arbeitgeber der Zukunft"
|
||||||
|
className="h-16 md:h-20 w-auto"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
|
<div className="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
|
||||||
@@ -89,7 +126,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 2: PROBLEM */}
|
{/* SECTION 2: PROBLEM */}
|
||||||
<section className="py-16 md:py-24 bg-gray-100">
|
<section className="py-16 md:py-24 bg-gray-100">
|
||||||
<div className="max-w-7xl mx-auto px-4">
|
<div
|
||||||
|
ref={problemSection.ref}
|
||||||
|
className={`max-w-7xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
problemSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
||||||
Das Dilemma der Energiewende
|
Das Dilemma der Energiewende
|
||||||
</h2>
|
</h2>
|
||||||
@@ -156,7 +198,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 3: SOLUTION */}
|
{/* SECTION 3: SOLUTION */}
|
||||||
<section className="py-16 md:py-24 bg-white">
|
<section className="py-16 md:py-24 bg-white">
|
||||||
<div className="max-w-7xl mx-auto px-4">
|
<div
|
||||||
|
ref={solutionSection.ref}
|
||||||
|
className={`max-w-7xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
solutionSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
||||||
Das SunHouse Konzept
|
Das SunHouse Konzept
|
||||||
</h2>
|
</h2>
|
||||||
@@ -255,7 +302,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 4: EXPERIENCE TIMELINE */}
|
{/* SECTION 4: EXPERIENCE TIMELINE */}
|
||||||
<section className="py-16 md:py-24 bg-gray-100">
|
<section className="py-16 md:py-24 bg-gray-100">
|
||||||
<div className="max-w-4xl mx-auto px-4">
|
<div
|
||||||
|
ref={timelineSection.ref}
|
||||||
|
className={`max-w-4xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
timelineSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-16">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-16">
|
||||||
Deine 90-Minuten-Erfahrung
|
Deine 90-Minuten-Erfahrung
|
||||||
</h2>
|
</h2>
|
||||||
@@ -333,7 +385,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 5: PRICING */}
|
{/* SECTION 5: PRICING */}
|
||||||
<section id="booking" className="py-16 md:py-24 bg-white">
|
<section id="booking" className="py-16 md:py-24 bg-white">
|
||||||
<div className="max-w-7xl mx-auto px-4">
|
<div
|
||||||
|
ref={pricingSection.ref}
|
||||||
|
className={`max-w-7xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
pricingSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-4">
|
||||||
Einführungspreise 2025
|
Einführungspreise 2025
|
||||||
</h2>
|
</h2>
|
||||||
@@ -494,7 +551,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 6: TESTIMONIALS */}
|
{/* SECTION 6: TESTIMONIALS */}
|
||||||
<section className="py-16 md:py-24 bg-gray-100">
|
<section className="py-16 md:py-24 bg-gray-100">
|
||||||
<div className="max-w-5xl mx-auto px-4">
|
<div
|
||||||
|
ref={testimonialSection.ref}
|
||||||
|
className={`max-w-5xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
testimonialSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-16">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-16">
|
||||||
Was Besucher sagen
|
Was Besucher sagen
|
||||||
</h2>
|
</h2>
|
||||||
@@ -510,19 +572,6 @@ function App() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-center gap-2 mb-12">
|
|
||||||
{testimonials.map((_, index) => (
|
|
||||||
<button
|
|
||||||
key={index}
|
|
||||||
onClick={() => setActiveTestimonial(index)}
|
|
||||||
className={`w-3 h-3 rounded-full transition-all duration-300 ${
|
|
||||||
index === activeTestimonial ? 'bg-green-500 w-8' : 'bg-gray-300'
|
|
||||||
}`}
|
|
||||||
aria-label={`Testimonial ${index + 1}`}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="grid md:grid-cols-3 gap-8 text-center">
|
<div className="grid md:grid-cols-3 gap-8 text-center">
|
||||||
<div>
|
<div>
|
||||||
<p className="text-3xl font-bold text-green-500 mb-2">⭐ 95%</p>
|
<p className="text-3xl font-bold text-green-500 mb-2">⭐ 95%</p>
|
||||||
@@ -542,7 +591,12 @@ function App() {
|
|||||||
|
|
||||||
{/* SECTION 7: FAQ */}
|
{/* SECTION 7: FAQ */}
|
||||||
<section className="py-16 md:py-24 bg-white">
|
<section className="py-16 md:py-24 bg-white">
|
||||||
<div className="max-w-4xl mx-auto px-4">
|
<div
|
||||||
|
ref={faqSection.ref}
|
||||||
|
className={`max-w-4xl mx-auto px-4 transition-all duration-700 ${
|
||||||
|
faqSection.isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-12">
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-12">
|
||||||
Häufig gestellte Fragen
|
Häufig gestellte Fragen
|
||||||
</h2>
|
</h2>
|
||||||
@@ -671,7 +725,7 @@ function App() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="border-t border-gray-700 pt-8 text-center text-sm">
|
<div className="border-t border-gray-700 pt-8 text-center text-sm">
|
||||||
<p>© 2024 SunHouse. Alle Rechte vorbehalten.</p>
|
<p>© 2025 SunHouse. Alle Rechte vorbehalten.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
Reference in New Issue
Block a user