aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/atoms/links/link/link.tsx
blob: e88cc7c77ee55513c37b2466598ef4d87127c4f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import NextLink from 'next/link';
import {
  forwardRef,
  type AnchorHTMLAttributes,
  type ForwardRefRenderFunction,
  type ReactNode,
} from 'react';
import styles from './link.module.scss';

export type LinkProps = Omit<
  AnchorHTMLAttributes<HTMLAnchorElement>,
  'children' | 'download' | 'hrefLang' | 'lang'
> & {
  /**
   * The link body.
   */
  children: ReactNode;
  /**
   * Should we disable the default transition on links?
   *
   * @default false
   */
  disableTransition?: boolean;
  /**
   * True if it is a download link.
   *
   * @default false
   */
  isDownload?: boolean;
  /**
   * True if it is an external link.
   *
   * @default false
   */
  isExternal?: boolean;
  /**
   * The link target.
   */
  href: string;
  /**
   * The link target code language.
   */
  lang?: string;
};

const LinkWithRef: ForwardRefRenderFunction<HTMLAnchorElement, LinkProps> = (
  {
    children,
    className = '',
    disableTransition = false,
    isDownload = false,
    isExternal = false,
    href,
    lang,
    rel = '',
    ...props
  },
  ref
) => {
  const LinkComponent = isExternal ? 'a' : NextLink;
  const linkClass = [
    styles.link,
    styles[disableTransition ? '' : 'link--regular'],
    styles[isDownload ? 'link--download' : ''],
    styles[isExternal ? 'link--external' : ''],
    className,
  ].join(' ');
  const linkRel =
    isExternal && !rel.includes('external') ? `external ${rel}` : rel;

  return (
    <LinkComponent
      {...props}
      className={linkClass}
      href={href}
      hrefLang={lang}
      ref={ref}
      rel={linkRel}
    >
      {children}
    </LinkComponent>
  );
};

/**
 * Link Component
 *
 * Render a link.
 */
export const Link = forwardRef(LinkWithRef);