diff options
author | Ashelyn Rose <git@ashen.earth> | 2025-03-21 20:12:36 -0600 |
---|---|---|
committer | Ashelyn Rose <git@ashen.earth> | 2025-03-21 20:12:36 -0600 |
commit | 2683366e92676abf687c37f4afea4d4d721cb059 (patch) | |
tree | 756aac4f0977c3ac9fa1426f7d9b7698a6832d6d /src |
Basic leptos setup
Diffstat (limited to 'src')
-rw-r--r-- | src/components/app.rs | 61 | ||||
-rw-r--r-- | src/components/mod.rs | 3 | ||||
-rw-r--r-- | src/lib.rs | 10 | ||||
-rw-r--r-- | src/main.rs | 38 |
4 files changed, 112 insertions, 0 deletions
diff --git a/src/components/app.rs b/src/components/app.rs new file mode 100644 index 0000000..0a5ed80 --- /dev/null +++ b/src/components/app.rs @@ -0,0 +1,61 @@ +use leptos::prelude::*; +use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_router::{ + components::{Route, Router, Routes}, + StaticSegment, +}; + +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + <!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1"/> + <AutoReload options=options.clone() /> + <HydrationScripts options islands=true/> + <MetaTags/> + </head> + <body> + <App/> + </body> + </html> + } +} + +#[component] +pub fn App() -> impl IntoView { + // Provides context that manages stylesheets, titles, meta tags, etc. + provide_meta_context(); + + view! { + // injects a stylesheet into the document <head> + // id=leptos means cargo-leptos will hot-reload this stylesheet + <Stylesheet id="leptos" href="/pkg/stormscribe.css"/> + + // sets the document title + <Title text="Welcome to Leptos"/> + + // content for this welcome page + <Router> + <main> + <Routes fallback=|| "Page not found.".into_view()> + <Route path=StaticSegment("") view=HomePage/> + </Routes> + </main> + </Router> + } +} + +/// Renders the home page of your application. +#[island] +fn HomePage() -> impl IntoView { + // Creates a reactive value to update the button + let count = RwSignal::new(0); + let on_click = move |_| *count.write() += 1; + + view! { + <h1>"Welcome to Leptos!"</h1> + <button on:click=on_click>"Click Me: " {count}</button> + } +} diff --git a/src/components/mod.rs b/src/components/mod.rs new file mode 100644 index 0000000..20df27e --- /dev/null +++ b/src/components/mod.rs @@ -0,0 +1,3 @@ +pub mod app; + +pub use app::App; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..d8d34cc --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,10 @@ +pub mod components; + +#[cfg(feature = "hydrate")] +#[wasm_bindgen::prelude::wasm_bindgen] +pub fn hydrate() { + use crate::components::app::*; + + console_error_panic_hook::set_once(); + leptos::mount::hydrate_islands(); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..51b2531 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,38 @@ +#[cfg(feature = "ssr")] +#[tokio::main] +async fn main() { + use axum::Router; + use leptos::logging::log; + use leptos::prelude::*; + use leptos_axum::{generate_route_list, LeptosRoutes}; + use stormscribe::components::app::*; + + let conf = get_configuration(None).unwrap(); + let addr = conf.leptos_options.site_addr; + let leptos_options = conf.leptos_options; + // Generate the list of routes in your Leptos App + let routes = generate_route_list(App); + + let app = Router::new() + .leptos_routes(&leptos_options, routes, { + let leptos_options = leptos_options.clone(); + move || shell(leptos_options.clone()) + }) + .fallback(leptos_axum::file_and_error_handler(shell)) + .with_state(leptos_options); + + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + log!("listening on http://{}", &addr); + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); +} + +#[cfg(not(feature = "ssr"))] +pub fn main() { + // no client-side main function + // unless we want this to work with e.g., Trunk for pure client-side testing + // see lib.rs for hydration function instead +} |