use components::Shell; use maud::{Markup, PreEscaped, Render}; // UI // Basic Primitives pub mod color; pub mod htmx; pub mod primitives; pub mod wrapper; // Stacked Components pub mod components; // Preludes pub mod prelude { pub use super::color::*; pub use super::primitives::Nothing; pub use super::primitives::Side; pub use super::primitives::Size; pub use super::primitives::aspect::Aspect; pub use super::primitives::background::Background; pub use super::primitives::container::Container; pub use super::primitives::div::Div; pub use super::primitives::flex::{Flex, Justify}; pub use super::primitives::header::Header; pub use super::primitives::image::Image; pub use super::primitives::link::Link; pub use super::primitives::margin::Margin; pub use super::primitives::padding::Padding; pub use super::primitives::rounded::Rounded; pub use super::primitives::script; pub use super::primitives::shadow::Shadow; pub use super::primitives::sized::Sized; pub use super::primitives::space::{ScreenValue, SpaceBetween}; pub use super::primitives::text::{Paragraph, Span, Text}; pub use super::primitives::width::FitWidth; pub use super::wrapper::Hover; } use crate::request::{RequestContext, StringResponse}; use rocket::http::{ContentType, Status}; /// Renders a full page or an HTMX-compatible fragment based on the request context. /// /// If the request is not an HTMX request, this function uses the provided shell to generate /// a full HTML page. If it is an HTMX request, only the provided content is rendered. /// /// # Arguments /// * `content` - The HTML content to render. /// * `title` - The title of the page for full-page rendering. /// * `ctx` - The `RequestContext` containing request metadata. /// * `shell` - The `Shell` instance used for full-page rendering. /// /// # Returns /// A `StringResponse` pub async fn render_page( content: PreEscaped, title: &str, ctx: RequestContext, shell: &Shell, ) -> StringResponse { if ctx.is_htmx { (Status::Ok, (ContentType::HTML, content.into_string())) } else { ( Status::Ok, ( ContentType::HTML, shell.render(content, title).into_string(), ), ) } } // Grids // ListViews // ListTiles // Cards /// Generic UI Widget pub trait UIWidget: Render { /// Indicating if the widget supports inheriting classes fn can_inherit(&self) -> bool; /// Returning the base classes for this widget fn base_class(&self) -> Vec; fn extended_class(&self) -> Vec; /// Render the widget with additional classes fn render_with_class(&self, class: &str) -> Markup; } /// Implementation for raw HTML with html! macro impl UIWidget for PreEscaped { fn can_inherit(&self) -> bool { false } fn base_class(&self) -> Vec { vec![] } fn extended_class(&self) -> Vec { vec![] } fn render_with_class(&self, _: &str) -> Markup { self.render() } } /// Trait for an element which can add new `attrs` pub trait AttrExtendable { #[must_use] fn add_attr(self, key: &str, val: &str) -> Self; /// Set the `id` attribute of an element. #[must_use] fn id(self, id: &str) -> Self; }