DocWeave / frontend /src /components /ui /Button.jsx
shak3008's picture
feat: render in-page interactive elements as Links to support right-click open in new tab
46cb663
Raw
History Blame Contribute Delete
1.37 kB
import { forwardRef } from "react";
import { Link } from "react-router-dom";
import { Spinner } from "./Spinner";
import "./Button.css";
/**
* variant: "primary" | "secondary" | "ghost" | "danger" | "warning"
* size: "sm" | "md"
*/
export const Button = forwardRef(function Button(
{
children,
variant = "primary",
size = "md",
loading = false,
disabled = false,
icon = null,
type = "button",
className = "",
to = null,
...props
},
ref
) {
const classes = `dw-btn dw-btn--${variant} dw-btn--${size} ${className}`;
if (to && !disabled && !loading) {
return (
<Link ref={ref} to={to} className={classes} {...props}>
{icon && <span className="dw-btn__icon">{icon}</span>}
<span className="dw-btn__label">{children}</span>
</Link>
);
}
return (
<button
ref={ref}
type={type}
disabled={disabled || loading}
className={classes}
{...props}
>
{loading ? (
<Spinner size={size === "sm" ? 13 : 15} />
) : (
icon && <span className="dw-btn__icon">{icon}</span>
)}
<span className="dw-btn__label">{children}</span>
</button>
);
});