npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@isoftdata/svelte-modal

v2.7.1

Published

Readme

Svelte Modal

Screenshot of the attachment component Screenshot of the attachment component Screenshot of the attachment component

Install

pnpm i @isoftdata/svelte-modal

Breaking changes

2.0.0

  • Require Svelte 5
  • Slots -> Snippets
  • Events -> Callbacks
    • Remove backdrop event/callback
    • close callback arg is now a MouseEvent or a KeyboardEvent, and is now also fired when the modal is triggered by pressing "Escape"
  • Use $props.id() (uniqueId below) in the default value of "id" related props
    • Default modalId value is now modal-body-${uniqueId} rather than itModal
    • Default closeId value is now close-modal-${uniqueId} rather than close-modal
  • Remove m-0 from the div around the footer snippet, which was previous the modalFooter slot.
  • Deprecate props with "modal" in name, replace with props with less-redundant names:
    • modalBodyClass -> bodyClass
    • modalDialogClass -> dialogClass
    • modalId -> id
    • modalSize -> size
    • modalHeader -> header
    • modalFooter -> footer

Props

| Name | Type | Description | Default Value | | ---- | ---- | ---------- | ---- | | backdropClickCancels | boolean | Determines whether clicking on the backdrop should close the modal. | true | | bodyClass | ClassValue | Additional CSS classes to apply to the modal body element. | '' | | cancelButtonColor | ButtonColors | The Bootstrap class to apply to the cancel button. | "secondary" | | cancelButtonIcon | IconName \| IconProps | The FontAwesome icon to display on the cancel button, without the preceeding fa-. | "times" | | cancelButtonOutline | boolean | Whether the button should be outlined, instead of solid. | false | | cancelButtonText | string | The text to display on the cancel button. | "Close" | | cancelButtonTitle | string | The title of the cancel button | "" | | cancelShown | boolean | Determines whether the cancel button is shown in the modal (This is the Cancel button at the bottom)footer. | true | | cancelButton | HTMLButtonElement | A reference to the cancel HTMLButtonElement. | undefined (bindable) | | closeId | string | The ID of the close button. | "close-modal" | | closeShown | boolean | Determines whether the close button is shown in the modal (This is the X in the top right corner) header. | true | | confirmButtonColor | ButtonColors | The Bootstrap color class to apply to the confirm button. | "success" | | confirmButtonDisabled | boolean | Determines whether the confirm button is disabled. | false | | confirmButtonIcon | IconName \| IconProps | The FontAwesome icon to display on the confirm button, without the preceeding fa-. | "check" | | confirmButtonIsLoading | boolean | Whether to disable and show a spinner on the "Confirm" button. | false | | confirmButtonOutline | boolean | Whether the button should be outlined, instead of solid. | false | | confirmButtonText | string | The text to display on the confirm button. | "Confirm" | | confirmButtonTitle | string | The title of the confirm button | "" | | confirmDropdownItems | Snippet | A snippet that, if passed, turns the confirm Button into a Dropdown. The contents of this snippet will be applied to the dropdownItems slot of that dropdown | undefined | | confirmShown | boolean | Determines whether the confirm button is shown in the modal footer. | true | | confirmButton | HTMLButtonElement | A reference to the confirm HTMLButtonElement. | undefined (bindable) | | dialogClass | ClassValue | Additional CSS classes to apply to the modal dialog element. | '' | | footerClass | ClassValue | Custom CSS class to apply to the modal footer element. | "align-items-end" | | footerShown | boolean | Determines whether the modal footer is shown. | true | | footerStyle | string | Any additional CSS styles to add to the modal footer. | "" | | form | boolean | Whether to wrap the modal body content in a <form> element. See the Making the confirm button submit the form section below. | false | | formProps | Omit<HTMLFormAttributes, 'onsubmit'> | Additional attributes to add to the <form> element when the form prop is set to true. For onsubmit, use the confirm callback instead. | {} | | fullscreen | boolean \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'xxl' | Breakpoint to apply fullscreen from that size and down. Boolean true for all sizes. This option is only available with Bootstrap 5. | false | | headerShown | boolean | Determines whether the modal header is shown. | true | | id | string | The ID of the modal-body element. | "itModal" | | savingInProgress | boolean | Whether to disable the confirm/cancel buttons and show "Saving..." on the confirm button. | false | | setFocusInModal | boolean | Determines whether to set focus to the modal when it is opened, and restore focus to the previously focused element when it is closed. Learn more in Handling Element Focus. | true | | show | boolean | Determines whether the modal is currently visible or hidden. You probably want to bind: to this. | false (bindable) | | showModalContent | boolean | Determines whether to show the modal content (header, body, and footer) or hide it (can be used for a loading state). | true | | size | "sm" \| "" \| "lg" \| "xl" \| "xxl" | Determines the maximum width of the modal. | "" | | subtitle | string | An optional subtitle to display below the main title. | '' | | title | string | The main title of the modal. | "Confirm" | | transitionMode | string | The transition mode for the modal and its content (possible values: "present", "cardMovePrevious", "cardMoveNext"). | "present" | | zIndex | number | The z-index of the modal element. | 20000 |

Snippets

  • default - The modal body.
  • header - The modal header.
  • footer - the modal footer.

Callbacks

  • close(event: MouseEvent | KeyboardEvent) => void - Called when the modal is closed, either through clicking on the backdrop, clicking a close button, or pressing "Escape"
  • confirm(event: MouseEvent | SubmitEvent) => void - Called when Confirm button is clicked.

Methods

  • prompt() => Promise<boolean> - Opens the modal and returns a promise that resolves once the user has completed their work in the modal. Return is true if the confirm button is clicked, or false if the modal is closed.

Example

<script lang="ts">
	import Modal from '@isoftdata/svelte-modal'
</script>

<Modal
	bind:show
	confirm={() => show = false}
>
	Modal content goes here.
</Modal>

Making the confirm button submit the form

A common need is for the modal-body to contain form elements that are in a <form> element. When the user presses the modal's confirm button, you want it to be the same as submitting the form. To do this, set the form prop to true.

Applying the form prop will ensure the following happen automatically:

  • Everything in the default children snippet goes inside a <form> element.
  • The confirm button's type is submit and will submit the form when clicked.
  • preventDefault will be called on the form's SubmitEvent, so the page doesn't reload.
<script lang="ts">
	import Modal from '@isoftdata/svelte-modal'
</script>

<Modal
	form
	bind:show
	confirm={() => {
		// This will get called when the form is submitted, either by clicking the confirm button or pressing Enter in a form field.
		show = false
	}}
>
	<!-- Everything in this modal body will be in a form element since the form prop is set -->
	<Input bind:value={name} label="Name" />
</Modal>

Handling Element Focus

By default, when the modal is shown, it will attempt to set focus to the .modal-body element if the active element is not already within the .modal-body. When the modal is closed, it will attempt to restore focus to the element that was focused before the modal was opened.

This behavior can be disabled with the setFocusInModal prop(default true). If setFocusInModal is set to false, the modal will not change the focus when it is opened or closed.

You may want to set setFocusInModal to false if you are managing focus manually or if the automatic focus behavior is causing issues in your application. For example, you open Modal B after closing Modal A, and Modal A restores focus back to the previous element in the app, stealing focus away from Modal B.