app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 14c96e984d64c6ecde4f3c1de4a8f945bd07797c
parent 3a8ced323884c51477637b4a256ea26e1d0e7c0d
Author: triesap <triesap@radroots.dev>
Date:   Thu, 22 Jan 2026 04:38:36 +0000

app: scaffold list component module

- add list group/section/row wrappers with data-ui keys
- define list data-ui helper functions
- export list components from ui-components
- cover list data-ui constants with unit tests

Diffstat:
Mcrates/ui-components/src/lib.rs | 13+++++++++++++
Acrates/ui-components/src/list.rs | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 157 insertions(+), 0 deletions(-)

diff --git a/crates/ui-components/src/lib.rs b/crates/ui-components/src/lib.rs @@ -3,6 +3,7 @@ mod button; mod icon; mod label; +mod list; mod separator; mod dialog; mod sheet; @@ -14,6 +15,18 @@ pub use icon::{ RadrootsAppUiIcon, RadrootsAppUiIconKey, }; +pub use list::{ + radroots_app_ui_list_group_data_ui_value, + radroots_app_ui_list_row_data_ui_value, + radroots_app_ui_list_row_leading_data_ui_value, + radroots_app_ui_list_row_trailing_data_ui_value, + radroots_app_ui_list_section_data_ui_value, + RadrootsAppUiListGroup, + RadrootsAppUiListRow, + RadrootsAppUiListRowLeading, + RadrootsAppUiListRowTrailing, + RadrootsAppUiListSection, +}; pub use label::RadrootsAppUiLabel; pub use separator::{ radroots_app_ui_separator_orientation_value, diff --git a/crates/ui-components/src/list.rs b/crates/ui-components/src/list.rs @@ -0,0 +1,144 @@ +#![forbid(unsafe_code)] + +use leptos::prelude::*; + +pub fn radroots_app_ui_list_group_data_ui_value() -> &'static str { + "list-group" +} + +pub fn radroots_app_ui_list_section_data_ui_value() -> &'static str { + "list-section" +} + +pub fn radroots_app_ui_list_row_data_ui_value() -> &'static str { + "list-row" +} + +pub fn radroots_app_ui_list_row_leading_data_ui_value() -> &'static str { + "list-row-leading" +} + +pub fn radroots_app_ui_list_row_trailing_data_ui_value() -> &'static str { + "list-row-trailing" +} + +#[component] +pub fn RadrootsAppUiListGroup( + class: Option<String>, + id: Option<String>, + style: Option<String>, + children: ChildrenFn, +) -> impl IntoView { + view! { + <div + id=id + class=class + style=style + data-ui=radroots_app_ui_list_group_data_ui_value() + > + {children()} + </div> + } +} + +#[component] +pub fn RadrootsAppUiListSection( + class: Option<String>, + id: Option<String>, + style: Option<String>, + children: ChildrenFn, +) -> impl IntoView { + view! { + <div + id=id + class=class + style=style + data-ui=radroots_app_ui_list_section_data_ui_value() + > + {children()} + </div> + } +} + +#[component] +pub fn RadrootsAppUiListRow( + class: Option<String>, + id: Option<String>, + style: Option<String>, + children: ChildrenFn, +) -> impl IntoView { + view! { + <div + id=id + class=class + style=style + data-ui=radroots_app_ui_list_row_data_ui_value() + > + {children()} + </div> + } +} + +#[component] +pub fn RadrootsAppUiListRowLeading( + class: Option<String>, + id: Option<String>, + style: Option<String>, + children: Children, +) -> impl IntoView { + view! { + <div + id=id + class=class + style=style + data-ui=radroots_app_ui_list_row_leading_data_ui_value() + > + {children()} + </div> + } +} + +#[component] +pub fn RadrootsAppUiListRowTrailing( + class: Option<String>, + id: Option<String>, + style: Option<String>, + children: Children, +) -> impl IntoView { + view! { + <div + id=id + class=class + style=style + data-ui=radroots_app_ui_list_row_trailing_data_ui_value() + > + {children()} + </div> + } +} + +#[cfg(test)] +mod tests { + use super::{ + radroots_app_ui_list_group_data_ui_value, + radroots_app_ui_list_row_data_ui_value, + radroots_app_ui_list_row_leading_data_ui_value, + radroots_app_ui_list_row_trailing_data_ui_value, + radroots_app_ui_list_section_data_ui_value, + }; + + #[test] + fn list_data_ui_values() { + assert_eq!(radroots_app_ui_list_group_data_ui_value(), "list-group"); + assert_eq!(radroots_app_ui_list_section_data_ui_value(), "list-section"); + assert_eq!(radroots_app_ui_list_row_data_ui_value(), "list-row"); + assert_eq!( + radroots_app_ui_list_row_leading_data_ui_value(), + "list-row-leading" + ); + assert_eq!( + radroots_app_ui_list_row_trailing_data_ui_value(), + "list-row-trailing" + ); + } +}