diff --git a/Cargo.lock b/Cargo.lock index 6a22928a..63e2c7dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1929,9 +1929,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.46" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" +checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" dependencies = [ "wasm-bindgen", ] @@ -3013,6 +3013,8 @@ dependencies = [ "serde_json", "stdweb", "stdweb-internal-runtime", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -5181,9 +5183,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" +checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" dependencies = [ "cfg-if 1.0.0", "serde 1.0.118", @@ -5193,9 +5195,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" +checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" dependencies = [ "bumpalo", "lazy_static", @@ -5220,9 +5222,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" +checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" dependencies = [ "quote 1.0.8", "wasm-bindgen-macro-support", @@ -5230,9 +5232,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" +checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" dependencies = [ "proc-macro2 1.0.24", "quote 1.0.8", @@ -5243,15 +5245,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" +checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" [[package]] name = "web-sys" -version = "0.3.46" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" +checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/plume-front/Cargo.toml b/plume-front/Cargo.toml index 2ebe9258..23c0f0ff 100644 --- a/plume-front/Cargo.toml +++ b/plume-front/Cargo.toml @@ -17,3 +17,15 @@ lazy_static = "1.3" serde = "1.0" serde_json = "1.0" wasm-bindgen = "0.2.70" + +[dependencies.web-sys] +version = "0.3.47" +features = [ + 'Document', + 'DomTokenList', + 'Element', + 'EventTarget', + 'Navigator', + 'TouchEvent', + 'Window' +] diff --git a/plume-front/src/lib.rs b/plume-front/src/lib.rs new file mode 100755 index 00000000..110c04ff --- /dev/null +++ b/plume-front/src/lib.rs @@ -0,0 +1,121 @@ +#![recursion_limit = "128"] +#![feature(decl_macro, proc_macro_hygiene, try_trait)] + +#[macro_use] +extern crate gettext_macros; +#[macro_use] +extern crate lazy_static; + +use wasm_bindgen::{prelude::*, JsCast}; +use web_sys::window; + +init_i18n!( + "plume-front", + af, + ar, + bg, + ca, + cs, + cy, + da, + de, + el, + en, + eo, + es, + fa, + fi, + fr, + gl, + he, + hi, + hr, + hu, + it, + ja, + ko, + nb, + nl, + no, + pl, + pt, + ro, + ru, + sat, + si, + sk, + sl, + sr, + sv, + tr, + uk, + vi, + zh +); + +compile_i18n!(); + +lazy_static! { + static ref CATALOG: gettext::Catalog = { + let catalogs = include_i18n!(); + let lang = window().unwrap().navigator().language().unwrap(); + let lang = lang.splitn(2, '-').next().unwrap_or("en"); + + let english_position = catalogs + .iter() + .position(|(language_code, _)| *language_code == "en") + .unwrap(); + catalogs + .iter() + .find(|(l, _)| l == &lang) + .unwrap_or(&catalogs[english_position]) + .clone() + .1 + }; +} + +#[wasm_bindgen(start)] +pub fn main() -> Result<(), JsValue> { + menu(); + Ok(()) +} + +/// Toggle menu on mobile devices +/// +/// It should normally be working fine even without this code +/// But :focus-within is not yet supported by Webkit/Blink +fn menu() { + let document = window().unwrap().document().unwrap(); + if let Some(button) = document.get_element_by_id("menu") { + if let Some(menu) = document.get_element_by_id("content") { + let show_menu = Closure::wrap(Box::new(|_: web_sys::TouchEvent| { + window() + .unwrap() + .document() + .unwrap() + .get_element_by_id("menu") + .map(|menu| menu.class_list().add_1("show")) + .unwrap() + .unwrap(); + }) as Box); + button + .add_event_listener_with_callback("touchend", show_menu.as_ref().unchecked_ref()) + .unwrap(); + show_menu.forget(); + + let close_menu = Closure::wrap(Box::new(|_: web_sys::TouchEvent| { + window() + .unwrap() + .document() + .unwrap() + .get_element_by_id("menu") + .map(|menu| menu.class_list().remove_1("show")) + .unwrap() + .unwrap() + }) as Box); + menu.add_event_listener_with_callback("touchend", close_menu.as_ref().unchecked_ref()) + .unwrap(); + close_menu.forget(); + } + } +}