snora_core/sidebar.rs
1//! Vertical navigation rail (icon-only sidebar).
2//!
3//! A [`SideBar`] is a pure data contract describing a strip of
4//! icon-and-tooltip buttons plus the currently active one. The engine
5//! renders it, and pressing a button emits the item's `on_press` message.
6//!
7//! This is the minimum-viable navigation affordance. If your app needs
8//! collapsible groups or nested navigation, compose your own element and
9//! put it in the `side_bar` slot of [`crate::AppLayout`] directly —
10//! snora-core does not force you through [`SideBar`].
11
12use crate::icon::Icon;
13
14/// One entry in a sidebar.
15///
16/// `ViewId` is the application's enum of addressable views. The sidebar
17/// highlights the item whose `view_id` equals [`SideBar::active`].
18#[derive(Debug, Clone)]
19pub struct SideBarItem<Message, ViewId>
20where
21 Message: Clone,
22 ViewId: Clone + PartialEq,
23{
24 pub view_id: ViewId,
25 pub icon: Icon,
26 pub tooltip: String,
27 pub on_press: Message,
28}
29
30/// The vertical navigation rail as a whole.
31#[derive(Debug, Clone)]
32pub struct SideBar<Message, ViewId>
33where
34 Message: Clone,
35 ViewId: Clone + PartialEq,
36{
37 pub items: Vec<SideBarItem<Message, ViewId>>,
38 /// The id of the view that is currently displayed in the body slot.
39 /// The engine uses this to apply an "active" visual treatment.
40 pub active: ViewId,
41}