import { Footer } from '@uhg-abyss/web/ui/Footer';Variants
The default variant of Footer has a dark blue background and white text. Use 'alt' for a light color scheme with dark text.
Footer.Upper
For additional customization, use Footer.Upper as a slot that goes above the main footer.
Footer.MainContent
The main content of the footer is wrapped in Footer.MainContent.
Footer.Brandmark
There are two optional locations to add a logo to the footer. Subcomponent Footer.Brandmark is the upper left location, while the prop brandmark on Footer.SubFooter is in the bottom right.
Social
Footer.Social adds a section on the right of the footer dedicated to social media links. There are two ways to utilize this section: the predefined layout or a custom layout.
Predefined layout
The predefined layout is a basic layout with space for icon links and an optional site security image. To use this option, provide the following props to Footer.Social:
{ title?: string; headingLevel?: 1 | 2 | 3 | 4 | 5 | 6; icons?: Array<{ icon: string | { icon: string; variant: 'filled' | 'outlined' } | React.ReactElement; href: string; title: string; }>; securityImage?: string;}title: The title of the social media section.headingLevel: The heading level to use for the title. Default is2.icons: An array of objects with the following properties:icon: The icon to display. Use a string of an object with theiconandvariantvalues to use an IconSymbol. Use aReactElementto provide a custom icon.href: The URL the icon links to.title: The accessible title of the icon link.
securityImage: An optional image to display at the bottom of the social media section.
Custom layout
Footer.Social also accepts a ReactNode for custom layouts. Below is an example with a custom section:
Footer.Sections
Footer.Sections is a container for Footer.Section components. It allows for the prop spreadSections to be passed down to control the alignment of the sections. Default is set to true. When false, content is left-aligned.
Footer.Section
Each individual section is wrapped in Footer.Section. Use the title prop to add a title to the footer section container.
For accessibility purposes, section titles are implemented as HTML headers—<h2> elements by default. Use the headingLevel prop to change the heading level.
Footer.Link
The Footer.Link sub-component leverages props from the Link component. Find additional resources on our Link page.
Use the href prop to set the URL of the link.
Use the onClick prop to trigger a custom function when the footer link title is clicked.
Use the openNewWindow prop to specify whether links open in a new window. openNewWindow is false for relative links. Absolute links will open in a new window.
Footer.SubFooter
To customize the sub-footer, use the Footer.SubFooter sub-component. This sub-component accepts children of type React.ReactNode, similar to Footer.Upper, or the following props:
{ copyright?: string; links?: Array<{ label: string, href: string }>; bottomText?: string | React.ReactNode; brandmark?: React.ReactNode; name?: string;}copyright: The text to display in the copyright section.links: An array of objects with the following properties:label: The text of the link.href: The URL the link points to.
bottomText: Text to display below the copyright.brandmark: A logo to display in the sub-footer.name: The name of the sub-footer for accessibility purposes.
Sub-footer copyright
Use the copyright prop to change the title of the copyright section.
Sub-footer bottom text
Use the bottomText prop to add content below the copyright text.
Sub-footer links
Use the links prop to add the sub-footer link array. Use href to set the link to a different page, and use label to set the descriptive text for the href.
Footer name and sub-footer name
Footer.Sectionss prop footerName and Footer.SubFooters name are used for accessibility purposes. If you have more than one footer on a page, footerName and name can help differentiate them for screen readers.
Footer Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
bottomFixed | boolean | false | - | If true, the Footer will be fixed to the bottom of the page |
children | React.ReactNode | - | - | The children of the Footer |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
footerRootTag | string | 'footer' | - | The HTML element to render the footer root element as |
fullWidth | boolean | false | - | If true, the Footer will take up the full width of the page |
variant | "default" | "alt" | 'default' | - | The variant of the Footer |
Footer.Upper Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | The content of the upper footer | |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
Below are the link(s) to the relevant GitHub type files:
Footer.MainContent Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | The main content of the footer | |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
Below are the link(s) to the relevant GitHub type files:
Footer.Brandmark Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | The brandmark content (logo, image, etc) | |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
inSubFooter | boolean | false | - | Whether to render in sub-footer |
Below are the link(s) to the relevant GitHub type files:
Footer.Sections Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | The main content of the footer | |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
footerLinksTag | string | 'nav' | - | The HTML element to render the footer links container element as |
footerName | string | '' | - | The ARIA label for the Footer |
spreadSections | boolean | true | - | If true, the section column content will be spread across the Footer container. This is only recommended when using four or more section columns. |
Below are the link(s) to the relevant GitHub type files:
Footer.Section Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | - | The children of the FooterSection |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
headingLevel | 1 | 2 | 3 | 4 | 5 | 6 | 2 | - | Heading level of the FooterSection title |
title | string | - | - | The title of the FooterSection |
Below are the link(s) to the relevant GitHub type files:
Footer.Link Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
afterIcon | "function" | "article" | "code" | "details" | "html" | "iframe" | "input" | "label" | "link" | "map" | "menu" | "output" | "search" | "script" | "select" | "style" | "table" | "title" | ... 3567 more ... | { ...; } | - | - | The IconSymbol to insert at the end of the Link |
beforeIcon | "function" | "article" | "code" | "details" | "html" | "iframe" | "input" | "label" | "link" | "map" | "menu" | "output" | "search" | "script" | "select" | "style" | "table" | "title" | ... 3567 more ... | { ...; } | - | - | The IconSymbol to insert at the start of the Link |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
fontWeight | "regular" | "normal" | "$normal" | "medium" | "$medium" | "bold" | "$bold" | 'medium' | - | The font weight of the Link |
hideIcon | boolean | false | - | If true, the "opens in new window" icon will be hidden |
href | string | - | - | The href to navigate to |
isActive | boolean | - | - | If true, the Link is considered the active route |
isDarkMode | boolean | false | - | If true, use dark mode styles |
isStandardAnchor | boolean | false | - | If true, ignore router and external Link checks |
onClick | (event: React.MouseEvent<HTMLElement, MouseEvent>) => void | - | - | Callback function executed when the Link is clicked |
openNewWindow | boolean | false | - | If true, the Link opens in a new window. By default, external links will open in a new window. |
routerComponent | React.ComponentType<any> | - | - | Custom router component to use for client-side navigation (e.g., Next.js Link, Gatsby Link, etc.) |
size | "xs" | "$xs" | "sm" | "$sm" | "md" | "$md" | "lg" | "$lg" | 'md' | - | The font size of the Link |
variant | "default" | "underlined" | "alt" | "alt-underlined" | 'default' | - | The visual variant of the Link |
Below are the link(s) to the relevant GitHub type files:
Footer.Social Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
children | React.ReactNode | - | - | Custom social content, in place of using props from Footer.Social |
className | string | - | - | CSS class name to apply to each element within the component |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
headingLevel | 1 | 2 | 3 | 4 | 5 | 6 | - | - | Custom heading level for the social section title |
icons | SocialIconConfig[] | - | - | Icons and links for social media |
securityImage | React.ReactNode | - | - | Optional security/certification image |
title | React.ReactNode | - | - | Title for the social links section |
Below are the link(s) to the relevant GitHub type files:
Footer.SubFooter Props
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
bottomText | React.ReactNode | - | - | Additional text below copyright |
brandmark | React.ReactNode | - | - | Brandmark to be placed in the sub-footer |
children | React.ReactNode | - | - | Custom children instead of using props |
className | string | - | - | CSS class name to apply to each element within the component |
copyright | string | - | - | Copyright text. Note that the copyright symbol and year are automatically prepended. |
css | Abyss.CSSProperties | Partial<Record<`abyss-${T}`, Abyss.CSSProperties>> | - | - | Object containing CSS styling to apply; uses the classes listed in the "Integration" tab of the component's documentation |
data-testid | string | - | - | Suffix used to create a unique ID used for automated testing |
disableDefaultProviderProps | boolean | false | - | If set to true, the component will not use the DefaultPropsProvider values. If you aren’t using the DefaultPropsProvider, this prop can be ignored. |
links | FooterSubFooterLink[] | - | - | Array of link objects |
name | string | 'sub footer' | - | The ARIA label for the sub-footer |
Below are the link(s) to the relevant GitHub type files:
Footer Classes
| Class Name | Description |
|---|---|
| .abyss-footer-root | Footer root |
| .abyss-footer-container | Footer container |
| .abyss-footer-fixed | Footer fixed position |
Footer.Upper Classes
| Class Name | Description |
|---|---|
| .abyss-footer-upper-container | Container element for upper footer content |
Footer.MainContent Classes
| Class Name | Description |
|---|---|
| .abyss-footer-main-container | Container element for main footer content |
Footer.Brandmark Classes
| Class Name | Description |
|---|---|
| .abyss-footer-brandmark-container | Container for the brandmark |
Footer.Sections Classes
| Class Name | Description |
|---|---|
| .abyss-footer-links | Container element for list of Footer.Link |
Footer.Section Classes
| Class Name | Description |
|---|---|
| .abyss-footer-section | Footer section element |
| .abyss-footer-section-title | Footer section title |
| .abyss-footer-list-container | Footer list section |
Footer.Link Classes
| Class Name | Description |
|---|---|
| .abyss-footer-link-item | Link item container |
| .abyss-footer-link | Link item |
Footer.Social Classes
| Class Name | Description |
|---|---|
| .abyss-footer-social-container | Container for social section |
| .abyss-footer-social-title | Title for social section |
| .abyss-footer-social-link | Container for linked social icons |
Footer.SubFooter Classes
| Class Name | Description |
|---|---|
| .abyss-footer-sub-brandmark-container | Brandmark container for sub-footer |
| .abyss-footer-copyright-container | Sub-footer copyright container |
| .abyss-footer-copyright | Sub-footer copyright text |
| .abyss-footer-bottom-text | Sub-footer text below copyright |
| .abyss-footer-sub-wrapper | Sub-footer wrapper |
| .abyss-footer-sub-nav | Sub-footer navigation container |
| .abyss-footer-sub-list | Sub-footer link list |
| .abyss-footer-sub-link | Sub-footer link |
| .abyss-footer-sub-divider | Sub-footer link divider |
| .abyss-footer-sub-footnotes | Sub-footer footnotes - copyright and links |
Keyboard Interactions
| Key | Description |
|---|---|
| Tab | Moves focus to the next focusable element; all focusable elements in the footer are included in the page Tab sequence. |
| Shift + Tab | Moves focus to the previous focusable element; all focusable elements in the footer are included in the page Tab sequence. |
| Enter | When focus is on the link element, pressing Enter will take the user to a separate page. |
Component Tokens
Note: Click on the token row to copy the token to your clipboard.
Footer Tokens
| Token Name | Value | |
|---|---|---|
| footer.color.border.separator.dark | #FFFFFF | |
| footer.color.border.separator.light | #4B4D4F | |
| footer.color.border.top.container.dark | #002677 | |
| footer.color.border.top.container.light | #FFFFFF | |
| footer.color.surface.container.dark | #002677 | |
| footer.color.surface.container.light | #FFFFFF | |
| footer.border-width.separator | 1px | |
| footer.border-width.top.container | 2px | |
| footer.spacing.gap.horizontal.content.web | 48px | |
| footer.spacing.gap.vertical.bottom-content | 24px | |
| footer.spacing.gap.vertical.content.mobile | 48px | |
| footer.spacing.padding.bottom.container | 16px | |
| footer.spacing.padding.horizontal.container.mobile | 32px | |
| footer.spacing.padding.horizontal.container.web | 48px | |
| footer.spacing.padding.top.container | 32px |
Footnote Tokens
| Token Name | Value | |
|---|---|---|
| footer-footnote.color.border.separator.dark | #FFFFFF | |
| footer-footnote.color.border.separator.light | #4B4D4F | |
| footer-footnote.color.text.copyright.dark | #FFFFFF | |
| footer-footnote.color.text.copyright.light | #4B4D4F | |
| footer-footnote.spacing.gap.horizontal.container.web | 80px | |
| footer-footnote.spacing.gap.horizontal.copyright | 8px | |
| footer-footnote.spacing.gap.horizontal.links.web | 8px | |
| footer-footnote.spacing.gap.horizontal.right-content.web | 24px | |
| footer-footnote.spacing.gap.vertical.container.mobile | 12px | |
| footer-footnote.spacing.gap.vertical.links.mobile | 8px |
Link Tokens
| Token Name | Value | |
|---|---|---|
| footer-link.color.icon.alt.active | #E5E5E6 | |
| footer-link.color.icon.alt.hover | #F3F3F3 | |
| footer-link.color.icon.alt.rest | #FFFFFF | |
| footer-link.color.icon.default.active | #000000 | |
| footer-link.color.icon.default.hover | #323334 | |
| footer-link.color.icon.default.rest | #4B4D4F | |
| footer-link.color.icon.disabled | #7D7F81 | |
| footer-link.color.text.alt.active | #E5E5E6 | |
| footer-link.color.text.alt.hover | #F3F3F3 | |
| footer-link.color.text.alt.rest | #FFFFFF | |
| footer-link.color.text.default.active | #000000 | |
| footer-link.color.text.default.hover | #323334 | |
| footer-link.color.text.default.rest | #4B4D4F | |
| footer-link.color.text.disabled | #7D7F81 | |
| footer-link.sizing.all.icon | 16px | |
| footer-link.spacing.gap.horizontal.label | 4px |
Sections Tokens
| Token Name | Value | |
|---|---|---|
| footer-sections.color.text.heading.light | #4B4D4F | |
| footer-sections.color.text.heading.dark | #FFFFFF | |
| footer-sections.color.icon.social.light | #4B4D4F | |
| footer-sections.color.icon.social.dark | #FFFFFF | |
| footer-sections.sizing.all.icon | 24px | |
| footer-sections.spacing.gap.horizontal.container.web | 48px | |
| footer-sections.spacing.gap.horizontal.social-icons | 8px | |
| footer-sections.spacing.gap.vertical.columns | 8px | |
| footer-sections.spacing.gap.vertical.container.mobile | 48px |