Lion Logo Lion Guides Components Docs Blog Toggle darkmode

Dialog: Features

lion-dialog is a component wrapping a modal dialog controller. Its purpose is to make it easy to use our Overlay System declaratively.

<lion-dialog>
  <div slot="content">
    This is a dialog
    <button @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}>x</button>
  <div>
  <button slot="invoker">Click me</button>
</lion-dialog>

Styling content

It's not possible to style content from the dialog component. This is because the content slot is moved to the global root node. This is why a custom component should be created and slotted in as the content. This ensures style encapsulation on the dialog content.

export const stylingContent = () => html`
  <style>
    ___HTML_0___
  </style>
  <lion-dialog .config=$>
    <button slot="invoker">Styled dialog</button>
    <styled-dialog-content slot="content"></styled-dialog-content>
  </lion-dialog>
`;

Content with slots

export const slotsContent = () => html`
  <style>
    ___HTML_0___
  </style>
  <lion-dialog .config=$>
    <button slot="invoker">Dialog with content with slots</button>
    <slots-dialog-content slot="content">
      <p>Some Stuff</p>
      <p slot="actions">I am in the actions slot</p>
    </slots-dialog-content>
  </lion-dialog>
`;

Close overlay from component slotted as content

The overlay cannot be closed by dispatching the close-overlay from a button in a styled component that is slotted in as content, because it will not cross the shadow boundary of the component. A method should be created that will dispatch the close-overlay event from the component.

export const closeOverlayFromComponent = () => html`
  <style>
    ___HTML_0___
  </style>
  <lion-dialog .config=$>
    <button slot="invoker">Styled dialog</button>
    <styled-dialog-content slot="content"></styled-dialog-content>
  </lion-dialog>
`;

Placement overrides

export const placementOverrides = () => {
  const dialog = placement => html`
    <lion-dialog .config=$>
      <button slot="invoker">Dialog ${placement}</button>
      <div slot="content" class="dialog">
        Hello! You can close this notification here:
        <button
          class="close-button"
          @click=${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}
        ></button>
      </div>
    </lion-dialog>
  `;
  return html`
    <style>
      ___HTML_0___
    </style>
    <div class="demo-box_placements">
      ___HTML_1___ ___HTML_2___ ___HTML_3___ ___HTML_4___
      ___HTML_5___
    </div>
  `;
};

Configuration passed to config property:

{
  viewportConfig: {
    placement: ... // <-- choose a position
  }
}

Other overrides

No backdrop, hides on escape, prevents scrolling while opened, and focuses the body when hiding.

export const otherOverrides = () => html`
  <style>
    ___HTML_0___
  </style>
  <lion-dialog
    .config=$
  >
    <button slot="invoker">Click me to open dialog</button>
    <div slot="content" class="dialog">
      Hello! You can close this dialog here:
      <button
        class="close-button"
        @click=___HTML_1___
      ></button>
    </div>
  </lion-dialog>
`;

Configuration passed to config property:

{
  hasBackdrop: false,
  hidesOnEscape: true,
  preventsScroll: true,
  elementToFocusAfterHide: document.body
}