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); the frame holds an image or video. It’s the visual recipe behind brochure modulesAnatomy
An Alternate Content surface is composed, not bespoke. The module wires together:
- Split Content as the layout primitive — equal-basis panes that stack at narrow container widths and sit side-by-side at wide ones.
- Copy pane — label, headline, description, a list of Asset Download items, and action buttons. All standard typography utilities and components — no new classes.
- Frame — the media surface, optionally with media controls overlaid in the top-right.
When to use it
Section titled “When to use it”Reach for Alternate Content when:
- A piece of imagery or video frames a list of related downloads (e.g. 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.
If the panes need different basis (not 50/50), or the content fits a different shape, this module is the wrong reach — use Split Content directly with whatever pane content fits.
Quick summary of accessibility & consistency
Section titled “Quick summary of accessibility & consistency”- Source order: copy pane first, frame second. The reading order matches the visual order in both stacked and side-by-side layouts — no
orderswapping. - Asset Download rows take their accessible name from their visible text (
Download Brochure .JPG 100 MB); noaria-labelis needed unless a specific surface calls for a different announcement. - The Split Content container query handles the responsive flip. Don’t override it with a viewport media query — surfaces inside narrower containers (sidebars, modals) need the container behaviour.
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-5">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.
Accessibility
Section titled “Accessibility”Alternate Content composes Split Content and Asset Download — accessibility is owned by the parts. The notes below address only the seams between them.
For Design
Section titled “For Design”Reading order matches narrative
Section titled “Reading order matches narrative”Designers default to “image left, list right” because that’s what reads naturally in LTR. Stick to it: source order should be frame first, list second, even if a particular surface looks balanced flipped.
Container width drives stacking
Section titled “Container width drives stacking”The split flips at a container-query threshold, not the viewport. Surfaces placed inside narrow containers (a sidebar, a half-width modal, a card) will stack the panes even on a wide screen. Test the pattern in the actual surface it ships in.
For Developers
Section titled “For Developers”Don’t wrap the list in a region
Section titled “Don’t wrap the list in a region”The asset list is part of the Alternate Content surface, not a navigation landmark. Don’t add role="region" or <section aria-labelledby> around the <ol> unless the surrounding page actually needs the list to be discoverable as a landmark.
Keep aria-label on the items, not the list
Section titled “Keep aria-label on the items, not the list”Per-item announcements (“Download Brochure, PDF, 100 megabytes”) give users the info they need at the point of action. Adding an aria-label on the <ol> to summarise the list is redundant noise — the list semantics + per-item labels are enough.