include!("../tests/support/gallery.rs");
use axum::{Router, extract::ws::WebSocketUpgrade, response::Html, routing::get};
use dioxus_liveview::{LiveViewPool, axum_socket, interpreter_glue};
const PORT: u16 = 52414;
#[tokio::main]
async fn main() {
write_dist();
let pool = LiveViewPool::new();
let index = Html(format!(
"{}\n<body class=\"min-h-screen p-8\">\n<div id=\"main\"></div>\n{}\n</body></html>",
head("EV UIKit — Components"),
interpreter_glue("/ws"),
));
let router = Router::new().route("/", get(move || async move { index.clone() })).route(
"/ws",
get(move |ws: WebSocketUpgrade| async move {
ws.on_upgrade(move |socket| async move {
_ = pool.launch(axum_socket(socket), app).await;
})
}),
);
let addr = std::net::SocketAddr::from(([127, 0, 0, 1], PORT));
println!("EV UIKit live on http://{addr}");
let listener = tokio::net::TcpListener::bind(addr).await.expect("bind port");
axum::serve(listener, router.into_make_service()).await.expect("serve");
}
fn app() -> Element {
rsx! {
h1 { class: "mb-6 text-2xl font-semibold", "EV UIKit — Component Library" }
div { class: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3",
for (name, render) in GALLERY.iter().copied() {
section { class: "stage flex flex-col gap-3 rounded-lg border border-border bg-card/30 p-5",
h3 { class: "text-xs font-medium uppercase tracking-wide text-muted-foreground", "{name}" }
div { class: "flex flex-1 flex-wrap items-center gap-3", {render()} }
}
}
}
}
}