dxc 1.0.0

A concise, modern dioxus component library
Documentation
use super::props::LinkProps;
use crate::hooks::UseNamespace;
use crate::types::{components::link::*, namespace::Block};
use dioxus::prelude::*;
use dxc_macros::classes;

#[component]
pub fn DxcLink(props: LinkProps) -> Element {
    let link_type = use_signal(|| props.type_().to_string());
    let underline_mode = use_signal(|| props.underline());
    let disabled = use_signal(|| props.disabled());
    let href = use_signal(|| props.href());
    let target = use_signal(|| props.target());

    let ns = UseNamespace::new(Block::Link, None);

    let classes = classes! {
        ns.b(),
        ns.m_(link_type()),
        ns.is_(String::from("disabled"), Some(disabled())),
        ns.is_(String::from("underline"), Some(underline_mode() == Underline::Always)),
        ns.is_(String::from("hover-underline"), Some(underline_mode() == Underline::Hover && !disabled())),
    };

    rsx! {
        a {
            class: classes,
            href: (!disabled()).then_some(href()),
            target: (!disabled()).then_some(target()),
            onclick: move |e| {
                if disabled() {
                    e.prevent_default();
                }
            },
            span {
                {props.children}
            }
        }
    }
}