--- name: create-page description: Cuando necesites crear una nueva página (ruta) en la app Next.js. Incluye page.tsx, loading.tsx, error.tsx y opcionalmente layout.tsx. --- # Skill: Create Page ## Estructura de archivos por ruta Cada ruta nueva DEBE crear estos archivos: ``` src/app/(dashboard)/[...ruta]/ ├── page.tsx # Server Component async (OBLIGATORIO) ├── loading.tsx # Skeleton de carga (OBLIGATORIO) ├── error.tsx # Error boundary (OBLIGATORIO) └── layout.tsx # Solo si la ruta necesita contexto compartido (OPCIONAL) ``` ## Plantilla page.tsx (Server Component) ```tsx import { dehydrate, HydrationBoundary, QueryClient } from '@tanstack/react-query'; import { createServerClient } from '@/lib/supabase/server'; import { queryKeys } from '@/lib/query/keys'; import { NombreView } from '@/components/nombre/NombreView'; import type { Metadata } from 'next'; export async function generateMetadata({ params }): Promise { return { title: 'Título | Kiyoko AI' }; } export default async function NombrePage({ params, }: { params: Promise<{ shortId: string }>; }) { const { shortId } = await params; const supabase = await createServerClient(); const queryClient = new QueryClient(); await queryClient.prefetchQuery({ queryKey: queryKeys.recurso.detail(shortId), queryFn: async () => { const { data, error } = await supabase.from('tabla').select('*').eq('short_id', shortId).single(); if (error) throw error; return data; }, }); return ( ); } ``` ## Plantilla loading.tsx ```tsx export default function NombreLoading() { return (
{Array.from({ length: 6 }).map((_, i) => (
))}
); } ``` ## Plantilla error.tsx ```tsx 'use client'; export default function NombreError({ error, reset }: { error: Error; reset: () => void }) { return (

Error al cargar

{error.message}

); } ``` ## Gotchas - `params` en Next.js 15 es una `Promise`. Siempre hacer `const { shortId } = await params;` - El `QueryClient` en page.tsx se crea nuevo cada vez (server). No reutilizar. - NUNCA importar componentes con `"use client"` que usen hooks de browser en page.tsx directamente. Envolver en ``.