dioxus_bootstrap_css/
grid.rs1use dioxus::prelude::*;
2
3use crate::types::ColumnSize;
4
5#[derive(Clone, PartialEq, Props)]
26pub struct ContainerProps {
27 #[props(default)]
29 pub fluid: bool,
30 #[props(default)]
32 pub class: String,
33 #[props(extends = GlobalAttributes)]
35 attributes: Vec<Attribute>,
36 pub children: Element,
38}
39
40#[component]
41pub fn Container(props: ContainerProps) -> Element {
42 let base = if props.fluid {
43 "container-fluid"
44 } else {
45 "container"
46 };
47 let full_class = if props.class.is_empty() {
48 base.to_string()
49 } else {
50 format!("{base} {}", props.class)
51 };
52
53 rsx! {
54 div { class: "{full_class}", ..props.attributes, {props.children} }
55 }
56}
57
58#[derive(Clone, PartialEq, Props)]
81pub struct RowProps {
82 #[props(default)]
84 pub class: String,
85 #[props(extends = GlobalAttributes)]
87 attributes: Vec<Attribute>,
88 pub children: Element,
90}
91
92#[component]
93pub fn Row(props: RowProps) -> Element {
94 let full_class = if props.class.is_empty() {
95 "row".to_string()
96 } else {
97 format!("row {}", props.class)
98 };
99
100 rsx! {
101 div { class: "{full_class}", ..props.attributes, {props.children} }
102 }
103}
104
105#[derive(Clone, PartialEq, Props)]
130pub struct ColProps {
131 #[props(default)]
133 pub xs: Option<ColumnSize>,
134 #[props(default)]
136 pub sm: Option<ColumnSize>,
137 #[props(default)]
139 pub md: Option<ColumnSize>,
140 #[props(default)]
142 pub lg: Option<ColumnSize>,
143 #[props(default)]
145 pub xl: Option<ColumnSize>,
146 #[props(default)]
148 pub xxl: Option<ColumnSize>,
149 #[props(default)]
151 pub offset: Option<u8>,
152 #[props(default)]
154 pub offset_sm: Option<u8>,
155 #[props(default)]
157 pub offset_md: Option<u8>,
158 #[props(default)]
160 pub offset_lg: Option<u8>,
161 #[props(default)]
163 pub offset_xl: Option<u8>,
164 #[props(default)]
166 pub offset_xxl: Option<u8>,
167 #[props(default)]
169 pub order: Option<u8>,
170 #[props(default)]
172 pub order_sm: Option<u8>,
173 #[props(default)]
175 pub order_md: Option<u8>,
176 #[props(default)]
178 pub order_lg: Option<u8>,
179 #[props(default)]
181 pub class: String,
182 #[props(extends = GlobalAttributes)]
184 attributes: Vec<Attribute>,
185 pub children: Element,
187}
188
189#[component]
190pub fn Col(props: ColProps) -> Element {
191 let mut classes = Vec::new();
192
193 if let Some(size) = &props.xs {
194 classes.push(format!("col-{size}"));
195 }
196 if let Some(size) = &props.sm {
197 classes.push(format!("col-sm-{size}"));
198 }
199 if let Some(size) = &props.md {
200 classes.push(format!("col-md-{size}"));
201 }
202 if let Some(size) = &props.lg {
203 classes.push(format!("col-lg-{size}"));
204 }
205 if let Some(size) = &props.xl {
206 classes.push(format!("col-xl-{size}"));
207 }
208 if let Some(size) = &props.xxl {
209 classes.push(format!("col-xxl-{size}"));
210 }
211
212 if classes.is_empty() {
214 classes.push("col".to_string());
215 }
216
217 if let Some(n) = props.offset {
219 classes.push(format!("offset-{n}"));
220 }
221 if let Some(n) = props.offset_sm {
222 classes.push(format!("offset-sm-{n}"));
223 }
224 if let Some(n) = props.offset_md {
225 classes.push(format!("offset-md-{n}"));
226 }
227 if let Some(n) = props.offset_lg {
228 classes.push(format!("offset-lg-{n}"));
229 }
230 if let Some(n) = props.offset_xl {
231 classes.push(format!("offset-xl-{n}"));
232 }
233 if let Some(n) = props.offset_xxl {
234 classes.push(format!("offset-xxl-{n}"));
235 }
236
237 if let Some(n) = props.order {
239 classes.push(format!("order-{n}"));
240 }
241 if let Some(n) = props.order_sm {
242 classes.push(format!("order-sm-{n}"));
243 }
244 if let Some(n) = props.order_md {
245 classes.push(format!("order-md-{n}"));
246 }
247 if let Some(n) = props.order_lg {
248 classes.push(format!("order-lg-{n}"));
249 }
250
251 if !props.class.is_empty() {
252 classes.push(props.class.clone());
253 }
254
255 let full_class = classes.join(" ");
256
257 rsx! {
258 div { class: "{full_class}", ..props.attributes, {props.children} }
259 }
260}