Skip to content

Commit 302ecaf

Browse files
committed
migrate tags
1 parent 219c230 commit 302ecaf

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { Meta, StoryObj } from "@storybook/react"
2+
3+
import { Center, HStack, VStack } from "../flex"
4+
import { Tag } from "../tag"
5+
6+
const meta = {
7+
title: "Molecules / Display Content / New Tags",
8+
component: Tag,
9+
} satisfies Meta<typeof Tag>
10+
11+
export default meta
12+
13+
type Story = StoryObj<typeof meta>
14+
15+
// "normal" is default status
16+
const statusArray = ["normal", "tag", "success", "error", "warning"] as const
17+
18+
// "subtle" is default variant
19+
const variantArray = ["subtle", "solid", "outline"] as const
20+
21+
const StyleVariantList = () => (
22+
<HStack>
23+
{statusArray.map((status) => (
24+
<VStack key={status}>
25+
{variantArray.map((variant) => (
26+
<Tag key={variant} status={status} variant={variant}>
27+
Tag Name
28+
</Tag>
29+
))}
30+
</VStack>
31+
))}
32+
</HStack>
33+
)
34+
35+
export const StyleVariantsBasic: Story = {
36+
render: (args) => (
37+
<VStack className="gap-8">
38+
<Center>
39+
Click anywhere in the whitespace and then tab to see the button styling
40+
on `:focus-visible`
41+
</Center>
42+
<StyleVariantList {...args} />
43+
</VStack>
44+
),
45+
}

src/components/ui/tag.tsx

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { cva, VariantProps } from "class-variance-authority"
2+
3+
import { cn } from "@/lib/utils/cn"
4+
5+
const tagVariants = cva(
6+
"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",
7+
{
8+
variants: {
9+
status: {
10+
normal: "bg-background-highlight text-body-medium border-body-medium",
11+
tag: "bg-primary-low-contrast text-primary border-primary",
12+
success: "bg-success-light text-success border-success",
13+
error: "bg-error-light text-error border-error",
14+
warning: "bg-warning-light text-warning border-warning",
15+
},
16+
variant: {
17+
subtle: "border-transparent",
18+
solid: "border-transparent text-body-inverse",
19+
outline: "bg-transparent",
20+
},
21+
},
22+
compoundVariants: [
23+
{
24+
variant: "solid",
25+
status: "normal",
26+
className: "bg-body-medium",
27+
},
28+
{
29+
variant: "solid",
30+
status: "tag",
31+
className: "bg-primary",
32+
},
33+
{
34+
variant: "solid",
35+
status: "success",
36+
className: "bg-success",
37+
},
38+
{
39+
variant: "solid",
40+
status: "error",
41+
className: "bg-error",
42+
},
43+
{
44+
variant: "solid",
45+
status: "warning",
46+
className: "bg-warning",
47+
},
48+
],
49+
defaultVariants: {
50+
variant: "subtle",
51+
status: "normal",
52+
},
53+
}
54+
)
55+
56+
export interface TagProps
57+
extends React.HTMLAttributes<HTMLDivElement>,
58+
VariantProps<typeof tagVariants> {}
59+
60+
function Tag({ className, variant, status, ...props }: TagProps) {
61+
return (
62+
<div
63+
className={cn(tagVariants({ variant, status }), className)}
64+
{...props}
65+
/>
66+
)
67+
}
68+
69+
export { Tag }

0 commit comments

Comments
 (0)