dioxus_bootstrap_css/
grid.rs1use dioxus::prelude::*;
2
3use crate::types::ColumnSize;
4
5#[derive(Clone, PartialEq, Props)]
14pub struct ContainerProps {
15 #[props(default)]
17 pub fluid: bool,
18 #[props(default)]
20 pub class: String,
21 pub children: Element,
23}
24
25#[component]
26pub fn Container(props: ContainerProps) -> Element {
27 let base = if props.fluid {
28 "container-fluid"
29 } else {
30 "container"
31 };
32 let full_class = if props.class.is_empty() {
33 base.to_string()
34 } else {
35 format!("{base} {}", props.class)
36 };
37
38 rsx! {
39 div { class: "{full_class}", {props.children} }
40 }
41}
42
43#[derive(Clone, PartialEq, Props)]
54pub struct RowProps {
55 #[props(default)]
57 pub class: String,
58 pub children: Element,
60}
61
62#[component]
63pub fn Row(props: RowProps) -> Element {
64 let full_class = if props.class.is_empty() {
65 "row".to_string()
66 } else {
67 format!("row {}", props.class)
68 };
69
70 rsx! {
71 div { class: "{full_class}", {props.children} }
72 }
73}
74
75#[derive(Clone, PartialEq, Props)]
86pub struct ColProps {
87 #[props(default)]
89 pub xs: Option<ColumnSize>,
90 #[props(default)]
92 pub sm: Option<ColumnSize>,
93 #[props(default)]
95 pub md: Option<ColumnSize>,
96 #[props(default)]
98 pub lg: Option<ColumnSize>,
99 #[props(default)]
101 pub xl: Option<ColumnSize>,
102 #[props(default)]
104 pub xxl: Option<ColumnSize>,
105 #[props(default)]
107 pub offset: Option<u8>,
108 #[props(default)]
110 pub offset_sm: Option<u8>,
111 #[props(default)]
113 pub offset_md: Option<u8>,
114 #[props(default)]
116 pub offset_lg: Option<u8>,
117 #[props(default)]
119 pub offset_xl: Option<u8>,
120 #[props(default)]
122 pub offset_xxl: Option<u8>,
123 #[props(default)]
125 pub order: Option<u8>,
126 #[props(default)]
128 pub order_sm: Option<u8>,
129 #[props(default)]
131 pub order_md: Option<u8>,
132 #[props(default)]
134 pub order_lg: Option<u8>,
135 #[props(default)]
137 pub class: String,
138 pub children: Element,
140}
141
142#[component]
143pub fn Col(props: ColProps) -> Element {
144 let mut classes = Vec::new();
145
146 if let Some(size) = &props.xs {
147 classes.push(format!("col-{size}"));
148 }
149 if let Some(size) = &props.sm {
150 classes.push(format!("col-sm-{size}"));
151 }
152 if let Some(size) = &props.md {
153 classes.push(format!("col-md-{size}"));
154 }
155 if let Some(size) = &props.lg {
156 classes.push(format!("col-lg-{size}"));
157 }
158 if let Some(size) = &props.xl {
159 classes.push(format!("col-xl-{size}"));
160 }
161 if let Some(size) = &props.xxl {
162 classes.push(format!("col-xxl-{size}"));
163 }
164
165 if classes.is_empty() {
167 classes.push("col".to_string());
168 }
169
170 if let Some(n) = props.offset {
172 classes.push(format!("offset-{n}"));
173 }
174 if let Some(n) = props.offset_sm {
175 classes.push(format!("offset-sm-{n}"));
176 }
177 if let Some(n) = props.offset_md {
178 classes.push(format!("offset-md-{n}"));
179 }
180 if let Some(n) = props.offset_lg {
181 classes.push(format!("offset-lg-{n}"));
182 }
183 if let Some(n) = props.offset_xl {
184 classes.push(format!("offset-xl-{n}"));
185 }
186 if let Some(n) = props.offset_xxl {
187 classes.push(format!("offset-xxl-{n}"));
188 }
189
190 if let Some(n) = props.order {
192 classes.push(format!("order-{n}"));
193 }
194 if let Some(n) = props.order_sm {
195 classes.push(format!("order-sm-{n}"));
196 }
197 if let Some(n) = props.order_md {
198 classes.push(format!("order-md-{n}"));
199 }
200 if let Some(n) = props.order_lg {
201 classes.push(format!("order-lg-{n}"));
202 }
203
204 if !props.class.is_empty() {
205 classes.push(props.class.clone());
206 }
207
208 let full_class = classes.join(" ");
209
210 rsx! {
211 div { class: "{full_class}", {props.children} }
212 }
213}