Skip to content

Footer

Site footer with auto-fitting multi-column link groups, optional logo, social links, and a bottom bar.

Import

import { Footer } from "@hyzer-labs/ui"

Demo

default fills with the muted surface (--hz-color-surface-muted). minimal is transparent with tighter padding, so whatever sits behind it shows through. bordered is a separate boolean prop (a top hairline), so it composes with either variant. Each demo sits on a tinted backdrop that is not part of Footer, so minimal has something to show through. Each column's links reuses Nav's NavItem shape (label/href/external/ariaCurrent).

const columns: FooterColumn[] = [
	{
		title: 'Product',
		links: [{ label: 'Components', href: '/components' } /* … */]
	},
	{
		title: 'Resources',
		links: [{ label: 'GitHub', href: 'https://github.com/hyzerlabs/ui', external: true } /* … */]
	},
	{ title: 'Company', links: [{ label: 'About', href: '/about' } /* … */] }
];

<Footer {columns} headingLevel={3} />

Props

NameTypeDefaultNote
columnsFooterColumn[]Required. See FooterColumn below.
variant'default' | 'minimal''default'
borderedbooleanfalseTop hairline — composes with any variant.
linkVariant'default' | 'subtle' | 'nav''subtle'Passed through to every column Link.
headingLevel2 | 3 | 4 | 5 | 62Heading element for column titles — match your page hierarchy.
logoSnippetRendered above the columns.
socialSnippetIcon-link row rendered under the columns.
bottomSnippetBottom bar with a top hairline — copyright, legal links.
classstringMerged after the hz-footer class.

FooterColumn

NameTypeDefaultNote
titlestringRequired. Labels the column’s nav landmark.
linksNavItem[]Required. label/href/external/ariaCurrent apply — see NavItem on the Nav page.

Theme hooks

What this component promises your CSS. The reference theme styles exactly these — from @layer hz-theme, so your unlayered rules win. See Styling Components for the how.

Root class: .hz-footer

Data attributes

HookValuesStyles
data-variant'default' | 'minimal'minimal drops the padding and goes transparent. Default default.
data-borderedpresent when borderedTop hairline. A prop, not a variant — it composes with either surface.

Custom properties

HookValuesStyles
--hz-footer-col-min<length> — default 12remMinimum column width for the auto-fit link grid: how narrow a column may get before the row reflows. No media queries involved — this is the whole knob.

Part classes

HookValuesStyles
.hz-footer-logochild elementWrapper for the logo snippet.
.hz-footer-columnson a GridRides through Grid’s class prop. The auto-fit override hangs off it — and lands on .hz-grid-layout, since that is where Grid does its layout.
.hz-footer-columnchild elementOne column’s nav landmark.
.hz-footer-headingchild elementA column heading.
.hz-footer-socialchild elementWrapper for the social snippet.
.hz-footer-bottomchild elementThe bottom bar.

Accessibility

Each column is a <nav> landmark whose aria-label is its title. The visible heading repeats that text, but the heading is not what names the landmark. Set headingLevel to match your page hierarchy. Links use the Link component, and icon-only social links need an ariaLabel.