Merge version_2_1782052126442 into main #1

Merged
bender merged 1 commits from version_2_1782052126442 into main 2026-06-21 14:30:32 +00:00
7 changed files with 198 additions and 132 deletions

View File

@@ -1,5 +1,5 @@
import FooterBrand from '@/components/sections/footer/FooterBrand';
import NavbarCentered from '@/components/ui/NavbarCentered';
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="bubble" siteBackground="gridDots" heroBackground="gradientBars">
<SiteBackgroundSlot />
<SectionErrorBoundary name="navbar">
<NavbarCentered
logo="Confident. Local. Measurable."
<NavbarFloatingLogo
logo="Pulse Point Media NI"
logoImageSrc="https://storage.googleapis.com/webild/users/user_3FIz6snJPeDvZERJUlVII7bqhSh/uploaded-1782052013217-ejofqs29.jpg"
ctaButton={{
text: "Get Audit",
href: "/contact",
@@ -54,7 +55,7 @@ export default function Layout() {
</main>
<SectionErrorBoundary name="footer">
<FooterBrand
brand="Confident. Local. Measurable."
brand="Pulse Point Media NI"
columns={[
{
items: [

View File

@@ -1,137 +1,27 @@
import AboutTestimonialParallax from '@/components/sections/about/AboutTestimonialParallax';
import BlogSimpleCards from '@/components/sections/blog/BlogSimpleCards';
import HeroSplit from '@/components/sections/hero/HeroSplit';
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
import { MapPin, ShieldCheck, TrendingUp } from "lucide-react";
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 TrustSection from './HomePage/sections/Trust';
import TestimonialSection from './HomePage/sections/Testimonial';
import AboutSection from './HomePage/sections/About';
import BlogSection from './HomePage/sections/Blog';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Pulse Point Media NI"
title="Belfasts Local Digital Marketing Agency — Found Online. Stay Found."
description="We help local businesses dominate local search and capture more customers in Northern Ireland. Professional, measurable results."
primaryButton={{
text: "Get Your Free Audit",
href: "/contact",
}}
secondaryButton={{
text: "Our Services",
href: "/services",
}}
imageSrc="http://img.b2bpic.net/free-photo/management-verifying-task-progress_482257-80309.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="trust" data-section="trust">
<SectionErrorBoundary name="trust">
<MetricsIconCards
tag="Why Us"
title="Belfast-based. Local Results."
description="We understand the Northern Ireland market. No long-term contracts, just growth."
metrics={[
{
icon: MapPin,
title: "Local Expertise",
value: "Belfast",
},
{
icon: TrendingUp,
title: "Monthly Growth",
value: "100%",
},
{
icon: ShieldCheck,
title: "No Contracts",
value: "Flexible",
},
]}
/>
</SectionErrorBoundary>
</div>
<TrustSection />
<div id="testimonial" data-section="testimonial">
<SectionErrorBoundary name="testimonial">
<TestimonialMarqueeCards
tag="Client Success"
title="Don't Just Take Our Word For It"
description="Businesses across Belfast trust Pulse Point Media."
testimonials={[
{
name: "Sarah Jenkins",
role: "Owner, Belfast Boutique",
quote: "Incredible increase in local footfall since we started with their GBP optimisation.",
imageSrc: "http://img.b2bpic.net/free-photo/elderly-woman-drinking-coffee-cafe-while-working-her-laptop-writing-her-notebook_23-2149230375.jpg",
},
{
name: "Mark O'Connor",
role: "Manager, Local Cafe",
quote: "Professional, consistent, and they really understand the Belfast market.",
imageSrc: "http://img.b2bpic.net/free-photo/corporate-coworkers-discussing-marketing-strategy_482257-77600.jpg",
},
{
name: "Liam Doherty",
role: "Consultant",
quote: "Highly responsive team. Weve seen 40% growth in organic leads.",
imageSrc: "http://img.b2bpic.net/free-photo/corporate-employee-working-overhours-marketing-project_482257-77551.jpg",
},
{
name: "Fiona McCloskey",
role: "Retailer",
quote: "Simple, no-nonsense pricing that actually delivers real return on investment.",
imageSrc: "http://img.b2bpic.net/free-photo/smart-businesswoman-holding-tablet_23-2148452627.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTestimonialParallax
tag="Our Philosophy"
quote="We believe digital marketing shouldn't be a black box. It should be transparent, measurable, and above all, profitable for our local clients."
author="The Pulse Point Team"
role="Digital Growth Experts"
imageSrc="http://img.b2bpic.net/free-photo/executive-managers-looking-marketing-statistics-computer_482257-77621.jpg"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="blog" data-section="blog">
<SectionErrorBoundary name="blog">
<BlogSimpleCards
tag="Insights"
title="Marketing Tips for Belfast Businesses"
description="Learn how to get more out of your digital presence."
items={[
{
category: "GBP",
title: "How to rank #1 in Belfast maps",
excerpt: "Key factors for Google Business Profile success in NI.",
authorName: "Team Pulse",
authorImageSrc: "",
date: "Oct 24, 2023",
imageSrc: "http://img.b2bpic.net/free-photo/computer-screen-business-office-shows-stock-exchange-values-changing_482257-84627.jpg",
},
{
category: "SEO",
title: "Website speed and local SEO",
excerpt: "Why your loading times are killing your local search rankings.",
authorName: "Team Pulse",
authorImageSrc: "",
date: "Oct 15, 2023",
imageSrc: "http://img.b2bpic.net/free-photo/contemporary-room-workplace-office-supplies-concept_53876-31812.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<BlogSection />
</>
);
}

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 AboutTestimonialParallax from '@/components/sections/about/AboutTestimonialParallax';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTestimonialParallax
tag="Our Philosophy"
quote="We believe digital marketing shouldn't be a black box. It should be transparent, measurable, and above all, profitable for our local clients."
author="The Pulse Point Team"
role="Digital Growth Experts"
imageSrc="http://img.b2bpic.net/free-photo/executive-managers-looking-marketing-statistics-computer_482257-77621.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,40 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "blog" section.
import React from 'react';
import BlogSimpleCards from '@/components/sections/blog/BlogSimpleCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function BlogSection(): React.JSX.Element {
return (
<div id="blog" data-section="blog">
<SectionErrorBoundary name="blog">
<BlogSimpleCards
tag="Insights"
title="Marketing Tips for Belfast Businesses"
description="Learn how to get more out of your digital presence."
items={[
{
category: "GBP",
title: "How to rank #1 in Belfast maps",
excerpt: "Key factors for Google Business Profile success in NI.",
authorName: "Team Pulse",
authorImageSrc: "",
date: "Oct 24, 2023",
imageSrc: "http://img.b2bpic.net/free-photo/computer-screen-business-office-shows-stock-exchange-values-changing_482257-84627.jpg",
},
{
category: "SEO",
title: "Website speed and local SEO",
excerpt: "Why your loading times are killing your local search rankings.",
authorName: "Team Pulse",
authorImageSrc: "",
date: "Oct 15, 2023",
imageSrc: "http://img.b2bpic.net/free-photo/contemporary-room-workplace-office-supplies-concept_53876-31812.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,29 @@
// 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 HeroSplit from '@/components/sections/hero/HeroSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Pulse Point Media NI"
title="Belfasts Local Digital Marketing Agency — Found Online. Stay Found."
description="We help local businesses dominate local search and capture more customers in Northern Ireland. Professional, measurable results."
primaryButton={{
text: "Get Your Free Audit",
href: "/contact",
}}
secondaryButton={{
text: "Our Services",
href: "/services",
}}
imageSrc="http://img.b2bpic.net/free-photo/management-verifying-task-progress_482257-80309.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,46 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "testimonial" section.
import React from 'react';
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialSection(): React.JSX.Element {
return (
<div id="testimonial" data-section="testimonial">
<SectionErrorBoundary name="testimonial">
<TestimonialMarqueeCards
tag="Client Success"
title="Don't Just Take Our Word For It"
description="Businesses across Belfast trust Pulse Point Media."
testimonials={[
{
name: "Sarah Jenkins",
role: "Owner, Belfast Boutique",
quote: "Incredible increase in local footfall since we started with their GBP optimisation.",
imageSrc: "http://img.b2bpic.net/free-photo/elderly-woman-drinking-coffee-cafe-while-working-her-laptop-writing-her-notebook_23-2149230375.jpg",
},
{
name: "Mark O'Connor",
role: "Manager, Local Cafe",
quote: "Professional, consistent, and they really understand the Belfast market.",
imageSrc: "http://img.b2bpic.net/free-photo/corporate-coworkers-discussing-marketing-strategy_482257-77600.jpg",
},
{
name: "Liam Doherty",
role: "Consultant",
quote: "Highly responsive team. Weve seen 40% growth in organic leads.",
imageSrc: "http://img.b2bpic.net/free-photo/corporate-employee-working-overhours-marketing-project_482257-77551.jpg",
},
{
name: "Fiona McCloskey",
role: "Retailer",
quote: "Simple, no-nonsense pricing that actually delivers real return on investment.",
imageSrc: "http://img.b2bpic.net/free-photo/smart-businesswoman-holding-tablet_23-2148452627.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,38 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "trust" section.
import React from 'react';
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
import { MapPin, ShieldCheck, TrendingUp } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TrustSection(): React.JSX.Element {
return (
<div id="trust" data-section="trust">
<SectionErrorBoundary name="trust">
<MetricsIconCards
tag="Why Us"
title="Belfast-based. Local Results."
description="We understand the Northern Ireland market. No long-term contracts, just growth."
metrics={[
{
icon: MapPin,
title: "Local Expertise",
value: "Belfast",
},
{
icon: TrendingUp,
title: "Monthly Growth",
value: "100%",
},
{
icon: ShieldCheck,
title: "No Contracts",
value: "Flexible",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}