Skip to main content

dioxus_bulma/components/
tile.rs

1use 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}