Tarjeta neumórfica
Superficie extruida con un pozo hundido para el icono.
Ajustes del hogar
Código completo
Es exactamente el archivo que se descarga. Cópialo a tu proyecto y úsalo.
/**
* Tarjeta neumórfica: una superficie extruida con un pozo hundido para el icono.
* Funciona sobre un fondo del mismo color (#e0e5ec por defecto); para otro, define `--gcc-bg`,
* `--gcc-shadow` y `--gcc-highlight` en un contenedor.
*
* <NeumorphicCard icon={<SettingsIcon />} title="Ajustes">Preferencias de la cuenta</NeumorphicCard>
*/
import type { HTMLAttributes, ReactNode } from "react";
export type NeumorphicCardProps = Omit<HTMLAttributes<HTMLDivElement>, "title"> & {
icon?: ReactNode;
title: ReactNode;
};
const CSS = `
.gcc-card { --gcc-ground: var(--gcc-bg, #e0e5ec); --gcc-dark: var(--gcc-shadow, #a3b1c6); --gcc-light: var(--gcc-highlight, #ffffff); display: grid; gap: 14px; box-sizing: border-box; width: 100%; max-width: 340px; padding: 28px; border-radius: 28px; background: var(--gcc-ground); color: #3b4658; font-family: inherit;
box-shadow: 14px 14px 28px var(--gcc-dark), -14px -14px 28px var(--gcc-light); transition: box-shadow .35s cubic-bezier(.16, 1, .3, 1), transform .35s cubic-bezier(.16, 1, .3, 1); }
.gcc-card:hover { transform: translateY(-3px); box-shadow: 18px 18px 34px var(--gcc-dark), -18px -18px 34px var(--gcc-light); }
.gcc-well { display: grid; width: 60px; height: 60px; place-items: center; border-radius: 20px; color: #4f5bd5; background: var(--gcc-ground); box-shadow: inset 6px 6px 12px var(--gcc-dark), inset -6px -6px 12px var(--gcc-light); }
.gcc-well svg { width: 26px; height: 26px; }
.gcc-title { margin: 6px 0 0; color: #2f3a4c; font-size: 20px; font-weight: 700; letter-spacing: -.01em; }
.gcc-body { margin: 0; color: #5d6b80; font-size: 15px; line-height: 1.6; }
@media (prefers-reduced-motion: reduce) { .gcc-card { transition: none; } .gcc-card:hover { transform: none; } }
`;
export function NeumorphicCard({ icon, title, className, children, ...props }: NeumorphicCardProps) {
return (
<>
<style>{CSS}</style>
<div {...props} className={["gcc-card", className].filter(Boolean).join(" ")}>
{icon ? <span className="gcc-well" aria-hidden="true">{icon}</span> : null}
<h3 className="gcc-title">{title}</h3>
<div className="gcc-body">{children}</div>
</div>
</>
);
}
Úsalo en tu proyecto
Instálalo con la CLI de shadcn.
npx shadcn@latest add https://www.gassierconsulting.com/r/tarjeta-neumorficaEjemplo de uso de Tarjeta neumórfica
Después de copiar neumorphic-card.tsx a tu proyecto, impórtalo y colócalo donde lo necesites.
import { NeumorphicCard } from "./neumorphic-card";
export default function Ejemplo() {
return <NeumorphicCard />;
}Personaliza Tarjeta neumórfica 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 |
|---|---|
--gcc-bg | #e0e5ec |
--gcc-shadow | #a3b1c6 |
--gcc-highlight | #ffffff |
Accesibilidad y rendimiento
El archivo tiene 39 líneas (2 KB) y no necesita @keyframes. Esto es lo que hace Tarjeta neumórfica por quien lo usa:
- Detecta prefers-reduced-motion y baja o quita el movimiento cuando la persona lo pide.
- Expone su estado a tecnologías de apoyo con atributos aria-*.
Acerca del producto
Una tarjeta de relieve suave (neumorfismo) con un pozo hundido para el icono, título y texto. Al pasar el puntero se eleva un poco más.
Incluye
Un solo archivo React + TypeScript, con los estilos dentro. No usa Tailwind ni bibliotecas externas.
- Icono opcional dentro de un pozo hundido
- Título y contenido libres
- Colores y sombras en variables CSS
- Sin JavaScript
Cómo usarlo
Colócala sobre un fondo #e0e5ec o define --gcc-bg, --gcc-shadow y --gcc-highlight para otro fondo.