patternfly_yew/components/drawer/
mod.rs1use crate::prelude::*;
2use yew::prelude::*;
3
4#[derive(PartialEq, Eq, Copy, Clone, Default)]
5pub enum DrawerPosition {
6 Left,
7 #[default]
8 Right,
9 Bottom,
10}
11
12impl AsClasses for DrawerPosition {
13 fn extend_classes(&self, classes: &mut Classes) {
14 match self {
15 Self::Left => {
16 classes.push(classes!("pf-m-panel-left"));
17 }
18 Self::Right => {}
19 Self::Bottom => {
20 classes.push(classes!("pf-m-panel-bottom"));
21 }
22 }
23 }
24}
25
26#[derive(Clone, PartialEq)]
27pub struct DrawerContext {
28 pub expanded: bool,
29}
30
31#[derive(PartialEq, Properties)]
32pub struct DrawerProperties {
33 #[prop_or_default]
35 pub expanded: bool,
36
37 #[prop_or_default]
39 pub position: DrawerPosition,
40
41 #[prop_or_default]
43 pub inline: bool,
44
45 #[prop_or_default]
46 pub r#static: WithBreakpoints<bool>,
47
48 #[prop_or_default]
49 pub children: Html,
50}
51
52#[function_component(Drawer)]
110pub fn drawer(props: &DrawerProperties) -> Html {
111 let mut class = classes!("pf-v5-c-drawer");
112
113 if props.expanded {
114 class.extend(classes!("pf-m-expanded"));
115 }
116
117 class.extend_from(&props.position);
118
119 if props.inline {
120 class.extend(classes!("pf-m-inline"));
121 }
122
123 class.extend_from(&props.r#static.mapped(|f| f.then(|| "static".to_string())));
124
125 let context = DrawerContext {
126 expanded: props.expanded,
127 };
128
129 html!(
130 <ContextProvider<DrawerContext> {context}>
131 <div {class}>
132 { props.children.clone() }
133 </div>
134 </ContextProvider<DrawerContext>>
135 )
136}
137
138#[derive(PartialEq, Properties)]
139pub struct DrawerContentProperties {
140 #[prop_or_default]
141 pub children: Html,
142
143 #[prop_or_default]
144 pub panel_content: Html,
145}
146
147#[function_component(DrawerContent)]
148pub fn drawer_content(props: &DrawerContentProperties) -> Html {
149 let content_class = classes!("pf-v5-c-drawer__content");
150 let panel_class = classes!("pf-v5-c-drawer__panel");
151
152 let context = use_context::<DrawerContext>();
153 let hidden = context.map(|context| !context.expanded).unwrap_or_default();
154
155 html!(
156 <div class={classes!("pf-v5-c-drawer__main")}>
157 <div class={content_class}>
158 { props.children.clone() }
159 </div>
160 <div class={panel_class} {hidden}>
161 { props.panel_content.clone() }
162 </div>
163 </div>
164 )
165}
166
167#[derive(PartialEq, Properties)]
168pub struct DrawerContentBodyProperties {
169 #[prop_or_default]
170 pub children: Html,
171}
172
173#[function_component(DrawerContentBody)]
174pub fn drawer_content_body(props: &DrawerContentBodyProperties) -> Html {
175 let class = classes!("pf-v5-c-drawer__body");
176
177 html!(
178 <div {class}>
179 { props.children.clone() }
180 </div>
181 )
182}
183
184#[derive(PartialEq, Properties)]
185pub struct DrawerPanelContentProperties {
186 #[prop_or_default]
187 pub children: Html,
188}
189
190#[function_component(DrawerPanelContent)]
191pub fn drawer_panel_content(props: &DrawerPanelContentProperties) -> Html {
192 let class = classes!("pf-v5-c-drawer__body");
193
194 html!(
195 <div {class}>
196 { props.children.clone() }
197 </div>
198 )
199}
200
201#[derive(PartialEq, Properties)]
202pub struct DrawerHeadProperties {
203 #[prop_or_default]
204 pub children: Html,
205}
206
207#[function_component(DrawerHead)]
208pub fn drawer_panel_content(props: &DrawerHeadProperties) -> Html {
209 let class = classes!("pf-v5-c-drawer__head");
210
211 html!(
212 <div {class}>
213 { props.children.clone() }
214 </div>
215 )
216}
217
218#[derive(PartialEq, Properties)]
219pub struct DrawerActionsProperties {
220 #[prop_or_default]
221 pub children: Html,
222}
223
224#[function_component(DrawerActions)]
225pub fn drawer_actions(props: &DrawerActionsProperties) -> Html {
226 let class = classes!("pf-v5-c-drawer__actions");
227
228 html!(
229 <div {class}>
230 { props.children.clone() }
231 </div>
232 )
233}
234
235#[derive(PartialEq, Properties)]
236pub struct DrawerCloseButtonProperties {
237 pub onclick: Callback<MouseEvent>,
238}
239
240#[function_component(DrawerCloseButton)]
241pub fn drawer_panel_content(props: &DrawerCloseButtonProperties) -> Html {
242 let class = classes!("pf-v5-c-drawer__actions");
243
244 html!(
245 <div {class}>
246 <Button
247 onclick={props.onclick.clone()}
248 variant={ButtonVariant::Plain}
249 icon={Icon::Times}
250 r#type={ButtonType::Button}
251 aria_label="Close drawer panel"
252 />
253 </div>
254 )
255}
256
257#[derive(PartialEq, Properties)]
258pub struct DrawerSectionProperties {
259 #[prop_or_default]
260 pub children: Html,
261}
262
263#[function_component(DrawerSection)]
264pub fn drawer_content_body(props: &DrawerSectionProperties) -> Html {
265 let class = classes!("pf-v5-c-drawer__section");
266
267 html!(
268 <div {class}>
269 { props.children.clone() }
270 </div>
271 )
272}