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`] for automatic focus management, or integrate
28//! manually using [`ModalStack::push_with_focus`] with your own `FocusManager`.
29//!
30//! # Example
31//!
32//! ```ignore
33//! use ftui_widgets::modal::{FocusAwareModalStack, WidgetModalEntry, ModalAnimationState};
34//!
35//! let mut modals = FocusAwareModalStack::new();
36//! let mut animation = ModalAnimationState::new();
37//!
38//! // Start opening animation
39//! animation.start_opening();
40//!
41//! // Push modal with focus trap
42//! modals.push_with_trap(
43//! Box::new(WidgetModalEntry::new(dialog).with_focusable_ids(vec![1, 2, 3])),
44//! vec![1, 2, 3],
45//! );
46//! ```
47
48mod animation;
49mod container;
50mod dialog;
51pub mod focus_integration;
52mod stack;
53
54pub use animation::{
55 ModalAnimationConfig, ModalAnimationPhase, ModalAnimationState, ModalEasing,
56 ModalEntranceAnimation, ModalExitAnimation,
57};
58pub use container::{
59 BackdropConfig, MODAL_HIT_BACKDROP, MODAL_HIT_CONTENT, Modal, ModalAction, ModalConfig,
60 ModalPosition, ModalSizeConstraints, ModalState,
61};
62pub use dialog::{
63 DIALOG_HIT_BUTTON, Dialog, DialogBuilder, DialogButton, DialogConfig, DialogKind, DialogResult,
64 DialogState,
65};
66pub use focus_integration::FocusAwareModalStack;
67pub use stack::{
68 ModalFocusId, ModalFocusIntegration, ModalId, ModalResult, ModalResultData, ModalStack,
69 StackModal, WidgetModalEntry,
70};