shadimage
asanshay
componentcardsource: ok · hit

Card

A variety of clean cards, from minimal to flashy.

npx shadcn add "https://ds.asanshay.com/r/card.json"
free

Visual style

minimal

Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.

Dependencies

Bundle weight · light
class-variance-authority

Files1 · source cached 10/9/2026, 4:39:12 PM

registry/new-york/blocks/card/card.tsx
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const cardVariants = cva("text-card-foreground rounded-2xl p-6 flex flex-col gap-2", {
  variants: {
    variant: {
      default: "bg-card border border-border shadow-md shadow-shade",
      raised: "bg-card border border-border shadow-xl shadow-shade -translate-y-0.5",
      flat: "bg-muted",
      outline: "border border-border",
      fancy_light:
        "border border-primary/30 bg-transparent bg-radial-[at_70%_25%] from-transparent to-primary/20 shadow-lg inset-shadow-sm shadow-shade inset-shadow-white/80 transition-all duration-200 hover:bg-primary/10",
      double:
        "border border-border shadow-md shadow-shade relative bg-secondary/30 backdrop-blur-sm",
    },
  },
  defaultVariants: {
    variant: "default",
  },
});

export interface CardProps
  extends React.HTMLAttributes<HTMLDivElement>,
    VariantProps<typeof cardVariants> {}

const Card = React.forwardRef<HTMLDivElement, CardProps>(({ className, variant, ...props }, ref) =>
  variant === "double" ? (
    <div className={cn(cardVariants({ variant, className }))}>
      <div
        ref={ref}
        className=" absolute inset-2 p-4 border border-border rounded-lg bg-card shadow-lg shadow-shade flex flex-col gap-2"
        {...props}
      />
    </div>
  ) : (
    <div ref={ref} className={cn(cardVariants({ variant, className }))} {...props} />
  )
);
Card.displayName = "Card";

const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
  ({ className, ...props }, ref) => (
    <div ref={ref} className={cn("flex flex-col gap-1.5 place-self-start", className)} {...props} />
  )
);
CardHeader.displayName = "CardHeader";

const CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
  ({ className, ...props }, ref) => (
    <div
      ref={ref}
      className={cn("font-medium text-2xl leading-none tracking-tight font-heading", className)}
      {...props}
    />
  )
);
CardTitle.displayName = "CardTitle";

const CardDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
  ({ className, ...props }, ref) => (
    <div ref={ref} className={cn("text-muted-foreground", className)} {...props} />
  )
);
CardDescription.displayName = "CardDescription";

const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
  ({ className, ...props }, ref) => (
    <div ref={ref} className={cn("flex items-center gap-2 place-self-end", className)} {...props} />
  )
);
CardFooter.displayName = "CardFooter";

export { Card, CardHeader, CardFooter, CardTitle, CardDescription };

More from asanshay

Browse all components in this library →