> = sortCx({
light: {
brand: {
root: "bg-utility-brand-50 text-utility-brand-700 ring-utility-brand-200 hover:bg-utility-brand-100",
addon: "bg-primary text-current ring-utility-brand-200",
icon: "text-utility-brand-500",
},
gray: {
root: "bg-utility-gray-50 text-utility-gray-700 ring-utility-gray-200 hover:bg-utility-gray-100",
addon: "bg-primary text-current ring-utility-gray-200",
icon: "text-utility-gray-500",
},
error: {
root: "bg-utility-error-50 text-utility-error-700 ring-utility-error-200 hover:bg-utility-error-100",
addon: "bg-primary text-current ring-utility-error-200",
icon: "text-utility-error-500",
},
warning: {
root: "bg-utility-warning-50 text-utility-warning-700 ring-utility-warning-200 hover:bg-utility-warning-100",
addon: "bg-primary text-current ring-utility-warning-200",
icon: "text-utility-warning-500",
},
success: {
root: "bg-utility-success-50 text-utility-success-700 ring-utility-success-200 hover:bg-utility-success-100",
addon: "bg-primary text-current ring-utility-success-200",
icon: "text-utility-success-500",
},
},
modern: {
brand: {
dot: "bg-utility-brand-500 outline-3 -outline-offset-1 outline-utility-brand-100",
},
gray: {
dot: "bg-utility-gray-500 outline-3 -outline-offset-1 outline-utility-gray-100",
},
error: {
dot: "bg-utility-error-500 outline-3 -outline-offset-1 outline-utility-error-100",
},
warning: {
dot: "bg-utility-warning-500 outline-3 -outline-offset-1 outline-utility-warning-100",
},
success: {
dot: "bg-utility-success-500 outline-3 -outline-offset-1 outline-utility-success-100",
},
},
});
interface BadgeGroupProps {
children?: string | ReactNode;
addonText: string;
size?: Size;
color: Color;
theme?: Theme;
/**
* Alignment of the badge addon element.
*/
align?: Align;
iconTrailing?: FC<{ className?: string }> | ReactNode;
className?: string;
}
export const BadgeGroup = ({
children,
addonText,
size = "md",
color = "brand",
theme = "light",
align = "leading",
className,
iconTrailing: IconTrailing = ArrowRight,
}: BadgeGroupProps) => {
const colors = colorClasses[theme][color];
const sizes = getSizeClasses(theme, !!children, !!IconTrailing)[align][size];
const rootClasses = cx(
"inline-flex w-max cursor-pointer items-center transition duration-100 ease-linear",
baseClasses[theme].root,
sizes.root,
colors.root,
className,
);
const addonClasses = cx("inline-flex items-center", baseClasses[theme].addon, sizes.addon, colors.addon);
const dotClasses = cx("inline-block size-2 shrink-0 rounded-full", sizes.dot, colors.dot);
const iconClasses = cx(baseClasses[theme].icon, sizes.icon, colors.icon);
if (align === "trailing") {
return (
{theme === "modern" && }
{children}
{addonText}
{/* Trailing icon */}
{isReactComponent(IconTrailing) && }
{isValidElement(IconTrailing) && IconTrailing}
);
}
return (
{theme === "modern" && }
{addonText}
{children}
{/* Trailing icon */}
{isReactComponent(IconTrailing) && }
{isValidElement(IconTrailing) && IconTrailing}
);
};