Ir al contenido

Componentes

Componentes shadcn instalados en src/components/ui/. Estilo radix-nova, base color neutral, CSS variables activas.

ComponenteArchivoUso típico
Buttonbutton.tsxCTA, acciones primarias/secundarias. Variants: default, outline, ghost, link, destructive
Cardcard.tsxContenedor de info (listings, sets, cartas). Header/Content/Footer
Badgebadge.tsxEstados (Activo/Pausado), idiomas, condiciones, kind de listing
Inputinput.tsxCampos de texto, número, email
Textareatextarea.tsxTexto largo (descripción de listing, mensajes en disputas)
Labellabel.tsxLabels accesibles para inputs
Checkboxcheckbox.tsxFiltros (idiomas en /challa), tickboxes en bulk actions
Dialogdialog.tsxModales (BuyOrderModal, confirmaciones)
AlertDialogalert-dialog.tsxConfirmaciones destructivas (eliminar listing)
Sheetsheet.tsxDrawers laterales (filtros móviles, carrito mobile)
DropdownMenudropdown-menu.tsxMenús contextuales (perfil, acciones de admin)
Sonner (Toaster)sonner.tsxToasts. Config: richColors, position="top-center"

Para agregar un componente shadcn nuevo: npx shadcn@latest add <componente>. Respeta el components.json para mantener consistencia de estilo.

Librería única: lucide-react. Importar iconos individualmente:

import { ShoppingCart, Heart, MoreHorizontal } from 'lucide-react';
  • No instalar otras librerías de iconos (Heroicons, Phosphor, etc.).
  • No usar emojis en UI core. Aceptable solo en copy de marketing puntual.
  • Tamaño default: size-4 (16px) o size-5 (20px) en contextos grandes.

Único sistema: Sonner (montado en layout.tsx).

import { toast } from 'sonner';
toast.success('Listing publicado.');
toast.error('No pudimos cargar las cartas.');
toast.info('Tu sesión expira en 5 minutos.');

Reglas:

  • richColors está activo → usar success/error/info/warning para que aplique el color semántico correcto.
  • Posición fija: top-center. No cambiar.
  • Copy: tono español neutro/chileno (ver Copy y tono).

Categorías principales en src/components/:

  • FeaturedListingBlock — bloque destacado en /cards/[id] con el listing de menor precio.
  • SellersList — lista paginada de vendedores con sus precios.
  • RecentSalesCard — últimas ventas para referencia de precio.
  • CardDetailImage — imagen grande de la carta con zoom hover.
  • MobileSellFab — FAB flotante “Vender” visible en mobile. Montado global en layout.tsx.
  • CartAbandonedTracker — track de carritos abandonados (PostHog). Mounted global.
  • BuyOrderModal — modal de compra con resumen + dirección + método de pago.
  • Componentes de grilla de cartas, filtros de set/rareza, paginación.
  • ThemeProvider / ThemeScript / ThemeToggle / useTheme — ver Patrones.
  • JsonLd — wrapper para insertar JSON-LD estructurado.
  • Helpers en src/lib/seo/ para construir Product, Breadcrumb, etc.
  • ShareButton — botón compartir con Web Share API + fallback.

Imports:

import { Button } from '@/components/ui/button';
import { FeaturedListingBlock } from '@/components/marketplace/FeaturedListingBlock';

Usar alias @/ siempre. Configurado en tsconfig.json.

Naming:

  • PascalCase para componentes (FeaturedListingBlock).
  • camelCase para hooks (useTheme, useCart).
  • kebab-case para archivos de shadcn (alert-dialog.tsx) — convención propia de shadcn que respetamos.
  • PascalCase para archivos de componentes propios.

Server vs Client:

  • Default: Server Component.
  • 'use client' solo cuando el componente usa estado, efectos, eventos o hooks de cliente.
  • Patrón SessionProvider + useSession para sesión: leerla en cliente, no en Server Header (ver Patrones).

Algunos componentes tienen test colocado (.test.tsx). No es obligatorio para todo componente, pero sí para lógica con bordes (parseo, formato de fechas, theme switching).

Stack: Vitest + Testing Library. Correr con npm test.