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
91
92
|
import type { FC } from 'react';
import { useIntl } from 'react-intl';
import { Copyright, type CopyrightProps, Footer } from '../../atoms';
import {
BackToTop,
type BackToTopProps,
NavList,
NavItem,
NavLink,
} from '../../molecules';
import styles from './site-footer.module.scss';
export type FooterLinks = {
id: string;
href: string;
label: string;
};
export type SiteFooterProps = {
/**
* Set additional classnames to the back to top button.
*/
backToTopClassName?: BackToTopProps['className'];
/**
* Set additional classnames to the footer element.
*/
className?: string;
/**
* Set the copyright information.
*/
copyright: CopyrightProps;
/**
* The footer nav items.
*/
navItems?: FooterLinks[];
/**
* An element id (without hashtag) used as anchor for back to top button.
*/
topId: string;
};
/**
* SiteFooter component
*
* Renders a footer with copyright and nav;
*/
export const SiteFooter: FC<SiteFooterProps> = ({
backToTopClassName,
className = '',
copyright,
navItems,
topId,
}) => {
const intl = useIntl();
const ariaLabel = intl.formatMessage({
defaultMessage: 'Footer',
description: 'SiteFooter: an accessible name for the footer nav',
id: 'pRzkFR',
});
const backToTop = intl.formatMessage({
defaultMessage: 'Back to top',
description: 'SiteFooter: an accessible name for the back to top button',
id: 'OHvb01',
});
const backToTopAnchor = `#${topId}`;
const footerClass = `${styles.wrapper} ${className}`;
const btnClass = `${styles['back-to-top']} ${backToTopClassName}`;
return (
<Footer className={footerClass}>
<Copyright
dates={copyright.dates}
icon={copyright.icon}
owner={copyright.owner}
/>
{navItems ? (
<NavList aria-label={ariaLabel} className={styles.nav} isInline>
{navItems.map(({ id, ...link }) => (
<NavItem key={id}>
<NavLink {...link} />
</NavItem>
))}
</NavList>
) : null}
<BackToTop
anchor={backToTopAnchor}
className={btnClass}
label={backToTop}
/>
</Footer>
);
};
|