public 3d-motion repository

Portfolio-Landing-Page-1-NextJS-Frontend

// arnobt78/Portfolio-Landing-Page-1-NextJS-Frontend

A modern, single-page portfolio template built with Next.js 14, React 18, and TypeScript. It showcases a full landing experience with a hero, bento grid, projects, testimonials, experience, approach, contact—with smooth animations, a 3D globe, & reusable UI components. Ideal for learning Next.js App Router, Framer Motion, Three.js/React Three Fiber

$ git log --oneline --stat
stars:2forks:0updated:2026-05-07
README.md
readonly

Portfolio Landing Page 1 – Next.js, React, TypeScript, Tailwind CSS, Framer Motion, Three.js, 3D Globe, Frontend Project

License: MIT Next.js React TypeScript Tailwind CSS Framer Motion

A modern, single-page portfolio template built with Next.js 14, React 18, and TypeScript. It showcases a full landing experience with a hero, bento grid, projects, testimonials, experience, approach, and contact—with smooth animations, a 3D globe, and reusable UI components. Ideal for learning Next.js App Router, Framer Motion, Three.js/React Three Fiber, and Tailwind CSS.

Live Demo: https://portfolio-ui-1.vercel.app/

Screenshot 2026-03-07 at 11 13 18 Screenshot 2026-03-07 at 11 13 41 Screenshot 2026-03-07 at 11 13 59 Screenshot 2026-03-07 at 11 14 29 Screenshot 2026-03-07 at 11 14 58 Screenshot 2026-03-07 at 11 15 14

Table of Contents


Project Overview

This repository is a frontend-only portfolio template. It has no custom backend or API—all content is driven by static data in data/index.ts. The app is a single scrollable page with section IDs for in-page navigation (#about, #projects, #testimonials, #contact). It uses the Next.js App Router (app/), client components where interactivity is needed, and server-rendered layout and metadata for SEO. The UI is built from modular components (Hero, Bento Grid, Projects, Testimonials, Experience, Approach, Footer) that you can reuse or remove in your own projects.


Features & Functionalities

FeatureDescription
HeroSpotlight backgrounds, grid overlay, animated headline (word-by-word), tagline, and CTA button linking to #about.
Floating NavFixed top navigation that hides on scroll-down and reappears on scroll-up or near top; links to #about, #projects, #testimonials, #contact.
Bento Grid (About)Responsive grid of cards: images, 3D globe (Three.js), tech stack labels, and a “Copy email” cell with Lottie confetti.
Recent ProjectsProject cards with 3D tilt on hover (Pin component), cover image, title, description, tech icons, and “Check Live Site” link.
TestimonialsHorizontally scrolling infinite carousel of client quotes plus a row of company logos.
ExperienceGrid of work experience cards with animated gradient borders (MovingBorders).
ApproachThree phase cards; on hover, a canvas dot-matrix effect (WebGL shader) reveals and shows phase title + description.
FooterCTA heading, email button, copyright, and social icons.
ThemeDark/light/system via next-themes (ThemeProvider in app/provider.tsx).
SEOMetadata (title, description, Open Graph, Twitter, keywords, favicon) in app/layout.tsx.

Technology Stack

  • Framework: Next.js 14 (App Router)
  • UI: React 18, TypeScript 5.x
  • Styling: Tailwind CSS 3.x, custom theme (e.g. black-100, purple, white-100)
  • Animation: Framer Motion 11
  • 3D / Globe: Three.js, three-globe, @react-three/fiber, @react-three/drei
  • Effects: Custom GLSL shader (CanvasRevealEffect), Lottie (react-lottie), SVG spotlights
  • Utilities: clsx, tailwind-merge (lib/utils.tscn()), next-themes
  • Icons: react-icons, lucide-react, @tabler/icons-react
  • Deployment: Vercel (optional; npm run deploy)

Project Structure

portfolio-ui-1/
├── app/
│   ├── layout.tsx          # Root layout: font, metadata, ThemeProvider, favicon
│   ├── page.tsx             # Home page: composes all sections (client)
│   ├── globals.css          # Tailwind + base styles, :root/.dark vars, .heading
│   ├── provider.tsx         # next-themes ThemeProvider (client)
│   └── global-error.jsx     # Root error boundary (own <html>/<body>)
├── components/
│   ├── Hero.tsx             # Hero section
│   ├── Grid.tsx             # About / bento grid section
│   ├── RecentProjects.tsx   # Projects section
│   ├── Clients.tsx          # Testimonials + company logos
│   ├── Experience.tsx       # Work experience cards
│   ├── Approach.tsx         # Three phase cards + canvas reveal
│   ├── Footer.tsx           # Contact + CTA + social
│   ├── MagicButton.tsx      # Button with conic-gradient border
│   └── ui/
│       ├── FloatingNavbar.tsx   # Scroll-aware fixed nav
│       ├── BentoGrid.tsx        # Bento layout + BentoGridItem (globe, copy-email, etc.)
│       ├── Spotlight.tsx        # SVG spotlight for hero
│       ├── TextGenerateEffect.tsx # Staggered word animation
│       ├── InfiniteCards.tsx     # Infinite horizontal testimonial scroll
│       ├── MovingBorders.tsx     # Animated border wrapper (Button + MovingBorder)
│       ├── Pin.tsx               # 3D tilt card (PinContainer, PinPerspective)
│       ├── GridGlobe.tsx         # Wrapper for Globe (dynamic import, no SSR)
│       ├── Globe.tsx             # Three-globe: arcs, points, rings
│       ├── GradientBg.tsx        # Animated gradient background
│       ├── CanvasRevealEffect.tsx # WebGL dot-matrix reveal
│       ├── HoverBorder.tsx       # Gradient border on hover/rotate
│       └── LayoutGrid.tsx        # Optional grid with expandable cards
├── data/
│   ├── index.ts             # navItems, gridItems, projects, testimonials, companies, workExperience, socialMedia
│   ├── globe.json           # GeoJSON for globe countries
│   └── confetti.json        # Lottie animation for copy-email
├── lib/
│   └── utils.ts             # cn() – class name merger (clsx + tailwind-merge)
├── public/                  # Static assets (images, SVGs, favicon)
├── .env.example             # Sentry and optional env vars
├── next.config.mjs          # Images, webpack (canvas external, .mjs)
├── tailwind.config.ts       # Theme, keyframes, bg-grid/bg-dot plugins
├── tsconfig.json
└── package.json

Getting Started

Prerequisites

  • Node.js 18.x or 20.x (LTS recommended)
  • npm (or yarn/pnpm)

Clone & Install

git clone https://github.com/your-username/portfolio-ui-1.git
cd portfolio-ui-1
npm install

Environment setup

  1. Copy the example env file:

    cp .env.example .env.local
    
  2. Edit .env.local and add any required values (see Environment Variables). The app runs without env vars; Sentry is optional.

Run locally

npm run dev

Open http://localhost:3000. The single page loads with all sections; use the top nav to jump to #about, #projects, #testimonials, #contact.

Build for production

npm run build
npm run start

Environment Variables

The project can run with no environment variables. All content is static. The following are optional and mainly for error monitoring (Sentry).

VariableRequiredDescription
SENTRY_AUTH_TOKENNoSentry auth token for uploading source maps. Get it from Sentry API Auth Tokens.
SENTRY_ORGNoYour Sentry organization slug (from dashboard URL).
SENTRY_PROJECTNoYour Sentry project slug.
NEXT_PUBLIC_SENTRY_DSNNoSentry DSN for client-side error reporting. From Project Keys.
NODE_ENVNoUsually set by Next.js (development / production).

How to get Sentry variables (optional):

  1. Create an account at sentry.io.
  2. Create a project (e.g. Next.js).
  3. Auth token: Settings → Account → API → Auth Tokens → Create. Use for SENTRY_AUTH_TOKEN.
  4. Org & project: From the URL https://sentry.io/organizations/[org]/projects/[project]/ copy org and project into SENTRY_ORG and SENTRY_PROJECT.
  5. DSN: Project → Settings → Client Keys (DSN). Copy into NEXT_PUBLIC_SENTRY_DSN if you want client-side reporting.

Example .env.local (minimal – app works without these):

# Optional: Sentry (only if you integrate Sentry in the app)
# SENTRY_AUTH_TOKEN=your-token
# SENTRY_ORG=your-org
# SENTRY_PROJECT=your-project
# NEXT_PUBLIC_SENTRY_DSN=https://xxx@sentry.io/xxx

Available Scripts

ScriptCommandPurpose
devnpm run devStart Next.js dev server (default port 3000).
buildnpm run buildProduction build.
startnpm run startRun production server (after build).
lintnpm run lintRun ESLint.
deploynpm run deployDeploy to Vercel production (vercel --prod).

Routes & Pages

This app has one route: the root / (home). There are no /api/* or other route segments.

  • / – Renders app/page.tsx, which is a client component that stacks:
    • FloatingNav (fixed)
    • Hero
    • Grid (id="about")
    • RecentProjects
    • Clients (id="testimonials")
    • Experience
    • Approach
    • Footer (id="contact")

Navigation is in-page via hash links (#about, #projects, #testimonials, #contact). The layout and metadata are in app/layout.tsx (server); the single page is client-rendered for interactivity.


Components Overview

ComponentRoleKey deps
HeroTagline, spotlight SVGs, grid bg, TextGenerateEffect headline, CTA.Spotlight, TextGenerateEffect, MagicButton
GridBento section; maps gridItems to BentoGridItem.BentoGrid, BentoGridItem, data/gridItems
BentoGridItemSingle cell: optional images, globe (id=2), tech list (id=3), gradient + copy-email + Lottie (id=6).GridGlobe, GradientBg, Lottie, MagicButton
RecentProjectsProject cards with PinContainer (3D tilt), image, title, description, tech icons.Pin, data/projects
ClientsHeading + InfiniteMovingCards (testimonials) + company logos.InfiniteCards, data/testimonials, data/companies
ExperienceWork cards with MovingBorders and thumbnail.MovingBorders/Button, data/workExperience
ApproachThree cards; hover shows CanvasRevealEffect and phase text.CanvasRevealEffect, Framer Motion
FooterCTA, email button, copyright, social icons.MagicButton, data/socialMedia
FloatingNavFixed nav; visibility from scroll direction (useScroll, useMotionValueEvent).Framer Motion, Link
MagicButtonConic-gradient border button; optional icon left/right.
SpotlightSVG ellipse + blur for hero background.cn
TextGenerateEffectSplits text into words; stagger animation; optional purple for words after 4th.Framer Motion useAnimate
InfiniteCardsDuplicates list for seamless horizontal scroll; direction/speed via CSS vars.
MovingBordersButton + MovingBorder: gradient blob along path (useAnimationFrame).Framer Motion
PinPinContainer: 3D tilt on hover; PinPerspective: link + glow.Framer Motion
GridGlobeClient-only Globe wrapper; sample arcs + config.Globe (dynamic), Framer Motion
GlobeThree-globe: hex polygons, arcs, points, rings.Three, three-globe, R3F
GradientBgAnimated radial blobs; optional pointer-follow.
CanvasRevealEffectFull-screen dot matrix via custom GLSL (R3F + ShaderMaterial).@react-three/fiber, Three
HoverBorderWrapper with rotating gradient border when not hovered.Framer Motion
LayoutGridGrid of cards with expand-on-click overlay (optional reuse).MovingBorders, Framer Motion

Data & Content

All content is in data/index.ts (no CMS or backend):

  • navItems{ name, link }[] for FloatingNav.
  • gridItems – Bento cells: id, title, description, className, img, imgClassName, titleClassName, spareImg.
  • projectsid, title, des, img, iconLists[], link.
  • testimonialsquote, name, title.
  • companiesid, name, img, nameImg.
  • workExperienceid, title, desc, className, thumbnail.
  • socialMediaid, img (footer icons).

To customize the site, edit these arrays. For images/SVGs, place files in public/ and reference as /filename.svg.


API & Backend

This project has no custom API or backend. It is a static frontend:

  • No app/api/ routes.
  • No server-side data fetching from external APIs (beyond what Next.js does for its own features).
  • No database; content is in data/index.ts and static assets in public/.

To add a backend later, you could create Route Handlers under app/api/ and call them from client components with fetch or a data library.


Reusing Components

You can copy individual components into another Next.js (or React) project and wire them to your own data and styles.

1. MagicButton (conic border button)

Use anywhere you need a primary CTA with optional icon.

import MagicButton from "@/components/MagicButton";
import { FaLocationArrow } from "react-icons/fa6";

<MagicButton
  title="Show my work"
  icon={<FaLocationArrow />}
  position="right"
  handleClick={() => console.log("clicked")}
  otherClasses="custom-class"
/>;

Ensure lib/utils.ts with cn() exists and Tailwind is set up (including any custom classes like bg-slate-950).


2. FloatingNav (scroll-aware nav)

Requires Framer Motion and nav items in the shape { name: string; link: string }[].

import { FloatingNav } from "@/components/ui/FloatingNavbar";
import Link from "next/link";

const items = [
  { name: "About", link: "#about" },
  { name: "Contact", link: "#contact" },
];
<FloatingNav navItems={items} />;

3. InfiniteMovingCards (testimonials)

Pass an array of { quote, name, title } and optional direction / speed / pauseOnHover.

import { InfiniteMovingCards } from "@/components/ui/InfiniteCards";

const testimonials = [{ quote: "Great work!", name: "Jane", title: "CEO" }];
<InfiniteMovingCards
  items={testimonials}
  direction="right"
  speed="slow"
  pauseOnHover={true}
/>;

Include the scroll keyframe and --animation-duration / --animation-direction in your CSS (see tailwind.config.ts).


4. BentoGrid + BentoGridItem

Use for a responsive bento layout. Each item can have id, title, description, className, img, imgClassName, titleClassName, spareImg. Special behavior is keyed by id (e.g. 2 = globe, 3 = tech list, 6 = gradient + copy-email). For a new project, you can simplify BentoGridItem and remove globe/Lottie or adapt to your data.

import { BentoGrid, BentoGridItem } from "@/components/ui/BentoGrid";

<BentoGrid className="w-full py-20">
  {gridItems.map((item, i) => (
    <BentoGridItem key={i} {...item} />
  ))}
</BentoGrid>;

5. PinContainer (3D tilt card)

Wrap any card content for a 3D tilt and optional bottom link.

import { PinContainer } from "@/components/ui/Pin";

<PinContainer title="Visit" href="https://example.com">
  <div className="p-4">
    <h2>Card title</h2>
    <p>Card body</p>
  </div>
</PinContainer>;

6. MovingBorders (animated border cards)

Use the exported Button as a wrapper for cards that should have the moving gradient border.

import { Button } from "@/components/ui/MovingBorders";

<Button duration={10000} borderRadius="1.75rem" className="...">
  <div>Card content</div>
</Button>;

7. TextGenerateEffect (staggered words)

For a headline that reveals word-by-word.

import { TextGenerateEffect } from "@/components/ui/TextGenerateEffect";

<TextGenerateEffect
  words="Your headline here"
  className="text-center text-4xl"
/>;

8. Theme (next-themes)

Wrap the app so dark/light/system works:

import { ThemeProvider } from "@/app/provider";

<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
  {children}
</ThemeProvider>;

Keywords

Portfolio, Next.js, React, TypeScript, App Router, Tailwind CSS, Framer Motion, Three.js, three-globe, React Three Fiber, bento grid, 3D globe, testimonials carousel, single-page application, landing page, SEO metadata, next-themes, dark mode, Vercel, frontend template, reusable components, educational project.


Conclusion

This repo is a frontend-only portfolio template with a single page, static data, and no backend or API. It demonstrates the Next.js 14 App Router, client/server components, Framer Motion, Three.js-based globe, custom WebGL effects, and Tailwind-based layout and theming. You can run it with zero environment variables, customize content via data/index.ts, and reuse individual components (MagicButton, FloatingNav, InfiniteCards, BentoGrid, Pin, MovingBorders, TextGenerateEffect, etc.) in other projects by copying the component files and their dependencies (Framer Motion, R3F, Tailwind, cn utility). Use the structure and comments in the codebase as a learning reference for building similar landing pages.


License

This project is licensed under the MIT License. You may use, modify, and distribute the code in accordance with the license terms.


Happy Coding! 🎉

This is an open-source project — you are welcome to use, extend, and improve it.

If you have questions or want to share what you’ve built, you can open an issue or reach out via my portfolio: https://www.arnobmahmud.com.

Enjoy building and learning! 🚀

Thank you! 😊


metadata.json
TypeScript3d-globeapp-router-nextjsbento-gridFramer Motionfrontend-templateShowcasesnext-themesnextjsPortfoliosportfolio-pageportfolio-projectportfolio-templateportfolio-websitereactReact Three Fibertailwindcsstestimonials-carouselthree-globeThree.jstypescript

[INFO] 5 topics link to curated motion topic pages.