Docs

Calendar event

Calendar event widget

Installation

Run the following command

It will create a new file called calendar-event.tsx inside the components/animata/widget directory.

mkdir -p components/animata/widget && touch components/animata/widget/calendar-event.tsx

Paste the code

Open the newly created file and paste the following code:

import { cn } from "@/lib/utils";
 
interface CalendarEvent {
  title: string;
  time: string;
  color: string;
  bgcolor: string;
  barColor: string;
  dateColor: string;
}
 
interface CalendarEventProps {
  dates: CalendarEvent[];
}
 
export const testCalendarEventProps: CalendarEventProps = {
  dates: [
    {
      title: "Backlog Updates",
      time: "10:30 - 10:45",
      color: "text-purple-900",
      bgcolor: "bg-purple-200",
      barColor: "bg-purple-700",
      dateColor: "text-purple-600",
    },
    {
      title: "Review Jade A",
      time: "12:00 - 12:45",
      color: "text-cyan-900",
      bgcolor: "bg-cyan-200",
      barColor: "bg-cyan-700",
      dateColor: "text-cyan-600",
    },
    {
      title: "Design Meeting",
      time: "14:00 - 15:00",
      color: "text-green-900",
      bgcolor: "bg-green-200",
      barColor: "bg-green-700",
      dateColor: "text-green-600",
    },
    {
      title: "Development",
      time: "16:00 - 17:00",
      color: "text-yellow-900",
      bgcolor: "bg-yellow-200",
      barColor: "bg-yellow-700",
      dateColor: "text-yellow-600",
    },
    {
      title: "QA Testing",
      time: "18:00 - 19:00",
      color: "text-red-900",
      bgcolor: "bg-red-200",
      barColor: "bg-red-700",
      dateColor: "text-red-600",
    },
  ],
};
 
const maxEvents = 2;
 
function EventCard({ date }: { date: CalendarEvent; hides: boolean }) {
  return (
    <div
      className={cn(
        "relative flex h-10 w-full items-center gap-2 overflow-hidden rounded-md pl-1 transition-all",
        date.bgcolor,
      )}
    >
      <div className={cn("h-8 w-1 rounded-sm", date.barColor)}></div>
      <div className="flex-col items-center justify-center">
        <h4 className={cn("text-sm font-bold", date.color)}>{date.title}</h4>
        <p className={cn("whitespace-pre text-xs", date.dateColor)}>{date.time}</p>
      </div>
    </div>
  );
}
 
export default function CalendarEvent({
  dates = testCalendarEventProps.dates,
}: CalendarEventProps) {
  const extraCount = dates.length - maxEvents;
  return (
    <div
      className={cn(
        "group relative flex size-52 flex-col overflow-hidden rounded-3xl border-2 bg-white p-4",
      )}
    >
      <div className="flex gap-1">
        <p className="text-xl font-bold text-red-400">
          {new Date().toLocaleString("default", { weekday: "short" })}
        </p>
        <p className="text-xl font-bold text-black">{new Date().getDate()}</p>
      </div>
      <div className="my-2 flex flex-1 flex-col gap-2">
        {dates.slice(0, maxEvents).map((date, index) => (
          <EventCard hides key={index} date={date} />
        ))}
      </div>
      {extraCount ? (
        <>
          <div className="flex h-8 w-full items-center justify-between rounded-md border-2 border-slate-200 bg-slate-50 p-1">
            <p className="text-xs font-bold text-neutral-800">
              +{dates.length - maxEvents} event{extraCount > 1 && "s"}
            </p>
            <p className="text-[10px] text-gray-500">16:15 - 20:00</p>
          </div>
          {dates.slice(maxEvents, maxEvents + 3).map((date, index) => (
            <div
              key={index}
              style={{
                paddingInline: `${(index + 1) * 6}px`,
              }}
            >
              <div className="mt-[1px] h-[2px] w-full rounded-full bg-gray-100" />
            </div>
          ))}
        </>
      ) : (
        <div className="w-full text-center text-xs font-bold text-gray-500">No more events</div>
      )}
    </div>
  );
}

Credits

Built by Sumin Gurung

yevhenyurchuk.com