1- import { Button as DevupButton } from '@devup-ui/react'
1+ import { Button as DevupButton , css } from '@devup-ui/react'
2+ import clsx from 'clsx'
23
34type ButtonProps = React . ButtonHTMLAttributes < HTMLButtonElement > & {
45 variant ?: 'primary' | 'default'
@@ -7,9 +8,86 @@ type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
78 error ?: string
89 }
910 isError ?: boolean
10- size ?: 's ' | 'm '
11+ size ?: 'sm ' | 'md '
1112}
1213
14+ const variants = {
15+ primary : css ( {
16+ styleOrder : 2 ,
17+ _active : {
18+ bg : `color-mix(in srgb, var(--primary, #FFF) 100%, #000 30%)` ,
19+ } ,
20+ _disabled : {
21+ color : '#D6D7DE' ,
22+ bgColor : '#F0F0F3' ,
23+ cursor : 'not-allowed' ,
24+ } ,
25+ _hover : {
26+ bg : `color-mix(in srgb, var(--primary, #FFF) 100%, #000 15%)` ,
27+ } ,
28+ _themeDark : {
29+ _active : {
30+ bg : `color-mix(in srgb, var(--primary, #000) 100%, #FFF 30%);` ,
31+ } ,
32+ _disabled : {
33+ color : '#373737' ,
34+ bgColor : '#47474A' ,
35+ cursor : 'not-allowed' ,
36+ borderColor : 'transparent' ,
37+ } ,
38+ _hover : {
39+ bg : `color-mix(in srgb, var(--primary, #000) 100%, #FFF 15%);` ,
40+ outlineColor : `var(--primary, #FFF)` ,
41+ } ,
42+ } ,
43+ bg : 'var(--primary, #000)' ,
44+ border : 'none' ,
45+ borderRadius : '8px' ,
46+ color : '#FFF' ,
47+ } ) ,
48+ default : css ( {
49+ styleOrder : 2 ,
50+ _active : {
51+ bg : `color-mix(in srgb, var(--primary, #000) 20%, #FFF 80%)` ,
52+ border : `1px solid var(--primary, #000)` ,
53+ color : '#000' ,
54+ } ,
55+ _hover : {
56+ borderColor : `var(--primary, #000)` ,
57+ bg : `color-mix(in srgb, var(--primary, #000) 10%, #FFF 90%)` ,
58+ } ,
59+ bg : '$inputBg' ,
60+ border : '1px solid $border' ,
61+ borderRadius : '10px' ,
62+ color : '$text' ,
63+ } ) ,
64+ }
65+
66+ const errorClassNames = css ( {
67+ styleOrder : 3 ,
68+ _active : {
69+ bg : 'var(--error, #000)' ,
70+ border : '1px solid var(--error, #000)' ,
71+ color : '#000' ,
72+ } ,
73+ _focusVisible : {
74+ outlineColor : 'var(--error, #000)' ,
75+ } ,
76+ _hover : {
77+ border : '1px solid var(--error, #000)' ,
78+ } ,
79+ _themeDark : {
80+ _active : {
81+ bg : 'var(--error, #000)' ,
82+ border : '1px solid var(--error, #000)' ,
83+ color : '#000' ,
84+ } ,
85+ _hover : {
86+ bg : '$inputBg' ,
87+ } ,
88+ } ,
89+ } )
90+
1391/**
1492 * Button
1593 * ## Design Token
@@ -30,44 +108,21 @@ export function Button({
30108 colors,
31109 isError = false ,
32110 children,
33- size = 'm ' ,
111+ size = 'md ' ,
34112 ...props
35113} : ButtonProps ) : React . ReactElement {
36114 const isPrimary = variant === 'primary'
37115
38116 return (
39117 < DevupButton
40- _active = { {
41- bg : isPrimary
42- ? `color-mix(in srgb, var(--primary, #FFF) 100%, #000 30%);`
43- : isError
44- ? 'var(--error, #000)'
45- : `color-mix(in srgb, var(--primary, #000) 20%, #FFF 80%);` ,
46- border :
47- ! isPrimary &&
48- ( isError
49- ? '1px solid var(--error, #000)'
50- : `1px solid var(--primary, #000)` ) ,
51- color : ! isPrimary && isError && '#000' ,
52- } }
53118 _disabled = { {
54119 color : '#D6D7DE' ,
55120 bgColor : '#F0F0F3' ,
56121 cursor : 'not-allowed' ,
57- borderColor : isPrimary ? 'transparent' : '$border' ,
58122 } }
59123 _focusVisible = { {
60124 outline : '2px solid' ,
61- outlineColor :
62- ! isPrimary && isError ? 'var(--error, #000)' : '$primaryFocus' ,
63- } }
64- _hover = { {
65- borderColor : isError ? 'var(--error, #000)' : `var(--primary, #000)` ,
66- bg : isPrimary
67- ? `color-mix(in srgb, var(--primary, #FFF) 100%, #000 15%)`
68- : isError
69- ? '1px solid var(--error, #000)'
70- : `color-mix(in srgb, var(--primary, #000) 10%, #FFF 90%)` ,
125+ outlineColor : '$primaryFocus' ,
71126 } }
72127 _themeDark = { {
73128 _disabled : {
@@ -76,52 +131,30 @@ export function Button({
76131 cursor : 'not-allowed' ,
77132 borderColor : 'transparent' ,
78133 } ,
79- _active : {
80- bg : isPrimary
81- ? `color-mix(in srgb, var(--primary, #000) 100%, #FFF 30%);`
82- : isError
83- ? 'var(--error, #000)'
84- : 'var(--primary, #FFF)' ,
85- border :
86- ! isPrimary &&
87- ( isError
88- ? '1px solid var(--error, #000)'
89- : `1px solid var(--primary, #FFF)` ) ,
90- color : ! isPrimary && isError && '#FFF' ,
91- } ,
92- _hover : {
93- bg : isPrimary
94- ? `color-mix(in srgb, var(--primary, #000) 100%, #FFF 15%);`
95- : isError
96- ? '$inputBg'
97- : `color-mix(in srgb, var(--primary, #FFF) 20%, #000 80%);` ,
98- } ,
99134 _focusVisible : {
100- outlineColor : isPrimary
101- ? `var(--primary, #FFF)`
102- : isError
103- ? 'var(--error, #000)'
104- : '$primaryFocus' ,
135+ outlineColor : '$primaryFocus' ,
105136 } ,
106137 } }
107- bg = { isPrimary ? 'var(--primary, #000)' : '$inputBg' }
108- border = { isPrimary ? 'none' : '1px solid $border' }
109- borderRadius = { isPrimary ? '8px' : '10px' }
110- className = { className }
111- color = { isPrimary ? '#FFF' : isError ? 'var(--error, #000)' : '$text' }
138+ className = { clsx (
139+ variants [ variant ] ,
140+ isError && variant === 'default' && errorClassNames ,
141+ className ,
142+ ) }
143+ color = { isError ? 'var(--error, #000)' : '$text' }
112144 cursor = "pointer"
113145 outlineOffset = "2px"
114146 px = "40px"
115147 py = "12px"
116148 styleOrder = { 1 }
117- styleVars = { colors && { primary : colors . primary , error : colors . error } }
149+ styleVars = { { primary : colors ? .primary , error : colors ? .error } }
118150 transition = ".25s"
119151 type = { type }
120152 typography = {
121153 isPrimary
122- ? size === 's'
123- ? 'buttonS'
124- : 'buttonM'
154+ ? {
155+ sm : 'buttonS' ,
156+ md : 'buttonM' ,
157+ } [ size ]
125158 : isError
126159 ? 'inputBold'
127160 : 'buttonxs'
0 commit comments