FooterStub
ImplementedTicket-stub footer (HV2 / R7, ADR-060): dark brand surface with a plain top edge, link columns, one optional 88x117 stamp and the newsletter slot (D11 / O6, no form). The tear-off edge device was retired on 2026-10-27 (ADR-067 §3) — the top edge is a straight line and the surface is solid. The slot renders the inert disabled field by default; with a ctaLabel it renders a trigger button that dispatches the 'ep:newsletter-open' DOM event (ADR-069 / D17). Link rule: href renders an anchor, disabled renders inert aria-disabled text, omitted renders nothing — the footer never ships a dead link. In 2026 (ADR-077) the footer gains additive persona slots — a personaBand chip nav, social SocialIconButtons, app-store pills and the legal bottom bar — each opt-in and byte-identical to the legacy layout when omitted.
components/organisms/FooterStub/FooterStub.tsxProps
columnsFooterStubColumn[]—Link blocks — { title, links: FooterStubLink[] }. Each block is a labelled nav with a ul.
signoff{ brand: string; legal?: string; year: number }—Brand line, optional legal line and the copyright year.
personaBand{ heading: string; links: FooterStubLink[] }—Persona chip band (ADR-077 Decision #3) rendered above the columns: labelled nav of rounded chip links. FooterLink semantics — disabled rows stay inert, external rows open a new tab.
socialFooterStubSocialLink[]—Social profiles in the right rail, above the newsletter block — one SocialIconButton (44px tap floor, required accessible label) per { href, label, icon }.
socialHeadingstring—Accessible label of the social list (aria-label on the ul).
appLinks{ heading?: string; links: FooterStubAppLink[] }—App-store pills under the newsletter block (ADR-077 Decision #6 — token-styled text pills; official badge SVGs are a Phase-2 swap behind the same slot). Absolute http(s) hrefs open a new tab.
legalLinksFooterStubLink[]—Bottom legal bar (ADR-077 Decision #2): border-top bar after the grid with the signoff.legal line, a © line and the legal links — the only surface where legal links may live. Omit to keep the legacy layout untouched.
taglinesignoff.tagline — string—Optional tagline under the brand wordmark (text-ep-sm muted), before the legal paragraph. Absent → nothing renders.
stamp{ src: string; alt: string } | null—Optional 3:4 stamp (88x117), e.g. the active hero cover.
newsletterFooterStubNewsletter—Newsletter slot (label, placeholder, submitLabel + optional ctaLabel / disabled). Without ctaLabel (or with disabled) it renders the inert disabled field with no form; with ctaLabel it renders a trigger button that dispatches the 'ep:newsletter-open' DOM event.
classNamestring—Additional CSS classes on the footer.
<FooterStub />