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”- 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.
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.