1.0.0 • Published 2 years ago

svelte-aria-dialog v1.0.0

Weekly downloads
-
License
-
Repository
github
Last release
2 years ago

svelte-aria-dialog

Yet another Svelte dialog component.

Dialog example

Why?

While there are plenty of packages out there that provide modals or dialogs in Svelte, most fall short in at least one these aspects:

  • They are not accessible to users of assistive technologies, or are not ARIA-compliant.
  • Their APIs are overengineered and not especially intuitive. Some are not declarative, others abuse the Context API for showing/hiding.
  • They take opinions on styling and layout, making them difficult to adapt to the needs of a particular project.

This project aims to fill these gaps. svelte-aria-dialog is a tiny svelte component that provides a mostly unstyled, WAI-ARIA accessible modal dialog with a few simple options.

Focus trapping is provided by the lightweight focus-trap module.

Installation

npm

npm install svelte-aria-dialog

pnpm

pnpm install svelte-aria-dialog

yarn

yarn add svelte-aria-dialog

Usage

To open a dialog, bind the open prop to a boolean value.

Basic 2-Button Dialog

<script>
    import { Dialog } from "svelte-aria-dialog";

    let open = false;

    function save() {
        alert("Saved");
        open = false;
    }
</script>

<button on:click={() => open = true}>Open Dialog</button>

<Dialog bind:open title="Title">
    This is a simple Dialog.
    <svelte:fragment slot="footer">
        <button on:click={save}>Save</button>
        <button on:click={() => open = false}>Close</button>
    </svelte:fragment>
</Dialog>

Non-closable Dialog

<script>
    import { Dialog } from "svelte-aria-dialog";

    let open = false;
</script>

<button on:click={() => open = true}>Open Dialog</button>

<Dialog bind:open closable={false} title="Title">
    I can't be closed!
</Dialog>

Custom DOM Target (Portal)

<script>
    import { Dialog } from "svelte-aria-dialog";

    let open = false;
</script>

<button on:click={() => open = true}>Open Dialog</button>

<Dialog bind:open title="Title" append={document.body}>
    This dialog will be appended to <body>.
</Dialog>

Dialog Events - on:open and on:close

<script>
    import { Dialog } from "svelte-aria-dialog";

    let open = false;

    function handleOpen() {
        alert("Opened!");
    }

    function handleClose() {
        alert("Closed!");
    }
</script>

<button on:click={() => open = true}>Open Dialog</button>

<Dialog bind:open title="Title" on:open={handleOpen} on:close={handleClose}>
    This dialog will emit events when opened and closed.
      <button slot="footer" on:click={() => open = false}>Close</button>
</Dialog>

API

All unused props are passed to the inner dialog element through $$restProps.

Props

PropertyTypeDefaultDescription
openbooleanfalseDetermines whether the dialog is open or not
titlestring""Title text displayed as the dialog header
closablebooleantrueDetermines whether the dialog can be conventially closed using the escape key or backdrop click.
appendHTMLElementundefinedDetermines the node the dialog should be appended to
classstring""Specifies a custom class name for the dialog

Slots

NameDescription
defaultContent of the dialog.
footerElements inserted at the bottom of the dialog in the footer.
outerElements inserted outside of the inner dialog.

Events (Dispatched)

NameDescription
openDispatched when the dialog is mounted into the DOM.
closeDispatched when the dialog is removed from the DOM.