Skip to content

mddiosc/pokemon-static

Repository files navigation

🚀 Pokémon Static - Next.js SSG Application

Next.js React TypeScript NextUI Tailwind CSS

A modern, high-performance Pokémon encyclopedia built with Next.js Static Site Generation (SSG) strategy, featuring a beautiful dark theme and responsive design.

📖 Table of Contents


🇺🇸 English Documentation

🌟 Overview

This project is a Static Site Generation (SSG) application built with Next.js that showcases the first 151 Pokémon from the PokéAPI. The application leverages Next.js's powerful SSG capabilities to pre-generate all pages at build time, ensuring optimal performance and SEO.

🎯 Key Features

  • ⚡ Static Site Generation (SSG): All pages are pre-rendered at build time
  • 🔄 Incremental Static Regeneration (ISR): Pages auto-update with fresh data
  • 🌙 Dark Theme: Beautiful dark UI with NextUI v2 components
  • 📱 Responsive Design: Optimized for all device sizes
  • ⭐ Favorites System: Local storage-based favorites with persistence
  • 🎊 Interactive Effects: Confetti animations and smooth transitions
  • 🖼️ Optimized Images: Next.js Image component with automatic optimization
  • 🔍 SEO Optimized: Meta tags and structured data for search engines

🏗️ Architecture & SSG Strategy

Next.js SSG Implementation

This project implements a comprehensive SSG strategy using multiple Next.js features:

  1. Static Generation with getStaticProps:

    export const getStaticProps: GetStaticProps = async ({ params }) => {
      const pokemon = await getPokemonInfo(id);
      return {
        props: { pokemon },
        revalidate: 86400, // ISR: Regenerate every 24 hours
      };
    };
  2. Dynamic Static Generation with getStaticPaths:

    export const getStaticPaths: GetStaticPaths = async () => {
      const pokemons151 = [...Array(151)].map((_, index) => `${index + 1}`);
      return {
        paths: pokemons151.map((id) => ({ params: { id } })),
        fallback: 'blocking', // Generate new pages on-demand
      };
    };

Build-Time Generation

  • Home Page: Pre-rendered with the first 151 Pokémon
  • Individual Pokémon Pages: 151 pages generated at build time (/pokemon/[id])
  • Name-based Routes: 151 pages generated for name-based access (/name/[name])
  • Favorites Page: Statically generated with dynamic content loading

Performance Benefits

  • Lightning Fast Loading: Pages served as static HTML
  • Excellent SEO: Pre-rendered content is crawlable by search engines
  • CDN-Friendly: Static files can be cached globally
  • Reduced Server Load: No server-side rendering required
  • Offline Capability: Static content works without internet

🛠️ Technology Stack

Core Framework

  • Next.js 14.2.14: React framework with SSG capabilities
  • React 18.3.1: Latest React with concurrent features
  • TypeScript 5.6.2: Type-safe development

UI & Styling

  • NextUI 2.4.8: Modern React component library
  • Tailwind CSS 3.4.13: Utility-first CSS framework
  • Framer Motion 11.11.17: Animation library for NextUI
  • next-themes 0.3.0: Theme management

Development Tools

  • Volta: Node.js version management
  • ESLint: Code linting
  • PostCSS: CSS processing
  • Autoprefixer: CSS vendor prefixes

🚀 Getting Started

Prerequisites

  • Node.js 20.11.1 (managed with Volta)
  • Yarn 1.22.22

Installation

  1. Clone the repository:

    git clone <repository-url>
    cd pokemon-static
  2. Install dependencies:

    yarn install
  3. Run development server:

    yarn dev
  4. Build for production:

    yarn build
  5. Start production server:

    yarn start

📁 Project Structure

pokemon-static/
├── 📂 api/                 # API utilities and PokéAPI integration
├── 📂 components/          # React components
│   ├── 📂 layouts/         # Layout components
│   ├── 📂 pokemon/         # Pokémon-specific components
│   └── 📂 ui/             # Generic UI components
├── 📂 interfaces/          # TypeScript type definitions
├── 📂 pages/              # Next.js pages (routes)
│   ├── 📂 name/           # Dynamic name-based routes
│   ├── 📂 pokemon/        # Dynamic ID-based routes
│   └── 📂 favorites/      # Favorites page
├── 📂 public/             # Static assets
├── 📂 styles/             # Global styles and CSS
├── 📂 themes/             # Theme configurations
└── 📂 utils/              # Utility functions

🔄 Data Flow & SSG Process

  1. Build Time:

    • Fetch Pokémon data from PokéAPI
    • Generate 151 individual Pokémon pages
    • Create static HTML, CSS, and JSON files
    • Optimize images and assets
  2. Runtime:

    • Serve pre-generated static files
    • Client-side hydration for interactivity
    • Local storage management for favorites
    • Dynamic content updates via ISR

📊 Performance Metrics

  • Build Time: ~24 seconds for 306 pages
  • First Load JS: ~126 kB gzipped
  • Individual Page Size: ~2.16 kB + shared chunks
  • Lighthouse Score: 95+ across all metrics

🎨 UI Components

Pokémon Cards

  • Responsive grid layout
  • Hover effects and transitions
  • Dark theme with gray gradients
  • Next.js Image optimization

Detail Pages

  • Two-column layout (image + details)
  • Sprite gallery with organized grid
  • Favorite toggle with confetti effects
  • Responsive design for mobile

🔧 Configuration Files

  • next.config.js: Next.js configuration with image domains
  • tailwind.config.js: Tailwind CSS with NextUI plugin
  • tsconfig.json: TypeScript configuration for Next.js 14
  • package.json: Dependencies and Volta version pinning

🇪🇸 Documentación en Español

🌟 Descripción General

Este proyecto es una aplicación de Generación de Sitios Estáticos (SSG) construida con Next.js que presenta los primeros 151 Pokémon de la PokéAPI. La aplicación aprovecha las poderosas capacidades SSG de Next.js para pre-generar todas las páginas en tiempo de construcción, asegurando un rendimiento óptimo y SEO.

🎯 Características Principales

  • ⚡ Generación de Sitios Estáticos (SSG): Todas las páginas se pre-renderizan en tiempo de construcción
  • 🔄 Regeneración Estática Incremental (ISR): Las páginas se actualizan automáticamente con datos frescos
  • 🌙 Tema Oscuro: Hermosa interfaz oscura con componentes NextUI v2
  • 📱 Diseño Responsivo: Optimizado para todos los tamaños de dispositivo
  • ⭐ Sistema de Favoritos: Favoritos basados en almacenamiento local con persistencia
  • 🎊 Efectos Interactivos: Animaciones de confetti y transiciones suaves
  • 🖼️ Imágenes Optimizadas: Componente Image de Next.js con optimización automática
  • 🔍 Optimizado para SEO: Meta tags y datos estructurados para motores de búsqueda

🏗️ Arquitectura y Estrategia SSG

Implementación SSG de Next.js

Este proyecto implementa una estrategia SSG integral utilizando múltiples características de Next.js:

  1. Generación Estática con getStaticProps:

    export const getStaticProps: GetStaticProps = async ({ params }) => {
      const pokemon = await getPokemonInfo(id);
      return {
        props: { pokemon },
        revalidate: 86400, // ISR: Regenerar cada 24 horas
      };
    };
  2. Generación Estática Dinámica con getStaticPaths:

    export const getStaticPaths: GetStaticPaths = async () => {
      const pokemons151 = [...Array(151)].map((_, index) => `${index + 1}`);
      return {
        paths: pokemons151.map((id) => ({ params: { id } })),
        fallback: 'blocking', // Generar nuevas páginas bajo demanda
      };
    };

Generación en Tiempo de Construcción

  • Página Principal: Pre-renderizada con los primeros 151 Pokémon
  • Páginas Individuales de Pokémon: 151 páginas generadas en tiempo de construcción (/pokemon/[id])
  • Rutas Basadas en Nombres: 151 páginas generadas para acceso basado en nombres (/name/[name])
  • Página de Favoritos: Generada estáticamente con carga de contenido dinámico

Beneficios de Rendimiento

  • Carga Ultra Rápida: Páginas servidas como HTML estático
  • SEO Excelente: Contenido pre-renderizado es rastreable por motores de búsqueda
  • Compatible con CDN: Archivos estáticos pueden ser cacheados globalmente
  • Carga Reducida del Servidor: No se requiere renderizado del lado del servidor
  • Capacidad Offline: Contenido estático funciona sin internet

🛠️ Stack Tecnológico

Framework Principal

  • Next.js 14.2.14: Framework de React con capacidades SSG
  • React 18.3.1: React más reciente con características concurrentes
  • TypeScript 5.6.2: Desarrollo con tipado seguro

UI y Estilos

  • NextUI 2.4.8: Biblioteca moderna de componentes React
  • Tailwind CSS 3.4.13: Framework CSS utility-first
  • Framer Motion 11.11.17: Biblioteca de animaciones para NextUI
  • next-themes 0.3.0: Gestión de temas

Herramientas de Desarrollo

  • Volta: Gestión de versiones de Node.js
  • ESLint: Linting de código
  • PostCSS: Procesamiento de CSS
  • Autoprefixer: Prefijos de proveedores CSS

🚀 Comenzando

Prerequisitos

  • Node.js 20.11.1 (gestionado con Volta)
  • Yarn 1.22.22

Instalación

  1. Clonar el repositorio:

    git clone <repository-url>
    cd pokemon-static
  2. Instalar dependencias:

    yarn install
  3. Ejecutar servidor de desarrollo:

    yarn dev
  4. Construir para producción:

    yarn build
  5. Iniciar servidor de producción:

    yarn start

📁 Estructura del Proyecto

pokemon-static/
├── 📂 api/                 # Utilidades API e integración PokéAPI
├── 📂 components/          # Componentes React
│   ├── 📂 layouts/         # Componentes de layout
│   ├── 📂 pokemon/         # Componentes específicos de Pokémon
│   └── 📂 ui/             # Componentes UI genéricos
├── 📂 interfaces/          # Definiciones de tipos TypeScript
├── 📂 pages/              # Páginas de Next.js (rutas)
│   ├── 📂 name/           # Rutas dinámicas basadas en nombres
│   ├── 📂 pokemon/        # Rutas dinámicas basadas en ID
│   └── 📂 favorites/      # Página de favoritos
├── 📂 public/             # Assets estáticos
├── 📂 styles/             # Estilos globales y CSS
├── 📂 themes/             # Configuraciones de temas
└── 📂 utils/              # Funciones utilitarias

🔄 Flujo de Datos y Proceso SSG

  1. Tiempo de Construcción:

    • Obtener datos de Pokémon desde PokéAPI
    • Generar 151 páginas individuales de Pokémon
    • Crear archivos estáticos HTML, CSS y JSON
    • Optimizar imágenes y assets
  2. Tiempo de Ejecución:

    • Servir archivos estáticos pre-generados
    • Hidratación del lado del cliente para interactividad
    • Gestión de almacenamiento local para favoritos
    • Actualizaciones de contenido dinámico vía ISR

📊 Métricas de Rendimiento

  • Tiempo de Construcción: ~24 segundos para 306 páginas
  • First Load JS: ~126 kB comprimido
  • Tamaño de Página Individual: ~2.16 kB + chunks compartidos
  • Puntuación Lighthouse: 95+ en todas las métricas

🎨 Componentes UI

Cards de Pokémon

  • Layout de grid responsivo
  • Efectos hover y transiciones
  • Tema oscuro con gradientes grises
  • Optimización de imágenes Next.js

Páginas de Detalle

  • Layout de dos columnas (imagen + detalles)
  • Galería de sprites con grid organizado
  • Toggle de favoritos con efectos de confetti
  • Diseño responsivo para móvil

🔧 Archivos de Configuración

  • next.config.js: Configuración de Next.js con dominios de imagen
  • tailwind.config.js: Tailwind CSS con plugin NextUI
  • tsconfig.json: Configuración TypeScript para Next.js 14
  • package.json: Dependencias y pinning de versiones Volta

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

🙏 Acknowledgments

  • PokéAPI for providing the Pokémon data
  • Next.js team for the amazing framework
  • NextUI for the beautiful component library
  • Tailwind CSS for the utility-first CSS framework

About

Modern Pokémon encyclopedia built with Next.js 14 SSG. Features dark theme, responsive design, and showcases 151 original Pokémon with PokéAPI integration.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors