shadimage
turbopills-ui
blockbefore-after-cardsource: ok · hit

Before / After Card

A before/after image card with a footer badge.

npx shadcn add "https://ui.turbopills.com/r/before-after-card.json"
free

Where it goes

footer

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

Dependencies

Bundle weight · light
iconslucide-react

Registry dependencies

badge

Files1 · source cached 10/9/2026, 1:58:17 PM

registry/turbopills/blocks/before-after-card/before-after-card.tsx
"use client";

import * as React from "react";
import Image from "next/image";
import { Check } from "lucide-react";

import { cn } from "@/lib/utils";
import { Badge } from "@/components/ui/badge";

export interface BeforeAfterCardProps {
  name: string;
  beforeImage?: string;
  afterImage?: string;
  className?: string;
  badgeContent?: React.ReactNode;
}

export function BeforeAfterCard({
  name,
  beforeImage,
  afterImage,
  className,
  badgeContent = (
    <>
      <Check className="size-4" />
      <span>Lost 28 lbs</span>
    </>
  ),
}: BeforeAfterCardProps) {
  return (
    <div
      className={cn(
        "w-90 h-89 flex flex-col rounded-xl overflow-hidden border border-border bg-card",
        className,
      )}
    >
      <div className="flex items-stretch gap-px flex-1 min-h-0">
        <div className="flex-1 relative">
          {beforeImage ? (
            <Image
              src={beforeImage}
              alt="Before"
              fill
              className="w-full h-full object-cover rounded-tl-xl"
            />
          ) : (
            <div className="w-full h-full rounded-tl-xl bg-chart-4" />
          )}

          <div className="absolute left-3 bottom-3">
            <Badge variant="default" className="bg-chart-2">
              Before
            </Badge>
          </div>
        </div>

        <div className="flex-1 relative">
          {afterImage ? (
            <Image
              src={afterImage}
              alt="After"
              fill
              className="w-full h-full object-cover rounded-tr-xl"
            />
          ) : (
            <div className="w-full h-full rounded-tr-xl bg-chart-2" />
          )}

          <div className="absolute left-3 bottom-3">
            <Badge variant="default" className="bg-chart-4">
              After
            </Badge>
          </div>
        </div>
      </div>

      <div className="p-4 flex items-center justify-between shrink-0">
        <span className="font-semibold text-lg">{name}</span>

        {badgeContent && (
          <Badge variant="default" className="gap-1 text-base">
            {badgeContent}
          </Badge>
        )}
      </div>
    </div>
  );
}

More from turbopills-ui

Browse all components in this library →