A production-ready landing page with sophisticated animations and interactions, inspired by the Koino website. Built with Next.js 14, Framer Motion, and Tailwind CSS.
- π Smooth Animations: 60fps scroll-triggered animations with Framer Motion
- π± Fully Responsive: Mobile-first design with tablet (810px) and desktop (1200px) breakpoints
- βΏ Accessible: WCAG AA compliant with reduced motion support
- β‘ Performance: Optimized images, fonts, and animations
- π¨ Typography System: Multi-font setup with Inter and Montserrat
- π Dark Mode Ready: CSS variable-based color system
- π₯ Distinctive Design: Avoids generic AI aesthetics with bold, intentional choices
- Node.js 18+
- npm or pnpm
- Navigate to the project directory:
cd koino-landing-page- Install dependencies (if not already done):
npm install- Run the development server:
npm run dev- Open http://localhost:3000 in your browser
npm run build
npm run startkoino-landing-page/
βββ app/
β βββ layout.tsx # Root layout with font configuration
β βββ page.tsx # Home page with all sections
β βββ globals.css # Global styles & CSS variables
βββ components/
β βββ sections/ # Page sections (Hero, Features, etc.)
β β βββ Hero.tsx
β β βββ Features.tsx
β β βββ HowItWorks.tsx
β βββ providers/ # Context providers (MotionProvider)
β β βββ MotionProvider.tsx
β βββ Navigation.tsx # Header with full-screen menu
β βββ Marquee.tsx # Infinite scroll marquee
β βββ FeatureCard.tsx # Animated feature card
β βββ PhoneMockup.tsx # Device mockup component
β βββ AnimatedSection.tsx # Reusable scroll animation wrapper
β βββ Footer.tsx # Footer with link animations
βββ hooks/
β βββ useScrollAnimation.ts # Custom animation hooks
βββ lib/
β βββ animations.ts # Framer Motion variants library
βββ public/
β βββ mockups/ # Phone mockup screenshots
βββ tailwind.config.ts # Tailwind configuration
βββ next.config.js # Next.js configuration
All animations use Framer Motion variants defined in /lib/animations.ts:
fadeInUp- Fade in from bottom (sections)fadeInLeft/Right- Horizontal slide-insscaleIn- Scale + fade (cards)staggerContainer- Sequential child animationsheadlineReveal- Hero text animationmenuOverlay- Full-screen menu slidemenuItem- Menu item stagger
import { fadeInUp } from '@/lib/animations'
<motion.div
variants={fadeInUp}
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.3 }}
>
Your content
</motion.div>The project uses a token-based color system defined in CSS variables:
- Purple: Brand accent colors (
koino-purple-50tokoino-purple-900) - Blue: Secondary accents (
koino-blue-50,koino-blue-500,koino-blue-600) - Neutral: Grayscale palette (
koino-neutral-0tokoino-neutral-900)
Edit colors in /app/globals.css:
:root {
--koino-purple-500: 139 92 246;
--koino-blue-500: 59 130 246;
/* Add more colors */
}- Sans: Inter (primary body text)
- Display: Montserrat (headings, bold text)
Display font sizes:
display-xl: 7rem (hero headlines)display-lg: 5rem (section headlines)display-md: 3.5rem (subsection headlines)display-sm: 2.5rem (card headlines)
- Mobile: < 810px
- Tablet: 810px - 1199px
- Desktop: 1200px+
- All animations use
transformandopacityonly (GPU-accelerated) - Images optimized with Next.js Image component (AVIF/WebP)
- Fonts loaded with
next/font(automatic optimization) - Viewport triggers set to
once: true(animate once) - Bundle optimized with SWC minification
- Respects
prefers-reduced-motion - ARIA labels on all interactive elements
- Keyboard navigation support (Tab, Escape)
- Focus indicators on all focusable elements
- Color contrast meets WCAG AA standards (4.5:1 minimum)
Fixed header with hamburger menu that opens full-screen overlay. Menu items animate with stagger effect.
Hero section with dramatic headline reveal, gradient background, and animated CTAs.
Infinite horizontal scrolling text with seamless looping.
Grid of feature cards with hover lift effects and icon animations.
Three-step process with alternating layout and phone mockups.
Footer with animated link underlines and social icons.
- Create component in
components/sections/ - Import in
app/page.tsx - Add between existing sections
Edit timing/easing in /lib/animations.ts:
export const fadeInUp: Variants = {
hidden: { opacity: 0, y: 60 },
visible: {
opacity: 1,
y: 0,
transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] }
}
}Update CSS variables in /app/globals.css and Tailwind config in /tailwind.config.ts.
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile Safari (iOS 14+)
- Chrome Mobile (Android 10+)
npm i -g vercel
vercel login
vercel --prodBuild the static site:
npm run buildOutput will be in .next/ directory. Deploy to any static hosting provider.
MIT
Built with:
Development Notes:
- The server is currently running at http://localhost:3000
- Phone mockups use placeholder gradients (add actual screenshots to
/public/mockups/) - All animations are optimized for 60fps performance
- Reduced motion is fully supported for accessibility