use std::borrow::Cow;
use std::cell::Cell;
use std::rc::Rc;
use sycamore_macro::*;
use sycamore_reactive::*;
use wasm_bindgen::prelude::*;
pub mod bind;
pub mod events;
#[doc(hidden)]
pub mod utils;
mod attributes;
mod components;
mod elements;
mod iter;
mod macros;
mod node;
mod noderef;
mod portal;
#[cfg(feature = "suspense")]
mod resource;
mod stable_counter;
#[cfg(feature = "suspense")]
mod suspense;
pub(crate) mod view;
pub use self::attributes::*;
pub use self::components::*;
pub use self::elements::*;
pub use self::iter::*;
pub use self::node::*;
pub use self::noderef::*;
pub use self::portal::*;
#[cfg(feature = "suspense")]
pub use self::resource::*;
pub use self::stable_counter::*;
#[cfg(feature = "suspense")]
pub use self::suspense::*;
pub use self::view::*;
extern crate self as sycamore;
mod web {
pub use crate::*;
}
#[doc(hidden)]
pub mod rt {
pub use sycamore_core::*;
#[cfg(feature = "suspense")]
pub use sycamore_futures::*;
pub use sycamore_macro::*;
pub use sycamore_reactive::*;
#[allow(unused_imports)] pub use web_sys;
#[cfg(feature = "suspense")]
pub use crate::WrapAsync;
pub use crate::{bind, custom_element, tags, View};
}
pub use {js_sys, wasm_bindgen};
#[cfg(any(not(target_arch = "wasm32"), sycamore_force_ssr))]
#[macro_export]
#[doc(hidden)]
macro_rules! _is_ssr {
() => { true };
($($tt:tt)*) => {
$($tt)*
};
}
#[cfg(all(target_arch = "wasm32", not(sycamore_force_ssr)))]
#[macro_export]
#[doc(hidden)]
macro_rules! _is_ssr {
() => {
false
};
($($tt:tt)*) => {
};
}
#[cfg(any(not(target_arch = "wasm32"), sycamore_force_ssr))]
#[macro_export]
#[doc(hidden)]
macro_rules! _is_not_ssr {
() => {
false
};
($($tt:tt)*) => {
};
}
#[cfg(all(target_arch = "wasm32", not(sycamore_force_ssr)))]
#[macro_export]
#[doc(hidden)]
macro_rules! _is_not_ssr {
() => { true };
($($tt:tt)*) => {
$($tt)*
};
}
#[macro_export]
macro_rules! is_ssr {
($($tt:tt)*) => {
$crate::_is_ssr! { $($tt)* }
};
}
#[macro_export]
macro_rules! is_not_ssr {
($($tt:tt)*) => {
$crate::_is_not_ssr! { $($tt)* }
};
}
#[deprecated(since = "0.9.2", note = "use `is_ssr!` instead")]
#[macro_export]
macro_rules! cfg_ssr_item {
($item:item) => {
$crate::is_ssr! { $item }
};
}
#[deprecated(since = "0.9.2", note = "use `is_not_ssr!` instead")]
#[macro_export]
macro_rules! cfg_not_ssr_item {
($item:item) => {
$crate::is_not_ssr! { $item }
};
}
#[cfg_ssr]
pub type HtmlNode = SsrNode;
#[cfg_not_ssr]
#[cfg(not(feature = "hydrate"))]
pub type HtmlNode = DomNode;
#[cfg_not_ssr]
#[cfg(feature = "hydrate")]
pub type HtmlNode = HydrateNode;
pub type Children = sycamore_core::Children<View>;
pub fn create_client_effect(f: impl FnMut() + 'static) {
if is_not_ssr!() {
create_effect(f);
}
}
pub fn on_mount(f: impl FnOnce() + 'static) {
if cfg!(target_arch = "wasm32") {
let is_alive = Rc::new(Cell::new(true));
on_cleanup({
let is_alive = Rc::clone(&is_alive);
move || is_alive.set(false)
});
let scope = use_current_scope();
let cb = move || {
if is_alive.get() {
scope.run_in(f);
}
};
queue_microtask(cb);
}
}
pub fn queue_microtask(f: impl FnOnce() + 'static) {
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_name = "queueMicrotask")]
fn queue_microtask_js(f: &wasm_bindgen::JsValue);
}
queue_microtask_js(&Closure::once_into_js(f));
}
pub fn window() -> web_sys::Window {
web_sys::window().expect("no global `window` exists")
}
pub fn document() -> web_sys::Document {
thread_local! {
static DOCUMENT: web_sys::Document = window().document().expect("no `document` exists");
}
DOCUMENT.with(Clone::clone)
}