Dialog

Modal dialog for important user interactions. Captures focus and requires user action.

Installation

Import
import { Dialog } from '@svelte-atoms/core';

Preset Configuration

Customize the dialog appearance using presets

You can customize the default styles for Dialog components by defining presets in your configuration:

Examples

Explore different dialog variations

Basic Dialog

Simple modal dialog

Code
<script lang="ts">
  import { Dialog, Button } from '@svelte-atoms/core';

  let open = $state(false);
</script>

<Dialog.Root bind:open={open}>
  {#snippet trigger({dialog})}
    <Button {...dialog.trigger()}>Open Dialog</Button>
  {/snippet}

  <Dialog.Content>
    <Dialog.Header class="mb-4">
      <h2 class="text-foreground text-xl font-semibold">Dialog Title</h2>
    </Dialog.Header>
    <Dialog.Body>
      <p>
        This is a modal dialog. It captures focus and requires user interaction before
        returning to the main content.
      </p>
    </Dialog.Body>
    <Dialog.Footer class="flex justify-end gap-2">
      <Button variant="secondary" onclick={() => (open = false)}>
        Cancel
      </Button>
      <Button
        variant="primary"
        onclick={() => (open = false)}
      >
        Confirm
      </Button>
    </Dialog.Footer>
  </Dialog.Content>
</Dialog.Root>

Alert Dialog

Dialog for critical actions

Code
<script lang="ts">
  import { Dialog, Button } from '@svelte-atoms/core';

  let open = $state(false);
</script>

<Dialog.Root bind:open={open}>
  {#snippet trigger({dialog})}
    <Button variant="destructive" {...dialog.trigger()}>Delete Item</Button>
  {/snippet}

  <Dialog.Content class="bg-background max-w-md rounded-lg p-6 shadow-lg">
    <Dialog.Header class="mb-4">
      <h2 class="text-foreground text-xl font-semibold">Are you sure?</h2>
    </Dialog.Header>
    <Dialog.Body class="text-muted-foreground mb-6">
      <p>This action cannot be undone. This will permanently delete the item.</p>
    </Dialog.Body>
    <Dialog.Footer class="flex justify-end gap-2">
      <Button variant="secondary" onclick={() => (open = false)}>
        Cancel
      </Button>
      <Button
        variant="destructive"
        onclick={() => (open = false)}
      >
        Confirm Delete
      </Button>
    </Dialog.Footer>
  </Dialog.Content>
</Dialog.Root>

API Reference

Dialog.Root Props

Prop
Type
Default
Description
open
boolean | undefined
false
Open
disabled
boolean | undefined
false
Disabled
portal
string | PortalBond | undefined
''
Portal
factory
((props: DialogBondProps) => DialogBond<DialogBondState<DialogBondProps>>) | undefined
undefined
Factory
children
Snippet<[{ dialog: DialogBond<DialogBondState<DialogBondProps>>; }]> | undefined
undefined
Children

Accessibility

Built-in Accessibility Features

  • • Focus trapped within dialog
  • • Escape key to close
  • • Proper ARIA attributes (role="dialog", aria-modal)
  • • Returns focus to trigger on close
  • • Screen reader announcements
  • • Keyboard navigation support