Ir al contenido

Copy y tono

Todo texto que ve un usuario tiene reglas firmes.

  1. Tú-form, no usted-form. Cercano y directo. “Tu publicación”, “puedes editarla”, “tienes 3 disputas”.
  2. Sin emojis en UI core. Aceptable en marketing puntual o emails de bienvenida; no en errores, confirmaciones, ni admin.
  • Web — todo lo que el usuario ve en pantalla: títulos, descripciones, placeholders, helper text, errores de validación, empty states.
  • Toasts — éxito, error, info, warning.
  • Emails — bienvenida, confirmación de orden, dispute, password reset.
  • Admin — sí, también la UI de admin. Si Yoel u otro admin la lee, sigue las reglas.
ContextoTonoEjemplo
Marketing / heroEntusiasta, breve”Encuentra cartas TCG en Chile.”
Acción / CTAImperativo claro”Publica una carta”, “Agrega al carrito”
ConfirmaciónCalmado, neutro”Tu publicación está activa.”
ErrorHonesto, sin culpa al usuario”No pudimos cargar las cartas. Inténtalo de nuevo.”
Empty stateSugerente, propositivo”Aún nadie vende esta carta. Sé el primero.”
AdminFuncional, breve”Eliminar listing” (no “¿Estás 100% seguro?”)
ConceptoCómo lo decimos
Botón comprar”Comprar ahora” / “Agregar al carrito”
Botón vender”Vender esta carta” / “Publicar”
Estado vacío de listings”Aún nadie vende esta carta.”
Sin resultados de búsqueda”No encontramos cartas con ese nombre.”
Confirmación de orden”Tu compra está confirmada.”
Eliminar (destructivo)“Eliminar” + AlertDialog con “Esta acción no se puede deshacer.”
Sesión expirada”Tu sesión expiró. Vuelve a iniciar sesión.”
Cargando”Cargando…” (sin gerundios largos)
Loading skeletonsin texto, solo skeleton visual

Patrón: explicar qué pasó + qué puede hacer el usuario.

❌ Mal: “Error 500” / “Algo salió mal” / “Operación fallida”.

✅ Bien:

  • “No pudimos publicar tu carta. Revisa la conexión e inténtalo de nuevo.”
  • “Esa carta ya no está disponible. Otro comprador la tomó.”
  • “Tu pago no se pudo procesar. Mercado Pago devolvió el dinero a tu medio de pago.”

Nunca culpar al usuario. Decir “no pudimos” en lugar de “no proporcionaste correctamente”.

  • Mensaje al lado del campo, no en alert.
  • Imperativo amable: “Ingresa un email válido.” (no “Email inválido” — frío).
  • Si el campo está bien, sin mensaje (no celebrar lo correcto).

Formato chileno: $12.500 (punto como separador de miles, sin centavos, signo $ pegado).

Usar formatPriceCents(cents) de src/lib/format.ts. Nunca formatear manualmente en JSX.

Formato relativo en UI principal, absoluto en detalle:

  • Listings activos / órdenes recientes → “hace 2 días”, “hace 3 horas”.
  • Historial / admin → fecha absoluta con Intl.DateTimeFormat('es-CL', ...).

Usar ClientDateText para fechas relativas en cliente (evita hydration mismatch).

Manejar singular/plural explícitamente. No usar “(s)” ni “1 carta(s)”.

const text = count === 1 ? '1 carta' : `${count} cartas`;

Cuando hablamos de “cartas”, aplica a todos los TCGs. No decir “tu colección Pokémon” si la página es multi-TCG. Ver Multi-TCG para detalles.

Mismas reglas aplican. Adicional:

  • Saludo: “Hola, [nombre]” (no “Estimado/a”).
  • Despedida: ”— El equipo de tcgcards” (sin “Atte.”).
  • Sin emojis salvo en bienvenida.
  • Acción principal como botón, no como link enterrado en el texto.

Para gestión técnica de emails ver Email setup y la memoria del proyecto sobre Cloudflare Routing + Resend.