1mod grid_item;
2
3pub use grid_item::*;
4use leptos::{context::Provider, prelude::*};
5use thaw_utils::class_list;
6
7#[component]
8pub fn Grid(
9 #[prop(optional, into)] class: MaybeProp<String>,
10 #[prop(default = 1u16.into(), into)]
12 cols: Signal<u16>,
13 #[prop(optional, into)] x_gap: Signal<u16>,
15 #[prop(optional, into)]
17 y_gap: Signal<u16>,
18 children: Children,
19) -> impl IntoView {
20 let style = Memo::new(move |_| {
21 let mut style = String::from("display: grid;");
22 style.push_str(&format!(
23 "grid-template-columns: repeat({}, minmax(0px, 1fr));",
24 cols.get()
25 ));
26 style.push_str(&format!("grid-gap: {}px {}px;", y_gap.get(), x_gap.get()));
27 style
28 });
29
30 view! {
31 <Provider value=GridInjection::new(x_gap)>
32 <div class=class_list!["thaw-grid", class] style=move || style.get()>
33 {children()}
34 </div>
35 </Provider>
36 }
37}
38
39#[derive(Clone)]
40pub(crate) struct GridInjection {
41 x_gap: Signal<u16>,
42}
43
44impl GridInjection {
45 pub fn new(x_gap: Signal<u16>) -> Self {
46 Self { x_gap }
47 }
48}
49
50pub(crate) fn use_grid() -> GridInjection {
51 expect_context()
52}