use crate::input::Event;
#[cfg(feature = "input-components")]
mod button;
#[cfg(feature = "input-components")]
mod checkbox;
#[cfg(feature = "input-components")]
mod dropdown;
#[cfg(feature = "input-components")]
mod input_field;
#[cfg(feature = "input-components")]
pub mod line_input;
#[cfg(feature = "input-components")]
mod number_input;
#[cfg(feature = "input-components")]
mod radio_group;
#[cfg(feature = "input-components")]
mod select;
#[cfg(feature = "input-components")]
mod slider;
#[cfg(feature = "input-components")]
mod switch;
#[cfg(feature = "input-components")]
mod text_area;
#[cfg(feature = "compound-components")]
mod alert_panel;
#[cfg(feature = "compound-components")]
mod box_plot;
#[cfg(feature = "compound-components")]
mod chart;
#[cfg(feature = "compound-components")]
mod conversation_view;
#[cfg(feature = "compound-components")]
mod data_grid;
#[cfg(feature = "compound-components")]
pub mod diagram;
#[cfg(feature = "compound-components")]
pub mod diff_viewer;
#[cfg(feature = "compound-components")]
mod event_stream;
#[cfg(feature = "compound-components")]
pub mod file_browser;
#[cfg(feature = "compound-components")]
mod flame_graph;
#[cfg(feature = "compound-components")]
mod form;
#[cfg(feature = "compound-components")]
mod heatmap;
#[cfg(feature = "compound-components")]
mod histogram;
#[cfg(feature = "compound-components")]
mod log_correlation;
#[cfg(feature = "compound-components")]
mod log_viewer;
#[cfg(feature = "compound-components")]
mod metrics_dashboard;
#[cfg(feature = "compound-components")]
pub mod pane_layout;
#[cfg(feature = "compound-components")]
mod searchable_list;
#[cfg(feature = "compound-components")]
mod span_tree;
#[cfg(feature = "compound-components")]
mod split_panel;
#[cfg(feature = "compound-components")]
mod timeline;
#[cfg(feature = "compound-components")]
pub mod treemap;
#[cfg(feature = "data-components")]
mod loading_list;
#[cfg(feature = "data-components")]
mod selectable_list;
#[cfg(feature = "data-components")]
mod table;
#[cfg(feature = "data-components")]
mod tree;
#[cfg(feature = "display-components")]
mod big_text;
#[cfg(feature = "display-components")]
mod calendar;
#[cfg(feature = "display-components")]
mod canvas;
#[cfg(feature = "display-components")]
pub mod code_block;
#[cfg(feature = "display-components")]
mod collapsible;
#[cfg(feature = "display-components")]
mod divider;
#[cfg(feature = "display-components")]
mod gauge;
#[cfg(feature = "display-components")]
mod help_panel;
#[cfg(feature = "display-components")]
mod key_hints;
#[cfg(feature = "display-components")]
mod multi_progress;
#[cfg(feature = "display-components")]
mod paginator;
#[cfg(feature = "display-components")]
pub mod progress_bar;
#[cfg(feature = "display-components")]
mod scroll_view;
#[cfg(feature = "display-components")]
mod scrollable_text;
#[cfg(feature = "display-components")]
mod sparkline;
#[cfg(feature = "display-components")]
mod spinner;
#[cfg(feature = "display-components")]
mod status_bar;
#[cfg(feature = "display-components")]
mod status_log;
#[cfg(feature = "display-components")]
pub mod styled_text;
#[cfg(feature = "display-components")]
pub mod terminal_output;
#[cfg(feature = "display-components")]
mod title_card;
#[cfg(feature = "display-components")]
mod toast;
#[cfg(feature = "display-components")]
mod usage_display;
#[cfg(feature = "navigation-components")]
mod accordion;
#[cfg(feature = "navigation-components")]
mod breadcrumb;
#[cfg(feature = "navigation-components")]
pub mod command_palette;
#[cfg(feature = "navigation-components")]
mod menu;
#[cfg(feature = "navigation-components")]
mod router;
#[cfg(feature = "navigation-components")]
pub mod step_indicator;
#[cfg(feature = "navigation-components")]
mod tab_bar;
#[cfg(feature = "navigation-components")]
mod tabs;
#[cfg(feature = "overlay-components")]
pub mod confirm_dialog;
#[cfg(feature = "overlay-components")]
mod dialog;
#[cfg(feature = "overlay-components")]
mod tooltip;
#[cfg(feature = "markdown")]
pub mod markdown_renderer;
mod context;
mod focus_manager;
#[cfg(feature = "input-components")]
pub use button::{Button, ButtonMessage, ButtonOutput, ButtonState};
#[cfg(feature = "input-components")]
pub use checkbox::{Checkbox, CheckboxMessage, CheckboxOutput, CheckboxState};
#[cfg(feature = "input-components")]
pub use dropdown::{Dropdown, DropdownMessage, DropdownOutput, DropdownState};
#[cfg(feature = "input-components")]
pub use input_field::{InputField, InputFieldMessage, InputFieldOutput, InputFieldState};
#[cfg(feature = "input-components")]
pub use line_input::{LineInput, LineInputMessage, LineInputOutput, LineInputState};
#[cfg(feature = "input-components")]
pub use number_input::{NumberInput, NumberInputMessage, NumberInputOutput, NumberInputState};
#[cfg(feature = "input-components")]
pub use radio_group::{RadioGroup, RadioGroupMessage, RadioGroupOutput, RadioGroupState};
#[cfg(feature = "input-components")]
pub use select::{Select, SelectMessage, SelectOutput, SelectState};
#[cfg(feature = "input-components")]
pub use slider::{Slider, SliderMessage, SliderOrientation, SliderOutput, SliderState};
#[cfg(feature = "input-components")]
pub use switch::{Switch, SwitchMessage, SwitchOutput, SwitchState};
#[cfg(feature = "input-components")]
pub use text_area::{TextArea, TextAreaMessage, TextAreaOutput, TextAreaState};
#[cfg(feature = "data-components")]
pub use loading_list::{
ItemState, LoadingList, LoadingListItem, LoadingListMessage, LoadingListOutput,
LoadingListState,
};
#[cfg(feature = "data-components")]
pub use selectable_list::{
SelectableList, SelectableListMessage, SelectableListOutput, SelectableListState,
};
#[cfg(feature = "data-components")]
pub use table::{
Column, SortComparator, SortDirection, Table, TableMessage, TableOutput, TableRow, TableState,
date_comparator, numeric_comparator,
};
#[cfg(feature = "data-components")]
pub use tree::{Tree, TreeMessage, TreeNode, TreeOutput, TreeState};
#[cfg(feature = "display-components")]
pub use big_text::{BigText, BigTextMessage, BigTextState, big_char, big_char_width};
#[cfg(feature = "display-components")]
pub use calendar::{Calendar, CalendarMessage, CalendarOutput, CalendarState};
#[cfg(feature = "display-components")]
pub use canvas::{Canvas, CanvasMarker, CanvasMessage, CanvasShape, CanvasState};
#[cfg(feature = "display-components")]
pub use code_block::{CodeBlock, CodeBlockMessage, CodeBlockState, Language};
#[cfg(feature = "display-components")]
pub use collapsible::{Collapsible, CollapsibleMessage, CollapsibleOutput, CollapsibleState};
#[cfg(feature = "display-components")]
pub use divider::{Divider, DividerMessage, DividerOrientation, DividerState};
#[cfg(feature = "display-components")]
pub use gauge::{Gauge, GaugeMessage, GaugeOutput, GaugeState, GaugeVariant, ThresholdZone};
#[cfg(feature = "display-components")]
pub use help_panel::{HelpPanel, HelpPanelMessage, HelpPanelState, KeyBinding, KeyBindingGroup};
#[cfg(feature = "display-components")]
pub use key_hints::{KeyHint, KeyHints, KeyHintsLayout, KeyHintsMessage, KeyHintsState};
#[cfg(feature = "display-components")]
pub use multi_progress::{
MultiProgress, MultiProgressMessage, MultiProgressOutput, MultiProgressState, ProgressItem,
ProgressItemStatus,
};
#[cfg(feature = "display-components")]
pub use paginator::{Paginator, PaginatorMessage, PaginatorOutput, PaginatorState, PaginatorStyle};
#[cfg(feature = "display-components")]
pub use progress_bar::{
ProgressBar, ProgressBarMessage, ProgressBarOutput, ProgressBarState, format_eta,
};
#[cfg(feature = "display-components")]
pub use sparkline::{
Sparkline, SparklineDirection, SparklineMessage, SparklineOutput, SparklineState,
};
#[cfg(feature = "display-components")]
pub use spinner::{Spinner, SpinnerMessage, SpinnerState, SpinnerStyle};
#[cfg(feature = "compound-components")]
pub use alert_panel::{
AlertMetric, AlertPanel, AlertPanelMessage, AlertPanelOutput, AlertPanelState, AlertState,
AlertThreshold,
};
#[cfg(feature = "compound-components")]
pub use box_plot::{BoxPlot, BoxPlotData, BoxPlotMessage, BoxPlotOrientation, BoxPlotState};
#[cfg(feature = "compound-components")]
pub use chart::{
BarMode, Chart, ChartAnnotation, ChartGrid, ChartKind, ChartMessage, ChartOutput, ChartState,
DEFAULT_PALETTE, DataSeries, Scale, ThresholdLine, VerticalLine, chart_palette_color,
};
#[cfg(feature = "compound-components")]
pub use conversation_view::{
ConversationMessage, ConversationRole, ConversationView, ConversationViewMessage,
ConversationViewOutput, ConversationViewState, MessageBlock, MessageHandle,
};
#[cfg(feature = "compound-components")]
pub use data_grid::{DataGrid, DataGridMessage, DataGridOutput, DataGridState};
#[cfg(feature = "compound-components")]
pub use diagram::{
BoundingBox, Diagram, DiagramCluster, DiagramEdge, DiagramMessage, DiagramNode, DiagramOutput,
DiagramState, EdgePath, EdgeStyle, LayoutMode, LayoutResult, NodePosition, NodeShape,
NodeStatus, Orientation as DiagramOrientation, PathSegment, RenderMode, Viewport2D,
};
#[cfg(feature = "compound-components")]
pub use diff_viewer::{
DiffHunk, DiffLine, DiffLineType, DiffMode, DiffViewer, DiffViewerMessage, DiffViewerOutput,
DiffViewerState,
};
#[cfg(feature = "compound-components")]
pub use event_stream::{
EventLevel, EventStream, EventStreamMessage, EventStreamOutput, EventStreamState, StreamEvent,
};
#[cfg(feature = "compound-components")]
pub use file_browser::{
FileBrowser, FileBrowserMessage, FileBrowserOutput, FileBrowserState, FileEntry,
FileSortDirection, FileSortField, SelectionMode,
};
#[cfg(feature = "compound-components")]
pub use flame_graph::{
FlameGraph, FlameGraphMessage, FlameGraphOutput, FlameGraphState, FlameNode,
};
#[cfg(feature = "compound-components")]
pub use form::{Form, FormField, FormFieldKind, FormMessage, FormOutput, FormState, FormValue};
#[cfg(feature = "compound-components")]
pub use heatmap::{
DistributionMap, Heatmap, HeatmapColorScale, HeatmapMessage, HeatmapOutput, HeatmapState,
value_to_color,
};
#[cfg(feature = "compound-components")]
pub use histogram::{BinMethod, Histogram, HistogramMessage, HistogramState};
#[cfg(feature = "compound-components")]
pub use log_correlation::{
CorrelationEntry, CorrelationLevel, LogCorrelation, LogCorrelationMessage,
LogCorrelationOutput, LogCorrelationState, LogStream,
};
#[cfg(feature = "compound-components")]
pub use log_viewer::{LogViewer, LogViewerMessage, LogViewerOutput, LogViewerState};
#[cfg(feature = "compound-components")]
pub use metrics_dashboard::{
MetricKind, MetricWidget, MetricsDashboard, MetricsDashboardMessage, MetricsDashboardOutput,
MetricsDashboardState,
};
#[cfg(feature = "compound-components")]
pub use pane_layout::{PaneLayout, PaneLayoutMessage, PaneLayoutOutput, PaneLayoutState};
#[cfg(feature = "compound-components")]
pub use searchable_list::{
SearchableList, SearchableListMessage, SearchableListOutput, SearchableListState,
};
#[cfg(feature = "compound-components")]
pub use span_tree::{FlatSpan, SpanNode, SpanTree, SpanTreeMessage, SpanTreeOutput, SpanTreeState};
#[cfg(feature = "compound-components")]
pub use split_panel::{
SplitOrientation, SplitPanel, SplitPanelMessage, SplitPanelOutput, SplitPanelState,
};
#[cfg(feature = "compound-components")]
pub use timeline::{
SelectedType, Timeline, TimelineEvent, TimelineMessage, TimelineOutput, TimelineSpan,
TimelineState,
};
#[cfg(feature = "compound-components")]
pub use treemap::{Treemap, TreemapMessage, TreemapNode, TreemapOutput, TreemapState};
#[cfg(feature = "display-components")]
pub use scroll_view::{ScrollView, ScrollViewMessage, ScrollViewState};
#[cfg(feature = "display-components")]
pub use scrollable_text::{
ScrollableText, ScrollableTextMessage, ScrollableTextOutput, ScrollableTextState,
};
#[cfg(feature = "display-components")]
pub use status_bar::{
Section, StatusBar, StatusBarItem, StatusBarItemContent, StatusBarMessage, StatusBarState,
StatusBarStyle,
};
#[cfg(feature = "display-components")]
pub use status_log::{
StatusLog, StatusLogEntry, StatusLogLevel, StatusLogMessage, StatusLogOutput, StatusLogState,
};
#[cfg(feature = "display-components")]
pub use styled_text::{StyledText, StyledTextMessage, StyledTextOutput, StyledTextState};
#[cfg(feature = "display-components")]
pub use terminal_output::{
AnsiSegment, TerminalOutput, TerminalOutputMessage, TerminalOutputOutput, TerminalOutputState,
parse_ansi,
};
#[cfg(feature = "display-components")]
pub use title_card::{TitleCard, TitleCardMessage, TitleCardState};
#[cfg(feature = "display-components")]
pub use toast::{Toast, ToastItem, ToastLevel, ToastMessage, ToastOutput, ToastState};
#[cfg(feature = "display-components")]
pub use usage_display::{
UsageDisplay, UsageDisplayMessage, UsageDisplayState, UsageLayout, UsageMetric,
};
#[cfg(feature = "navigation-components")]
pub use accordion::{Accordion, AccordionMessage, AccordionOutput, AccordionPanel, AccordionState};
#[cfg(feature = "navigation-components")]
pub use breadcrumb::{
Breadcrumb, BreadcrumbMessage, BreadcrumbOutput, BreadcrumbSegment, BreadcrumbState,
};
#[cfg(feature = "navigation-components")]
pub use command_palette::{
CommandPalette, CommandPaletteMessage, CommandPaletteOutput, CommandPaletteState, PaletteItem,
};
#[cfg(feature = "navigation-components")]
pub use menu::{Menu, MenuItem, MenuMessage, MenuOutput, MenuState};
#[cfg(feature = "navigation-components")]
pub use router::{NavigationMode, Router, RouterMessage, RouterOutput, RouterState};
#[cfg(feature = "navigation-components")]
pub use step_indicator::{
StepIndicator, StepIndicatorMessage, StepIndicatorOutput, StepIndicatorState,
};
#[cfg(feature = "navigation-components")]
pub use tab_bar::{Tab, TabBar, TabBarMessage, TabBarOutput, TabBarState};
#[cfg(feature = "navigation-components")]
pub use tabs::{Tabs, TabsMessage, TabsOutput, TabsState};
#[cfg(feature = "overlay-components")]
pub use confirm_dialog::{
ConfirmDialog, ConfirmDialogMessage, ConfirmDialogOutput, ConfirmDialogResult,
ConfirmDialogState,
};
#[cfg(feature = "overlay-components")]
pub use dialog::{Dialog, DialogButton, DialogMessage, DialogOutput, DialogState};
#[cfg(feature = "overlay-components")]
pub use tooltip::{Tooltip, TooltipMessage, TooltipOutput, TooltipPosition, TooltipState};
#[cfg(feature = "markdown")]
pub use markdown_renderer::{MarkdownRenderer, MarkdownRendererMessage, MarkdownRendererState};
pub use context::{EventContext, RenderContext};
pub use focus_manager::FocusManager;
pub trait Component: Sized {
type State;
type Message;
type Output;
fn init() -> Self::State;
fn update(state: &mut Self::State, msg: Self::Message) -> Option<Self::Output>;
fn view(state: &Self::State, ctx: &mut RenderContext<'_, '_>);
fn traced_view(state: &Self::State, ctx: &mut RenderContext<'_, '_>) {
#[cfg(feature = "tracing")]
let _span = tracing::trace_span!(
"component_view",
component = std::any::type_name::<Self>(),
area.x = ctx.area.x,
area.y = ctx.area.y,
area.width = ctx.area.width,
area.height = ctx.area.height,
)
.entered();
Self::view(state, ctx);
}
fn handle_event(
state: &Self::State,
event: &Event,
ctx: &EventContext,
) -> Option<Self::Message> {
let _ = (state, event, ctx);
None
}
fn dispatch_event(
state: &mut Self::State,
event: &Event,
ctx: &EventContext,
) -> Option<Self::Output> {
#[cfg(feature = "tracing")]
let _span = tracing::debug_span!(
"component_dispatch",
component = std::any::type_name::<Self>(),
event_kind = event.kind_name(),
)
.entered();
let msg = Self::handle_event(state, event, ctx);
#[cfg(feature = "tracing")]
tracing::trace!(produced_message = msg.is_some(), "handle_event complete");
if let Some(msg) = msg {
let output = Self::update(state, msg);
#[cfg(feature = "tracing")]
tracing::trace!(has_output = output.is_some(), "update complete");
output
} else {
None
}
}
}
pub trait Toggleable: Component {
fn is_visible(state: &Self::State) -> bool;
fn set_visible(state: &mut Self::State, visible: bool);
fn toggle(state: &mut Self::State) {
let visible = Self::is_visible(state);
Self::set_visible(state, !visible);
}
fn show(state: &mut Self::State) {
Self::set_visible(state, true);
}
fn hide(state: &mut Self::State) {
Self::set_visible(state, false);
}
}
#[cfg(any(test, feature = "test-utils"))]
pub mod test_utils;
#[cfg(test)]
mod tests;