Merge version_2_1781655292924 into main #2
@@ -1,119 +1,38 @@
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
|
||||
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
|
||||
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
|
||||
import TestimonialOverlayCards from '@/components/sections/testimonial/TestimonialOverlayCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
export default function HomePage() {
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import FeaturesSection from './HomePage/sections/Features';
|
||||
import InsightsSection from './HomePage/sections/Insights';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
|
||||
|
||||
{/* webild-stub @2026-06-17T00:17:12.431Z: change the headline to 'Unlock Earth's Secrets in Seconds', rename the 'Contact Support' button to 'Request Access', and add a 'Trusted By' logo bar section directly below the Hero section to build industry authority. */}
|
||||
|
||||
import TrustedBySection from './HomePage/sections/TrustedBy';export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardCarousel
|
||||
tag="Deep Time Exploration"
|
||||
title="Lithos: Layers of Time"
|
||||
description="Experience the hidden geological story beneath your feet with our interactive spotlight reveal engine."
|
||||
primaryButton={{ text: "Start Digging", href: "#dig" }}
|
||||
secondaryButton={{ text: "Learn More", href: "#about" }}
|
||||
items={[
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/photo-stone-texture-pattern_58702-16034.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/beautiful-scenery-canyon-landscape-bryce-canyon-national-park-utah-usa_181624-29605.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/concrete-wall-texture_23-2147625995.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/rust-metal-with-peeling-paint_23-2148796606.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/photo-ground-texture-pattern_58702-15933.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/abstract-geometric-wavy-folds-background_1048-16955.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
<TrustedBySection />
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesRevealCards
|
||||
tag="Key Discoveries"
|
||||
title="Mapping the Crust"
|
||||
description="Trace the history of the earth through our layered sediment analysis tools."
|
||||
items={[
|
||||
{ title: "Fossil Records", description: "Uncover prehistoric biological evidence stored in stone.", imageSrc: "http://img.b2bpic.net/free-photo/photo-ground-texture-pattern_58702-15810.jpg" },
|
||||
{ title: "Seabed Mapping", description: "Visualize historical oceanic depths and shifts.", imageSrc: "http://img.b2bpic.net/free-photo/beautiful-photo-sea-waves_58702-16365.jpg" },
|
||||
{ title: "Ash Drifting", description: "Track volcanic history across millions of years.", imageSrc: "http://img.b2bpic.net/free-photo/top-view-clay-smudge-powder_23-2148862871.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesSection />
|
||||
|
||||
<div id="insights" data-section="insights">
|
||||
<SectionErrorBoundary name="insights">
|
||||
<AboutText
|
||||
title="The Science of Deep Time"
|
||||
primaryButton={{ text: "Explore Methods", href: "#methods" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<InsightsSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialOverlayCards
|
||||
tag="Expert Voices"
|
||||
title="What Geologists Say"
|
||||
description="Trusted by field experts across the globe."
|
||||
testimonials={[
|
||||
{ name: "Dr. Sarah Stone", role: "Lead Geologist", company: "Earth Sciences Inc", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/doctor-analyzing-with-microscope_23-2148168412.jpg" },
|
||||
{ name: "Mark Sediment", role: "Senior Paleontologist", company: "Fossil Hub", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/full-shot-man-holding-map_23-2150343022.jpg" },
|
||||
{ name: "Elena Crust", role: "Field researcher", company: "Global Mapping", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/cheerful-employee-lying-down-green-grass-with-book_23-2147562309.jpg" },
|
||||
{ name: "David Rocker", role: "Geological Educator", company: "Deep Time Academy", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-climbing-mountains_23-2150382998.jpg" },
|
||||
{ name: "Anna Lithos", role: "Researcher", company: "Plate Tectonics Lab", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/laboratory-worker-analyzing-blood-sample-glass_482257-7732.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsIconCards
|
||||
tag="Our Reach"
|
||||
title="Geological Impact"
|
||||
description="Key performance indicators of our global reach."
|
||||
metrics={[
|
||||
{ icon: "Map", title: "Mapped Regions", value: "1,200+" },
|
||||
{ icon: "Layers", title: "Sediment Layers", value: "50,000+" },
|
||||
{ icon: "Clock", title: "Years of History", value: "4.5B" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Learning Center"
|
||||
title="Frequently Asked Questions"
|
||||
description="Learn more about our geological platforms and services."
|
||||
categories={[
|
||||
{
|
||||
name: "Basics", items: [
|
||||
{ question: "What is Lithos?", answer: "Lithos is a digital platform dedicated to geological visualization." },
|
||||
{ question: "How do I start?", answer: "Simply navigate to our maps and click on a region." }
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get in Touch"
|
||||
text="Have questions about our geological mapping technology?"
|
||||
primaryButton={{ text: "Contact Support", href: "#contact-form" }}
|
||||
secondaryButton={{ text: "Schedule Demo", href: "#demo" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
21
src/pages/HomePage/sections/Contact.tsx
Normal file
21
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "contact" section.
|
||||
|
||||
import React from 'react';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ContactSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get in Touch"
|
||||
text="Have questions about our geological mapping technology?"
|
||||
primaryButton={{"href":"#contact-form","text":"Request Access"}}
|
||||
secondaryButton={{ text: "Schedule Demo", href: "#demo" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
28
src/pages/HomePage/sections/Faq.tsx
Normal file
28
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Learning Center"
|
||||
title="Frequently Asked Questions"
|
||||
description="Learn more about our geological platforms and services."
|
||||
categories={[
|
||||
{
|
||||
name: "Basics", items: [
|
||||
{ question: "What is Lithos?", answer: "Lithos is a digital platform dedicated to geological visualization." },
|
||||
{ question: "How do I start?", answer: "Simply navigate to our maps and click on a region." }
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
25
src/pages/HomePage/sections/Features.tsx
Normal file
25
src/pages/HomePage/sections/Features.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "features" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesRevealCards
|
||||
tag="Key Discoveries"
|
||||
title="Mapping the Crust"
|
||||
description="Trace the history of the earth through our layered sediment analysis tools."
|
||||
items={[
|
||||
{ title: "Fossil Records", description: "Uncover prehistoric biological evidence stored in stone.", imageSrc: "http://img.b2bpic.net/free-photo/photo-ground-texture-pattern_58702-15810.jpg" },
|
||||
{ title: "Seabed Mapping", description: "Visualize historical oceanic depths and shifts.", imageSrc: "http://img.b2bpic.net/free-photo/beautiful-photo-sea-waves_58702-16365.jpg" },
|
||||
{ title: "Ash Drifting", description: "Track volcanic history across millions of years.", imageSrc: "http://img.b2bpic.net/free-photo/top-view-clay-smudge-powder_23-2148862871.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
30
src/pages/HomePage/sections/Hero.tsx
Normal file
30
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,30 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "hero" section.
|
||||
|
||||
import React from 'react';
|
||||
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardCarousel
|
||||
tag="Deep Time Exploration"
|
||||
title="Unlock Earth's Secrets in Seconds"
|
||||
description="Experience the hidden geological story beneath your feet with our interactive spotlight reveal engine."
|
||||
primaryButton={{ text: "Start Digging", href: "#dig" }}
|
||||
secondaryButton={{ text: "Learn More", href: "#about" }}
|
||||
items={[
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/photo-stone-texture-pattern_58702-16034.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/beautiful-scenery-canyon-landscape-bryce-canyon-national-park-utah-usa_181624-29605.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/concrete-wall-texture_23-2147625995.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/rust-metal-with-peeling-paint_23-2148796606.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/photo-ground-texture-pattern_58702-15933.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/abstract-geometric-wavy-folds-background_1048-16955.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
19
src/pages/HomePage/sections/Insights.tsx
Normal file
19
src/pages/HomePage/sections/Insights.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "insights" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function InsightsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="insights" data-section="insights">
|
||||
<SectionErrorBoundary name="insights">
|
||||
<AboutText
|
||||
title="The Science of Deep Time"
|
||||
primaryButton={{ text: "Explore Methods", href: "#methods" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
25
src/pages/HomePage/sections/Metrics.tsx
Normal file
25
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "metrics" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MetricsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsIconCards
|
||||
tag="Our Reach"
|
||||
title="Geological Impact"
|
||||
description="Key performance indicators of our global reach."
|
||||
metrics={[
|
||||
{ icon: "Map", title: "Mapped Regions", value: "1,200+" },
|
||||
{ icon: "Layers", title: "Sediment Layers", value: "50,000+" },
|
||||
{ icon: "Clock", title: "Years of History", value: "4.5B" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Testimonials.tsx
Normal file
27
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "testimonials" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialOverlayCards from '@/components/sections/testimonial/TestimonialOverlayCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialOverlayCards
|
||||
tag="Expert Voices"
|
||||
title="What Geologists Say"
|
||||
description="Trusted by field experts across the globe."
|
||||
testimonials={[
|
||||
{ name: "Dr. Sarah Stone", role: "Lead Geologist", company: "Earth Sciences Inc", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/doctor-analyzing-with-microscope_23-2148168412.jpg" },
|
||||
{ name: "Mark Sediment", role: "Senior Paleontologist", company: "Fossil Hub", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/full-shot-man-holding-map_23-2150343022.jpg" },
|
||||
{ name: "Elena Crust", role: "Field researcher", company: "Global Mapping", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/cheerful-employee-lying-down-green-grass-with-book_23-2147562309.jpg" },
|
||||
{ name: "David Rocker", role: "Geological Educator", company: "Deep Time Academy", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-climbing-mountains_23-2150382998.jpg" },
|
||||
{ name: "Anna Lithos", role: "Researcher", company: "Plate Tectonics Lab", rating: 5, imageSrc: "http://img.b2bpic.net/free-photo/laboratory-worker-analyzing-blood-sample-glass_482257-7732.jpg" }
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
51
src/pages/HomePage/sections/TrustedBy.tsx
Normal file
51
src/pages/HomePage/sections/TrustedBy.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
import { motion } from "motion/react"
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal"
|
||||
import TextAnimation from "@/components/ui/TextAnimation"
|
||||
import Tag from "@/components/ui/Tag"
|
||||
|
||||
export default function TrustedBySection() {
|
||||
const names = ["Geotech", "EarthWorks", "Lithos Labs", "TerraFirma", "GeoCorp", "Stratum", "Mantle Dynamics"];
|
||||
|
||||
return (
|
||||
<section id="trusted-by" data-webild-section="trusted-by" className="relative w-full py-16 bg-background overflow-hidden border-b border-border/40">
|
||||
<div className="w-content-width mx-auto px-6 mb-8 text-center">
|
||||
<ScrollReveal variant="fade">
|
||||
<Tag text="Trusted By" className="mb-4 mx-auto" />
|
||||
<TextAnimation
|
||||
text="Industry Leaders"
|
||||
variant="fade-blur"
|
||||
tag="h2"
|
||||
gradientText={false}
|
||||
className="text-2xl md:text-3xl font-bold text-foreground mb-2"
|
||||
/>
|
||||
<p className="text-muted-foreground text-sm max-w-2xl mx-auto">
|
||||
Used by top geological research institutes worldwide.
|
||||
</p>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
|
||||
<div className="relative w-full flex overflow-hidden group">
|
||||
<div className="absolute inset-y-0 left-0 w-24 bg-gradient-to-r from-background to-transparent z-10" />
|
||||
<div className="absolute inset-y-0 right-0 w-24 bg-gradient-to-l from-background to-transparent z-10" />
|
||||
|
||||
<motion.div
|
||||
className="flex whitespace-nowrap items-center gap-16 px-8"
|
||||
animate={{ x: ["0%", "-50%"] }}
|
||||
transition={{
|
||||
repeat: Infinity,
|
||||
ease: "linear",
|
||||
duration: 20,
|
||||
}}
|
||||
>
|
||||
{[...names, ...names].map((name, i) => (
|
||||
<div key={i} className="flex items-center justify-center min-w-[120px]">
|
||||
<span className="text-xl font-bold text-muted-foreground/60 hover:text-foreground transition-colors duration-300">
|
||||
{name}
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user