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-v6-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}>{ props.children.clone() }</div>
132 </ContextProvider<DrawerContext>>
133 )
134}
135
136#[derive(PartialEq, Properties)]
137pub struct DrawerContentProperties {
138 #[prop_or_default]
139 pub children: Html,
140
141 #[prop_or_default]
142 pub panel_content: Html,
143}
144
145#[function_component(DrawerContent)]
146pub fn drawer_content(props: &DrawerContentProperties) -> Html {
147 let content_class = classes!("pf-v6-c-drawer__content");
148 let panel_class = classes!("pf-v6-c-drawer__panel");
149
150 let context = use_context::<DrawerContext>();
151 let hidden = context.map(|context| !context.expanded).unwrap_or_default();
152
153 html!(
154 <div class={classes!("pf-v6-c-drawer__main")}>
155 <div class={content_class}>{ props.children.clone() }</div>
156 <div class={panel_class} {hidden}>{ props.panel_content.clone() }</div>
157 </div>
158 )
159}
160
161#[derive(PartialEq, Properties)]
162pub struct DrawerContentBodyProperties {
163 #[prop_or_default]
164 pub children: Html,
165}
166
167#[function_component(DrawerContentBody)]
168pub fn drawer_content_body(props: &DrawerContentBodyProperties) -> Html {
169 let class = classes!("pf-v6-c-drawer__body");
170
171 html!(<div {class}>{ props.children.clone() }</div>)
172}
173
174#[derive(PartialEq, Properties)]
175pub struct DrawerPanelContentProperties {
176 #[prop_or_default]
177 pub children: Html,
178}
179
180#[function_component(DrawerPanelContent)]
181pub fn drawer_panel_content(props: &DrawerPanelContentProperties) -> Html {
182 let class = classes!("pf-v6-c-drawer__body");
183
184 html!(<div {class}>{ props.children.clone() }</div>)
185}
186
187#[derive(PartialEq, Properties)]
188pub struct DrawerHeadProperties {
189 #[prop_or_default]
190 pub children: Html,
191}
192
193#[function_component(DrawerHead)]
194pub fn drawer_panel_content(props: &DrawerHeadProperties) -> Html {
195 let class = classes!("pf-v6-c-drawer__head");
196
197 html!(<div {class}>{ props.children.clone() }</div>)
198}
199
200#[derive(PartialEq, Properties)]
201pub struct DrawerActionsProperties {
202 #[prop_or_default]
203 pub children: Html,
204}
205
206#[function_component(DrawerActions)]
207pub fn drawer_actions(props: &DrawerActionsProperties) -> Html {
208 let class = classes!("pf-v6-c-drawer__actions");
209
210 html!(<div {class}>{ props.children.clone() }</div>)
211}
212
213#[derive(PartialEq, Properties)]
214pub struct DrawerCloseButtonProperties {
215 pub onclick: Callback<MouseEvent>,
216}
217
218#[function_component(DrawerCloseButton)]
219pub fn drawer_panel_content(props: &DrawerCloseButtonProperties) -> Html {
220 let class = classes!("pf-v6-c-drawer__actions");
221
222 html!(
223 <div {class}>
224 <Button
225 onclick={props.onclick.clone()}
226 variant={ButtonVariant::Plain}
227 icon={Icon::Times}
228 r#type={ButtonType::Button}
229 aria_label="Close drawer panel"
230 />
231 </div>
232 )
233}
234
235#[derive(PartialEq, Properties)]
236pub struct DrawerSectionProperties {
237 #[prop_or_default]
238 pub children: Html,
239}
240
241#[function_component(DrawerSection)]
242pub fn drawer_content_body(props: &DrawerSectionProperties) -> Html {
243 let class = classes!("pf-v6-c-drawer__section");
244
245 html!(<div {class}>{ props.children.clone() }</div>)
246}