2023-04-24 09:54:47 +02:00
|
|
|
import clsx from "clsx";
|
|
|
|
|
import React from "react";
|
2023-04-03 13:39:51 +02:00
|
|
|
|
|
|
|
|
const Label = ({
|
|
|
|
|
children,
|
|
|
|
|
animateRerendering,
|
|
|
|
|
color,
|
|
|
|
|
}: {
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
animateRerendering?: boolean;
|
2023-04-24 09:54:47 +02:00
|
|
|
color?: "default" | "pink" | "blue" | "violet" | "cyan" | "orange";
|
2023-04-03 13:39:51 +02:00
|
|
|
}) => {
|
|
|
|
|
return (
|
|
|
|
|
<div
|
2023-04-24 09:54:47 +02:00
|
|
|
className={clsx("rounded-full px-1.5 shadow-[0_0_1px_3px_black]", {
|
|
|
|
|
"bg-gray-800 text-gray-500": color === "default",
|
|
|
|
|
"bg-vercel-pink text-pink-100": color === "pink",
|
|
|
|
|
"bg-vercel-blue text-blue-100": color === "blue",
|
|
|
|
|
"bg-vercel-cyan text-cyan-100": color === "cyan",
|
|
|
|
|
"bg-vercel-violet text-violet-100": color === "violet",
|
|
|
|
|
"bg-vercel-orange text-orange-100": color === "orange",
|
|
|
|
|
"animate-[highlight_1s_ease-in-out_1]": animateRerendering,
|
2023-04-03 13:39:51 +02:00
|
|
|
})}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
export const Boundary = ({
|
|
|
|
|
children,
|
2023-04-24 09:54:47 +02:00
|
|
|
labels = ["children"],
|
|
|
|
|
size = "default",
|
|
|
|
|
color = "default",
|
2023-04-03 13:39:51 +02:00
|
|
|
animateRerendering = true,
|
|
|
|
|
}: {
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
labels?: string[];
|
2023-04-24 09:54:47 +02:00
|
|
|
size?: "small" | "default";
|
|
|
|
|
color?: "default" | "pink" | "blue" | "violet" | "cyan" | "orange";
|
2023-04-03 13:39:51 +02:00
|
|
|
animateRerendering?: boolean;
|
|
|
|
|
}) => {
|
|
|
|
|
return (
|
|
|
|
|
<div
|
2023-04-24 09:54:47 +02:00
|
|
|
className={clsx("relative rounded-lg border border-dashed", {
|
|
|
|
|
"p-3 lg:p-5": size === "small",
|
|
|
|
|
"p-4 lg:p-9": size === "default",
|
|
|
|
|
"border-divider-light dark:border-divider-dark": color === "default",
|
|
|
|
|
"border-vercel-pink": color === "pink",
|
|
|
|
|
"border-vercel-blue": color === "blue",
|
|
|
|
|
"border-vercel-cyan": color === "cyan",
|
|
|
|
|
"border-vercel-violet": color === "violet",
|
|
|
|
|
"border-vercel-orange": color === "orange",
|
|
|
|
|
"animate-[rerender_1s_ease-in-out_1] text-vercel-pink":
|
2023-04-03 13:39:51 +02:00
|
|
|
animateRerendering,
|
|
|
|
|
})}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
className={clsx(
|
2023-04-24 09:54:47 +02:00
|
|
|
"absolute -top-2.5 flex space-x-1 text-[9px] uppercase leading-4 tracking-widest",
|
2023-04-03 13:39:51 +02:00
|
|
|
{
|
2023-04-24 09:54:47 +02:00
|
|
|
"left-3 lg:left-5": size === "small",
|
|
|
|
|
"left-4 lg:left-9": size === "default",
|
|
|
|
|
}
|
2023-04-03 13:39:51 +02:00
|
|
|
)}
|
|
|
|
|
>
|
|
|
|
|
{labels.map((label) => {
|
|
|
|
|
return (
|
|
|
|
|
<Label
|
|
|
|
|
key={label}
|
|
|
|
|
color={color}
|
|
|
|
|
animateRerendering={animateRerendering}
|
|
|
|
|
>
|
|
|
|
|
{label}
|
|
|
|
|
</Label>
|
|
|
|
|
);
|
|
|
|
|
})}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{children}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|