Merge version_2_1782141719215 into main #2

Merged
bender merged 2 commits from version_2_1782141719215 into main 2026-06-22 15:25:46 +00:00
11 changed files with 337 additions and 172 deletions

View File

@@ -1,5 +1,5 @@
import FooterSimpleCard from '@/components/sections/footer/FooterSimpleCard';
import NavbarDropdown from '@/components/ui/NavbarDropdown';
import NavbarFloatingLogo from '@/components/ui/NavbarFloatingLogo';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
import { Outlet } from 'react-router-dom';
@@ -41,8 +41,9 @@ export default function Layout() {
<StyleProvider buttonVariant="default" siteBackground="gridDots" heroBackground="lightRaysCenter">
<SiteBackgroundSlot />
<SectionErrorBoundary name="navbar">
<NavbarDropdown
<NavbarFloatingLogo
logo="StudyPhase"
logoImageSrc="https://storage.googleapis.com/webild/users/user_3FUrHlCP4jtWJZGQp1CMN4kBeZr/uploaded-1782141202944-19cao9h7.png"
ctaButton={{
text: "Book Tutor",
href: "#contact",
@@ -127,4 +128,4 @@ export default function Layout() {
</SectionErrorBoundary>
</StyleProvider>
);
}
}

View File

@@ -1,182 +1,39 @@
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
import FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
import HeroBillboard from '@/components/sections/hero/HeroBillboard';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import TeamStackedCards from '@/components/sections/team/TeamStackedCards';
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 AboutSection from './HomePage/sections/About';
import FeaturesSection from './HomePage/sections/Features';
import MetricsSection from './HomePage/sections/Metrics';
import TeamSection from './HomePage/sections/Team';
import TestimonialsSection from './HomePage/sections/Testimonials';
import SocialSection from './HomePage/sections/Social';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBillboard
tag="Personalised Tutoring Excellence"
title="Unlocking Your Childs Full Academic Potential"
description="Expert home and online tutoring from Early Years to Secondary level. Delivering British, Cambridge, and international curricula with a focus on confidence, performance, and results."
primaryButton={{
text: "Get Started", href: "#contact"}}
secondaryButton={{
text: "Learn More", href: "#about"}}
imageSrc="http://img.b2bpic.net/free-photo/concentrated-hipster-writes-notebook-information-he-hears-from-female-who-reads-news-from-internet-website-beautiful-black-girl-keyboards-laptop-computer_273609-44838.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTestimonial
tag="Our Mission"
quote="We focus on building confidence, improving performance, and nurturing each childs potential. Our highly qualified teachers work across diverse curricula to make learning structured and result-oriented."
author="Operations Team"
role="StudyPhase Tutoring Service"
imageSrc="http://img.b2bpic.net/free-photo/brainstroming-education-concept-two-students-discuss-their-subject-write-notebook-create-article-blog-discuss-ideas-development-sit-coworking-space-tutor-gives-private-lesson_273609-28933.jpg"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesTaggedCards
tag="Services"
title="Comprehensive Educational Support"
description="Tailored solutions for every learner, ensuring academic success at every stage."
items={[
{
tag: "Curriculum", title: "Diverse Curricula", description: "Expert delivery across British, Cambridge, Nigerian, and international academic standards.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/person-working-late-night-computer-home_52683-105038.jpg"},
{
tag: "Feedback", title: "Progress Tracking", description: "Regular check-ins with our operations team to provide feedback, updates, and follow-up support.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/woman-giving-presentation-office-pandemic-with-mask_23-2148666343.jpg"},
{
tag: "Recognition", title: "Achievement Awards", description: "Celebrating every success to make learning engaging and motivating for students.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/class-2025-celebration_23-2151966277.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<FeaturesSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsFeatureCards
tag="Success Stats"
title="Proven Academic Results"
description="Our commitment to quality tutoring ensures students thrive in their academic pursuits."
metrics={[
{
value: "5.0", title: "Google Rating", features: [
"Verified reviews", "Top-tier service", "Trusted teachers"],
},
{
value: "100%", title: "Personalized", features: [
"Custom curricula", "Confidence building", "Result-oriented"],
},
{
value: "24/7", title: "Accessibility", features: [
"Always open", "Global support", "Flexible hours"],
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamStackedCards
tag="Our Experts"
title="Highly Qualified Educators"
description="Experienced teachers dedicated to nurturing your child's academic journey."
members={[
{
name: "Sarah Jenkins", role: "Head of Primary", imageSrc: "http://img.b2bpic.net/free-photo/man-teacher-wearing-glasses-sitting-school-desk-with-class-register-front-blackboard-classroom-holding-number-plates-explaining-lesson-showing-thumb-up-happy-positive_141793-131601.jpg"},
{
name: "Mark Adeyemi", role: "Senior STEM Tutor", imageSrc: "http://img.b2bpic.net/free-photo/serious-young-blonde-female-teacher-wearing-glasses-classroom-standing-front-chalkboard-profile-view-leaning-head-chalkboard-looking-camera_141793-105255.jpg"},
{
name: "Jane Wilson", role: "International Curriculum Lead", imageSrc: "http://img.b2bpic.net/free-photo/brunette-businesswoman-posing_23-2148142135.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<TeamSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialOverlayCards
tag="Reviews"
title="What Our Families Say"
description="Trusted by hundreds of parents and students to deliver academic excellence."
testimonials={[
{
name: "Sarah Johnson", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-father-daughter_23-2147615879.jpg"},
{
name: "Michael Chen", role: "Student", company: "Learner", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-smiling-blond-woman-standing-street-with-notebooks-carries-journal-work_1258-205929.jpg"},
{
name: "Emily Rodriguez", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-sitting-table-with-book_273609-12710.jpg"},
{
name: "David Kim", role: "Student", company: "Learner", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-young-partners-cooperate-together-workspace-give-high-five-each-other-have-overjoyed-expressions-work-research-write-down-records-notepad-ponder-idea-work-as-team_273609-28945.jpg"},
{
name: "Linda Thompson", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-helping-kid-with-homework_23-2149610754.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="social" data-section="social">
<SectionErrorBoundary name="social">
<SocialProofMarquee
tag="Accredited Excellence"
title="Partners & Curriculum Standards"
description="Recognized by leading educational bodies globally."
names={[
"British Council", "Cambridge International", "Nigerian Educational Board", "International Baccalaureate", "Edexcel", "Oxford Learning", "Global Tutor Network"]}
/>
</SectionErrorBoundary>
</div>
<SocialSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSplitMedia
tag="Support"
title="Common Questions"
description="Everything you need to know about starting your child's tutoring journey with us."
items={[
{
question: "What curricula do you teach?", answer: "We deliver lessons across British, Cambridge, Nigerian, and international curricula."},
{
question: "Are tutors qualified?", answer: "Yes, our tutors are highly qualified, experienced, and undergo rigorous selection processes."},
{
question: "Do you provide progress updates?", answer: "Absolutely. Tutors check in regularly with our operations team to provide feedback and updates."},
{
question: "Can we do online tutoring?", answer: "Yes, we offer both personalized home-based and flexible online tutoring services."},
]}
imageSrc="http://img.b2bpic.net/free-photo/father-being-tutor-her-daughter-indoors_23-2148510994.jpg"
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Start Today"
text="Ready to unlock your child's potential? Book a session with us today."
primaryButton={{
text: "Call 0907 336 7103", href: "tel:09073367103"}}
secondaryButton={{
text: "Contact Us", href: "mailto:info@studyphase.com"}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,22 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "about" section.
import React from 'react';
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTestimonial
tag="Our Mission"
quote="We focus on building confidence, improving performance, and nurturing each childs potential. Our highly qualified teachers work across diverse curricula to make learning structured and result-oriented."
author="Operations Team"
role="StudyPhase Tutoring Service"
imageSrc="http://img.b2bpic.net/free-photo/brainstroming-education-concept-two-students-discuss-their-subject-write-notebook-create-article-blog-discuss-ideas-development-sit-coworking-space-tutor-gives-private-lesson_273609-28933.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,23 @@
// 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="Start Today"
text="Ready to unlock your child's potential? Book a session with us today."
primaryButton={{
text: "Call 0907 336 7103", href: "tel:09073367103"}}
secondaryButton={{
text: "Contact Us", href: "mailto:info@studyphase.com"}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,31 @@
// 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 FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSplitMedia
tag="Support"
title="Common Questions"
description="Everything you need to know about starting your child's tutoring journey with us."
items={[
{
question: "What curricula do you teach?", answer: "We deliver lessons across British, Cambridge, Nigerian, and international curricula."},
{
question: "Are tutors qualified?", answer: "Yes, our tutors are highly qualified, experienced, and undergo rigorous selection processes."},
{
question: "Do you provide progress updates?", answer: "Absolutely. Tutors check in regularly with our operations team to provide feedback and updates."},
{
question: "Can we do online tutoring?", answer: "Yes, we offer both personalized home-based and flexible online tutoring services."},
]}
imageSrc="http://img.b2bpic.net/free-photo/father-being-tutor-her-daughter-indoors_23-2148510994.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,34 @@
// 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 FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FeaturesSection(): React.JSX.Element {
return (
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesTaggedCards
tag="Services"
title="Comprehensive Educational Support"
description="Tailored solutions for every learner, ensuring academic success at every stage."
items={[
{
tag: "Curriculum", title: "Diverse Curricula", description: "Expert delivery across British, Cambridge, Nigerian, and international academic standards.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/person-working-late-night-computer-home_52683-105038.jpg"},
{
tag: "Feedback", title: "Progress Tracking", description: "Regular check-ins with our operations team to provide feedback, updates, and follow-up support.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/woman-giving-presentation-office-pandemic-with-mask_23-2148666343.jpg"},
{
tag: "Recognition", title: "Achievement Awards", description: "Celebrating every success to make learning engaging and motivating for students.", primaryButton: {
text: "Explore", href: "#"},
imageSrc: "http://img.b2bpic.net/free-photo/class-2025-celebration_23-2151966277.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,76 @@
/* eslint-disable */
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
import Button from "@/components/ui/Button";
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import ScrollReveal from "@/components/ui/ScrollReveal";
import AvatarGroup from "@/components/ui/AvatarGroup";
const primaryButton = {
text: "Get Started",
href: "#contact"
};
const secondaryButton = {
text: "Learn More",
href: "#about"
};
type HeroBillboardProps = {
tag?: string;
title: string;
description: string;
primaryButton: { text: string; href: string };
secondaryButton: { text: string; href: string };
avatarsSrc?: string[];
avatarsLabel?: string;
} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never });
const HeroInline = () => {
return (
<section aria-label="Hero section" className="relative pt-25 pb-20 md:pt-30">
<HeroBackgroundSlot />
<div className="flex flex-col gap-12 md:gap-15 w-content-width mx-auto">
<div className="flex flex-col items-center gap-3 text-center">
<ImageOrVideo imageSrc="https://storage.googleapis.com/webild/users/user_3FUrHlCP4jtWJZGQp1CMN4kBeZr/uploaded-1782141202943-h6c7igr8.png" className="h-24 md:h-32 w-auto mb-4 object-contain" />
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
<p>Personalised Tutoring Excellence</p>
</div>
<TextAnimation
text={"Unlocking Your Childs Full Academic Potential"}
variant="fade"
gradientText={true}
tag="h1"
className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance"
/>
<TextAnimation
text={"Expert home and online tutoring from Early Years to Secondary level. Delivering British, Cambridge, and international curricula with a focus on confidence, performance, and results."}
variant="fade"
gradientText={false}
tag="p"
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance"
/>
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
<Button text={primaryButton.text} href={primaryButton.href} variant="primary"/>
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary" animationDelay={0.1} />
</div>
</div>
<ScrollReveal variant="fade-blur" delay={0.2} className="w-full p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden">
<ImageOrVideo imageSrc={"http://img.b2bpic.net/free-photo/concentrated-hipster-writes-notebook-information-he-hears-from-female-who-reads-news-from-internet-website-beautiful-black-girl-keyboards-laptop-computer_273609-44838.jpg"} className="aspect-4/5 md:aspect-video" />
</ScrollReveal>
</div>
</section>
);
};
export default function HeroSection() {
return (
<div data-webild-section="hero" id="hero">
<HeroInline />
</div>
);
}

View File

@@ -0,0 +1,34 @@
// 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 MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsFeatureCards
tag="Success Stats"
title="Proven Academic Results"
description="Our commitment to quality tutoring ensures students thrive in their academic pursuits."
metrics={[
{
value: "5.0", title: "Google Rating", features: [
"Verified reviews", "Top-tier service", "Trusted teachers"],
},
{
value: "100%", title: "Personalized", features: [
"Custom curricula", "Confidence building", "Result-oriented"],
},
{
value: "24/7", title: "Accessibility", features: [
"Always open", "Global support", "Flexible hours"],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,22 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "social" section.
import React from 'react';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SocialSection(): React.JSX.Element {
return (
<div id="social" data-section="social">
<SectionErrorBoundary name="social">
<SocialProofMarquee
tag="Accredited Excellence"
title="Partners & Curriculum Standards"
description="Recognized by leading educational bodies globally."
names={[
"British Council", "Cambridge International", "Nigerian Educational Board", "International Baccalaureate", "Edexcel", "Oxford Learning", "Global Tutor Network"]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,28 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "team" section.
import React from 'react';
import TeamStackedCards from '@/components/sections/team/TeamStackedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TeamSection(): React.JSX.Element {
return (
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamStackedCards
tag="Our Experts"
title="Highly Qualified Educators"
description="Experienced teachers dedicated to nurturing your child's academic journey."
members={[
{
name: "Sarah Jenkins", role: "Head of Primary", imageSrc: "http://img.b2bpic.net/free-photo/man-teacher-wearing-glasses-sitting-school-desk-with-class-register-front-blackboard-classroom-holding-number-plates-explaining-lesson-showing-thumb-up-happy-positive_141793-131601.jpg"},
{
name: "Mark Adeyemi", role: "Senior STEM Tutor", imageSrc: "http://img.b2bpic.net/free-photo/serious-young-blonde-female-teacher-wearing-glasses-classroom-standing-front-chalkboard-profile-view-leaning-head-chalkboard-looking-camera_141793-105255.jpg"},
{
name: "Jane Wilson", role: "International Curriculum Lead", imageSrc: "http://img.b2bpic.net/free-photo/brunette-businesswoman-posing_23-2148142135.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,37 @@
// 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="Reviews"
title="What Our Families Say"
description="Trusted by hundreds of parents and students to deliver academic excellence."
testimonials={[
{
name: "Sarah Johnson", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-father-daughter_23-2147615879.jpg"},
{
name: "Michael Chen", role: "Student", company: "Learner", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-smiling-blond-woman-standing-street-with-notebooks-carries-journal-work_1258-205929.jpg"},
{
name: "Emily Rodriguez", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-sitting-table-with-book_273609-12710.jpg"},
{
name: "David Kim", role: "Student", company: "Learner", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-young-partners-cooperate-together-workspace-give-high-five-each-other-have-overjoyed-expressions-work-research-write-down-records-notepad-ponder-idea-work-as-team_273609-28945.jpg"},
{
name: "Linda Thompson", role: "Parent", company: "Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-helping-kid-with-homework_23-2149610754.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}