use components::Shell; use maud::{Markup, PreEscaped, Render}; use prelude::Text; // 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::Context; pub use super::primitives::NoBrowserAppearance; pub use super::primitives::Nothing; pub use super::primitives::Side; pub use super::primitives::Size; pub use super::primitives::animation::{Animated, Animation, Delay, Duration, Scope, Timing}; pub use super::primitives::aspect::Aspect; pub use super::primitives::background::Background; pub use super::primitives::border::{ Border, BorderSide, BorderSize, BorderStyle, Outline, OutlineStyle, Ring, }; pub use super::primitives::container::Container; pub use super::primitives::cursor::{Action, Cursor, TouchAction}; pub use super::primitives::display::{ BoxDecorationBreak, BoxSizing, BreakAfter, BreakBefore, BreakInside, BreakInsideValue, BreakValue, Clear, Display, Float, ObjectFit, Overflow, }; pub use super::primitives::div::Div; pub use super::primitives::filter::{ Blur, Brightness, Contrast, Grayscale, HueRotate, Invert, Saturate, Sepia, }; pub use super::primitives::flex::{ Direction, Flex, FlexBasis, FlexGrow, Justify, Order, Strategy, Wrap, }; pub use super::primitives::header::Header; pub use super::primitives::height::{Height, MaxHeight, MinHeight}; 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::position::{Position, PositionKind, Resize, Resizeable}; pub use super::primitives::rounded::Rounded; pub use super::primitives::script; pub use super::primitives::scroll::{Overscroll, Scroll, SnapAlign, SnapType}; pub use super::primitives::shadow::Shadow; pub use super::primitives::sized::Sized; pub use super::primitives::space::{ScreenValue, SpaceBetween}; pub use super::primitives::svg::SVG; pub use super::primitives::text::{ AccentColor, Code, DecorationKind, DecorationStyle, DecorationThickness, LetterSpacing, LineClamp, LineHeight, ListStyle, NumberStyle, Paragraph, Span, Text, TextAlignment, TextContent, TextCursorColor, TextDecoration, TextHyphens, TextOverflow, TextSelection, TextTransform, TextWhitespace, TextWordBreak, TextWrap, UnderlineOffset, VerticalTextAlignment, }; pub use super::primitives::transform::{ RenderTransformCPU, RenderTransformGPU, Rotate, Scale, Skew, Transform, TransformOrigin, }; pub use super::primitives::visibility::Visibility; pub use super::primitives::width::{MaxWidth, MinWidth, Width}; pub use super::primitives::zindex::ZIndex; pub use super::wrapper::{ _2XLScreen, Hover, LargeScreen, MediumScreen, Screen, SmallScreen, XLScreen, }; } 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 /// /// Base here means all classes defining the current widget fn base_class(&self) -> Vec; /// Return own base classes and all classes below the tree 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() } } impl UIWidget for String { fn can_inherit(&self) -> bool { Text(&self).can_inherit() } fn base_class(&self) -> Vec { Text(&self).base_class() } fn extended_class(&self) -> Vec { Text(&self).extended_class() } fn render_with_class(&self, class: &str) -> Markup { Text(&self).render_with_class(class) } } impl UIWidget for &str { fn can_inherit(&self) -> bool { Text(&self).can_inherit() } fn base_class(&self) -> Vec { Text(&self).base_class() } fn extended_class(&self) -> Vec { Text(&self).extended_class() } fn render_with_class(&self, class: &str) -> Markup { Text(&self).render_with_class(class) } } /// 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; }