diff --git a/Cargo.lock b/Cargo.lock index 1acaef031c..755d682a9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,9 +441,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708" dependencies = [ "unicode-ident", ] diff --git a/src/package_manager.rs b/src/package_manager.rs index 14c5c0690d..77700ac177 100644 --- a/src/package_manager.rs +++ b/src/package_manager.rs @@ -79,6 +79,7 @@ impl PackageManager { PackageManager::Cargo => &[ Template::Vanilla, Template::Yew, + Template::Dominator, Template::Leptos, Template::Sycamore, ], @@ -102,6 +103,7 @@ impl PackageManager { PackageManager::Cargo => &[ Template::Vanilla, Template::Yew, + Template::Dominator, Template::Leptos, Template::Sycamore, ], diff --git a/src/template.rs b/src/template.rs index dda38ed9e6..eb94598104 100644 --- a/src/template.rs +++ b/src/template.rs @@ -48,6 +48,7 @@ pub enum Template { Solid, SolidTs, Yew, + Dominator, Leptos, Sycamore, Angular, @@ -75,6 +76,7 @@ impl Display for Template { Template::Solid => write!(f, "solid"), Template::SolidTs => write!(f, "solid-ts"), Template::Yew => write!(f, "yew"), + Template::Dominator => write!(f, "dominator"), Template::Leptos => write!(f, "leptos"), Template::Sycamore => write!(f, "sycamore"), Template::Angular => write!(f, "angular"), @@ -99,6 +101,7 @@ impl FromStr for Template { "solid" => Ok(Template::Solid), "solid-ts" => Ok(Template::SolidTs), "yew" => Ok(Template::Yew), + "dominator" => Ok(Template::Dominator), "leptos" => Ok(Template::Leptos), "sycamore" => Ok(Template::Sycamore), "angular" => Ok(Template::Angular), @@ -125,6 +128,7 @@ impl Template { Template::React => "React - (https://reactjs.org/)", Template::Solid => "Solid - (https://www.solidjs.com/)", Template::Yew => "Yew - (https://yew.rs/)", + Template::Dominator => "Dominator - (https://github.com/Pauan/rust-dominator)", Template::Leptos => "Leptos - (https://github.com/leptos-rs/leptos)", Template::Sycamore => "Sycamore - (https://sycamore-rs.netlify.app/)", Template::Angular => "Angular - (https://angular.io/)", @@ -147,6 +151,7 @@ impl<'a> Template { Template::Solid, Template::SolidTs, Template::Yew, + Template::Dominator, Template::Leptos, Template::Sycamore, Template::Angular, @@ -217,23 +222,23 @@ impl<'a> Template { | Template::Angular | Template::Preact | Template::PreactTs => PackageManager::NODE, - Template::Yew | Template::Leptos | Template::Sycamore => &[PackageManager::Cargo], + Template::Yew | Template::Dominator | Template::Leptos | Template::Sycamore => &[PackageManager::Cargo], } } pub const fn needs_trunk(&self) -> bool { - matches!(self, Template::Sycamore | Template::Yew | Template::Leptos) + matches!(self, Template::Sycamore | Template::Yew | Template::Dominator | Template::Leptos) } pub const fn needs_tauri_cli(&self) -> bool { matches!( self, - Template::Sycamore | Template::Yew | Template::Leptos | Template::Vanilla + Template::Sycamore | Template::Yew | Template::Dominator | Template::Leptos | Template::Vanilla ) } pub const fn needs_wasm32_target(&self) -> bool { - matches!(self, Template::Sycamore | Template::Yew | Template::Leptos) + matches!(self, Template::Sycamore | Template::Yew | Template::Dominator | Template::Leptos) } pub fn render( diff --git a/templates/template-dominator/.taurignore b/templates/template-dominator/.taurignore new file mode 100644 index 0000000000..1ebdc6dc60 --- /dev/null +++ b/templates/template-dominator/.taurignore @@ -0,0 +1,3 @@ +/src +/public +/Cargo.toml \ No newline at end of file diff --git a/templates/template-dominator/Cargo.toml.lte b/templates/template-dominator/Cargo.toml.lte new file mode 100644 index 0000000000..ccea5aece4 --- /dev/null +++ b/templates/template-dominator/Cargo.toml.lte @@ -0,0 +1,63 @@ +[package] +name = "{% package_name %}-ui" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +# Enable a small amount of optimization in debug mode +[profile.dev] +opt-level = 1 + +# Enable high optimizations for dependencies, but not for our code: +[profile.dev.package."*"] +opt-level = 3 + +[dependencies] +wasm-bindgen = "0.2.84" +js-sys = "0.3.61" +wasm-bindgen-futures= "0.4.34" +gloo-events = "0.1.2" +gloo-timers = { version = "0.2.6", features = ["futures"] } +gloo-net = "0.2.6" +wasm-logger = { version = "0.2.0", optional = true } +serde-wasm-bindgen = "0.5.0" +serde = "1.0.159" +serde_json = "1.0.95" +anyhow = "1.0.70" +cfg-if = "1.0.0" +log = "0.4.17" +console_error_panic_hook = { version = "0.1.7", optional = true } +futures = "0.3.28" +dominator = "0.5.32" +futures-signals = "0.3.32" +once_cell = "1.17.1" +dominator_helpers = "0.7.2" +rand = "0.8.5" +getrandom = { version = "0.2.8", features = ["js"] } +ed25519-dalek = {version = "2.0.0-rc.3", features = ["serde", "rand_core"]} +hex = "0.4.3" + +[dependencies.web-sys] +version = "0.3.61" +features = [ + "console", + "MouseEvent", + "Document", + "Element", + "HtmlAnchorElement", + "HtmlElement", + "HtmlButtonElement", + "HtmlImageElement", + "Node", + "Window", + "Performance", + "HtmlFormElement", +] +[features] +default = [] +dev = ["wasm-logger", "console_error_panic_hook"] + +[workspace] +members = ["src-tauri"] \ No newline at end of file diff --git a/templates/template-dominator/README.md b/templates/template-dominator/README.md new file mode 100644 index 0000000000..acae2c414f --- /dev/null +++ b/templates/template-dominator/README.md @@ -0,0 +1,7 @@ +# Tauri + Dominator + +This template should help get you started developing with Tauri and Dominator. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer). \ No newline at end of file diff --git a/templates/template-dominator/Trunk.toml.lte b/templates/template-dominator/Trunk.toml.lte new file mode 100644 index 0000000000..76b8947224 --- /dev/null +++ b/templates/template-dominator/Trunk.toml.lte @@ -0,0 +1,11 @@ +[build] +target = "./index.html" + +[watch] +ignore = ["./src-tauri"] + +[serve] +address = "{% if mobile %}0.0.0.0{% else %}127.0.0.1{% endif %}" +port = 1420 +open = false{% if mobile %} +ws_protocol = "ws"{% endif %} \ No newline at end of file diff --git a/templates/template-dominator/_cta_manifest_ b/templates/template-dominator/_cta_manifest_ new file mode 100644 index 0000000000..0677494ddc --- /dev/null +++ b/templates/template-dominator/_cta_manifest_ @@ -0,0 +1,10 @@ +# Copyright 2019-2022 Tauri Programme within The Commons Conservancy +# SPDX-License-Identifier: Apache-2.0 +# SPDX-License-Identifier: MIT +devPath = http://localhost:1420 +distDir = ../dist +withGlobalTauri = true + +[files] +tauri.svg = public/tauri.svg +styles.css = styles.css diff --git a/templates/template-dominator/index.html b/templates/template-dominator/index.html new file mode 100644 index 0000000000..fadb1a6fb6 --- /dev/null +++ b/templates/template-dominator/index.html @@ -0,0 +1,10 @@ + + + + + GUI + + + + + \ No newline at end of file diff --git a/templates/template-dominator/package.json.lte b/templates/template-dominator/package.json.lte new file mode 100644 index 0000000000..128a912433 --- /dev/null +++ b/templates/template-dominator/package.json.lte @@ -0,0 +1,20 @@ +{ + "name": "{% package_name %}-ui", + "version": "0.1.0", + "scripts": { + "start": "npm-run-all --parallel localmedia:serve trunk:serve:dev tauri:dev", + "localmedia:serve": "cd public && http-server -g -b --cors -p 9000", + "trunk:serve:dev": "cross-env RUSTFLAGS=--cfg=web_sys_unstable_apis trunk serve --features dev --watch .", + "tauri:dev": "tauri dev", + "build": "cross-env RUSTFLAGS=--cfg=web_sys_unstable_apis trunk build --release" + }, + "dependencies": { + "@tauri-apps/api": "^1.4.0" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.5.9", + "cross-env": "^7.0.3", + "http-server": "^14.1.1", + "npm-run-all": "^4.1.5" + } +} \ No newline at end of file diff --git a/templates/template-dominator/src/app.rs.lte b/templates/template-dominator/src/app.rs.lte new file mode 100644 index 0000000000..6d4ad64011 --- /dev/null +++ b/templates/template-dominator/src/app.rs.lte @@ -0,0 +1,124 @@ +use std::sync::Arc; + +use serde::{Deserialize, Serialize}; +use serde_wasm_bindgen::to_value; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::spawn_local; +use dominator::DomBuilder; +pub use dominator::{clone, events, html, svg, with_node, Dom}; +pub use futures_signals::{ + map_ref, + signal::{Mutable, Signal, SignalExt}, + signal_vec::{MutableVec, SignalVec, SignalVecExt}, +}; +use web_sys::HtmlInputElement; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = ["window", "__TAURI__", "{% if alpha %}core{% else %}tauri{% endif %}"])] + async fn invoke(cmd: &str, name: JsValue) -> JsValue; + + #[wasm_bindgen(js_namespace = ["window", "__TAURI__", "{% if alpha %}core{% else %}tauri{% endif %}"], js_name = invoke)] + async fn invoke2(cmd: &str); +} + +#[derive(Clone, Serialize, Deserialize)] +struct Args { + name: String, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct App { + greet: Mutable>, + input: Mutable +} + +impl App { + pub fn new() -> Arc { + Arc::new(Self { + greet: Mutable::new(None), + input: Mutable::new(String::new()) + }) + } + + pub fn render(app: Arc) -> Dom { + let state = app.clone(); + // let new_msg = + // invoke("greet", to_value(&GreetArgs { name: &name.get() }).unwrap()).await; + html!("div", { + .child(html!("div", { + .class(["body"]) + .child(html!("div", { + .text("Welcome to the Tauri + Dominator starter template.") + })) + })) + .child(html!("div", { + .children(&mut [ + html!("input" => HtmlInputElement, { + .prop_signal("value", state.input.signal_cloned()) + + .with_node!(element => { + .event(clone!(app => move |_: events::Input| { + log::info!("input: {}", element.value()); + app.input.set(element.value()); + })) + }) + }), + + html!("button", { + .text("Greet") + .event(clone!(app => move |_: events::Click| { + let app = app.clone(); + let input = app.input.lock_ref(); + + if *input == "" { + app.clone().greet.set(None); + + } else { + + let input = input.to_string(); + let args = Args {name: input.clone()}; + let app = app.clone(); + spawn_local(async move { + let name = invoke("greet", to_value(&args).unwrap()).await; + app.greet.set(name.as_string()); + }); + } + })) + }), + + html!("div", { + .text_signal(app.greet.signal_ref(|greet| format!("{}", greet.clone().unwrap_or_default()))) + }), + + html!("button", { + .text("Greet2") + .event(clone!(app => move |_: events::Click| { + let app = app.clone(); + let input = app.input.lock_ref(); + + if *input == "" { + app.clone().greet.set(None); + + } else { + + let input = input.to_string(); + let args = Args {name: input.clone()}; + let app = app.clone(); + spawn_local(async move { + invoke2("greet2").await; + // app.greet.set(name.as_string()); + }); + } + })) + }), + + html!("div", { + .text_signal(app.greet.signal_ref(|greet| format!("{}", greet.clone().unwrap_or_default()))) + }), + + ]) + })) + }) + } +} \ No newline at end of file diff --git a/templates/template-dominator/src/lib.rs b/templates/template-dominator/src/lib.rs new file mode 100644 index 0000000000..16563bc01b --- /dev/null +++ b/templates/template-dominator/src/lib.rs @@ -0,0 +1,43 @@ +#![allow(dead_code)] +#![allow(warnings)] + +pub mod app; +use wasm_bindgen::JsValue; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::{app::App}; + +#[wasm_bindgen(start)] +pub async fn run() -> Result<(), JsValue> { + init_logger(); + std::panic::set_hook(Box::new(on_panic)); + let app = App::new(); + + dominator::append_dom(&dominator::body(), App::render(app)); + + Ok(()) +} + +cfg_if::cfg_if! { + if #[cfg(all(feature = "wasm-logger", feature = "console_error_panic_hook"))] { + fn init_logger() { + wasm_logger::init(wasm_logger::Config::default()); + log::info!("rust logging enabled!!!"); + } + } else { + fn init_logger() { + log::info!("rust logging disabled!"); //<-- won't be seen + } + } +} + +fn on_panic(info: &std::panic::PanicInfo) { + log::error!("panic: {:?}", info); + web_sys::window() + .unwrap() + .alert_with_message("got a panic!") + .unwrap(); + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::hook(info); +} \ No newline at end of file diff --git a/templates/template-dominator/styles.css b/templates/template-dominator/styles.css new file mode 100644 index 0000000000..e69de29bb2