accept icons in button component
This commit is contained in:
parent
ad76bbabee
commit
1cf0c8b1e7
|
@ -9,12 +9,10 @@ const Base = styled(Stack, {
|
||||||
name: 'Button',
|
name: 'Button',
|
||||||
accessibilityRole: 'button',
|
accessibilityRole: 'button',
|
||||||
|
|
||||||
cursor: 'pointer',
|
|
||||||
borderRadius: 12,
|
borderRadius: 12,
|
||||||
|
cursor: 'pointer',
|
||||||
display: 'inline-flex',
|
display: 'inline-flex',
|
||||||
paddingHorizontal: 16,
|
alignItems: 'center',
|
||||||
paddingTop: 7,
|
|
||||||
paddingBottom: 9,
|
|
||||||
animation: 'fast',
|
animation: 'fast',
|
||||||
userSelect: 'none',
|
userSelect: 'none',
|
||||||
|
|
||||||
|
@ -30,26 +28,102 @@ const Base = styled(Stack, {
|
||||||
hoverStyle: { backgroundColor: '$successHover' },
|
hoverStyle: { backgroundColor: '$successHover' },
|
||||||
pressStyle: { backgroundColor: '$successHover' },
|
pressStyle: { backgroundColor: '$successHover' },
|
||||||
},
|
},
|
||||||
|
outline: {
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '$neutral-30',
|
||||||
|
hoverStyle: { borderColor: '$neutral-30' },
|
||||||
|
pressStyle: { borderColor: '$neutral-50' },
|
||||||
|
},
|
||||||
|
ghost: {
|
||||||
|
backgroundColor: 'transparent',
|
||||||
|
hoverStyle: { backgroundColor: '$neutral-10' },
|
||||||
|
pressStyle: { backgroundColor: '$neutral-20' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
size: {
|
||||||
|
40: {
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingTop: 7,
|
||||||
|
paddingBottom: 9,
|
||||||
|
},
|
||||||
|
32: {
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingTop: 4,
|
||||||
|
paddingBottom: 6,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
iconOnly: {
|
||||||
|
true: {
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const,
|
||||||
|
})
|
||||||
|
|
||||||
|
const ButtonText = styled(Paragraph, {
|
||||||
|
textAlign: 'center',
|
||||||
|
weight: 'medium',
|
||||||
|
display: 'inline-flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
space: 4,
|
||||||
|
|
||||||
|
variants: {
|
||||||
|
type: {
|
||||||
|
primary: {
|
||||||
|
color: '$white-100',
|
||||||
|
},
|
||||||
|
positive: {
|
||||||
|
color: '$white-100',
|
||||||
|
},
|
||||||
|
outline: {
|
||||||
|
color: '$neutral-100',
|
||||||
|
},
|
||||||
|
ghost: {
|
||||||
|
color: '$neutral-100',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} as const,
|
} as const,
|
||||||
})
|
})
|
||||||
|
|
||||||
type BaseProps = GetProps<typeof Base>
|
type BaseProps = GetProps<typeof Base>
|
||||||
|
|
||||||
type Props = {
|
type Props = BaseProps & {
|
||||||
type?: BaseProps['type']
|
|
||||||
children: string
|
children: string
|
||||||
|
icon?: React.ReactNode
|
||||||
|
type?: BaseProps['type']
|
||||||
|
size?: BaseProps['size']
|
||||||
|
iconAfter?: React.ReactNode
|
||||||
onPress?: () => void
|
onPress?: () => void
|
||||||
} & Omit<BaseProps, 'type'>
|
}
|
||||||
|
|
||||||
const Button = (props: Props) => {
|
const Button = (props: Props) => {
|
||||||
const { type = 'primary', children, onPress, ...rest } = props
|
const {
|
||||||
|
type = 'primary',
|
||||||
|
size = 40,
|
||||||
|
children,
|
||||||
|
onPress,
|
||||||
|
icon,
|
||||||
|
iconAfter,
|
||||||
|
...rest
|
||||||
|
} = props
|
||||||
|
|
||||||
|
const iconOnly = !children && Boolean(icon)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Base {...rest} type={type} onPress={onPress}>
|
<Base
|
||||||
<Paragraph color="$white-100" textAlign="center" weight="medium">
|
{...rest}
|
||||||
|
type={type}
|
||||||
|
size={size}
|
||||||
|
iconOnly={iconOnly}
|
||||||
|
onPress={onPress}
|
||||||
|
>
|
||||||
|
<ButtonText type={type}>
|
||||||
|
{icon}
|
||||||
{children}
|
{children}
|
||||||
</Paragraph>
|
{iconAfter}
|
||||||
|
</ButtonText>
|
||||||
</Base>
|
</Base>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue