11import { ArrowPathIcon } from '@heroicons/react/24/outline' ;
22import React from 'react' ;
33import { twMerge } from 'tailwind-merge' ;
4+ import { getColorClasses } from '../../utils/colorUtils' ;
45
56interface ButtonProps {
67 children : React . ReactNode ;
@@ -18,23 +19,6 @@ interface ButtonProps {
1819 rel ?: string ;
1920}
2021
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-
3822const Button : React . FC < ButtonProps > = ( {
3923 children,
4024 variant = 'primary' ,
@@ -50,6 +34,50 @@ const Button: React.FC<ButtonProps> = ({
5034 rel,
5135 size = 'medium' ,
5236} ) => {
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+
5381 const getSizeStyles = ( ) => {
5482 switch ( size ) {
5583 case 'small' :
@@ -77,19 +105,14 @@ const Button: React.FC<ButtonProps> = ({
77105 const renderButton = ( ) => {
78106 const commonStyles = 'font-semibold focus:outline-none' ;
79107 const sizeStyles = getSizeStyles ( ) ;
108+ const styleClasses = getStyleClasses ( ) ;
80109
81110 const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed' : '' ;
82111
83112 return React . createElement (
84113 as ,
85114 {
86- className : twMerge (
87- commonStyles ,
88- Styles [ `${ variant } :${ style } ` ] ,
89- sizeStyles ,
90- disabledStyles ,
91- className
92- ) ,
115+ className : twMerge ( commonStyles , styleClasses , sizeStyles , disabledStyles , className ) ,
93116 type,
94117 disabled : disabled ,
95118 onClick : handleClick ,
@@ -105,4 +128,22 @@ const Button: React.FC<ButtonProps> = ({
105128 return renderButton ( ) ;
106129} ;
107130
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+
108149export { Button } ;
0 commit comments