Skip to main content

ftui_widgets/modal/
mod.rs

1#![forbid(unsafe_code)]
2
3//! Modal container widget (overlay layer), dialog presets, modal stack management, and animations.
4//!
5//! # Animation System (bd-39vx.4)
6//!
7//! Modals support smooth entrance and exit animations:
8//!
9//! - **Scale-in/out**: Classic modal pop effect
10//! - **Fade-in/out**: Opacity transition
11//! - **Slide animations**: Slide from top/bottom
12//! - **Backdrop fade**: Independent backdrop opacity animation
13//! - **Reduced motion**: Respects accessibility preferences
14//!
15//! Use [`ModalAnimationState`] to track animation progress and compute
16//! interpolated values for scale, opacity, and position.
17//!
18//! # Focus Management (bd-39vx.5)
19//!
20//! Modals can integrate with [`crate::focus::FocusManager`] for accessibility:
21//!
22//! - **Auto-focus**: First focusable element receives focus when modal opens
23//! - **Focus trap**: Tab navigation is constrained within the modal
24//! - **Focus restore**: Previous focus is restored when modal closes
25//! - **Escape to close**: Already built into modal handling
26//!
27//! Use [`FocusAwareModalStack`] as the canonical focus-aware modal API. For
28//! lower-level orchestration, pair [`ModalStack::push_with_focus`] with your own
29//! `FocusManager`.
30//!
31//! # Example
32//!
33//! ```ignore
34//! use ftui_widgets::modal::{FocusAwareModalStack, WidgetModalEntry, ModalAnimationState};
35//!
36//! let mut modals = FocusAwareModalStack::new();
37//! let mut animation = ModalAnimationState::new();
38//!
39//! // Start opening animation
40//! animation.start_opening();
41//!
42//! // Push modal with focus trap
43//! modals.push_with_trap(
44//!     Box::new(WidgetModalEntry::new(dialog).with_focusable_ids(vec![1, 2, 3])),
45//!     vec![1, 2, 3],
46//! );
47//! ```
48
49mod animation;
50mod container;
51mod dialog;
52pub mod focus_integration;
53mod stack;
54
55pub use animation::{
56    ModalAnimationConfig, ModalAnimationPhase, ModalAnimationState, ModalEasing,
57    ModalEntranceAnimation, ModalExitAnimation,
58};
59pub use container::{
60    BackdropConfig, MODAL_HIT_BACKDROP, MODAL_HIT_CONTENT, Modal, ModalAction, ModalConfig,
61    ModalPosition, ModalSizeConstraints, ModalState,
62};
63pub use dialog::{
64    DIALOG_HIT_BUTTON, Dialog, DialogBuilder, DialogButton, DialogConfig, DialogKind, DialogResult,
65    DialogState,
66};
67pub use focus_integration::FocusAwareModalStack;
68pub use stack::{
69    ModalFocusId, ModalId, ModalResult, ModalResultData, ModalStack, StackModal, WidgetModalEntry,
70};