feat: added ActionButton component (#6631)
parent
5af2df0cd5
commit
c112188207
@ -0,0 +1,49 @@
|
|||||||
|
@tailwind components;
|
||||||
|
|
||||||
|
@layer components {
|
||||||
|
.action-btn {
|
||||||
|
@apply inline-flex justify-center items-center cursor-pointer text-text-tertiary
|
||||||
|
hover:text-text-secondary
|
||||||
|
hover:bg-state-base-hover
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn-disabled {
|
||||||
|
@apply cursor-not-allowed
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn-xl {
|
||||||
|
@apply p-2 w-9 h-9 rounded-lg
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn-l {
|
||||||
|
@apply p-1.5 w-[34px] h-[34px] rounded-lg
|
||||||
|
}
|
||||||
|
|
||||||
|
/* m is for the regular button */
|
||||||
|
.action-btn-m {
|
||||||
|
@apply p-0.5 w-6 h-6 rounded-lg
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn-xs {
|
||||||
|
@apply p-0 w-5 h-5 rounded
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn.action-btn-active {
|
||||||
|
@apply
|
||||||
|
text-text-accent
|
||||||
|
bg-state-accent-active
|
||||||
|
hover:bg-state-accent-active-alt
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn.action-btn-disabled {
|
||||||
|
@apply
|
||||||
|
text-text-disabled
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn.action-btn-destructive {
|
||||||
|
@apply
|
||||||
|
text-text-destructive
|
||||||
|
bg-state-destructive-hover
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
import type { CSSProperties } from 'react'
|
||||||
|
import React from 'react'
|
||||||
|
import { type VariantProps, cva } from 'class-variance-authority'
|
||||||
|
import classNames from '@/utils/classnames'
|
||||||
|
|
||||||
|
enum ActionButtonState {
|
||||||
|
Destructive = 'destructive',
|
||||||
|
Active = 'active',
|
||||||
|
Disabled = 'disabled',
|
||||||
|
Default = '',
|
||||||
|
}
|
||||||
|
|
||||||
|
const actionButtonVariants = cva(
|
||||||
|
'action-btn',
|
||||||
|
{
|
||||||
|
variants: {
|
||||||
|
size: {
|
||||||
|
xs: 'action-btn-xs',
|
||||||
|
m: 'action-btn-m',
|
||||||
|
l: 'action-btn-l',
|
||||||
|
xl: 'action-btn-xl',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
size: 'm',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
export type ActionButtonProps = {
|
||||||
|
size?: 'xs' | 'm' | 'l' | 'xl'
|
||||||
|
state?: ActionButtonState
|
||||||
|
styleCss?: CSSProperties
|
||||||
|
} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof actionButtonVariants>
|
||||||
|
|
||||||
|
function getActionButtonState(state: ActionButtonState) {
|
||||||
|
switch (state) {
|
||||||
|
case ActionButtonState.Destructive:
|
||||||
|
return 'action-btn-destructive'
|
||||||
|
case ActionButtonState.Active:
|
||||||
|
return 'action-btn-active'
|
||||||
|
case ActionButtonState.Disabled:
|
||||||
|
return 'action-btn-disabled'
|
||||||
|
default:
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>(
|
||||||
|
({ className, size, state = ActionButtonState.Default, styleCss, children, ...props }, ref) => {
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type='button'
|
||||||
|
className={classNames(
|
||||||
|
actionButtonVariants({ className, size }),
|
||||||
|
getActionButtonState(state),
|
||||||
|
)}
|
||||||
|
ref={ref}
|
||||||
|
style={styleCss}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
ActionButton.displayName = 'ActionButton'
|
||||||
|
|
||||||
|
export default ActionButton
|
||||||
|
export { ActionButton, ActionButtonState, actionButtonVariants }
|
||||||
Loading…
Reference in New Issue