mod chart_root;
mod custom_layer;
mod keyboard_listener;
mod overlay_layer;
mod overlays;
mod plot_area;
mod resize;
mod responsive;
use std::sync::Arc;
use leptos::prelude::*;
use orbital_data::{ChartFieldBinding, Dataset};
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use crate::context::ChartKind;
use crate::engine::default_plot_inset;
#[cfg(feature = "preview")]
use crate::preview::fixtures::{
cost_series, full_grid, processed_binding, processed_dataset, quarter_x_axis, revenue_series,
revenue_y_axis,
};
use crate::{
AxisClickData, AxisDef, AxisHighlightConfig, ChartEmbedMode, ChartFeatures, ChartItemId,
ChartMotion, ChartOrientation, GridConfig, HighlightScope, LegendConfig, OrbitalChartPalette,
OrbitalChartsTheme, OverlayMount, PlotInset, SeriesDef, TooltipConfig, ZoomWindow,
CHART_FEATURES_DEFAULT,
};
use leptos::callback::Callback;
pub use chart_root::ChartRoot;
pub use custom_layer::ChartCustomBaseline;
pub use overlay_layer::{ChartOverlayLayer, ChartRootOverlayChrome};
pub use plot_area::{compute_drawing_area, DrawingArea};
pub use responsive::ResponsiveChartContainer;
#[component_doc(
category = "Charts",
preview_slug = "chart-container",
preview_label = "Chart Container",
preview_icon = icondata::AiBorderOuterOutlined,
)]
#[component]
pub fn ChartContainer(
#[prop(default = None)]
series: Option<Vec<SeriesDef>>,
#[prop(default = None)]
dataset: Option<Dataset>,
#[prop(default = None)]
binding: Option<ChartFieldBinding>,
#[prop(default = None)]
x_axis: Option<Vec<AxisDef>>,
#[prop(default = None)]
y_axis: Option<Vec<AxisDef>>,
#[prop(default = None)]
width: Option<f64>,
#[prop(default = None)]
height: Option<f64>,
#[prop(default = None)]
margin: Option<PlotInset>,
#[prop(default = None)]
grid: Option<GridConfig>,
#[prop(default = None)]
loading: Option<bool>,
#[prop(default = None)]
skip_animation: Option<bool>,
#[prop(default = None)]
motion: Option<ChartMotion>,
#[prop(default = ChartOrientation::Vertical)]
orientation: ChartOrientation,
#[prop(default = ChartKind::Cartesian)]
chart_kind: ChartKind,
#[prop(default = None)]
highlight_scope: Option<HighlightScope>,
#[prop(default = None)]
axis_highlight: Option<AxisHighlightConfig>,
#[prop(default = None)]
legend: Option<LegendConfig>,
#[prop(default = None)]
tooltip: Option<TooltipConfig>,
#[prop(default = None)]
charts_theme: Option<OrbitalChartsTheme>,
#[prop(default = None)]
palette: Option<OrbitalChartPalette>,
#[prop(default = None)]
highlighted_item: Option<RwSignal<Option<ChartItemId>>>,
#[prop(default = None)]
on_highlight_change: Option<Callback<(Option<ChartItemId>,), ()>>,
#[prop(default = None)]
on_legend_click: Option<Callback<(String,), ()>>,
#[prop(default = None)]
on_item_click: Option<Callback<(ChartItemId,), ()>>,
#[prop(default = None)]
on_axis_click: Option<Callback<(AxisClickData,), ()>>,
#[prop(default = CHART_FEATURES_DEFAULT)]
features: ChartFeatures,
#[prop(default = true)]
keyboard_navigation: bool,
#[prop(default = false)]
prefer_line_x_strict: bool,
#[prop(default = None)]
zoom: Option<Vec<ZoomWindow>>,
#[prop(default = None)]
on_zoom_change: Option<Callback<(Vec<ZoomWindow>,), ()>>,
#[prop(default = None)]
loading_view: Option<Arc<dyn Fn() -> AnyView + Send + Sync>>,
#[prop(default = None)]
empty_view: Option<Arc<dyn Fn() -> AnyView + Send + Sync>>,
#[prop(default = ChartEmbedMode::Inline)]
embed_mode: ChartEmbedMode,
#[prop(default = OverlayMount::ChartLocal)]
overlay_mount: OverlayMount,
#[prop(optional, into)]
class: MaybeProp<String>,
#[prop(optional)]
children: Option<Children>,
) -> impl IntoView {
let w = width.unwrap_or(520.0);
let h = height.unwrap_or(320.0);
let theme_options = use_theme_options();
let inset = margin.unwrap_or_else(|| default_plot_inset(theme_options.get_untracked().density));
let is_loading = loading.unwrap_or(false);
let root_class = class;
#[cfg(feature = "preview")]
let _ = (
revenue_series,
cost_series,
quarter_x_axis,
revenue_y_axis,
full_grid,
processed_dataset,
processed_binding,
);
view! {
<ChartRoot
class=root_class
dataset=dataset
binding=binding
width=w
height=h
margin=inset
skip_animation=skip_animation
motion=motion
loading=is_loading
series=series
x_axis=x_axis
y_axis=y_axis
grid=grid
palette=palette
loading_view=loading_view
empty_view=empty_view
orientation=orientation
chart_kind=chart_kind
highlight_scope=highlight_scope
axis_highlight=axis_highlight
legend=legend
tooltip=tooltip
charts_theme=charts_theme
highlighted_item=highlighted_item
on_highlight_change=on_highlight_change
on_item_click=on_item_click
on_axis_click=on_axis_click
on_legend_click=on_legend_click
features=features
keyboard_navigation=keyboard_navigation
prefer_line_x_strict=prefer_line_x_strict
zoom=zoom
on_zoom_change=on_zoom_change
embed_mode=embed_mode
overlay_mount=overlay_mount
>
{children.map(|c| c())}
</ChartRoot>
}
}