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.
logoSnippet—Rendered above the columns.
socialSnippet—Icon-link row rendered under the columns.
bottomSnippet—Bottom bar with a top hairline — copyright, legal links.
classstring—Merged after the hz-footer class.

Anything not listed above is forwarded as an attribute to the root element (or the native control in form components). So id, data-*, aria-*, and event handlers just work.

FooterColumn

NameTypeDefaultNote
titlestring—Required. Labels the column’s nav landmark.
linksNavItem[]—Required. Footer links are a flat list: label/href/external/ariaCurrent apply and children is ignored — see NavItem on the Nav page. For navigation with expandable sections, use a vertical Nav instead.

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 — the title is, so give every column one and keep those titles distinct from the site's main navigation label. A column with a blank title renders without a landmark or heading. Set headingLevel to match your page hierarchy. Links use the Link component, and icon-only social links need an ariaLabel.