Skip to main content

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}