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.
$ 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
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
asideslot.
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-layoutwithal-heading/al-text-block/al-buttonas the primitives instead of wrappingal-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
actionsslot 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-widthis the knob for that, not a manual line break.
DON’T
- Do not nest a second heading of display rank inside the
asideslot; the composition already has exactly one loudest element and a rival flattens it. - Do not put anything a reader must act on into the
chipsslot. The reference treats it as annotation and marks itaria-hidden.
ACCESSIBILITY IN PRACTICE
- The texture and the glyph canvas are decorative and marked
aria-hidden; the canvas also stops animating underprefers-reduced-motion: reduce, so nothing here needs a motion opt-out from the consumer. - The
headingprop renders the page'sh1. Do not also place anh1in 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 PARITY
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.
ACCESSIBILITY
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.
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.
INSTALL
import '@southleft/sl-web-components/components/hero';
API — 3 PROPS
SLOTS
EVENTS
THIS COMPONENT DECLARES NO EVENTS IN THE MANIFEST.
CSS PARTS
CSS CUSTOM PROPERTIES
SOURCE — components/hero/hero.ts · Organisms/Hero