import React, { HTMLAttributes, forwardRef } from "react"; import { AkselColor } from "../types"; import { BodyShort } from "../typography"; import { cl } from "../utils/helpers"; type legacyVariants = | "warning" | "warning-filled" | "warning-moderate" | "error" | "error-filled" | "error-moderate" | "info" | "info-filled" | "info-moderate" | "success" | "success-filled" | "success-moderate" | "neutral" | "neutral-filled" | "neutral-moderate" | "alt1" | "alt1-filled" | "alt1-moderate" | "alt2" | "alt2-filled" | "alt2-moderate" | "alt3" | "alt3-filled" | "alt3-moderate"; type HiddenVariant = legacyVariants & { __brand?: never }; export interface TagProps extends HTMLAttributes { children: React.ReactNode; /** * Changes visual profile of tag * @default "outline" */ variant?: "outline" | "moderate" | "strong" | HiddenVariant; /** * @default "medium" */ size?: "medium" | "small" | "xsmall"; /** * Tag Icon */ icon?: React.ReactNode; /** * Tag color * @default "neutral" */ "data-color"?: AkselColor; } /** * A component that displays a small label with a text and a background color. * * @see [📝 Documentation](https://aksel.nav.no/komponenter/core/tag) * @see 🏷️ {@link TagProps} * * @example * ```jsx * Success * ``` */ export const Tag = forwardRef( ( { children, className, variant = "outline", size = "medium", icon, "data-color": color, ...rest }, ref, ) => { const filledVariant = variant?.endsWith("-filled") && "strong"; const moderateVariant = variant?.endsWith("-moderate") && "moderate"; const updatedVariant = variant === "moderate" || variant === "strong" || variant === "outline"; return ( {icon && {icon}} {children} ); }, ); function variantToColor(variant: TagProps["variant"]): AkselColor { switch (variant) { case "warning": case "warning-filled": case "warning-moderate": return "warning"; case "error": case "error-filled": case "error-moderate": return "danger"; case "info": case "info-filled": case "info-moderate": case "alt3": case "alt3-filled": case "alt3-moderate": return "info"; case "success": case "success-filled": case "success-moderate": return "success"; case "neutral": case "neutral-filled": case "neutral-moderate": return "neutral"; case "alt1": case "alt1-filled": case "alt1-moderate": return "meta-purple"; case "alt2": case "alt2-filled": case "alt2-moderate": return "meta-lime"; default: return "neutral"; } } export default Tag;