27 Commits

Author SHA1 Message Date
e802c81a09 Update src/app/shop/page.tsx 2026-02-18 09:11:22 +00:00
a3383233ee Update src/app/shop/[id]/page.tsx 2026-02-18 09:11:21 +00:00
007eb01e9a Update src/app/page.tsx 2026-02-18 09:11:21 +00:00
6d462bda54 Update src/app/layout.tsx 2026-02-18 09:11:20 +00:00
8f48d9dfa2 Update src/app/blog/page.tsx 2026-02-18 09:11:19 +00:00
72d3c76418 Update src/app/shop/page.tsx 2026-02-18 09:08:24 +00:00
1baedaa120 Update src/app/shop/[id]/page.tsx 2026-02-18 09:08:24 +00:00
a4cda7e2a4 Update src/app/page.tsx 2026-02-18 09:08:23 +00:00
1d35264bec Update src/app/layout.tsx 2026-02-18 09:08:22 +00:00
c054fbaae5 Update src/app/blog/page.tsx 2026-02-18 09:08:21 +00:00
48e3147210 Bob AI: update the hero section with Hero Split KPI 2026-02-17 17:37:30 +00:00
274b3210c7 Bob AI: change hero section to [Block: Hero Billboard] 2026-02-17 17:35:47 +00:00
7de4e9c51d Bob AI: change color theme to red and black 2026-02-17 17:34:37 +00:00
443d603adc Bob AI: change color theme to yellow and black 2026-02-17 17:17:55 +00:00
01c7be9346 Merge version_3 into main
Merge version_3 into main
2026-02-17 17:15:47 +00:00
24b86df9c3 Update src/app/styles/variables.css 2026-02-17 17:15:43 +00:00
2d93995c74 Update src/app/shop/page.tsx 2026-02-17 17:15:42 +00:00
e78775b3b6 Update src/app/shop/[id]/page.tsx 2026-02-17 17:15:42 +00:00
f866f4edc4 Update src/app/page.tsx 2026-02-17 17:15:41 +00:00
dd87203262 Update src/app/layout.tsx 2026-02-17 17:15:40 +00:00
d7ccd5de76 Update src/app/blog/page.tsx 2026-02-17 17:15:39 +00:00
9c5d63a45f Merge version_2 into main
Merge version_2 into main
2026-02-17 17:06:56 +00:00
43547218d8 Update src/app/shop/page.tsx 2026-02-17 17:06:52 +00:00
61c06f3288 Update src/app/shop/[id]/page.tsx 2026-02-17 17:06:52 +00:00
4c6db65985 Update src/app/page.tsx 2026-02-17 17:06:51 +00:00
c11e13c6e2 Update src/app/blog/page.tsx 2026-02-17 17:06:50 +00:00
cc28b71959 Merge version_1 into main
Merge version_1 into main
2026-02-16 14:46:36 +00:00
6 changed files with 106 additions and 72 deletions

View File

@@ -28,7 +28,7 @@ export default function BlogPage() {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },

View File

@@ -1,46 +1,23 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Open_Sans } from "next/font/google"; import { Inter } from "next/font/google";
import "./globals.css"; import "./globals.css";
import { ServiceWrapper } from "@/components/ServiceWrapper"; import "./styles/variables.css";
import Tag from "@/tag/Tag"; import "./styles/base.css";
const openSans = Open_Sans({ const inter = Inter({ subsets: ["latin"] });
variable: "--font-open-sans", subsets: ["latin"],
});
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Follow Trade - Expert Trading Recommendations & Signals", description: "Get real-time trading recommendations from professional traders. 76% accuracy rate, 10,000+ active traders, and proven performance. Start your free trial today.", keywords: "trading signals, investment recommendations, stock trading, forex trading, technical analysis, market insights", metadataBase: new URL("https://followtrade.com"), title: "Follow Trade", description: "Expert-driven trading recommendations and market signals"
alternates: {
canonical: "https://followtrade.com"
},
openGraph: {
title: "Follow Trade - Expert Trading Signals", description: "Professional trading recommendations with 76% accuracy. Real-time signals, expert analysis, and proven results.", type: "website", siteName: "Follow Trade", images: [{
url: "https://img.b2bpic.net/free-photo/close-up-with-businessman-patching-something-keyboard-graphics-monitor_482257-32827.jpg", alt: "Follow Trade Trading Dashboard"
}]
},
twitter: {
card: "summary_large_image", title: "Follow Trade - Expert Trading Recommendations", description: "Real-time trading signals with 76% accuracy. Join 10,000+ successful traders.", images: ["https://img.b2bpic.net/free-photo/close-up-with-businessman-patching-something-keyboard-graphics-monitor_482257-32827.jpg"]
},
robots: {
index: true,
follow: true
}
}; };
export default function RootLayout({ export default function RootLayout({
children, children,
}: Readonly<{ }: {
children: React.ReactNode; children: React.ReactNode;
}>) { }) {
return ( return (
<html lang="en" suppressHydrationWarning> <html lang="en">
<ServiceWrapper> <body className={inter.className}>{children}
<body
className={openSans.variable}
>
<Tag />
{children}
<script <script
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: ` __html: `
@@ -434,6 +411,20 @@ export default function RootLayout({
originalContent = element.textContent; originalContent = element.textContent;
element.contentEditable = 'true'; element.contentEditable = 'true';
if (!element.dataset.webildOriginalWhiteSpace) {
const computedStyle = window.getComputedStyle(element);
element.dataset.webildOriginalWhiteSpace = computedStyle.whiteSpace;
element.dataset.webildOriginalWordWrap = computedStyle.wordWrap;
element.dataset.webildOriginalOverflowWrap = computedStyle.overflowWrap;
element.dataset.webildOriginalOverflow = computedStyle.overflow;
}
element.style.whiteSpace = 'pre-wrap';
element.style.wordWrap = 'break-word';
element.style.overflowWrap = 'break-word';
element.style.overflow = 'visible';
element.focus(); element.focus();
isEditing = true; isEditing = true;
@@ -543,6 +534,23 @@ export default function RootLayout({
element.contentEditable = 'false'; element.contentEditable = 'false';
isEditing = false; isEditing = false;
if (element.dataset.webildOriginalWhiteSpace) {
element.style.whiteSpace = element.dataset.webildOriginalWhiteSpace === 'normal' ? '' : element.dataset.webildOriginalWhiteSpace;
delete element.dataset.webildOriginalWhiteSpace;
}
if (element.dataset.webildOriginalWordWrap) {
element.style.wordWrap = element.dataset.webildOriginalWordWrap === 'normal' ? '' : element.dataset.webildOriginalWordWrap;
delete element.dataset.webildOriginalWordWrap;
}
if (element.dataset.webildOriginalOverflowWrap) {
element.style.overflowWrap = element.dataset.webildOriginalOverflowWrap === 'normal' ? '' : element.dataset.webildOriginalOverflowWrap;
delete element.dataset.webildOriginalOverflowWrap;
}
if (element.dataset.webildOriginalOverflow) {
element.style.overflow = element.dataset.webildOriginalOverflow === 'visible' ? '' : element.dataset.webildOriginalOverflow;
delete element.dataset.webildOriginalOverflow;
}
if (element.dataset.beforeInputHandler === 'true') { if (element.dataset.beforeInputHandler === 'true') {
element.removeEventListener('beforeinput', () => {}); element.removeEventListener('beforeinput', () => {});
delete element.dataset.beforeInputHandler; delete element.dataset.beforeInputHandler;
@@ -848,6 +856,9 @@ export default function RootLayout({
const handleScroll = () => { const handleScroll = () => {
if (!isActive) return; if (!isActive) return;
if (isEditing) return;
if (selectedElement) { if (selectedElement) {
makeUneditable(selectedElement, false); makeUneditable(selectedElement, false);
selectedElement.classList.remove(selectedClass); selectedElement.classList.remove(selectedClass);
@@ -1221,6 +1232,31 @@ export default function RootLayout({
window.addEventListener('scroll', handleScroll, true); window.addEventListener('scroll', handleScroll, true);
window.addEventListener('message', handleMessage, true); window.addEventListener('message', handleMessage, true);
let lastPathname = window.location.pathname;
const notifyPageChange = () => {
window.parent.postMessage({
type: 'webild-page-changed',
data: { pathname: window.location.pathname }
}, '*');
};
window.addEventListener('popstate', () => {
if (lastPathname !== window.location.pathname) {
lastPathname = window.location.pathname;
notifyPageChange();
}
}, true);
const urlCheckInterval = setInterval(() => {
if (lastPathname !== window.location.pathname) {
lastPathname = window.location.pathname;
notifyPageChange();
}
}, 500);
notifyPageChange();
window.webildCleanup = () => { window.webildCleanup = () => {
isActive = false; isActive = false;
@@ -1231,6 +1267,10 @@ export default function RootLayout({
removeHoverOverlay(); removeHoverOverlay();
removeElementTypeLabel(); removeElementTypeLabel();
if (urlCheckInterval) {
clearInterval(urlCheckInterval);
}
document.removeEventListener('mouseover', handleMouseOver, true); document.removeEventListener('mouseover', handleMouseOver, true);
document.removeEventListener('mouseout', handleMouseOut, true); document.removeEventListener('mouseout', handleMouseOut, true);
document.removeEventListener('click', handleClick, true); document.removeEventListener('click', handleClick, true);
@@ -1259,7 +1299,6 @@ export default function RootLayout({
}} }}
/> />
</body> </body>
</ServiceWrapper>
</html> </html>
); );
} }

View File

@@ -1,8 +1,8 @@
"use client" "use client";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay'; import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay';
import HeroLogoBillboard from '@/components/sections/hero/HeroLogoBillboard'; import HeroBillboard from '@/components/sections/hero/HeroBillboard';
import TestimonialAboutCard from '@/components/sections/about/TestimonialAboutCard'; import TestimonialAboutCard from '@/components/sections/about/TestimonialAboutCard';
import FeatureCardTwelve from '@/components/sections/feature/FeatureCardTwelve'; import FeatureCardTwelve from '@/components/sections/feature/FeatureCardTwelve';
import PricingCardEight from '@/components/sections/pricing/PricingCardEight'; import PricingCardEight from '@/components/sections/pricing/PricingCardEight';
@@ -44,18 +44,18 @@ export default function LandingPage() {
</div> </div>
<div id="hero" data-section="hero"> <div id="hero" data-section="hero">
<HeroLogoBillboard <HeroBillboard
logoText="Follow Trade" title="The Future of Supply Chain"
description="Get expert trading recommendations and signals designed to maximize your investment returns. Join thousands of successful traders using Follow Trade for actionable market insights." description="Ship globally within 3 days post-production with smart fulfillment"
background={{ variant: "animated-grid" }}
tag="Trusted by 150+ Brands"
buttons={[ buttons={[
{ text: "Start Trading", href: "#pricing" }, { text: "Get Started", href: "#pricing" },
{ text: "Learn More", href: "#features" } { text: "Learn More", href: "#features" }
]} ]}
background={{ variant: "animated-grid" }}
imageSrc="https://img.b2bpic.net/free-photo/close-up-with-businessman-patching-something-keyboard-graphics-monitor_482257-32827.jpg" imageSrc="https://img.b2bpic.net/free-photo/close-up-with-businessman-patching-something-keyboard-graphics-monitor_482257-32827.jpg"
imageAlt="Trading dashboard with real-time market data" imageAlt="Supply chain and fulfillment"
mediaAnimation="opacity" mediaAnimation="opacity"
frameStyle="card"
buttonAnimation="opacity" buttonAnimation="opacity"
/> />
</div> </div>

View File

@@ -85,12 +85,11 @@ export default function ProductPage({ params }: ProductPageProps) {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },
{ name: "FAQ", id: "faq" }, { name: "FAQ", id: "faq" }
{ name: "Shop", id: "/shop" }
]} ]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }} button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/> />
@@ -157,12 +156,11 @@ export default function ProductPage({ params }: ProductPageProps) {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },
{ name: "FAQ", id: "faq" }, { name: "FAQ", id: "faq" }
{ name: "Shop", id: "/shop" }
]} ]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }} button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/> />
@@ -236,12 +234,11 @@ export default function ProductPage({ params }: ProductPageProps) {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },
{ name: "FAQ", id: "faq" }, { name: "FAQ", id: "faq" }
{ name: "Shop", id: "/shop" }
]} ]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }} button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/> />

View File

@@ -35,12 +35,11 @@ export default function ShopPage() {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },
{ name: "FAQ", id: "faq" }, { name: "FAQ", id: "faq" }
{ name: "Shop", id: "/shop" }
]} ]}
button={{ text: "Cart", onClick: () => console.log("cart") }} button={{ text: "Cart", onClick: () => console.log("cart") }}
/> />
@@ -106,12 +105,11 @@ export default function ShopPage() {
<NavbarLayoutFloatingOverlay <NavbarLayoutFloatingOverlay
brandName="Follow Trade" brandName="Follow Trade"
navItems={[ navItems={[
{ name: "Home", id: "/" }, { name: "Home", id: "hero" },
{ name: "About", id: "about" }, { name: "About", id: "about" },
{ name: "Features", id: "features" }, { name: "Features", id: "features" },
{ name: "Pricing", id: "pricing" }, { name: "Pricing", id: "pricing" },
{ name: "FAQ", id: "faq" }, { name: "FAQ", id: "faq" }
{ name: "Shop", id: "/shop" }
]} ]}
button={{ text: "Cart", onClick: () => console.log("cart") }} button={{ text: "Cart", onClick: () => console.log("cart") }}
/> />

View File

@@ -2,21 +2,21 @@
/* Base units */ /* Base units */
/* --vw is set by ThemeProvider */ /* --vw is set by ThemeProvider */
/* --background: #f5f5f5;; /* --background: #0a0a0a;;
--card: #ffffff;; --card: #000000;;
--foreground: #1c1c1c;; --foreground: #ff0000;;
--primary-cta: #1f514c;; --primary-cta: #ff0000;;
--secondary-cta: #ffffff;; --secondary-cta: #000000;;
--accent: #159c49;; --accent: #ff0000;;
--background-accent: #a8e8ba;; */ --background-accent: #000000;; */
--background: #f5f5f5;; --background: #000000;;
--card: #ffffff;; --card: #000000;;
--foreground: #1c1c1c;; --foreground: #ff0000;;
--primary-cta: #1f514c;; --primary-cta: #ff0000;;
--secondary-cta: #ffffff;; --secondary-cta: #000000;;
--accent: #159c49;; --accent: #ff0000;;
--background-accent: #a8e8ba;; --background-accent: #000000;;
/* text sizing - set by ThemeProvider */ /* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem); /* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);