diff --git a/app/about/page.jsx b/app/about/page.jsx
new file mode 100644
index 0000000..ecba887
--- /dev/null
+++ b/app/about/page.jsx
@@ -0,0 +1,36 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { Section } from '../../components/Section';
+
+export default function AboutPage() {
+ return (
+
+
+ We’re the force behind breakout brands.
+ Flux Aura Digital blends strategic rigor with cinematic creative to build brands that own attention.
+
+
+ Timeline
+
+ {['2019: Founded with one mission—results.', '2021: Expanded into multi-channel growth systems.', '2024: Partnered with global challenger brands.'].map((item, i) => (
+
+ {item}
+
+ ))}
+
+
+
+ Team
+
+ {['Strategy Lead', 'Creative Director', 'Growth Engineer'].map((role) => (
+
+ Flux Aura
+ {role}
+
+ ))}
+
+
+
+ );
+}
diff --git a/app/contact/page.jsx b/app/contact/page.jsx
new file mode 100644
index 0000000..26041a6
--- /dev/null
+++ b/app/contact/page.jsx
@@ -0,0 +1,28 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { Section } from '../../components/Section';
+
+export default function ContactPage() {
+ return (
+
+
+ Let’s Build Something Powerful.
+
+
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..4cf301e
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,41 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ color-scheme: dark;
+}
+
+html, body {
+ background: radial-gradient(circle at top, #0f1034 0%, #070710 44%, #020205 100%);
+ color: #f4f4ff;
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: Inter, system-ui, sans-serif;
+}
+
+.glass {
+ @apply border border-white/15 bg-white/5 backdrop-blur-xl;
+}
+
+.neon-border {
+ box-shadow: 0 0 0 1px rgba(133, 104, 255, 0.4), 0 0 30px rgba(105, 94, 255, 0.35);
+}
+
+.section-shell {
+ @apply mx-auto max-w-6xl px-6 md:px-10;
+}
+
+.text-gradient {
+ background: linear-gradient(90deg, #6fe4ff, #ad8cff, #ff81d5);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.grid-glow {
+ background-image: linear-gradient(rgba(108, 89, 255, 0.2) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(108, 89, 255, 0.2) 1px, transparent 1px);
+ background-size: 50px 50px;
+}
diff --git a/app/layout.jsx b/app/layout.jsx
new file mode 100644
index 0000000..fddf608
--- /dev/null
+++ b/app/layout.jsx
@@ -0,0 +1,22 @@
+import './globals.css';
+import { Navbar } from '../components/Navbar';
+import { Loader } from '../components/Loader';
+
+export const metadata = {
+ title: 'Flux Aura Digital | Digital Marketing Agency',
+ description:
+ 'Flux Aura Digital is a futuristic digital marketing agency focused on social media marketing, branding, growth strategy, and high-performance web experiences.',
+ keywords: ['Digital Marketing Agency', 'Social Media Marketing', 'Growth Strategy', 'Branding Agency'],
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/app/page.jsx b/app/page.jsx
new file mode 100644
index 0000000..2159fee
--- /dev/null
+++ b/app/page.jsx
@@ -0,0 +1,151 @@
+'use client';
+
+import { motion, useScroll, useTransform } from 'framer-motion';
+import { MagneticButton } from '../components/MagneticButton';
+import { Section } from '../components/Section';
+import { ThreeHero } from '../components/ThreeHero';
+
+const services = ['Social Media Marketing', 'Branding', 'Paid Ads', 'Content Creation', 'Web Development'];
+
+const headlineWords = ['We', 'Don’t', 'Market.', 'We', 'Create', 'Digital', 'Gravity.'];
+
+export default function HomePage() {
+ const { scrollYProgress } = useScroll();
+ const heroY = useTransform(scrollYProgress, [0, 1], [0, -170]);
+ const heroOpacity = useTransform(scrollYProgress, [0, 0.35], [1, 0.45]);
+ const layerY = useTransform(scrollYProgress, [0, 1], [0, -240]);
+
+ return (
+
+
+
+
+
+
+
+
+ Digital Marketing Agency
+
+
+
+ {headlineWords.map((word, idx) => (
+
+ {word}
+
+ ))}
+
+
+
+ We engineer magnetic brand ecosystems that turn cold traffic into obsessed communities and unstoppable growth.
+
+
+
+ Start Your Growth Orbit
+ Explore Case Studies
+
+
+
+ {['Growth Strategy', 'Performance Creative', 'Category Dominance'].map((label) => (
+
+ {label}
+
+ ))}
+
+
+
+ Scroll
+
+
+
+
+
+
+
+
+ Services that weaponize growth.
+
+ {services.map((item) => (
+
+ {item}
+ Precision strategy, cinematic content, and conversion-first systems.
+
+ ))}
+
+
+
+
+ Selected launches from the orbit.
+
+ {[1, 2, 3].map((i) => (
+
+
+
+
+ ))}
+
+
+
+
+ Our process is engineered for dominance.
+
+ {['Discover', 'Architect', 'Launch', 'Scale'].map((step, idx) => (
+
+ 0{idx + 1}
+ {step}
+
+ ))}
+
+
+
+
+
+
Ready to lead your category?
+
Let’s Build Something Powerful.
+
+ Book Strategy Call
+
+
+
+
+ );
+}
diff --git a/app/portfolio/page.jsx b/app/portfolio/page.jsx
new file mode 100644
index 0000000..7babc10
--- /dev/null
+++ b/app/portfolio/page.jsx
@@ -0,0 +1,76 @@
+'use client';
+
+import { useMemo, useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { Section } from '../../components/Section';
+
+const projects = [
+ { title: 'Nova Fitness', tag: 'Branding', blurb: 'Rebrand + paid social led to 4.1x ROAS.' },
+ { title: 'Astra Beauty', tag: 'Social', blurb: 'Short-form content framework delivered 290% follower growth.' },
+ { title: 'Orbit Fintech', tag: 'Web', blurb: 'New conversion funnel doubled qualified leads in 60 days.' },
+ { title: 'Velocity Labs', tag: 'Paid Ads', blurb: 'Creative testing protocol cut CPA by 42%.' },
+];
+
+const filters = ['All', 'Branding', 'Social', 'Web', 'Paid Ads'];
+
+export default function PortfolioPage() {
+ const [filter, setFilter] = useState('All');
+ const [active, setActive] = useState(null);
+ const data = useMemo(() => projects.filter((p) => filter === 'All' || p.tag === filter), [filter]);
+
+ return (
+
+
+ Portfolio: proof of digital gravity.
+
+ {filters.map((item) => (
+ setFilter(item)}
+ className={`rounded-full px-4 py-2 text-sm ${filter === item ? 'bg-white/20' : 'bg-white/8'}`}
+ >
+ {item}
+
+ ))}
+
+
+
+
+ {data.map((project) => (
+
setActive(project.title)}
+ className="glass rounded-2xl p-7 text-left"
+ >
+ {project.tag}
+ {project.title}
+ {project.blurb}
+
+ ))}
+
+
+
+ {active && (
+ setActive(null)}
+ >
+
+ {active}
+ This case study combines growth strategy, creative velocity, and data-led optimization.
+
+
+ )}
+
+
+ );
+}
diff --git a/app/services/page.jsx b/app/services/page.jsx
new file mode 100644
index 0000000..1cde6f1
--- /dev/null
+++ b/app/services/page.jsx
@@ -0,0 +1,40 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { Section } from '../../components/Section';
+
+const blocks = [
+ ['📱', 'Social Media Marketing', 'Build momentum with platform-native content systems that trigger engagement and action.'],
+ ['✨', 'Branding', 'Position your brand as the obvious premium choice with bold identity and strategic storytelling.'],
+ ['🎯', 'Paid Ads', 'Performance creative + media science designed for profitable scale across channels.'],
+ ['🎬', 'Content Creation', 'Cinematic short-form and campaign assets made to stop thumbs and drive demand.'],
+ ['💻', 'Web Development', 'High-converting, lightning-fast websites with premium interaction design.'],
+];
+
+export default function ServicesPage() {
+ return (
+
+
+ Services engineered for growth velocity.
+
+
+
+ {blocks.map(([icon, title, copy], idx) => (
+
+ {icon}
+ {title}
+ {copy}
+
+ ))}
+
+
+
+ );
+}
diff --git a/components/Loader.jsx b/components/Loader.jsx
new file mode 100644
index 0000000..bcfc5db
--- /dev/null
+++ b/components/Loader.jsx
@@ -0,0 +1,31 @@
+'use client';
+
+import { AnimatePresence, motion } from 'framer-motion';
+import { useEffect, useState } from 'react';
+
+export function Loader() {
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ const timer = setTimeout(() => setLoading(false), 1300);
+ return () => clearTimeout(timer);
+ }, []);
+
+ return (
+
+ {loading && (
+
+
+
+ )}
+
+ );
+}
diff --git a/components/MagneticButton.jsx b/components/MagneticButton.jsx
new file mode 100644
index 0000000..1aba1b1
--- /dev/null
+++ b/components/MagneticButton.jsx
@@ -0,0 +1,34 @@
+'use client';
+
+import { motion, useMotionValue, useSpring } from 'framer-motion';
+import Link from 'next/link';
+
+export function MagneticButton({ href, children }) {
+ const x = useMotionValue(0);
+ const y = useMotionValue(0);
+ const springX = useSpring(x, { stiffness: 150, damping: 13 });
+ const springY = useSpring(y, { stiffness: 150, damping: 13 });
+
+ return (
+ {
+ const rect = e.currentTarget.getBoundingClientRect();
+ x.set((e.clientX - rect.left - rect.width / 2) * 0.2);
+ y.set((e.clientY - rect.top - rect.height / 2) * 0.2);
+ }}
+ onMouseLeave={() => {
+ x.set(0);
+ y.set(0);
+ }}
+ className="inline-block"
+ >
+
+ {children}
+
+
+ );
+}
diff --git a/components/Navbar.jsx b/components/Navbar.jsx
new file mode 100644
index 0000000..b946b75
--- /dev/null
+++ b/components/Navbar.jsx
@@ -0,0 +1,38 @@
+'use client';
+
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+
+const links = [
+ ['/', 'Home'],
+ ['/services', 'Services'],
+ ['/portfolio', 'Portfolio'],
+ ['/about', 'About'],
+ ['/contact', 'Contact'],
+];
+
+export function Navbar() {
+ const pathname = usePathname();
+ return (
+
+ );
+}
diff --git a/components/Section.jsx b/components/Section.jsx
new file mode 100644
index 0000000..9ccb739
--- /dev/null
+++ b/components/Section.jsx
@@ -0,0 +1,18 @@
+'use client';
+
+import { motion } from 'framer-motion';
+
+export function Section({ children, id }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/components/ThreeHero.jsx b/components/ThreeHero.jsx
new file mode 100644
index 0000000..d102dc1
--- /dev/null
+++ b/components/ThreeHero.jsx
@@ -0,0 +1,123 @@
+'use client';
+
+import { useEffect, useRef } from 'react';
+import * as THREE from 'three';
+
+export function ThreeHero() {
+ const mountRef = useRef(null);
+
+ useEffect(() => {
+ if (!mountRef.current) return;
+
+ const container = mountRef.current;
+ const isMobile = window.innerWidth < 768;
+
+ const scene = new THREE.Scene();
+ const camera = new THREE.PerspectiveCamera(65, container.clientWidth / container.clientHeight, 0.1, 1000);
+ camera.position.set(0, 0.2, 6);
+
+ const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: !isMobile, powerPreference: 'high-performance' });
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, isMobile ? 1.1 : 1.6));
+ renderer.setSize(container.clientWidth, container.clientHeight);
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
+ container.appendChild(renderer.domElement);
+
+ const keyLight = new THREE.DirectionalLight(0xffffff, 1.25);
+ keyLight.position.set(3, 2, 4);
+ const fill = new THREE.PointLight(0x8e7bff, 1.4, 25);
+ fill.position.set(-3, -1.2, 3);
+ scene.add(keyLight, fill, new THREE.AmbientLight(0x8d7dff, 0.4));
+
+ const geometry = new THREE.IcosahedronGeometry(0.9, 2);
+ const materials = ['#53b8ff', '#9a7bff', '#ff76cf'].map(
+ (color) => new THREE.MeshStandardMaterial({ color, metalness: 0.72, roughness: 0.15 }),
+ );
+
+ const meshes = materials.map((material, i) => {
+ const mesh = new THREE.Mesh(geometry, material);
+ mesh.position.set(i * 2 - 2, i - 1.2, -i - 0.4);
+ scene.add(mesh);
+ return mesh;
+ });
+
+ const ring = new THREE.Mesh(
+ new THREE.TorusGeometry(3.3, 0.03, 32, 200),
+ new THREE.MeshBasicMaterial({ color: '#7f8dff', transparent: true, opacity: 0.25 }),
+ );
+ ring.rotation.x = 1.3;
+ ring.position.y = -1.4;
+ scene.add(ring);
+
+ const particlesGeometry = new THREE.BufferGeometry();
+ const particlesCount = isMobile ? 520 : 1100;
+ const particlePos = new Float32Array(particlesCount * 3);
+ for (let i = 0; i < particlesCount; i++) {
+ particlePos[i * 3] = (Math.random() - 0.5) * 35;
+ particlePos[i * 3 + 1] = (Math.random() - 0.5) * 35;
+ particlePos[i * 3 + 2] = -Math.random() * 22;
+ }
+ particlesGeometry.setAttribute('position', new THREE.BufferAttribute(particlePos, 3));
+ const points = new THREE.Points(
+ particlesGeometry,
+ new THREE.PointsMaterial({ color: '#89a2ff', size: isMobile ? 0.045 : 0.06, transparent: true, opacity: 0.7 }),
+ );
+ scene.add(points);
+
+ const pointer = { x: 0, y: 0 };
+ const onPointer = (e) => {
+ pointer.x = (e.clientX / window.innerWidth) * 2 - 1;
+ pointer.y = -(e.clientY / window.innerHeight) * 2 + 1;
+ };
+
+ const onResize = () => {
+ camera.aspect = container.clientWidth / container.clientHeight;
+ camera.updateProjectionMatrix();
+ renderer.setSize(container.clientWidth, container.clientHeight);
+ };
+
+ window.addEventListener('pointermove', onPointer, { passive: true });
+ window.addEventListener('resize', onResize);
+
+ let frame = 0;
+ const animate = () => {
+ frame = requestAnimationFrame(animate);
+ const t = performance.now() * 0.00045;
+
+ meshes.forEach((mesh, i) => {
+ mesh.rotation.x += 0.0035 + i * 0.0009;
+ mesh.rotation.y += 0.005 + i * 0.001;
+ mesh.position.y = Math.sin(t + i) * 0.3;
+ });
+
+ ring.rotation.z += 0.0017;
+ points.rotation.y += 0.00025;
+
+ scene.rotation.y += (pointer.x * 0.16 - scene.rotation.y) * 0.03;
+ scene.rotation.x += (pointer.y * 0.09 - scene.rotation.x) * 0.03;
+
+ renderer.render(scene, camera);
+ };
+
+ animate();
+
+ return () => {
+ cancelAnimationFrame(frame);
+ window.removeEventListener('pointermove', onPointer);
+ window.removeEventListener('resize', onResize);
+ container.removeChild(renderer.domElement);
+ renderer.dispose();
+ geometry.dispose();
+ ring.geometry.dispose();
+ ring.material.dispose();
+ particlesGeometry.dispose();
+ materials.forEach((m) => m.dispose());
+ };
+ }, []);
+
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..4e61471
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,14 @@
+import { dirname } from 'path';
+import { fileURLToPath } from 'url';
+import { FlatCompat } from '@eslint/eslintrc';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+ baseDirectory: __dirname,
+});
+
+export default [
+ ...compat.extends('next/core-web-vitals', 'next/typescript'),
+];
diff --git a/next.config.mjs b/next.config.mjs
new file mode 100644
index 0000000..8ed2416
--- /dev/null
+++ b/next.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ experimental: {
+ optimizePackageImports: ['framer-motion'],
+ },
+};
+
+export default nextConfig;
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6c2bd81
--- /dev/null
+++ b/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "flux-aura-digital",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "framer-motion": "^11.15.0",
+ "next": "15.2.3",
+ "react": "19.0.0",
+ "react-dom": "19.0.0",
+ "three": "^0.174.0"
+ },
+ "devDependencies": {
+ "autoprefixer": "^10.4.20",
+ "eslint": "^9.21.0",
+ "eslint-config-next": "15.2.3",
+ "postcss": "^8.5.3",
+ "tailwindcss": "^3.4.17"
+ }
+}
diff --git a/postcss.config.mjs b/postcss.config.mjs
new file mode 100644
index 0000000..2aa7205
--- /dev/null
+++ b/postcss.config.mjs
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..425755f
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,8 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: ['./app/**/*.{js,jsx}', './components/**/*.{js,jsx}'],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+};