Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions apps/web/app/partners/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { notFound } from "next/navigation";
import { Navbar } from "@/components/navbar";
import { Footer } from "@/components/footer";
import { PartnerHero } from "@/components/sections/partner-hero";
import { PartnerBio } from "@/components/sections/partner-bio";
import { PartnerCTA } from "@/components/sections/partner-cta";
import { PartnerFeatures } from "@/components/sections/partner-features";
import { TrustMetricsSection } from "@/components/sections/trust-metrics-section";
import { BackgroundScroll } from "@/components/ui/background-scroll";
import { ScrollReveal } from "@/components/ui/scroll-reveal";

interface PartnerData {
name: string;
bio: string;
imageUrl: string;
quote?: string;
ctaMessage?: string;
}

const PARTNERS_DATA: Record<string, PartnerData> = {
"solo-e-tv": {
name: "Solo E TV",
bio: "Solo E started trading with $500–$600 paychecks to fund his music dream. No prop firms, no handouts — just self-taught grit. He burned $100K learning the hard way, mastering risk, discipline, and consistency. \n\nThe breakthrough came flipping $600 to $25K (then losing it), but going live on YouTube and turning $4K into $40K put him on the map. Now he refuses to deposit over $10K, proving small accounts can win big. The Solo E brand is about flipping limits, giving underdogs a system, and proving the world wrong one trade at a time.",
imageUrl: "/images/soloetv.png",
quote: "Life is short and working for other people sucks",
ctaMessage: "Trade with the broker I trust. Join me at RestroFX and experience trading the way it was meant to be. Raw spreads, lightning-fast execution, and a platform that puts you first."
},
"default": {
name: "Our Global Partner",
bio: "Our partners are experienced traders and market leaders who trust RestroFX for their trading journey. They choose us for our transparency, technology, and superior trading conditions.",
imageUrl: "https://images.unsplash.com/photo-1560250097-0b93528c311a?w=800&auto=format&fit=crop",
ctaMessage: "Join our community of successful traders today."
}
};

export async function generateStaticParams() {
return [
{ slug: "solo-e-tv" },
];
}

export default function PartnerProfilePage({ params }: { params: { slug: string } }) {
const partner = PARTNERS_DATA[params.slug] || PARTNERS_DATA["default"];

if (!partner && params.slug !== "demo") {
notFound();
}

return (
<>
<BackgroundScroll />
<Navbar />
<main>
<PartnerHero />

<div className="py-4 sm:py-6">
<ScrollReveal>
<PartnerBio
name={partner.name}
bio={partner.bio}
imageUrl={partner.imageUrl}
quote={partner.quote}
/>
</ScrollReveal>
</div>

<div className="py-4 sm:py-6">
<ScrollReveal>
<div className="text-center mb-12">
<h2 className="text-3xl md:text-5xl font-bold font-heading">
Why <span className="text-primary">RestroFX</span> is my <br /> favorite broker.
</h2>
</div>
<PartnerFeatures />
</ScrollReveal>
</div>

<div className="py-4 sm:py-6">
<ScrollReveal>
<TrustMetricsSection />
</ScrollReveal>
</div>

<div className="py-4 sm:py-6">
<ScrollReveal>
<PartnerCTA partnerName={partner.name} message={partner.ctaMessage} />
</ScrollReveal>
</div>

</main>
<Footer />
</>
);
}
54 changes: 27 additions & 27 deletions apps/web/app/partners/affiliate/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export default function AffiliateProgramPage() {
{
icon: DollarSign,
title: "Generous Commissions",
description: "Choose from CPA, RevShare, or Hybrid models with industry-leading commission rates."
description: "Choose our highly-rewarding Reshare models with industry-leading commission rates."
},
{
icon: Megaphone,
Expand All @@ -71,42 +71,42 @@ export default function AffiliateProgramPage() {

const commissionModels = [
{
title: "CPA",
subtitle: "Cost Per Acquisition",
description: "Earn a one-time payment for every qualified trader you refer",
title: "Basic Reshare",
subtitle: "Starter Tier",
description: "Earn consistent commissions as your referred clients trade",
features: [
"Up to $800 per qualified trader",
"Instant commission on first deposit",
"No ongoing management needed",
"Perfect for high-traffic sources"
"Earn $5 per lot",
"Lifetime recurring commissions",
"Passive income potential",
"Real-time tracking Dashboard"
],
icon: Wallet,
icon: Percent,
popular: false
},
{
title: "RevShare",
subtitle: "Revenue Share",
description: "Earn ongoing commissions from your referred clients' trading activity",
title: "Pro Reshare",
subtitle: "Professional Tier",
description: "Increased commission for high-performing affiliates",
features: [
"Up to 50% revenue share",
"Earn $10 per lot",
"Lifetime recurring commissions",
"Passive income potential",
"Best for long-term partnerships"
"Dedicated account manager",
"Best for active partners"
],
icon: Percent,
icon: TrendingUp,
popular: true
},
{
title: "Hybrid",
subtitle: "Best of Both Worlds",
description: "Combine CPA and RevShare for maximum earning potential",
title: "Elite Reshare",
subtitle: "VIP Tier",
description: "Maximum rewards for established partners and influencers",
features: [
"Upfront CPA payment",
"Plus ongoing RevShare",
"Balanced risk and reward",
"Flexible commission structure"
"Earn $20+ per lot",
"Lifetime recurring commissions",
"Custom promotion materials",
"Premium VIP support"
],
icon: TrendingUp,
icon: Wallet,
popular: false
}
];
Expand Down Expand Up @@ -135,9 +135,9 @@ export default function AffiliateProgramPage() {
];

const stats = [
{ value: "500+", label: "Active Affiliates" },
{ value: "$10M+", label: "Commissions Paid" },
{ value: "25%", label: "Avg Conversion" },
{ value: "300+", label: "Active Affiliates" },
{ value: "$20k+", label: "Commissions Paid" },
{ value: "15%", label: "Avg Conversion" },
{ value: "90 Days", label: "Cookie Duration" }
];

Expand Down
6 changes: 3 additions & 3 deletions apps/web/components/sections/hero-section-enhanced.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,17 +132,17 @@ export function HeroSectionEnhanced({
className="mt-12 grid grid-cols-2 md:grid-cols-3 lg:flex gap-6 md:gap-8 items-center justify-start opacity-70"
>
<div className="flex flex-col group cursor-default items-start">
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">50k+</span>
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">10k+</span>
<span className="text-[10px] md:text-xs uppercase tracking-widest font-semibold text-white/80 sm:text-muted-foreground group-hover:text-foreground transition-colors drop-shadow-md">Active Traders</span>
</div>
<div className="w-px h-8 bg-border hidden lg:block" />
<div className="flex flex-col group cursor-default items-start">
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">$10B+</span>
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">$5B+</span>
<span className="text-[10px] md:text-xs uppercase tracking-widest font-semibold text-white/80 sm:text-muted-foreground group-hover:text-foreground transition-colors drop-shadow-md">Volume Traded</span>
</div>
<div className="w-px h-8 bg-border hidden lg:block" />
<div className="flex flex-col group cursor-default items-start">
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">4.9/5</span>
<span className="text-xl md:text-2xl font-bold text-white sm:text-foreground group-hover:text-primary transition-colors drop-shadow-md">4.5/5</span>
<span className="text-[10px] md:text-xs uppercase tracking-widest font-semibold text-white/80 sm:text-muted-foreground group-hover:text-foreground transition-colors drop-shadow-md">User Rating</span>
</div>
</motion.div>
Expand Down
84 changes: 84 additions & 0 deletions apps/web/components/sections/partner-bio.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"use client";

import { motion } from "framer-motion";
import Image from "next/image";
import { Button } from "@crimsonfx/ui";
import Link from "next/link";

interface PartnerBioProps {
name: string;
bio: string;
imageUrl: string;
quote?: string;
}

export function PartnerBio({ name, bio, imageUrl, quote }: PartnerBioProps) {
return (
<section className="py-24 relative overflow-hidden">
<div className="container px-4 md:px-6">
<div className="flex flex-col items-center mb-16 text-center">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="text-4xl md:text-6xl font-bold font-heading mb-4"
>
A <span className="text-primary">proud</span> partner of <br /> {name}.
</motion.h2>
</div>

<div className="grid lg:grid-cols-2 gap-12 items-center max-w-6xl mx-auto">
{/* Image Side */}
<motion.div
initial={{ opacity: 0, x: -30 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.8 }}
className="flex flex-col items-center lg:items-start"
>
<div className="relative w-full aspect-square max-w-md rounded-2xl overflow-hidden shadow-2xl group">
<Image
src={imageUrl}
alt={name}
fill
className="object-cover transition-transform duration-700 group-hover:scale-105"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
</div>
{quote && (
<div className="mt-8 text-center lg:text-left">
<p className="text-xl italic text-muted-foreground">&quot;{quote}&quot;</p>
<p className="mt-2 font-bold text-primary">— {name}</p>
</div>
)}
</motion.div>

{/* Text Side */}
<motion.div
initial={{ opacity: 0, x: 30 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.8 }}
className="flex flex-col justify-center"
>
<h3 className="text-2xl md:text-3xl font-bold mb-6">About {name}.</h3>
<div className="space-y-4 text-muted-foreground text-lg leading-relaxed">
{bio.split('\n').map((paragraph, i) => (
<p key={i}>{paragraph}</p>
))}
</div>
<div className="mt-10">
<Button
size="lg"
className="rounded-full bg-primary hover:bg-red-700 text-white px-8"
asChild
>
<Link href="/register">Start Trading</Link>
</Button>
</div>
</motion.div>
</div>
</div>
</section>
);
}
64 changes: 64 additions & 0 deletions apps/web/components/sections/partner-cta.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"use client";

import { motion } from "framer-motion";
import { Button } from "@crimsonfx/ui";
import Link from "next/link";
import { ArrowRight } from "lucide-react";

interface PartnerCTAProps {
partnerName: string;
message?: string;
}

export function PartnerCTA({ partnerName, message }: PartnerCTAProps) {
return (
<section className="py-24 relative overflow-hidden">
{/* Background Decorative Elements */}
<div className="absolute inset-0 z-0">
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-primary/5 rounded-full blur-[120px]" />
</div>

<div className="container px-4 md:px-6 relative z-10">
<div className="max-w-4xl mx-auto text-center">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="text-4xl md:text-6xl font-bold font-heading mb-8"
>
A message from <span className="text-primary">{partnerName.split(' ')[0]}</span>.
</motion.h2>

<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: 0.2 }}
className="mb-12"
>
<p className="text-xl md:text-2xl text-muted-foreground leading-relaxed italic">
{message || `Trade with the broker I trust. Join me at RestroFX and experience trading the way it was meant to be. Raw spreads, lightning-fast execution, and a platform that puts you first.`}
</p>
</motion.div>

<motion.div
initial={{ opacity: 0, scale: 0.9 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ delay: 0.4 }}
>
<Button
size="lg"
className="rounded-full px-12 h-16 text-xl font-bold bg-primary text-white shadow-xl hover:bg-red-700 hover:scale-105 transition-all duration-300 group"
asChild
>
<Link href="/register">
JOIN RESTROFX <ArrowRight className="ml-3 h-5 w-5 group-hover:translate-x-2 transition-transform" />
</Link>
</Button>
</motion.div>
</div>
</div>
</section>
);
}
Loading
Loading