diff --git a/package-lock.json b/package-lock.json
index 1553e30..a3567ff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
"date-fns": "^4.1.0",
"dotenv": "^17.2.4",
"framer-motion": "^12.33.0",
+ "lenis": "^1.3.17",
"lucide-react": "^0.563.0",
"mammoth": "^1.11.0",
"next": "16.1.6",
@@ -7328,6 +7329,31 @@
"node": ">=0.10"
}
},
+ "node_modules/lenis": {
+ "version": "1.3.17",
+ "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.17.tgz",
+ "integrity": "sha512-k9T9rgcxne49ggJOvXCraWn5dt7u2mO+BNkhyu6yxuEnm9c092kAW5Bus5SO211zUvx7aCCEtzy9UWr0RB+oJw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/darkroomengineering"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": ">=3.0.0",
+ "react": ">=17.0.0",
+ "vue": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
diff --git a/package.json b/package.json
index 0358b73..653f10d 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
"date-fns": "^4.1.0",
"dotenv": "^17.2.4",
"framer-motion": "^12.33.0",
+ "lenis": "^1.3.17",
"lucide-react": "^0.563.0",
"mammoth": "^1.11.0",
"next": "16.1.6",
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index 445f502..91ff1b4 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -67,7 +67,7 @@ export default function AboutPage() {
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.2 }}
- className="max-w-3xl mx-auto text-xl text-slate-400 font-medium leading-relaxed"
+ className="max-w-3xl mx-auto text-xl text-slate-300 font-medium leading-relaxed"
>
We started JUNOHUB with a simple belief: the global supply chain is broken, and
technology is the only way to fix it. We're building the infrastructure for a
@@ -87,7 +87,7 @@ export default function AboutPage() {
transition={{ duration: 0.8 }}
>
Our Vision
-
+
Every day, millions of dollars are lost due to inefficient communication,
lost inventory data, and slow synchronization.
@@ -115,7 +115,7 @@ export default function AboutPage() {
{item.value}
-
{item.label}
+
{item.label}
))}
@@ -141,7 +141,7 @@ export default function AboutPage() {
{v.title}
-
{v.description}
+
{v.description}
))}
@@ -156,7 +156,7 @@ export default function AboutPage() {
viewport={{ once: true }}
>
Join the Movement
-
+
We're always looking for ambitious vendors and suppliers to join our
expanding ecosystem. Let's build the future together.
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index fbc6768..eb3f7f2 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -24,6 +24,7 @@ export const viewport = {
import { Providers } from "@/components/providers";
import { ErrorBoundary } from "@/components/ErrorBoundary";
+import { SmoothScroll } from "@/components/SmoothScroll";
export default function RootLayout({
children,
@@ -33,10 +34,14 @@ export default function RootLayout({
return (
- {children}
+
+
+ {children}
+
+
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 8486fb7..0c556b1 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,21 +1,34 @@
-import { auth } from "@/auth"
+"use client"
+
+import { useMediaQuery } from "@/hooks/useMediaQuery"
import { LandingNavbar } from "@/components/landing/LandingNavbar"
import { LandingHero } from "@/components/landing/LandingHero"
import { LandingFeatures } from "@/components/landing/LandingFeatures"
import { LandingSolutions } from "@/components/landing/LandingSolutions"
import { LandingFooter } from "@/components/landing/LandingFooter"
+import { MobileHero } from "@/components/landing/mobile/MobileHero"
+import { MobileFeatures } from "@/components/landing/mobile/MobileFeatures"
-export default async function HomePage() {
- const session = await auth()
- const isLoggedIn = !!session
+export default function HomePage() {
+ const isMobile = useMediaQuery("(max-width: 768px)")
return (
-
+
-
-
-
+ {isMobile ? (
+ <>
+
+
+
+ >
+ ) : (
+ <>
+
+
+
+ >
+ )}
diff --git a/src/components/SmoothScroll.tsx b/src/components/SmoothScroll.tsx
new file mode 100644
index 0000000..c1e103f
--- /dev/null
+++ b/src/components/SmoothScroll.tsx
@@ -0,0 +1,32 @@
+"use client"
+
+import { useEffect } from 'react'
+import Lenis from 'lenis'
+
+export function SmoothScroll({ children }: { children: React.ReactNode }) {
+ useEffect(() => {
+ const lenis = new Lenis({
+ duration: 1.2,
+ easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
+ orientation: 'vertical',
+ gestureOrientation: 'vertical',
+ smoothWheel: true,
+ wheelMultiplier: 1,
+ touchMultiplier: 2,
+ infinite: false,
+ })
+
+ function raf(time: number) {
+ lenis.raf(time)
+ requestAnimationFrame(raf)
+ }
+
+ requestAnimationFrame(raf)
+
+ return () => {
+ lenis.destroy()
+ }
+ }, [])
+
+ return <>{children}>
+}
diff --git a/src/components/landing/LandingFooter.tsx b/src/components/landing/LandingFooter.tsx
index c4d23e8..8fd192a 100644
--- a/src/components/landing/LandingFooter.tsx
+++ b/src/components/landing/LandingFooter.tsx
@@ -8,7 +8,7 @@ export function LandingFooter() {
return (
{/* Background Glow */}
-
+
@@ -19,17 +19,17 @@ export function LandingFooter() {
JUNOHUB
-
+
The next generation of supply chain connectivity. Secure, encrypted, and real-time.
@@ -38,25 +38,25 @@ export function LandingFooter() {
Platform
- Features
- Shopify Sync
- Security
- API
+ Features
+ Shopify Sync
+ Security
+ API
Company
- About Us
- Privacy Policy
- Terms of Service
+ About Us
+ Privacy Policy
+ Terms of Service
Newsletter
-
Stay updated with the latest in supply chain tech.
+
Stay updated with the latest in supply chain tech.
{/* Status Message */}
@@ -124,13 +125,13 @@ export function LandingFooter() {
-
+
© 2026 JUNOHUB. All rights reserved.
- Terms
- Privacy
- Cookies
+ Terms
+ Privacy
+ Cookies
diff --git a/src/components/landing/LandingHero.tsx b/src/components/landing/LandingHero.tsx
index b432e1f..cd8e948 100644
--- a/src/components/landing/LandingHero.tsx
+++ b/src/components/landing/LandingHero.tsx
@@ -22,9 +22,9 @@ export function LandingHero() {
className="relative min-h-screen flex items-center justify-center pt-20 overflow-hidden"
>
{/* Background Decorative Elements */}
-
-
-
+
{/* Grid Pattern */}
@@ -54,9 +54,9 @@ export function LandingHero() {
{/* Main Heading */}
THE PULSE OF
@@ -67,8 +67,8 @@ export function LandingHero() {
Bridge the gap between vendors and suppliers with the world's most advanced
encrypted ecosystem. Sync Shopify, chat securely, and scale effortlessly.
@@ -135,7 +135,7 @@ export function LandingHero() {
className="absolute top-0 left-0 w-full h-1/3 bg-indigo-500"
/>
- Scroll
+ Scroll
)
diff --git a/src/components/landing/LandingNavbar.tsx b/src/components/landing/LandingNavbar.tsx
index 864872f..6dbf343 100644
--- a/src/components/landing/LandingNavbar.tsx
+++ b/src/components/landing/LandingNavbar.tsx
@@ -57,7 +57,7 @@ export function LandingNavbar({ isLoggedIn }: LandingNavbarProps) {
{link.name}
@@ -84,6 +84,8 @@ export function LandingNavbar({ isLoggedIn }: LandingNavbarProps) {
setMobileMenuOpen(!mobileMenuOpen)}
+ aria-label={mobileMenuOpen ? "Close menu" : "Open menu"}
+ aria-expanded={mobileMenuOpen}
>
{mobileMenuOpen ? : }
diff --git a/src/components/landing/LandingSolutions.tsx b/src/components/landing/LandingSolutions.tsx
index c3d5ccc..a01847e 100644
--- a/src/components/landing/LandingSolutions.tsx
+++ b/src/components/landing/LandingSolutions.tsx
@@ -57,7 +57,7 @@ export function LandingSolutions() {
{sol.title}
-
+
{sol.description}
diff --git a/src/components/landing/mobile/MobileFeatures.tsx b/src/components/landing/mobile/MobileFeatures.tsx
new file mode 100644
index 0000000..99bb680
--- /dev/null
+++ b/src/components/landing/mobile/MobileFeatures.tsx
@@ -0,0 +1,109 @@
+"use client"
+
+import { motion } from "framer-motion"
+import {
+ Zap,
+ MessageSquare,
+ BarChart3,
+ ShieldCheck,
+ LayoutDashboard,
+ RefreshCcw,
+ ArrowRight
+} from "lucide-react"
+import Link from "next/link"
+
+const features = [
+ {
+ title: "Shopify Sync",
+ icon: RefreshCcw,
+ color: "text-emerald-400",
+ bg: "bg-emerald-500/10",
+ size: "col-span-1"
+ },
+ {
+ title: "E2E Chat",
+ icon: MessageSquare,
+ color: "text-blue-400",
+ bg: "bg-blue-500/10",
+ size: "col-span-1"
+ },
+ {
+ title: "High Octane Analytics",
+ icon: BarChart3,
+ color: "text-purple-400",
+ bg: "bg-purple-500/10",
+ size: "col-span-2"
+ },
+ {
+ title: "Dashboard",
+ icon: LayoutDashboard,
+ color: "text-orange-400",
+ bg: "bg-orange-500/10",
+ size: "col-span-1"
+ },
+ {
+ title: "Security",
+ icon: ShieldCheck,
+ color: "text-red-400",
+ bg: "bg-red-500/10",
+ size: "col-span-1"
+ },
+ {
+ title: "Global Scalability",
+ icon: Zap,
+ color: "text-yellow-400",
+ bg: "bg-yellow-500/10",
+ size: "col-span-2"
+ }
+]
+
+export function MobileFeatures() {
+ return (
+
+ {/* Decorative lines */}
+
+
+
+
+ Infrastructure
+
+
Dominance.
+
+
+
+
+ {features.map((f, i) => (
+
+ {/* Glow */}
+
+
+
+
+
+ {f.title}
+
+ ))}
+
+
+
+
+
Ready to sync?
+
Join the thousands of vendors scaling with JUNOHUB.
+
+ Get Started
+
+
+
+ )
+}
diff --git a/src/components/landing/mobile/MobileHero.tsx b/src/components/landing/mobile/MobileHero.tsx
new file mode 100644
index 0000000..6e09566
--- /dev/null
+++ b/src/components/landing/mobile/MobileHero.tsx
@@ -0,0 +1,91 @@
+"use client"
+
+import { motion } from "framer-motion"
+import { ArrowRight, Play, ShieldCheck, Zap, Globe, MessageSquare } from "lucide-react"
+import Link from "next/link"
+
+const stats = [
+ { label: "AES-250 READY", icon: ShieldCheck },
+ { label: "SHOPIFY SYNC", icon: Zap },
+ { label: "120+ COUNTRIES", icon: Globe },
+ { label: "E2E CHAT", icon: MessageSquare },
+]
+
+export function MobileHero() {
+ return (
+
+ {/* The Pulse Core - Central Visual */}
+
+
+
+ {/* Mobile-First Badge */}
+
+
+ Next-Gen Engine
+
+
+ {/* Big, Punchy Mobile Header */}
+
+ THE
+ PULSE.
+
+
+
+ Bridge the gap between vendors and suppliers with the world's most advanced
+ encrypted ecosystem.
+
+
+ {/* Thumb-Zone CTAs */}
+
+
+ GET STARTED NOW
+
+
+
+
+ WATCH DEMO
+
+
+
+
+ {/* Infinite Marquee for Stats - Prevents Overlap */}
+
+
+
+
+
+ {[...stats, ...stats, ...stats, ...stats].map((s, i) => (
+
+
+ {s.label}
+
+ ))}
+
+
+
+ )
+}
diff --git a/src/hooks/useMediaQuery.ts b/src/hooks/useMediaQuery.ts
new file mode 100644
index 0000000..d3fee33
--- /dev/null
+++ b/src/hooks/useMediaQuery.ts
@@ -0,0 +1,19 @@
+"use client"
+
+import { useState, useEffect } from "react"
+
+export function useMediaQuery(query: string) {
+ const [matches, setMatches] = useState(false)
+
+ useEffect(() => {
+ const media = window.matchMedia(query)
+ if (media.matches !== matches) {
+ setMatches(media.matches)
+ }
+ const listener = () => setMatches(media.matches)
+ window.addEventListener("resize", listener)
+ return () => window.removeEventListener("resize", listener)
+ }, [matches, query])
+
+ return matches
+}