COMPONENTS / ORGANISMS / al-hero← ALL COMPONENTS

Hero

<al-hero>betaOPEN IN FIGMA ↗

The HOMEPAGE hero — a full-bleed landing composition: the brand's grid texture behind a kicker and a display headline, then a two-column split with the lead copy and actions on the left and a supporting panel on the right.

PLAYGROUND0 CONTROLS
PREVIEW / al-hero / SOUTHLEFT
Loading preview
Book a call See how we work
$ npx story-ui init
 design system detected
 tokens parsed · 214 components indexed
 MCP server connected
 "build a pricing page from our system"
agent composing layout… done in 9s
— every component from your library. zero rogue divs.
CODE — HTML

Guidance

AUTHORED · CITED TO SOURCE

The homepage opening. A full-bleed landing composition: the brand's grid texture behind a kicker and a display headline, then a two-column split with the lead copy and actions on the left and a supporting panel on the right. It is the one component allowed to set the visual temperature of a page.

WHEN TO USE

  • The page is a landing page and this is its first screen, the thing a visitor sees before they have decided to read anything.
  • You need the brand's grid texture and glyph field as the backdrop, rather than a plain surface a section could sit on.
  • There is a supporting artefact worth showing beside the copy (a terminal panel, a product shot, a live demo), which goes in the aside slot.

WHEN NOT TO USE

  • The composition you need is "headline spans the full measure, two columns start below it". This component pairs its content column WITH the aside, so the headline cannot span the full width — southleft.com's own homepage hero is that full-width shape, and it deliberately composes it from al-layout with al-heading/al-text-block/al-button as the primitives instead of wrapping al-hero ("stop fighting the component"). Reaching for this component there means fighting its anatomy, not configuring it.
  • This is an interior page and you want a title band, not a landing composition. The band shape exists as its own component and does not carry the texture.USE PAGE-HERO →
  • You are opening a section in the middle of a page rather than the page itself. A section wants a rule, a label and a heading, not a full-bleed composition.USE SECTION-HEADER →
  • What you actually need is the closing ask at the bottom of the page. That is a different component with its own padding and a centred stack.USE CTA-BAND →

DO

  • Put the primary and secondary action in the actions slot and let the component space them; it is a row that wraps on its own.
  • Keep the headline near 18 characters per line at the display size. --al-hero-heading-max-width is the knob for that, not a manual line break.

DON’T

  • Do not nest a second heading of display rank inside the aside slot; the composition already has exactly one loudest element and a rival flattens it.
  • Do not put anything a reader must act on into the chips slot. The reference treats it as annotation and marks it aria-hidden.

ACCESSIBILITY IN PRACTICE

  • The texture and the glyph canvas are decorative and marked aria-hidden; the canvas also stops animating under prefers-reduced-motion: reduce, so nothing here needs a motion opt-out from the consumer.
  • The heading prop renders the page's h1. Do not also place an h1 in a slot, or the page has two and the document outline stops being navigable.

CONTENT GUIDELINES

  • The kicker is a machine-ish label in angle brackets by convention, not a sentence. It reads as a tag on the section rather than as copy.
  • The lead is one paragraph. If it needs two, the second belongs further down the page, because nothing below the fold is competing with it here.

WHERE THIS CAME FROM

  • libs/sl-web-components/components/hero/hero.tsThe component this guidance describes.
  • apps/southleft/src/styles/layout.cssThe flagship homepage's own hero documents why it composes the full-width-headline shape from al-layout rather than this component (its .sl-hero comment, "Not wrapped in al-hero"); the first when-not-to-use entry restates that call so docs and site cannot contradict each other.
  • libs/sl-web-components/components/hero/hero.tsThe glyph canvas stops animating under a reduced-motion preference; the accessibility note depends on it.
  • libs/sl-web-components/components/hero/hero.tsThe decorative texture layer the accessibility note refers to.

Each line above names a file and a literal string that must still appear in it.pnpm gate:guidance re-reads them from this built page, so guidance that has stopped being true fails a check rather than misleading you.

FIGMA AHEADSouthleft Design SystemFIGMA SET · Hero

The Figma set changed since the last confirmed sync — the code is behind.

DECIDED BY
CONTRACT DIFF
FIGMA SIDE
OBSERVED
LAST CONFIRMED SYNC
2026-08-28
PUBLIC SURFACE
3 ATTR · 4 SLOT · 0 EVENT · 7 PART

The component’s public surface — attributes and their value sets, slots, events, CSS parts and custom properties, from the manifest — compared against the Figma set’s property definitions.

Measured by axe on this documentation site’s own preview of the default story — @southleft/sl-web-components has no Storybook in the measured set.

CHECKEVIDENCEDETAILRESULT
Default stateAXEDefaultPASS
Advanced statesAXEThe docs page renders the default story only. This component’s other stories have not been measured.NOT MEASURED
Screen readerMANUALNo screen-reader pass has been recorded for this component.NOT RECORDED
Keyboard navigationINTERACTION TESTSNo interaction tests and no manual keyboard pass.NOT RECORDED

MEASURED 2026-09-08 · 1 STORIES · AXE WCAG2A + WCAG2AA + WCAG21A + WCAG21AA + WCAG22AA

COLOR CONTRAST0 RULES FAILING

The CI gate disables color-contrast globally (libs/al-web-components/story-fixture/src/main.ts), so its result never reaches a test run. It is enabled for this measurement, and reported here whichever way it comes out.

NO CONTRAST VIOLATIONS ACROSS THIS COMPONENT’S 1 STORIES.

import '@southleft/sl-web-components/components/hero';
PROPTYPEDEFAULT
kickerstringThe accent kicker above the headline.
headingstringThe headline. Rendered at the display scale.
leadstringThe lead paragraph in the left column.
SLOTDESCRIPTION
actionsThe CTAs, under the lead copy. Laid out as a wrapping row.
chipsThe annotation strip beneath the actions — the site's "loose tokens" row.
asideThe right-hand column. Hidden below `64rem`, where the composition collapses to one column and a supporting panel would crowd the fold.
(default)Anything extra at the end of the lead column.

THIS COMPONENT DECLARES NO EVENTS IN THE MANIFEST.

PARTDESCRIPTION
bandThe full-bleed outer band.
textureThe decorative grid layer. Hide it with `display: none` for a plain hero.
murmurThe glyph field drawn over the grid. Hide it for a plain grid.
kickerThe accent kicker.
headingThe display headline.
leadThe lead paragraph.
asideThe right-hand column wrapper.
PROPERTYDESCRIPTIONDEFAULT
--al-hero-padding-blockThe band's vertical rhythm. Defaults to `5rem`, stepping up at the `48rem` and `64rem` breakpoints.
--al-hero-measureThe content column. Defaults to `79rem`.
--al-hero-templateThe two-column track list above `64rem`. Defaults to `minmax(0, 1fr) minmax(0, 0.85fr)`.
--al-hero-heading-max-widthMeasure the headline is capped to. Defaults to `18ch`.
--sl-artifactsDensity of the glyph field, `0`–`1`. `0` silences it entirely. Defaults to `1`.

SOURCE — components/hero/hero.ts · Organisms/Hero