Ir al contenido
Evaluar mi proyecto
Componentes · TarjetasDisponible

Tarjeta neobrutalista

Borde grueso, color plano, sello inclinado y sombra dura que se acorta al apuntarla; botón que se hunde al pulsar.

Nuevo

Lanza tu tienda

Catálogo, pagos y envíos listos en una tarde. Sin cuentas raras.

Código completo

Es exactamente el archivo que se descarga. Cópialo a tu proyecto y úsalo.

tarjeta-neobrutal.tsx48 líneas
Descargar
"use client";

import type { CSSProperties } from "react";

/** Tarjeta neobrutalista: borde grueso, color plano, sello inclinado y sombra dura que se acorta al apuntarla. React + TypeScript, sin dependencias. */
export type TarjetaNeobrutalProps = {
  title?: string;
  text?: string;
  tag?: string;
  action?: string;
  color?: string;
  onAction?: () => void;
  className?: string;
  style?: CSSProperties;
};

const CSS = `
.gctnb-root { box-sizing: border-box; display: block; width: 100%; max-width: 320px; color: #111; font: 600 15px/1.45 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; }
.gctnb-root *, .gctnb-root *::before, .gctnb-root *::after { box-sizing: border-box; }
.gctnb-root button { font: inherit; }
.gctnb-root :focus-visible { outline: 3px solid #2f5bff; outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) { .gctnb-root *, .gctnb-root *::before, .gctnb-root *::after { transition-duration: .01ms !important; } }
.gctnb-card { position: relative; padding: 24px; border: 4px solid #111; background: var(--gctnb-bg, #ff90e8); box-shadow: 8px 8px 0 #111; transition: transform .14s, box-shadow .14s; }
.gctnb-card:hover { transform: translate(4px, 4px); box-shadow: 4px 4px 0 #111; }
.gctnb-tag { position: absolute; top: -18px; right: 16px; padding: 6px 12px; border: 3px solid #111; background: #ffe14d; font-size: 12px; font-weight: 900; letter-spacing: .08em; text-transform: uppercase; transform: rotate(4deg); }
.gctnb-title { margin: 0 0 8px; font-size: 28px; line-height: 1.05; font-weight: 900; letter-spacing: -.03em; text-transform: uppercase; }
.gctnb-text { margin: 0 0 20px; font-weight: 600; }
.gctnb-btn { min-height: 46px; padding: 0 20px; border: 3px solid #111; background: #fff; font-weight: 900; text-transform: uppercase; letter-spacing: .04em; cursor: pointer; box-shadow: 4px 4px 0 #111; transition: transform .1s, box-shadow .1s, background .1s; }
.gctnb-btn:hover { background: #ffe14d; }
.gctnb-btn:active { transform: translate(4px, 4px); box-shadow: 0 0 0 #111; }`;

export function TarjetaNeobrutal({ title = "Lanza tu tienda", text = "Catálogo, pagos y envíos listos en una tarde. Sin cuentas raras.", tag = "Nuevo", action = "Empezar ya", color, onAction, className = "", style }: TarjetaNeobrutalProps) {
  const vars = color ? ({ "--gctnb-bg": color } as CSSProperties) : undefined;
  return (
    <div className={`gctnb-root ${className}`} style={{ ...vars, ...style }}>
      <style>{CSS}</style>
      <article className="gctnb-card">
        <span className="gctnb-tag">{tag}</span>
        <h3 className="gctnb-title">{title}</h3>
        <p className="gctnb-text">{text}</p>
        <button className="gctnb-btn" type="button" onClick={onAction}>
          {action}
        </button>
      </article>
    </div>
  );
}

Úsalo en tu proyecto

Instálalo con la CLI de shadcn.

terminal.sh1 líneas
npx shadcn@latest add https://www.gassierconsulting.com/r/tarjeta-neobrutal

Ejemplo de uso de Tarjeta neobrutalista

Después de copiar tarjeta-neobrutal.tsx a tu proyecto, impórtalo y colócalo donde lo necesites.

ejemplo.tsx5 líneas
import { TarjetaNeobrutal } from "./tarjeta-neobrutal";

export default function Ejemplo() {
  return <TarjetaNeobrutal title="Ejemplo" />;
}

Propiedades de TarjetaNeobrutal

TarjetaNeobrutal acepta 8 propiedades: todas son opcionales y tienen un valor por defecto, así que funciona sin configurar nada.

PropiedadTipoDescripción
title?stringOpcional.
text?stringOpcional.
tag?stringOpcional.
action?stringOpcional.
color?stringOpcional.
onAction?() => voidOpcional.
className?stringOpcional.
style?CSSPropertiesOpcional.

Personaliza Tarjeta neobrutalista con variables CSS

Define estas variables en el contenedor o en tu hoja de estilos para cambiar los colores sin tocar el componente. Si no las defines, se usa el valor por defecto.

VariableValor por defecto
--gctnb-bg#ff90e8

Accesibilidad y rendimiento

El archivo tiene 48 líneas (3 KB) y no necesita @keyframes. Esto es lo que hace Tarjeta neobrutalista por quien lo usa:

  • Detecta prefers-reduced-motion y baja o quita el movimiento cuando la persona lo pide.
  • Muestra un anillo de foco visible al navegar con teclado (:focus-visible).
  • Es un componente de cliente de Next.js: incluye la directiva "use client".
Licencia
MIT
Dependencias
React >=18
Compatibilidad
React 18 y 19 · Next.js (componente de cliente)