diff --git a/src/components/ui/__stories__/Tag.stories.tsx b/src/components/ui/__stories__/Tag.stories.tsx index 230422b56e1..bc4cbfe25e2 100644 --- a/src/components/ui/__stories__/Tag.stories.tsx +++ b/src/components/ui/__stories__/Tag.stories.tsx @@ -1,7 +1,7 @@ import { Meta, StoryObj } from "@storybook/react" import { HStack, VStack } from "../flex" -import { Tag } from "../tag" +import { Tag, TagButton } from "../tag" const meta = { title: "Molecules / Display Content / New Tags", @@ -16,22 +16,36 @@ type Story = StoryObj const statusArray = ["normal", "tag", "success", "error", "warning"] as const // "subtle" is default variant -const variantArray = ["subtle", "highContrast", "solid", "outline"] as const - -const StyleVariantList = () => ( - - {statusArray.map((status) => ( - - {variantArray.map((variant) => ( - - Tag Name - - ))} - - ))} - -) +const variantArray = ["subtle", "high-contrast", "solid", "outline"] as const export const StyleVariantsBasic: Story = { - render: (args) => , + render: () => ( + + {statusArray.map((status) => ( + + {variantArray.map((variant) => ( + + Tag Name + + ))} + + ))} + + ), +} + +export const StyleVariantsButton: Story = { + render: () => ( + + {statusArray.map((status) => ( + + {variantArray.map((variant) => ( + + Tag Name + + ))} + + ))} + + ), } diff --git a/src/components/ui/tag.tsx b/src/components/ui/tag.tsx index 657c3a60254..354016a0627 100644 --- a/src/components/ui/tag.tsx +++ b/src/components/ui/tag.tsx @@ -1,22 +1,27 @@ +import { forwardRef } from "react" import { cva, VariantProps } from "class-variance-authority" import { Slot } from "@radix-ui/react-slot" import { cn } from "@/lib/utils/cn" const tagVariants = cva( - "inline-flex items-center rounded-full border px-2 py-0.5 min-h-8 text-xs uppercase transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + "inline-flex items-center rounded-full border px-2 py-0.5 min-h-8 text-xs uppercase transition-colors", { variants: { status: { - normal: "bg-background-highlight text-body-medium border-body-medium", - tag: "bg-primary-low-contrast text-primary-high-contrast border-primary", - success: "bg-success-light text-success border-success-border", - error: "bg-error-light text-error border-error-border", - warning: "bg-warning-light text-warning-dark border-warning-border", + normal: + "bg-background-highlight text-body-medium border-body-medium hover:shadow-body-medium", + tag: "bg-primary-low-contrast text-primary-high-contrast border-primary hover:shadow-primary-high-contrast", + success: + "bg-success-light text-success border-success-border hover:shadow-success", + error: + "bg-error-light text-error border-error-border hover:shadow-error", + warning: + "bg-warning-light text-warning-dark border-warning-border hover:shadow-warning-dark dark:hover:shadow-warning", }, variant: { subtle: "border-transparent", - highContrast: "border-transparent", + "high-contrast": "border-transparent", solid: "border-transparent text-body-inverse", outline: "bg-transparent", }, @@ -25,45 +30,50 @@ const tagVariants = cva( { variant: "solid", status: "normal", - className: "bg-body-medium", + className: + "bg-body-medium focus-visible:outline-body hover:shadow-body", }, { variant: "solid", status: "tag", - className: "bg-primary", + className: + "bg-primary focus-visible:outline-primary-high-contrast hover:shadow-primary-high-contrast", }, { variant: "solid", status: "success", - className: "bg-success text-success-light", + className: + "bg-success text-success-light focus-visible:outline-success-dark hover:shadow-success-dark dark:hover:shadow-success-light", }, { variant: "solid", status: "error", - className: "bg-error text-error-light", + className: + "bg-error text-error-light focus-visible:outline-error-dark hover:shadow-error-dark dark:hover:shadow-error-light", }, { variant: "solid", status: "warning", - className: "bg-warning text-warning-dark", + className: + "bg-warning text-warning-dark focus-visible:outline-warning-border hover:shadow-warning-dark dark:hover:shadow-warning-light", }, { - variant: "highContrast", + variant: "high-contrast", status: "normal", className: "bg-body-light text-body", }, { - variant: "highContrast", + variant: "high-contrast", status: "tag", className: "bg-background-highlight", }, { - variant: "highContrast", + variant: "high-contrast", status: "success", className: "text-success-dark", }, { - variant: "highContrast", + variant: "high-contrast", status: "error", className: "text-error-dark", }, @@ -96,14 +106,44 @@ export interface TagProps asChild?: boolean } -function Tag({ className, asChild, variant, status, ...props }: TagProps) { - const Comp = asChild ? Slot : "div" - return ( - - ) +const Tag = forwardRef( + ({ className, asChild, variant, status, ...props }, ref) => { + const Comp = asChild ? Slot : "div" + return ( + + ) + } +) + +Tag.displayName = "Tag" + +export interface TagButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean } -export { Tag } +const TagButton = forwardRef( + ({ className, asChild, variant, status, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) + +TagButton.displayName = "TagButton" + +export { Tag, TagButton }