Tarjeta neobrutalista
Borde grueso, color plano, sello inclinado y sombra dura que se acorta al apuntarla; botón que se hunde al pulsar.
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.
"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.
npx shadcn@latest add https://www.gassierconsulting.com/r/tarjeta-neobrutalEjemplo de uso de Tarjeta neobrutalista
Después de copiar tarjeta-neobrutal.tsx a tu proyecto, impórtalo y colócalo donde lo necesites.
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.
| Propiedad | Tipo | Descripción |
|---|---|---|
title? | string | Opcional. |
text? | string | Opcional. |
tag? | string | Opcional. |
action? | string | Opcional. |
color? | string | Opcional. |
onAction? | () => void | Opcional. |
className? | string | Opcional. |
style? | CSSProperties | Opcional. |
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.
| Variable | Valor 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".