Files
web/packages/design-system/lib/components/ButtonLink/index.tsx
Linus Flood cd59102ef4 Merged in feat/svg-instead-of-fonts (pull request #3411)
feat(SW-3695): use svg icons instead of font icons

* feat(icons): use svg instead of font icons

* feat(icons): use webpack/svgr for inlined svgs. Now support for isFilled again

* Merge master

* Remove old font icon


Approved-by: Joakim Jäderberg
2026-01-09 13:14:09 +00:00

85 lines
1.8 KiB
TypeScript

"use client"
import { type ComponentProps } from "react"
import { variants } from "./variants"
import type { VariantProps } from "class-variance-authority"
import Link from "next/link"
import { useIntl } from "react-intl"
import { MaterialIcon } from "../Icons/MaterialIcon"
import { Typography } from "../Typography"
import { MaterialIconName } from "../Icons/MaterialIcon/generated"
export interface ButtonLinkProps
extends
Omit<ComponentProps<typeof Link>, "color">,
VariantProps<typeof variants> {
leadingIconName?: MaterialIconName | null
trailingIconName?: MaterialIconName | null
}
export default function ButtonLink({
variant,
color,
size,
wrapping,
fullWidth,
className,
href,
target,
leadingIconName,
trailingIconName,
children,
...props
}: ButtonLinkProps) {
const classNames = variants({
variant,
color,
size,
wrapping,
fullWidth,
className,
})
const intl = useIntl()
const newTabText = intl.formatMessage({
id: "common.linkOpenInNewTab",
defaultMessage: "Opens in a new tab/window",
})
return (
<Typography
variant={
size === "sm"
? "Body/Supporting text (caption)/smBold"
: "Body/Paragraph/mdBold"
}
>
<Link
className={classNames}
href={href}
target={target}
title={target === "_blank" ? newTabText : ""}
{...props}
>
{leadingIconName ? (
<MaterialIcon
icon={leadingIconName}
color="CurrentColor"
size={size === "sm" ? 20 : 24}
/>
) : null}
{children}
{trailingIconName ? (
<MaterialIcon
icon={trailingIconName}
color="CurrentColor"
size={size === "sm" ? 20 : 24}
/>
) : null}
</Link>
</Typography>
)
}