//! The app-agnostic component library: small, wiki-free (no GraphQL / domain //! knowledge) Material 3 components, each in its own module so they can be reused //! individually and lifted into a shared crate for the atproto rewrite. Screens //! compose these plus the form-control primitives in [`crate::components::ui`]. //! //! Everything is re-exported at the `widgets::` root, so callers use //! `widgets::Dialog`, `widgets::DataTable`, etc. regardless of the file layout. mod atoms; mod color_picker; mod dialog; mod feedback; mod focus; mod image; mod password_dots; mod segmented_button; mod split_button; mod table; mod tabs; mod tool_sheet; pub use atoms::{Badge, Bar, Carousel, Chip, ListItem, Spinner, SupportingPaneLayout}; pub use color_picker::ColorPicker; pub use dialog::Dialog; pub use feedback::{EmptyState, ErrorState}; pub use image::ZoomableImage; // The interim's password form is its one caller. #[cfg_attr(feature = "appview", allow(dead_code, unused_imports))] pub use password_dots::PasswordDots; pub use segmented_button::SegmentedButton; // Kept exported with no caller on purpose: the editor tried a split button for // Save/Submit and reverted it days before a deadline (see `editor.rs`), and the // widget waits in the library for a calmer surface rather than being rewritten. #[allow(unused_imports)] pub use split_button::SplitButton; pub use table::{DataTable, FilterToolbar, PaginatedTable}; pub use tabs::Tabs; // CopyLinkAction is deliberately not re-exported: ToolSheet renders it itself as // its quick group's first segment, so no call site places (or misplaces) it. pub use tool_sheet::{ExportAction, SheetGroup, ToolSheet, TOOLS_DOCKED}; // Modal-accessibility helpers, reused by the layout's AppSwitcher. pub(crate) use focus::{active_html_element, close_modal, trap_tab_focus};