dioxus_bulma/components/
tile.rs1use dioxus::prelude::*;
2use crate::utils::build_class;
3
4#[derive(Debug, Clone, Copy, PartialEq)]
5pub enum TileSize {
6 Is1,
7 Is2,
8 Is3,
9 Is4,
10 Is5,
11 Is6,
12 Is7,
13 Is8,
14 Is9,
15 Is10,
16 Is11,
17 Is12,
18}
19
20impl TileSize {
21 pub fn as_str(&self) -> &'static str {
22 match self {
23 TileSize::Is1 => "is-1",
24 TileSize::Is2 => "is-2",
25 TileSize::Is3 => "is-3",
26 TileSize::Is4 => "is-4",
27 TileSize::Is5 => "is-5",
28 TileSize::Is6 => "is-6",
29 TileSize::Is7 => "is-7",
30 TileSize::Is8 => "is-8",
31 TileSize::Is9 => "is-9",
32 TileSize::Is10 => "is-10",
33 TileSize::Is11 => "is-11",
34 TileSize::Is12 => "is-12",
35 }
36 }
37}
38
39#[derive(Props, Clone, PartialEq)]
40pub struct TileProps {
41 #[props(default)]
42 pub ancestor: Option<bool>,
43 #[props(default)]
44 pub parent: Option<bool>,
45 #[props(default)]
46 pub child: Option<bool>,
47 #[props(default)]
48 pub vertical: Option<bool>,
49 #[props(default)]
50 pub size: Option<TileSize>,
51 #[props(default)]
52 pub id: Option<String>,
53 #[props(default)]
54 pub class: Option<String>,
55 #[props(default)]
56 pub style: Option<String>,
57 pub children: Element,
58}
59
60#[component]
61pub fn Tile(props: TileProps) -> Element {
62 let ancestor = props.ancestor.unwrap_or(false);
63 let parent = props.parent.unwrap_or(false);
64 let child = props.child.unwrap_or(false);
65 let vertical = props.vertical.unwrap_or(false);
66
67 let base_classes = vec!["tile"];
68 let optional_classes = vec![
69 if ancestor { Some("is-ancestor".to_string()) } else { None },
70 if parent { Some("is-parent".to_string()) } else { None },
71 if child { Some("is-child".to_string()) } else { None },
72 if vertical { Some("is-vertical".to_string()) } else { None },
73 props.size.map(|s| s.as_str().to_string()),
74 props.class.clone(),
75 ];
76
77 let final_class = build_class(&base_classes, &optional_classes);
78 let tile_style = props.style.as_deref().unwrap_or("");
79
80 rsx! {
81 div {
82 class: "{final_class}",
83 style: "{tile_style}",
84 id: props.id.clone(),
85 {props.children}
86 }
87 }
88}