2025-11-09 13:09:22 +01:00
|
|
|
import React from "react";
|
2025-10-13 20:22:47 +02:00
|
|
|
import classNames from "classnames";
|
|
|
|
|
import { Link } from "react-router"
|
|
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
className?: string;
|
|
|
|
|
href: string;
|
|
|
|
|
icon?: React.ReactNode;
|
|
|
|
|
size?: "small" | "medium" | "large";
|
|
|
|
|
variant?: "primary" | "secondary";
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-09 13:09:22 +01:00
|
|
|
const OutlineLinkButton = ({ children, className, href, icon, size = "medium", variant }: Props) => {
|
2025-10-13 20:22:47 +02:00
|
|
|
const linkClassNames = classNames(
|
|
|
|
|
"underline font-default pt-3 pb-3 px-4 rounded mb-0 flex",
|
|
|
|
|
{
|
|
|
|
|
'text-primary border-primary': variant === "primary",
|
|
|
|
|
'text-secondary border-secondary': variant === "secondary",
|
|
|
|
|
'text-accent-blue border-accent': !variant || !["primary", "secondary"].includes(variant),
|
|
|
|
|
}, {
|
|
|
|
|
'text-size-14': size === "small",
|
|
|
|
|
'font-size-18': !size || size === "medium",
|
|
|
|
|
'text-2xl': size === "large",
|
|
|
|
|
},
|
|
|
|
|
className,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const iconClassNames = classNames("mt-0.5", {
|
|
|
|
|
"h-4 w-4 mr-1": size === "small",
|
|
|
|
|
"h-5 w-5 mr-1": size === "medium", // Default size
|
|
|
|
|
"h-7 w-7 mr-2": size === "large",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const iconElement =
|
|
|
|
|
React.isValidElement(icon) &&
|
2025-11-09 13:09:22 +01:00
|
|
|
React.cloneElement(icon as React.ReactElement<{ className?: string }>, {
|
2025-10-13 20:22:47 +02:00
|
|
|
className: iconClassNames,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Link className={linkClassNames} to={href}>
|
|
|
|
|
{iconElement}
|
|
|
|
|
{children}
|
|
|
|
|
</Link>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default OutlineLinkButton
|