Summary
Banner is a surface-card component used to surface a product or feature message. It can include a leading icon (slotStart), a tagline / heading / subheading text stack, an inline content slot (slotContent), an optional dismiss control (closable), and an optional CTA Button. As of v1.3 the variant property drives whether the CTA shows: promotion (text only) vs action (with button). The breakpoint property drives layout — stacking the button below the text (xs) or placing it inline to the right (md / lg).
Anatomy
- 1Banner — root container. Background bg-secondary, radius border-radius-lg (20), drop shadow shadow-bevel.
- 2slotStart — leading icon area (32×32). Depends on
Slot(sizesm). On by default. - 3tagline — caption text above the heading. Depends on
Text. - 4IconButton — dismiss control (top-right).
IconButtonsizesm, variantneutralSubtle, appearancetransparent. Shown whenclosable = true. - 5heading — primary heading text. Depends on
Text. - 6subHeading — secondary text. Depends on
Text. - 7slotContent — content slot below the subheading (progress bars, metadata, chips).
Slotsizesm. On by default. - 8Button — CTA.
Buttonvariantaccent, appearancefill, sizelg. Shown forvariant = action. - 9slotEnd — trailing slot (instance-swap). Off by default.
slotStart + a text Stack (tagline, heading, subHeading, slotContent). On md/lg the Button sits inline in the horizontal row; on xs it is a sibling stacked below. slotEnd is the last child.Properties / API
| Property | Type / values | Default | Description |
|---|---|---|---|
breakpoint | xs · md · lg | xs | Layout driver. xs stacks the CTA below the text; md places it inline right; lg uses wider gutters. |
variant | promotion · action | promotion | promotion hides the button; action shows it. New in v1.3. |
size | md · sm | md | md: 16px heading, 48px button (xs) / 36px (md). sm scales down proportionally. |
state | default · active | default | active applies a highlighted background — for selection / in-progress banners. Not a hover state. |
closable | boolean | false | Renders a dismiss IconButton at the top-right of the header row. |
slotStart | boolean | true | Toggles the 32×32 leading icon slot. Set false when no icon is needed. |
slotContent | boolean | true | Toggles the content slot below the subheading. |
slotEnd | boolean | false | Trailing slot. On xs below the button; on md after it in the same row. |
slotStartSwap | slot (instance-swap) | — | Icon, avatar or brand mark (32×32 recommended). |
slotContentSwap | slot (instance-swap) | — | Progress bars, metadata rows, chips below the subheading. |
slotEndSwap | slot (instance-swap) | — | Hidden by default; shown when slotEnd = true. |
tagline / heading / subHeading | text | — | Text content layers. |
Variants
promotion(default) — text + content, no CTA button. Informational / marketing messages without a direct action.action— shows the CTA button. Use only when a clear call-to-action is required; overuse reduces effectiveness.
States
default— standard banner on bg-secondary.active— highlighted / tinted background, driven by application logic for selection or in-progress banners.
state=active reflects app state — don’t use it as a :hover/:pressed replacement. Hover/pressed/focus/disabled belong to the embedded Button & IconButton.Sizes
md(default) — 16px heading; button 48px tall (xs) / 36px tall (md).sm— proportionally smaller, compact layout.
Breakpoints
The breakpoint prop is the primary layout driver (a discrete prop, not a CSS media query — the consumer sets it to match its container/viewport).
| Breakpoint | Button width | Button height | Button font | CTA placement |
|---|---|---|---|---|
xs | Full width (100%) | 48px | 16px Medium | Sibling of text block, stacked below |
md | Hug / inline | 36px | 14px Medium | Inside the horizontal row, right |
lg | Hug / inline | 36px | 14px Medium | Inline (as md) with wider gutters |
Button component in all cases — only position and sizing differ. No xl breakpoint is documented; button sizing is not shared between breakpoints, so reference the per-breakpoint tokens.Design tokens
Colour
| Token | Value | Usage |
|---|---|---|
| bg-secondary | #FFFFFF | Banner background (bind — never hard-code) |
| bg-accent | #3E5FFF | CTA button fill |
| border-accent | #3E5FFF | Accent border |
| text-primary | #2A2A2D | Heading |
| text-secondary | #696A6D | Tagline / subheading |
| text-primary-on-color | #FFFFFF | Button label |
Radius · spacing · type · elevation
- Radius: border-radius-lg = 20 (banner) · border-radius-full = 9999 (button pill).
- Spacing (px): 2 · 8 · 12 · 16 · 28. xs internal stack uses 16px gap + 16px padding.
- Type (Inter): subHeading = Medium 16/22 · caption = Regular 12/18.
- Elevation: shadow-bevel = drop
#0000000a0/2/8 + inner#ffffff000/0.5.
Accessibility
- The dismiss affordance is a real IconButton — expose an accessible “Close / dismiss” label.
- The CTA is a real Button sub-component and inherits its own accessibility (focus, role, label).
state=activeconveys meaning beyond colour — ensure it is announced/structured for assistive tech where it carries information.- Follow-up: explicit role, keyboard order, contrast ratios, hit-area, screen-reader behaviour.
Usage
✓ Do
- Use
variant=actiononly when a CTA is genuinely required. - Set
slotStart=falsewhen there is no leading icon. - Bind the background to bg-secondary.
- Use design tokens for button sizing & padding per breakpoint.
✕ Don't
- Don’t hard-code
#FFFFFF— it breaks dark mode. - Don’t hard-code pixel values; button sizing differs per breakpoint.
- Don’t use
state=activeas a hover replacement. - Don’t enable
slotEndonxsunless the extra height is intended.
Implementation status
Existing native implementations found in the playground repos (parity with v1.3 to be verified per platform):
ctaTitle/onCtaTap (iOS), buttonState/onBannerClick (Android); size enum is SM/MD (Android) and sm/md (macOS). The v1.3 variant = promotion/action property must be added on every platform.Changelog
- v1.317.6.2026
- Added property
variant = promotion / action. - Existing banners become
promotion; newactionexposes the CTA. - Driver: Supernova next-best-action banners.
- Added property
- v1.214.1.2026
- Added size
sm. - Renamed slots to
slotStart&slotContent. - Driver: Leap Dashboard DIP banner.
- Added size
- v1.119.12.2025
- Adjusted “closable” IconButton to use the correct
smvariant.
- Adjusted “closable” IconButton to use the correct
- v1.016.10.2025
- Initial release.
bg-glass + blur-md to bg-secondary · 1.10.2025 — close button 16→24×24, sm gap to icons.Ticket scaffold
Title: Banner v1.3 — add variant property (promotion / action) [PLATFORM]
Acceptance criteria
- Adds a
variantproperty with valuespromotion(default) andaction. - Existing banner usages default to
promotion(no behaviour change → backwards compatible). actionrenders the CTA Button (accent / fill / lg) using per-breakpoint sizing.- Breakpoint layout verified:
xsfull-width button stacked below;md/lginline. - Background bound to bg-secondary; light + dark mode verified.
- Dismiss IconButton (when
closable) has an accessible label. - Visual diff against the Figma Specification and Developer Handover frames.
Jira ticket template
Jira wiki-markup. Copy into a new issue, replace every [PLACEHOLDER], and duplicate one per platform.
h2. [PLATFORM] · Banner v1.3 — add variant property (promotion / action)
*Project / Epic* : [EPIC-KEY] Aurora AppKit · Supernova
*Issue type* : Story
*Components* : Banner · [PLATFORM]
*Labels* : aurora-appkit, supernova, design-system, banner
*Priority* : [Medium]
*Story points* : [estimate]
*Fix version* : Banner v1.3
*Sprint* : [sprint]
*Assignee* : [assignee]
h3. Background
The Supernova "next best action" work introduces a call-to-action Banner. v1.3 adds a {{variant}} property so the same component renders as a passive promotion or an actionable banner. Existing banners become {{variant = promotion}} (no behaviour change); the new {{variant = action}} exposes the CTA button.
h3. Objective
Implement Banner v1.3 on [PLATFORM]: add the {{variant}} property and the action layout, mapped to [PLATFORM] conventions, with no regression to existing promotion banners.
h3. Design source
* Figma — "Aurora AppKit · Components" -> Banner page (Specification, Developer Handover, Changelog frames)
* Handover spec — supernova-handover/banner.html
* [paste the platform-specific Figma frame link]
h3. Spec (platform-agnostic — map to [PLATFORM] idioms)
* New property {{variant}} : {{promotion}} (default) | {{action}}. promotion hides the CTA; action shows it.
* Unchanged props : {{breakpoint}} (xs | md | lg) · {{size}} (md | sm) · {{state}} (default | active) · {{closable}} · {{slotStart}} · {{slotContent}} · {{slotEnd}} (+ swaps) · {{tagline}} / {{heading}} / {{subHeading}}.
* CTA (action only) : Button variant accent · appearance fill · size lg.
* CTA per breakpoint : xs = full-width, 48 tall, stacked below text; md / lg = hug/inline, 36 tall, right of text (lg = wider gutters).
* Tokens (bind, never hard-code) : {{bg-secondary}} · {{bg-accent}} · {{text-primary}} / {{text-secondary}} · {{text-primary-on-color}} · {{border-radius-lg}} 20 · {{border-radius-full}} · {{shadow-bevel}}.
* Accessibility : CTA is a real Button (inherits focus/role/label); closable dismiss needs an accessible "Close" label.
h3. Scope
In scope : {{variant}} + action layout at xs / md / lg; default existing usages to {{promotion}}.
Out of scope : other platforms (separate tickets); Button / IconButton internals.
h3. Dependencies
* Button + IconButton available on [PLATFORM]
* Tokens for the per-breakpoint button sizing
h3. Acceptance criteria
# Given an existing banner upgraded to v1.3 with no variant set, Then it renders as {{promotion}} with no visual/behaviour change.
# Given {{variant = action}}, Then the accent/fill/lg CTA shows and fires its action.
# Given {{breakpoint = xs}}, Then the CTA is full-width below the text; given md/lg, inline to the right.
# Background is bound to {{bg-secondary}}; verified light and dark.
# When {{closable = true}}, the dismiss control exposes an accessible "Close" label.
# All sizing/spacing use tokens; button sizing is per-breakpoint (not shared).
h3. Definition of Done
* Matches the Figma Specification + Developer Handover (visual diff) at xs / md / lg, light and dark
* No hard-coded colours/sizes — Aurora tokens only
* Unit / snapshot tests updated; existing banner tests pass
* Reviewed and merged; component version bumped to v1.3; changelog updated
h3. QA / test notes
* Regression: existing promotion banners unchanged
* Toggle variant / breakpoint / closable / slots; empty slots collapse with no residual gap
* Dark mode and dynamic text sizes