sycamore_web/
components.rs1use sycamore_macro::{component, view, Props};
4
5use crate::*;
6
7#[derive(Props)]
9pub struct ShowProps {
10 #[prop(setter(into))]
11 pub when: MaybeDyn<bool>,
12 pub children: Children,
13}
14
15#[component]
17pub fn Show(props: ShowProps) -> View {
18 let mut children = props.children.call();
19 let when = create_selector(move || props.when.get());
20
21 if is_ssr!() {
22 View::from_dynamic(move || {
23 if when.get() {
24 std::mem::take(&mut children)
25 } else {
26 view! {}
27 }
28 })
29 } else {
30 View::from_dynamic(move || {
31 let cloned = utils::clone_nodes_via_web_sys(&children);
32
33 if when.get() {
34 children = utils::unwrap_from_document_fragment(cloned);
37
38 utils::clone_nodes_via_web_sys(&children)
39 } else {
40 children = utils::wrap_in_document_fragment(cloned);
43 view! {}
44 }
45 })
46 }
47}
48
49#[component(inline_props)]
54pub fn NoSsr(children: Children) -> View {
55 if is_ssr!() {
56 view! { no-ssr() }
57 } else {
58 let marker = create_node_ref();
59 let view = view! { no-ssr(r#ref=marker) };
60 on_mount(move || {
61 let marker = marker.get();
62 let parent = marker.parent_node().unwrap();
63
64 let children = children.call();
65 for node in children.as_web_sys() {
66 parent.insert_before(&node, Some(&marker)).unwrap();
67 }
68 parent.remove_child(&marker).unwrap();
69 });
70 view
71 }
72}
73
74#[component(inline_props)]
82pub fn NoHydrate(children: Children) -> View {
83 if is_ssr!() {
84 let is_hydrating = IS_HYDRATING.replace(false);
85 let children = children.call();
86 IS_HYDRATING.set(is_hydrating);
87 children
88 } else if IS_HYDRATING.get() {
89 view! {}
90 } else {
91 children.call()
92 }
93}
94
95pub fn generate_hydration_script(mode: SsrMode) -> &'static str {
99 match mode {
100 SsrMode::Sync => "",
101 SsrMode::Blocking => "window.__sycamore_ssr_mode='blocking'",
102 SsrMode::Streaming => "window.__sycamore_ssr_mode='streaming'",
103 }
104}
105
106#[component]
114pub fn HydrationScript() -> View {
115 is_ssr! {
116 let mode = use_context::<SsrMode>();
117 let script = generate_hydration_script(mode);
118 view! {
119 NoHydrate {
120 script(dangerously_set_inner_html=script)
121 }
122 }
123 }
124 is_not_ssr! {
125 view! {}
126 }
127}