Notifications are used to provide feedback to the user. They communicate information about activities, processes, and events in the application.

Note
Work In Progress

The Java examples for this component are currently in progress. In the meantime, you can view the previous examples.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card slot="middle">
        <div>Financial report generated</div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  position="middle"
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <div>Financial report generated</div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
></vaadin-notification>

Theme Variants

Success

The success theme variant can be used to display success messages, such as when a task or operation is completed.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="success" slot="middle">
        <div>Application submitted!</div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  theme="success"
  position="middle"
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${this.renderer}"
></vaadin-notification>

Most successful operations should not be declared with notifications, as these can distract the user more than provide useful information. Only use success notifications for operations whose successful completion may otherwise be difficult to discern.

Error

The error theme variant can be used to display alerts, failures, or warnings.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="error" slot="middle">
        <div>Failed to generate report</div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  theme="error"
  position="middle"
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${this.renderer}"
></vaadin-notification>

Error notifications should be persistent, and provide the user with a button that closes the notification and/or allows the user to take appropriate action.

Notifications are non-modal and can be ignored, making them inappropriate for displaying unexpected technical errors that prevent the application from functioning, or situations that require immediate user action. Use a modal Dialog in such situations.

Primary

The primary theme variant can be used for important informational messages and/or to draw extra attention to it.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="primary" slot="middle">
        <div>New project plan available</div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  theme="primary"
  position="middle"
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${this.renderer}"
></vaadin-notification>

Contrast

A high-contrast version that improves legibility and distinguishes it from the rest of the UI.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="contrast" slot="middle">
        <div>5 tasks deleted</div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  theme="contrast"
  position="middle"
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${this.renderer}"
></vaadin-notification>

Duration

Notifications stay on-screen for 5 seconds by default. The duration is in milliseconds, and should be based on content and importance:

Use short durations for notifications that have:

  • Short text content

  • Lesser importance (for example, operations that finished without errors)

  • No interactive elements

Use longer durations for notifications that have:

  • Longer text content

  • Higher importance (for example, errors)

  • Interactive elements (for example, links or undo actions)

A duration of at least 5 seconds is recommended to ensure that the user has a chance to see and understand the notification.

Persistent Notifications

Setting the duration to zero disables auto closing, keeping the notification visible until explicitly dismissed by the user. This should be used for notifications that provide vital information to the user, such as errors. Persistent notifications should contain a Button that closes the notification and/or allows the user to take appropriate action.

Less important notifications should not be persistent, and instead disappear automatically after an appropriate delay.

Position

Notifications can be positioned in the viewport in seven non-stretched positions, or stretched across the top or bottom:

Use the position attribute in HTML templates, for example, <vaadin-notification position="top-end"></vaadin-notification>.

render() {
  return html`
    <vaadin-button @click="${this.show}">top-stretch</vaadin-button>
    <vaadin-button @click="${this.show}">top-start</vaadin-button>
    <vaadin-button @click="${this.show}">top-center</vaadin-button>
    <vaadin-button @click="${this.show}">top-end</vaadin-button>
    <vaadin-button @click="${this.show}">middle</vaadin-button>
    <vaadin-button @click="${this.show}">bottom-start</vaadin-button>
    <vaadin-button @click="${this.show}">bottom-center</vaadin-button>
    <vaadin-button @click="${this.show}">bottom-end</vaadin-button>
    <vaadin-button @click="${this.show}">bottom-stretch</vaadin-button>
  `;
}

show(e: MouseEvent) {
  // Use the button label as the location
  const position = (e.composedPath()[2] as HTMLElement).textContent as NotificationPosition;

  const notification = new NotificationElement();
  notification.position = position;

  notification.renderer = (root: HTMLElement) => {
    render(
      html`
        <div>${position}</div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${notification.close.bind(notification)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  };

  document.body.appendChild(notification);
  notification.open();

  // Remember to clean up the element from the DOM
  // if you are not reusing the same notification
  notification.addEventListener('opened-changed', () => {
    document.body.removeChild(notification);
  });
}

Recommendations

  • Top End or Bottom Start are recommended for most notifications, as these are non-obtrusive but still noticeable.

  • Middle is the most disruptive position, and only be used for important notifications like errors.

  • Bottom End is the least obtrusive position, but can go unnoticed.

  • Stretch notifications, that span the full width of the viewport, are more disruptive, and should be reserved for important notifications whose contents require more space.

  • Applications with a notification button or drop-down in the header or footer should position notifications to appear in the same part of the screen.

  • For a consistent user experience, use one or two positions throughout the application.

  • Avoid using positions that may obstruct important parts of the UI, such as navigation.

Stacking

Multiple simultaneously displayed notifications are stacked vertically, depending on their positioning:

  • When using the bottom half of the screen as the position, a new notification appears below the older notifications.

  • With the position set to the top half, a new notification appears above the existing notifications.

Size

The notification card is automatically sized based on its content.

  • In large viewports, the card’s maximum width is ⅓ of the viewport.

  • In small viewports, the card always takes up the entire width of the viewport.

Interactive Elements

Notifications can contain interactive content like Buttons or links that allow the user to perform related actions.

For example, if an operation fails, the error notification could offer the user the possibility to try again. Or, it could contain a link to a view that allows the user to resolve the problem.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="error" slot="middle">
        <div>Failed to generate report</div>
        <div style="width: 2em"></div>
        <vaadin-button theme="tertiary-inline">Retry</vaadin-button>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <div>Failed to generate report</div>
        <div style="width: 2em"></div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
        >
          Retry
        </vaadin-button>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  theme="error"
  position="middle"
></vaadin-notification>

In situations where the user might want to revert an action, display an Undo button.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="contrast" slot="middle">
        <div>5 tasks deleted</div>
        <div style="width: 2em"></div>
        <vaadin-button theme="tertiary-inline">Undo</vaadin-button>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <div>5 tasks deleted</div>
        <div style="width: 2em"></div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
        >
          Undo
        </vaadin-button>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  theme="contrast"
  duration="10000"
  position="middle"
></vaadin-notification>

Notifications can also contain links to relevant information.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card slot="middle">
        <div>Jason Bailey mentioned you in <a href="#">Project Q4</a></div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <div>Jason Bailey mentioned you in <a href="#">Project Q4</a></div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${() => (this.notificationOpen = false)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  position="middle"
></vaadin-notification>

Making Interactive Elements Keyboard-Accessible

Take care to ensure that keyboard-only users can access interactive elements in notifications:

  • Make the notification persistent, to prevent it from disappearing before the user has had a chance to interact with it.

  • Provide a keyboard shortcut, either to trigger the action itself, or to move focus to the notification card in cases where multiple interactive elements are present.

  • Make the shortcut discoverable, for example, by displaying it as part of the notification’s content.

import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].indexOf(window.navigator.platform) > -1;

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="contrast" slot="middle">
        <div>5 tasks deleted</div>
        <div style="width: 2em"></div>
        <vaadin-button theme="primary">
          Undo
          <span aria-hidden="true"> &nbsp; ${isMac ? '⌘' : 'Ctrl-'}Z</span>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  .opened="${this.notificationOpen}"
  @opened-changed="${(e: any) => (this.notificationOpen = e.detail.value)}"
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <div>5 tasks deleted</div>
        <div style="width: 2em"></div>
        <vaadin-button theme="primary" @click="${() => (this.notificationOpen = false)}">
          Undo
          <!-- Ideally, this should also be hidden if the
               device does not have a physical keyboard -->
          <span aria-hidden="true"> &nbsp; ${this.isMac ? '⌘' : 'Ctrl-'}Z </span>
        </vaadin-button>
      `,
      root
    );
  })}"
  theme="contrast"
  duration="10000"
  position="middle"
></vaadin-notification>

Icons and Other Rich Formatting

Icons and other content formatting can be used to provide information and helpful visual cues, for example, to make errors and success notifications easier to distinguish for users with color blindness.

import { html, LitElement } from 'lit';
import { customElement } from 'lit/decorators.js';
import '@vaadin/vaadin-avatar/vaadin-avatar';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-icons/vaadin-icons';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

@customElement('notification-rich-preview')
export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card theme="success" slot="middle">
        <iron-icon icon="lumo:checkmark" class="checkmark"></iron-icon>
        <div>Application submitted!</div>
        <div style="width: 2em"></div>
        <vaadin-button>View</vaadin-button>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>

      <vaadin-notification-card theme="error" slot="middle">
        <iron-icon icon="vaadin:warning" class="warning"></iron-icon>
        <div>Failed to generate report</div>
        <div style="width: 2em"></div>
        <vaadin-button>Retry</vaadin-button>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>

      <vaadin-notification-card slot="middle">
        <vaadin-avatar name="Jason Bailey"></vaadin-avatar>
        <div><b>Jason Bailey</b> mentioned you in <a href="#">Project Q4</a></div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>

      <vaadin-notification-card slot="middle">
        <iron-icon icon="lumo:checkmark" class="checkmark"></iron-icon>
        <div>
          <b style="color: var(--lumo-success-text-color);">Upload successful</b>
          <div style="font-size: var(--lumo-font-size-s); color: var(--lumo-secondary-text-color);">
            <b>Financials.xlsx</b> is now available in <a href="#">Documents</a>
          </div>
        </div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
<vaadin-notification
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <iron-icon icon="lumo:checkmark" class="checkmark"></iron-icon>
        <div>Application submitted!</div>
        <div style="width: 2em"></div>
        <vaadin-button @click="${this.close.bind(this, 1)}">View</vaadin-button>
        <vaadin-button
          theme="tertiary-inline"
          @click="${this.close.bind(this, 1)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  theme="success"
  position="middle"
></vaadin-notification>

<vaadin-notification
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <iron-icon icon="vaadin:warning" class="warning"></iron-icon>
        <div>Failed to generate report</div>
        <div style="width: 2em"></div>
        <vaadin-button @click="${this.close.bind(this, 2)}">Retry</vaadin-button>
        <vaadin-button
          theme="tertiary-inline"
          @click="${this.close.bind(this, 2)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  theme="error"
  position="middle"
></vaadin-notification>

<vaadin-notification
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <vaadin-avatar name="Jason Bailey"></vaadin-avatar>
        <div><b>Jason Bailey</b> mentioned you in <a href="#">Project Q4</a></div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${this.close.bind(this, 3)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  position="middle"
></vaadin-notification>

<vaadin-notification
  .renderer="${guard([], () => (root: HTMLElement) => {
    render(
      html`
        <iron-icon icon="lumo:checkmark" class="checkmark"></iron-icon>
        <div>
          <b style="color: var(--lumo-success-text-color);">Upload successful</b>
          <div
            style="font-size: var(--lumo-font-size-s); color: var(--lumo-secondary-text-color);"
          >
            <b>Financials.xlsx</b> is now available in <a href="#">Documents</a>
          </div>
        </div>
        <vaadin-button
          theme="tertiary-inline"
          @click="${this.close.bind(this, 4)}"
          aria-label="Close"
        >
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      `,
      root
    );
  })}"
  position="middle"
></vaadin-notification>

Best Practices

Use Sparingly

Notifications are disruptive by design and should be used sparingly. Use fewer notifications by reserving them for more important information that may otherwise go unnoticed by the user.

Less urgent notifications can be provided through a link or drop-down in the application header or footer, instead of immediate notifications.

render() {
  return html`
    <vaadin-context-menu open-on="click" .renderer="${this.menuRenderer}">
      <vaadin-button aria-label="notifications" theme="tertiary">
        <iron-icon icon="lumo:bell"></iron-icon>
        <span theme="badge error primary small pill">4</span>
      </vaadin-button>
    </vaadin-context-menu>
  `;
}

menuRenderer = (root: HTMLElement) =>
  render(html`<div style="padding: var(--lumo-space-l);">Show notifications here</div>`, root);

Limit Content Length

Aim for one or two lines of content. Notifications should be brief and to the point. More information can be provided through an embedded link or Button.

Do show a preview of longer content, and link to the full details
import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card slot="middle">
        <div>
          <div>Aria Bailey</div>
          <div style="font-size: var(--lumo-font-size-s); color: var(--lumo-secondary-text-color);">
            Yeah, I know. But could you help me with...
          </div>
        </div>
        <vaadin-button>View</vaadin-button>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
Don’t display all details in the notification
import { html, LitElement } from 'lit';
import '@vaadin/vaadin-button/vaadin-button';
import '@vaadin/vaadin-lumo-styles/icons';
import '@vaadin/vaadin-notification/vaadin-notification';
import { applyTheme } from 'Frontend/generated/theme';

export class Example extends LitElement {
  protected createRenderRoot() {
    const root = super.createRenderRoot();
    // Apply custom theme (only supported if your app uses one)
    applyTheme(root);
    return root;
  }

  render() {
    return html`
      <vaadin-notification-card slot="middle">
        <div>
          <div>New message from Aria Bailey</div>
          <div style="font-size: var(--lumo-font-size-s); color: var(--lumo-secondary-text-color);">
            Yeah, I know. But could you help me with this. I’m not sure where the bug is in my CSS?
            The checkmark doesn’t get the right color. I’m trying to use the CSS custom properties
            from our design system, but for some reason it’s not working.
          </div>
        </div>
        <vaadin-button theme="tertiary-inline">
          <iron-icon icon="lumo:cross"></iron-icon>
        </vaadin-button>
      </vaadin-notification-card>
    `;
  }
}
ComponentUsage recommendations

Dialog

Dialog should be used instead of Notification for anything that requires immediate user action.