dxc_components/link/
link.rs1use super::props::LinkProps;
2use dioxus::prelude::*;
3use dxc_hooks::UseNamespace;
4use dxc_macros::classes;
5use dxc_types::{namespace::Block, components::link::*};
6
7#[component]
8pub fn DxcLink(props: LinkProps) -> Element {
9 let link_type = use_signal(|| props.type_().to_string());
10 let underline_mode = use_signal(|| props.underline());
11 let disabled = use_signal(|| props.disabled());
12 let href = use_signal(|| props.href());
13 let target = use_signal(|| props.target());
14
15 let ns = UseNamespace::new(Block::Link, None);
16
17 let classes = classes! {
18 ns.b(),
19 ns.m_(link_type()),
20 ns.is_(String::from("disabled"), Some(disabled())),
21 ns.is_(String::from("underline"), Some(underline_mode() == Underline::Always)),
22 ns.is_(String::from("hover-underline"), Some(underline_mode() == Underline::Hover && !disabled())),
23 };
24
25 rsx! {
26 a {
27 class: classes,
28 href: (!disabled()).then_some(href()),
29 target: (!disabled()).then_some(target()),
30 onclick: move |e| {
31 if disabled() {
32 e.prevent_default();
33 }
34 },
35 span {
36 {props.children}
37 }
38 }
39 }
40}