bigbullui logobigbullui
Componentmedia

Rsvp Card

Invitation RSVP card with attending toggle and wax stamp.

Preview

Live Preview
Premium Headphones
25%

Premium Headphones

$299$399

Jordan Daisy

Product Designer

AvailableRemote
The Future of Design Systems

The Future of Design Systems

Alex Rivera8 min read
Oc
t 14

Tech Conference 2026

21:00
Berlin Arena
Invoice #INV-2026-0987draft
Date: 2026-09-15Due: 2026-10-15
ItemQtyPrice
Design Services1$150
Development Hours5$100
SubtotalNaN
Tax (10%)NaN
TotalNaN
THERMAL RECEIPT#I0C9KN
Design Consultation$150
Development Hours$200
Total$385.00
Thank you for your purchase!
Premium Headphones
1
Phone Case
2
Subtotal$377.00
Tax$30.16
Total$407.16
Color
Size
Order #102938Processing
Design Services1x
Development5x
VIP

LOYALTY TIER

$100

Jordan Daisy

Happy Birthday!

J

Jordan Daisy

Product Designer

UX

Badge: EMP-8942

Wedding Reception

Please confirm your attendance

Installation

Tokens guide →

Add to your project via CLI (zero dependencies, code you own):

npx bigbullui add rsvp-card

Or install the full npm package:

npm install bigbullui

Usage

import { RsvpCard } from "@/components/ui/rsvp-card";

<RsvpCard />

Source code

rsvp-card.tsx

Zero dependencies (only React + utils). Copy and paste directly into your project:

"use client";

import * as React from "react";
import { cn } from "./lib/utils";

export interface RsvpCardProps {
  eventTitle: string;
  attending?: boolean;
  onToggle?: (attending: boolean) => void;
  className?: string;
}

const CheckEnter = "rsvp-check-enter";
const FadeIn = "rsvp-fade-in";

export function RsvpCard({
  eventTitle,
  attending = false,
  onToggle,
  className,
}: RsvpCardProps) {
  return (
    <div
      className={cn(
        "rounded-lg border border-foreground bg-card text-card-foreground p-6 transition-all duration-300 hover:translate-y-1 hover:shadow-lg motion-reduce:transition-none motion-reduce:translate-y-0 motion-reduce:shadow-none",
        className
      )}
    >
      <div className="flex items-start gap-4">
        {/* Checkmark / toggle */}
        <button
          onClick={() => onToggle?.(!attending)}
          className={cn(
            "flex size-8 rounded-full border-2 border-dashed border-border items-center justify-center cursor-pointer transition-colors duration-150",
            attending && "bg-accent text-accent",
            !attending && "hover:bg-accent hover:text-accent-foreground",
            CheckEnter
          )}
        >
          {attending ? (
            <svg width="1em" height="1em" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
              <path d="M9 16l6-6l6 6l-1.41-1.41L11 13.17l4.29-4.31L15 9l-6-6-6 6z" />
            </svg>
          ) : (
            <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" aria-hidden="true">
              <rect x="3" y="3" width="18" height="18" rx="2" ry="2" />
              <path d="M9 9V9m9 0h2" />
            </svg>
          )}
        </button>

        {/* Event info */}
        <div className="flex-1">
          <h3 className="font-medium line-clamp-1">{eventTitle}</h3>
          <p className="text-sm text-muted-foreground line-clamp-1 mt-1">
            Please confirm your attendance
          </p>
        </div>
      </div>
    </div>
  );
}

Props

PropTypeDescription
eventTitlestringEvent name (required).
attendingbooleanControlled RSVP state.
onToggle(attending: boolean) => voidRSVP toggle callback.