1
1
import { ArrowPathIcon } from '@heroicons/react/24/outline' ;
2
2
import React from 'react' ;
3
3
import { twMerge } from 'tailwind-merge' ;
4
+ import { getColorClasses } from '../../utils/colorUtils' ;
4
5
5
6
interface ButtonProps {
6
7
children : React . ReactNode ;
@@ -18,23 +19,6 @@ interface ButtonProps {
18
19
rel ?: string ;
19
20
}
20
21
21
- const Styles = {
22
- 'primary:fill' :
23
- 'bg-indigo-600 dark:bg-indigo-500 text-white shadow-sm hover:bg-indigo-700 dark:hover:bg-indigo-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600' ,
24
- 'primary:outline' :
25
- 'bg-white dark:bg-transparent ring-1 ring-inset ring-indigo-600 dark:ring-indigo-400 text-indigo-600 dark:text-indigo-400 hover:bg-indigo-600 dark:hover:bg-indigo-400 hover:text-white dark:hover:text-indigo-700 shadow-sm' ,
26
- 'primary:link' : 'text-indigo-600 dark:text-indigo-400 hover:text-indigo-500' ,
27
- 'secondary:fill' :
28
- 'bg-white dark:bg-white/10 ring-1 ring-inset ring-gray-300 dark:ring-white/10 hover:bg-gray-50 hover:bg-white/5 text-gray-900 dark:text-white shadow-sm' ,
29
- 'secondary:outline' :
30
- 'bg-white dark:bg-transparent dark:ring-1 dark:ring-gray-400 hover:bg-gray-50 text-gray-900 dark:text-gray-400 shadow-sm' ,
31
- 'secondary:link' : 'text-gray-900 dark:text-gray-400 hover:text-gray-500' ,
32
- 'danger:fill' : 'bg-red-600 dark:bg-red-500 hover:bg-red-500 text-white' ,
33
- 'danger:outline' :
34
- 'bg-white ring-1 ring-inset ring-red-600 hover:bg-red-600 text-red-600 hover:text-white shadow-sm' ,
35
- 'danger:link' : 'text-red-600 dark:text-red-500 hover:text-red-500 dark:hover:text-red-400' ,
36
- } ;
37
-
38
22
const Button : React . FC < ButtonProps > = ( {
39
23
children,
40
24
variant = 'primary' ,
@@ -50,6 +34,50 @@ const Button: React.FC<ButtonProps> = ({
50
34
rel,
51
35
size = 'medium' ,
52
36
} ) => {
37
+ const getStyleClasses = ( ) => {
38
+ if ( variant === 'primary' ) {
39
+ if ( style === 'fill' ) {
40
+ return twMerge (
41
+ getColorClasses ( {
42
+ bg : '600' ,
43
+ 'dark:bg' : '500' ,
44
+ 'hover:bg' : '700' ,
45
+ 'dark:hover:bg' : '400' ,
46
+ 'focus-visible:outline' : '' ,
47
+ 'focus-visible:outline-offset' : '' ,
48
+ 'focus-visible:outline-2' : '' ,
49
+ 'focus-visible:outline-' : '600' ,
50
+ } ) ,
51
+ 'text-white shadow-sm'
52
+ ) ;
53
+ } else if ( style === 'outline' ) {
54
+ return twMerge (
55
+ getColorClasses ( {
56
+ ring : '600' ,
57
+ 'dark:ring' : '400' ,
58
+ text : '600' ,
59
+ 'dark:text' : '400' ,
60
+ 'hover:bg' : '600' ,
61
+ 'dark:hover:bg' : '400' ,
62
+ 'dark:hover:text' : '700' ,
63
+ } ) ,
64
+ 'bg-white dark:bg-transparent ring-1 ring-inset hover:text-white shadow-sm'
65
+ ) ;
66
+ } else if ( style === 'link' ) {
67
+ return twMerge (
68
+ getColorClasses ( {
69
+ text : '600' ,
70
+ 'dark:text' : '400' ,
71
+ 'hover:text' : '500' ,
72
+ } )
73
+ ) ;
74
+ }
75
+ }
76
+
77
+ // If not primary or a different variant, use the existing styles
78
+ return Styles [ `${ variant } :${ style } ` ] ;
79
+ } ;
80
+
53
81
const getSizeStyles = ( ) => {
54
82
switch ( size ) {
55
83
case 'small' :
@@ -77,19 +105,14 @@ const Button: React.FC<ButtonProps> = ({
77
105
const renderButton = ( ) => {
78
106
const commonStyles = 'font-semibold focus:outline-none' ;
79
107
const sizeStyles = getSizeStyles ( ) ;
108
+ const styleClasses = getStyleClasses ( ) ;
80
109
81
110
const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed' : '' ;
82
111
83
112
return React . createElement (
84
113
as ,
85
114
{
86
- className : twMerge (
87
- commonStyles ,
88
- Styles [ `${ variant } :${ style } ` ] ,
89
- sizeStyles ,
90
- disabledStyles ,
91
- className
92
- ) ,
115
+ className : twMerge ( commonStyles , styleClasses , sizeStyles , disabledStyles , className ) ,
93
116
type,
94
117
disabled : disabled ,
95
118
onClick : handleClick ,
@@ -105,4 +128,22 @@ const Button: React.FC<ButtonProps> = ({
105
128
return renderButton ( ) ;
106
129
} ;
107
130
131
+ // Keep the original Styles object for secondary and danger variants
132
+ const Styles = {
133
+ 'primary:fill' :
134
+ 'bg-indigo-600 dark:bg-indigo-500 text-white shadow-sm hover:bg-indigo-700 dark:hover:bg-indigo-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600' ,
135
+ 'primary:outline' :
136
+ 'bg-white dark:bg-transparent ring-1 ring-inset ring-indigo-600 dark:ring-indigo-400 text-indigo-600 dark:text-indigo-400 hover:bg-indigo-600 dark:hover:bg-indigo-400 hover:text-white dark:hover:text-indigo-700 shadow-sm' ,
137
+ 'primary:link' : 'text-indigo-600 dark:text-indigo-400 hover:text-indigo-500' ,
138
+ 'secondary:fill' :
139
+ 'bg-white dark:bg-white/10 ring-1 ring-inset ring-gray-300 dark:ring-white/10 hover:bg-gray-50 hover:bg-white/5 text-gray-900 dark:text-white shadow-sm' ,
140
+ 'secondary:outline' :
141
+ 'bg-white dark:bg-transparent dark:ring-1 dark:ring-gray-400 hover:bg-gray-50 text-gray-900 dark:text-gray-400 shadow-sm' ,
142
+ 'secondary:link' : 'text-gray-900 dark:text-gray-400 hover:text-gray-500' ,
143
+ 'danger:fill' : 'bg-red-600 dark:bg-red-500 hover:bg-red-500 text-white' ,
144
+ 'danger:outline' :
145
+ 'bg-white ring-1 ring-inset ring-red-600 hover:bg-red-600 text-red-600 hover:text-white shadow-sm' ,
146
+ 'danger:link' : 'text-red-600 dark:text-red-500 hover:text-red-500 dark:hover:text-red-400' ,
147
+ } ;
148
+
108
149
export { Button } ;
0 commit comments