Merge version_2_1781900754484 into main #1

Merged
bender merged 1 commits from version_2_1781900754484 into main 2026-06-19 20:27:29 +00:00
8 changed files with 355 additions and 219 deletions

View File

@@ -1,229 +1,32 @@
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import FeaturesMediaCarousel from '@/components/sections/features/FeaturesMediaCarousel';
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
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 ServicesSection from './HomePage/sections/Services';
import CoverageSection from './HomePage/sections/Coverage';
import StatsSection from './HomePage/sections/Stats';
import ComplianceSection from './HomePage/sections/Compliance';
import ContactSection from './HomePage/sections/Contact';
import ClientsSection from './HomePage/sections/Clients';export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBillboardCarousel
tag="PSA Licence 14579"
title="Static Security. Engineered Precision."
description="Vision1Security provides advanced, technology-driven static guarding solutions for Dublin and Leinster. Your assets, secured by design."
primaryButton={{
text: "Request a Quote",
href: "#contact",
}}
secondaryButton={{
text: "Learn More",
href: "#services",
}}
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/artistic-background-wallpaper-with-color-halftone-effect_58702-8909.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-low-poly-plexus-connections-networking-background_1048-12580.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/blue-background-with-bright-lines_1160-203.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/abstract-green-background-from-brilliant-mosaic-pattern-generative-ai_169016-30204.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/flat-lay-circuit-board-close-up_23-2149174361.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-digital-landscape-with-space-sky-nebula_1048-10755.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesMediaCarousel
tag="Our Expertise"
title="Engineered Protection"
description="Comprehensive security solutions tailored to modern threats."
items={[
{
title: "Static Guarding",
description: "Highly trained personnel for stationary asset protection.",
buttonIcon: "Shield",
imageSrc: "http://img.b2bpic.net/free-photo/stylish-casual-african-american-man-black-beret-overcoat-fitting-room-clothes-store-making-photo-mirror-his-phone-camera_627829-1635.jpg",
},
{
title: "Corporate Security",
description: "High-level protection for sensitive business environments.",
buttonIcon: "Building",
imageSrc: "http://img.b2bpic.net/free-photo/team-programmers-high-tech-data-center-troubleshooting-issues_482257-124845.jpg",
},
{
title: "Retail Loss Prevention",
description: "Deterrence-focused guarding for high-footfall retail spaces.",
buttonIcon: "ShoppingBag",
imageSrc: "http://img.b2bpic.net/free-photo/security-guards-workspace_23-2150321656.jpg",
},
{
title: "Event Security",
description: "Professional presence for high-profile gatherings.",
buttonIcon: "Calendar",
imageSrc: "http://img.b2bpic.net/free-photo/business-male-talking-phone_23-2148479562.jpg",
},
{
title: "Construction Site Security",
description: "Proactive protection against theft and unauthorized access.",
buttonIcon: "HardHat",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-man-wearing-headphones_23-2148902563.jpg",
},
{
title: "Mobile Patrols",
description: "Dynamic response and key holding services.",
buttonIcon: "Car",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-keys_23-2148819890.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<ServicesSection />
<div id="coverage" data-section="coverage">
<SectionErrorBoundary name="coverage">
<FeaturesImageBento
tag="Geographic Reach"
title="Dublin & Leinster Radar"
description="Rapid response capabilities spanning the Greater Dublin Area and Leinster."
items={[
{
title: "Dublin Central",
description: "High-density urban security coverage.",
imageSrc: "http://img.b2bpic.net/free-photo/military-command-center-with-futuristic-interface_23-2152000839.jpg",
},
{
title: "County Kildare",
description: "Logistical and industrial security hubs.",
imageSrc: "http://img.b2bpic.net/free-photo/panoramic-view-dubai-city-illuminated-neon-spectrum_23-2151305279.jpg",
},
{
title: "County Wicklow",
description: "Specialized asset protection.",
imageSrc: "http://img.b2bpic.net/free-photo/army-telecommunication-systems-operator-using-satellite-software-tablet_482257-107447.jpg",
},
{
title: "County Louth",
description: "Strategic northern patrol sectors.",
imageSrc: "http://img.b2bpic.net/free-photo/digital-tablet-online-learning_53876-97299.jpg",
},
{
title: "County Meath",
description: "Commercial site monitoring.",
imageSrc: "http://img.b2bpic.net/free-photo/digital-art-old-map-with-terrain-locations_23-2151445172.jpg",
},
{
title: "County Carlow",
description: "Southern operational reach.",
imageSrc: "http://img.b2bpic.net/free-photo/abstract-geometric-wavy-folds-background_1048-16078.jpg",
},
{
title: "County Wexford",
description: "Expanded key holding reach.",
imageSrc: "http://img.b2bpic.net/free-photo/map-comoros-polygonal-mesh-line-map-flag-map_559531-11149.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<CoverageSection />
<div id="stats" data-section="stats">
<SectionErrorBoundary name="stats">
<MetricsFeatureCards
tag="Performance Metrics"
title="Engineered Trust"
description="Data-driven performance metrics for mission-critical security."
metrics={[
{
value: "250+",
title: "Guards Deployed",
features: [
"Vetted",
"Trained",
"Equipped",
],
},
{
value: "120+",
title: "Sites Secured",
features: [
"Construction",
"Corporate",
"Retail",
],
},
{
value: "15m",
title: "Response Time",
features: [
"Mobile Patrol",
"Key Holding",
],
},
]}
/>
</SectionErrorBoundary>
</div>
<StatsSection />
<div id="compliance" data-section="compliance">
<SectionErrorBoundary name="compliance">
<FaqTwoColumn
tag="Compliance"
title="Licensed & Assured"
description="Vision1Security holds full PSA licensure and comprehensive liability coverage."
items={[
{
question: "Are you PSA Licensed?",
answer: "Yes, we are fully PSA licensed under Licence 14579.",
},
{
question: "What areas do you cover?",
answer: "Our operations cover the entirety of Dublin and the wider Leinster region.",
},
{
question: "How are guards vetted?",
answer: "Rigorous background checks and ongoing training protocols are mandatory.",
},
{
question: "Is insurance included?",
answer: "We maintain full employer and public liability insurance coverage.",
},
]}
/>
</SectionErrorBoundary>
</div>
<ComplianceSection />
<ClientsSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Connect Now"
text="Secure your assets today. Contact our Dublin operations center."
primaryButton={{
text: "Call Operations: 01 234 5678",
href: "tel:012345678",
}}
secondaryButton={{
text: "Email for Quote",
href: "mailto:info@vision1security.ie",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,57 @@
import ScrollReveal from '@/components/ui/ScrollReveal';
import TextAnimation from '@/components/ui/TextAnimation';
import LoopCarousel from '@/components/ui/LoopCarousel';
import Tag from '@/components/ui/Tag';
export default function ClientsSection() {
const clients = [
"TechCorp Dublin",
"Leinster Retail Group",
"Dublin City Events",
"Irish Construction Co.",
"Global Logistics IE",
"Trinity Corporate Park",
"Silicon Docks Tech",
"Grafton Street Retailers"
];
return (
<section data-webild-section="clients" id="clients" className="relative w-full py-24 bg-background overflow-hidden">
<div className="w-content-width mx-auto mb-12 text-center flex flex-col items-center">
<ScrollReveal variant="fade">
<Tag text="Trusted Partners" className="mb-4" />
</ScrollReveal>
<TextAnimation
text="Securing Dublin's Leading Businesses"
variant="fade-blur"
tag="h2"
className="text-3xl md:text-4xl font-bold text-foreground mb-4"
gradientText={false}
/>
<ScrollReveal variant="fade" delay={0.2}>
<p className="text-lg text-accent max-w-2xl mx-auto">
Trusted by leading enterprises, retail chains, and event organizers across Dublin and Leinster to maintain secure, compliant, and uninterrupted operations.
</p>
</ScrollReveal>
</div>
<div className="w-full relative">
<div className="absolute left-0 top-0 bottom-0 w-32 bg-gradient-to-r from-background to-transparent z-10 pointer-events-none" />
<div className="absolute right-0 top-0 bottom-0 w-32 bg-gradient-to-l from-background to-transparent z-10 pointer-events-none" />
<LoopCarousel>
<div className="flex items-center gap-16 py-8 px-8">
{clients.map((client, index) => (
<div
key={index}
className="flex items-center justify-center whitespace-nowrap text-xl md:text-2xl font-bold text-foreground/50 uppercase tracking-widest font-mono"
>
{client}
</div>
))}
</div>
</LoopCarousel>
</div>
</section>
);
}

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 "compliance" section.
import React from 'react';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ComplianceSection(): React.JSX.Element {
return (
<div id="compliance" data-section="compliance">
<SectionErrorBoundary name="compliance">
<FaqTwoColumn
tag="Compliance"
title="Licensed & Assured"
description="Vision1Security holds full PSA licensure and comprehensive liability coverage."
items={[
{
question: "Are you PSA Licensed?",
answer: "Yes, we are fully PSA licensed under Licence 14579.",
},
{
question: "What areas do you cover?",
answer: "Our operations cover the entirety of Dublin and the wider Leinster region.",
},
{
question: "How are guards vetted?",
answer: "Rigorous background checks and ongoing training protocols are mandatory.",
},
{
question: "Is insurance included?",
answer: "We maintain full employer and public liability insurance coverage.",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,27 @@
// 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="Connect Now"
text="Secure your assets today. Contact our Dublin operations center."
primaryButton={{
text: "Call Operations: 01 234 5678",
href: "tel:012345678",
}}
secondaryButton={{
text: "Email for Quote",
href: "mailto:info@vision1security.ie",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "coverage" section.
import React from 'react';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function CoverageSection(): React.JSX.Element {
return (
<div id="coverage" data-section="coverage">
<SectionErrorBoundary name="coverage">
<FeaturesImageBento
tag="Geographic Reach"
title="Dublin & Leinster Radar"
description="Rapid response capabilities spanning the Greater Dublin Area and Leinster."
items={[
{
title: "Dublin Central",
description: "High-density urban security coverage.",
imageSrc: "http://img.b2bpic.net/free-photo/military-command-center-with-futuristic-interface_23-2152000839.jpg",
},
{
title: "County Kildare",
description: "Logistical and industrial security hubs.",
imageSrc: "http://img.b2bpic.net/free-photo/panoramic-view-dubai-city-illuminated-neon-spectrum_23-2151305279.jpg",
},
{
title: "County Wicklow",
description: "Specialized asset protection.",
imageSrc: "http://img.b2bpic.net/free-photo/army-telecommunication-systems-operator-using-satellite-software-tablet_482257-107447.jpg",
},
{
title: "County Louth",
description: "Strategic northern patrol sectors.",
imageSrc: "http://img.b2bpic.net/free-photo/digital-tablet-online-learning_53876-97299.jpg",
},
{
title: "County Meath",
description: "Commercial site monitoring.",
imageSrc: "http://img.b2bpic.net/free-photo/digital-art-old-map-with-terrain-locations_23-2151445172.jpg",
},
{
title: "County Carlow",
description: "Southern operational reach.",
imageSrc: "http://img.b2bpic.net/free-photo/abstract-geometric-wavy-folds-background_1048-16078.jpg",
},
{
title: "County Wexford",
description: "Expanded key holding reach.",
imageSrc: "http://img.b2bpic.net/free-photo/map-comoros-polygonal-mesh-line-map-flag-map_559531-11149.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,48 @@
// 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="PSA Licence 14579"
title="Static Security. Engineered Precision."
description="Vision1Security provides advanced, technology-driven static guarding solutions for Dublin and Leinster. Your assets, secured by design."
primaryButton={{
text: "Request a Quote",
href: "#contact",
}}
secondaryButton={{
text: "Learn More",
href: "#services",
}}
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/artistic-background-wallpaper-with-color-halftone-effect_58702-8909.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-low-poly-plexus-connections-networking-background_1048-12580.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/blue-background-with-bright-lines_1160-203.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/abstract-green-background-from-brilliant-mosaic-pattern-generative-ai_169016-30204.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/flat-lay-circuit-board-close-up_23-2149174361.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-digital-landscape-with-space-sky-nebula_1048-10755.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,58 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "services" section.
import React from 'react';
import FeaturesMediaCarousel from '@/components/sections/features/FeaturesMediaCarousel';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ServicesSection(): React.JSX.Element {
return (
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesMediaCarousel
tag="Our Expertise"
title="Engineered Protection"
description="Comprehensive security solutions tailored to modern threats."
items={[
{
title: "Static Guarding",
description: "Highly trained personnel for stationary asset protection.",
buttonIcon: "Shield",
imageSrc: "http://img.b2bpic.net/free-photo/stylish-casual-african-american-man-black-beret-overcoat-fitting-room-clothes-store-making-photo-mirror-his-phone-camera_627829-1635.jpg",
},
{
title: "Corporate Security",
description: "High-level protection for sensitive business environments.",
buttonIcon: "Building",
imageSrc: "http://img.b2bpic.net/free-photo/team-programmers-high-tech-data-center-troubleshooting-issues_482257-124845.jpg",
},
{
title: "Retail Loss Prevention",
description: "Deterrence-focused guarding for high-footfall retail spaces.",
buttonIcon: "ShoppingBag",
imageSrc: "http://img.b2bpic.net/free-photo/security-guards-workspace_23-2150321656.jpg",
},
{
title: "Event Security",
description: "Professional presence for high-profile gatherings.",
buttonIcon: "Calendar",
imageSrc: "http://img.b2bpic.net/free-photo/business-male-talking-phone_23-2148479562.jpg",
},
{
title: "Construction Site Security",
description: "Proactive protection against theft and unauthorized access.",
buttonIcon: "HardHat",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-man-wearing-headphones_23-2148902563.jpg",
},
{
title: "Mobile Patrols",
description: "Dynamic response and key holding services.",
buttonIcon: "Car",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-keys_23-2148819890.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,48 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "stats" section.
import React from 'react';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function StatsSection(): React.JSX.Element {
return (
<div id="stats" data-section="stats">
<SectionErrorBoundary name="stats">
<MetricsFeatureCards
tag="Performance Metrics"
title="Engineered Trust"
description="Data-driven performance metrics for mission-critical security."
metrics={[
{
value: "250+",
title: "Guards Deployed",
features: [
"Vetted",
"Trained",
"Equipped",
],
},
{
value: "120+",
title: "Sites Secured",
features: [
"Construction",
"Corporate",
"Retail",
],
},
{
value: "15m",
title: "Response Time",
features: [
"Mobile Patrol",
"Key Holding",
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}