1
+ import { forwardRef } from "react"
1
2
import { cva , VariantProps } from "class-variance-authority"
2
3
import { Slot } from "@radix-ui/react-slot"
3
4
4
5
import { cn } from "@/lib/utils/cn"
5
6
6
7
const tagVariants = cva (
7
- "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 " ,
8
+ "inline-flex items-center rounded-full border px-2 py-0.5 min-h-8 text-xs uppercase transition-colors" ,
8
9
{
9
10
variants : {
10
11
status : {
@@ -25,27 +26,31 @@ const tagVariants = cva(
25
26
{
26
27
variant : "solid" ,
27
28
status : "normal" ,
28
- className : "bg-body-medium" ,
29
+ className :
30
+ "bg-body-medium focus-visible:outline-body hover:shadow-body" ,
29
31
} ,
30
32
{
31
33
variant : "solid" ,
32
34
status : "tag" ,
33
- className : "bg-primary" ,
35
+ className :
36
+ "bg-primary focus-visible:outline-primary-high-contrast hover:shadow-primary-low-contrast" ,
34
37
} ,
35
38
{
36
39
variant : "solid" ,
37
40
status : "success" ,
38
- className : "bg-success text-success-light" ,
41
+ className :
42
+ "bg-success text-success-light focus-visible:outline-success-dark" ,
39
43
} ,
40
44
{
41
45
variant : "solid" ,
42
46
status : "error" ,
43
- className : "bg-error text-error-light" ,
47
+ className : "bg-error text-error-light focus-visible:outline-error-dark " ,
44
48
} ,
45
49
{
46
50
variant : "solid" ,
47
51
status : "warning" ,
48
- className : "bg-warning text-warning-dark" ,
52
+ className :
53
+ "bg-warning text-warning-dark focus-visible:outline-warning-border" ,
49
54
} ,
50
55
{
51
56
variant : "highContrast" ,
@@ -96,14 +101,44 @@ export interface TagProps
96
101
asChild ?: boolean
97
102
}
98
103
99
- function Tag ( { className, asChild, variant, status, ...props } : TagProps ) {
100
- const Comp = asChild ? Slot : "div"
101
- return (
102
- < Comp
103
- className = { cn ( tagVariants ( { variant, status } ) , className ) }
104
- { ...props }
105
- />
106
- )
104
+ const Tag = forwardRef < HTMLDivElement , TagProps > (
105
+ ( { className, asChild, variant, status, ...props } , ref ) => {
106
+ const Comp = asChild ? Slot : "div"
107
+ return (
108
+ < Comp
109
+ ref = { ref }
110
+ className = { cn ( tagVariants ( { variant, status } ) , className ) }
111
+ { ...props }
112
+ />
113
+ )
114
+ }
115
+ )
116
+
117
+ Tag . displayName = "Tag"
118
+
119
+ export interface TagButtonProps
120
+ extends React . ButtonHTMLAttributes < HTMLButtonElement > ,
121
+ VariantProps < typeof tagVariants > {
122
+ asChild ?: boolean
107
123
}
108
124
109
- export { Tag }
125
+ const TagButton = forwardRef < HTMLButtonElement , TagButtonProps > (
126
+ ( { className, asChild, variant, status, ...props } , ref ) => {
127
+ const Comp = asChild ? Slot : "button"
128
+ return (
129
+ < Comp
130
+ ref = { ref }
131
+ className = { cn (
132
+ "hover:shadow-[2px_2px] focus-visible:outline focus-visible:outline-4 focus-visible:-outline-offset-1 focus-visible:outline-inherit" ,
133
+ tagVariants ( { variant, status } ) ,
134
+ className
135
+ ) }
136
+ { ...props }
137
+ />
138
+ )
139
+ }
140
+ )
141
+
142
+ TagButton . displayName = "TagButton"
143
+
144
+ export { Tag , TagButton }
0 commit comments