Alternate Content
Alternate Content is the canonical pairing of a media frame with a list of downloadable assets, side by side. It composes Split Content, Frame, and Asset Download into a single recipe — no Alternate Content-specific code beyond the composition.
Alternate Content pairs a copy pane with a media frame, side by side. The copy pane carries the narrative — label, headline, description, downloadable assets, primary actions — while the frame holds an image or video. It’s the visual recipe behind brochure modules and similar marketing surfaces.
Anatomy
Section titled “Anatomy”Label
This is a headline
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.
- Copy pane
- Headline
- Asset Download list
- Action buttons
- Media frame
When to use it
Section titled “When to use it”Use Alternate Content when:
- An image or video frames a list of related downloads (a vehicle hero alongside its brochure and spec sheet).
- The page needs both a visual anchor and concrete file actions side by side.
- The composition is meaningful enough to deserve a dedicated module rather than a freeform layout.
Avoid Alternate Content when:
- The panes need different basis ratios (not 50/50) — use Split Content directly with whatever pane content fits.
- The content shape doesn’t fit a paired copy/media frame.
Properties
Section titled “Properties”Alternate Content is composed, not bespoke. It wires three existing primitives together.
Split Content layout
The layout primitive — equal-basis panes that stack at narrow container widths and sit side-by-side at wide ones. The container query handles the responsive flip without viewport media queries, so the module works inside sidebars and modals too.
Copy pane
Carries label, headline, description, a list of Asset Download items, and action buttons. Uses standard typography utilities and components — no new classes — so editorial wording slots straight in.
Media frame
The visual side, built on the Frame component. Optionally supports media controls overlaid in the top-right corner for play/pause behaviour.
Platform considerations
Section titled “Platform considerations”Desktop
Both panes sit side-by-side with equal basis. Keep the copy length proportional to the media height so neither pane feels stretched.
Tablet
Same side-by-side layout at wider tablet widths. Narrower tablet contexts trigger the stacked layout via the container query, with the copy pane on top.
Mobile
The two panes stack vertically — copy first, frame second. Source order matches visual order so the reading flow holds whether the layout is stacked or side-by-side.
Best practices
Section titled “Best practices”Compose the module from its three primitives — never override their behaviour from this level.
Do
Keep source order copy-first then frame so the reading order matches the visual order in both layouts, let Asset Download rows take their accessible name from the visible text, and lean on the Split Content container query rather than a viewport media query so the responsive flip works inside narrow containers.
Don't
Don’t swap source order with CSS order to flip the panes visually, don’t reach for Alternate Content when the panes need uneven basis ratios (use Split Content directly), and don’t introduce viewport media queries — they’d break the container-driven behaviour the module relies on.
Content guidelines
Section titled “Content guidelines”The copy pane carries a label, headline, short description, and the download list — keep each piece short enough that the pane stays balanced with the media frame. The headline should name the asset the visual represents (“New Yaris brochure”), the description should add a single sentence of context, and the download labels should lead with the most identifying word so each row scans on its own. Action buttons sit at the bottom of the copy pane — use verb-led labels (“Download brochure”, “Configure your car”) so the call to action reads clearly.
Styles
Section titled “Styles”The module is pure composition. Wrap a copy pane (label, headline, description, Asset Download, action buttons) and a Frame in Split Content. No new classes, no Alternate Content–specific CSS.
<div class="tng-split-content"> <div class="tng-stack gap-5xl"> <div class="tng-stack gap-3xl"> <div class="tng-stack gap-2xl"> <p class="tng-text-body" style="text-transform: uppercase"> Label </p> <h3 class="tng-text-title is-6">This is a headline</h3> </div> <p class="tng-text-body"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore. </p> </div> <ul class="tng-asset-download align-self-stretch" role="list"> <li> <a class="fg-default" href="#" download> <div> <div class="tng-overflow-ellipsis"> Download Brochure <span class="fg-muted">.JPG</span> </div> <div class="fg-muted">100 MB</div> </div> <i class="tng-icon icon-download" aria-hidden="true"></i> </a> </li> <li> <a class="fg-default" href="#" download> <div> <div class="tng-overflow-ellipsis"> Download Brochure <span class="fg-muted">.JPG</span> </div> <div class="fg-muted">100 MB</div> </div> <i class="tng-icon icon-download" aria-hidden="true"></i> </a> </li> </ul> <div class="tng-stack gap-xl align-self-start align-items-stretch" > <button class="tng-button is-primary">Primary Button</button> <button class="tng-button is-secondary"> Secondary Button </button> </div> </div> <div> <div class="tng-frame p-relative"> <div class="tng-slot"></div> <div class="p-absolute at-top-right inset-xl | tng-stack gap-xl" > <button class="tng-media-button is-sm" aria-label="Play"> <i class="tng-icon icon-player" aria-hidden="true"></i> </button> <button class="tng-media-button is-sm" aria-label="Mute"> <i class="tng-icon icon-sound" aria-hidden="true"></i> </button> </div> </div> </div></div>Label
This is a headline
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.
Label
This is a headline
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.
Alternate Content is a composition, not a component — it wires Split Content, Asset Download, and Frame together, and each part owns its own accessibility. The notes below cover only the seams the composition introduces: the reading order of the two panes and the asset list’s place in the page. It meets WCAG 2.1 AA.
For designers
Section titled “For designers”- Reading order matches the narrative. Source order runs the copy pane first — label, headline, description, downloads — then the media frame, so the reading flow follows the story in both the side-by-side and stacked layouts. Don’t flip the panes against that order visually. Source: WCAG 1.3.2 Meaningful Sequence.
- The split flips at a container-query threshold, not the viewport. A surface placed inside a narrow container (a sidebar, a half-width modal, a card) stacks the panes even on a wide screen, so test the pattern in the actual surface it ships in and confirm the stacked reading order still holds.
- Copy, download rows, and any media controls must maintain accessible contrast on every supported surface. Source: WCAG 1.4.3 Contrast (Minimum).
- Never convey meaning by colour alone on the composed surface — pair it with text, an icon, or a shape. Source: WCAG 1.4.1 Use of Color.
- Focus styles must stay visible, meet contrast requirements on every supported surface, and be clearly distinguishable from hover. Source: WCAG 2.4.7 Focus Visible.
For developers
Section titled “For developers”Alternate Content is pure composition, so its developer guidance is about the seams — the DOM order of the panes and the asset list’s place in the page — not per-element ARIA, which each part already owns.
Source order is reading order: keep the copy pane before the frame in the DOM and let Split Content’s container query drive the stacking. Never reorder the panes with CSS order — that splits the visual order from the DOM order screen-reader and keyboard users follow. Source: WCAG 1.3.2 Meaningful Sequence.
Don’t wrap the asset list in a landmark. The <ul class="tng-asset-download"> is part of the module surface, not a navigation landmark, so don’t add role="region" or a <section aria-labelledby> around it unless the surrounding page genuinely needs the list discoverable on its own. Keep the accessible name at the item level too: each row announces from its visible link text (or an aria-label on the item where the text isn’t self-describing) at the point of action, so a summarising aria-label on the <ul> is redundant noise the list semantics and per-item names already cover.
Because every named element belongs to a part — Asset Download rows, the Frame, and any media-control buttons all carry their own accessible names from their own components — Alternate Content introduces no module-level naming of its own. There is no per-element name story to document here, so this tab has no Labelling elements section. Source: WCAG 4.1.2 Name, Role, Value.