dioxus_bootstrap_css/
grid.rs1use dioxus::prelude::*;
2
3use crate::types::ColumnSize;
4
5#[derive(Clone, PartialEq, Props)]
22pub struct ContainerProps {
23 #[props(default)]
25 pub fluid: bool,
26 #[props(default)]
28 pub class: String,
29 #[props(extends = GlobalAttributes)]
31 attributes: Vec<Attribute>,
32 pub children: Element,
34}
35
36#[component]
37pub fn Container(props: ContainerProps) -> Element {
38 let base = if props.fluid {
39 "container-fluid"
40 } else {
41 "container"
42 };
43 let full_class = if props.class.is_empty() {
44 base.to_string()
45 } else {
46 format!("{base} {}", props.class)
47 };
48
49 rsx! {
50 div { class: "{full_class}", ..props.attributes, {props.children} }
51 }
52}
53
54#[derive(Clone, PartialEq, Props)]
73pub struct RowProps {
74 #[props(default)]
76 pub class: String,
77 #[props(extends = GlobalAttributes)]
79 attributes: Vec<Attribute>,
80 pub children: Element,
82}
83
84#[component]
85pub fn Row(props: RowProps) -> Element {
86 let full_class = if props.class.is_empty() {
87 "row".to_string()
88 } else {
89 format!("row {}", props.class)
90 };
91
92 rsx! {
93 div { class: "{full_class}", ..props.attributes, {props.children} }
94 }
95}
96
97#[derive(Clone, PartialEq, Props)]
118pub struct ColProps {
119 #[props(default)]
121 pub xs: Option<ColumnSize>,
122 #[props(default)]
124 pub sm: Option<ColumnSize>,
125 #[props(default)]
127 pub md: Option<ColumnSize>,
128 #[props(default)]
130 pub lg: Option<ColumnSize>,
131 #[props(default)]
133 pub xl: Option<ColumnSize>,
134 #[props(default)]
136 pub xxl: Option<ColumnSize>,
137 #[props(default)]
139 pub offset: Option<u8>,
140 #[props(default)]
142 pub offset_sm: Option<u8>,
143 #[props(default)]
145 pub offset_md: Option<u8>,
146 #[props(default)]
148 pub offset_lg: Option<u8>,
149 #[props(default)]
151 pub offset_xl: Option<u8>,
152 #[props(default)]
154 pub offset_xxl: Option<u8>,
155 #[props(default)]
157 pub order: Option<u8>,
158 #[props(default)]
160 pub order_sm: Option<u8>,
161 #[props(default)]
163 pub order_md: Option<u8>,
164 #[props(default)]
166 pub order_lg: Option<u8>,
167 #[props(default)]
169 pub class: String,
170 #[props(extends = GlobalAttributes)]
172 attributes: Vec<Attribute>,
173 pub children: Element,
175}
176
177#[component]
178pub fn Col(props: ColProps) -> Element {
179 let mut classes = Vec::new();
180
181 if let Some(size) = &props.xs {
182 classes.push(format!("col-{size}"));
183 }
184 if let Some(size) = &props.sm {
185 classes.push(format!("col-sm-{size}"));
186 }
187 if let Some(size) = &props.md {
188 classes.push(format!("col-md-{size}"));
189 }
190 if let Some(size) = &props.lg {
191 classes.push(format!("col-lg-{size}"));
192 }
193 if let Some(size) = &props.xl {
194 classes.push(format!("col-xl-{size}"));
195 }
196 if let Some(size) = &props.xxl {
197 classes.push(format!("col-xxl-{size}"));
198 }
199
200 if classes.is_empty() {
202 classes.push("col".to_string());
203 }
204
205 if let Some(n) = props.offset {
207 classes.push(format!("offset-{n}"));
208 }
209 if let Some(n) = props.offset_sm {
210 classes.push(format!("offset-sm-{n}"));
211 }
212 if let Some(n) = props.offset_md {
213 classes.push(format!("offset-md-{n}"));
214 }
215 if let Some(n) = props.offset_lg {
216 classes.push(format!("offset-lg-{n}"));
217 }
218 if let Some(n) = props.offset_xl {
219 classes.push(format!("offset-xl-{n}"));
220 }
221 if let Some(n) = props.offset_xxl {
222 classes.push(format!("offset-xxl-{n}"));
223 }
224
225 if let Some(n) = props.order {
227 classes.push(format!("order-{n}"));
228 }
229 if let Some(n) = props.order_sm {
230 classes.push(format!("order-sm-{n}"));
231 }
232 if let Some(n) = props.order_md {
233 classes.push(format!("order-md-{n}"));
234 }
235 if let Some(n) = props.order_lg {
236 classes.push(format!("order-lg-{n}"));
237 }
238
239 if !props.class.is_empty() {
240 classes.push(props.class.clone());
241 }
242
243 let full_class = classes.join(" ");
244
245 rsx! {
246 div { class: "{full_class}", ..props.attributes, {props.children} }
247 }
248}