Modals are dialogs displayed over inert content that allow users to complete a singular, focused task without leaving the page.
shouldShowCloseButton={false}) and provide primary/secondary footer actions.isDisabled) until input requirements are met. Mark the primary action as isDanger.shouldCloseOnOverlayClick={false}) to prevent accidental data loss. Place submit and cancel buttons in the footer.isDanger), and save (primary).ModalSplit for a branded graphic panel alongside the body content. Hide the close button and include a single call-to-action.ModalSplit. Place ModalSplit before ModalBody for a left panel, or after 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. Always provide a cancel action in the footer when the close button is hidden.ModalInset) -- renders content edge-to-edge, ignoring the Modal's default padding. Use for full-width backgrounds, images, or dividers.isDismissable={false}) -- sets shouldShowCloseButton, shouldCloseOnOverlayClick, and shouldCloseOnEscapePress to false in one prop. Individual props still override isDismissable when explicitly set.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 Modal body scrolls while the header and footer remain fixed. Set to true to scroll the entire Modal within the viewport.animationTransitionDuration) -- fade and downward slide. The duration is customizable.ModalBody for scrollable body content, ModalFooter for action buttons, ModalSplit for split-layout panels, and ModalInset for edge-to-edge content.ModalFooter wraps ButtonGroup with groupVariant="spaced" -- pass Button components directly as children.ModalSplit panel side is controlled by DOM order relative to ModalBody, not a prop.ModalInset accepts inheritPadding (default true when used inside ModalBody) to control whether it inherits the Modal's padding.isOpen and onClose. onClose receives (event, reason) where reason is "close-button-press", overlay click, or escape press.onOpen fires when opened, onCloseComplete fires after the close animation finishes.initialFocusIndex overrides which focusable element receives focus when the Modal opens (default is the first).state prop accepts all Modal props as a single object for use with a ModalsManager pattern.title prop renders the default header. Omit title to render no header.<PlumaModal @isOpen={{this.isOpen}} @onClose={{this.handleClose}} @title="Modal title">. Subcomponents: <PlumaModalBody>, <PlumaModalFooter>, <PlumaModalSplit>, <PlumaModalInset>.<PlumaModal ... as |ctx|>.animationTransitionDuration can be set via PlumaProvider's componentConfig.PlumaModal.