pub struct ChartCompositionProps {
pub variant: ChartCompositionVariant,
pub series: Vec<SeriesDef>,
pub x_axis: Vec<AxisDef>,
pub y_axis: Vec<AxisDef>,
pub grid: GridConfig,
pub width: f64,
pub height: f64,
pub class: MaybeProp<String>,
}Expand description
Props for the ChartComposition component.
Wrap your data definitions in a chart container, then stack plot, axis, and interaction components as children.
Explicit chart_type on each [SeriesDef] tells plot layers which geometry to render;
child order controls z-order (bars beneath lines, annotations on top).
§When to use
Build mixed-type dashboards by placing explicit plot children inside
ChartContainer. Each [SeriesDef] must declare chart_type; child
order controls z-order.
§Usage
- Place
ChartContainerat the root with series, axes, and optionaldatasetbinding. - Add plot children (
BarPlot,LinePlot, …) with requiredchart_typeon each series. - Wrap plots in
PlotClipwhen marks extend past plot bounds. - Add
ChartCustomBaselineor custom SVG using scale hooks for annotations.
§Best Practices
§Do’s
- Place
BarPlotbeforeLinePlotwhen bars should sit beneath lines. - Use unique clip path ids per chart instance (
orb-clip-*prefix). - Prefer [
ResponsiveChartContainer] for dashboard tiles that fill parent width. - Respect [
ChartCompositionOrder]: first plot child insidePlotCliprenders on the bottom.
§Don’ts
- Do not omit
chart_typeon series in composition mode — inference is disabled. - Do not mix composition and convenience
*Chartwrappers on the same surface. - Do not place legend or tooltip as composition children — configure them via container props.
§Examples
§Mixed bar and line chart
Revenue bars with a target line overlay, clipped to the plot area. Demonstrates z-order,
mixed chart_type series, and PlotClip for overflow control.
use crate::ChartComposition;
use crate::preview::fixtures::{full_grid, mixed_bar_line_series, mixed_bar_line_x_axis, revenue_y_axis};
view! {
<div data-testid="chart-composition-preview">
<ChartComposition
variant=ChartCompositionVariant::MixedBarLine
series=mixed_bar_line_series()
x_axis=vec![mixed_bar_line_x_axis()]
y_axis=vec![revenue_y_axis()]
grid=full_grid()
width=560.0
height=320.0
/>
</div>
}§Custom SVG layer via hooks
Dashed revenue baseline using [use_drawing_area] and [use_y_scale]. Use when annotations
must stay aligned to data coordinates on resize.
use crate::ChartComposition;
use crate::preview::fixtures::{quarter_x_axis, revenue_series, revenue_y_axis};
view! {
<div data-testid="chart-composition-custom-layer-preview">
<ChartComposition
variant=ChartCompositionVariant::CustomLayer
series=vec![revenue_series()]
x_axis=vec![quarter_x_axis()]
y_axis=vec![revenue_y_axis()]
width=520.0
height=320.0
/>
</div>
}§Optional Props
- variant:
ChartCompositionVariant- Which documented composition example to render.
- series:
Vec<crate::SeriesDef>- Series definitions with explicit
chart_typeper entry.
- Series definitions with explicit
- x_axis:
Vec<crate::AxisDef>- X-axis definitions.
- y_axis:
Vec<crate::AxisDef>- Y-axis definitions.
- grid:
crate::GridConfig- Background grid configuration.
- width:
f64- Chart width in pixels.
- height:
f64- Chart height in pixels.
- class:
impl Into<MaybeProp<String>>- Optional CSS class on the root element.
Fields§
§variant: ChartCompositionVariantWhich documented composition example to render.
series: Vec<SeriesDef>Series definitions with explicit chart_type per entry.
x_axis: Vec<AxisDef>X-axis definitions.
y_axis: Vec<AxisDef>Y-axis definitions.
grid: GridConfigBackground grid configuration.
width: f64Chart width in pixels.
height: f64Chart height in pixels.
class: MaybeProp<String>Optional CSS class on the root element.
Implementations§
Source§impl ChartCompositionProps
impl ChartCompositionProps
Sourcepub fn builder() -> ChartCompositionPropsBuilder<((), (), (), (), (), (), (), ())>
pub fn builder() -> ChartCompositionPropsBuilder<((), (), (), (), (), (), (), ())>
Create a builder for building ChartCompositionProps.
On the builder, call .variant(...)(optional), .series(...)(optional), .x_axis(...)(optional), .y_axis(...)(optional), .grid(...)(optional), .width(...)(optional), .height(...)(optional), .class(...)(optional) to set the values of the fields.
Finally, call .build() to create the instance of ChartCompositionProps.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ChartCompositionProps
impl RefUnwindSafe for ChartCompositionProps
impl Send for ChartCompositionProps
impl Sync for ChartCompositionProps
impl Unpin for ChartCompositionProps
impl UnsafeUnpin for ChartCompositionProps
impl UnwindSafe for ChartCompositionProps
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<El, T, Marker> IntoElementMaybeSignal<T, Marker> for Elwhere
El: IntoElementMaybeSignalType<T, Marker>,
impl<El, T, Marker> IntoElementMaybeSignal<T, Marker> for Elwhere
El: IntoElementMaybeSignalType<T, Marker>,
fn into_element_maybe_signal(self) -> ElementMaybeSignal<T>
Source§impl<T, Js> IntoElementMaybeSignalType<T, Element> for Js
impl<T, Js> IntoElementMaybeSignalType<T, Element> for Js
fn into_element_maybe_signal_type(self) -> ElementMaybeSignalType<T>
Source§impl<El, T, Marker> IntoElementsMaybeSignal<T, Marker> for Elwhere
El: IntoElementsMaybeSignalType<T, Marker>,
impl<El, T, Marker> IntoElementsMaybeSignal<T, Marker> for Elwhere
El: IntoElementsMaybeSignalType<T, Marker>,
fn into_elements_maybe_signal(self) -> ElementsMaybeSignal<T>
Source§impl<T, Js> IntoElementsMaybeSignalType<T, Element> for Js
impl<T, Js> IntoElementsMaybeSignalType<T, Element> for Js
fn into_elements_maybe_signal_type(self) -> ElementsMaybeSignalType<T>
Source§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> SerializableKey for T
impl<T> SerializableKey for T
Source§impl<T> StorageAccess<T> for T
impl<T> StorageAccess<T> for T
Source§fn as_borrowed(&self) -> &T
fn as_borrowed(&self) -> &T
Source§fn into_taken(self) -> T
fn into_taken(self) -> T
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more