NEW
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
shadcn registry is live·
Learn more
Skip to content
Docs

Flight widget

A widget that shows flight detail

Loading...

Installation

CLI

pnpm dlx shadcn@latest add https://animata.design/r/widget/flight-widget.json

Manual

Install dependencies

npm install lucide-react

Run the following command

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

mkdir -p components/animata/widget && touch components/animata/widget/flight-widget.tsx

Paste the code

Open the newly created file and paste the following code:

"use client";
 
import { Armchair } from "lucide-react";
import { useEffect, useState } from "react";
 
const getTime = () => {
  const now = new Date();
 
  const options: Intl.DateTimeFormatOptions = {
    day: "2-digit",
    month: "short",
    hour: "2-digit",
    minute: "2-digit",
    hour12: false,
  };
  return now.toLocaleString("en-GB", options);
};
 
export default function FlightWidget() {
  const [formattedTime, setFormattedTime] = useState(getTime());
 
  useEffect(() => {
    const now = new Date();
    const secondsUntilNextMinute = 60 - now.getSeconds();
    const timeout = setTimeout(() => {
      setFormattedTime(getTime());
    }, secondsUntilNextMinute * 1000);
    return () => clearTimeout(timeout);
  }, []);
 
  return (
    <div className="relative flex h-52 w-52 overflow-hidden rounded-3xl text-black">
      <div className="relative w-16 items-center justify-evenly overflow-hidden bg-linear-to-b from-blue-100 to-blue-300">
        <div className="full absolute bottom-0 left-full flex h-16 w-52 origin-bottom-left -rotate-90 items-center justify-center gap-3 bg-pink-100">
          <div className="text-lg font-semibold tracking-widest text-red-700">AIR CANADA</div>
          <img
            src="https://seeklogo.com/images/A/air-canada-logo-A0180CCDB8-seeklogo.com.png"
            className="h-6 w-6"
            alt="Air Canada logo"
          />
        </div>
      </div>
      <div className="relative h-full w-36 bg-linear-to-b from-blue-100 to-teal-100 p-4 text-sm">
        {/* The background should match the container's background */}
        <div className="absolute -left-2 -top-2 z-10 h-4 w-4 rounded-full bg-white dark:bg-zinc-800" />
        <div className="flex justify-around pb-2">
          <div className="flex flex-col text-2xl font-bold">
            <p>TOR</p>
            <p>NYC</p>
          </div>
          <div>
            <div className="mt-1.5 rounded-2xl bg-yellow-400 px-2 font-mono font-bold text-black/75">
              A50
            </div>
          </div>
        </div>
        <div className="mt-2 font-bold tracking-tight text-teal-500">Flight</div>
        <div className="flex items-center justify-between font-bold">
          <p>AC951</p>
          <p className="flex pr-2">
            <Armchair fill="black" /> 1A
          </p>
        </div>
        <div className="mt-2 font-bold tracking-tight text-teal-500">Date & time</div>
        <div className="flex font-bold">
          <p>{formattedTime}</p>
        </div>
        {/* The background should match the container's background */}
        <div className="absolute -bottom-2 -left-2 z-10 h-4 w-4 rounded-full bg-white dark:bg-zinc-800" />
      </div>
    </div>
  );
}

Credits

Built by Aashish Katila yevhenyurchuk.com