kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
Create zap-button to zap request
rodzic
f3af41295c
commit
cc9e3dce87
|
@ -0,0 +1,59 @@
|
|||
import clsx from 'clsx';
|
||||
import React from 'react';
|
||||
|
||||
import { themes } from './useZapButtonStyles';
|
||||
|
||||
interface IZapButton {
|
||||
/** Extra class names for the button. */
|
||||
className?: string;
|
||||
/** URL to an SVG icon to render inside the button. */
|
||||
icon?: string;
|
||||
/** Action when the button is clicked. */
|
||||
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
||||
/** Text inside the button. Takes precedence over `children`. */
|
||||
text?: React.ReactNode;
|
||||
/** Styles the button visually with a predefined theme. */
|
||||
theme?: keyof typeof themes;
|
||||
/** Whether this button should submit a form by default. */
|
||||
type?: 'button' | 'submit';
|
||||
}
|
||||
|
||||
/** Customizable button element with various themes. */
|
||||
const ZapButton = React.forwardRef<HTMLButtonElement, IZapButton>((props, ref): JSX.Element => {
|
||||
const {
|
||||
icon,
|
||||
onClick,
|
||||
theme = 'secondary',
|
||||
text,
|
||||
type = 'button',
|
||||
className,
|
||||
} = props;
|
||||
|
||||
const renderButton = () => (
|
||||
<button
|
||||
onClick={onClick}
|
||||
ref={ref}
|
||||
type={type}
|
||||
data-testid='button'
|
||||
>
|
||||
<div className={clsx(className, { 'flex flex-col items-center w-12 !box-border place-content-center border font-medium p-2 rounded-xl focus:outline-none focus:ring-2 focus:ring-offset-2 appearance-none transition-all sm:w-20 sm:p-4': true,
|
||||
[`${themes[theme]}`]: true })}
|
||||
>
|
||||
<img className='w-16' src={icon} alt='stack coin' />
|
||||
<span className='text-base sm:text-2xl'>
|
||||
<p>
|
||||
{text}
|
||||
</p>
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</button>
|
||||
);
|
||||
|
||||
return renderButton();
|
||||
});
|
||||
|
||||
export {
|
||||
ZapButton as default,
|
||||
ZapButton,
|
||||
};
|
Ładowanie…
Reference in New Issue