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 #[props(extends = GlobalAttributes)]
23 attributes: Vec<Attribute>,
24 pub children: Element,
26}
27
28#[component]
29pub fn Container(props: ContainerProps) -> Element {
30 let base = if props.fluid {
31 "container-fluid"
32 } else {
33 "container"
34 };
35 let full_class = if props.class.is_empty() {
36 base.to_string()
37 } else {
38 format!("{base} {}", props.class)
39 };
40
41 rsx! {
42 div { class: "{full_class}", ..props.attributes, {props.children} }
43 }
44}
45
46#[derive(Clone, PartialEq, Props)]
57pub struct RowProps {
58 #[props(default)]
60 pub class: String,
61 #[props(extends = GlobalAttributes)]
63 attributes: Vec<Attribute>,
64 pub children: Element,
66}
67
68#[component]
69pub fn Row(props: RowProps) -> Element {
70 let full_class = if props.class.is_empty() {
71 "row".to_string()
72 } else {
73 format!("row {}", props.class)
74 };
75
76 rsx! {
77 div { class: "{full_class}", ..props.attributes, {props.children} }
78 }
79}
80
81#[derive(Clone, PartialEq, Props)]
92pub struct ColProps {
93 #[props(default)]
95 pub xs: Option<ColumnSize>,
96 #[props(default)]
98 pub sm: Option<ColumnSize>,
99 #[props(default)]
101 pub md: Option<ColumnSize>,
102 #[props(default)]
104 pub lg: Option<ColumnSize>,
105 #[props(default)]
107 pub xl: Option<ColumnSize>,
108 #[props(default)]
110 pub xxl: Option<ColumnSize>,
111 #[props(default)]
113 pub offset: Option<u8>,
114 #[props(default)]
116 pub offset_sm: Option<u8>,
117 #[props(default)]
119 pub offset_md: Option<u8>,
120 #[props(default)]
122 pub offset_lg: Option<u8>,
123 #[props(default)]
125 pub offset_xl: Option<u8>,
126 #[props(default)]
128 pub offset_xxl: Option<u8>,
129 #[props(default)]
131 pub order: Option<u8>,
132 #[props(default)]
134 pub order_sm: Option<u8>,
135 #[props(default)]
137 pub order_md: Option<u8>,
138 #[props(default)]
140 pub order_lg: Option<u8>,
141 #[props(default)]
143 pub class: String,
144 #[props(extends = GlobalAttributes)]
146 attributes: Vec<Attribute>,
147 pub children: Element,
149}
150
151#[component]
152pub fn Col(props: ColProps) -> Element {
153 let mut classes = Vec::new();
154
155 if let Some(size) = &props.xs {
156 classes.push(format!("col-{size}"));
157 }
158 if let Some(size) = &props.sm {
159 classes.push(format!("col-sm-{size}"));
160 }
161 if let Some(size) = &props.md {
162 classes.push(format!("col-md-{size}"));
163 }
164 if let Some(size) = &props.lg {
165 classes.push(format!("col-lg-{size}"));
166 }
167 if let Some(size) = &props.xl {
168 classes.push(format!("col-xl-{size}"));
169 }
170 if let Some(size) = &props.xxl {
171 classes.push(format!("col-xxl-{size}"));
172 }
173
174 if classes.is_empty() {
176 classes.push("col".to_string());
177 }
178
179 if let Some(n) = props.offset {
181 classes.push(format!("offset-{n}"));
182 }
183 if let Some(n) = props.offset_sm {
184 classes.push(format!("offset-sm-{n}"));
185 }
186 if let Some(n) = props.offset_md {
187 classes.push(format!("offset-md-{n}"));
188 }
189 if let Some(n) = props.offset_lg {
190 classes.push(format!("offset-lg-{n}"));
191 }
192 if let Some(n) = props.offset_xl {
193 classes.push(format!("offset-xl-{n}"));
194 }
195 if let Some(n) = props.offset_xxl {
196 classes.push(format!("offset-xxl-{n}"));
197 }
198
199 if let Some(n) = props.order {
201 classes.push(format!("order-{n}"));
202 }
203 if let Some(n) = props.order_sm {
204 classes.push(format!("order-sm-{n}"));
205 }
206 if let Some(n) = props.order_md {
207 classes.push(format!("order-md-{n}"));
208 }
209 if let Some(n) = props.order_lg {
210 classes.push(format!("order-lg-{n}"));
211 }
212
213 if !props.class.is_empty() {
214 classes.push(props.class.clone());
215 }
216
217 let full_class = classes.join(" ");
218
219 rsx! {
220 div { class: "{full_class}", ..props.attributes, {props.children} }
221 }
222}