orbital-base-components 0.1.1

Headless base primitives for Orbital — structure, semantics, and accessibility
Documentation
use leptos::prelude::*;

use super::{TagAppearance, TagSize};
use crate::icon::BaseIcon;

pub(crate) struct TagSurfaceClassOptions {
    pub appearance: TagAppearance,
    pub size: Option<TagSize>,
    pub dismissible: bool,
    pub with_media: bool,
    pub primary_action: bool,
    pub with_secondary: bool,
    pub secondary_action: bool,
    pub extra: Option<String>,
}

pub(crate) fn tag_surface_classes(options: TagSurfaceClassOptions) -> String {
    let TagSurfaceClassOptions {
        appearance,
        size,
        dismissible,
        with_media,
        primary_action,
        with_secondary,
        secondary_action,
        extra,
    } = options;

    let mut parts = if secondary_action {
        vec!["orbital-tag__dismiss".to_string()]
    } else {
        vec!["orbital-tag".to_string()]
    };

    parts.push(format!("orbital-tag--{}", appearance.as_str()));

    if dismissible {
        parts.push("orbital-tag--dismissible".to_string());
    }
    if with_media {
        parts.push("orbital-tag--with-media".to_string());
    }
    if primary_action {
        parts.push("orbital-tag--primary-action".to_string());
    }
    if with_secondary {
        parts.push("orbital-tag--with-secondary".to_string());
    }
    if secondary_action {
        parts.push("orbital-tag--secondary-action".to_string());
    }
    if let Some(size) = size {
        parts.push(format!("orbital-tag--{}", size.as_str()));
    }
    if let Some(extra) = extra {
        if !extra.is_empty() {
            parts.push(extra);
        }
    }

    parts.join(" ")
}

#[component]
pub fn TagMediaView(#[prop(into)] icon: icondata_core::Icon) -> impl IntoView {
    view! {
        <span class="orbital-tag__media" aria-hidden="true">
            <BaseIcon icon=icon width="1em" height="1em" />
        </span>
    }
}