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:
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"
+ );
+ }
+}