Skip to content

Commit d024d40

Browse files
committed
Create variants object
1 parent b5e125b commit d024d40

File tree

1 file changed

+94
-61
lines changed
  • packages/components/src/components/Button

1 file changed

+94
-61
lines changed

packages/components/src/components/Button/index.tsx

Lines changed: 94 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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

34
type 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

Comments
 (0)