beta/src/components/MDX/Link.tsx (44 lines of code) (raw):
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
import * as React from 'react';
import NextLink from 'next/link';
import cn from 'classnames';
import {ExternalLink} from 'components/ExternalLink';
function Link({
href,
className,
children,
...props
}: JSX.IntrinsicElements['a']) {
const classes =
'inline text-link dark:text-link-dark break-normal border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal';
const modifiedChildren = React.Children.toArray(children).map(
(child: any) => {
if (child.props?.mdxType && child.props?.mdxType === 'inlineCode') {
return React.cloneElement(child, {
isLink: true,
});
}
return child;
}
);
if (!href) {
// eslint-disable-next-line jsx-a11y/anchor-has-content
return <a href={href} className={className} {...props} />;
}
return (
<>
{href.startsWith('https://') ? (
<ExternalLink href={href} className={cn(classes, className)} {...props}>
{modifiedChildren}
</ExternalLink>
) : href.startsWith('#') ? (
// eslint-disable-next-line jsx-a11y/anchor-has-content
<a className={cn(classes, className)} href={href} {...props}>
{modifiedChildren}
</a>
) : (
<NextLink href={href.replace('.html', '')}>
{/* eslint-disable-next-line jsx-a11y/anchor-has-content */}
<a className={cn(classes, className)} {...props}>
{modifiedChildren}
</a>
</NextLink>
)}
</>
);
}
Link.displayName = 'Link';
export default Link;