OTTODesign System

Components

Promo card

A promo card is an interactive container that is used for promotional context. It is used for example on the storefront for the topic promo, brand promo or big shop promo. Promo cards are always fully interactive and only link to one target.

Configurator

LivePromo card: colours, elevation, header content, logo, tags and action signifier
Neu im ShopWohnzimmer-20 %
HTML
<oc-promo-card-v2 elevation-level="stacked" style="width:min(100%,360px)"><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" hidden="hidden"><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><oc-tag-v1 slot="tags" variant="sale">-20 %</oc-tag-v1><oc-action-signifier-v1 slot="action-signifier-header" label="Entdecken" variant="icon"></oc-action-signifier-v1></oc-promo-card-v2>

Usage

Neu im ShopWohnzimmerOTTO-12 %-20 % ExtraNeuSofas und SesselFür gemütliche Abende
LiveAnatomy
HTML
<div class="on-frame"><div style="max-width:360px;margin:0 auto">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><oc-action-signifier-v1 slot="action-signifier-header" variant="icon"></oc-action-signifier-v1><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><oc-tag-v1 slot="tags" variant="sale" size="50">-12 %</oc-tag-v1><oc-tag-v1 slot="tags" variant="sale" size="50">-20 % Extra</oc-tag-v1><oc-tag-v1 slot="tags" variant="info-primary" size="50">Neu</oc-tag-v1><span slot="footer-headline">Sofas und Sessel</span><span slot="footer-text">Für gemütliche Abende</span><oc-action-signifier-v1 slot="action-signifier-footer" variant="icon"></oc-action-signifier-v1></oc-promo-card-v2>
</div>

Variants

You can use the header or the footer with different text combinations. For the header you can also optionally add a logo. For both the header and the footer, you can optionally add an action signifier as text or icon to increase the affordability of the promo card. You can also use the inverted variant of the promo card if you want a colored background.

Headline

Wohnzimmer

Overline, headline and logo

Neu im ShopWohnzimmerOTTO
Livepromo card with header
HTML
<div class="on-frame" style="display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:start">
<p class="demo-label">Headline</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Overline, headline and logo</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>

Text

Alles fürs Kinderzimmer

Headline and text

KinderzimmerAlles zum Spielen und Träumen
Livepromo card with footer
HTML
<div class="on-frame" style="display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:start">
<p class="demo-label">Text</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text">Alles fürs Kinderzimmer</span></oc-promo-card-v2></div>
<p class="demo-label">Headline and text</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Kinderzimmer</span><span slot="footer-text">Alles zum Spielen und Träumen</span></oc-promo-card-v2></div>
Fashion DropMojo MojoDer neue Fashion Drop
Livepromo card inverted
HTML
<div class="on-frame" style="display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:start">
<oc-promo-card-v2 inverted><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Fashion Drop</span><span slot="header-headline">Mojo</span><img slot="main" src="/references/images/otto/otto-fashion-drop-mojo-06.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2>
<oc-promo-card-v2 inverted><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-fashion-drop-mojo-06.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Mojo</span><span slot="footer-text">Der neue Fashion Drop</span></oc-promo-card-v2>

In the header

Neu im ShopWohnzimmer

In the footer

KinderzimmerAlles zum Spielen
Liveaction signifier
HTML
<div class="on-frame" style="display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:start">
<p class="demo-label">In the header</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><oc-action-signifier-v1 slot="action-signifier-header" variant="text" label="Entdecken"></oc-action-signifier-v1><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">In the footer</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Kinderzimmer</span><span slot="footer-text">Alles zum Spielen</span><oc-action-signifier-v1 slot="action-signifier-footer" variant="text" label="Entdecken"></oc-action-signifier-v1></oc-promo-card-v2></div>

Behavior

States

Enabled

Neu im ShopWohnzimmer

Hover (shown)

Neu im ShopWohnzimmer

Pressed (shown)

Neu im ShopWohnzimmer

Selected

Neu im ShopWohnzimmer

Focus (shown)

Neu im ShopWohnzimmer
Livestates
HTML
<div class="on-frame" style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px 20px;align-items:start">
<p class="demo-label">Enabled</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Hover (shown)</p><oc-promo-card-v2 style="background-image:linear-gradient(var(--oc-semantic-color-overlay-hover),var(--oc-semantic-color-overlay-hover))"><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Pressed (shown)</p><oc-promo-card-v2 has-action-child-active><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Selected</p><oc-promo-card-v2><a href="#" aria-current="page" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Focus (shown)</p><oc-promo-card-v2 style="outline:2px solid var(--oc-semantic-focus-outline-color);outline-offset:2px"><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>

For information on states, refer to foundations.

Placement

If you want to arrange promo cards vertically, the recommended spacing is 40px. The recommended spacing results from the bottom spacing (24px) of the upper promo card and the top spacing (16px) of the lower promo card. If you want to arrange promo cards horizontally the recommended spacing is 16px.

Neu im ShopWohnzimmerOTTO Neu im ShopKinderzimmerOTTO

16px horizontal gap

Livehorizontal gap
HTML
<div class="on-frame"><div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Kinderzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2>
<p class="demo-label" style="text-align:center;margin-top:12px">16px horizontal gap</p></div>
Neu im ShopWohnzimmerOTTO Neu im ShopKinderzimmerOTTO

40px vertical gap (24px + 16px)

Livevertical gap
HTML
<div class="on-frame"><div class="narrow" style="margin:0 auto;display:grid;gap:40px">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:8/3;object-fit:cover"></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Kinderzimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:8/3;object-fit:cover"></oc-promo-card-v2>
<p class="demo-label" style="text-align:center;margin-top:12px">40px vertical gap (24px + 16px)</p></div>

You can use the promo card standalone or with multiple instances next to each other. When placing multiple promo cards side by side, they can either have the same height (fill-parent) or different heights (fit-content). You can also place multiple instances inside a cinema.

Sofas, Tische und Leuchten für dein Wohnzimmer. Betten, Regale und Spielzeug für dein Kinderzimmer. Alles, was kleine Entdecker glücklich macht, bequem nach Hause geliefert. Neue Bücher.
Livefit-content height
HTML
<div class="on-frame" style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;align-items:start">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text">Sofas, Tische und Leuchten für dein Wohnzimmer.</span></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text">Betten, Regale und Spielzeug für dein Kinderzimmer. Alles, was kleine Entdecker glücklich macht, bequem nach Hause geliefert.</span></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-buecher-sortiment.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text">Neue Bücher.</span></oc-promo-card-v2>
Sofas, Tische und Leuchten für dein Wohnzimmer, alles bequem nach Hause geliefert. Betten, Regale und Spielzeug für dein Kinderzimmer, alles bequem nach Hause geliefert. Krimis, Kochbücher und Kinderbücher, alles bequem nach Hause geliefert.
Livefixed height
HTML
<div class="on-frame" style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text" style="display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden">Sofas, Tische und Leuchten für dein Wohnzimmer, alles bequem nach Hause geliefert.</span></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text" style="display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden">Betten, Regale und Spielzeug für dein Kinderzimmer, alles bequem nach Hause geliefert.</span></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-buecher-sortiment.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-text" style="display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden">Krimis, Kochbücher und Kinderbücher, alles bequem nach Hause geliefert.</span></oc-promo-card-v2>
WohnzimmerSofas und Sessel KinderzimmerBetten und Regale BücherNeu im Sortiment MojoDer neue Fashion Drop BüroTische und Stühle LieferungSo kommt dein Paket
Liveinside cinema
HTML
<div class="on-frame">
<oc-cinema-v1 oc-aria-label="Wohnideen" items-per-page="4">
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Wohnzimmer</span><span slot="footer-text">Sofas und Sessel</span></oc-promo-card-v2>
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-shop-teaser-kinderzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Kinderzimmer</span><span slot="footer-text">Betten und Regale</span></oc-promo-card-v2>
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-buecher-sortiment.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Bücher</span><span slot="footer-text">Neu im Sortiment</span></oc-promo-card-v2>
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-fashion-drop-mojo-06.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Mojo</span><span slot="footer-text">Der neue Fashion Drop</span></oc-promo-card-v2>
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-campus-social-space.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Büro</span><span slot="footer-text">Tische und Stühle</span></oc-promo-card-v2>
  <oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><img slot="main" src="/references/images/otto/otto-peak2025-hermes-zustellung.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Lieferung</span><span slot="footer-text">So kommt dein Paket</span></oc-promo-card-v2>
</oc-cinema-v1>

Promo cards are placed on top of the frame (level 0) inside the canvas (level 1). Promo cards can also be placed on top of the canvas (level 1.5) as stacked promo cards. You can use stacked promo cards when you want to place a card inside a block. Therefore, stacked promo cards have a different background color (stacked background).

Default, on frame

Neu im ShopWohnzimmer

Stacked, inside a block

Neu im ShopWohnzimmer
Livedefault and stacked
HTML
<div style="display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:center" class="on-frame">
<p class="demo-label">Default, on frame</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<oc-block-v2><div class="group"><p class="demo-label">Stacked, inside a block</p><oc-promo-card-v2 elevation-level="stacked"><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div></oc-block-v2>

Responsiveness

The promo card has different stylings depending on the breakpoints.

For breakpoint S to M the promo card uses following stylings:

  • 4:3 aspect ratio for the Image
  • Headline100 for the header headline
  • Headline50 for the footer headline
  • 64px width for the logo

For breakpoint L to XL the promo card uses following stylings:

  • 8:3 aspect ratio for the Image
  • Headline200 for the header headline
  • Headline100 for the footer headline
  • 348px width for the logo

Breakpoint S to M: image 4:3

Neu im ShopWohnzimmer

Breakpoint L and up: image 8:3

Neu im ShopWohnzimmer
Livedifferences breakpoint
HTML
<div class="on-frame" style="display:grid;gap:32px">
<p class="demo-label">Breakpoint S to M: image 4:3</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2></div>
<p class="demo-label">Breakpoint L and up: image 8:3</p><oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Wohnzimmer</span><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:8/3;object-fit:cover"></oc-promo-card-v2></div>

Truncation

For the header the overline and the header headline are truncated at the end of the first line. For the footer the footer headline is truncated after 2 lines. The length of the footer text is not limited.

Neu im Shop: Möbel, Leuchten, Teppiche und Deko für dein ZuhauseWohnzimmer, Esszimmer und ArbeitszimmerOTTOSofas, Sessel, Couchtische, Stehleuchten, Kissen und Decken für gemütliche Abende zu HauseDer Fließtext im Footer wird nicht gekürzt: Hier findest du alles, was dein Wohnzimmer gemütlich macht, von der großen Wohnlandschaft bis zum kleinen Beistelltisch. Lass dich inspirieren und bestell bequem nach Hause.
Livetruncation
HTML
<div class="on-frame"><div style="max-width:340px;margin:0 auto">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop: Möbel, Leuchten, Teppiche und Deko für dein Zuhause</span><span slot="header-headline">Wohnzimmer, Esszimmer und Arbeitszimmer</span><img slot="header-logo" src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO"><img slot="main" src="/references/images/otto/otto-shop-teaser-wohnzimmer.jpg" alt="" style="aspect-ratio:4/3;object-fit:cover"><span slot="footer-headline">Sofas, Sessel, Couchtische, Stehleuchten, Kissen und Decken für gemütliche Abende zu Hause</span><span slot="footer-text">Der Fließtext im Footer wird nicht gekürzt: Hier findest du alles, was dein Wohnzimmer gemütlich macht, von der großen Wohnlandschaft bis zum kleinen Beistelltisch. Lass dich inspirieren und bestell bequem nach Hause.</span></oc-promo-card-v2>
</div>

Best Practices

Neu im ShopWohnzimmerOTTO KinderzimmerAlles zum Spielen
DoUse promo card either with header or footer.
Neu im ShopWohnzimmerOTTOSofas und SesselFür gemütliche Abende
Don'tUse both header and footer.

The whole card is one link

Neu im ShopWohnzimmer
DoUse promo card which is fully interactive.

Only the headline is a link

Neu im ShopWohnzimmerOTTO
Don'tUse promo card which is only partially interactive.
Neu im ShopWohnzimmerOTTO

target

DoUse promo card only with one target.
Neu im ShopWohnzimmerZur Marke OTTO

target 1: the logo

target 2: the card

Don'tUse multiple targets for promo card.
Neu im ShopWohnzimmer
DoUse the provided semantic tokens "color/background-strong" when using the inverted variant.
Neu im ShopWohnzimmer
Don'tUse custom color.
Neu im ShopWohnzimmer
CautionAvoid placing inverted promo cards on colored Blocks. or colored backgrounds

Accessibility

For information on accessibility, refer to the technical documentation.

Status

Implementation

Live demo

Für dich ausgewählt

Alle Angebote
Bis zu 30 % sparenSofas-30 % Neu im ShopKinderzimmer LieferungWunschtermin
LiveReal OTTO components, rendered by the OTTO component runtime
HTML
<div class="on-frame demo-stack" style="gap:16px">
<div style="display:flex;justify-content:space-between;align-items:baseline;gap:12px"><p class="oc-headline-200" style="margin:0">Für dich ausgewählt</p><oc-link-v2><a href="#">Alle Angebote</a></oc-link-v2></div>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(13rem,1fr));gap:16px;align-items:start">
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Bis zu 30 % sparen</span><span slot="header-headline">Sofas</span><oc-action-signifier-v1 slot="action-signifier-header" variant="icon"></oc-action-signifier-v1><img slot="main" src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-living-room.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"><oc-tag-v1 slot="tags" variant="sale" size="50">-30 %</oc-tag-v1></oc-promo-card-v2>
<oc-promo-card-v2><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Neu im Shop</span><span slot="header-headline">Kinderzimmer</span><oc-action-signifier-v1 slot="action-signifier-header" variant="icon"></oc-action-signifier-v1><img slot="main" src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-kids-room.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2>
<oc-promo-card-v2 inverted><a href="#" aria-label="oc-auto"></a><span slot="header-overline">Lieferung</span><span slot="header-headline">Wunschtermin</span><oc-action-signifier-v1 slot="action-signifier-header" variant="icon" inverted></oc-action-signifier-v1><img slot="main" src="/previews/imagery/samples/otto-lifestyle-photo/lifestyle-parcel-doorstep.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"></oc-promo-card-v2>

Code

Version Tag Status API
v2 <oc-promo-card-v2> Stable, allowed for generation PromoCardV2
v1 <oc-promo-card-v1> Deprecated, NOT allowed for generation PromoCardV1

Only the latest version (v2) is allowed for generation. Older versions are kept for reference and are deprecated.

Overview (v2)

Promo Card

The promo card component is a slot-based container for header content, a main visual, tags, and footer content. It supports configurable elevation levels and an inverted color style. The card becomes interactive when an interactive element (link, button, or masked link) is placed in its default slot.

Default variation
placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
</oc-promo-card-v2>
Configuration

The promo card component is configurable, allowing you to tailor its features and appearance to your specific needs. To explore all the available options and adjust the component, use the component configurator and see the changes affect the component in real-time.

Usage guidelines

Before integrating the promo card component into your project, make sure you have correctly installed the OTTO components package. Look through the variations page for examples of possible component variations. Here, you can discover both common and specific variations that address different use cases.

Info

See the Promo Card UX documentation for detailed user experience guidelines.

Accessibility

The promo card component comes with a set of built-in accessibility features to ensure a seamless experience for all users.

Screen reader support

The interactive element you place in the default slot determines how the card is announced and operated by assistive technology. See the interactive component slots documentation for the supported element patterns (link, masked link, button, checkbox, radio) and their built-in keyboard and screen reader behavior.

Headline levels

The header-headline and footer-headline slots do not take a heading-level attribute. Slot a heading element (h1–h6) directly to control the semantic level, or a span/div if the content should not be announced as a heading.

New arrivals

Up to 50% off

HTML
<oc-promo-card-v2>
<a href="/sale" aria-label="Sale"></a>
<h2 slot="header-headline">New arrivals</h2>
<h3 slot="footer-headline">Up to 50% off</h3>
</oc-promo-card-v2>

Choose the heading level based on the surrounding page heading hierarchy, not the desired visual size. The heading level has no effect on the visual appearance of the headline, which is controlled entirely through CSS. If no heading element is slotted, the content is not exposed as a heading to assistive technology.

Role

The promo card does not set a role attribute by default. The interactive element you place in the default slot (see interactive component slots) already provides the correct role for that interaction, so the card itself does not need one.

Set a role attribute on oc-promo-card-v2 only if you need additional grouping or landmark semantics, for example:

  • role="group" with aria-labelledby or aria-label when the card needs to be identified as a distinct labelled unit, such as within a list or carousel of promo cards.
  • role="article" when the card represents a self-contained, syndicate-able piece of content.

Note

Never set the same role on both the host element and an element inside the card's shadow DOM — this can cause duplicate or conflicting announcements in assistive technology.

Configuration (v2)

Promo Card configuration

Configure the promo card component with the controls below and see the changes live in the preview canvas. Click the Show code button within the preview canvas to see the source code for the current component configuration.

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
</oc-promo-card-v2>

Interactive configurator (Storybook controls); every option is listed in the API section of this file.

Migration (v2)

Migration from promo card v1 to v2

The oc-promo-card component has been updated from oc-promo-card-v1 to oc-promo-card-v2. This migration guide provides step-by-step instructions to update your project to the latest version.

Skip to:

What's new
Flexible content

The new slot-based architecture provides:

  • Flexible content placement with named slots instead of text attributes
  • Support for rich content, including HTML elements and custom heading levels
  • Full control over the interactive element through the interactive component slots pattern (link, masked link, button, checkbox, radio) instead of fixed href/as-button attributes
API changes
Changed slots

The following slots have been changed:

v1 Slot v2 Slot Notes
default (image) main Main visual content now uses the main slot
primary-action default The interactive element now uses the default slot
logo header-logo Deprecated logo slot removed, use header-logo instead
New slots

The following slots have been added in v2:

Slot Description Notes
header-headline Replaces the header-headline/main-headline attribute Content and heading tag are slotted
header-overline Replaces the header-overline/overline attribute Content is slotted
footer-headline Replaces the footer-headline attribute Content and heading tag are slotted
footer-text Replaces the footer-text attribute Content is slotted
Removed attributes

The following attributes have been removed and should now be set through slotted content or the default slot's interactive element:

v1 Attribute v2 Equivalent Notes
header-headline / main-headline Use the header-headline slot Text content moved to slot
header-headline-level / main-headline-level Use a heading tag (h1–h6) in the header-headline slot No level attribute anymore; the slotted tag defines the semantics
footer-headline Use the footer-headline slot Text content moved to slot
footer-headline-level Use a heading tag (h1–h6) in the footer-headline slot No level attribute anymore; the slotted tag defines the semantics
footer-text Use the footer-text slot Text content moved to slot
overline / header-overline Use the header-overline slot Text content moved to slot
href, base64-href, target, rel, as-button Slot an <a>, <button>, or masked <div role="link"> into the default slot Follow the interactive component slots patterns
background-color Use the --background-color CSS variable No change from the already-deprecated v1 behavior
oc-aria-visible-elements — Removed, no replacement
oc-role Set role directly on oc-promo-card-v2 Removed, set the host role yourself if needed
How to migrate

The main change is that v2 moves all text-based attributes (headlines, overline, footer text) into named slots, and moves the interactive element from the primary-action slot into the default slot, while the former default slot (main image) is renamed to main.

Migrate a basic promo card
<!-- From: -->
<oc-promo-card-v1>
  <a slot="primary-action" href="/product" aria-label="Product name"></a>
  <img src="product.jpg" alt="" />
</oc-promo-card-v1>
<!-- To: -->
<oc-promo-card-v2>
  <a href="/product" aria-label="Product name"></a>
  <img slot="main" src="product.jpg" alt="" />
</oc-promo-card-v2>
<!-- From: -->
<oc-promo-card-v1
  header-headline="New arrivals"
  header-headline-level="2"
  header-overline="Sale"
  footer-headline="Up to 50% off"
  footer-headline-level="3"
  footer-text="Valid while stocks last"
>
  <a slot="primary-action" href="/sale" aria-label="Sale"></a>
  <img src="sale.jpg" alt="" />
</oc-promo-card-v1>
<!-- To: -->
<oc-promo-card-v2>
  <a href="/sale" aria-label="Sale"></a>
  <span slot="header-overline">Sale</span>
  <h2 slot="header-headline">New arrivals</h2>
  <img slot="main" src="sale.jpg" alt="" />
  <h3 slot="footer-headline">Up to 50% off</h3>
  <span slot="footer-text">Valid while stocks last</span>
</oc-promo-card-v2>
Migrate a promo card using the deprecated main-headline attributes

The deprecated main-headline and main-headline-level attributes follow the same migration path as header-headline and header-headline-level.

<!-- From: -->
<oc-promo-card-v1 main-headline="New arrivals" main-headline-level="2">
  <a slot="primary-action" href="/sale" aria-label="Sale"></a>
  <img src="sale.jpg" alt="" />
</oc-promo-card-v1>
<!-- To: -->
<oc-promo-card-v2>
  <a href="/sale" aria-label="Sale"></a>
  <h2 slot="header-headline">New arrivals</h2>
  <img slot="main" src="sale.jpg" alt="" />
</oc-promo-card-v2>
<!-- From: -->
<oc-promo-card-v1 base64-href="L2ludGVybmFsL3BhZ2U=">
  <img src="product.jpg" alt="" />
</oc-promo-card-v1>
<!-- To: -->
<oc-promo-card-v2>
  <div role="link" tabindex="0" data-masked-ref="L2ludGVybmFsL3BhZ2U=" aria-label="oc-auto"></div>
  <img slot="main" src="product.jpg" alt="" />
</oc-promo-card-v2>

API v1 (v1, deprecated, not for generation)

Promo Card v1 API

API: <oc-promo-card-v1> (PromoCardV1)

The {Latest.default.name.toLowerCase()} component provides attributes for setting the main headline, overline, footer headline, footer text, and a link that the card directs to. The card is not interactive if no link is set. This component also provides slots for setting the main content, logo, and tags that appear in the card.

Attributes / properties
Attribute Type Default Required Description
header-headline string undefined no Sets the main headline that appears in the card header.
header-headline-level 1 | 2 | 3 | 4 | 5 | 6 undefined no If set, renders the headline content inside a heading tag with the specified level. Only applies if the main-headline attribute is set.

The heading level has no visual effect but provides semantic structure for screen readers. If not set, renders a span instead of a heading tag.
main-headline string undefined no Deprecated: Use the header-headline attribute instead.

Sets the main headline that appears in the card header.
main-headline-level 1 | 2 | 3 | 4 | 5 | 6 undefined no Deprecated: Use the header-headline-level attribute instead.

If set, renders the headline content inside a heading tag with the specified level. Only applies if the main-headline attribute is set.

The heading level has no visual effect but provides semantic structure for screen readers. If not set, renders a span instead of a heading tag.
footer-headline string undefined no Sets the second headline that appears in the card footer.
footer-headline-level 1 | 2 | 3 | 4 | 5 | 6 undefined no If set, renders the headline content of the footer inside a heading tag with the specified level. Only applies if the footer-headline property is set.

If not set, renders a span instead of a heading tag.
footer-text string undefined no Sets the text content that appears in the footer below the footer headline.
header-overline string undefined no Sets the overline that appears above the card headline in the card header.
overline string undefined no Deprecated: Use the header-overline attribute instead.

Sets the overline that appears above the card headline in the card header.
inverted boolean false no Sets the promo card styles to be inverted.
elevation-level "canvas" | "stacked" | "above" | "sticky" "canvas" no Sets the elevation level of the card. The elevation level determines the shadow and depth of the card. - canvas: no shadow, promo-card appears flat, to be used on frame.

Note: Has no effect, when background-color or inverted has been set. - stacked: shadow, promo-card appears stacked, to be used on canvas.

Note: Has no effect, when background-color or inverted has been set. - above: shadow, promo-card appears above other levels. - sticky: shadow, promo-card appears above all other levels and is sticky.
background-color string undefined no Deprecated: The background-color attribute is deprecated. Please use the CSS-Variable --background-color instead.

Sets a custom background color.
href string undefined no Deprecated: Use an a tag in the default slot instead.

Visit SEO optimization techniques for more information.

Sets the link target of the promo card.
base64-href string undefined no Sets the base64 encoded link target of the promo card. Use this attribute to prevent search engines from indexing the link target.
target "_blank" | "_self" | "_parent" | "_top" undefined no Sets the target attribute of the promo card.

Note Only applies when href or base64Href is set.
rel string undefined no Sets the rel attribute of the promo card.

Note Only applies when href or base64Href is set.
as-button boolean false no Determines if the promo card behaves as a button or as a link when clicked. Set to true to make the promo card behave as a button and trigger an action instead of navigating to a new page.
oc-aria-visible-elements OcAriaVisibleElement[] ["overline","headerOverline","mainHeadline","headerHeadline","logo","headerLogo","tags","mainContent","footerHeadline","footerText"] no Defines which elements of the promo card are visible to screen readers.
oc-role string "article" no Set the aria role of the promo card.
Slots
Slot Required Description
default no Sets the main content of the promo card. Usually, it contains an image. The aspect ratio of the image defines the aspect ratio of the promo card. Common aspect ratios are 4/3 and 8/3.
logo no Deprecated: Use the header-logo slot instead.

Sets the logo that appears in the header.
Example:
<span slot="logo">Logo</span>
header-logo no Sets the logo that appears in the header.
Example:
<span slot="logo">Logo</span>
tags no Holds the oc-tag elements that appear in the bottom left corner of the main content.
Example:
<oc-tag-v1 slot="tags">Tag</oc-tag-v1>
action-signifier-header no Sets the action signifier that appears in the header.
action-signifier-footer no Sets the action signifier that appears in the footer.
primary-action no Add an empty tag to change the default behavior of the card component.

- empty a tag: the card component behaves as a link (SEO relevant) - empty button tag: the card component behaves as a button - empty div tag: for link masking when there are multiple interactive elements
Events
Event Detail type Description
oc-property-change OcPromoCardV1Events["oc-property-change"] Whenever a property value changes, this event triggers. Use this event to track all property changes within the component.

Refer to the Events documentation for more information.
oc-mount { component: string; } Fired when the component is mounted to the DOM. The event is fired when the onMount hook of the component is called by the runtime.
oc-unmount { component: string; } Fired when the component is unmounted from the DOM. The event is fired when the function returned by the onMount hook of the component is called by the runtime.
CSS custom properties
Custom property Default Description
--background-color undefined Sets a custom background color through a CSS variable. Note: The preferred way of using colors is via design tokens instead of hex values.

API v2

Promo Card v2 API

API: <oc-promo-card-v2> (PromoCardV2)

The promo card component is a slot-based container for header content, a main visual, tags, and footer content. It supports configurable elevation levels and an inverted color style. The card becomes interactive when an interactive element (link, button, or masked link) is placed in its default slot.

Attributes / properties
Attribute Type Default Required Description
inverted boolean undefined no Sets the promo card styles to be inverted.
elevation-level "canvas" | "stacked" | "above" | "sticky" "canvas" no Sets the elevation level of the promo card. The elevation level determines the shadow and depth of the card. - canvas: no shadow, promo-card appears flat, to be used on frame. - stacked: shadow, promo-card appears stacked, to be used on canvas. - above: shadow, promo-card appears above other levels. - sticky: shadow, promo-card appears above all other levels and is sticky.

Note: When background-color or inverted is set, the elevation background color is overridden, but the elevation shadow filter is still applied.
Slots
Slot Required Description
default no Can be one of the following elements: - <input type="checkbox"/> for multi-selection - <input type="radio"/> for single-selection - <a href="#"> for a link - <div role="link" tabindex="0" data-masked-ref="Iw=="> for a masked link - <a href="#" data-masked-ref="Iw=="> for link switching

If a non-interactive element is used, the promo card will not have any interactive styles or behaviors applied to it.

For more information on interactive components, refer to the interactive component slots documentation.

Empty interactive elements (link, button) have no accessible name by default. Use aria-label="oc-auto" to request the component's auto-generated label so the card content names the control.
header-headline no Sets the main headline that appears in the card header.
header-logo no Sets the logo that appears in the header.
Example:
<img slot="header-logo" src="logo.png" alt="Logo" />
header-overline no Sets the overline that appears above the card headline in the card header.
main no Sets the main content of the promo card. Usually, it contains an image. The aspect ratio of the image defines the aspect ratio of the promo card. Common aspect ratios are 4/3 and 8/3.
tags no Holds the oc-tag elements that appear in the bottom left corner of the main content.
Example:
<oc-tag-v1 slot="tags">Tag</oc-tag-v1>
footer-headline no Sets the second headline that appears in the card footer.
footer-text no Sets the text content that appears in the footer below the footer headline.
action-signifier-header no Sets the action signifier that appears in the header.
action-signifier-footer no Sets the action signifier that appears in the footer.
Events
Event Detail type Description
oc-property-change OcPromoCardV2Events["oc-property-change"] Whenever a property value changes, this event triggers. Use this event to track all property changes within the component.

Refer to the Events documentation for more information.
oc-mount { component: string; } Fired when the component is mounted to the DOM. The event is fired when the onMount hook of the component is called by the runtime.
oc-unmount { component: string; } Fired when the component is unmounted from the DOM. The event is fired when the function returned by the onMount hook of the component is called by the runtime.
CSS custom properties
Custom property Default Description
--background-color undefined Sets a custom background color through a CSS variable. Note: The preferred way of using colors is via design tokens instead of hex values.

Variations (v2)

Variations

Listed below are the most common variations of the promo card component as well as specific component variations for different use cases.

You can explore all available options using the component configurator, adjust the component to your needs, and see the changes live in a preview canvas.

Default

Story: components-promo-card-variations--default · tags: components, promo-card, 2, variations

The default configuration uses the main slot with a 4:3 aspect ratio image.

Args: mainSlot=(see snippet)

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
</oc-promo-card-v2>
Inverted

Story: components-promo-card-variations--inverted · tags: components, promo-card, 2, variations

The inverted configuration uses the main slot with a 4:3 aspect ratio image and inverted colors.

Args: mainSlot=(see snippet), inverted=true

placeholder image
HTML
<oc-promo-card-v2 inverted>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
</oc-promo-card-v2>
With button behavior

Story: components-promo-card-variations--with-button-behavior · tags: components, promo-card, 2, variations

Putting an empty <button> tag into the default slot makes the promo card behave as a button.

Args: defaultSlot=<button aria-label="oc-auto"></button>, mainSlot=(see snippet)

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
<button  aria-label="oc-auto"></button>
</oc-promo-card-v2>
With checked behavior

Story: components-promo-card-variations--with-checked-behavior · tags: components, promo-card, 2, variations

The promo card component can also be used with checkbox/radio behavior by placing an input element in the default slot.

Args: mainSlot=(see snippet)

<h2>Checkbox</h2>
<div class="row">
  <oc-promo-card-v2 class="${className}" >
    <input type="checkbox" aria-label="oc-auto" />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <input type="checkbox" aria-label="oc-auto" checked />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <input type="checkbox" aria-label="oc-auto" />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
</div>

<h2>Radio button</h2>
<div class="row">
  <oc-promo-card-v2 class="${className}" >
    <input type="radio" name="media-object-card-selection-demo" aria-label="oc-auto" />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <input
      type="radio"
      name="media-object-card-selection-demo"
      aria-label="oc-auto"
      checked
    />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <input type="radio" name="media-object-card-selection-demo" aria-label="oc-auto" />
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
</div>

<h2>Switch button</h2>
<div class="row">
  <oc-promo-card-v2 class="${className}" >
    <button role="switch" aria-checked="false" aria-label="oc-auto"></button>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <button role="switch" aria-checked="true" aria-label="oc-auto"></button>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <button role="switch" aria-checked="false" aria-label="oc-auto"></button>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
</div>

<h2>Current-marked link</h2>
<div class="row">
  <oc-promo-card-v2 class="${className}" >
    <a href="#" aria-label="oc-auto"></a>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <a href="#" aria-current="page" aria-label="oc-auto"></a>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
  <oc-promo-card-v2 class="${className}" >
    <a href="#" aria-label="oc-auto"></a>
    ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}
  <img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
  </oc-promo-card-v2>
</div>

${css}

<style>
  .row {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 24px;
  }

  .row > oc-promo-card-v2 {
    width: 200px;
  }

  h2 {
    margin-top: 16px;
  }
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "With checked behavior",
  args: {
    mainSlot: `
  <img
      slot="main"
      src="${placeholderImage}"
      alt="placeholder image"
    />`
  },
  render({
    headerHeadlineSlot,
    headerOverlineSlot,
    headerLogoSlot,
    mainSlot,
    tagsSlot,
    footerHeadlineSlot,
    footerTextSlot,
    actionSignifierHeaderSlot,
    actionSignifierFooterSlot,
    ...props
  }) {
    const {
      css,
      className
    } = cssVariablesExample(props);
    return html`
      <h2>Checkbox</h2>
      <div class="row">
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input type="checkbox" aria-label="oc-auto" />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input type="checkbox" aria-label="oc-auto" checked />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input type="checkbox" aria-label="oc-auto" />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
      </div>

      <h2>Radio button</h2>
      <div class="row">
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input type="radio" name="media-object-card-selection-demo" aria-label="oc-auto" />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input
            type="radio"
            name="media-object-card-selection-demo"
            aria-label="oc-auto"
            checked
          />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <input type="radio" name="media-object-card-selection-demo" aria-label="oc-auto" />
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
      </div>

      <h2>Switch button</h2>
      <div class="row">
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <button role="switch" aria-checked="false" aria-label="oc-auto"></button>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <button role="switch" aria-checked="true" aria-label="oc-auto"></button>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <button role="switch" aria-checked="false" aria-label="oc-auto"></button>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
      </div>

      <h2>Current-marked link</h2>
      <div class="row">
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <a href="#" aria-label="oc-auto"></a>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <a href="#" aria-current="page" aria-label="oc-auto"></a>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
        <oc-promo-card-v2 class="${className}" ${spread(props)}>
          <a href="#" aria-label="oc-auto"></a>
          ${unsafeHTML(headerHeadlineSlot)}${unsafeHTML(headerOverlineSlot)}${unsafeHTML(headerLogoSlot)}${unsafeHTML(mainSlot)}${unsafeHTML(tagsSlot)}${unsafeHTML(footerHeadlineSlot)}${unsafeHTML(footerTextSlot)}${unsafeHTML(actionSignifierHeaderSlot)}${unsafeHTML(actionSignifierFooterSlot)}
        </oc-promo-card-v2>
      </div>

      ${css}

      <style>
        .row {
          display: flex;
          gap: 16px;
          flex-wrap: wrap;
          margin-bottom: 24px;
        }

        .row > oc-promo-card-v2 {
          width: 200px;
        }

        h2 {
          margin-top: 16px;
        }
      </style>
    `;
  }
}

Story: components-promo-card-variations--with-link-behavior · tags: components, promo-card, 2, variations

The promo card component with an <a> tag as default slot content behaves as a link. Search engines will detect the href.

Args: defaultSlot=<a href="#" aria-label="oc-auto"></a>, mainSlot=(see snippet)

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
<a href="#"  aria-label="oc-auto"></a>
</oc-promo-card-v2>

Story: components-promo-card-variations--with-masked-link-behavior · tags: components, promo-card, 2, variations

The promo card component as a masked link. Search engines will not detect the href.

Args: defaultSlot=<div role="link" tabindex="0" data-masked-ref="Iw==" aria-label="oc-auto"></div>, mainSlot=(see snippet)

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
<div role="link" tabindex="0" data-masked-ref="Iw=="  aria-label="oc-auto"></div>
</oc-promo-card-v2>

Story: components-promo-card-variations--with-link-switch-behavior · tags: components, promo-card, 2, variations

The promo card component as a link with switch behavior. Search engines will detect the href, while users receive the Base64-encoded version.

Args: defaultSlot=<a href="#" data-masked-ref="Iz92YXJpYW50PWZvbw==" aria-label="oc-auto"></a>, mainSlot=(see snippet)

placeholder image
HTML
<oc-promo-card-v2>
<img
      slot="main"
      src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
      alt="placeholder image"
    />
<a href="#" data-masked-ref="Iz92YXJpYW50PWZvbw=="  aria-label="oc-auto"></a>
</oc-promo-card-v2>
With action signifier

Story: components-promo-card-variations--with-action-signifier · tags: components, promo-card, 2, variations

The promo card component with a header and footer action signifier.

Args: headerHeadlineSlot=<span slot="header-headline">Main headline</span>, headerOverlineSlot=<span slot="header-overline">Overline</span>, footerHeadlineSlot=<span slot="footer-headline">Footer headline</span>, footerTextSlot=<span slot="footer-text">Footer text</span>, actionSignifierHeaderSlot=<oc-action-signifier-v1 slot="action-signifier-header" variant="text" label="Action"></oc-action-signifier-v1>, actionSignifierFooterSlot=<oc-action-signifier-v1 slot="action-signifier-footer" variant="text" label="Action"></oc-action-signifier-v1>, defaultSlot=<a href="#" aria-label="oc-auto"></a>, mainSlot=(see snippet), tagsSlot=(see snippet), headerLogoSlot=(see snippet)

Main headline Overline Footer headline Footer text placeholder image -12% -20% Extra Label Placeholder logo
HTML
<oc-promo-card-v2>
<span slot="header-headline">Main headline</span>
<span slot="header-overline">Overline</span>
<span slot="footer-headline">Footer headline</span>
<span slot="footer-text">Footer text</span>
<oc-action-signifier-v1 slot="action-signifier-header" variant="text" label="Action"></oc-action-signifier-v1>
<oc-action-signifier-v1 slot="action-signifier-footer" variant="text" label="Action"></oc-action-signifier-v1>
<picture slot="main"
        ><source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)"
          type="image/webp" />
        <source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)" />
        <img
          src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          alt="placeholder image"
      /></picture>
<oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
<img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
<a href="#"  aria-label="oc-auto"></a>
</oc-promo-card-v2>
Ratio 4:3

Story: components-promo-card-variations--ratio-4-to-3 · tags: components, promo-card, 2, variations

Variation that uses the slots header-headline, header-overline, footer-headline, and footer-text with a 4:3 aspect ratio image.

Args: headerHeadlineSlot=<span slot="header-headline">Main headline</span>, headerOverlineSlot=<span slot="header-overline">Overline</span>, footerHeadlineSlot=<span slot="footer-headline">Footer headline</span>, footerTextSlot=<span slot="footer-text">Footer text</span>, defaultSlot=<a href="#" aria-label="oc-auto"></a>, mainSlot=(see snippet), tagsSlot=(see snippet), elevation-level=stacked, headerLogoSlot=(see snippet)

Main headline Overline Footer headline Footer text placeholder image -12% -20% Extra Label Placeholder logo
HTML
<oc-promo-card-v2 elevation-level="stacked">
<span slot="header-headline">Main headline</span>
<span slot="header-overline">Overline</span>
<span slot="footer-headline">Footer headline</span>
<span slot="footer-text">Footer text</span>
<picture slot="main"
        ><source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)"
          type="image/webp" />
        <source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)" />
        <img
          src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          alt="placeholder image"
      /></picture>
<oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
<img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
<a href="#"  aria-label="oc-auto"></a>
</oc-promo-card-v2>
Ratio 8:3

Story: components-promo-card-variations--ratio-8-to-3 · tags: components, promo-card, 2, variations

Variation that uses the slots header-headline, header-overline, footer-headline, footer-text, tags, and header-logo with a 8:3 aspect ratio image.

Args: headerHeadlineSlot=<span slot="header-headline">Main headline</span>, headerOverlineSlot=<span slot="header-overline">Overline</span>, footerHeadlineSlot=<span slot="footer-headline">Footer headline</span>, footerTextSlot=<span slot="footer-text">Footer text</span>, defaultSlot=<a href="#" aria-label="oc-auto"></a>, mainSlot=(see snippet), tagsSlot=(see snippet), headerLogoSlot=(see snippet)

Main headline Overline Footer headline Footer text placeholder image -12% -20% Extra Label Placeholder logo
HTML
<oc-promo-card-v2>
<span slot="header-headline">Main headline</span>
<span slot="header-overline">Overline</span>
<span slot="footer-headline">Footer headline</span>
<span slot="footer-text">Footer text</span>
<picture slot="main"
        ><source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)"
          type="image/webp" />
        <source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)" />
        <img
          src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          alt="placeholder image"
      /></picture>
<oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
<img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
<a href="#"  aria-label="oc-auto"></a>
</oc-promo-card-v2>

Story: components-promo-card-variations--with-picture-logo · tags: components, promo-card, 2, variations

Variation that uses a <picture> element in the header-logo slot, demonstrating responsive logo support.

Args: headerHeadlineSlot=<span slot="header-headline">Main headline</span>, headerOverlineSlot=<span slot="header-overline">Overline</span>, footerHeadlineSlot=<span slot="footer-headline">Footer headline</span>, footerTextSlot=<span slot="footer-text">Footer text</span>, defaultSlot=<a href="#" aria-label="oc-auto"></a>, mainSlot=(see snippet), headerLogoSlot=(see snippet)

Main headline Overline Footer headline Footer text placeholder image Placeholder logo
HTML
<oc-promo-card-v2>
<span slot="header-headline">Main headline</span>
<span slot="header-overline">Overline</span>
<span slot="footer-headline">Footer headline</span>
<span slot="footer-text">Footer text</span>
<picture slot="main"
        ><source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)"
          type="image/webp" />
        <source
          srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          media="(min-width: 48em)" />
        <img
          src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
          alt="placeholder image"
      /></picture>
<picture slot="header-logo"><source srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" media="(min-width: 48em)" type="image/webp" /><img src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" /></picture>
<a href="#" aria-label="oc-auto"></a>
</oc-promo-card-v2>

Story: components-promo-card-variations--demo-long-texts-and-broad-logo · tags: components, promo-card, 2, variations

Variation that uses the slots header-headline, header-overline, footer-headline, footer-text, tags, and header-logo with a 16:9 aspect ratio image.

<oc-promo-card-v2>
  <a href="#" aria-label="oc-auto"></a>
  <span slot="header-headline"
    >Main headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
    eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
    eos et accusam et justo duo dolores et ea rebum.</span
  >
  <span slot="header-overline"
    >Overline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
    tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
    accusam et justo duo dolores et ea rebum.</span
  >
  <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
  <picture slot="main">
    <source srcset="${placeholderImage}" media="(min-width: 48em)" type="image/webp" />
    <source srcset="${placeholderImage}" media="(min-width: 48em)" />
    <img src="${placeholderImage}" alt="placeholder image" />
  </picture>
  <span slot="footer-headline"
    >Footer headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
    eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
    eos et accusam et justo duo dolores et ea rebum.</span
  >
  <span slot="footer-text"
    >Footer text – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
    eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
    eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
    sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
    elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
    diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
    gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</span
  >
  <oc-tag-v1
    slot="tags"
    size="50"
    size-l="100"
    variant="sale"
    show-info-icon
    class="oc-secondary-action"
    >-12%</oc-tag-v1
  >
  <oc-tag-v1
    slot="tags"
    size="50"
    size-l="100"
    variant="sale"
    show-info-icon
    class="oc-secondary-action"
    >-20% Extra
  </oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
</oc-promo-card-v2>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Long texts and broad logo",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html` <oc-promo-card-v2>
      <a href="#" aria-label="oc-auto"></a>
      <span slot="header-headline"
        >Main headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
        eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
        eos et accusam et justo duo dolores et ea rebum.</span
      >
      <span slot="header-overline"
        >Overline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
        tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
        accusam et justo duo dolores et ea rebum.</span
      >
      <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
      <picture slot="main">
        <source srcset="${placeholderImage}" media="(min-width: 48em)" type="image/webp" />
        <source srcset="${placeholderImage}" media="(min-width: 48em)" />
        <img src="${placeholderImage}" alt="placeholder image" />
      </picture>
      <span slot="footer-headline"
        >Footer headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
        eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
        eos et accusam et justo duo dolores et ea rebum.</span
      >
      <span slot="footer-text"
        >Footer text – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
        eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
        eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
        sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
        elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
        diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
        gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</span
      >
      <oc-tag-v1
        slot="tags"
        size="50"
        size-l="100"
        variant="sale"
        show-info-icon
        class="oc-secondary-action"
        >-12%</oc-tag-v1
      >
      <oc-tag-v1
        slot="tags"
        size="50"
        size-l="100"
        variant="sale"
        show-info-icon
        class="oc-secondary-action"
        >-20% Extra
      </oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
    </oc-promo-card-v2>`;
  }
}
Demo: Multiple Promo Cards

Story: components-promo-card-variations--demo-multiple-promo-cards · tags: components, promo-card, 2, variations

Variation that uses the slots header-headline, header-overline, footer-headline, footer-text, tags, and main with a 16:9 aspect ratio image.

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit.</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit.</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
      </div>
    `;
  }
}
Demo: Multiple Promo Cards with Action Signifier

Story: components-promo-card-variations--demo-multiple-promo-cards-with-action-signifier · tags: components, promo-card, 2, variations

Variation that uses action signifiers in the header and footer.

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-action-signifier-v1
      slot="action-signifier-header"
      variant="icon"
    ></oc-action-signifier-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-action-signifier-v1
      slot="action-signifier-header"
      variant="text"
      label="Action"
    ></oc-action-signifier-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit.</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
    <oc-action-signifier-v1
      slot="action-signifier-footer"
      variant="icon"
    ></oc-action-signifier-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit.</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
    <oc-action-signifier-v1
      slot="action-signifier-footer"
      variant="text"
      label="Action"
    ></oc-action-signifier-v1>
  </oc-promo-card-v2>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards with Action Signifier",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-action-signifier-v1
            slot="action-signifier-header"
            variant="icon"
          ></oc-action-signifier-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-action-signifier-v1
            slot="action-signifier-header"
            variant="text"
            label="Action"
          ></oc-action-signifier-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit.</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
          <oc-action-signifier-v1
            slot="action-signifier-footer"
            variant="icon"
          ></oc-action-signifier-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit.</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
          <oc-action-signifier-v1
            slot="action-signifier-footer"
            variant="text"
            label="Action"
          ></oc-action-signifier-v1>
        </oc-promo-card-v2>
      </div>
    `;
  }
}
Demo: Multiple Promo Cards with elevation

Story: components-promo-card-variations--demo-multiple-promo-cards-with-elevation · tags: components, promo-card, 2, variations

Variation that uses the slots header-headline, header-overline, footer-headline, footer-text, tags, and main with a 16:9 aspect ratio image. Also uses the elevation-level attribute.

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v2 style="flex: 1" elevation-level="canvas">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <div style="flex: 1; background-color: #fff; padding: 16px">
    <oc-promo-card-v2 style="flex: 1" elevation-level="stacked">
      <a href="#" aria-label="oc-auto"></a>
      <span slot="header-headline">Main headline</span>
      <span slot="header-overline">Overline</span>
      <span slot="footer-headline">Footer headline</span>
      <span slot="footer-text">Lorem ipsum dolor sit</span>
      <img slot="main" src="${placeholderImage}" alt="placeholder image" />
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
    </oc-promo-card-v2>
  </div>
  <oc-promo-card-v2 style="flex: 1" elevation-level="above">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit.</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
  <oc-promo-card-v2 style="flex: 1" elevation-level="sticky">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text">Lorem ipsum dolor sit.</span>
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards with elevation",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v2 style="flex: 1" elevation-level="canvas">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <div style="flex: 1; background-color: #fff; padding: 16px">
          <oc-promo-card-v2 style="flex: 1" elevation-level="stacked">
            <a href="#" aria-label="oc-auto"></a>
            <span slot="header-headline">Main headline</span>
            <span slot="header-overline">Overline</span>
            <span slot="footer-headline">Footer headline</span>
            <span slot="footer-text">Lorem ipsum dolor sit</span>
            <img slot="main" src="${placeholderImage}" alt="placeholder image" />
            <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
            <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
          </oc-promo-card-v2>
        </div>
        <oc-promo-card-v2 style="flex: 1" elevation-level="above">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit.</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
        <oc-promo-card-v2 style="flex: 1" elevation-level="sticky">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text">Lorem ipsum dolor sit.</span>
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
      </div>
    `;
  }
}
Demo: Background color

Story: components-promo-card-variations--demo-background-color · tags: components, promo-card, 2, variations

Demo: Multiple Promo Cards with different background colors

Args: inverted=true

<div style="display: flex; gap: 16px; flex-wrap: wrap">
  <oc-promo-card-v2 style="flex: 0 0 240px" elevation-level="canvas" inverted="true">
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img
      slot="main"
      src="https://i.otto.de/i/otto/4acf54bf-6fd2-5b57-89d2-a6a91778a95d?$teat_product_ddt_xl$&fmt=webp"
      alt="placeholder image"
    />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1
      slot="tags"
      size="50"
      size-l="100"
      variant="sale"
      show-info-icon
      class="oc-secondary-action"
      >-12%</oc-tag-v1
    >
    <oc-tag-v1
      slot="tags"
      size="50"
      size-l="100"
      variant="sale"
      show-info-icon
      class="oc-secondary-action"
      >-20% Extra</oc-tag-v1
    >
    <oc-tag-v1
      slot="tags"
      size="50"
      size-l="100"
      variant="info-primary"
      show-info-icon
      class="oc-secondary-action"
      >Label
    </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #1E5A78"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #5E8114"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #6C49CF"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #801489"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #8C2D4B"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #E95D21"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>

  <oc-promo-card-v2
    style="flex: 0 0 240px; --background-color: #9E790D"
    elevation-level="canvas"
    inverted="true"
  >
    <a href="#" aria-label="oc-auto"></a>
    <span slot="header-headline">Main headline</span>
    <span slot="header-overline">Overline</span>
    <span slot="footer-headline">Footer headline</span>
    <span slot="footer-text"
      >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
    >
    <img slot="main" src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v2>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Background color",
  parameters: {
    controls: {
      disabled: true
    }
  },
  args: {
    inverted: true
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px; flex-wrap: wrap">
        <oc-promo-card-v2 style="flex: 0 0 240px" elevation-level="canvas" inverted="true">
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img
            slot="main"
            src="https://i.otto.de/i/otto/4acf54bf-6fd2-5b57-89d2-a6a91778a95d?$teat_product_ddt_xl$&fmt=webp"
            alt="placeholder image"
          />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1
            slot="tags"
            size="50"
            size-l="100"
            variant="sale"
            show-info-icon
            class="oc-secondary-action"
            >-12%</oc-tag-v1
          >
          <oc-tag-v1
            slot="tags"
            size="50"
            size-l="100"
            variant="sale"
            show-info-icon
            class="oc-secondary-action"
            >-20% Extra</oc-tag-v1
          >
          <oc-tag-v1
            slot="tags"
            size="50"
            size-l="100"
            variant="info-primary"
            show-info-icon
            class="oc-secondary-action"
            >Label
          </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #1E5A78"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #5E8114"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #6C49CF"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #801489"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #8C2D4B"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #E95D21"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>

        <oc-promo-card-v2
          style="flex: 0 0 240px; --background-color: #9E790D"
          elevation-level="canvas"
          inverted="true"
        >
          <a href="#" aria-label="oc-auto"></a>
          <span slot="header-headline">Main headline</span>
          <span slot="header-overline">Overline</span>
          <span slot="footer-headline">Footer headline</span>
          <span slot="footer-text"
            >Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span
          >
          <img slot="main" src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v2>
      </div>
    `;
  }
}

Interaction tests (PromoCardV2.interactions.stories.ts)

Interaction test stories (automated tests, not usage patterns).

Story: components-promo-card-interaction-tests--action-slot-link-is-clickable · tags: components, promo-card, 2, interactions, play-fn

Args: defaultSlot=<a href="#" aria-label="link"></a>

Story source (TypeScript, verbatim from Storybook)
{
  name: "Action slot link is focusable and clickable",
  args: {
    defaultSlot: `<a href="#" aria-label="link"></a>`
  },
  play: async ({
    canvasElement
  }) => {
    const card = canvasElement.querySelector("oc-promo-card-v2")!;
    const link = card.querySelector("a")!;
    await expect(link, "link should be in the DOM").toBeTruthy();
    await userEvent.tab();
    await expect(document.activeElement, "link should receive focus via Tab").toBe(link);
  }
}

V1 (v1, deprecated, not for generation)

Promo card

The promo card component provides attributes for setting the main headline, overline, footer headline, footer text, and a link that the card directs to. The card is not interactive if no link is set. This component also provides slots for setting the main content, logo, and tags that appear in the card.

Default variation
<oc-promo-card-v1>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>
Configuration

The promo card is configurable, allowing you to tailor its features and appearance to your specific needs. To explore all the available options and adjust the component, use the component configurator and see the changes affect the component in real-time.

Usage guidelines

Before integrating the promo card component into your project, make sure you have correctly installed the OTTO components package. Look through the variations page for examples of possible component variations. Here, you can discover both common and specific variations that address different use cases.

Info

See the Promo card UX documentation for detailed user experience guidelines.

Accessibility

The promo card component comes with a set of built-in accessibility features to ensure a seamless experience for all users.

Multiple interactions

The promo card component can have multiple interactions:

  • The primary-action is the main action that's triggered when the user clicks on the card.
  • The secondary-action is an additional action that's triggered when the user clicks on a specific element within the card.
  • Use the CSS class oc-secondary-action to define the secondary action.
<oc-promo-card-v2>
  <!-- Place the <a> tag in the light DOM to improve SEO.-->
  <!-- Use aria-label if the <a> tag needs to be empty. -->
  <a slot="primary-action" href="#" aria-label="Card"></a>
  <oc-button-v1 class="oc-secondary-action">Secondary action</oc-button-v1>
</oc-promo-card-v2>
Screen reader support

By default, when an interactive promo card is focused, the screen reader reads the content or labels of all its elements. The screen reader can read the following elements: overline, mainHeadline, logo, tags, mainContent, footerHeadline, and footerText. Keep in mind to provide meaningful alternative texts for the logo and images, if used, via the oc-aria-label attribute. If you want the screen reader to read only a subset of the elements, you can use the oc-aria-visible-elements attribute to specify which elements should be read.

Use oc-aria-label

To make the promo card recognizable for screen readers, use the oc-aria-label attribute to provide clear and descriptive context information. See the general accessibility documentation for guidance on using oc-aria-label, including how it works with link and masked link behavior.

V1/Configuration (v1, deprecated, not for generation)

Promo card configuration

Configure the promo card component with the controls below and see the changes live in the preview canvas. Click the Show code button within the preview canvas to see the source code for the current component configuration.

<oc-promo-card-v1>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>

Interactive configurator (Storybook controls); every option is listed in the API section of this file.

V1/Interaction tests (PromoCardV1.interactions.stories.ts)

Interaction test stories (automated tests, not usage patterns).

Should Handle Base 64 Href

Story: components-promo-card-v1-interaction-tests--should-handle-base-64-href · tags: play-fn

<!-- Wrapper to limit the width-->
<div style="width: 360px">
  <!-- The component-->
  <oc-promo-card-v1 base64-href="L2Zvbw==">
    <img src=${placeholderImage} alt="blue checkered background" />
  </oc-promo-card-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  render() {
    return html`
      <!-- Wrapper to limit the width-->
      <div style="width: 360px">
        <!-- The component-->
        <oc-promo-card-v1 base64-href="L2Zvbw==">
          <img src=${placeholderImage} alt="blue checkered background" />
        </oc-promo-card-v1>
      </div>
    `;
  },
  async play({
    canvasElement
  }) {
    const ocPromoCard = canvasElement.getElementsByTagName("oc-promo-card-v1").item(0)!;
    ocPromoCard.focus();
    await tick();

    // instead of the div element there should now be an anchor element
    const linkElement = deepQuerySelector<HTMLAnchorElement>(ocPromoCard, ".card__interactive")!;
    await expect(linkElement.tagName).toBe("A");

    // anchor element inside the shadow root should have the correct href attribute
    await expect(linkElement.getAttribute("href")).toBe(`/foo`);

    // anchor element inside the shadow root should have the same fully href as the host
    await expect(ocPromoCard.href).toBe(`${window.location.origin}/foo`);
    await expect(linkElement.href).toBe(`${window.location.origin}/foo`);
  }
}

V1/Variations (v1, deprecated, not for generation)

Variations

Listed below are the most common variations of the promo card component as well as specific component variations for different use cases.

You can explore all available options using the component configurator, adjust the component to your needs, and see the changes live in a preview canvas.

Default

Story: components-promo-card-v1-variations--default · tags: components

The default configuration uses the default slot with a 4:3 aspect ratio image.

Args: defaultSlot=(see snippet)

<oc-promo-card-v1>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>
Inverted

Story: components-promo-card-v1-variations--inverted · tags: components

The inverted configuration uses the default slot with a 4:3 aspect ratio image and inverted colors.

Args: defaultSlot=(see snippet), inverted=true

<oc-promo-card-v1 inverted>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>
With button behavior

Story: components-promo-card-v1-variations--with-button-behavior · tags: components

Args: defaultSlot=(see snippet), as-button=true

<oc-promo-card-v1 as-button>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>

Story: components-promo-card-v1-variations--with-link-behavior · tags: components

The promo card component with a link as primary action. Search engines will detect the href.

Args: primaryActionSlot=(see snippet), defaultSlot=(see snippet)

<oc-promo-card-v1>
  <!--The <a> tag should be placed inside the light DOM to improve SEO.--><a slot="primary-action" href="#" aria-label="my placeholder promo card"></a>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>

Story: components-promo-card-v1-variations--with-masked-link-behavior · tags: components

The promo card component as a masked link. Search engines will not detect the href.

Args: base64-href=Iw==, defaultSlot=(see snippet)

<oc-promo-card-v1 base64-href="Iw==">
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>

Story: components-promo-card-v1-variations--with-link-switch-behavior · tags: components

The promo card component as a link with switch behavior. Search engines will detect the href, while users receive the Base64-encoded version.

Args: base64-href=Iz92YXJpYW50PWZvbw==, primaryActionSlot=(see snippet), defaultSlot=(see snippet)

<oc-promo-card-v1 base64-href="Iz92YXJpYW50PWZvbw==">
  <!--Search engines will detect the href, while users receive the Base64-encoded version.--><a href='#' slot="primary-action" aria-label='Promo Card'></a>
  <img
        src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
        alt="placeholder image"
      />
</oc-promo-card-v1>
With action signifier

Story: components-promo-card-v1-variations--with-action-signifier · tags: components

The promo card component with a header and footer action signifier.

Args: header-headline=Main headline, header-overline=Overline, footer-headline=Footer headline, footer-text=Footer text, actionSignifierHeaderSlot=<oc-action-signifier-v1 slot="action-signifier-header" variant="text" label="Action"></oc-action-signifier-v1>, actionSignifierFooterSlot=<oc-action-signifier-v1 slot="action-signifier-footer" variant="text" label="Action"></oc-action-signifier-v1>, primaryActionSlot=<a href="#" aria-label="placeholder promo card" slot="primary-action"></a>, defaultSlot=(see snippet), tagsSlot=(see snippet), headerLogoSlot=(see snippet)

<oc-promo-card-v1 header-headline="Main headline" header-overline="Overline" footer-headline="Footer headline" footer-text="Footer text">
  <oc-action-signifier-v1 slot="action-signifier-header" variant="text" label="Action"></oc-action-signifier-v1>
  <oc-action-signifier-v1 slot="action-signifier-footer" variant="text" label="Action"></oc-action-signifier-v1>
  <a href="#" aria-label="placeholder promo card" slot="primary-action"></a>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
  <picture
          ><source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)"
            type="image/webp" />
          <source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)" />
          <img
            src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            alt="placeholder image"
        /></picture>
</oc-promo-card-v1>
Ratio 4:3

Story: components-promo-card-v1-variations--ratio-4-to-3 · tags: components

Variation that uses the attributes header-headline, "header-overline", footer-headline, and footer-text with a 4:3 aspect ratio image.

Args: header-headline=Main headline, header-overline=Overline, footer-headline=Footer headline, footer-text=Footer text, primaryActionSlot=<a href="#" aria-label="placeholder promo card" slot="primary-action"></a>, defaultSlot=(see snippet), tagsSlot=(see snippet), elevation-level=stacked, headerLogoSlot=(see snippet)

<oc-promo-card-v1 header-headline="Main headline" header-overline="Overline" footer-headline="Footer headline" footer-text="Footer text" elevation-level="stacked">
  <a href="#" aria-label="placeholder promo card" slot="primary-action"></a>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
  <picture
          ><source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)"
            type="image/webp" />
          <source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)" />
          <img
            src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            alt="placeholder image"
        /></picture>
</oc-promo-card-v1>
Ratio 8:3

Story: components-promo-card-v1-variations--ratio-8-to-3 · tags: components

Variation that uses the attributes header-headline, "header-overline", footer-headline, footer-text, tags, and logo with a 8:3 aspect ratio image.

Args: header-headline=Main headline, header-overline=Overline, footer-headline=Footer headline, footer-text=Footer text, primaryActionSlot=<a href="#" aria-label="placeholder promo card" slot="primary-action"></a>, defaultSlot=(see snippet), tagsSlot=(see snippet), headerLogoSlot=(see snippet)

<oc-promo-card-v1 header-headline="Main headline" header-overline="Overline" footer-headline="Footer headline" footer-text="Footer text">
  <a href="#" aria-label="placeholder promo card" slot="primary-action"></a>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
        <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <img slot="header-logo" src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png" alt="Placeholder logo" />
  <picture
          ><source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)"
            type="image/webp" />
          <source
            srcset="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            media="(min-width: 48em)" />
          <img
            src="https://www.otto.de/assets-storybook/assets/img-placeholder-100.DVwSxVZf.png"
            alt="placeholder image"
        /></picture>
</oc-promo-card-v1>
Demo: Long texts and broad logo

Story: components-promo-card-v1-variations--demo-long-texts-and-broad-logo · tags: components

Variation that uses the attributes header-headline, "header-overline", footer-headline, footer-text, tags, and logo with a 16:9 aspect ratio image.

<oc-promo-card-v1
  id="my-promo-card-1"
  footer-headline="Footer headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
  footer-text="Footer text – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
  header-headline="Main headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
  header-overline="Overline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
>
  <a
    href="#"
    aria-owns="my-promo-card-1"
    aria-labelledby="my-promo-card-1"
    slot="primary-action"
  ></a>
  <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
  <picture>
    <source srcset="${placeholderImage}" media="(min-width: 48em)" type="image/webp" />
    <source srcset="${placeholderImage}" media="(min-width: 48em)" />
    <img src="${placeholderImage}" alt="placeholder image" />
  </picture>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon>-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
    >-20% Extra
  </oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
  <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
</oc-promo-card-v1>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Long texts and broad logo",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html` <oc-promo-card-v1
      id="my-promo-card-1"
      footer-headline="Footer headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
      footer-text="Footer text – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
      header-headline="Main headline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
      header-overline="Overline – Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum."
    >
      <a
        href="#"
        aria-owns="my-promo-card-1"
        aria-labelledby="my-promo-card-1"
        slot="primary-action"
      ></a>
      <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
      <picture>
        <source srcset="${placeholderImage}" media="(min-width: 48em)" type="image/webp" />
        <source srcset="${placeholderImage}" media="(min-width: 48em)" />
        <img src="${placeholderImage}" alt="placeholder image" />
      </picture>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon>-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
        >-20% Extra
      </oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label</oc-tag-v1>
    </oc-promo-card-v1>`;
  }
}
Demo: Multiple Promo Cards

Story: components-promo-card-v1-variations--demo-multiple-promo-cards · tags: components

Variation that uses the attributes header-headline, "header-overline", footer-headline, footer-text, and href, tags, and logo with a 16:9 aspect ratio image.

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v1
    id="my-promo-card-1"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-1"
      aria-labelledby="my-promo-card-1"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-2"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit"
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-2"
      aria-labelledby="my-promo-card-2"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-3"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit."
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-3"
      aria-labelledby="my-promo-card-3"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v1
          id="my-promo-card-1"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-1"
            aria-labelledby="my-promo-card-1"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-2"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit"
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-2"
            aria-labelledby="my-promo-card-2"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-3"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit."
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-3"
            aria-labelledby="my-promo-card-3"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
      </div>
    `;
  }
}
Demo: Multiple Promo Cards with Action Signifier

Story: components-promo-card-v1-variations--demo-multiple-promo-cards-with-action-signifier · tags: components

Variation that uses action signifiers in the header and footer

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v1
    id="my-promo-card-1"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-1"
      aria-labelledby="my-promo-card-1"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-action-signifier-v1
      slot="action-signifier-header"
      variant="icon"
    ></oc-action-signifier-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-2"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit"
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-2"
      aria-labelledby="my-promo-card-2"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-action-signifier-v1
      slot="action-signifier-header"
      variant="text"
      label="Action"
    ></oc-action-signifier-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-3"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit."
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-3"
      aria-labelledby="my-promo-card-3"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
    <oc-action-signifier-v1
      slot="action-signifier-footer"
      variant="icon"
    ></oc-action-signifier-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-4"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit."
    style="flex: 1"
  >
    <a
      href="#"
      aria-owns="my-promo-card-4"
      aria-labelledby="my-promo-card-4"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
    <oc-action-signifier-v1
      slot="action-signifier-footer"
      variant="text"
      label="Action"
    ></oc-action-signifier-v1>
  </oc-promo-card-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards with Action Signifier",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v1
          id="my-promo-card-1"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-1"
            aria-labelledby="my-promo-card-1"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-action-signifier-v1
            slot="action-signifier-header"
            variant="icon"
          ></oc-action-signifier-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-2"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit"
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-2"
            aria-labelledby="my-promo-card-2"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-action-signifier-v1
            slot="action-signifier-header"
            variant="text"
            label="Action"
          ></oc-action-signifier-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-3"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit."
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-3"
            aria-labelledby="my-promo-card-3"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
          <oc-action-signifier-v1
            slot="action-signifier-footer"
            variant="icon"
          ></oc-action-signifier-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-4"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit."
          style="flex: 1"
        >
          <a
            href="#"
            aria-owns="my-promo-card-4"
            aria-labelledby="my-promo-card-4"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
          <oc-action-signifier-v1
            slot="action-signifier-footer"
            variant="text"
            label="Action"
          ></oc-action-signifier-v1>
        </oc-promo-card-v1>
      </div>
    `;
  }
}
Demo: Multiple Promo Cards with elevation

Story: components-promo-card-v1-variations--demo-multiple-promo-cards-with-elevation · tags: components

Variation that uses the attributes header-headline, header-overline, footer-headline, footer-text, and href, tags, and logo with a 16:9 aspect ratio image. Also uses the new elevation-level property.

<div style="display: flex; gap: 16px;">
  <oc-promo-card-v1
    id="my-promo-card-1"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 1"
    elevation-level="canvas"
  >
    <a
      href="#"
      aria-owns="my-promo-card-1"
      aria-labelledby="my-promo-card-1"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <div style="flex: 1; background-color: #fff; padding: 16px">
    <oc-promo-card-v1
      id="my-promo-card-2"
      header-headline="Main headline"
      header-overline="Overline"
      footer-headline="Footer headline"
      footer-text="Lorem ipsum dolor sit"
      style="flex: 1"
      elevation-level="stacked"
    >
      <a
        href="#"
        aria-owns="my-promo-card-2"
        aria-labelledby="my-promo-card-2"
        slot="primary-action"
      ></a>
      <img src="${placeholderImage}" alt="placeholder image" />
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
      <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
    </oc-promo-card-v1>
  </div>
  <oc-promo-card-v1
    id="my-promo-card-3"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit."
    style="flex: 1"
    elevation-level="above"
  >
    <a
      href="#"
      aria-owns="my-promo-card-3"
      aria-labelledby="my-promo-card-3"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
  <oc-promo-card-v1
    id="my-promo-card-4"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit."
    style="flex: 1"
    elevation-level="sticky"
  >
    <a
      href="#"
      aria-owns="my-promo-card-4"
      aria-labelledby="my-promo-card-4"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Multiple Promo Cards with elevation",
  parameters: {
    controls: {
      disabled: true
    }
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px;">
        <oc-promo-card-v1
          id="my-promo-card-1"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 1"
          elevation-level="canvas"
        >
          <a
            href="#"
            aria-owns="my-promo-card-1"
            aria-labelledby="my-promo-card-1"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <div style="flex: 1; background-color: #fff; padding: 16px">
          <oc-promo-card-v1
            id="my-promo-card-2"
            header-headline="Main headline"
            header-overline="Overline"
            footer-headline="Footer headline"
            footer-text="Lorem ipsum dolor sit"
            style="flex: 1"
            elevation-level="stacked"
          >
            <a
              href="#"
              aria-owns="my-promo-card-2"
              aria-labelledby="my-promo-card-2"
              slot="primary-action"
            ></a>
            <img src="${placeholderImage}" alt="placeholder image" />
            <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
            <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra </oc-tag-v1>
          </oc-promo-card-v1>
        </div>
        <oc-promo-card-v1
          id="my-promo-card-3"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit."
          style="flex: 1"
          elevation-level="above"
        >
          <a
            href="#"
            aria-owns="my-promo-card-3"
            aria-labelledby="my-promo-card-3"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
        <oc-promo-card-v1
          id="my-promo-card-4"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit."
          style="flex: 1"
          elevation-level="sticky"
        >
          <a
            href="#"
            aria-owns="my-promo-card-4"
            aria-labelledby="my-promo-card-4"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
      </div>
    `;
  }
}
Demo: Background color

Story: components-promo-card-v1-variations--demo-background-color · tags: components

Demo: Multiple Promocards with different background colors

Args: inverted=true

<div style="display: flex; gap: 16px; flex-wrap: wrap">
  <oc-promo-card-v1
    id="my-promo-card-1"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-1"
      aria-labelledby="my-promo-card-1"
      slot="primary-action"
    ></a>
    <img
      src="https://i.otto.de/i/otto/4acf54bf-6fd2-5b57-89d2-a6a91778a95d?$teat_product_ddt_xl$&fmt=webp"
      alt="placeholder image"
    />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
      >-12%</oc-tag-v1
    >
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
      >-20% Extra</oc-tag-v1
    >
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary" show-info-icon
      >Label
    </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-2"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #1E5A78"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-2"
      aria-labelledby="my-promo-card-2"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-3"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #5E8114"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-3"
      aria-labelledby="my-promo-card-3"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-4"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #6C49CF"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-4"
      aria-labelledby="my-promo-card-4"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-5"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #801489"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-5"
      aria-labelledby="my-promo-card-5"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-6"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #8C2D4B"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-6"
      aria-labelledby="my-promo-card-6"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-7"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #E95D21"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-7"
      aria-labelledby="my-promo-card-7"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>

  <oc-promo-card-v1
    id="my-promo-card-8"
    header-headline="Main headline"
    header-overline="Overline"
    footer-headline="Footer headline"
    footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
    style="flex: 0 0 240px; --background-color: #9E790D"
    elevation-level="canvas"
    inverted="true"
  >
    <a
      href="#"
      aria-owns="my-promo-card-8"
      aria-labelledby="my-promo-card-8"
      slot="primary-action"
    ></a>
    <img src="${placeholderImage}" alt="placeholder image" />
    <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
    <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
  </oc-promo-card-v1>
</div>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Demo: Background color",
  parameters: {
    controls: {
      disabled: true
    }
  },
  args: {
    inverted: true
  },
  argTypes: hideControlsBadge(Metadata),
  render() {
    return html`
      <div style="display: flex; gap: 16px; flex-wrap: wrap">
        <oc-promo-card-v1
          id="my-promo-card-1"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-1"
            aria-labelledby="my-promo-card-1"
            slot="primary-action"
          ></a>
          <img
            src="https://i.otto.de/i/otto/4acf54bf-6fd2-5b57-89d2-a6a91778a95d?$teat_product_ddt_xl$&fmt=webp"
            alt="placeholder image"
          />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
            >-12%</oc-tag-v1
          >
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale" show-info-icon
            >-20% Extra</oc-tag-v1
          >
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary" show-info-icon
            >Label
          </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-2"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #1E5A78"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-2"
            aria-labelledby="my-promo-card-2"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-3"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #5E8114"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-3"
            aria-labelledby="my-promo-card-3"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-4"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #6C49CF"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-4"
            aria-labelledby="my-promo-card-4"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-5"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #801489"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-5"
            aria-labelledby="my-promo-card-5"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-6"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #8C2D4B"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-6"
            aria-labelledby="my-promo-card-6"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-7"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #E95D21"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-7"
            aria-labelledby="my-promo-card-7"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>

        <oc-promo-card-v1
          id="my-promo-card-8"
          header-headline="Main headline"
          header-overline="Overline"
          footer-headline="Footer headline"
          footer-text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy"
          style="flex: 0 0 240px; --background-color: #9E790D"
          elevation-level="canvas"
          inverted="true"
        >
          <a
            href="#"
            aria-owns="my-promo-card-8"
            aria-labelledby="my-promo-card-8"
            slot="primary-action"
          ></a>
          <img src="${placeholderImage}" alt="placeholder image" />
          <img slot="header-logo" src="${placeholderImage}" alt="Placeholder logo" />
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-12%</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="sale">-20% Extra</oc-tag-v1>
          <oc-tag-v1 slot="tags" size="50" size-l="100" variant="info-primary">Label </oc-tag-v1>
        </oc-promo-card-v1>
      </div>
    `;
  }
}