From fbb979b64ec645921c3ef30421910ce225096d8c Mon Sep 17 00:00:00 2001 From: dave horner Date: Sun, 16 Nov 2025 10:23:49 -0500 Subject: [PATCH 1/2] build(dev): migrate to Webpack 5, async WASM, remove stdweb, update Svelte loader config, and fix example integration --- README.md | 48 ++++++++++++++++--- examples/hello_svelte/src/lib.rs | 5 +- examples/reposition/Cargo.toml | 4 +- examples/reposition/src/lib.rs | 80 ++++++++++++++++++-------------- examples/styled/Cargo.toml | 3 +- examples/styled/src/lib.rs | 18 ++++--- examples/toggle/Cargo.toml | 2 +- examples/toggle/src/lib.rs | 7 ++- examples/www/index.js | 11 +++-- examples/www/package.json | 34 +++++++++----- examples/www/webpack.common.js | 10 +++- src/pane.rs | 4 +- 12 files changed, 148 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 139e85b..a21f8bf 100644 --- a/README.md +++ b/README.md @@ -27,14 +27,50 @@ The examples in this crate are hosted online: [div-rs Examples](https://div.padd Have a look at the code in example directory. The best way is to clone the repository and run it locally, so you can play around with the code. -You need npm, webpack, and wasm-pack for the examples to run on your machine. -``` -git clone https://github.com/jakmeier/div-rs.git -cd div-rs/examples/www; -npm run build; -npm run start; + +## Requirements (2025+) + +You need Node.js (16+ recommended), npm, and [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/) for the examples to run on your machine. + +**This project now uses Webpack 5 for modern WebAssembly support.** + +### Setup and Usage + +1. Clone the repository: + ```sh + git clone https://github.com/jakmeier/div-rs.git + cd div-rs/examples/www + ``` +2. Install dependencies (this will install Webpack 5 and all required loaders/plugins): + ```sh + npm install + ``` +3. Build all Rust WASM examples and bundle with Webpack: + ```sh + npm run build + ``` +4. Start the development server: + ```sh + npm start + ``` +5. Open your browser to the address shown in the terminal (usually http://localhost:8080). + +### Cleaning builds + +To clean all Rust and JS build artifacts: +```sh +npm run clean ``` +### Notable Changes (2025) + +- **Webpack 5 migration:** The project now uses Webpack 5 for native async WebAssembly support. All config and dependencies have been updated. +- **No more stdweb:** All examples now use `web-sys`, `wasm-bindgen`, and (where needed) `gloo-timers` for browser interop. `stdweb` is no longer supported. +- **Svelte loader:** The Webpack config now includes `resolve.conditionNames` for Svelte 3+ compatibility. +- **CopyWebpackPlugin:** Updated to use the new `patterns` API. + +If you see WASM loader or Svelte warnings, make sure you have the latest dependencies and configs as above. + ## Origin and Motivation My motivation to create Div was to leverage HTML + CSS when using Rust to create games for a browser. Prior to this, the only way I knew how to do a GUI easily (in Rust running on the browser) was to render everything through general-purpose GUI crates with a WebGL backend. This seemed a bit wasteful to me, as the browser already has excellent built-in support for GUIs. diff --git a/examples/hello_svelte/src/lib.rs b/examples/hello_svelte/src/lib.rs index 159158a..fc19f9e 100644 --- a/examples/hello_svelte/src/lib.rs +++ b/examples/hello_svelte/src/lib.rs @@ -14,7 +14,7 @@ pub fn main() { const H: u32 = 500; let class = div::JsClass::preregistered("MyComponent") .expect("JS class Test has not been registered properly"); - div::from_js_class(X, Y, W, H, class).unwrap(); + div::from_js_class(X as i32, Y as i32, W, H, class).unwrap(); /* Alternative that loads classes from a separate JS file instead of registering in the JS code. */ // let future = async { @@ -31,6 +31,5 @@ pub fn set_panic_hook() { // // For more details see // https://github.com/rustwasm/console_error_panic_hook#readme - #[cfg(feature = "console_error_panic_hook")] - console_error_panic_hook::set_once(); + // console_error_panic_hook::set_once(); } diff --git a/examples/reposition/Cargo.toml b/examples/reposition/Cargo.toml index 02f7022..f1ab076 100644 --- a/examples/reposition/Cargo.toml +++ b/examples/reposition/Cargo.toml @@ -8,10 +8,10 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] + [dependencies] div = { path = "../../" } wasm-bindgen = "0.2" -stdweb = "0.4" [dependencies.web-sys] version = "0.3" @@ -22,4 +22,6 @@ features = [ "Window", "HtmlScriptElement", "HtmlHeadElement", + "Event", + "KeyboardEvent", ] diff --git a/examples/reposition/src/lib.rs b/examples/reposition/src/lib.rs index 53b7d06..44fa6a5 100644 --- a/examples/reposition/src/lib.rs +++ b/examples/reposition/src/lib.rs @@ -1,6 +1,5 @@ -use stdweb::js; -use stdweb::traits::*; -use stdweb::web::event::KeyDownEvent; +use wasm_bindgen::JsCast; +use web_sys::window; use wasm_bindgen::prelude::*; /** @@ -56,42 +55,51 @@ pub fn main() { let mut f = 1.0; let mut af = 1.0; - // We are using webstd here to make things easy. - // Listen to arrow key to move and reposition all div - stdweb::web::document().add_event_listener(move |e: KeyDownEvent| { - match e.key().as_str() { - "ArrowUp" => y = y.saturating_sub(10), - "ArrowDown" => y += 10, - "ArrowLeft" => x = x.saturating_sub(10), - "ArrowRight" => x += 10, - "+" => f *= 1.5, - "-" => f /= 1.5, + // Listen to keydown events to move and reposition all divs + let closure = Closure::wrap(Box::new(move |event: web_sys::Event| { + let keyboard_event = event.dyn_ref::(); + if let Some(e) = keyboard_event { + let key = e.key(); + match key.as_str() { + "ArrowUp" => y = y.saturating_sub(10), + "ArrowDown" => y += 10, + "ArrowLeft" => x = x.saturating_sub(10), + "ArrowRight" => x += 10, + "+" => f *= 1.5, + "-" => f /= 1.5, - "w" => ay = ay.saturating_sub(10), - "a" => ax = ax.saturating_sub(10), - "s" => ay += 10, - "d" => ax += 10, - "1" => af *= 1.5, - "2" => af /= 1.5, + "w" => ay = ay.saturating_sub(10), + "a" => ax = ax.saturating_sub(10), + "s" => ay += 10, + "d" => ax += 10, + "1" => af *= 1.5, + "2" => af /= 1.5, - key => { - js! { @(no_return) console.log("pressed " + @{key}); }; - return; + _ => { + web_sys::console::log_1(&format!("pressed {}", key).into()); + return; + } } + div::reposition(x, y).unwrap(); + let w = f * w as f32; + let h = f * h as f32; + div::resize(w as u32, h as u32).unwrap(); + + let aw = af * aw as f32; + let ah = af * ah as f32; + pane_a + .reposition_and_resize(ax, ay, aw as u32, ah as u32) + .unwrap(); + // Same as + // pane_a.reposition(ax,ay).unwrap(); + // pane_a.resize(aw as u32, ah as u32).unwrap(); + // but avoids extra redraw of div } - div::reposition(x, y).unwrap(); - let w = f * w as f32; - let h = f * h as f32; - div::resize(w as u32, h as u32).unwrap(); + }) as Box); - let aw = af * aw as f32; - let ah = af * ah as f32; - pane_a - .reposition_and_resize(ax, ay, aw as u32, ah as u32) - .unwrap(); - // Same as - // pane_a.reposition(ax,ay).unwrap(); - // pane_a.resize(aw as u32, ah as u32).unwrap(); - // but avoids extra redraw of div - }); + window() + .unwrap() + .add_event_listener_with_callback("keydown", closure.as_ref().unchecked_ref()) + .unwrap(); + closure.forget(); } diff --git a/examples/styled/Cargo.toml b/examples/styled/Cargo.toml index c04394a..26f1d0a 100644 --- a/examples/styled/Cargo.toml +++ b/examples/styled/Cargo.toml @@ -8,10 +8,10 @@ edition = "2018" [lib] crate-type = ["cdylib", "rlib"] + [dependencies] div = { path = "../../" } wasm-bindgen = "0.2" -stdweb = "0.4" [dependencies.web-sys] version = "0.3" @@ -22,4 +22,5 @@ features = [ "Window", "HtmlScriptElement", "HtmlHeadElement", + "HtmlStyleElement", ] diff --git a/examples/styled/src/lib.rs b/examples/styled/src/lib.rs index d8de6bf..494bb75 100644 --- a/examples/styled/src/lib.rs +++ b/examples/styled/src/lib.rs @@ -4,7 +4,8 @@ * Usually we would have your styles served from a .css or inside a svelte component. * But if you want to, you can also apply CSS to a pane from within Rust. */ -use stdweb::web::*; +use wasm_bindgen::JsCast; +use web_sys::{window, HtmlStyleElement}; use wasm_bindgen::prelude::*; #[wasm_bindgen(start)] @@ -47,9 +48,14 @@ pub fn main() { // Small helper function, only for the example. Uses stdweb, DIV-RS does not really help you with this part of CSS. // It is not recommended to add classes like this but it is useful here to keep everything in a single file. fn add_document_styles(css: &str) { - let head = document().head().unwrap(); - let style = document().create_element("style").unwrap(); - style.set_attribute("type", "text/css").unwrap(); - style.append_html(css).unwrap(); - head.append_child(&style); + let document = window().unwrap().document().unwrap(); + let head = document.head().unwrap(); + let style = document + .create_element("style") + .unwrap() + .dyn_into::() + .unwrap(); + style.set_type("text/css"); + style.set_inner_html(css); + head.append_child(&style).unwrap(); } diff --git a/examples/toggle/Cargo.toml b/examples/toggle/Cargo.toml index 9ab6a32..53813f9 100644 --- a/examples/toggle/Cargo.toml +++ b/examples/toggle/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] div = { path = "../../" } wasm-bindgen = "0.2" -stdweb = "0.4" +gloo-timers = "0.2" [dependencies.web-sys] version = "0.3" diff --git a/examples/toggle/src/lib.rs b/examples/toggle/src/lib.rs index 0860399..158fff5 100644 --- a/examples/toggle/src/lib.rs +++ b/examples/toggle/src/lib.rs @@ -1,5 +1,5 @@ use div::DivHandle; -use stdweb::web::set_timeout; +use gloo_timers::callback::Timeout; use wasm_bindgen::prelude::*; @@ -33,8 +33,7 @@ pub fn main() { fn toggle(a: DivHandle, b: DivHandle) { a.show().expect("Error"); b.hide().expect("Error"); - let closure = move || { + Timeout::new(1000, move || { toggle(b, a); - }; - set_timeout(closure, 1000); + }).forget(); } diff --git a/examples/www/index.js b/examples/www/index.js index 5725172..d9f0f34 100644 --- a/examples/www/index.js +++ b/examples/www/index.js @@ -7,13 +7,13 @@ import "./styles.css"; -import * as hello_world from "../hello_world/pkg/hello_world_bg.wasm"; -import * as reposition from "../reposition/pkg/reposition_bg.wasm"; -import * as styled from "../styled/pkg/styled_bg.wasm"; -import * as toggle from "../toggle/pkg/toggle_bg.wasm"; +import * as hello_world from "../hello_world/pkg/hello_world.js"; +import * as reposition from "../reposition/pkg/reposition.js"; +import * as styled from "../styled/pkg/styled.js"; +import * as toggle from "../toggle/pkg/toggle.js"; -import * as hello_svelte from "../hello_svelte/pkg/hello_svelte_bg.wasm"; +import * as hello_svelte from "../hello_svelte/pkg/hello_svelte.js"; import { register_svelte_component, init_div_rs } from "../../div-rs.js"; import MyComponent from "../hello_svelte/src/MyComponent.svelte"; @@ -75,6 +75,7 @@ examples.push(example( loadExampleSelection(examples); + let params = new URLSearchParams(location.search); let displayedExample = params.get('example'); diff --git a/examples/www/package.json b/examples/www/package.json index d3ad7f3..0769323 100644 --- a/examples/www/package.json +++ b/examples/www/package.json @@ -7,9 +7,20 @@ "create-wasm-app": ".bin/create-wasm-app.js" }, "scripts": { - "build": "wasm-pack build ../hello_svelte; wasm-pack build ../hello_world; wasm-pack build ../reposition/; wasm-pack build ../styled/; wasm-pack build ../toggle; webpack --config webpack.config.js", + "clean:wasm": "cargo clean --manifest-path ../hello_svelte/Cargo.toml && cargo clean --manifest-path ../hello_world/Cargo.toml && cargo clean --manifest-path ../reposition/Cargo.toml && cargo clean --manifest-path ../styled/Cargo.toml && cargo clean --manifest-path ../toggle/Cargo.toml", + "clean:js": "rimraf dist pkg", + "clean": "npm-run-all clean:wasm clean:js", + "build:wasm": "run-s build:hello_svelte build:hello_world build:reposition build:styled build:toggle", + "build:hello_svelte": "wasm-pack build ../hello_svelte", + "build:hello_world": "wasm-pack build ../hello_world", + "build:reposition": "wasm-pack build ../reposition", + "build:styled": "wasm-pack build ../styled", + "build:toggle": "wasm-pack build ../toggle", + "build": "npm-run-all build:wasm build:webpack", + "build:webpack": "webpack --config webpack.config.js", "start": "webpack-dev-server", - "release": "wasm-pack build ../hello_svelte; wasm-pack build ../hello_world; wasm-pack build ../reposition/; wasm-pack build ../styled/; wasm-pack build ../toggle; webpack --config webpack.prod.js" + "release": "npm-run-all build:wasm release:webpack", + "release:webpack": "webpack --config webpack.prod.js" }, "repository": { "type": "git", @@ -35,14 +46,15 @@ "toggle": "file:../toggle/pkg/" }, "devDependencies": { - "copy-webpack-plugin": "^5.0.0", - "css-loader": "^4.3.0", - "style-loader": "^1.2.1", - "svelte": "^3.29.0", - "svelte-loader": "^2.13.6", - "webpack": "^4.29.3", - "webpack-cli": "^3.1.0", - "webpack-dev-server": "^3.1.5", - "webpack-merge": "^5.2.0" + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "npm-run-all": "^4.1.5", + "style-loader": "^3.3.4", + "svelte": "^3.59.2", + "svelte-loader": "^3.1.6", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.10.0" } } diff --git a/examples/www/webpack.common.js b/examples/www/webpack.common.js index 34377d2..1ae517e 100644 --- a/examples/www/webpack.common.js +++ b/examples/www/webpack.common.js @@ -10,7 +10,8 @@ module.exports = { resolve: { extensions: ['.mjs', '.js', '.svelte'], mainFields: ['svelte', 'browser', 'module', 'main'], - modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'] + modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'], + conditionNames: ['svelte', 'import', 'require', 'node'] }, module: { rules: [{ @@ -26,6 +27,11 @@ module.exports = { }] }, plugins: [ - new CopyWebpackPlugin(['index.html']) + new CopyWebpackPlugin({ + patterns: ['index.html'] + }) ], + experiments: { + asyncWebAssembly: true, + }, }; \ No newline at end of file diff --git a/src/pane.rs b/src/pane.rs index d73d949..bce8ccd 100644 --- a/src/pane.rs +++ b/src/pane.rs @@ -73,7 +73,7 @@ impl GlobalState { Ok(()) } pub(crate) fn show_pane(&mut self, p: &DivHandle) -> Result<(), DivError> { - let mut v = self.nodes.get_mut(&p)?; + let v = self.nodes.get_mut(&p)?; if !v.displayed { self.root.append_child(&v.node)?; v.displayed = true; @@ -100,7 +100,7 @@ impl GlobalState { w: Option, h: Option, ) -> Result<(), DivError> { - let mut v = self.nodes.get_mut(&pane_handle)?; + let v = self.nodes.get_mut(&pane_handle)?; v.x = x.unwrap_or(v.x); v.y = y.unwrap_or(v.y); v.w = w.unwrap_or(v.w); From 1ac83aec2b3aa843ccabcfc66c2ed0a41944a975 Mon Sep 17 00:00:00 2001 From: dave horner Date: Sun, 16 Nov 2025 13:28:30 -0500 Subject: [PATCH 2/2] refactor(examples): update example crates and core logic - Updated example crates (hello_svelte, reposition, styled, toggle) for improved state management and reset logic. - Modified `src/pane.rs` and example source files for better robustness and compatibility. - Updated Webpack and package configuration in `examples/www` for build improvements. - Improved documentation in `README.md`. --- CHANGES.md | 4 + Cargo.toml | 3 +- README.md | 6 +- div-rs-captured-frames.gif | Bin 0 -> 109459 bytes examples/hello_svelte/Cargo.toml | 5 +- examples/hello_svelte/src/lib.rs | 26 +- examples/hello_world/src/lib.rs | 10 +- examples/reposition/Cargo.toml | 3 +- examples/reposition/src/lib.rs | 102 ++++-- examples/styled/Cargo.toml | 2 +- examples/styled/src/lib.rs | 5 + examples/toggle/Cargo.toml | 2 +- examples/toggle/src/lib.rs | 52 +-- examples/www/highlight.js | 8 + examples/www/index.js | 527 +++++++++++++++++++++++++++---- examples/www/package.json | 11 +- examples/www/styles.css | 5 + examples/www/webpack.common.js | 5 +- src/lib.rs | 10 + src/state.rs | 12 +- 20 files changed, 670 insertions(+), 128 deletions(-) create mode 100644 div-rs-captured-frames.gif create mode 100644 examples/www/highlight.js diff --git a/CHANGES.md b/CHANGES.md index 738dce5..8e80991 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,8 @@ + ## Unreleased +- Migrated to Webpack 5 for async WASM and modern JS tooling. +- Dropped stdweb; all browser interop now uses web-sys, wasm-bindgen, and gloo-timers. +- Updated Svelte/Webpack config for compatibility and modern plugin usage. ## v0.4 - (breaking) Changed type of positions from `u32` to `i32` (for pane and global frame). Negative offsets are valid and sometimes necessary. diff --git a/Cargo.toml b/Cargo.toml index 4553a11..87f63af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,4 +32,5 @@ features = [ [dev-dependencies] wasm-bindgen-test = "0.3" -wasm-bindgen-futures = "0.4" \ No newline at end of file +wasm-bindgen-futures = "0.4" + diff --git a/README.md b/README.md index a21f8bf..be8160d 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,11 @@ The features can be summarized as: The examples in this crate are hosted online: [div-rs Examples](https://div.paddlers.ch/) -Have a look at the code in example directory. The best way is to clone the repository and run it locally, so you can play around with the code. +Below is an example of the output you can generate with the built-in GIF capture tool: + +![Animated Example Output](./div-rs-captured-frames.gif) + +Have a look at the code in the example directory. The best way is to clone the repository and run it locally, so you can play around with the code and generate your own GIFs. ## Requirements (2025+) diff --git a/div-rs-captured-frames.gif b/div-rs-captured-frames.gif new file mode 100644 index 0000000000000000000000000000000000000000..16b7a075bf43c8f2eaaa4b54096d809c898d4a58 GIT binary patch literal 109459 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 ZeZL9(Ch(iUZvwvw{3h_5!2dsi{{wySuZaKv literal 0 HcmV?d00001 diff --git a/examples/hello_svelte/Cargo.toml b/examples/hello_svelte/Cargo.toml index b3db1c2..3a88d69 100644 --- a/examples/hello_svelte/Cargo.toml +++ b/examples/hello_svelte/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "hello_svelte" version = "0.1.0" -authors = ["Jakob Meier "] +authors = ["Jakob Meier ", "David Horner"] edition = "2018" [lib] @@ -10,6 +10,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] div = { path = "../../" } +gloo-timers = "0.3.0" wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" @@ -22,4 +23,4 @@ features = [ "Window", "HtmlScriptElement", "HtmlHeadElement", -] \ No newline at end of file +] diff --git a/examples/hello_svelte/src/lib.rs b/examples/hello_svelte/src/lib.rs index fc19f9e..8761317 100644 --- a/examples/hello_svelte/src/lib.rs +++ b/examples/hello_svelte/src/lib.rs @@ -1,20 +1,24 @@ use wasm_bindgen::prelude::*; -#[wasm_bindgen(start)] +#[wasm_bindgen] pub fn main() { - div::init_to("div-root").unwrap(); set_panic_hook(); - // Create a new pane at offset (100,100) from body - // with size 500px/500px and then create a single - // text node inside it with an external class stored in TODO + // Defensive: check for double initialization + match div::init_to("div-root") { + Ok(_) => {}, + Err(e) => { + panic!("[hello_svelte] div::init_to('div-root') failed: {e:?}.\nThis usually means main() was called without a prior reset, or reset did not complete before main()."); + } + } + const X: u32 = 0; const Y: u32 = 0; const W: u32 = 500; const H: u32 = 500; let class = div::JsClass::preregistered("MyComponent") - .expect("JS class Test has not been registered properly"); - div::from_js_class(X as i32, Y as i32, W, H, class).unwrap(); + .unwrap_or_else(|| panic!("[hello_svelte] Svelte component 'MyComponent' is not registered.\n\nMake sure register_svelte_component('MyComponent', ...) is called in JS before calling main().")); + div::from_js_class(X as i32, Y as i32, W, H, class).expect("[hello_svelte] div::from_js_class failed"); /* Alternative that loads classes from a separate JS file instead of registering in the JS code. */ // let future = async { @@ -24,6 +28,11 @@ pub fn main() { // wasm_bindgen_futures::spawn_local(future); } +#[wasm_bindgen] +pub fn reset() { + div::reset_global_div_state(); +} + pub fn set_panic_hook() { // When the `console_error_panic_hook` feature is enabled, we can call the // `set_panic_hook` function at least once during initialization, and then @@ -31,5 +40,6 @@ pub fn set_panic_hook() { // // For more details see // https://github.com/rustwasm/console_error_panic_hook#readme - // console_error_panic_hook::set_once(); + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); } diff --git a/examples/hello_world/src/lib.rs b/examples/hello_world/src/lib.rs index a7be236..07f2e11 100644 --- a/examples/hello_world/src/lib.rs +++ b/examples/hello_world/src/lib.rs @@ -1,9 +1,8 @@ -#![allow(unused_must_use)] use wasm_bindgen::prelude::*; #[wasm_bindgen(start)] pub fn main() { - div::init_to("div-root"); + div::init_to("div-root").expect("Init failed"); // Create a new pane at offset (100,100) from body // with size 500px/500px and then create a single @@ -13,5 +12,10 @@ pub fn main() { let w = 500; let h = 500; let html = "Hello world"; - div::new(x, y, w, h, html); + div::new(x, y, w, h, html).unwrap(); } + +#[wasm_bindgen] +pub fn reset() { + div::reset_global_div_state(); +} \ No newline at end of file diff --git a/examples/reposition/Cargo.toml b/examples/reposition/Cargo.toml index f1ab076..bc3ed68 100644 --- a/examples/reposition/Cargo.toml +++ b/examples/reposition/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "reposition" version = "0.1.0" -authors = ["Jakob Meier "] +authors = ["Jakob Meier ", "David Horner"] edition = "2018" [lib] @@ -10,6 +10,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] +console_error_panic_hook = "0.1.7" div = { path = "../../" } wasm-bindgen = "0.2" diff --git a/examples/reposition/src/lib.rs b/examples/reposition/src/lib.rs index 44fa6a5..1eda2a6 100644 --- a/examples/reposition/src/lib.rs +++ b/examples/reposition/src/lib.rs @@ -1,6 +1,7 @@ use wasm_bindgen::JsCast; use web_sys::window; use wasm_bindgen::prelude::*; +use console_error_panic_hook; /** * This example show how @@ -19,8 +20,47 @@ use wasm_bindgen::prelude::*; * repositioned and/or resized, it can also change the arrangement of the internal HTML elements. */ +static mut KEYDOWN_CLOSURE: Option> = None; + +#[wasm_bindgen] +pub fn reset() { + // Remove the keydown event listener if present + let win = match window() { + Some(w) => w, + None => return, + }; + unsafe { + if let Some(old_closure) = KEYDOWN_CLOSURE.take() { + let _ = win.remove_event_listener_with_callback("keydown", old_closure.as_ref().unchecked_ref()); + // drop(old_closure); // dropped automatically + } + } + // Also reset the Rust global state so example can be re-initialized + div::reset_global_div_state(); + + // Explicitly clear all children of div-root (DOM cleanup) + if let Some(doc) = web_sys::window().and_then(|w| w.document()) { + if let Some(div_root) = doc.get_element_by_id("div-root") { + while let Some(child) = div_root.first_child() { + let _ = div_root.remove_child(&child); + } + } + } +} + #[wasm_bindgen(start)] pub fn main() { + // Enable better panic messages + console_error_panic_hook::set_once(); + + // Remove previous keydown listener if present + let win = window().unwrap(); + unsafe { + if let Some(old_closure) = KEYDOWN_CLOSURE.take() { + let _ = win.remove_event_listener_with_callback("keydown", old_closure.as_ref().unchecked_ref()); + // drop(old_closure); // dropped automatically + } + } // Start at position (0,0) with size (350,200) let mut x = 0; @@ -52,43 +92,50 @@ pub fn main() { let _pane_b = div::new(200, 50, 100, 100, html2).unwrap(); // Define control variables for zoom of global area and pane A - let mut f = 1.0; - let mut af = 1.0; + let mut f: f32 = 1.0; + let mut af: f32 = 1.0; - // Listen to keydown events to move and reposition all divs + // Listen to keydown events to move and reposition all divs (with bounds checks) let closure = Closure::wrap(Box::new(move |event: web_sys::Event| { let keyboard_event = event.dyn_ref::(); if let Some(e) = keyboard_event { let key = e.key(); match key.as_str() { - "ArrowUp" => y = y.saturating_sub(10), - "ArrowDown" => y += 10, - "ArrowLeft" => x = x.saturating_sub(10), - "ArrowRight" => x += 10, - "+" => f *= 1.5, - "-" => f /= 1.5, + "ArrowUp" => { y = y.saturating_sub(10); }, + "ArrowDown" => { y += 10; }, + "ArrowLeft" => { x = x.saturating_sub(10); }, + "ArrowRight" => { x += 10; }, + "+" => { f *= 1.5; }, + "-" => { f /= 1.5; }, - "w" => ay = ay.saturating_sub(10), - "a" => ax = ax.saturating_sub(10), - "s" => ay += 10, - "d" => ax += 10, - "1" => af *= 1.5, - "2" => af /= 1.5, + "w" => { ay = ay.saturating_sub(10); }, + "a" => { ax = ax.saturating_sub(10); }, + "s" => { ay += 10; }, + "d" => { ax += 10; }, + "1" => { af *= 1.5; }, + "2" => { af /= 1.5; }, _ => { web_sys::console::log_1(&format!("pressed {}", key).into()); return; } } - div::reposition(x, y).unwrap(); - let w = f * w as f32; - let h = f * h as f32; - div::resize(w as u32, h as u32).unwrap(); + // Bounds checks to prevent panics + let safe_x = x.max(0); + let safe_y = y.max(0); + let safe_f = f.max(0.1); // Prevent zero/negative scale + let safe_af = af.max(0.1); + let safe_ax = ax.max(0); + let safe_ay = ay.max(0); + let safe_aw = (safe_af * aw as f32).max(1.0); + let safe_ah = (safe_af * ah as f32).max(1.0); + let safe_w = (safe_f * w as f32).max(1.0); + let safe_h = (safe_f * h as f32).max(1.0); - let aw = af * aw as f32; - let ah = af * ah as f32; + div::reposition(safe_x, safe_y).unwrap(); + div::resize(safe_w as u32, safe_h as u32).unwrap(); pane_a - .reposition_and_resize(ax, ay, aw as u32, ah as u32) + .reposition_and_resize(safe_ax, safe_ay, safe_aw as u32, safe_ah as u32) .unwrap(); // Same as // pane_a.reposition(ax,ay).unwrap(); @@ -97,9 +144,8 @@ pub fn main() { } }) as Box); - window() - .unwrap() - .add_event_listener_with_callback("keydown", closure.as_ref().unchecked_ref()) - .unwrap(); - closure.forget(); -} + win.add_event_listener_with_callback("keydown", closure.as_ref().unchecked_ref()).unwrap(); + unsafe { + KEYDOWN_CLOSURE = Some(closure); + } +} \ No newline at end of file diff --git a/examples/styled/Cargo.toml b/examples/styled/Cargo.toml index 26f1d0a..d8630e8 100644 --- a/examples/styled/Cargo.toml +++ b/examples/styled/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "styled" version = "0.1.0" -authors = ["Jakob Meier "] +authors = ["Jakob Meier ", "David Horner"] edition = "2018" [lib] diff --git a/examples/styled/src/lib.rs b/examples/styled/src/lib.rs index 494bb75..55c63f4 100644 --- a/examples/styled/src/lib.rs +++ b/examples/styled/src/lib.rs @@ -45,6 +45,11 @@ pub fn main() { let _pane1 = div::new_styled(125, 300, 200, 100, html1, &classes, &css).unwrap(); } +#[wasm_bindgen] +pub fn reset() { + div::reset_global_div_state(); +} + // Small helper function, only for the example. Uses stdweb, DIV-RS does not really help you with this part of CSS. // It is not recommended to add classes like this but it is useful here to keep everything in a single file. fn add_document_styles(css: &str) { diff --git a/examples/toggle/Cargo.toml b/examples/toggle/Cargo.toml index 53813f9..044dc9f 100644 --- a/examples/toggle/Cargo.toml +++ b/examples/toggle/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "toggle" version = "0.1.0" -authors = ["Jakob Meier "] +authors = ["Jakob Meier ", "David Horner"] edition = "2018" [lib] diff --git a/examples/toggle/src/lib.rs b/examples/toggle/src/lib.rs index 158fff5..c6ff145 100644 --- a/examples/toggle/src/lib.rs +++ b/examples/toggle/src/lib.rs @@ -1,39 +1,55 @@ use div::DivHandle; use gloo_timers::callback::Timeout; - use wasm_bindgen::prelude::*; +use std::sync::atomic::{AtomicUsize, Ordering}; + +static GENERATION: AtomicUsize = AtomicUsize::new(0); #[wasm_bindgen(start)] pub fn main() { div::init_to("div-root").expect("Init failed"); + // Bump generation to invalidate old toggle loops + let gen = GENERATION.fetch_add(1, Ordering::SeqCst) + 1; + // Create two new div with some HTML in it let html0 = r#" -
-
- Hi! -
+
+
+ Hi!
- "#; +
+"#; let html1 = r#" -
-
- Bye! -
+
+
+ Bye!
- "#; +
+"#; let div0 = div::new(100, 100, 100, 100, html0).unwrap(); let div1 = div::new(200, 200, 100, 100, html1).unwrap(); - toggle(div0, div1); + toggle(div0, div1, gen); } -// Function that takes to div, shows the first and hides the second -// and then calls itself again delayed, with the two div swapped -fn toggle(a: DivHandle, b: DivHandle) { - a.show().expect("Error"); - b.hide().expect("Error"); +// Function that takes two divs, shows the first and hides the second +// and then calls itself again delayed, with the two divs swapped +fn toggle(a: DivHandle, b: DivHandle, gen: usize) { + // Only run if this is the current generation + if gen != GENERATION.load(Ordering::SeqCst) { + return; + } + a.show().ok(); + b.hide().ok(); Timeout::new(1000, move || { - toggle(b, a); + toggle(b, a, gen); }).forget(); } + +#[wasm_bindgen] +pub fn reset() { + // Only bump the generation counter to invalidate old timers + GENERATION.fetch_add(1, Ordering::SeqCst); + div::reset_global_div_state(); +} \ No newline at end of file diff --git a/examples/www/highlight.js b/examples/www/highlight.js new file mode 100644 index 0000000..6d7c856 --- /dev/null +++ b/examples/www/highlight.js @@ -0,0 +1,8 @@ +import 'prismjs'; +import 'prismjs/themes/prism.css'; +import 'prismjs/components/prism-rust'; +import Prism from 'prismjs'; + +export function highlightCodeBlocks() { + Prism.highlightAll(); +} diff --git a/examples/www/index.js b/examples/www/index.js index d9f0f34..ea6daa9 100644 --- a/examples/www/index.js +++ b/examples/www/index.js @@ -1,3 +1,132 @@ + + +function addCycleCaptureButton() { + if (document.getElementById("cycle-capture-btn")) return; + const btn = document.createElement("button"); + btn.id = "cycle-capture-btn"; + btn.innerText = "Cycle & Capture All Examples"; + btn.style.position = "fixed"; + btn.style.top = "170px"; + btn.style.right = "10px"; + btn.style.zIndex = 10000; + btn.onclick = async () => { + const select = document.querySelector("select[name='example']"); + if (!select) return; + const images = []; + const cropRect = getCropRect(); + for (let i = 0; i < examples.length; i++) { + select.value = i; + select.dispatchEvent(new Event('change')); + await new Promise(r => setTimeout(r, 800)); + if (examples[i].name === "Toggle") { + // Capture two frames from toggle + for (let j = 0; j < 2; j++) { + await new Promise(r => setTimeout(r, 1000)); + const canvas = await html2canvas(document.body, { + x: cropRect.x, + y: cropRect.y, + width: cropRect.width, + height: cropRect.height, + windowWidth: document.documentElement.scrollWidth, + windowHeight: document.documentElement.scrollHeight + }); + images.push(canvas.toDataURL()); + } + } else { + const canvas = await html2canvas(document.body, { + x: cropRect.x, + y: cropRect.y, + width: cropRect.width, + height: cropRect.height, + windowWidth: document.documentElement.scrollWidth, + windowHeight: document.documentElement.scrollHeight + }); + images.push(canvas.toDataURL()); + } + } + // Show all captured images in a new window + const win = window.open(); + if (!win) { + alert("Popup blocked! Please allow popups for this site to view captured frames."); + return; + } + // Add only the normal GIF download button and all frames at the top + win.document.write(` + +

Captured Frames

+ `); + images.forEach((src, idx) => { + win.document.write(`
Frame ${idx+1}
`); + }); + // Images are already cropped, no need to pass cropRect + win.document.close(); + const script = win.document.createElement('script'); + script.src = 'https://cdn.jsdelivr.net/npm/gif.js.optimized/dist/gif.js'; + script.onload = function() { + // Normal GIF + win.document.getElementById('download-gif-btn').onclick = function() { + const imgs = Array.from(win.document.querySelectorAll('.frame-img')); + if (!imgs.length) return; + const gif = new win.GIF({ workers: 2, quality: 10, workerScript: 'gif.worker.js' }); + let loaded = 0; + imgs.forEach(img => { + const image = new win.Image(); + image.crossOrigin = 'Anonymous'; + image.onload = function() { + gif.addFrame(image, { delay: 800 }); + loaded++; + if (loaded === imgs.length) { + gif.on('finished', function(blob) { + const url = win.URL.createObjectURL(blob); + const a = win.document.createElement('a'); + a.href = url; + a.download = 'div-rs-captured-frames.gif'; + win.document.body.appendChild(a); + a.click(); + setTimeout(() => win.document.body.removeChild(a), 100); + }); + gif.render(); + } + }; + image.src = img.src; + }); + }; + // Removed cropped GIF button and logic + }; + win.document.body.appendChild(script); + }; + document.body.appendChild(btn); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", () => { + addCycleCaptureButton(); + addGifCaptureButtonWhenReady(); + }); +} else { + addCycleCaptureButton(); + addGifCaptureButtonWhenReady(); +} +// Helper to get crop rectangle (top of h1 to bottom of footer, 20% width border) +function getCropRect() { + const h1 = document.querySelector('h1'); + const footer = document.querySelector('footer'); + if (!h1 || !footer) { + return { x: 0, y: 0, width: document.body.clientWidth - 320, height: document.body.clientHeight }; + } + const rect1 = h1.getBoundingClientRect(); + const rect2 = footer.getBoundingClientRect(); + // Calculate crop area from just below h1 to bottom of footer + const scrollY = window.scrollY || window.pageYOffset; + const scrollX = window.scrollX || window.pageXOffset; + let x = rect1.left + scrollX; + let y = rect1.bottom + scrollY + 4; // 4px below h1 + let width = rect1.width; + let height = (rect2.top + rect2.height) - (rect1.bottom + 4); + // Exclude the rightmost 320px (button area) + width = Math.max(1, width - 320); + return { x, y, width, height }; +} /** * The code in here is not really all that much about DIV-RS. * It just some JS code to load the different examples defined in their own Rust crate. @@ -14,64 +143,267 @@ import * as styled from "../styled/pkg/styled.js"; import * as toggle from "../toggle/pkg/toggle.js"; import * as hello_svelte from "../hello_svelte/pkg/hello_svelte.js"; + import { register_svelte_component, init_div_rs } from "../../div-rs.js"; import MyComponent from "../hello_svelte/src/MyComponent.svelte"; -const examples = []; +// Always register Svelte component before any WASM main() call +init_div_rs(); +register_svelte_component("MyComponent", MyComponent); function example(name, help, fn) { return { name, help, fn }; } +const examples = []; +// --- GIF CAPTURE BUTTON --- +examples.push( + example( + "Hello World", + "A minimal example that renders a single pane with a text node.\n\nNo controls. Just displays 'Hello world' in a pane.\n\n---\nRust:\n```rust\ndiv::init_to(\"div-root\")?;\ndiv::new(x, y, w, h, \"Hello world\")?;\n```", + () => hello_world.main() + ) +); +examples.push( + example( + "Reposition", + "Demonstrates repositioning panes dynamically.\n\n" + + "Controls:\n" + + " Arrow keys: Move the whole black border area.\n" + + " + / - : Zoom the whole area.\n" + + " w/a/s/d: Move the red 'A' pane.\n" + + " 1 / 2: Resize the red 'A' pane.\n\n" + + "The black border shows the main pane. 'A' (red) and 'B' (blue) are sub-panes.\n" + + "Use the controls to see repositioning and resizing in action.\n\n---\nRust:\n```rust\ndiv::reposition(x, y)?;\ndiv::resize(w, h)?;\npane.reposition_and_resize(ax, ay, aw, ah)?;\n```", + () => reposition.main() + ) +); +examples.push( + example( + "Styled", + "Shows how to use custom styles with div-rs.\n\nNo controls. Demonstrates CSS classes and inline styles applied to panes.\n\n---\nRust:\n```rust\ndiv::new_styled(x, y, w, h, html, &[\"my-class\"], &[(\"color\", \"red\")])?;\n```", + () => styled.main() + ) +); +import html2canvas from "html2canvas"; +import GIF from "gif.js"; +import { highlightCodeBlocks } from "./highlight"; -// Add examples one-by-one with name and call to main -examples.push(example( - "Hello World", - "let x = 100;\n" + - "let y = 100;\n" + - "let w = 500;\n" + - "let h = 500;\n" + - "let html = \"Hello world\";\n" + - "div::new(x, y, w, h, html);", - () => { - hello_world.main(); - })); -examples.push(example( - "Reposition", - "Use arrow keys to move all divs and +,- to change scaling factor.\n\n" + - "div::reposition(x, y)\n" + - "div::resize(w, h)\n\n" + - " Use W,A,S,D to move only one div and 1,2 for scaling.\n\n" + - "div_a.reposition(x,y)\n" + - "div_a.resize(w,h)\n" + - "\n\nThis is meant to be used as hovering test over a canvas that needs to be rescaled when the window size changes.", - () => { - reposition.main(); - })); -examples.push(example( - "Styled", - "These divs are dynamically styled from within Rust, using CSS.", - () => { - styled.main(); - })); -examples.push(example( - "Toggle", - "hi.show()\nbye.hide()\n\n" + - "Two divs are periodically displayed and hidden, as controlled by Rust code.", - () => { - toggle.main(); - })); - -// Svelte example need some more initialization -examples.push(example( - "Hello Svelte", - "This component is defined within a *.svelte file and loaded dynamically through Rust.\n\n" + - "let class = JsClass::preregistered(\"Component\")?;\n" + - "div::from_js_class(X, Y, W, H, class)?;", - () => { - init_div_rs(); - register_svelte_component("MyComponent", MyComponent); - hello_svelte.main(); - })); +function addGifCaptureButtonWhenReady() { + // Cropped GIF Button + if (!document.getElementById("crop-gif-capture-btn")) { + const cropGifBtn = document.createElement("button"); + cropGifBtn.id = "crop-gif-capture-btn"; + cropGifBtn.innerText = "Capture Cropped GIF of body"; + cropGifBtn.style.position = "fixed"; + cropGifBtn.style.top = "210px"; + cropGifBtn.style.right = "10px"; + cropGifBtn.style.zIndex = 10000; + cropGifBtn.onclick = async () => { + const cropRect = getCropRect(); + const canvas1 = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + await new Promise(r => setTimeout(r, 500)); + const canvas2 = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + const gif = new GIF({ workers: 2, quality: 10, workerScript: 'gif.worker.js' }); + gif.addFrame(canvas1, { delay: 500 }); + gif.addFrame(canvas2, { delay: 500 }); + gif.on('finished', function(blob) { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'div-rs_body-cropped.gif'; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + if (!navigator.userActivation || !navigator.userActivation.hasBeenActive) { + window.open(url, '_blank'); + } + }, 100); + }); + gif.render(); + }; + document.body.appendChild(cropGifBtn); + } + function tryAddButton() { + const captureTarget = document.body; + if (!captureTarget) { + setTimeout(tryAddButton, 300); // Try again soon + return; + } + if (document.getElementById("gif-capture-btn")) return; // Already added + // GIF Button + const gifBtn = document.createElement("button"); + gifBtn.id = "gif-capture-btn"; + gifBtn.innerText = "Capture 2-frame GIF of body"; + gifBtn.style.position = "fixed"; + gifBtn.style.top = "10px"; + gifBtn.style.right = "10px"; + gifBtn.style.zIndex = 10000; + gifBtn.onclick = async () => { + const cropRect = getCropRect(); + const canvas1 = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + await new Promise(r => setTimeout(r, 500)); + const canvas2 = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + const gif = new GIF({ workers: 2, quality: 10, workerScript: 'gif.worker.js' }); + gif.addFrame(canvas1, { delay: 500 }); + gif.addFrame(canvas2, { delay: 500 }); + gif.on('finished', function(blob) { + const url = URL.createObjectURL(blob); + // Try download + const a = document.createElement('a'); + a.href = url; + a.download = 'div-rs_body.gif'; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + // Fallback: open in new tab if not downloaded + if (!navigator.userActivation || !navigator.userActivation.hasBeenActive) { + window.open(url, '_blank'); + } + }, 100); + }); + gif.render(); + }; + document.body.appendChild(gifBtn); + // PNG Button + if (!document.getElementById("png-capture-btn")) { + const pngBtn = document.createElement("button"); + pngBtn.id = "png-capture-btn"; + pngBtn.innerText = "Capture PNG of body"; + pngBtn.style.position = "fixed"; + pngBtn.style.top = "50px"; + pngBtn.style.right = "10px"; + pngBtn.style.zIndex = 10000; + pngBtn.onclick = async () => { + const cropRect = getCropRect(); + const canvas = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + canvas.toBlob(function(blob) { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'div-rs_body.png'; + document.body.appendChild(a); + a.click(); + setTimeout(() => document.body.removeChild(a), 100); + }); + }; + document.body.appendChild(pngBtn); + } + // Custom Crop Button + if (!document.getElementById("crop-capture-btn")) { + const cropBtn = document.createElement("button"); + cropBtn.id = "crop-capture-btn"; + cropBtn.innerText = "Capture Cropped PNG of body"; + cropBtn.style.position = "fixed"; + cropBtn.style.top = "130px"; + cropBtn.style.right = "10px"; + cropBtn.style.zIndex = 10000; + cropBtn.onclick = async () => { + const cropRect = getCropRect(); + const canvas = await html2canvas(document.body, { x: cropRect.x, y: cropRect.y, width: cropRect.width, height: cropRect.height, windowWidth: document.documentElement.scrollWidth, windowHeight: document.documentElement.scrollHeight }); + canvas.toBlob(function(blob) { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'div-rs_body-cropped.png'; + document.body.appendChild(a); + a.click(); + setTimeout(() => document.body.removeChild(a), 100); + }); + }; + document.body.appendChild(cropBtn); + } + // Helper to get crop rectangle + function getCropRect() { + const h1 = document.querySelector('h1'); + const footer = document.querySelector('footer'); + if (!h1 || !footer) { + return { x: 0, y: 0, width: document.body.clientWidth - 120, height: document.body.clientHeight }; + } + const rect1 = h1.getBoundingClientRect(); + const rect2 = footer.getBoundingClientRect(); + // Calculate crop area from just below h1 to bottom of footer + const scrollY = window.scrollY || window.pageYOffset; + const scrollX = window.scrollX || window.pageXOffset; + let x = rect1.left + scrollX; + let y = rect1.bottom + scrollY + 4; // 4px below h1 + let width = rect1.width; + let height = (rect2.top + rect2.height) - (rect1.bottom + 4); + // Exclude the rightmost 120px (button area) + width = Math.max(1, width - 120); + return { x, y, width, height }; + } + } + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", tryAddButton); + // Cropped GIF + // Always call once in case DOM is already ready + tryAddButton(); + win.document.getElementById('download-cropped-gif-btn').onclick = function() { + const imgs = Array.from(win.document.querySelectorAll('.frame-img')); + if (!imgs.length) return; + const gif = new win.GIF({ workers: 2, quality: 10, workerScript: 'gif.worker.js' }); + let loaded = 0; + imgs.forEach(img => { + const canvas = win.document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + // Use the same crop as getCropRect + const h1 = win.document.querySelector('h1'); + const footer = win.document.querySelector('footer'); + let cropX = 0, cropY = 0, cropW = img.naturalWidth, cropH = img.naturalHeight; + if (h1 && footer) { + const rect1 = h1.getBoundingClientRect(); + const rect2 = footer.getBoundingClientRect(); + cropY = rect1.bottom + 4; + cropH = (rect2.top + rect2.height) - cropY; + cropW = img.naturalWidth - 120; + } else { + cropW = img.naturalWidth - 120; + } + canvas.width = cropW; + canvas.height = cropH; + ctx.drawImage(img, cropX, cropY, cropW, cropH, 0, 0, cropW, cropH); + gif.addFrame(canvas, { delay: 800 }); + loaded++; + if (loaded === imgs.length) { + gif.on('finished', function(blob) { + const url = win.URL.createObjectURL(blob); + const a = win.document.createElement('a'); + a.href = url; + a.download = 'div-rs-cropped-frames.gif'; + win.document.body.appendChild(a); + a.click(); + setTimeout(() => win.document.body.removeChild(a), 100); + }); + gif.render(); + } + }); + }; + }; + } +examples.push( + example( + "Toggle", + "An example with a toggleable pane.\n\nTwo grey panes labeled 'Hi!' and 'Bye!' automatically alternate visibility every second.\nNo user controls; keyboard input has no effect.\n\n---\nRust:\n```rust\ndiv0.show()?;\ndiv1.hide()?;\n```", + () => toggle.main() + ) +); +examples.push( + example( + "Hello Svelte", + "Demonstrates loading a Svelte component as a pane using Rust and JS interop.\n\nNo controls. This example shows a Svelte UI rendered inside a div-rs pane.\n\n---\nRust:\n```rust\nlet class = div::JsClass::preregistered(\"MyComponent\")?;\ndiv::from_js_class(x, y, w, h, class)?;\n```", + () => { + const divRoot = document.getElementById('div-root'); + if (!divRoot) { + console.error("'div-root' element is missing before running hello_svelte.main()."); + } else { + console.log("'div-root' element found, running hello_svelte.main()."); + } + hello_svelte.main(); + } + ) +); loadExampleSelection(examples); @@ -79,7 +411,24 @@ loadExampleSelection(examples); let params = new URLSearchParams(location.search); let displayedExample = params.get('example'); +function resetDivRoot() { + let main = document.querySelector('main'); + let old = document.getElementById('div-root'); + if (old) old.remove(); + let div = document.createElement('div'); + div.id = 'div-root'; + div.style.position = 'relative'; + main.insertBefore(div, main.firstChild); +} + if (displayedExample) { + resetDivRoot(); + // Call div.reset() on all modules before running example + for (const mod of [hello_world, reposition, styled, toggle, hello_svelte]) { + if (typeof mod.reset === 'function') { + try { mod.reset(); } catch (e) { /* ignore */ } + } + } const example = examples[displayedExample]; example.fn(); displayHint(example.help); @@ -94,6 +443,10 @@ function loadExampleSelection(examples) { button.setAttribute("type", "submit"); button.setAttribute("value", "Show"); form.appendChild(button); + // Prevent default form submission (which reloads the page) + form.addEventListener('submit', function(event) { + event.preventDefault(); + }); const select = document.createElement("select"); select.setAttribute("name", "example") @@ -104,16 +457,78 @@ function loadExampleSelection(examples) { option.text = examples[i].name; select.appendChild(option); } - const main = document.getElementsByTagName("main")[0]; - main.prepend(form); -} + // Set combobox to match displayed example if present in URL + let params = new URLSearchParams(location.search); + let displayedExample = params.get('example'); + if (displayedExample !== null && select.options[displayedExample]) { + select.value = displayedExample; + } + // Add a Random button to cycle through all modes + const randomBtn = document.createElement('button'); + randomBtn.innerText = 'Random'; + randomBtn.style.marginLeft = '10px'; + form.appendChild(randomBtn); + let randomInterval = null; + randomBtn.addEventListener('click', function() { + if (randomInterval) { + clearInterval(randomInterval); + randomInterval = null; + randomBtn.innerText = 'Random'; + return; + } + randomBtn.innerText = 'Stop Random'; + randomInterval = setInterval(() => { + // Pick a random example index + const idx = Math.floor(Math.random() * examples.length); + select.value = idx; + // Trigger change event + select.dispatchEvent(new Event('change')); + }, 2000); + }); + // Insert form after the

header + const h1 = document.querySelector('h1'); + if (h1 && h1.parentNode) { + h1.parentNode.insertBefore(form, h1.nextSibling); + } else { + document.body.prepend(form); + } + + // Reset div-root and run example on selection change + select.addEventListener('change', async function() { + const idx = select.value; + // No longer force reload for 'Reposition'; robust reset is now used for all examples + resetDivRoot(); + // Call div.reset() if available (WASM) + for (const mod of [hello_world, reposition, styled, toggle, hello_svelte]) { + if (typeof mod.reset === 'function') { + try { mod.reset(); } catch (e) { /* ignore */ } + } + } + examples[idx].fn(); + displayHint(examples[idx].help); + }); +} function displayHint(text) { - const floatingText = document.createElement("p"); + // Remove all previous .hint elements + document.querySelectorAll('p.hint').forEach(e => e.remove()); if (text) { + // Convert markdown-style code blocks to
...
+ let html = text.replace(/```rust([\s\S]*?)```/g, (match, code) => { + return `
${escapeHtml(code.trim())}
`; + }); + // Replace newlines with
outside code blocks only + html = html.replace(/(?!
|)(\n)/g, '
'); + const floatingText = document.createElement("p"); floatingText.className = "hint"; - floatingText.innerText = text; + floatingText.innerHTML = html; const body = document.getElementsByTagName("body")[0]; body.appendChild(floatingText); + highlightCodeBlocks(); } -} \ No newline at end of file +} + +// Escape HTML for code blocks +function escapeHtml(str) { + return str.replace(/[&<>]/g, tag => ({'&':'&','<':'<','>':'>'}[tag])); +} diff --git a/examples/www/package.json b/examples/www/package.json index 0769323..b591bf6 100644 --- a/examples/www/package.json +++ b/examples/www/package.json @@ -20,7 +20,8 @@ "build:webpack": "webpack --config webpack.config.js", "start": "webpack-dev-server", "release": "npm-run-all build:wasm release:webpack", - "release:webpack": "webpack --config webpack.prod.js" + "release:webpack": "webpack --config webpack.prod.js", + "rebuild": "npm run clean && npm run build && npm start" }, "repository": { "type": "git", @@ -32,15 +33,21 @@ "rust", "webpack" ], - "author": "Jakob Meier ", + "contributors": [ + "David Horner" + ], "license": "(MIT OR Apache-2.0)", "bugs": { "url": "https://github.com/jakmeier/div-rs/issues" }, "homepage": "https://github.com/jakmeier/div-rs#readme", "dependencies": { + "gif.js": "^0.2.0", "hello_svelte": "file:../hello_svelte/pkg", "hello_world": "file:../hello_world/pkg", + "html2canvas": "^1.4.1", + "prismjs": "^1.30.0", "reposition": "file:../reposition/pkg/", "styled": "file:../styled/pkg/", "toggle": "file:../toggle/pkg/" diff --git a/examples/www/styles.css b/examples/www/styles.css index 613e02a..11547f3 100644 --- a/examples/www/styles.css +++ b/examples/www/styles.css @@ -1,3 +1,8 @@ +pre, pre code { + white-space: pre-wrap; + word-break: break-word; + overflow-x: hidden; +} body { margin: auto; text-align: center; diff --git a/examples/www/webpack.common.js b/examples/www/webpack.common.js index 1ae517e..2d67f92 100644 --- a/examples/www/webpack.common.js +++ b/examples/www/webpack.common.js @@ -28,7 +28,10 @@ module.exports = { }, plugins: [ new CopyWebpackPlugin({ - patterns: ['index.html'] + patterns: [ + 'index.html', + { from: 'node_modules/gif.js/dist/gif.worker.js', to: '.' } + ] }) ], experiments: { diff --git a/src/lib.rs b/src/lib.rs index aaa6cfc..c7430bb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +// use wasm_bindgen::prelude::*; // No longer needed: no #[wasm_bindgen] exports in this crate +// No public reset/unmount API. Examples must use only the public API and manage their own cleanup. use std::{future::Future, sync::RwLock}; use web_sys::Element; @@ -206,3 +208,11 @@ impl JsClass { state::exec_mut(|state| Ok(state.classes.preloaded(name))).unwrap() } } + +use wasm_bindgen::prelude::*; + +/// Resets the global div state, allowing re-initialization (for example switching) +#[wasm_bindgen] +pub fn reset_global_div_state() { + state::clear_state(); +} diff --git a/src/state.rs b/src/state.rs index 04e002d..038b3bf 100644 --- a/src/state.rs +++ b/src/state.rs @@ -16,11 +16,6 @@ thread_local! { static S_STATE: RwLock>> = RwLock::default(); } -// pub (crate) fn get<'a>() -> Result>>, DivError> -// pub(crate) fn get( -// ) -> Result>>, DivError> { -// S_STATE.with(|state| state.read().map_err(|_e| DivError::Locked)) -// } pub(crate) fn set_state( new_state: GlobalState, @@ -65,3 +60,10 @@ where f(state.as_mut().as_mut().ok_or(DivError::NotInitialized)?) }) } +/// Clears the global state, allowing re-initialization. +pub(crate) fn clear_state() { + S_STATE.with(|state| { + let mut state = state.write().expect("Lock failed"); + *state = None; + }); +}