Modals are dialogs displayed over inert content that allow users to complete a singular, focused task without leaving the page.
shouldShowCloseButton={false}) and assemble ModalBody with a ModalFooter holding secondary and primary actions.ModalBody, and disable the primary action (isDisabled) until input requirements are met. Mark the primary action isDanger.shouldCloseOnOverlayClick={false}) to prevent accidental data loss. Put submit and cancel buttons in ModalFooter.ModalFooter three actions: a go-back action pushed left with mr="auto", a discard action (isDanger), and a primary save action.ModalBody with a single primary dismiss button in ModalFooter.ModalSplit for the graphic panel, hide the close button, and include a single call-to-action in ModalFooter.ModalSplit. Place ModalSplit before ModalBody for a left panel, after it for a right panel.size, default "md") — use "md" for most use cases. Use "sm" for shorter content and smaller viewports.shouldShowCloseButton, default true) — hide it only when the Modal requires an explicit user decision, such as deleting data. Always provide a cancel action in the footer when the close button is hidden.ModalInset) — renders content edge-to-edge over the Modal's default padding. Use for full-width backgrounds, images, or dividers that bleed to the Modal's edges.isDismissable={false}) — sets shouldShowCloseButton, shouldCloseOnOverlayClick, and shouldCloseOnEscapePress to false in one prop. Each individual prop still wins when explicitly set. Reserve non-dismissable Modals for cases where user interaction is mandatory.shouldCloseOnOverlayClick, default true) — disable for form Modals to prevent accidental data loss.shouldCloseOnEscapePress, default true) — disable alongside the close button for Modals that require an explicit choice.shouldScrollInViewport, default false) — by default the body scrolls while the header and footer stay fixed. Set to true to scroll the entire Modal within the viewport.animationTransitionDuration) — the Modal fades and slides down; the overlay fades independently. Pass a duration in milliseconds to customize it.ModalBody for body content, ModalFooter for action buttons, ModalSplit for split-layout panels, and ModalInset for edge-to-edge content. Pass them as children in React, or in the default block in Ember.Modal renders the overlay and dialog together. ModalDialog renders only the dialog (no overlay, no open/close state) — use it for static rendering such as documentation examples, not for real dialogs.title renders the default header, which composes ModalHeader, ModalTitle, and ModalCloseButton. Omitting title renders no header at all — and therefore no close button, since the close button lives in the header.shouldShowCloseButton with isDismissable={false} renders the close button in a disabled state rather than hiding it.ModalFooter wraps ButtonGroup with groupVariant="spaced" — pass Button components directly as children.ModalSplit panel side is controlled by DOM order relative to ModalBody, not by a prop.ModalBody is a ModalInset with inheritPadding defaulting to true. Set inheritPadding on ModalInset to opt back into the Modal's padding.isOpen and onClose. onClose receives (event, reason), where reason is "close-button-press" or a floating-ui open-change reason for overlay click and escape press.onOpen fires when the Modal opens, onCloseComplete fires after the close animation finishes.initialFocusIndex overrides which focusable element receives focus on open (default is the first).state accepts all other Modal props as a single object, for use with a ModalsManager pattern. Props passed directly override matching keys in state.<PlumaModal @isOpen={{this.isOpen}} @onClose={{this.handleClose}} @title="Modal title">. Subcomponents are <PlumaModalBody>, <PlumaModalFooter>, <PlumaModalSplit>, <PlumaModalInset>, and <PlumaModalDialog>.<PlumaModal ... as |ctx|>.animationTransitionDuration default via PlumaProvider's componentConfig.PlumaModal.