yew_and_bulma/layout/
level.rs1use yew::html;
2use yew::{
3 function_component, html::ChildrenRenderer, virtual_dom::VChild, Children, ChildrenWithProps,
4 Html, Properties,
5};
6use yew_and_bulma_macros::base_component_properties;
7
8use crate::utils::class::ClassBuilder;
9
10#[base_component_properties]
33#[derive(Properties, PartialEq)]
34pub struct LevelProperties {
35 #[prop_or_default]
58 pub mobile: bool,
59 pub children: ChildrenRenderer<LevelElement>,
66}
67
68#[function_component(Level)]
91pub fn level(props: &LevelProperties) -> Html {
92 let mobile = if props.mobile { "is-mobile" } else { "" };
93 let class = ClassBuilder::default()
94 .with_custom_class("level")
95 .with_custom_class(mobile)
96 .with_custom_class(
97 &props
98 .class
99 .as_ref()
100 .map(|c| c.to_string())
101 .unwrap_or("".to_owned()),
102 )
103 .build();
104
105 html! {
106 <div id={&props.id} {class}
107 onclick={props.onclick.clone()} onwheel={props.onwheel.clone()} onscroll={props.onscroll.clone()}
108 onmousedown={props.onmousedown.clone()} onmousemove={props.onmousemove.clone()} onmouseout={props.onmouseout.clone()} onmouseover={props.onmouseover.clone()} onmouseup={props.onmouseup.clone()}
109 ondrag={props.ondrag.clone()} ondragend={props.ondragend.clone()} ondragenter={props.ondragenter.clone()} ondragleave={props.ondragleave.clone()} ondragover={props.ondragover.clone()} ondragstart={props.ondragstart.clone()} ondrop={props.ondrop.clone()}
110 oncopy={props.oncopy.clone()} oncut={props.oncut.clone()} onpaste={props.onpaste.clone()}
111 onkeydown={props.onkeydown.clone()} onkeypress={props.onkeypress.clone()} onkeyup={props.onkeyup.clone()}
112 onblur={props.onblur.clone()} onchange={props.onchange.clone()} oncontextmenu={props.oncontextmenu.clone()} onfocus={props.onfocus.clone()} oninput={props.oninput.clone()} oninvalid={props.oninvalid.clone()} onreset={props.onreset.clone()} onselect={props.onselect.clone()} onsubmit={props.onsubmit.clone()}
113 onabort={props.onabort.clone()} oncanplay={props.oncanplay.clone()} oncanplaythrough={props.oncanplaythrough.clone()} oncuechange={props.oncuechange.clone()}
114 ondurationchange={props.ondurationchange.clone()} onemptied={props.onemptied.clone()} onended={props.onended.clone()} onerror={props.onerror.clone()}
115 onloadeddata={props.onloadeddata.clone()} onloadedmetadata={props.onloadedmetadata.clone()} onloadstart={props.onloadstart.clone()} onpause={props.onpause.clone()}
116 onplay={props.onplay.clone()} onplaying={props.onplaying.clone()} onprogress={props.onprogress.clone()} onratechange={props.onratechange.clone()}
117 onseeked={props.onseeked.clone()} onseeking={props.onseeking.clone()} onstalled={props.onstalled.clone()} onsuspend={props.onsuspend.clone()}
118 ontimeupdate={props.ontimeupdate.clone()} onvolumechange={props.onvolumechange.clone()} onwaiting={props.onwaiting.clone()}>
119 { for props.children.iter() }
120 </div>
121 }
122}
123
124#[derive(Clone, PartialEq)]
153pub enum LevelElement {
154 LevelItem(VChild<LevelItem>),
155 LevelLeft(VChild<LevelLeft>),
156 LevelRight(VChild<LevelRight>),
157}
158
159impl From<VChild<LevelItem>> for LevelElement {
160 fn from(value: VChild<LevelItem>) -> Self {
161 LevelElement::LevelItem(value)
162 }
163}
164
165impl From<VChild<LevelLeft>> for LevelElement {
166 fn from(value: VChild<LevelLeft>) -> Self {
167 LevelElement::LevelLeft(value)
168 }
169}
170
171impl From<VChild<LevelRight>> for LevelElement {
172 fn from(value: VChild<LevelRight>) -> Self {
173 LevelElement::LevelRight(value)
174 }
175}
176
177#[allow(clippy::from_over_into)]
178impl Into<Html> for LevelElement {
179 fn into(self) -> Html {
180 match self {
181 LevelElement::LevelItem(li) => li.into(),
182 LevelElement::LevelLeft(ll) => ll.into(),
183 LevelElement::LevelRight(lr) => lr.into(),
184 }
185 }
186}
187
188#[base_component_properties]
211#[derive(Properties, PartialEq)]
212pub struct LevelItemProperties {
213 pub children: Children,
220}
221
222#[function_component(LevelItem)]
245pub fn level_item(props: &LevelItemProperties) -> Html {
246 let class = ClassBuilder::default()
247 .with_custom_class("level-item")
248 .with_custom_class(
249 &props
250 .class
251 .as_ref()
252 .map(|c| c.to_string())
253 .unwrap_or("".to_owned()),
254 )
255 .build();
256
257 html! {
258 <div id={&props.id} {class}
259 onclick={props.onclick.clone()} onwheel={props.onwheel.clone()} onscroll={props.onscroll.clone()}
260 onmousedown={props.onmousedown.clone()} onmousemove={props.onmousemove.clone()} onmouseout={props.onmouseout.clone()} onmouseover={props.onmouseover.clone()} onmouseup={props.onmouseup.clone()}
261 ondrag={props.ondrag.clone()} ondragend={props.ondragend.clone()} ondragenter={props.ondragenter.clone()} ondragleave={props.ondragleave.clone()} ondragover={props.ondragover.clone()} ondragstart={props.ondragstart.clone()} ondrop={props.ondrop.clone()}
262 oncopy={props.oncopy.clone()} oncut={props.oncut.clone()} onpaste={props.onpaste.clone()}
263 onkeydown={props.onkeydown.clone()} onkeypress={props.onkeypress.clone()} onkeyup={props.onkeyup.clone()}
264 onblur={props.onblur.clone()} onchange={props.onchange.clone()} oncontextmenu={props.oncontextmenu.clone()} onfocus={props.onfocus.clone()} oninput={props.oninput.clone()} oninvalid={props.oninvalid.clone()} onreset={props.onreset.clone()} onselect={props.onselect.clone()} onsubmit={props.onsubmit.clone()}
265 onabort={props.onabort.clone()} oncanplay={props.oncanplay.clone()} oncanplaythrough={props.oncanplaythrough.clone()} oncuechange={props.oncuechange.clone()}
266 ondurationchange={props.ondurationchange.clone()} onemptied={props.onemptied.clone()} onended={props.onended.clone()} onerror={props.onerror.clone()}
267 onloadeddata={props.onloadeddata.clone()} onloadedmetadata={props.onloadedmetadata.clone()} onloadstart={props.onloadstart.clone()} onpause={props.onpause.clone()}
268 onplay={props.onplay.clone()} onplaying={props.onplaying.clone()} onprogress={props.onprogress.clone()} onratechange={props.onratechange.clone()}
269 onseeked={props.onseeked.clone()} onseeking={props.onseeking.clone()} onstalled={props.onstalled.clone()} onsuspend={props.onsuspend.clone()}
270 ontimeupdate={props.ontimeupdate.clone()} onvolumechange={props.onvolumechange.clone()} onwaiting={props.onwaiting.clone()}>
271 { for props.children.iter() }
272 </div>
273 }
274}
275
276#[base_component_properties]
301#[derive(Properties, PartialEq)]
302pub struct LevelLeftProperties {
303 pub children: ChildrenWithProps<LevelItem>,
310}
311
312#[function_component(LevelLeft)]
337pub fn level_right(props: &LevelLeftProperties) -> Html {
338 let class = ClassBuilder::default()
339 .with_custom_class("level-left")
340 .with_custom_class(
341 &props
342 .class
343 .as_ref()
344 .map(|c| c.to_string())
345 .unwrap_or("".to_owned()),
346 )
347 .build();
348
349 html! {
350 <div id={&props.id} {class}
351 onclick={props.onclick.clone()} onwheel={props.onwheel.clone()} onscroll={props.onscroll.clone()}
352 onmousedown={props.onmousedown.clone()} onmousemove={props.onmousemove.clone()} onmouseout={props.onmouseout.clone()} onmouseover={props.onmouseover.clone()} onmouseup={props.onmouseup.clone()}
353 ondrag={props.ondrag.clone()} ondragend={props.ondragend.clone()} ondragenter={props.ondragenter.clone()} ondragleave={props.ondragleave.clone()} ondragover={props.ondragover.clone()} ondragstart={props.ondragstart.clone()} ondrop={props.ondrop.clone()}
354 oncopy={props.oncopy.clone()} oncut={props.oncut.clone()} onpaste={props.onpaste.clone()}
355 onkeydown={props.onkeydown.clone()} onkeypress={props.onkeypress.clone()} onkeyup={props.onkeyup.clone()}
356 onblur={props.onblur.clone()} onchange={props.onchange.clone()} oncontextmenu={props.oncontextmenu.clone()} onfocus={props.onfocus.clone()} oninput={props.oninput.clone()} oninvalid={props.oninvalid.clone()} onreset={props.onreset.clone()} onselect={props.onselect.clone()} onsubmit={props.onsubmit.clone()}
357 onabort={props.onabort.clone()} oncanplay={props.oncanplay.clone()} oncanplaythrough={props.oncanplaythrough.clone()} oncuechange={props.oncuechange.clone()}
358 ondurationchange={props.ondurationchange.clone()} onemptied={props.onemptied.clone()} onended={props.onended.clone()} onerror={props.onerror.clone()}
359 onloadeddata={props.onloadeddata.clone()} onloadedmetadata={props.onloadedmetadata.clone()} onloadstart={props.onloadstart.clone()} onpause={props.onpause.clone()}
360 onplay={props.onplay.clone()} onplaying={props.onplaying.clone()} onprogress={props.onprogress.clone()} onratechange={props.onratechange.clone()}
361 onseeked={props.onseeked.clone()} onseeking={props.onseeking.clone()} onstalled={props.onstalled.clone()} onsuspend={props.onsuspend.clone()}
362 ontimeupdate={props.ontimeupdate.clone()} onvolumechange={props.onvolumechange.clone()} onwaiting={props.onwaiting.clone()}>
363 { for props.children.iter() }
364 </div>
365 }
366}
367
368#[base_component_properties]
393#[derive(Properties, PartialEq)]
394pub struct LevelRightProperties {
395 pub children: ChildrenWithProps<LevelItem>,
402}
403
404#[function_component(LevelRight)]
429pub fn level_right(props: &LevelRightProperties) -> Html {
430 let class = ClassBuilder::default()
431 .with_custom_class("level-right")
432 .with_custom_class(
433 &props
434 .class
435 .as_ref()
436 .map(|c| c.to_string())
437 .unwrap_or("".to_owned()),
438 )
439 .build();
440
441 html! {
442 <div id={&props.id} {class}
443 onclick={props.onclick.clone()} onwheel={props.onwheel.clone()} onscroll={props.onscroll.clone()}
444 onmousedown={props.onmousedown.clone()} onmousemove={props.onmousemove.clone()} onmouseout={props.onmouseout.clone()} onmouseover={props.onmouseover.clone()} onmouseup={props.onmouseup.clone()}
445 ondrag={props.ondrag.clone()} ondragend={props.ondragend.clone()} ondragenter={props.ondragenter.clone()} ondragleave={props.ondragleave.clone()} ondragover={props.ondragover.clone()} ondragstart={props.ondragstart.clone()} ondrop={props.ondrop.clone()}
446 oncopy={props.oncopy.clone()} oncut={props.oncut.clone()} onpaste={props.onpaste.clone()}
447 onkeydown={props.onkeydown.clone()} onkeypress={props.onkeypress.clone()} onkeyup={props.onkeyup.clone()}
448 onblur={props.onblur.clone()} onchange={props.onchange.clone()} oncontextmenu={props.oncontextmenu.clone()} onfocus={props.onfocus.clone()} oninput={props.oninput.clone()} oninvalid={props.oninvalid.clone()} onreset={props.onreset.clone()} onselect={props.onselect.clone()} onsubmit={props.onsubmit.clone()}
449 onabort={props.onabort.clone()} oncanplay={props.oncanplay.clone()} oncanplaythrough={props.oncanplaythrough.clone()} oncuechange={props.oncuechange.clone()}
450 ondurationchange={props.ondurationchange.clone()} onemptied={props.onemptied.clone()} onended={props.onended.clone()} onerror={props.onerror.clone()}
451 onloadeddata={props.onloadeddata.clone()} onloadedmetadata={props.onloadedmetadata.clone()} onloadstart={props.onloadstart.clone()} onpause={props.onpause.clone()}
452 onplay={props.onplay.clone()} onplaying={props.onplaying.clone()} onprogress={props.onprogress.clone()} onratechange={props.onratechange.clone()}
453 onseeked={props.onseeked.clone()} onseeking={props.onseeking.clone()} onstalled={props.onstalled.clone()} onsuspend={props.onsuspend.clone()}
454 ontimeupdate={props.ontimeupdate.clone()} onvolumechange={props.onvolumechange.clone()} onwaiting={props.onwaiting.clone()}>
455 { for props.children.iter() }
456 </div>
457 }
458}