OTTODesign System

Code

Promo Card

Storybook group: Components · Sidebar path: Components/Promo Card · Extracted 28.09.2026

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)

Source: ./src/components/promo-card/v2/Overview.mdx

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

Story Default:

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

<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)

Source: ./src/components/promo-card/v2/Configuration.mdx

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.

Story Default:

<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)

Source: ./src/components/promo-card/v2/Migration.mdx

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)

Source: ./src/components/promo-card/v1/PromoCardV1.API.g.mdx

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

Source: ./src/components/promo-card/v2/PromoCardV2.API.g.mdx

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)

Source: ./src/components/promo-card/v2/Variations.mdx

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)

<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

<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)

<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)

<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)

<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)

<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)

<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)

<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)

<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)

<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)

Source: ./src/components/promo-card/v1/Overview.mdx

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

Story Default:

<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)

Source: ./src/components/promo-card/v1/Configuration.mdx

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.

Story Default:

<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)

Source: ./src/components/promo-card/v1/Variations.mdx

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>
    `;
  }
}