A modern Awwwards-inspired interactive website featuring smooth GSAP animations, creative UI interactions, immersive motion design, and experimental layouts, built to showcase premium frontend experiences similar to SOTD-level digital projects.
A highly interactive, visually stunning recreation of the Truus.co website, rebuilt as a Next.js + React application. This project captures the bold aesthetics, playful interactivity, and smooth motion design characteristic of Awwward-winning websites โ with every pixel and every frame of animation faithfully recreated.
| Header Section |
HorizontalWords Section |
| MotionCard Section |
Service Card Section |
| Double Marquee Section |
Footer Section |
This project is a high-fidelity clone of the Truus advertising agency website. The codebase was originally built in vanilla HTML/CSS/JS and has been fully transformed to Next.js 15 + React 19, with all animations, interactions, and assets ported 1:1.
The original Truus.co website uses a privately-hosted Vimeo video. Due to Vimeoโs Domain-Level Privacy Settings, the video is restricted to the truus.co domain. The hero component uses a standard HTML5 <video> element with the src commented out, rendering a solid dark background. Place your .mp4 in public/ and update the source in VimeoHero.jsx.
mouseleave they fling with physics-based inertia and snap back to position.stroke-dasharray as the user scrolls past.WIGGLE_CONFIG object."Hey, over here! ๐" when the tab loses focus.globals.css entry point.lib/data.js.| Technology | Purpose |
|---|---|
| Next.js 15 | React framework, App Router, file-based routing |
| React 19 | Component-based UI architecture |
| Vanilla CSS | Full design system via CSS Variables โ zero Tailwind |
| GSAP + ScrollTrigger + InertiaPlugin | All animations, scroll-driven effects, physics-based fling |
| Lenis | Ultra-smooth inertia scrolling |
truus/
โโโ app/
โ โโโ styles/ # Modular CSS partials
โ โ โโโ base.css # Fonts, CSS variables, reset, body/html
โ โ โโโ navbar.css # Navbar, logos, header hero
โ โ โโโ hero.css # Content section title + underline SVG
โ โ โโโ vimeo-hero.css # Vimeo hero video player + headline
โ โ โโโ motion-cards.css # MotionCard section (heading + cards + labels)
โ โ โโโ showreel.css # Showreel section placeholder
โ โ โโโ cards.css # Service cards, stickers
โ โ โโโ marquee.css # Double marquee section + animations
โ โ โโโ footer.css # Footer layout, credits, stickers
โ โ โโโ cursor.css # Custom cursor bubble + scribble overlay
โ โ โโโ horizontal-words.css # Horizontal scrolling section styles
โ โ โโโ responsive.css # All media queries (tablet + mobile)
โ โโโ globals.css # Entry point โ imports all partials
โ โโโ layout.jsx # Root layout โ <html>, metadata, favicon
โ โโโ page.jsx # Main page โ assembles all components
โ
โโโ components/
โ โโโ CursorBubble.jsx # Custom "click" cursor bubble with GSAP tracking
โ โโโ DoubleMarquee.jsx # Randomised logo marquee + scroll-triggered SVGs
โ โโโ Footer.jsx # Footer โ credits, stickers, socials, wiggles
โ โโโ HorizontalWords.jsx # Pinned section with elastic letter bounce
โ โโโ MotionCards.jsx # Motion cards + floating labels + InertiaPlugin fling
โ โโโ Navbar.jsx # Fixed navbar + scroll color logic + logo wiggle
โ โโโ ServiceCards.jsx # "Call us if you need" + 5 service cards
โ โโโ Showreel.jsx # Showreel section placeholder (coming soon)
โ โโโ SmoothScroll.jsx # Lenis init + GSAP ticker sync (renders null)
โ โโโ SvgSymbols.jsx # Hidden SVG <symbol> defs (bullet, card divider)
โ โโโ TransitionScribble.jsx # Full-screen scribble mask on logo click
โ โโโ VimeoHero.jsx # Video hero โ controls, mute bubble, headline
โ
โโโ lib/
โ โโโ data.js # All static data as ES module exports
โ
โโโ public/
โ โโโ assets/
โ โ โโโ Brand Logos SVG/ # 8 self-hosted marquee brand logos
โ โ โโโ Card-Sticker SVG/ # Stickers overlaying service cards
โ โ โโโ Cursor SVG/ # Custom cursor SVG states
โ โ โโโ Footer-Sticker SVG/ # 6 decorative footer stickers
โ โ โโโ Marquee-blob SVG/ # Blob + hand in marquee section
โ โ โโโ MotionCard SVG/ # Motion card blob + underline
โ โ โโโ Navbar SVG/ # Navbar blob + work icon
โ โ โโโ VimeoHero SVG/ # Smiley, star, oval underline, mute blob
โ โโโ fonts/
โ โโโ DMSans-VariableFont_opsz,wght.ttf
โ โโโ Epilogue-VariableFont_wght.ttf
โ
โโโ .gitignore
โโโ jsconfig.json # @/ import alias configuration
โโโ next.config.mjs # Next.js config with webpack @/ alias
โโโ package.json
โโโ README.md
| Animation | Component | Type |
|---|---|---|
| Inertia fling (cards) | MotionCards | GSAP InertiaPlugin |
| Inertia fling (labels) | MotionCards | GSAP InertiaPlugin |
| Page transition scribble | TransitionScribble | GSAP Timeline |
| Card fan-out on hover | ServiceCards | GSAP Elastic |
| Mobile card scroll stack | ServiceCards | GSAP ScrollTrigger |
| SVG underline draw | ServiceCards | GSAP stroke animation |
| Marquee infinite scroll | DoubleMarquee | CSS Keyframes |
| Marquee SVG reveal | DoubleMarquee | GSAP ScrollTrigger |
| Sticker scroll pop-up | Footer | GSAP ScrollTrigger + back.out |
| Sticker proximity push | Footer | GSAP Elastic |
| Credits pop-out/collapse | Footer | GSAP Timeline |
| Map link draw | Footer | GSAP stroke animation |
| Cursor bubble follow | CursorBubble | GSAP quickTo |
| Mute bubble follow | VimeoHero | GSAP quickTo |
| Wiggle on hover | Navbar, Footer | GSAP steps(1) yoyo |
| Horizontal scroll & pin | HorizontalWords | GSAP ScrollTrigger |
| Letter & sticker bounce | HorizontalWords | GSAP Elastic (Scroll) |
| SVG arrow draw | HorizontalWords | GSAP stroke animation |
| Lenis smooth scroll | SmoothScroll | Lenis + GSAP ticker |
| Tab title change | SmoothScroll | Visibility API |
lib/data.js โ Centralized DataAll static data lives in lib/data.js as named ES module exports:
| Export | Purpose |
|---|---|
brands[] |
8 brand objects { name, src } pointing to /public/assets/ |
colors[] |
Background colour pool for the marquee |
SOCIAL_ICONS[] |
LinkedIn, Instagram, TikTok โ href + SVG markup |
CARDS_DATA[] |
5 service card definitions with color, sticker, title, services |
WIGGLE_CONFIG |
Single source of truth for all hover-wiggle intensities |
ANIMATION_CONFIG |
Scribble transition timing and stroke width settings |
WIGGLE_CONFIG โ Tune all wiggles from one placeexport const WIGGLE_CONFIG = {
logoTruus: 4, // The navbar Truus logo
socials: 5, // LinkedIn / Instagram / TikTok icons
jobHeading: 1, // "not hiring right now" heading
googleMap: 1, // Google Maps link text
email: 1, // hello@truus.co
whatsapp: 1, // send us a whatsapp
};
Higher number = more rotation (degrees). Set to 0 to disable for any element.
The marquee uses two constraint-aware helpers in components/DoubleMarquee.jsx:
shuffleNoAdjacentSrc(brands) โ Fisher-Yates shuffle + post-processing to ensure no two cards with the same logo appear next to each other, including at the loop seam.assignColorsNoAdjacent(count, colors) โ Assigns background colours one-by-one, always excluding the previous colour (and the first colour on the last item, to fix the seam).All SVGs are handled using one of three strategies:
| Strategy | Used For | Why |
|---|---|---|
External .svg + <img> |
Brand logos, stickers, blobs, decorative shapes | Clean components; best for large, non-reused shapes |
Inline <symbol> + <use> |
Repeated icons (bullet-icon, card-divider) |
Defined once in SvgSymbols.jsx, rendered many times; supports currentColor |
Inline <svg> |
Animated paths (map link draw, control icons) | Required for stroke-dasharray animations and React state-driven rendering |
| Folder | Contents |
|---|---|
Brand Logos SVG/ |
8 marquee brand logos |
Card-Sticker SVG/ |
5 stickers for service cards |
Cursor SVG/ |
Custom cursor states |
Footer-Sticker SVG/ |
6 decorative footer stickers |
Marquee-blob SVG/ |
Blob + pointing hand |
MotionCard SVG/ |
Blue blob + wavy underline |
Navbar SVG/ |
Navbar blob + work icon |
VimeoHero SVG/ |
Smiley face, pink star, oval underline, mute blob |
This project uses Next.js, so you need Node.js installed.
Clone the repository:
git clone https://github.com/Thakuma07/Truus.co-Awwward-Website.git
cd truus
Install dependencies:
npm install
Start the development server:
npm run dev
Open in your browser:
http://localhost:3000
Made with โค๏ธ by Arkyadeep Pal, Soumyakanta Mitra and Anshu Ram, powered by Antigravity AI.
This project is for educational and portfolio purposes. All original brand assets belong to Truus.co.