1use yew::prelude::*;
2#[derive(Properties, PartialEq)]
3pub struct TabContentProps {
4 #[prop_or_default]
5 pub children: Children,
6 #[prop_or_default]
7 pub class: Option<AttrValue>,
8 #[prop_or_default]
9 pub node_ref: NodeRef,
10}
11#[function_component(TabContent)]
12pub fn tab_content(props: &TabContentProps) -> Html {
13 let mut classes = Classes::new();
14 classes.push("tab-content");
15 if let Some(class) = &props.class {
16 classes.push(class.to_string());
17 }
18 html! {
19 < div class = { classes } ref = { props.node_ref.clone() } > { for props.children
20 .iter() } </ div >
21 }
22}
23#[derive(Properties, PartialEq)]
24pub struct TabPaneProps {
25 #[prop_or_default]
26 pub children: Children,
27 #[prop_or_default]
28 pub active: bool,
29 #[prop_or_default]
30 pub fade: bool,
31 #[prop_or_default]
32 pub id: Option<AttrValue>,
33 #[prop_or_default]
34 pub labelled_by: Option<AttrValue>,
35 #[prop_or_default]
36 pub class: Option<AttrValue>,
37 #[prop_or_default]
38 pub node_ref: NodeRef,
39}
40#[function_component(TabPane)]
41pub fn tab_pane(props: &TabPaneProps) -> Html {
42 let mut classes = Classes::new();
43 classes.push("tab-pane");
44 if props.active {
45 classes.push("active");
46 }
47 if props.fade {
48 classes.push("fade");
49 if props.active {
50 classes.push("show");
51 }
52 }
53 if let Some(class) = &props.class {
54 classes.push(class.to_string());
55 }
56 html! {
57 < div class = { classes } id = { props.id.clone() } role = "tabpanel" aria -
58 labelledby = { props.labelled_by.clone() } ref = { props.node_ref.clone() } > {
59 for props.children.iter() } </ div >
60 }
61}
62#[derive(Properties, PartialEq)]
63pub struct TabTriggerProps {
64 #[prop_or_default]
65 pub children: Children,
66 #[prop_or_default]
67 pub active: bool,
68 #[prop_or_default]
69 pub disabled: bool,
70 #[prop_or_default]
71 pub target: Option<AttrValue>,
72 #[prop_or_default]
73 pub onclick: Option<Callback<MouseEvent>>,
74 #[prop_or_default]
75 pub class: Option<AttrValue>,
76 #[prop_or_default]
77 pub node_ref: NodeRef,
78}
79#[function_component(TabTrigger)]
80pub fn tab_trigger(props: &TabTriggerProps) -> Html {
81 let mut classes = Classes::new();
82 classes.push("nav-link");
83 if props.active {
84 classes.push("active");
85 }
86 if props.disabled {
87 classes.push("disabled");
88 }
89 if let Some(class) = &props.class {
90 classes.push(class.to_string());
91 }
92 html! {
93 < button class = { classes } type = "button" role = "tab" data - bs - toggle =
94 "tab" data - bs - target = { props.target.clone() } aria - controls = { props
95 .target.clone() } aria - selected = { props.active.to_string() } disabled = {
96 props.disabled } onclick = { props.onclick.clone() } ref = { props.node_ref
97 .clone() } > { for props.children.iter() } </ button >
98 }
99}