๐ A cinematic GTA VI website featuring advanced GSAP animations, SVG text masking, and scroll-triggered effects
๐ View Live
- Overview
- Features
- Technology Stack
- Demo & Screenshots
- Installation
- Project Structure
- Animation Details
- Code Breakdown
- Deployment
- Contributing
- License
- Contact
A stunning GTA VI promotional website clone featuring advanced animation techniques with GSAP. The project showcases:
- SVG Text Masking Animation: "VI" text reveal with image masking
- Scroll-Triggered Sequences: Complex GSAP ScrollTrigger animations
- Radial Gradient Effects: Dynamic background gradients
- Scale & Opacity Transitions: Smooth cinematic transitions
- Pinned Scrolling: Hero section pinned while content animates
This project demonstrates advanced front-end development skills:
- GSAP Mastery: Complex timelines and ScrollTrigger implementation
- SVG Manipulation: Text masking and dynamic effects
- Modern React: React 19 with useGSAP hook
- Performance: Smooth 60fps animations
- Creative Design: Cinematic storytelling through code
- "VI" text rotates and scales up
- Image reveals through text mask
- Smooth transition to main content
- Auto-removes after animation
- Initial scale animation (1.45x to 1x)
- Black overlay fade out
- Logo and image fade transitions
- Background pattern scale effect
- Pinned hero section while scrolling
- Logo fade out animation
- Hero image opacity transition
- Background size transformation (1000vh โ 28vh)
- Dynamic gradient transitions
- Color morphing effects
- Purple logo reveal with masking
- Text gradient animations
- Vice City story text fade in
- Multi-layer gradient backgrounds
- Smooth opacity transitions
- Responsive text sizing
- Bounce Scroll Indicator: Animated arrow with GSAP yoyo effect
- Responsive Design: Mobile-first approach with media queries
- Cross-Browser Support: Works on all modern browsers
- Performance Optimized: Efficient animation cleanup
- Clean Code: Modular structure with clear comments
{
"react": "^19.1.1", // Latest React with concurrent features
"react-dom": "^19.1.1", // React DOM rendering
"vite": "^7.1.7", // Next-gen build tool
"gsap": "^3.12.2", // Animation library
"@gsap/react": "^2.1.2", // GSAP React integration
"tailwindcss": "^4.1.14", // Utility-first CSS
"@tailwindcss/vite": "^4.1.14" // Tailwind Vite plugin
}- ScrollTrigger: Scroll-based animations
- useGSAP Hook: React-friendly GSAP integration
- SVG Masking: Advanced image reveal effects
- Radial Gradients: Dynamic background effects
Click to view project screenshots
"VI" text mask reveals the hero image with rotation and scale
GTA VI logo and hero image at 1.25x scale
Logo fades out while background pattern scales
"Coming May 26 2026" with radial gradient animation
# Required Software
- Node.js >= 18.0.0
- npm >= 8.0.0 or yarn >= 1.22.0
- Git for version control
- Modern web browser (Chrome recommended)# 1. Clone the repository
git clone https://github.com/Tigmanshukumar/GTA-VI-Website.git
cd GTA-VI-Website
# 2. Install dependencies
npm install
# 3. Start development server
npm run dev
# 4. Open browser
# Navigate to http://localhost:5173# Core dependencies
npm install react react-dom
npm install gsap @gsap/react
npm install tailwindcss @tailwindcss/vite
npm install vite @vitejs/plugin-react
# Dev dependencies (already in package.json)
npm install -D eslint
npm install -D @types/react @types/react-dom# Create optimized build
npm run build
# Preview production build
npm run preview
# Build output in 'dist' foldergta-vi-website/
โโโ public/
โ โโโ gta_hero.webp # Main hero image
โ โโโ gta_logo_cut.webp # GTA VI logo cutout
โ โโโ gta_logo_purple.webp # Purple gradient logo
โ โโโ logo_white.svg # White logo pattern
โ
โโโ src/
โ โโโ App.jsx # SVG mask intro animation
โ โโโ main.jsx # React entry point
โ โโโ script.js # Main GSAP animations
โ โโโ style.css # Main stylesheet
โ โโโ index.css # Global styles (if needed)
โ
โโโ index.html # HTML entry point
โโโ package.json # Dependencies
โโโ vite.config.js # Vite configuration
โโโ tailwind.config.js # Tailwind config
โโโ README.md
// Timeline for "VI" text mask
const tl = gsap.timeline();
// Step 1: Rotate the text
tl.to(".vi-mask-group", {
rotate: 10,
duration: 2,
ease: "Power4.easeInOut",
transformOrigin: "50% 50%"
});
// Step 2: Scale up and fade out
tl.to(".vi-mask-group", {
scale: 10,
duration: 2,
delay: -1.8, // Overlap with rotation
ease: "Expo.easeInOut",
opacity: 0,
onUpdate: function() {
if (this.progress() >= 0.9) { // At 90% completion
document.querySelector(".svg").remove();
document.getElementById('root').style.display = 'none';
setShowContent(true);
}
}
});Key Features:
- SVG mask with "VI" text
- Image revealed through text
- 10ยฐ rotation effect
- 10x scale transformation
- Auto-cleanup at 90% progress
// Initial hero zoom
gsap.from(".hero-main-container", {
scale: 1.45,
duration: 2.8,
ease: "power3.out"
});
// Black overlay fade
gsap.to(".overlay", {
opacity: 0,
duration: 2.8,
ease: "power3.out",
onComplete: () => {
document.body.style.overflow = "visible";
}
});// Infinite bounce animation
const bounceTimeline = gsap.timeline({
repeat: -1,
yoyo: true
});
bounceTimeline.to(scrollIndicator, {
y: 20,
opacity: 0.6,
duration: 0.8,
ease: "power1.inOut"
});const tl = gsap.timeline({
scrollTrigger: {
trigger: ".container",
scrub: 2, // Smooth scrubbing
pin: true, // Pin section
start: "top top",
end: "+=2000" // 2000px scroll distance
}
});
// Sequence of animations
tl.set(".hero-main-container", { scale: 1.25 })
.to(".hero-main-container", { scale: 1, duration: 1 })
.to(".hero-main-logo", { opacity: 0, duration: 0.5 }, "<")
.to(".hero-main-image", { opacity: 0, duration: 0.9 }, "<+=0.5")
.to(".hero-main-container", { backgroundSize: "28vh", duration: 1.5 }, "<+=0.2");// Gradient animation from far to close
tl.fromTo(".hero-text",
{
// Initial: gradient center at 200vh (far)
backgroundImage: `radial-gradient(
circle at 50% 200vh,
rgba(255, 214, 135, 0) 0,
rgba(157, 47, 106, 0.5) 90vh,
rgba(157, 47, 106, 0.8) 120vh,
rgba(32, 31, 66, 0) 150vh
)`
},
{
// Final: gradient center at 3.9vh (close)
backgroundImage: `radial-gradient(
circle at 50% 3.9575vh,
rgb(255, 213, 133) 0vh,
rgb(247, 77, 82) 50.011vh,
rgb(145, 42, 105) 90.0183vh,
rgba(32, 31, 66, 0) 140.599vh
)`,
duration: 3
},
"<1.2" // Start 1.2s before previous animation
);tl.fromTo(".hero-text-logo",
{
opacity: 0,
maskImage: `radial-gradient(
circle at 50% 145.835%,
rgb(0, 0, 0) 36.11%,
rgba(0, 0, 0, 0) 68.055%
)`
},
{
opacity: 1,
maskImage: `radial-gradient(
circle at 50% 105.594%,
rgb(0, 0, 0) 62.9372%,
rgba(0, 0, 0, 0) 81.4686%
)`,
duration: 3
},
"<0.2"
);// Hide hero, show content
tl.set(".hero-1-container", { opacity: 0 });
tl.set(".hero-2-container", { visibility: "visible" });
// Fade in Vice City content
tl.to(".hero-2-container", {
opacity: 1,
duration: 3
}, "<+=0.2");
// Animate content background gradient
tl.fromTo(".hero-2-container", {...}, {...}, "<1.2");function App() {
const [showContent, setShowContent] = useState(false);
useGSAP(() => {
const tl = gsap.timeline();
// Animation code...
});
return (
<div className="svg" style={svgContainerStyle}>
<svg viewBox="0 0 800 600">
<defs>
<mask id="viMask">
<rect width="100%" height="100%" fill="black" />
<g className="vi-mask-group">
<text x="50%" y="50%" fontSize="250">VI</text>
</g>
</mask>
</defs>
<image href="./gta_hero.webp" mask="url(#viMask)" />
</svg>
</div>
);
}<body>
<div class="container">
<!-- Black overlay -->
<div class="overlay"></div>
<!-- Hero section with logo and image -->
<div class="hero-1-container">
<div class="hero-main-container">
<img class="hero-main-logo" src="/gta_logo_cut.webp" />
<img class="hero-main-image" src="/gta_hero.webp" />
</div>
<!-- Text and purple logo -->
<div class="hero-text-logo-container">
<div class="hero-text-logo"></div>
<h3 class="hero-text">Coming<br/>May 26<br/>2026</h3>
</div>
</div>
<!-- Story content section -->
<div class="hero-2-container">
<h3>Vice City, USA.</h3>
<p>Jason and Lucia have always known...</p>
</div>
<!-- Scroll indicator -->
<div class="scroll-indicator">
<svg>...</svg>
</div>
</div>
<div id="root"></div>
</body>/* Hero container with background pattern */
.hero-main-container {
background-image: url("/public/logo_white.svg");
background-size: 1000vh; /* Scales to 28vh via GSAP */
background-position: 50% 41.7%;
transform: scale(1.25); /* Initial scale */
}
/* Purple logo reveal */
.hero-text-logo {
background-image: url("/gta_logo_purple.webp");
background-size: 28vh;
opacity: 0; /* Animated via GSAP */
}
/* Gradient text */
.hero-text {
background-image: radial-gradient(...);
-webkit-text-fill-color: transparent;
background-clip: text;
}# Install Vercel CLI
npm install -g vercel
# Deploy
vercel
# Production deployment
vercel --prod# Build the project
npm run build
# Deploy dist folder via Netlify CLI
npm install -g netlify-cli
netlify deploy --prod --dir=dist# Install gh-pages
npm install -D gh-pages
# Add to package.json scripts:
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d dist"
}
# Deploy
npm run deploy- Asset Paths: Ensure public folder assets are correctly referenced
- Base URL: Update
vite.config.jsfor GitHub Pages:export default { base: '/GTA-VI-Website/' }
- GSAP CDN: CDN links in index.html work in production
- Image Optimization: Consider compressing images for faster load
// 1. Animation cleanup
onUpdate: function() {
if (this.progress() >= 0.9) {
document.querySelector(".svg").remove();
this.kill(); // Kill timeline to free memory
}
}
// 2. Smooth scrolling with scrub
scrollTrigger: {
scrub: 2 // 2-second smooth scrub
}
// 3. Hardware acceleration
transform: scale(1.25) // Uses GPU acceleration
// 4. Lazy loading ready
// Can add lazy loading for images if needed- First Contentful Paint: < 1.5s
- Animation Frame Rate: 60fps
- Bundle Size: < 500KB (with optimizations)
- Lighthouse Score: 90+
Contributions are welcome! Here's how you can help:
- Add more scroll sections
- Implement 3D effects with Three.js
- Add sound effects on animations
- Create mobile-optimized animations
- Add loading progress bar
- Implement smooth locomotive scrolling
- Add particle effects
- Create character showcase section
- Add trailer video integration
- Implement Easter eggs
- Fork the repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open Pull Request
- โ Chrome 90+
- โ Firefox 88+
- โ Safari 14+
- โ Edge 90+
- โ Opera 76+
Note: GSAP and modern CSS features require modern browsers.
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2024 Tigmanshu Kumar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software")...
This is a fan-made project created for educational purposes and portfolio demonstration. All GTA VI trademarks, logos, and game assets belong to Rockstar Games and Take-Two Interactive. This project is not affiliated with, endorsed by, or connected to Rockstar Games or Take-Two Interactive.
The images and logos used are for demonstration purposes only. If you're the copyright owner and want any content removed, please contact me.
Developer: Tigmanshu Kumar
Email: tigmanshukumar5@gmail.com
LinkedIn: Connect with me
GitHub: @Tigmanshukumar
- ๐ Bug Reports: Create an issue
- ๐ก Feature Ideas: Start a discussion
- ๐จ Animation Feedback: Share your thoughts via email
- ๐ค Collaboration: Open to frontend projects and GSAP work
โญ If this project inspires your web animations, give it a star!
Made with โค๏ธ and GSAP by Tigmanshu Kumar
๐ฎ "Where code meets cinema"
- Rockstar Games: For the incredible GTA franchise
- GSAP Team: For the powerful animation library
- React Team: For the modern UI framework
- Vite Team: For the blazing-fast build tool
- GTA VI Trailer: Original inspiration from official content
- GSAP Community for animation inspiration
- Web animation enthusiasts sharing knowledge
- All contributors and star-gazers
- Rockstar for creating such iconic games

