浏览代码

Merge pull request #43 from DioxusLabs/jk/release

release polishes
Jonathan Kelley 3 年之前
父节点
当前提交
ce712777c0
共有 100 个文件被更改,包括 1564 次插入1005 次删除
  1. 5 1
      .vscode/settings.json
  2. 102 0
      CHANGELOG.md
  3. 42 60
      Cargo.toml
  4. 26 12
      README.md
  5. 2 2
      docs/guide/src/README.md
  6. 1 1
      docs/guide/src/concepts/00-index.md
  7. 3 3
      docs/guide/src/concepts/11-arena-memo.md
  8. 5 5
      docs/guide/src/concepts/12-signals.md
  9. 2 2
      docs/guide/src/concepts/components.md
  10. 1 1
      docs/guide/src/concepts/conditional_rendering.md
  11. 3 3
      docs/guide/src/concepts/exporting_components.md
  12. 3 3
      docs/guide/src/concepts/interactivity.md
  13. 3 3
      docs/guide/src/hello_world.md
  14. 5 5
      examples/README.md
  15. 4 4
      examples/async.rs
  16. 6 6
      examples/borrowed.rs
  17. 9 9
      examples/calculator.rs
  18. 1 1
      examples/core/alternative.rs
  19. 1 1
      examples/core/async.rs
  20. 1 1
      examples/core/contextapi.rs
  21. 2 2
      examples/core/jsframework.rs
  22. 5 5
      examples/core/syntax.rs
  23. 1 1
      examples/core/syntax2.rs
  24. 1 1
      examples/core/vdom_usage.rs
  25. 12 12
      examples/core_reference/antipatterns.rs
  26. 3 3
      examples/core_reference/basics.rs
  27. 2 2
      examples/core_reference/children.rs
  28. 7 7
      examples/core_reference/conditional_rendering.rs
  29. 5 5
      examples/core_reference/controlled_inputs.rs
  30. 1 1
      examples/core_reference/custom_elements.rs
  31. 1 1
      examples/core_reference/empty.rs
  32. 6 6
      examples/core_reference/errorhandling.rs
  33. 4 4
      examples/core_reference/fragments.rs
  34. 1 1
      examples/core_reference/global_css.rs
  35. 2 2
      examples/core_reference/inline_styles.rs
  36. 2 2
      examples/core_reference/iterators.rs
  37. 5 5
      examples/core_reference/listener.rs
  38. 7 7
      examples/core_reference/memo.rs
  39. 1 1
      examples/core_reference/noderefs.rs
  40. 1 1
      examples/core_reference/signals.rs
  41. 2 2
      examples/core_reference/spreadpattern.rs
  42. 1 1
      examples/core_reference/statemanagement.rs
  43. 1 1
      examples/core_reference/suspense.rs
  44. 3 3
      examples/core_reference/task.rs
  45. 1 1
      examples/core_reference/testing.rs
  46. 4 4
      examples/core_reference/tostring.rs
  47. 4 4
      examples/coroutine.rs
  48. 7 7
      examples/crm.rs
  49. 7 7
      examples/desktop/crm.rs
  50. 2 2
      examples/desktop/demo.rs
  51. 6 6
      examples/desktop/todomvc.rs
  52. 12 10
      examples/file_explorer.rs
  53. 10 10
      examples/framework_benchmark.rs
  54. 1 1
      examples/hello_world.rs
  55. 2 2
      examples/hydration.rs
  56. 6 6
      examples/pattern_model.rs
  57. 3 3
      examples/pattern_reducer.rs
  58. 3 3
      examples/readme.rs
  59. 1 1
      examples/router.rs
  60. 2 2
      examples/rsx_usage.rs
  61. 4 4
      examples/ssr.rs
  62. 1 1
      examples/ssr/basic.rs
  63. 3 3
      examples/ssr/tide.rs
  64. 6 6
      examples/ssr/tofile.rs
  65. 6 6
      examples/tailwind.rs
  66. 3 3
      examples/tasks.rs
  67. 8 8
      examples/todomvc.rs
  68. 3 3
      examples/weather_app.rs
  69. 3 3
      examples/web/async_web.rs
  70. 6 6
      examples/web/basic.rs
  71. 3 3
      examples/web/blah.rs
  72. 5 5
      examples/web/btns.rs
  73. 7 7
      examples/web/crm2.rs
  74. 7 7
      examples/web/demo.rs
  75. 3 3
      examples/web_tick.rs
  76. 3 3
      examples/webview_web.rs
  77. 1 1
      notes/Parity.md
  78. 5 5
      notes/SOLVEDPROBLEMS.md
  79. 184 0
      packages/core-macro/CHANGELOG.md
  80. 6 3
      packages/core-macro/Cargo.toml
  81. 2 2
      packages/core-macro/src/lib.rs
  82. 19 5
      packages/core-macro/src/props/mod.rs
  83. 5 1
      packages/core-macro/src/rsx/ambiguous.rs
  84. 8 1
      packages/core-macro/src/rsx/component.rs
  85. 538 0
      packages/core/CHANGELOG.md
  86. 18 13
      packages/core/Cargo.toml
  87. 55 41
      packages/core/README.md
  88. 2 0
      packages/core/architecture.md
  89. 4 4
      packages/core/benches/jsframework.rs
  90. 1 19
      packages/core/examples/borrowed.rs
  91. 40 0
      packages/core/examples/component_children.rs
  92. 17 0
      packages/core/examples/handlerror.rs
  93. 0 10
      packages/core/examples/hooks.rs
  94. 24 7
      packages/core/examples/works.rs
  95. 0 412
      packages/core/flamegraph.svg
  96. 3 3
      packages/core/src/component.rs
  97. 114 133
      packages/core/src/diff.rs
  98. 18 1
      packages/core/src/lazynodes.rs
  99. 52 5
      packages/core/src/lib.rs
  100. 5 0
      packages/core/src/mutations.rs

+ 5 - 1
.vscode/settings.json

@@ -1,3 +1,7 @@
 {
-  "rust-analyzer.cargo.allFeatures": true
+  "rust-analyzer.cargo.allFeatures": true,
+  "rust-analyzer.cargo.features": [
+    "desktop",
+    "router"
+  ],
 }

+ 102 - 0
CHANGELOG.md

@@ -0,0 +1,102 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## v0.1.1 (2021-12-15)
+
+### Documentation
+
+ - <csr-id-4de16c4779648e591b3869b5df31271ae603c812/> update local examples and docs to support new syntaxes
+ - <csr-id-78007445f944f259170307d840e0f16242b7b4b6/> improve docs
+ - <csr-id-583fdfa5618e11d660985b97e570d4503be2ff49/> big updates to the reference
+ - <csr-id-bf21c82de04e25daee60a06232b9a16b640508f2/> lib.rs docs
+ - <csr-id-70cd46dbb2a689ae2d512e142b8aee9c80798430/> move around examples
+
+### New Features
+
+ - <csr-id-8acdd2ea830b995b608d8bac2ef527db8d40e662/> it compiles once more
+ - <csr-id-9726a065b0d4fb1ede5b53a2ddd58c855e51539f/> massage lifetimes
+ - <csr-id-4a72b3140bd244da602deada1eeecded65ff5848/> amazingly awesome error handling
+ - <csr-id-3bedcb93cacec5bdf134adc38ff02eadbf96c1c6/> svgs working in webview
+ - <csr-id-a2c7d17b0595769f60bc1c2bbf7cbe32cec37486/> mvoe away from compound context
+ - <csr-id-de9f61bcf48c0d6e35e46c337b72a713c9f9f7d2/> more suspended nodes!
+ - <csr-id-4091846934b4b3b2bc03d3ca8aaf7712aebd4e36/> add aria
+ - <csr-id-7aec40d57e78ec13ff3a90ca8149521cbf1d9ff2/> enable arbitrary body in rsx! macro
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 36 commits contributed to the release over the course of 174 calendar days.
+ - 34 commits where understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' where seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+    - update local examples and docs to support new syntaxes ([`4de16c4`](https://github.comgit//DioxusLabs/dioxus/commit/4de16c4779648e591b3869b5df31271ae603c812))
+    - docs ([`8814977`](https://github.comgit//DioxusLabs/dioxus/commit/8814977eeebe06748a3b9677a8070e42a037ebd7))
+    - it compiles once more ([`8acdd2e`](https://github.comgit//DioxusLabs/dioxus/commit/8acdd2ea830b995b608d8bac2ef527db8d40e662))
+    - some docs and suspense ([`93d4b8c`](https://github.comgit//DioxusLabs/dioxus/commit/93d4b8ca7c1b133e5dba2a8dc9a310dbe1357001))
+    - docs and router ([`a5f05d7`](https://github.comgit//DioxusLabs/dioxus/commit/a5f05d73acc0e47b05cff64a373482519414bc7c))
+    - Merge branch 'master' into jk/remove_node_safety ([`db00047`](https://github.comgit//DioxusLabs/dioxus/commit/db0004758c77331cc3b93ea8cf227c060028e12e))
+    - improve docs ([`7800744`](https://github.comgit//DioxusLabs/dioxus/commit/78007445f944f259170307d840e0f16242b7b4b6))
+    - Various typos/grammar/rewording ([`5747e00`](https://github.comgit//DioxusLabs/dioxus/commit/5747e00b27b1b69c4f9c2820e7e78030feaff71e))
+    - bubbling in progress ([`a21020e`](https://github.comgit//DioxusLabs/dioxus/commit/a21020ea575e467ba0d608737269fe1b0792dba7))
+    - massage lifetimes ([`9726a06`](https://github.comgit//DioxusLabs/dioxus/commit/9726a065b0d4fb1ede5b53a2ddd58c855e51539f))
+    - major cleanups to scheduler ([`2933e4b`](https://github.comgit//DioxusLabs/dioxus/commit/2933e4bc11b3074c2bde8d76ec55364fca841988))
+    - threadsafe ([`82953f2`](https://github.comgit//DioxusLabs/dioxus/commit/82953f2ac37913f83a822333acd0c47e20777d31))
+    - move macro crate out of core ([`7bdad1e`](https://github.comgit//DioxusLabs/dioxus/commit/7bdad1e2e6f67e74c9f67dde2150140cf8a090e8))
+    - amazingly awesome error handling ([`4a72b31`](https://github.comgit//DioxusLabs/dioxus/commit/4a72b3140bd244da602deada1eeecded65ff5848))
+    - some ideas ([`05c909f`](https://github.comgit//DioxusLabs/dioxus/commit/05c909f320765aec1bf4c1c55ca59ffd5525a2c7))
+    - big updates to the reference ([`583fdfa`](https://github.comgit//DioxusLabs/dioxus/commit/583fdfa5618e11d660985b97e570d4503be2ff49))
+    - docs, html! macro, more ([`caf772c`](https://github.comgit//DioxusLabs/dioxus/commit/caf772cf249d2f56c8d0b0fa2737ad48e32c6e82))
+    - cleanup workspace ([`8f0bb5d`](https://github.comgit//DioxusLabs/dioxus/commit/8f0bb5dc5bfa3e775af567c4b569622cdd932af1))
+    - svgs working in webview ([`3bedcb9`](https://github.comgit//DioxusLabs/dioxus/commit/3bedcb93cacec5bdf134adc38ff02eadbf96c1c6))
+    - mvoe away from compound context ([`a2c7d17`](https://github.comgit//DioxusLabs/dioxus/commit/a2c7d17b0595769f60bc1c2bbf7cbe32cec37486))
+    - more suspended nodes! ([`de9f61b`](https://github.comgit//DioxusLabs/dioxus/commit/de9f61bcf48c0d6e35e46c337b72a713c9f9f7d2))
+    - add aria ([`4091846`](https://github.comgit//DioxusLabs/dioxus/commit/4091846934b4b3b2bc03d3ca8aaf7712aebd4e36))
+    - more examples ([`56e7eb8`](https://github.comgit//DioxusLabs/dioxus/commit/56e7eb83a97ebd6d5bcd23464cfb9d718e5ac26d))
+    - more refactor for async ([`975fa56`](https://github.comgit//DioxusLabs/dioxus/commit/975fa566f9809f8fa2bb0bdb07fbfc7f855dcaeb))
+    - enable arbitrary body in rsx! macro ([`7aec40d`](https://github.comgit//DioxusLabs/dioxus/commit/7aec40d57e78ec13ff3a90ca8149521cbf1d9ff2))
+    - move CLI into its own "studio" app ([`fd79335`](https://github.comgit//DioxusLabs/dioxus/commit/fd7933561fe81922e4d5d77f6ac3b6f19efb5a90))
+    - move some examples around ([`98a0933`](https://github.comgit//DioxusLabs/dioxus/commit/98a09339fd3190799ea4dd316908f0a53fdf2413))
+    - fix issues with lifetimes ([`a38a81e`](https://github.comgit//DioxusLabs/dioxus/commit/a38a81e1290375cae685f7c49d3745e4298fab26))
+    - more examples ([`11f89e5`](https://github.comgit//DioxusLabs/dioxus/commit/11f89e5d338d14a7aeece0a6275c24ae65913ce7))
+    - lib.rs docs ([`bf21c82`](https://github.comgit//DioxusLabs/dioxus/commit/bf21c82de04e25daee60a06232b9a16b640508f2))
+    - rename ctx to cx ([`81382e7`](https://github.comgit//DioxusLabs/dioxus/commit/81382e7044fb3dba61d4abb1e6086b7b29143116))
+    - move around examples ([`70cd46d`](https://github.comgit//DioxusLabs/dioxus/commit/70cd46dbb2a689ae2d512e142b8aee9c80798430))
+    - start moving events to rc<event> ([`b9ff95f`](https://github.comgit//DioxusLabs/dioxus/commit/b9ff95fa12c46365fe73b64a4926a506d5da2342))
+    - rename recoil to atoms ([`36ea39a`](https://github.comgit//DioxusLabs/dioxus/commit/36ea39ae30aa3f1fb2d718c0fdf08850c6bfd3ac))
+    - more examples and docs ([`7fbaf69`](https://github.comgit//DioxusLabs/dioxus/commit/7fbaf69cabbdde712bb3fd9e4b2a5dc18b9390e9))
+    - docs ([`f5683a2`](https://github.comgit//DioxusLabs/dioxus/commit/f5683a23464992ecace463a61414795b5a2c58c8))
+</details>
+
+## v0.1.0 (2021-12-15)
+
+### Documentation
+
+ - <csr-id-4de16c4779648e591b3869b5df31271ae603c812/> update local examples and docs to support new syntaxes
+ - <csr-id-78007445f944f259170307d840e0f16242b7b4b6/> improve docs
+ - <csr-id-583fdfa5618e11d660985b97e570d4503be2ff49/> big updates to the reference
+ - <csr-id-bf21c82de04e25daee60a06232b9a16b640508f2/> lib.rs docs
+ - <csr-id-70cd46dbb2a689ae2d512e142b8aee9c80798430/> move around examples
+
+### New Features
+
+ - <csr-id-8acdd2ea830b995b608d8bac2ef527db8d40e662/> it compiles once more
+ - <csr-id-9726a065b0d4fb1ede5b53a2ddd58c855e51539f/> massage lifetimes
+ - <csr-id-4a72b3140bd244da602deada1eeecded65ff5848/> amazingly awesome error handling
+ - <csr-id-3bedcb93cacec5bdf134adc38ff02eadbf96c1c6/> svgs working in webview
+ - <csr-id-a2c7d17b0595769f60bc1c2bbf7cbe32cec37486/> mvoe away from compound context
+ - <csr-id-de9f61bcf48c0d6e35e46c337b72a713c9f9f7d2/> more suspended nodes!
+ - <csr-id-4091846934b4b3b2bc03d3ca8aaf7712aebd4e36/> add aria
+ - <csr-id-7aec40d57e78ec13ff3a90ca8149521cbf1d9ff2/> enable arbitrary body in rsx! macro
+

+ 42 - 60
Cargo.toml

@@ -1,99 +1,81 @@
 [package]
 name = "dioxus"
-version = "0.1.0"
-authors = ["Jonathan Kelley <jkelleyrtp@gmail.com>"]
+version = "0.1.2"
+authors = ["Jonathan Kelley"]
 edition = "2018"
 description = "Core functionality for Dioxus - a concurrent renderer-agnostic Virtual DOM for interactive user experiences"
-"license" = "MIT/Apache-2.0"
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+license = "MIT/Apache-2.0"
+repository = "https://github.com/DioxusLabs/dioxus/"
+homepage = "https://dioxuslabs.com"
+documentation = "https://dioxuslabs.com"
+keywords = ["dom", "ui", "gui", "react", "wasm"]
 
 [dependencies]
-dioxus-core = { path = "./packages/core", version = "0.1.3" }
-dioxus-router = { path = "./packages/router", optional = true }
-dioxus-core-macro = { path = "./packages/core-macro", optional = true }
+dioxus-core = { path = "./packages/core", version = "^0.1.3" }
 dioxus-html = { path = "./packages/html", optional = true }
-dioxus-web = { path = "./packages/web", optional = true }
-dioxus-desktop = { path = "./packages/desktop", optional = true }
+dioxus-core-macro = { path = "./packages/core-macro", optional = true }
 dioxus-hooks = { path = "./packages/hooks", optional = true }
+
 dioxus-ssr = { path = "./packages/ssr", optional = true }
+dioxus-web = { path = "./packages/web", optional = true }
+dioxus-desktop = { path = "./packages/desktop", optional = true }
+dioxus-router = { path = "./packages/router", optional = true }
+
 dioxus-mobile = { path = "./packages/mobile", optional = true }
 dioxus-liveview = { path = "./packages/liveview", optional = true }
 
 [features]
-# core
-default = ["core"]
-core = ["macro", "hooks", "html"]
+default = ["macro", "hooks", "html"]
+
 macro = ["dioxus-core-macro"]
 hooks = ["dioxus-hooks"]
 html = ["dioxus-html"]
 router = ["dioxus-router"]
 liveview = ["dioxus-liveview"]
-
-# utilities
-atoms = []
-
-# targets
 ssr = ["dioxus-ssr"]
-web = ["dioxus-web"]
-desktop = ["dioxus-desktop"]
+web = ["dioxus-web", "dioxus-router/web"]
+desktop = ["dioxus-desktop", "dioxus-router/desktop"]
 mobile = ["dioxus-mobile"]
 
 
+[workspace]
+members = [
+    "packages/core",
+    "packages/core-macro",
+    "packages/html",
+    "packages/hooks",
+    "packages/web",
+    "packages/ssr",
+    "packages/desktop",
+    "packages/mobile",
+]
+
 [dev-dependencies]
-futures-util = "0.3.16"
+futures-util = "0.3.17"
 log = "0.4.14"
 num-format = "0.4.0"
 separator = "0.4.1"
-serde = { version = "1.0.130", features = ["derive"] }
+serde = { version = "1.0.131", features = ["derive"] }
 im-rc = "15.0.0"
 fxhash = "0.2.1"
-anyhow = "1.0.42"
-# reqwest = "0.11.4"
-serde_json = "1.0.68"
-simple_logger = "1.13.0"
+anyhow = "1.0.51"
+serde_json = "1.0.73"
+simple_logger = "1.16.0"
 
 [target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
-argh = "0.1.5"
+argh = "0.1.7"
 env_logger = "0.9.0"
-tokio = { version = "1.12.0", features = ["full"] }
+tokio = { version = "1.14.0", features = ["full"] }
 rand = { version = "0.8.4", features = ["small_rng"] }
-gloo-timers = "0.2.1"
+gloo-timers = "0.2.2"
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-gloo-timers = "0.2.1"
+gloo-timers = "0.2.2"
 wasm-logger = "0.2.0"
-console_error_panic_hook = "0.1.6"
+console_error_panic_hook = "0.1.7"
 rand = { version = "0.8.4", features = ["small_rng"] }
-wasm-bindgen = { version = "0.2.71", features = ["enable-interning"] }
+wasm-bindgen = { version = "0.2.78", features = ["enable-interning"] }
 
 [dev-dependencies.getrandom]
-version = "0.2"
+version = "0.2.3"
 features = ["js"]
-
-
-[workspace]
-members = [
-    "packages/core",
-    "packages/core-macro",
-    "packages/html",
-    "packages/hooks",
-    "packages/web",
-    "packages/ssr",
-    "packages/desktop",
-    "packages/mobile",
-]
-
-
-[[example]]
-required-features = ["desktop"]
-name = "webview"
-path = "./examples/webview.rs"
-
-[[example]]
-required-features = ["desktop"]
-name = "tailwind"
-path = "./examples/tailwind.rs"
-
-
-# [patch.crates-io]
-# wasm-bindgen = { path = "../Tinkering/wasm-bindgen" }

+ 26 - 12
README.md

@@ -49,8 +49,8 @@
 Dioxus is a portable, performant, and ergonomic framework for building cross-platform user experiences in Rust.
 
 ```rust
-fn App(cx: Scope, props: &()) -> Element {
-    let mut count = use_state(cx, || 0);
+fn app(cx: Scope<()>) -> Element {
+    let mut count = use_state(&cx, || 0);
 
     cx.render(rsx!(
         h1 { "High-Five counter: {count}" }
@@ -76,20 +76,32 @@ If you know React, then you already know Dioxus.
 
 <table style="width:100%" align="center">
     <tr >
-        <th><a href="http://github.com/jkelleyrtp/dioxus">Web</a></th>
-        <th><a href="http://github.com/jkelleyrtp/dioxus">Desktop</a></th>
-        <th><a href="http://github.com/jkelleyrtp/dioxus">Mobile</a></th>
-        <th><a href="http://github.com/jkelleyrtp/dioxus">State</a></th>
-        <th><a href="http://github.com/jkelleyrtp/dioxus">Docs</a></th>
-        <th><a href="http://github.com/jkelleyrtp/dioxus">Tools</a></th>
+        <th><a href="https://dioxuslabs.com/book/">Web</a></th>
+        <th><a href="https://dioxuslabs.com/book/">Desktop</a></th>
+        <th><a href="https://dioxuslabs.com/book/">Mobile</a></th>
+        <th><a href="https://dioxuslabs.com/book/">State</a></th>
+        <th><a href="https://dioxuslabs.com/book/">Docs</a></th>
+        <th><a href="https://dioxuslabs.com/book/">Tools</a></th>
     <tr>
 </table>
 
+Available cargo features:
+- default: core (macro, hooks, html)
+- macro: support for `Props` and `rsx` macros
+- hooks: foundational hooks like `use_state`, `use_ref`, etc.
+- html: the entire namespace of `html` elements, their listeners, and attributes
+- router: a cross-platform (web and desktop) solution for global app routing 
+- liveview: a threadpool to spawn new VirtualDoms and their handles in
+- ssr: render the virtualdom to a string
+- web: render the your app on the web
+- desktop: render your app locally rendered with webview 
+- mobile: render your app on your device rendered with webview
+
 ## Examples:
 
-| File Navigator (Desktop)                                                                                                                | Bluetooth scanner (Desktop)                                      | TodoMVC (All platforms)                                                                                         | Widget Gallery                                                   |
-| --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
-| [![asd](https://github.com/DioxusLabs/file-explorer-example/raw/master/image.png)](https://github.com/DioxusLabs/file-explorer-example) | ![asd](https://sixtyfps.io/resources/printerdemo_screenshot.png) | [![asd](https://github.com/DioxusLabs/todomvc/blob/master/example.png)](https://github.com/dioxusLabs/todomvc/) | ![asd](https://sixtyfps.io/resources/printerdemo_screenshot.png) |
+| File Navigator (Desktop)                                                                                                                | Bluetooth scanner (Desktop)                                                                                                             | TodoMVC (All platforms)                                                                                        | Tailwind (Liveview)                                                                                                                     |
+| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
+| [![asd](https://github.com/DioxusLabs/file-explorer-example/raw/master/image.png)](https://github.com/DioxusLabs/file-explorer-example) | [![asd](https://github.com/DioxusLabs/file-explorer-example/raw/master/image.png)](https://github.com/DioxusLabs/file-explorer-example) | [![asd](https://github.com/DioxusLabs/todomvc/raw/master/example.png)](https://github.com/dioxusLabs/todomvc/) | [![asd](https://github.com/DioxusLabs/file-explorer-example/raw/master/image.png)](https://github.com/DioxusLabs/file-explorer-example) |
 
 
 See the awesome-dioxus page for a curated list of content in the Dioxus Ecosystem.
@@ -159,6 +171,7 @@ Dioxus is heavily inspired by React, but we want your transition to feel like an
 | Re-hydration              | ✅      | ✅     | Pre-render to HTML to speed up first contentful paint                |
 | Jank-Free Rendering       | ✅      | ✅     | Large diffs are segmented across frames for silky-smooth transitions |
 | Effects                   | ✅      | ✅     | Run effects after a component has been committed to render           |
+| Portals                   | 🛠      | ✅     | Render nodes outside of the traditional tree structure               |
 | Cooperative Scheduling    | 🛠      | ✅     | Prioritize important events over non-important events                |
 | Server Components         | 🛠      | ✅     | Hybrid components for SPA and Server                                 |
 | Bundle Splitting          | 👀      | ✅     | Efficiently and asynchronously load the app                          |
@@ -166,6 +179,7 @@ Dioxus is heavily inspired by React, but we want your transition to feel like an
 | 1st class global state    | ✅      | ✅     | redux/recoil/mobx on top of context                                  |
 | Runs natively             | ✅      | ❓     | runs as a portable binary w/o a runtime (Node)                       |
 | Subtree Memoization       | ✅      | ❓     | skip diffing static element subtrees                                 |
+| High-efficiency templates | 🛠      | ❓     | rsx! calls are translated to templates on the DOM's side             |
 | Compile-time correct      | ✅      | ❓     | Throw errors on invalid template layouts                             |
 | Heuristic Engine          | ✅      | ❓     | track component memory usage to minimize future allocations          |
 | Fine-grained reactivity   | 👀      | ❓     | Skip diffing for fine-grain updates                                  |
@@ -185,5 +199,5 @@ This project is licensed under the [MIT license].
 ### Contribution
 
 Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in Pipette by you, shall be licensed as MIT, without any additional
+for inclusion in Dioxus by you, shall be licensed as MIT, without any additional
 terms or conditions.

+ 2 - 2
docs/guide/src/README.md

@@ -6,7 +6,7 @@
 
 ```rust
 fn App(cx: Context, props: &()) -> Element {
-    let mut count = use_state(cx, || 0);
+    let mut count = use_state(&cx, || 0);
 
     cx.render(rsx!(
         h1 { "High-Five counter: {count}" }
@@ -53,7 +53,7 @@ Dioxus supports server-side rendering!
 For rendering statically to an `.html` file or from a WebServer, then you'll want to make sure the `ssr` feature is enabled in the `dioxus` crate and use the `dioxus::ssr` API. We don't expect the SSR API to change drastically in the future.
 
 ```rust
-let contents = dioxus::ssr::render_vdom(&dom, |c| c);
+let contents = dioxus::ssr::render_vdom(&dom);
 ```
 
 [Jump to the getting started guide for SSR.]()

+ 1 - 1
docs/guide/src/concepts/00-index.md

@@ -45,7 +45,7 @@ As the UI grows in scale, our logic to keep each element in the proper state wou
 Instead, with Dioxus, we *declare* what we want our UI to look like:
 
 ```rust
-let mut state = use_state(cx, || "red");
+let mut state = use_state(&cx, || "red");
 
 cx.render(rsx!(
     Container {

+ 3 - 3
docs/guide/src/concepts/11-arena-memo.md

@@ -21,9 +21,9 @@ fn test() -> DomTree {
     }
 }
 
-static TestComponent: FC<()> = |cx, props|html!{<div>"Hello world"</div>};
+static TestComponent: Component<()> = |cx, props|html!{<div>"Hello world"</div>};
 
-static TestComponent: FC<()> = |cx, props|{
+static TestComponent: Component<()> = |cx, props|{
     let g = "BLAH";
     html! {
         <div> "Hello world" </div>
@@ -31,7 +31,7 @@ static TestComponent: FC<()> = |cx, props|{
 };
 
 #[functional_component]
-static TestComponent: FC<{ name: String }> = |cx, props|html! { <div> "Hello {name}" </div> };
+static TestComponent: Component<{ name: String }> = |cx, props|html! { <div> "Hello {name}" </div> };
 ```
 
 ## Why this behavior?

+ 5 - 5
docs/guide/src/concepts/12-signals.md

@@ -12,7 +12,7 @@ Your component today might look something like this:
 
 ```rust
 fn Comp(cx: Context<()>) -> DomTree {
-    let (title, set_title) = use_state(cx, || "Title".to_string());
+    let (title, set_title) = use_state(&cx, || "Title".to_string());
     cx.render(rsx!{
         input {
             value: title,
@@ -26,7 +26,7 @@ This component is fairly straightforward - the input updates its own value on ev
 
 ```rust
 fn Comp(cx: Context<()>) -> DomTree {
-    let (title, set_title) = use_state(cx, || "Title".to_string());
+    let (title, set_title) = use_state(&cx, || "Title".to_string());
     cx.render(rsx!{
         div {
             input {
@@ -96,7 +96,7 @@ Sometimes you want a signal to propagate across your app, either through far-awa
 
 ```rust
 const TITLE: Atom<String> = || "".to_string();
-const Provider: FC<()> = |cx, props|{
+const Provider: Component<()> = |cx, props|{
     let title = use_signal(&cx, &TITLE);
     rsx!(cx, input { value: title })
 };
@@ -105,7 +105,7 @@ const Provider: FC<()> = |cx, props|{
 If we use the `TITLE` atom in another component, we can cause updates to flow between components without calling render or diffing either component trees:
 
 ```rust
-const Receiver: FC<()> = |cx, props|{
+const Receiver: Component<()> = |cx, props|{
     let title = use_signal(&cx, &TITLE);
     log::info!("This will only be called once!");
     rsx!(cx,
@@ -132,7 +132,7 @@ Dioxus automatically understands how to use your signals when mixed with iterato
 
 ```rust
 const DICT: AtomFamily<String, String> = |_| {};
-const List: FC<()> = |cx, props|{
+const List: Component<()> = |cx, props|{
     let dict = use_signal(&cx, &DICT);
     cx.render(rsx!(
         ul {

+ 2 - 2
docs/guide/src/concepts/components.md

@@ -124,7 +124,7 @@ fn VoteButton(cx: Context, props: &VoteButtonProps) -> Element {
     cx.render(rsx!{
         div { class: "votebutton"
             div { class: "arrow up" }
-            div { class: "score", "{props.score}"}
+            div { class: "score", "{cx.props.score}"}
             div { class: "arrow down" }
         }
     })
@@ -147,7 +147,7 @@ struct TitleCardProps<'a> {
 
 fn TitleCard(cx: Context, props: &TitleCardProps) -> Element {
     cx.render(rsx!{
-        h1 { "{props.title}" }
+        h1 { "{cx.props.title}" }
     })
 }   
 ```

+ 1 - 1
docs/guide/src/concepts/conditional_rendering.md

@@ -83,7 +83,7 @@ fn App(cx: Context, props: &())-> Element {
 
 This syntax even enables us to write a one-line component:
 ```rust
-static App: FC<()> = |cx, props| rsx!(cx, "hello world!");
+static App: Component<()> = |cx, props| rsx!(cx, "hello world!");
 ```
 
 Alternatively, for match statements, we can just return the builder itself and pass it into a final, single call to `cx.render`:

+ 3 - 3
docs/guide/src/concepts/exporting_components.md

@@ -22,7 +22,7 @@ Let's say our app looks something like this:
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 fn App((cx, props): Component<()>) -> Element {} 
@@ -87,7 +87,7 @@ In our `main.rs`, we'll want to declare the `post` module so we can access our `
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 mod post;
@@ -186,7 +186,7 @@ Ultimately, including and exporting components is governed by Rust's module syst
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 mod post;

+ 3 - 3
docs/guide/src/concepts/interactivity.md

@@ -64,7 +64,7 @@ The most common hook you'll use for storing state is `use_state`. `use_state` pr
 
 ```rust
 fn App(cx: Context, props: &())-> Element {
-    let post = use_state(cx, || {
+    let post = use_state(&cx, || {
         PostData {
             id: Uuid::new_v4(),
             score: 10,
@@ -112,7 +112,7 @@ For example, let's say we provide a button to generate a new post. Whenever the
 
 ```rust
 fn App(cx: Context, props: &())-> Element {
-    let post = use_state(cx, || PostData::new());
+    let post = use_state(&cx, || PostData::new());
 
     cx.render(rsx!{
         button {
@@ -135,7 +135,7 @@ We can use tasks in our components to build a tiny stopwatch that ticks every se
 ```rust
 
 fn App(cx: Context, props: &())-> Element {
-    let mut sec_elapsed = use_state(cx, || 0);
+    let mut sec_elapsed = use_state(&cx, || 0);
 
     cx.spawn_task(async move {
         TimeoutFuture::from_ms(1000).await;

+ 3 - 3
docs/guide/src/hello_world.md

@@ -92,7 +92,7 @@ use dioxus::prelude::*;
 
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 fn App(cx: Context, props: &()) -> Element {
@@ -118,7 +118,7 @@ This initialization code launches a Tokio runtime on a helper thread where your
 
 ```rust
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 ```
 
@@ -135,7 +135,7 @@ fn App(cx: Context, props: &()) -> Element {
 Writing `fn App(cx: Context, props: &()) -> Element {` might become tedious. Rust will also let you write functions as static closures, but these types of Components cannot have props that borrow data.
 
 ```rust
-static App: FC<()> = |cx, props| cx.render(rsx!(div { "Hello, world!" }));
+static App: Component<()> = |cx, props| cx.render(rsx!(div { "Hello, world!" }));
 ```
 
 ### What is this `Context` object?

+ 5 - 5
examples/README.md

@@ -72,7 +72,7 @@ fn App(cx: Context, props: &()) -> Element {
 struct ToggleProps { children: Element }
 
 fn Toggle(cx: Context, props: &ToggleProps) -> Element {
-  let mut toggled = use_state(cx, || false);
+  let mut toggled = use_state(&cx, || false);
   cx.render(rsx!{
     div {
       {&props.children}
@@ -87,7 +87,7 @@ fn Toggle(cx: Context, props: &ToggleProps) -> Element {
 Controlled inputs:
 ```rust
 fn App(cx: Context, props: &()) -> Element {
-  let value = use_state(cx, String::new);
+  let value = use_state(&cx, String::new);
   cx.render(rsx!( 
     input {
       "type": "text",
@@ -123,13 +123,13 @@ fn App(cx: Context, props: &()) -> Element {
 
 Tiny components:
 ```rust
-static App: FC<()> = |cx, _| rsx!(cx, div {"hello world!"});
+static App: Component<()> = |cx, _| rsx!(cx, div {"hello world!"});
 ```
 
 Borrowed prop contents:
 ```rust
 fn App(cx: Context, props: &()) -> Element {
-  let name = use_state(cx, || String::from("example"));
+  let name = use_state(&cx, || String::from("example"));
   rsx!(cx, Child { title: name.as_str() })
 }
 
@@ -137,7 +137,7 @@ fn App(cx: Context, props: &()) -> Element {
 struct ChildProps<'a> { title: &'a str }
 
 fn Child(cx: Context, props: &ChildProps) -> Element {
-  rsx!(cx, "Hello {props.title}")
+  rsx!(cx, "Hello {cx.props.title}")
 }
 ```
 

+ 4 - 4
examples/async.rs

@@ -8,12 +8,12 @@ use gloo_timers::future::TimeoutFuture;
 
 #[tokio::main]
 async fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
-pub static App: Component<()> = |cx, _| {
-    let count = use_state(cx, || 0);
-    let mut direction = use_state(cx, || 1);
+pub static App: Component<()> = |cx| {
+    let count = use_state(&cx, || 0);
+    let mut direction = use_state(&cx, || 1);
 
     let (async_count, dir) = (count.for_async(), *direction);
 

+ 6 - 6
examples/borrowed.rs

@@ -17,10 +17,10 @@ and is proven to be safe with MIRI.
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
-fn App(cx: Scope, props: &()) -> Element {
+fn App(cx: Scope<()>) -> Element {
     let text: &mut Vec<String> = cx.use_hook(|_| vec![String::from("abc=def")], |f| f);
 
     let first = text.get_mut(0).unwrap();
@@ -39,7 +39,7 @@ struct C1Props<'a> {
     text: &'a mut String,
 }
 
-fn Child1(cx: Scope, props: &C1Props) -> Element {
+fn Child1<'a>(cx: Scope<'a, C1Props<'a>>) -> Element {
     let (left, right) = props.text.split_once("=").unwrap();
 
     cx.render(rsx! {
@@ -55,7 +55,7 @@ struct C2Props<'a> {
     text: &'a str,
 }
 
-fn Child2(cx: Scope, props: &C2Props) -> Element {
+fn Child2<'a>(cx: Scope<'a, C2Props<'a>>) -> Element {
     cx.render(rsx! {
         Child3 {
             text: props.text
@@ -68,8 +68,8 @@ struct C3Props<'a> {
     text: &'a str,
 }
 
-fn Child3(cx: Scope, props: &C3Props) -> Element {
+fn Child3<'a>(cx: Scope<'a, C3Props<'a>>) -> Element {
     cx.render(rsx! {
-        div { "{props.text}"}
+        div { "{cx.props.text}"}
     })
 }

+ 9 - 9
examples/calculator.rs

@@ -10,13 +10,13 @@ use dioxus::prelude::*;
 use separator::Separatable;
 
 fn main() {
-    dioxus::desktop::launch(APP, |cfg| cfg);
+    dioxus::desktop::launch(APP);
 }
 
-const APP: Component<()> = |cx, _| {
-    let cur_val = use_state(cx, || 0.0_f64);
-    let operator = use_state(cx, || None as Option<&'static str>);
-    let display_value = use_state(cx, || String::from(""));
+static APP: Component<()> = |cx| {
+    let cur_val = use_state(&cx, || 0.0_f64);
+    let operator = use_state(&cx, || None as Option<&'static str>);
+    let display_value = use_state(&cx, || String::from(""));
 
     let toggle_percent = move |_| todo!();
     let input_digit = move |num: u8| display_value.modify().push_str(num.to_string().as_str());
@@ -117,13 +117,13 @@ const APP: Component<()> = |cx, _| {
 struct CalculatorKeyProps<'a> {
     name: &'static str,
     onclick: &'a dyn Fn(Arc<MouseEvent>),
-    children: Element,
+    children: Element<'a>,
 }
 
-fn CalculatorKey<'a>(cx: Scope, props: &CalculatorKeyProps) -> Element {
+fn CalculatorKey<'a>(cx: Scope<'a, CalculatorKeyProps<'a>>) -> Element {
     rsx!(cx, button {
-        class: "calculator-key {props.name}"
-        onclick: {props.onclick}
+        class: "calculator-key {cx.props.name}"
+        onclick: {cx.props.onclick}
         {&props.children}
     })
 }

+ 1 - 1
examples/core/alternative.rs

@@ -9,7 +9,7 @@ fn main() {
     println!("{}", dom);
 }
 
-pub static EXAMPLE: FC<()> = |cx, _| {
+pub static EXAMPLE: Component<()> = |cx| {
     let list = (0..10).map(|_f| {
         rsx! {
             "{_f}"

+ 1 - 1
examples/core/async.rs

@@ -5,7 +5,7 @@ fn main() {
     dom.rebuild();
 }
 
-const App: FC<()> = |cx, props| {
+const App: Component<()> = |cx| {
     let id = cx.scope_id();
     // cx.submit_task(Box::pin(async move { id }));
 

+ 1 - 1
examples/core/contextapi.rs

@@ -6,7 +6,7 @@ struct SomeContext {
 }
 
 #[allow(unused)]
-static Example: FC<()> = |cx, props| {
+static Example: Component<()> = |cx| {
     todo!()
 
     // let value = cx.use_context(|c: &SomeContext| c.items.last().unwrap());

+ 2 - 2
examples/core/jsframework.rs

@@ -47,9 +47,9 @@ fn Row<'a>((cx, props): Scope<'a, RowProps>) -> Element<'a> {
     };
     cx.render(rsx! {
         tr {
-            // td { class:"col-md-1", "{props.row_id}" }
+            // td { class:"col-md-1", "{cx.props.row_id}" }
             // td { class:"col-md-1", onclick: move |_| { /* run onselect */ }
-            //     a { class: "lbl", "{props.label}" }
+            //     a { class: "lbl", "{cx.props.label}" }
             // }
             // td { class: "col-md-1"
             //     a { class: "remove", onclick: {handler}

+ 5 - 5
examples/core/syntax.rs

@@ -31,9 +31,9 @@ fn html_usage() {
     // let p = rsx!(div { {f} });
 }
 
-static App2: FC<()> = |cx, _| cx.render(rsx!("hello world!"));
+static App2: Component<()> = |cx, _| cx.render(rsx!("hello world!"));
 
-static App: FC<()> = |cx, props| {
+static App: Component<()> = |cx| {
     let name = cx.use_state(|| 0);
 
     cx.render(rsx!(div {
@@ -71,7 +71,7 @@ struct ChildProps {
 
 fn Child<'a>((cx, props): Scope<'a, ChildProps>) -> Element<'a> {
     cx.render(rsx!(div {
-        // {props.children}
+        // {cx.props.children}
     }))
 }
 
@@ -99,7 +99,7 @@ impl<'a> Children<'a> {
     }
 }
 
-static Bapp: FC<()> = |cx, props| {
+static Bapp: Component<()> = |cx| {
     let name = cx.use_state(|| 0);
 
     cx.render(rsx!(
@@ -114,7 +114,7 @@ static Bapp: FC<()> = |cx, props| {
     ))
 };
 
-static Match: FC<()> = |cx, props| {
+static Match: Component<()> = |cx| {
     //
     let b: Box<dyn Fn(NodeFactory) -> VNode> = Box::new(|f| todo!());
 

+ 1 - 1
examples/core/syntax2.rs

@@ -40,7 +40,7 @@ fn t() {
 //     let a = rsx! {
 //         div {
 //             "asd"
-//             "{props.foo}"
+//             "{cx.props.foo}"
 //         }
 //     };
 

+ 1 - 1
examples/core/vdom_usage.rs

@@ -4,7 +4,7 @@ use dioxus_core::{lazynodes::LazyNodes, prelude::*};
 
 // #[async_std::main]
 fn main() {
-    static App: FC<()> =
+    static App: Component<()> =
         |cx, props| cx.render(Some(LazyNodes::new(move |f| f.text(format_args!("hello")))));
 
     let mut dom = VirtualDom::new(App);

+ 12 - 12
examples/core_reference/antipatterns.rs

@@ -32,14 +32,14 @@ use dioxus::prelude::*;
 struct NoKeysProps {
     data: std::collections::HashMap<u32, String>,
 }
-static AntipatternNoKeys: FC<NoKeysProps> = |cx, props| {
+static AntipatternNoKeys: Component<NoKeysProps> = |cx| {
     // WRONG: Make sure to add keys!
     rsx!(cx, ul {
-        {props.data.iter().map(|(k, v)| rsx!(li { "List item: {v}" }))}
+        {cx.props.data.iter().map(|(k, v)| rsx!(li { "List item: {v}" }))}
     });
     // RIGHT: Like this:
     rsx!(cx, ul {
-        {props.data.iter().map(|(k, v)| rsx!(li { key: "{k}", "List item: {v}" }))}
+        {cx.props.data.iter().map(|(k, v)| rsx!(li { key: "{k}", "List item: {v}" }))}
     })
 };
 
@@ -54,7 +54,7 @@ static AntipatternNoKeys: FC<NoKeysProps> = |cx, props| {
 ///
 /// Only Component and Fragment nodes are susceptible to this issue. Dioxus mitigates this with components by providing
 /// an API for registering shared state without the ContextProvider pattern.
-static AntipatternNestedFragments: FC<()> = |cx, props| {
+static AntipatternNestedFragments: Component<()> = |cx| {
     // Try to avoid heavily nesting fragments
     rsx!(cx,
         Fragment {
@@ -82,8 +82,8 @@ static AntipatternNestedFragments: FC<()> = |cx, props| {
 /// However, calling set_state will *not* update the current version of state in the component. This should be easy to
 /// recognize from the function signature, but Dioxus will not update the "live" version of state. Calling `set_state`
 /// merely places a new value in the queue and schedules the component for a future update.
-static AntipatternRelyingOnSetState: FC<()> = |cx, props| {
-    let (state, set_state) = use_state(cx, || "Hello world").classic();
+static AntipatternRelyingOnSetState: Component<()> = |cx| {
+    let (state, set_state) = use_state(&cx, || "Hello world").classic();
     set_state("New state");
     // This will return false! `state` will *still* be "Hello world"
     assert!(state == &"New state");
@@ -99,7 +99,7 @@ static AntipatternRelyingOnSetState: FC<()> = |cx, props| {
 /// - All components must start with an uppercase character
 ///
 /// i.e.: the following component will be rejected when attempted to be used in the rsx! macro
-static antipattern_component: FC<()> = |cx, props| todo!();
+static antipattern_component: Component<()> = |cx, props| todo!();
 
 /// Antipattern: Misusing hooks
 /// ---------------------------
@@ -120,11 +120,11 @@ static antipattern_component: FC<()> = |cx, props| todo!();
 struct MisuedHooksProps {
     should_render_state: bool,
 }
-static AntipatternMisusedHooks: FC<MisuedHooksProps> = |cx, props| {
+static AntipatternMisusedHooks: Component<MisuedHooksProps> = |cx| {
     if props.should_render_state {
         // do not place a hook in the conditional!
         // prefer to move it out of the conditional
-        let (state, set_state) = use_state(cx, || "hello world").classic();
+        let (state, set_state) = use_state(&cx, || "hello world").classic();
         rsx!(cx, div { "{state}" })
     } else {
         rsx!(cx, div { "Not rendering state" })
@@ -153,7 +153,7 @@ static AntipatternMisusedHooks: FC<MisuedHooksProps> = |cx, props| {
 ///         }
 ///     }
 /// })
-static _example: FC<()> = |cx, props| todo!();
+static _example: Component<()> = |cx, props| todo!();
 
 /// Antipattern: publishing components and hooks with all features enabled
 /// ----------------------------------------------------------------------
@@ -171,9 +171,9 @@ static _example: FC<()> = |cx, props| todo!();
 ///
 /// This will only include the `core` dioxus crate which is relatively slim and fast to compile and avoids target-specific
 /// libraries.
-static __example: FC<()> = |cx, props| todo!();
+static __example: Component<()> = |cx, props| todo!();
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         AntipatternNoKeys { data: std::collections::HashMap::new() }
         AntipatternNestedFragments {}

+ 3 - 3
examples/core_reference/basics.rs

@@ -9,7 +9,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             Greeting {
@@ -25,10 +25,10 @@ struct GreetingProps {
     name: &'static str,
 }
 
-static Greeting: FC<GreetingProps> = |cx, props| {
+static Greeting: Component<GreetingProps> = |cx| {
     cx.render(rsx! {
         div {
-            h1 { "Hello, {props.name}!" }
+            h1 { "Hello, {cx.props.name}!" }
             p { "Welcome to the Dioxus framework" }
             br {}
             {cx.children()}

+ 2 - 2
examples/core_reference/children.rs

@@ -18,7 +18,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             Banner {
@@ -31,7 +31,7 @@ pub static Example: FC<()> = |cx, props| {
     })
 };
 
-pub static Banner: FC<()> = |cx, props| {
+pub static Banner: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             h1 { "This is a great banner!" }

+ 7 - 7
examples/core_reference/conditional_rendering.rs

@@ -16,10 +16,10 @@ use dioxus::prelude::*;
 pub struct MyProps {
     should_show: bool,
 }
-pub static Example0: FC<MyProps> = |cx, props| {
+pub static Example0: Component<MyProps> = |cx| {
     cx.render(rsx! {
         div {
-            {props.should_show.then(|| rsx!{
+            {cx.props.should_show.then(|| rsx!{
                 h1 { "showing the title!" }
             })}
         }
@@ -39,7 +39,7 @@ pub static Example0: FC<MyProps> = |cx, props| {
 pub struct MyProps1 {
     should_show: bool,
 }
-pub static Example1: FC<MyProps1> = |cx, props| {
+pub static Example1: Component<MyProps1> = |cx| {
     cx.render(rsx! {
         div {
             // With matching
@@ -77,7 +77,7 @@ pub enum Color {
 pub struct MyProps2 {
     color: Color,
 }
-pub static Example2: FC<MyProps2> = |cx, props| {
+pub static Example2: Component<MyProps2> = |cx| {
     cx.render(rsx! {
         div {
             {match props.color {
@@ -89,9 +89,9 @@ pub static Example2: FC<MyProps2> = |cx, props| {
     })
 };
 
-pub static Example: FC<()> = |cx, props| {
-    let should_show = use_state(cx, || false);
-    let mut color_index = use_state(cx, || 0);
+pub static Example: Component<()> = |cx| {
+    let should_show = use_state(&cx, || false);
+    let mut color_index = use_state(&cx, || 0);
     let color = match *color_index % 2 {
         2 => Color::Green,
         1 => Color::Yellow,

+ 5 - 5
examples/core_reference/controlled_inputs.rs

@@ -1,7 +1,7 @@
 use dioxus::prelude::*;
 fn main() {}
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
 
@@ -10,8 +10,8 @@ pub static Example: FC<()> = |cx, props| {
 };
 
 // A controlled component:
-static ControlledSelect: FC<()> = |cx, props| {
-    let value = use_state(cx, || String::from("Grapefruit"));
+static ControlledSelect: Component<()> = |cx| {
+    let value = use_state(&cx, || String::from("Grapefruit"));
     cx.render(rsx! {
         select { value: "{value}", onchange: move |evt| value.set(evt.value()),
             option { value: "Grapefruit", "Grapefruit"}
@@ -23,8 +23,8 @@ static ControlledSelect: FC<()> = |cx, props| {
 };
 
 // TODO - how do uncontrolled things work?
-static UncontrolledSelect: FC<()> = |cx, props| {
-    let value = use_state(cx, || String::new());
+static UncontrolledSelect: Component<()> = |cx| {
+    let value = use_state(&cx, || String::new());
 
     cx.render(rsx! {
         select {

+ 1 - 1
examples/core_reference/custom_elements.rs

@@ -11,7 +11,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             custom_element {

+ 1 - 1
examples/core_reference/empty.rs

@@ -5,4 +5,4 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| cx.render(rsx! { Fragment {} });
+pub static Example: Component<()> = |cx, props| cx.render(rsx! { Fragment {} });

+ 6 - 6
examples/core_reference/errorhandling.rs

@@ -23,14 +23,14 @@ fn main() {}
 /// This is one way to go about error handling (just toss things away with unwrap).
 /// However, if you get it wrong, the whole app will crash.
 /// This is pretty flimsy.
-static App: FC<()> = |cx, props| {
+static App: Component<()> = |cx| {
     let data = get_data().unwrap();
     cx.render(rsx!( div { "{data}" } ))
 };
 
 /// This is a pretty verbose way of error handling
 /// However, it's still pretty good since we don't panic, just fail to render anything
-static App1: FC<()> = |cx, props| {
+static App1: Component<()> = |cx| {
     let data = match get_data() {
         Some(data) => data,
         None => return None,
@@ -46,7 +46,7 @@ static App1: FC<()> = |cx, props| {
 /// a user is logged in.
 ///
 /// Dioxus will throw an error in the console if the None-path is ever taken.
-static App2: FC<()> = |cx, props| {
+static App2: Component<()> = |cx| {
     let data = get_data()?;
     cx.render(rsx!( div { "{data}" } ))
 };
@@ -54,14 +54,14 @@ static App2: FC<()> = |cx, props| {
 /// This is top-tier error handling since it displays a failure state.
 ///
 /// However, the error is lacking in context.
-static App3: FC<()> = |cx, props| match get_data() {
+static App3: Component<()> = |cx, props| match get_data() {
     Some(data) => cx.render(rsx!( div { "{data}" } )),
     None => cx.render(rsx!( div { "Failed to load data :(" } )),
 };
 
 /// For errors that return results, it's possible to short-circuit the match-based error handling with `.ok()` which converts
 /// a Result<T, V> into an Option<T> and lets you abort rendering by early-returning `None`
-static App4: FC<()> = |cx, props| {
+static App4: Component<()> = |cx| {
     let data = get_data_err().ok()?;
     cx.render(rsx!( div { "{data}" } ))
 };
@@ -69,7 +69,7 @@ static App4: FC<()> = |cx, props| {
 /// This is great error handling since it displays a failure state... with context!
 ///
 /// Hopefully you'll never need to display a screen like this. It's rather bad taste
-static App5: FC<()> = |cx, props| match get_data_err() {
+static App5: Component<()> = |cx, props| match get_data_err() {
     Ok(data) => cx.render(rsx!( div { "{data}" } )),
     Err(c) => cx.render(rsx!( div { "Failed to load data: {c}" } )),
 };

+ 4 - 4
examples/core_reference/fragments.rs

@@ -11,7 +11,7 @@
 use dioxus::prelude::*;
 
 // Returning multiple elements with rsx! or html!
-static App1: FC<()> = |cx, props| {
+static App1: Component<()> = |cx| {
     cx.render(rsx! {
         h1 { }
         h2 { }
@@ -20,7 +20,7 @@ static App1: FC<()> = |cx, props| {
 };
 
 // Using the Fragment component
-static App2: FC<()> = |cx, props| {
+static App2: Component<()> = |cx| {
     cx.render(rsx! {
         Fragment {
             div {}
@@ -31,7 +31,7 @@ static App2: FC<()> = |cx, props| {
 };
 
 // Using the `fragment` method on the NodeFactory
-static App3: FC<()> = |cx, props| {
+static App3: Component<()> = |cx| {
     cx.render(LazyNodes::new(move |fac| {
         fac.fragment_from_iter([
             fac.text(format_args!("A")),
@@ -42,7 +42,7 @@ static App3: FC<()> = |cx, props| {
     }))
 };
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         App1 {}
         App2 {}

+ 1 - 1
examples/core_reference/global_css.rs

@@ -19,7 +19,7 @@ h1   {color: blue;}
 p    {color: red;}
 "#;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         head { style { "{STYLE}" } }
         body {

+ 2 - 2
examples/core_reference/inline_styles.rs

@@ -10,7 +10,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         head {
             style: { background_color: "powderblue" }
@@ -29,7 +29,7 @@ pub static Example: FC<()> = |cx, props| {
 // .... technically the rsx! macro is slightly broken at the moment and allows styles not wrapped in style {}
 // I haven't noticed any name collisions yet, and am tentatively leaving this behavior in..
 // Don't rely on it.
-static Example2: FC<()> = |cx, props| {
+static Example2: Component<()> = |cx| {
     cx.render(rsx! {
         div { color: "red"
             "hello world!"

+ 2 - 2
examples/core_reference/iterators.rs

@@ -12,8 +12,8 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
-    let example_data = use_state(cx, || 0);
+pub static Example: Component<()> = |cx| {
+    let example_data = use_state(&cx, || 0);
 
     let v = (0..10).map(|f| {
         rsx! {

+ 5 - 5
examples/core_reference/listener.rs

@@ -7,7 +7,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         ButtonList {}
         NonUpdatingEvents {}
@@ -16,8 +16,8 @@ pub static Example: FC<()> = |cx, props| {
 };
 
 /// We can use `set_name` in multiple closures; the closures automatically *copy* the reference to set_name.
-static ButtonList: FC<()> = |cx, props| {
-    let name = use_state(cx, || "...?");
+static ButtonList: Component<()> = |cx| {
+    let name = use_state(&cx, || "...?");
 
     let names = ["jack", "jill", "john", "jane"]
         .iter()
@@ -33,7 +33,7 @@ static ButtonList: FC<()> = |cx, props| {
 
 /// This shows how listeners may be without a visible change in the display.
 /// Check the console.
-static NonUpdatingEvents: FC<()> = |cx, props| {
+static NonUpdatingEvents: Component<()> = |cx| {
     rsx!(cx, div {
         button {
             onclick: move |_| log::info!("Did not cause any updates!")
@@ -42,7 +42,7 @@ static NonUpdatingEvents: FC<()> = |cx, props| {
     })
 };
 
-static DisablePropagation: FC<()> = |cx, props| {
+static DisablePropagation: Component<()> = |cx| {
     rsx!(cx,
         div {
             onclick: move |_| log::info!("event propagated to the div!")

+ 7 - 7
examples/core_reference/memo.rs

@@ -21,7 +21,7 @@ use dioxus::prelude::*;
 
 // By default, components with no props are always memoized.
 // A props of () is considered empty.
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div { "100% memoized!" }
     })
@@ -35,9 +35,9 @@ pub struct MyProps1 {
     name: String,
 }
 
-pub static Example1: FC<MyProps1> = |cx, props| {
+pub static Example1: Component<MyProps1> = |cx| {
     cx.render(rsx! {
-        div { "100% memoized! {props.name}" }
+        div { "100% memoized! {cx.props.name}" }
     })
 };
 
@@ -49,9 +49,9 @@ pub struct MyProps2 {
     name: std::rc::Rc<str>,
 }
 
-pub static Example2: FC<MyProps2> = |cx, props| {
+pub static Example2: Component<MyProps2> = |cx| {
     cx.render(rsx! {
-        div { "100% memoized! {props.name}" }
+        div { "100% memoized! {cx.props.name}" }
     })
 };
 
@@ -61,11 +61,11 @@ pub struct MyProps3<'a> {
     name: &'a str,
 }
 // We need to manually specify a lifetime that ensures props and scope (the component's state) share the same lifetime.
-// Using the `pub static Example: FC<()>` pattern _will_ specify a lifetime, but that lifetime will be static which might
+// Using the `pub static Example: Component<()>` pattern _will_ specify a lifetime, but that lifetime will be static which might
 // not exactly be what you want
 fn Example3<'a>(cx: Context<'a>, props: &'a MyProps3) -> DomTree<'a> {
     cx.render(rsx! {
-        div { "Not memoized! {props.name}" }
+        div { "Not memoized! {cx.props.name}" }
     })
 }
 

+ 1 - 1
examples/core_reference/noderefs.rs

@@ -1,7 +1,7 @@
 use dioxus::prelude::*;
 fn main() {}
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     let p = 10;
 
     cx.render(rsx! {

+ 1 - 1
examples/core_reference/signals.rs

@@ -1,7 +1,7 @@
 use dioxus::prelude::*;
 fn main() {}
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
 

+ 2 - 2
examples/core_reference/spreadpattern.rs

@@ -9,7 +9,7 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     let props = MyProps {
         count: 0,
         live: true,
@@ -27,7 +27,7 @@ pub struct MyProps {
     name: &'static str,
 }
 
-pub static Example1: FC<MyProps> = |cx, MyProps { count, live, name }| {
+pub static Example1: Component<MyProps> = |cx, MyProps { count, live, name }| {
     cx.render(rsx! {
         div {
             h1 { "Hello, {name}"}

+ 1 - 1
examples/core_reference/statemanagement.rs

@@ -1,7 +1,7 @@
 use dioxus::prelude::*;
 fn main() {}
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
 

+ 1 - 1
examples/core_reference/suspense.rs

@@ -14,7 +14,7 @@ struct DogApi {
 }
 const ENDPOINT: &str = "https://dog.ceo/api/breeds/image/random";
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     let doggo = use_suspense(
         cx,
         || surf::get(ENDPOINT).recv_json::<DogApi>(),

+ 3 - 3
examples/core_reference/task.rs

@@ -24,9 +24,9 @@
 
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
-    let count = use_state(cx, || 0);
-    let mut direction = use_state(cx, || 1);
+pub static Example: Component<()> = |cx| {
+    let count = use_state(&cx, || 0);
+    let mut direction = use_state(&cx, || 1);
 
     // Tasks are 'static, so we need to copy relevant items in
     let (async_count, dir) = (count.for_async(), *direction);

+ 1 - 1
examples/core_reference/testing.rs

@@ -1,6 +1,6 @@
 use dioxus::prelude::*;
 
-pub static Example: FC<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     cx.render(rsx! {
         div {
 

+ 4 - 4
examples/core_reference/tostring.rs

@@ -1,13 +1,13 @@
 use dioxus::prelude::*;
 use dioxus::ssr;
 
-pub static Example: FC<()> = |cx, props| {
-    let as_string = use_state(cx, || {
+pub static Example: Component<()> = |cx| {
+    let as_string = use_state(&cx, || {
         // Currently, SSR is only supported for whole VirtualDOMs
         // This is an easy/low hanging fruit to improve upon
         let mut dom = VirtualDom::new(SomeApp);
         dom.rebuild();
-        ssr::render_vdom(&dom, |c| c)
+        ssr::render_vdom(&dom)
     });
 
     cx.render(rsx! {
@@ -15,7 +15,7 @@ pub static Example: FC<()> = |cx, props| {
     })
 };
 
-static SomeApp: FC<()> = |cx, props| {
+static SomeApp: Component<()> = |cx| {
     cx.render(rsx! {
         div { style: {background_color: "blue"}
             h1 {"Some amazing app or component"}

+ 4 - 4
examples/coroutine.rs

@@ -22,14 +22,14 @@
 //! the coroutine was initiated. `use_state` always returns the same setter, so you don't need to worry about
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 use dioxus::prelude::*;
 
-static App: Component<()> = |cx, props| {
-    let p1 = use_state(cx, || 0);
-    let p2 = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let p1 = use_state(&cx, || 0);
+    let p2 = use_state(&cx, || 0);
 
     let (mut p1_async, mut p2_async) = (p1.for_async(), p2.for_async());
     let (p1_handle, _) = use_coroutine(cx, || async move {

+ 7 - 7
examples/crm.rs

@@ -4,7 +4,7 @@ Tiny CRM: A port of the Yew CRM example to Dioxus.
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::web::launch(App, |c| c);
+    dioxus::web::launch(App);
 }
 enum Scene {
     ClientsList,
@@ -19,13 +19,13 @@ pub struct Client {
     pub description: String,
 }
 
-static App: Component<()> = |cx, _| {
-    let mut clients = use_ref(cx, || vec![] as Vec<Client>);
-    let mut scene = use_state(cx, || Scene::ClientsList);
+static App: Component<()> = |cx| {
+    let mut clients = use_ref(&cx, || vec![] as Vec<Client>);
+    let mut scene = use_state(&cx, || Scene::ClientsList);
 
-    let mut firstname = use_state(cx, || String::new());
-    let mut lastname = use_state(cx, || String::new());
-    let mut description = use_state(cx, || String::new());
+    let mut firstname = use_state(&cx, || String::new());
+    let mut lastname = use_state(&cx, || String::new());
+    let mut description = use_state(&cx, || String::new());
 
     let scene = match *scene {
         Scene::ClientsList => {

+ 7 - 7
examples/desktop/crm.rs

@@ -5,7 +5,7 @@ use dioxus_hooks::*;
 use dioxus_html as dioxus_elements;
 
 fn main() {
-    dioxus_desktop::launch(App, |c| c)
+    dioxus_desktop::launch(App)
 }
 
 enum Scene {
@@ -21,13 +21,13 @@ pub struct Client {
     pub description: String,
 }
 
-static App: FC<()> = |cx, _| {
-    let mut scene = use_state(cx, || Scene::ClientsList);
-    let clients = use_ref(cx, || vec![] as Vec<Client>);
+static App: Component<()> = |cx| {
+    let mut scene = use_state(&cx, || Scene::ClientsList);
+    let clients = use_ref(&cx, || vec![] as Vec<Client>);
 
-    let mut firstname = use_state(cx, String::new);
-    let mut lastname = use_state(cx, String::new);
-    let mut description = use_state(cx, String::new);
+    let mut firstname = use_state(&cx, String::new);
+    let mut lastname = use_state(&cx, String::new);
+    let mut description = use_state(&cx, String::new);
 
     let scene = match scene.get() {
         Scene::ClientsList => {

+ 2 - 2
examples/desktop/demo.rs

@@ -5,10 +5,10 @@ use dioxus_core_macro::*;
 use dioxus_html as dioxus_elements;
 
 fn main() {
-    dioxus_desktop::launch(App, |c| c);
+    dioxus_desktop::launch(App);
 }
 
-static App: FC<()> = |cx, props| {
+static App: Component<()> = |cx| {
     cx.render(rsx!(
         div {
             "hello world!"

+ 6 - 6
examples/desktop/todomvc.rs

@@ -14,7 +14,7 @@ fn main() {
         SimpleLogger::new().init().unwrap();
     }
 
-    dioxus_desktop::launch(App, |c| c)
+    dioxus_desktop::launch(App)
 }
 
 #[derive(PartialEq)]
@@ -32,14 +32,14 @@ pub struct TodoItem {
 }
 pub type Todos = HashMap<u32, TodoItem>;
 
-pub static App: FC<()> = |cx, _| {
+pub static App: Component<()> = |cx| {
     // Share our TodoList to the todos themselves
     use_provide_state(cx, Todos::new);
 
     // Save state for the draft, filter
-    let draft = use_state(cx, || "".to_string());
-    let filter = use_state(cx, || FilterState::All);
-    let mut todo_id = use_state(cx, || 0);
+    let draft = use_state(&cx, || "".to_string());
+    let filter = use_state(&cx, || FilterState::All);
+    let mut todo_id = use_state(&cx, || 0);
 
     // Consume the todos
     let todos = use_shared_state::<Todos>(cx)?;
@@ -142,7 +142,7 @@ pub fn TodoEntry((cx, props): Scope<TodoEntryProps>) -> Element {
     let _todos = todos.read();
     let todo = _todos.get(&props.id)?;
 
-    let is_editing = use_state(cx, || false);
+    let is_editing = use_state(&cx, || false);
     let completed = if todo.checked { "completed" } else { "" };
 
     cx.render(rsx!{

+ 12 - 10
examples/file_explorer.rs

@@ -9,7 +9,7 @@ use dioxus::prelude::*;
 
 fn main() {
     simple_logger::init_with_level(log::Level::Debug);
-    dioxus::desktop::launch(App, |c| {
+    dioxus::desktop::launch_cfg(App, |c| {
         c.with_window(|w| {
             w.with_resizable(true).with_inner_size(
                 dioxus::desktop::wry::application::dpi::LogicalSize::new(400.0, 800.0),
@@ -18,8 +18,8 @@ fn main() {
     });
 }
 
-static App: Component<()> = |cx, props| {
-    let file_manager = use_ref(cx, || Files::new());
+static App: Component<()> = |cx| {
+    let file_manager = use_ref(&cx, Files::new);
     let files = file_manager.read();
 
     let file_list = files.path_names.iter().enumerate().map(|(dir_id, path)| {
@@ -39,13 +39,15 @@ static App: Component<()> = |cx, props| {
 
     let current_dir = files.current();
 
-    rsx!(cx, div {
-        h1 {"Files: "}
-        h3 {"Cur dir: {current_dir}"}
-        button { "go up", onclick: move |_| file_manager.write().go_up() }
-        ol { {file_list} }
-        {err_disp}
-    })
+    cx.render(rsx!(
+        div {
+            h1 {"Files: "}
+            h3 {"Cur dir: {current_dir}"}
+            button { "go up", onclick: move |_| file_manager.write().go_up() }
+            ol { {file_list} }
+            {err_disp}
+        }
+    ))
 };
 
 struct Files {

+ 10 - 10
examples/framework_benchmark.rs

@@ -2,8 +2,8 @@ use dioxus::prelude::*;
 use rand::prelude::*;
 
 fn main() {
-    dioxus::web::launch(App, |c| c);
-    // dioxus::desktop::launch(App, |c| c);
+    dioxus::web::launch(App);
+    // dioxus::desktop::launch(App);
 }
 
 #[derive(Clone, PartialEq)]
@@ -30,9 +30,9 @@ impl Label {
     }
 }
 
-static App: Component<()> = |cx, _props| {
-    let mut items = use_ref(cx, || vec![]);
-    let mut selected = use_state(cx, || None);
+static App: Component<()> = |cx| {
+    let mut items = use_ref(&cx, || vec![]);
+    let mut selected = use_state(&cx, || None);
 
     cx.render(rsx! {
         div { class: "container"
@@ -95,10 +95,10 @@ struct ActionButtonProps<'a> {
     onclick: &'a dyn Fn(),
 }
 
-fn ActionButton(cx: Scope, props: &ActionButtonProps) -> Element {
+fn ActionButton<'a>(cx: Scope<'a, ActionButtonProps<'a>>) -> Element {
     rsx!(cx, div { class: "col-sm-6 smallpad"
-        button { class:"btn btn-primary btn-block", r#type: "button", id: "{props.id}",  onclick: move |_| (props.onclick)(),
-            "{props.name}"
+        button { class:"btn btn-primary btn-block", r#type: "button", id: "{cx.props.id}",  onclick: move |_| (props.onclick)(),
+            "{cx.props.name}"
         }
     })
 }
@@ -149,9 +149,9 @@ static NOUNS: &[&str] = &[
 
 // fn Row(cx: Context, props: &RowProps) -> Element {
 //     rsx!(cx, tr {
-//         td { class:"col-md-1", "{props.row_id}" }
+//         td { class:"col-md-1", "{cx.props.row_id}" }
 //         td { class:"col-md-1", onclick: move |_| { /* run onselect */ }
-//             a { class: "lbl", {props.label.labels} }
+//             a { class: "lbl", {cx.props.label.labels} }
 //         }
 //         td { class: "col-md-1"
 //             a { class: "remove", onclick: move |_| {/* remove */}

+ 1 - 1
examples/hello_world.rs

@@ -1,7 +1,7 @@
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 fn App((cx, props): ScopeState<()>) -> Element {

+ 2 - 2
examples/hydration.rs

@@ -19,8 +19,8 @@ fn main() {
     dioxus::desktop::launch(App, |c| c.with_prerendered(content));
 }
 
-static App: Component<()> = |cx, props| {
-    let mut val = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let mut val = use_state(&cx, || 0);
 
     cx.render(rsx! {
         div {

+ 6 - 6
examples/pattern_model.rs

@@ -16,13 +16,13 @@
 //! RefMuts at the same time.
 
 use dioxus::desktop::wry::application::dpi::LogicalSize;
-use dioxus::events::{on::*, KeyCode};
+use dioxus::events::*;
 use dioxus::prelude::*;
 
 const STYLE: &str = include_str!("./assets/calculator.css");
 fn main() {
     env_logger::init();
-    dioxus::desktop::launch(App, |cfg| {
+    dioxus::desktop::launch_cfg(App, |cfg| {
         cfg.with_window(|w| {
             w.with_title("Calculator Demo")
                 .with_resizable(false)
@@ -31,8 +31,8 @@ fn main() {
     });
 }
 
-static App: Component<()> = |cx, props| {
-    let state = use_ref(cx, || Calculator::new());
+static App: Component<()> = |cx| {
+    let state = use_ref(&cx, || Calculator::new());
 
     let clear_display = state.read().display_value.eq("0");
     let clear_text = if clear_display { "C" } else { "AC" };
@@ -80,8 +80,8 @@ struct CalculatorKeyProps<'a> {
 fn CalculatorKey<'a>((cx, props): ScopeState<'a, CalculatorKeyProps<'a>>) -> Element<'a> {
     cx.render(rsx! {
         button {
-            class: "calculator-key {props.name}"
-            onclick: {props.onclick}
+            class: "calculator-key {cx.props.name}"
+            onclick: {cx.props.onclick}
             {&props.children}
         }
     })

+ 3 - 3
examples/pattern_reducer.rs

@@ -8,11 +8,11 @@
 use dioxus::prelude::*;
 fn main() {
     env_logger::init();
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
-pub static App: Component<()> = |cx, _| {
-    let state = use_state(cx, PlayerState::new);
+pub static App: Component<()> = |cx| {
+    let state = use_state(&cx, PlayerState::new);
 
     let is_playing = state.is_playing();
 

+ 3 - 3
examples/readme.rs

@@ -4,11 +4,11 @@
 
 use dioxus::prelude::*;
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
-static App: Component<()> = |cx, props| {
-    let mut count = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let mut count = use_state(&cx, || 0);
 
     cx.render(rsx! {
         div {

+ 1 - 1
examples/router.rs

@@ -23,7 +23,7 @@ pub enum Route {
     NotFound,
 }
 
-static App: Component<()> = |cx, props| {
+static App: Component<()> = |cx| {
     let route = use_router(cx, Route::parse)?;
 
     cx.render(rsx! {

+ 2 - 2
examples/rsx_usage.rs

@@ -39,7 +39,7 @@
 //! - Allow top-level fragments
 //!
 fn main() {
-    dioxus::desktop::launch(Example, |c| c);
+    dioxus::desktop::launch(Example);
 }
 
 /// When trying to return "nothing" to Dioxus, you'll need to specify the type parameter or Rust will be sad.
@@ -49,7 +49,7 @@ const NONE_ELEMENT: Option<()> = None;
 use baller::Baller;
 use dioxus::prelude::*;
 
-pub static Example: Component<()> = |cx, props| {
+pub static Example: Component<()> = |cx| {
     let formatting = "formatting!";
     let formatting_tuple = ("a", "b");
     let lazy_fmt = format_args!("lazily formatted text");

+ 4 - 4
examples/ssr.rs

@@ -5,11 +5,11 @@ use dioxus::ssr;
 
 fn main() {
     let mut vdom = VirtualDom::new(App);
-    // vdom.rebuild_in_place().expect("Rebuilding failed");
-    println!("{}", ssr::render_vdom(&vdom, |c| c));
+    vdom.rebuild_in_place().expect("Rebuilding failed");
+    println!("{}", ssr::render_vdom(&vdom));
 }
 
-static App: Component<()> = |cx, props| {
+static App: Component<()> = |cx| {
     cx.render(rsx!(
         div {
             h1 { "Title" }
@@ -21,6 +21,6 @@ static App: Component<()> = |cx, props| {
 struct MyProps<'a> {
     text: &'a str,
 }
-fn App2(cx: Scope, props: &MyProps) -> Element {
+fn App2<'a>(cx: Scope<'a, MyProps<'a>>) -> Element {
     None
 }

+ 1 - 1
examples/ssr/basic.rs

@@ -12,7 +12,7 @@ fn main() {
     )
 }
 
-pub static App: FC<()> = |cx, props| {
+pub static App: Component<()> = |cx| {
     cx.render(rsx!(
         div {
             class: "overflow-hidden"

+ 3 - 3
examples/ssr/tide.rs

@@ -26,7 +26,7 @@ fn main() {}
 //         dom.rebuild();
 
 //         Ok(Response::builder(200)
-//             .body(format!("{}", dioxus_ssr::render_vdom(&dom, |c| c)))
+//             .body(format!("{}", dioxus_ssr::render_vdom(&dom)))
 //             .content_type(tide::http::mime::HTML)
 //             .build())
 //     });
@@ -42,8 +42,8 @@ fn main() {}
 //     initial_name: String,
 // }
 
-// static Example: FC<ExampleProps> = |cx, props| {
-//     let dispaly_name = use_state(cx, move || props.initial_name.clone());
+// static Example: Component<ExampleProps> = |cx| {
+//     let dispaly_name = use_state(&cx, move || props.initial_name.clone());
 
 //     cx.render(rsx! {
 //         div { class: "py-12 px-4 text-center w-full max-w-2xl mx-auto",

+ 6 - 6
examples/ssr/tofile.rs

@@ -24,7 +24,7 @@ fn main() {
     .unwrap();
 }
 
-pub static App: FC<()> = |cx, props| {
+pub static App: Component<()> = |cx| {
     cx.render(rsx!(
         div { class: "overflow-hidden"
             link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel:"stylesheet" }
@@ -39,7 +39,7 @@ pub static App: FC<()> = |cx, props| {
     ))
 };
 
-pub static Header: FC<()> = |cx, props| {
+pub static Header: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             header { class: "text-gray-400 bg-gray-900 body-font"
@@ -65,7 +65,7 @@ pub static Header: FC<()> = |cx, props| {
     })
 };
 
-pub static Hero: FC<()> = |cx, props| {
+pub static Hero: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -103,7 +103,7 @@ pub static Hero: FC<()> = |cx, props| {
         }
     })
 };
-pub static Entry: FC<()> = |cx, props| {
+pub static Entry: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -116,7 +116,7 @@ pub static Entry: FC<()> = |cx, props| {
     })
 };
 
-pub static StacksIcon: FC<()> = |cx, props| {
+pub static StacksIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             xmlns: "http://www.w3.org/2000/svg"
@@ -131,7 +131,7 @@ pub static StacksIcon: FC<()> = |cx, props| {
         }
     ))
 };
-pub static RightArrowIcon: FC<()> = |cx, props| {
+pub static RightArrowIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             fill: "none"

+ 6 - 6
examples/tailwind.rs

@@ -14,7 +14,7 @@ fn main() {
 
 const STYLE: &str = "body {overflow:hidden;}";
 
-pub static App: Component<()> = |cx, props| {
+pub static App: Component<()> = |cx| {
     cx.render(rsx!(
         div { class: "overflow-hidden"
         style { "{STYLE}" }
@@ -30,7 +30,7 @@ pub static App: Component<()> = |cx, props| {
     ))
 };
 
-pub static Header: Component<()> = |cx, props| {
+pub static Header: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             header { class: "text-gray-400 bg-gray-900 body-font"
@@ -56,7 +56,7 @@ pub static Header: Component<()> = |cx, props| {
     })
 };
 
-pub static Hero: Component<()> = |cx, props| {
+pub static Hero: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -94,7 +94,7 @@ pub static Hero: Component<()> = |cx, props| {
         }
     })
 };
-pub static Entry: Component<()> = |cx, props| {
+pub static Entry: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -107,7 +107,7 @@ pub static Entry: Component<()> = |cx, props| {
     })
 };
 
-pub static StacksIcon: Component<()> = |cx, props| {
+pub static StacksIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             // xmlns: "http://www.w3.org/2000/svg"
@@ -122,7 +122,7 @@ pub static StacksIcon: Component<()> = |cx, props| {
         }
     ))
 };
-pub static RightArrowIcon: Component<()> = |cx, props| {
+pub static RightArrowIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             fill: "none"

+ 3 - 3
examples/tasks.rs

@@ -6,11 +6,11 @@ use std::time::Duration;
 
 use dioxus::prelude::*;
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
-static App: Component<()> = |cx, props| {
-    let mut count = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let mut count = use_state(&cx, || 0);
 
     cx.push_task(async move {
         tokio::time::sleep(Duration::from_millis(100)).await;

+ 8 - 8
examples/todomvc.rs

@@ -4,7 +4,7 @@ use im_rc::HashMap;
 use std::rc::Rc;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 #[derive(PartialEq)]
@@ -22,10 +22,10 @@ pub struct TodoItem {
 }
 
 const STYLE: &str = include_str!("./assets/todomvc.css");
-const App: Component<()> = |cx, props| {
-    let mut draft = use_state(cx, || "".to_string());
-    let mut todos = use_state(cx, || HashMap::<u32, Rc<TodoItem>>::new());
-    let mut filter = use_state(cx, || FilterState::All);
+const App: Component<()> = |cx| {
+    let mut draft = use_state(&cx, || "".to_string());
+    let mut todos = use_state(&cx, || HashMap::<u32, Rc<TodoItem>>::new());
+    let mut filter = use_state(&cx, || FilterState::All);
 
     let todolist = todos
         .iter()
@@ -85,9 +85,9 @@ pub struct TodoEntryProps {
     todo: Rc<TodoItem>,
 }
 
-pub fn TodoEntry(cx: Scope, props: &TodoEntryProps) -> Element {
-    let mut is_editing = use_state(cx, || false);
-    let mut contents = use_state(cx, || String::from(""));
+pub fn TodoEntry(cx: Scope<TodoEntryProps>) -> Element {
+    let mut is_editing = use_state(&cx, || false);
+    let mut contents = use_state(&cx, || String::from(""));
     let todo = &props.todo;
 
     rsx!(cx, li {

+ 3 - 3
examples/weather_app.rs

@@ -7,12 +7,12 @@
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::desktop::launch(App, |c| c);
+    dioxus::desktop::launch(App);
 }
 
 const ENDPOINT: &str = "https://api.openweathermap.org/data/2.5/weather";
 
-static App: Component<()> = |cx, props| {
+static App: Component<()> = |cx| {
     //
     let body = use_suspense(
         cx,
@@ -40,7 +40,7 @@ static App: Component<()> = |cx, props| {
 #[derive(PartialEq, Props)]
 struct WeatherProps {}
 
-static WeatherDisplay: Component<WeatherProps> = |cx, props| {
+static WeatherDisplay: Component<WeatherProps> = |cx| {
     //
     cx.render(rsx!(
         div { class: "flex items-center justify-center flex-col"

+ 3 - 3
examples/web/async_web.rs

@@ -8,7 +8,7 @@ use dioxus_html as dioxus_elements;
 fn main() {
     console_error_panic_hook::set_once();
     wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
-    dioxus_web::launch(APP, |c| c)
+    dioxus_web::launch(APP)
 }
 
 #[derive(serde::Deserialize)]
@@ -16,8 +16,8 @@ struct DogApi {
     message: String,
 }
 
-static APP: FC<()> = |(cx, _props)| {
-    let state = use_state(cx, || 0);
+static APP: Component<()> = |(cx, _props)| {
+    let state = use_state(&cx, || 0);
 
     const ENDPOINT: &str = "https://dog.ceo/api/breeds/image/random/";
     let doggo = use_suspense(

+ 6 - 6
examples/web/basic.rs

@@ -11,13 +11,13 @@ fn main() {
     console_error_panic_hook::set_once();
 
     // Run the app
-    dioxus_web::launch(APP, |c| c)
+    dioxus_web::launch(APP)
 }
 
-static APP: FC<()> = |cx, _| {
-    let mut count = use_state(cx, || 3);
-    let content = use_state(cx, || String::from("h1"));
-    let text_content = use_state(cx, || String::from("Hello, world!"));
+static APP: Component<()> = |cx| {
+    let mut count = use_state(&cx, || 3);
+    let content = use_state(&cx, || String::from("h1"));
+    let text_content = use_state(&cx, || String::from("Hello, world!"));
 
     cx.render(rsx! {
         div {
@@ -86,4 +86,4 @@ fn render_list(cx: Context, count: usize) -> Element {
     rsx!(cx, ul { {items} })
 }
 
-static CHILD: FC<()> = |cx, _| rsx!(cx, div {"hello child"});
+static CHILD: Component<()> = |cx, _| rsx!(cx, div {"hello child"});

+ 3 - 3
examples/web/blah.rs

@@ -21,11 +21,11 @@ fn main() {
     console_error_panic_hook::set_once();
 
     // Run the app
-    dioxus_web::launch(App, |c| c)
+    dioxus_web::launch(App)
 }
 
-static App: FC<()> = |cx, props| {
-    let mut state = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let mut state = use_state(&cx, || 0);
     cx.render(rsx! {
         div {
             style: {

+ 5 - 5
examples/web/btns.rs

@@ -18,12 +18,12 @@ use dioxus_html as dioxus_elements;
 // #[cfg]
 fn main() {
     wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
-    dioxus_web::launch(App, |c| c);
+    dioxus_web::launch(App);
     // env_logger::init();
-    // dioxus::web::launch(App, |c| c);
+    // dioxus::web::launch(App);
 }
 
-static App: FC<()> = |cx, props| {
+static App: Component<()> = |cx| {
     dbg!("rednering parent");
     cx.render(rsx! {
         div {
@@ -40,8 +40,8 @@ static App: FC<()> = |cx, props| {
     })
 };
 
-static But: FC<()> = |cx, props| {
-    let mut count = use_state(cx, || 0);
+static But: Component<()> = |cx| {
+    let mut count = use_state(&cx, || 0);
 
     // let d = Dropper { name: "asd" };
     // let handler = move |_| {

+ 7 - 7
examples/web/crm2.rs

@@ -12,7 +12,7 @@ fn main() {
     wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
     console_error_panic_hook::set_once();
 
-    dioxus_web::launch(App, |c| c)
+    dioxus_web::launch(App)
 }
 
 enum Scene {
@@ -28,13 +28,13 @@ pub struct Client {
     pub description: String,
 }
 
-static App: FC<()> = |cx, _| {
-    let scene = use_state(cx, || Scene::ClientsList);
-    let clients = use_ref(cx, || vec![] as Vec<Client>);
+static App: Component<()> = |cx| {
+    let scene = use_state(&cx, || Scene::ClientsList);
+    let clients = use_ref(&cx, || vec![] as Vec<Client>);
 
-    let firstname = use_state(cx, || String::new());
-    let lastname = use_state(cx, || String::new());
-    let description = use_state(cx, || String::new());
+    let firstname = use_state(&cx, || String::new());
+    let lastname = use_state(&cx, || String::new());
+    let description = use_state(&cx, || String::new());
 
     let scene = match *scene {
         Scene::ClientsList => {

+ 7 - 7
examples/web/demo.rs

@@ -21,10 +21,10 @@ fn main() {
     console_error_panic_hook::set_once();
 
     // Run the app
-    dioxus_web::launch(App, |c| c)
+    dioxus_web::launch(App)
 }
 
-pub static App: FC<()> = |cx, props| {
+pub static App: Component<()> = |cx| {
     cx.render(rsx!(
         div { class: "overflow-hidden"
             link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel:"stylesheet" }
@@ -39,7 +39,7 @@ pub static App: FC<()> = |cx, props| {
     ))
 };
 
-pub static Header: FC<()> = |cx, props| {
+pub static Header: Component<()> = |cx| {
     cx.render(rsx! {
         div {
             header { class: "text-gray-400 bg-gray-900 body-font"
@@ -65,7 +65,7 @@ pub static Header: FC<()> = |cx, props| {
     })
 };
 
-pub static Hero: FC<()> = |cx, props| {
+pub static Hero: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -103,7 +103,7 @@ pub static Hero: FC<()> = |cx, props| {
         }
     })
 };
-pub static Entry: FC<()> = |cx, props| {
+pub static Entry: Component<()> = |cx| {
     //
     cx.render(rsx! {
         section{ class: "text-gray-400 bg-gray-900 body-font"
@@ -116,7 +116,7 @@ pub static Entry: FC<()> = |cx, props| {
     })
 };
 
-pub static StacksIcon: FC<()> = |cx, props| {
+pub static StacksIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             // xmlns: "http://www.w3.org/2000/svg"
@@ -131,7 +131,7 @@ pub static StacksIcon: FC<()> = |cx, props| {
         }
     ))
 };
-pub static RightArrowIcon: FC<()> = |cx, props| {
+pub static RightArrowIcon: Component<()> = |cx| {
     cx.render(rsx!(
         svg {
             fill: "none"

+ 3 - 3
examples/web_tick.rs

@@ -16,10 +16,10 @@ fn main() {
     #[cfg(target_arch = "wasm32")]
     intern_strings();
 
-    dioxus::web::launch(App, |c| c);
+    dioxus::web::launch(App);
 }
 
-static App: Component<()> = |cx, props| {
+static App: Component<()> = |cx| {
     let mut rng = SmallRng::from_entropy();
     let rows = (0..1_000).map(|f| {
         let label = Label::new(&mut rng);
@@ -49,7 +49,7 @@ fn Row((cx, props): ScopeState<RowProps>) -> Element {
     let [adj, col, noun] = props.label.0;
     cx.render(rsx! {
         tr {
-            td { class:"col-md-1", "{props.row_id}" }
+            td { class:"col-md-1", "{cx.props.row_id}" }
             td { class:"col-md-1", onclick: move |_| { /* run onselect */ }
                 a { class: "lbl", "{adj}" "{col}" "{noun}" }
             }

+ 3 - 3
examples/webview_web.rs

@@ -13,11 +13,11 @@
 use dioxus::prelude::*;
 
 fn main() {
-    dioxus::web::launch(App, |c| c);
+    dioxus::web::launch(App);
 }
 
-static App: Component<()> = |cx, props| {
-    let mut count = use_state(cx, || 0);
+static App: Component<()> = |cx| {
+    let mut count = use_state(&cx, || 0);
 
     cx.render(rsx! {
         div {

+ 1 - 1
notes/Parity.md

@@ -12,7 +12,7 @@ https://github.com/rustwasm/gloo
 For example, resize observer would function like this:
 
 ```rust
-pub static Example: FC<()> = |cx, props|{
+pub static Example: Component<()> = |cx, props|{
     let observer = use_resize_observer();
 
     cx.render(rsx!(

+ 5 - 5
notes/SOLVEDPROBLEMS.md

@@ -153,13 +153,13 @@ Notice that LiveComponent receivers (the client-side interpretation of a LiveCom
 The `VNodeTree` type is a very special type that allows VNodes to be created using a pluggable allocator. The html! macro creates something that looks like:
 
 ```rust
-pub static Example: FC<()> = |cx, props|{
+pub static Example: Component<()> = |cx, props|{
     html! { <div> "blah" </div> }
 };
 
 // expands to...
 
-pub static Example: FC<()> = |cx, props|{
+pub static Example: Component<()> = |cx, props|{
     // This function converts a Fn(allocator) -> DomTree closure to a VNode struct that will later be evaluated.
     html_macro_to_vnodetree(move |allocator| {
         let mut node0 = allocator.alloc(VElement::div);
@@ -313,7 +313,7 @@ Here's how react does it:
 Any "dirty" node causes an entire subtree render. Calling "setState" at the very top will cascade all the way down. This is particularly bad for this component design:
 
 ```rust
-static APP: FC<()> = |cx, props|{
+static APP: Component<()> = |cx, props|{
     let title = use_context(Title);
     cx.render(html!{
         <div>
@@ -334,7 +334,7 @@ static APP: FC<()> = |cx, props|{
         </div>
     })
 };
-static HEAVY_LIST: FC<()> = |cx, props|{
+static HEAVY_LIST: Component<()> = |cx, props|{
     cx.render({
         {0.100.map(i => <BigElement >)}
     })
@@ -378,7 +378,7 @@ struct Props {
 
 }
 
-static Component: FC<Props> = |cx, props|{
+static Component: Component<Props> = |cx, props|{
 
 }
 ```

+ 184 - 0
packages/core-macro/CHANGELOG.md

@@ -0,0 +1,184 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## v0.1.2 (2021-12-15)
+
+### Documentation
+
+ - <csr-id-4de16c4779648e591b3869b5df31271ae603c812/> update local examples and docs to support new syntaxes
+ - <csr-id-583fdfa5618e11d660985b97e570d4503be2ff49/> big updates to the reference
+ - <csr-id-d9e6d0925b30690212d1d690dfba288f1a694a27/> examples
+ - <csr-id-daa9bd82c365763fe240528c7df222d230bce613/> more work on docs
+ - <csr-id-e4c06ce8e893779d2aad0883a1bb27d193bc5985/> update cargo tomls
+
+### New Features
+
+ - <csr-id-fd93ee89c19b085a04307ef30217170518defa8e/> upgrade syntax
+ - <csr-id-2cf90b6903411e42f01a801f89037686194ee068/> pull children out of component definition
+ - <csr-id-84fd0c616252bf29cd665782258530032b54d13a/> cleanuup
+ - <csr-id-79503f15c5db04fa04575c8735941a2e3a75030b/> full html support
+ - <csr-id-9726a065b0d4fb1ede5b53a2ddd58c855e51539f/> massage lifetimes
+ - <csr-id-fac42339c272b0e430ebf4f31b6061a0635d3e19/> mutations
+ - <csr-id-4a72b3140bd244da602deada1eeecded65ff5848/> amazingly awesome error handling
+ - <csr-id-a2c7d17b0595769f60bc1c2bbf7cbe32cec37486/> mvoe away from compound context
+ - <csr-id-7dfe89c9581f45a445f17f9fe4bb94e61f67e971/> wire up event delegator for webview
+ - <csr-id-4091846934b4b3b2bc03d3ca8aaf7712aebd4e36/> add aria
+ - <csr-id-e4cdb645aad800484b19ec35ba1f8bb9ccf71d12/> beaf up the use_state hook
+ - <csr-id-7aec40d57e78ec13ff3a90ca8149521cbf1d9ff2/> enable arbitrary body in rsx! macro
+ - <csr-id-22e659c2bd7797ca5a822180aca0cb5d950c5287/> namespaced attributes
+   this commit adds namespaced attributes. This lets us support attribute groups, and thus, inline styles.
+   
+   This namespaced attribute stuff is only available for styles at the moment, though it theoretically could be enabled for any other attributes.
+ - <csr-id-904b26f7111c3fc66400744ff6192e4b20bf6d74/> add edits back! and more webview support!
+   This commit adds a new type - the DomEdit - for serializing the changes made by the diffing machine. The architecture of how DomEdits fit into the cooperative scheduling is still TBD but it will allow us to build change lists without applying them immediately. This is more performant  and allows us to only render parts of the page at a time.
+   
+   This commit also adds more infrastructure around webview. Dioxus can now run on the web, generate static pages, run in the desktop, and run on mobile, with a large part of thanks to webview.
+ - <csr-id-b5e5ef171aa9f8986fb4ab04d793eb63f557c4ae/> two calculator examples
+ - <csr-id-73047fe95678d50fcfd62a4ace7c6b406c5304e1/> props memoization is more powerful
+   This commit solves the memoization , properly memoizing properties that don't have any generic parameters. This is a rough heuristic to prevent non-static lifetimes from creeping into props and breaking our minual lifetime management.
+   
+   Props that have a generic parameter are opted-out of the `partialeq` requirement and props *without* lifetimes must implement partialeq. We're going to leave manual disabling of memoization for future work.
+ - <csr-id-cfa0927cdd40bc3dba22996018605dbad91d0391/> todomvc
+
+### Bug Fixes
+
+ - <csr-id-52c7154897111b570918127ffe3285bb1d5951a0/> really big bug around hooks
+ - <csr-id-27d891934a70424b45e6278b7e2baaa2d1b78b35/> use annotation method from rust/58052 to fix closure lifetimes
+ - <csr-id-ba9e1dbb8fa24048a6c9ccef8a8722688226a845/> messed up how lifetimes worked, need to render once per component
+ - <csr-id-a33f7701fcf5f917fea8719253650b5ad92554fd/> tags
+ - <csr-id-868f6739d2b2c5f2ace0c5240cff8008901e818c/> keyword length
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 113 commits contributed to the release over the course of 329 calendar days.
+ - 106 commits where understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' where seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`0d480a4`](https://github.comgit//DioxusLabs/dioxus/commit/0d480a4c437d424f0eaff486e510a8fd3f3e6584))
+    - keyword length ([`868f673`](https://github.comgit//DioxusLabs/dioxus/commit/868f6739d2b2c5f2ace0c5240cff8008901e818c))
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`b32665d`](https://github.comgit//DioxusLabs/dioxus/commit/b32665d7212a5b9a3e21cb7af7abba63ae399fac))
+    - tags ([`a33f770`](https://github.comgit//DioxusLabs/dioxus/commit/a33f7701fcf5f917fea8719253650b5ad92554fd))
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`3a706ac`](https://github.comgit//DioxusLabs/dioxus/commit/3a706ac4168db137723bea90d7a0058190adfc3c))
+    - update cargo tomls ([`e4c06ce`](https://github.comgit//DioxusLabs/dioxus/commit/e4c06ce8e893779d2aad0883a1bb27d193bc5985))
+    - update local examples and docs to support new syntaxes ([`4de16c4`](https://github.comgit//DioxusLabs/dioxus/commit/4de16c4779648e591b3869b5df31271ae603c812))
+    - docs ([`8814977`](https://github.comgit//DioxusLabs/dioxus/commit/8814977eeebe06748a3b9677a8070e42a037ebd7))
+    - polish ([`8bf57dc`](https://github.comgit//DioxusLabs/dioxus/commit/8bf57dc21dfbcbae5b95650203b68d3f41227652))
+    - really big bug around hooks ([`52c7154`](https://github.comgit//DioxusLabs/dioxus/commit/52c7154897111b570918127ffe3285bb1d5951a0))
+    - rename ([`36d89be`](https://github.comgit//DioxusLabs/dioxus/commit/36d89beb34821694cb0afb546d3b0cb4e01aaae1))
+    - updates to router ([`bab21a0`](https://github.comgit//DioxusLabs/dioxus/commit/bab21a0aa1cbf8e6bd95f823e49f53c082e8d6cc))
+    - add router ([`d298b62`](https://github.comgit//DioxusLabs/dioxus/commit/d298b626d3ae21a39a8ec4426373369ac94edf9f))
+    - docs and router ([`a5f05d7`](https://github.comgit//DioxusLabs/dioxus/commit/a5f05d73acc0e47b05cff64a373482519414bc7c))
+    - upgrade syntax ([`fd93ee8`](https://github.comgit//DioxusLabs/dioxus/commit/fd93ee89c19b085a04307ef30217170518defa8e))
+    - Merge branch 'master' into jk/remove_node_safety ([`db00047`](https://github.comgit//DioxusLabs/dioxus/commit/db0004758c77331cc3b93ea8cf227c060028e12e))
+    - pull children out of component definition ([`2cf90b6`](https://github.comgit//DioxusLabs/dioxus/commit/2cf90b6903411e42f01a801f89037686194ee068))
+    - bubbling in progress ([`a21020e`](https://github.comgit//DioxusLabs/dioxus/commit/a21020ea575e467ba0d608737269fe1b0792dba7))
+    - cleanuup ([`84fd0c6`](https://github.comgit//DioxusLabs/dioxus/commit/84fd0c616252bf29cd665782258530032b54d13a))
+    - clippy happy on macro ([`e1c858d`](https://github.comgit//DioxusLabs/dioxus/commit/e1c858dda5c937a56f402bfb3e8b90baf34b84f1))
+    - remove bump ([`fcc6738`](https://github.comgit//DioxusLabs/dioxus/commit/fcc6738f1703006d7678f31a39bbf6d59464a7e1))
+    - fix some bugs around the rsx macro ([`339e450`](https://github.comgit//DioxusLabs/dioxus/commit/339e450027b4a5d2e1317e13863cd1b2e7ab5853))
+    - full html support ([`79503f1`](https://github.comgit//DioxusLabs/dioxus/commit/79503f15c5db04fa04575c8735941a2e3a75030b))
+    - remove HTML macro and add custom fields ([`9f7eb0f`](https://github.comgit//DioxusLabs/dioxus/commit/9f7eb0f6002156d3e6e14ea2cb24829133b531c5))
+    - use annotation method from rust/58052 to fix closure lifetimes ([`27d8919`](https://github.comgit//DioxusLabs/dioxus/commit/27d891934a70424b45e6278b7e2baaa2d1b78b35))
+    - worked backwards a bit and got it slightly figured out ([`9ee2bfb`](https://github.comgit//DioxusLabs/dioxus/commit/9ee2bfb010ce90ec97e93e173c31aab281db32c4))
+    - massage lifetimes ([`9726a06`](https://github.comgit//DioxusLabs/dioxus/commit/9726a065b0d4fb1ede5b53a2ddd58c855e51539f))
+    - book documentation ([`16dbf4a`](https://github.comgit//DioxusLabs/dioxus/commit/16dbf4a6f84103857385fb4b142a718b0ce72118))
+    - messed up how lifetimes worked, need to render once per component ([`ba9e1db`](https://github.comgit//DioxusLabs/dioxus/commit/ba9e1dbb8fa24048a6c9ccef8a8722688226a845))
+    - major cleanups to scheduler ([`2933e4b`](https://github.comgit//DioxusLabs/dioxus/commit/2933e4bc11b3074c2bde8d76ec55364fca841988))
+    - move everything over to a stack dst ([`0e9d5fc`](https://github.comgit//DioxusLabs/dioxus/commit/0e9d5fc5306ab508d5af6999a4064f9b8b48460f))
+    - remove warnings on core macero ([`6587224`](https://github.comgit//DioxusLabs/dioxus/commit/6587224debffa8e8d5282dc3f120abbaa96f552b))
+    - mutations ([`fac4233`](https://github.comgit//DioxusLabs/dioxus/commit/fac42339c272b0e430ebf4f31b6061a0635d3e19))
+    - bottom up dropping ([`f2334c1`](https://github.comgit//DioxusLabs/dioxus/commit/f2334c17be2612d926361686d7d40a57e3ffe9b9))
+    - fill out the snippets ([`6051b0e`](https://github.comgit//DioxusLabs/dioxus/commit/6051b0ec86927704451f4ce6cdf8f988e59702ae))
+    - amazingly awesome error handling ([`4a72b31`](https://github.comgit//DioxusLabs/dioxus/commit/4a72b3140bd244da602deada1eeecded65ff5848))
+    - big updates to the reference ([`583fdfa`](https://github.comgit//DioxusLabs/dioxus/commit/583fdfa5618e11d660985b97e570d4503be2ff49))
+    - docs, html! macro, more ([`caf772c`](https://github.comgit//DioxusLabs/dioxus/commit/caf772cf249d2f56c8d0b0fa2737ad48e32c6e82))
+    - get keyed diffing compiling ([`0a0be95`](https://github.comgit//DioxusLabs/dioxus/commit/0a0be95c3e58dc065409f02f703b82700c1003f8))
+    - changes to scheduler ([`098d382`](https://github.comgit//DioxusLabs/dioxus/commit/098d3821ed89ad38d99077a6556b48a7e91fc3fc))
+    - clean up warnings ([`b32e261`](https://github.comgit//DioxusLabs/dioxus/commit/b32e2611e37b17c2371ffb10cf1ac647f017d917))
+    - mvoe away from compound context ([`a2c7d17`](https://github.comgit//DioxusLabs/dioxus/commit/a2c7d17b0595769f60bc1c2bbf7cbe32cec37486))
+    - wire up event delegator for webview ([`7dfe89c`](https://github.comgit//DioxusLabs/dioxus/commit/7dfe89c9581f45a445f17f9fe4bb94e61f67e971))
+    - basic support for scheduled rendering ([`c52af22`](https://github.comgit//DioxusLabs/dioxus/commit/c52af221f755601a9e826ffc2c355def138999d0))
+    - solve some issues regarding listeners ([`dfaf5ad`](https://github.comgit//DioxusLabs/dioxus/commit/dfaf5adee164f44a679ab21d730caaab3610e01f))
+    - change in cx to cx ([`9971ff2`](https://github.comgit//DioxusLabs/dioxus/commit/9971ff215db6f771b7ec1cae2517c85d47d38622))
+    - move things into a "shared" object ([`f644d7c`](https://github.comgit//DioxusLabs/dioxus/commit/f644d7c44159eef091552dcc90acbb151ea76b21))
+    - apply formatting ([`a85b8c4`](https://github.comgit//DioxusLabs/dioxus/commit/a85b8c4b6be83f7aba06714b6a1ff0aa5f2ee729))
+    - more upgades to html parser ([`22f894e`](https://github.comgit//DioxusLabs/dioxus/commit/22f894e6b98073bffa39f08b890071ffc00b8d49))
+    - serious refactor with const generics ([`160d86a`](https://github.comgit//DioxusLabs/dioxus/commit/160d86abbe1b325e3123202aef29025dcd96f4eb))
+    - ....sigh..... so the diffing algorithm is robust ([`68ed1c0`](https://github.comgit//DioxusLabs/dioxus/commit/68ed1c04e7e773f9e6c0a5148f0ea89b97b6784e))
+    - add aria ([`4091846`](https://github.comgit//DioxusLabs/dioxus/commit/4091846934b4b3b2bc03d3ca8aaf7712aebd4e36))
+    - move examples around ([`304259d`](https://github.comgit//DioxusLabs/dioxus/commit/304259d8186d1d34224a74c95f4fd7d14126b499))
+    - beaf up the use_state hook ([`e4cdb64`](https://github.comgit//DioxusLabs/dioxus/commit/e4cdb645aad800484b19ec35ba1f8bb9ccf71d12))
+    - enable arbitrary body in rsx! macro ([`7aec40d`](https://github.comgit//DioxusLabs/dioxus/commit/7aec40d57e78ec13ff3a90ca8149521cbf1d9ff2))
+    - move some examples around ([`98a0933`](https://github.comgit//DioxusLabs/dioxus/commit/98a09339fd3190799ea4dd316908f0a53fdf2413))
+    - fix issues with lifetimes ([`a38a81e`](https://github.comgit//DioxusLabs/dioxus/commit/a38a81e1290375cae685f7c49d3745e4298fab26))
+    - namespaced attributes ([`22e659c`](https://github.comgit//DioxusLabs/dioxus/commit/22e659c2bd7797ca5a822180aca0cb5d950c5287))
+    - groundwork for noderefs ([`c1afeba`](https://github.comgit//DioxusLabs/dioxus/commit/c1afeba1efb1a063705466a14648beee08cacb86))
+    - add edits back! and more webview support! ([`904b26f`](https://github.comgit//DioxusLabs/dioxus/commit/904b26f7111c3fc66400744ff6192e4b20bf6d74))
+    - enable more diffing ([`e8f29a8`](https://github.comgit//DioxusLabs/dioxus/commit/e8f29a8f8ac56020bee0048021efa52547307a77))
+    - two calculator examples ([`b5e5ef1`](https://github.comgit//DioxusLabs/dioxus/commit/b5e5ef171aa9f8986fb4ab04d793eb63f557c4ae))
+    - examples ([`d9e6d09`](https://github.comgit//DioxusLabs/dioxus/commit/d9e6d0925b30690212d1d690dfba288f1a694a27))
+    - wip ([`952a91d`](https://github.comgit//DioxusLabs/dioxus/commit/952a91d5408aaf789b496f11d01c3b3f7fcf9059))
+    - rename ctx to cx ([`81382e7`](https://github.comgit//DioxusLabs/dioxus/commit/81382e7044fb3dba61d4abb1e6086b7b29143116))
+    - rethinking stack machine ([`62ae5d3`](https://github.comgit//DioxusLabs/dioxus/commit/62ae5d3bb94cb9ead030ae0b39d9d9bc2b8b4532))
+    - more work on docs ([`daa9bd8`](https://github.comgit//DioxusLabs/dioxus/commit/daa9bd82c365763fe240528c7df222d230bce613))
+    - some cleanup and documentation ([`517d7f1`](https://github.comgit//DioxusLabs/dioxus/commit/517d7f14957c4dae9fc894bfbdcd00a955d09f20))
+    - docs ([`f5683a2`](https://github.comgit//DioxusLabs/dioxus/commit/f5683a23464992ecace463a61414795b5a2c58c8))
+    - pre vnodes instead of vnode ([`fe6938c`](https://github.comgit//DioxusLabs/dioxus/commit/fe6938ceb3dba0796ae8bab52ae41248dc0d3650))
+    - props memoization is more powerful ([`73047fe`](https://github.comgit//DioxusLabs/dioxus/commit/73047fe95678d50fcfd62a4ace7c6b406c5304e1))
+    - merge in some code from the other branch ([`7790750`](https://github.comgit//DioxusLabs/dioxus/commit/7790750349b40055673a0ec16074a0426b84d3b3))
+    - move the rsx macro around ([`50c8b93`](https://github.comgit//DioxusLabs/dioxus/commit/50c8b93aade1bfa83a091fb51ee48638507f89b0))
+    - massive changes to definition of components ([`508c560`](https://github.comgit//DioxusLabs/dioxus/commit/508c560320d78730fa058156421523ffa5695d9d))
+    - move to static props ([`c1fd848`](https://github.comgit//DioxusLabs/dioxus/commit/c1fd848f89b0146581d8e485fa0d4a847387b963))
+    - more progress on parity docs. ([`c5089ba`](https://github.comgit//DioxusLabs/dioxus/commit/c5089ba3c5a8daad4de4d6257604011cc87f6ac7))
+    - buff the readme and docs ([`3cfa1fe`](https://github.comgit//DioxusLabs/dioxus/commit/3cfa1fe125886787f35905ed9b05340a739bc654))
+    - Todomvc in progress ([`b843dbd`](https://github.comgit//DioxusLabs/dioxus/commit/b843dbd3679abf86a34347d87fd4ce5fe9e2aca5))
+    - remove old code ([`3de54d0`](https://github.comgit//DioxusLabs/dioxus/commit/3de54d0b5202aca678d485a68ef8de006a63e21b))
+    - some code health ([`c28697e`](https://github.comgit//DioxusLabs/dioxus/commit/c28697e1fe3136d1835f2b663715f34aab9f4b17))
+    - major overhaul to diffing ([`9810fee`](https://github.comgit//DioxusLabs/dioxus/commit/9810feebf57f93114e3d7faf6de053ac192593a9))
+    - todos ([`8c541f6`](https://github.comgit//DioxusLabs/dioxus/commit/8c541f66d5f7ef2286f2cdf9b0496a9c404471f9))
+    - todomvc ([`cfa0927`](https://github.comgit//DioxusLabs/dioxus/commit/cfa0927cdd40bc3dba22996018605dbad91d0391))
+    - todomvc ([`ce33031`](https://github.comgit//DioxusLabs/dioxus/commit/ce33031519fbbbd207f1dffb75acf62bf59e3c9e))
+    - more ergonomics, more examples ([`0bcff1f`](https://github.comgit//DioxusLabs/dioxus/commit/0bcff1f88e4b1a633b7a9b7c6c2e39b8bd3666c4))
+    - use rsx! inline! ([`44aad27`](https://github.comgit//DioxusLabs/dioxus/commit/44aad2746c117ba9742c86a53327f4f9e96509e7))
+    - building large apps, revamp macro ([`9f7f43b`](https://github.comgit//DioxusLabs/dioxus/commit/9f7f43b6614aaef2d7dded7058e81934f28f5dec))
+    - begint to accept iterator types ([`742f150`](https://github.comgit//DioxusLabs/dioxus/commit/742f150eb3eba89913f5a0fabb229e72e2a0a5ee))
+    - props now autoderives its own trait ([`b3c96a5`](https://github.comgit//DioxusLabs/dioxus/commit/b3c96a5996f434332813c737bb83ad564d91af5f))
+    - staticify? ([`5ad8188`](https://github.comgit//DioxusLabs/dioxus/commit/5ad81885e499bf02ac79e0098f7956d02ee5f2e5))
+    - cargo fix to clean up things ([`78d093a`](https://github.comgit//DioxusLabs/dioxus/commit/78d093a9454386397a991bd01e603e4ad554521f))
+    - wire up props macro ([`37f5a7a`](https://github.comgit//DioxusLabs/dioxus/commit/37f5a7ad33e272a9e210bf480304d54ff0df0d67))
+    - revert FC changes (like the old style). ([`7158bc3`](https://github.comgit//DioxusLabs/dioxus/commit/7158bc3575e180dbe8641549b040e74ae3baf80b))
+    - yeet, synthetic somewhat wired up ([`d959806`](https://github.comgit//DioxusLabs/dioxus/commit/d9598066c2679d9d0b9ca0ce1d3f26110a238cd2))
+    - remove FC ([`92d9521`](https://github.comgit//DioxusLabs/dioxus/commit/92d9521a73aefb620b354ae5954617109dd06e7e))
+    - more cleanup ([`5a9155b`](https://github.comgit//DioxusLabs/dioxus/commit/5a9155b059acc1fb3c8b8accbeca3701ce4f0ab6))
+    - add context to builder ([`cf16090`](https://github.comgit//DioxusLabs/dioxus/commit/cf16090838d127354e333dcbc0b06474835b87d6))
+    - listeners now have scope information ([`fcd68e6`](https://github.comgit//DioxusLabs/dioxus/commit/fcd68e61d2400628469ba193b009e7bf1fd3acdf))
+    - broken, but solved ([`cb74d70`](https://github.comgit//DioxusLabs/dioxus/commit/cb74d70f831b5510f1ee191d91eaff621ffa6256))
+    - accept closures directly in handler ([`f225030`](https://github.comgit//DioxusLabs/dioxus/commit/f225030506967415a21f4af0372477cb5224ee7c))
+    - wowza got it all working ([`4b8e9f4`](https://github.comgit//DioxusLabs/dioxus/commit/4b8e9f4a125b9d55439d919786f33d9d5df234e8))
+    - parse custom rsx syntax ([`da00df6`](https://github.comgit//DioxusLabs/dioxus/commit/da00df66889f4fa2e39651491e08794e1fe78549))
+    - update readme and examples ([`ffaf687`](https://github.comgit//DioxusLabs/dioxus/commit/ffaf6878963981860089c2362947bf77a84c9058))
+    - add core macro crate ([`6a7bf3f`](https://github.comgit//DioxusLabs/dioxus/commit/6a7bf3f964150bcb8f7ba35ad285dd7deff7955c))
+    - add in style crate, and abort any styligng ([`c09b71f`](https://github.comgit//DioxusLabs/dioxus/commit/c09b71f473ceeac7d37cd2b4117786350b6b11b6))
+    - remove html crate ([`9dcee01`](https://github.comgit//DioxusLabs/dioxus/commit/9dcee01b335901cf2c80b453b97180e0d2551dc2))
+    - add core macro crate ([`9f49ecb`](https://github.comgit//DioxusLabs/dioxus/commit/9f49ecbd95b60deb74c646f3798dfde3542c44be))
+    - custom format_args for inlining variables into html templates ([`e4b1f6e`](https://github.comgit//DioxusLabs/dioxus/commit/e4b1f6ea0d0db707cf757dabf8635e9fc91a3e0f))
+    - comment out examples and move lifetime in FC type ([`62d4ad5`](https://github.comgit//DioxusLabs/dioxus/commit/62d4ad58787185032100a2d25e79b70f6ec97a3c))
+    - include the helper ([`07341d2`](https://github.comgit//DioxusLabs/dioxus/commit/07341d2c65dc61b90587e2e5daadf72ec82623a8))
+    - Dioxus-webview ([`9c01736`](https://github.comgit//DioxusLabs/dioxus/commit/9c0173689539210d14847613f9a1694e6cb34506))
+    - update fc_macro ([`28ac37a`](https://github.comgit//DioxusLabs/dioxus/commit/28ac37a8b23874c77011a46a11e6b9cbdf79ecdd))
+    - dioxus frontend crate ([`4d7ac5b`](https://github.comgit//DioxusLabs/dioxus/commit/4d7ac5bb5d3aa1897c0f6c1f322aca08c0c791f0))
+</details>
+

+ 6 - 3
packages/core-macro/Cargo.toml

@@ -1,11 +1,14 @@
 [package]
 name = "dioxus-core-macro"
 version = "0.1.2"
-authors = ["Jonathan Kelley <jkelleyrtp@gmail.com>"]
+authors = ["Jonathan Kelley"]
 edition = "2018"
 description = "Core macro for Dioxus Virtual DOM"
-"license" = "MIT/Apache-2.0"
-
+license = "MIT/Apache-2.0"
+repository = "https://github.com/DioxusLabs/dioxus/"
+homepage = "https://dioxuslabs.com"
+documentation = "https://dioxuslabs.com"
+keywords = ["dom", "ui", "gui", "react", "wasm"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [lib]

+ 2 - 2
packages/core-macro/src/lib.rs

@@ -17,7 +17,7 @@ pub fn format_args_f(input: TokenStream) -> TokenStream {
         .into()
 }
 
-#[proc_macro_derive(Props, attributes(builder))]
+#[proc_macro_derive(Props, attributes(props))]
 pub fn derive_typed_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
     let input = parse_macro_input!(input as syn::DeriveInput);
     match props::impl_my_derive(&input) {
@@ -30,7 +30,7 @@ pub fn derive_typed_builder(input: proc_macro::TokenStream) -> proc_macro::Token
 ///
 /// ## Complete Reference Guide:
 /// ```
-/// const Example: FC<()> = |cx, props|{
+/// const Example: Component<()> = |cx, props|{
 ///     let formatting = "formatting!";
 ///     let formatting_tuple = ("a", "b");
 ///     let lazy_fmt = format_args!("lazily formatted text");

+ 19 - 5
packages/core-macro/src/props/mod.rs

@@ -3,8 +3,8 @@
 //! However, it has been adopted to fit the Dioxus Props builder pattern.
 //!
 //! For dioxus, we make a few changes:
-//! - automatically implement Into<Option> on the setters (IE the strip setter option)
-//! - automatically implement a default of none for optional fields (those explicitly wrapped with Option<T>)
+//! - [ ] automatically implement Into<Option> on the setters (IE the strip setter option)
+//! - [ ] automatically implement a default of none for optional fields (those explicitly wrapped with Option<T>)
 
 use proc_macro2::TokenStream;
 
@@ -194,6 +194,14 @@ mod field_info {
             field_defaults: FieldBuilderAttr,
         ) -> Result<FieldInfo, Error> {
             if let Some(ref name) = field.ident {
+                let mut builder_attr = field_defaults.with(&field.attrs)?;
+
+                // children field is automatically defaulted to None
+                if name == "children" {
+                    builder_attr.default =
+                        Some(syn::parse(quote!(Default::default()).into()).unwrap());
+                }
+
                 Ok(FieldInfo {
                     ordinal,
                     name,
@@ -202,7 +210,7 @@ mod field_info {
                         proc_macro2::Span::call_site(),
                     ),
                     ty: &field.ty,
-                    builder_attr: field_defaults.with(&field.attrs)?,
+                    builder_attr,
                 })
             } else {
                 Err(Error::new(field.span(), "Nameless field in struct"))
@@ -285,7 +293,7 @@ mod field_info {
         pub fn with(mut self, attrs: &[syn::Attribute]) -> Result<Self, Error> {
             let mut skip_tokens = None;
             for attr in attrs {
-                if path_to_single_string(&attr.path).as_deref() != Some("builder") {
+                if path_to_single_string(&attr.path).as_deref() != Some("props") {
                     continue;
                 }
 
@@ -316,7 +324,7 @@ mod field_info {
             if self.setter.skip && self.default.is_none() {
                 return Err(Error::new_spanned(
                     skip_tokens.unwrap(),
-                    "#[builder(skip)] must be accompanied by default or default_code",
+                    "#[props(skip)] must be accompanied by default or default_code",
                 ));
             }
 
@@ -325,6 +333,7 @@ mod field_info {
 
         pub fn apply_meta(&mut self, expr: syn::Expr) -> Result<(), Error> {
             match expr {
+                // #[props(default = "...")]
                 syn::Expr::Assign(assign) => {
                     let name = expr_to_single_string(&assign.left)
                         .ok_or_else(|| Error::new_spanned(&assign.left, "Expected identifier"))?;
@@ -356,6 +365,8 @@ mod field_info {
                         )),
                     }
                 }
+
+                // uh not sure
                 syn::Expr::Path(path) => {
                     let name = path_to_single_string(&path.path)
                         .ok_or_else(|| Error::new_spanned(&path, "Expected identifier"))?;
@@ -371,6 +382,8 @@ mod field_info {
                         )),
                     }
                 }
+
+                //
                 syn::Expr::Call(call) => {
                     let subsetting_name = if let syn::Expr::Path(path) = &*call.func {
                         path_to_single_string(&path.path)
@@ -398,6 +411,7 @@ mod field_info {
                         )),
                     }
                 }
+
                 syn::Expr::Unary(syn::ExprUnary {
                     op: syn::UnOp::Not(_),
                     expr,

+ 5 - 1
packages/core-macro/src/rsx/ambiguous.rs

@@ -43,7 +43,11 @@ impl Parse for AmbiguousElement {
             if first_char.is_ascii_uppercase() {
                 input.parse::<Component>().map(AmbiguousElement::Component)
             } else {
-                input.parse::<Element>().map(AmbiguousElement::Element)
+                if input.peek2(syn::token::Paren) {
+                    input.parse::<Component>().map(AmbiguousElement::Component)
+                } else {
+                    input.parse::<Element>().map(AmbiguousElement::Element)
+                }
             }
         } else {
             Err(Error::new(input.span(), "Not a valid Html tag"))

+ 8 - 1
packages/core-macro/src/rsx/component.rs

@@ -39,7 +39,14 @@ impl Parse for Component {
 
         // parse the guts
         let content: ParseBuffer;
-        syn::braced!(content in stream);
+
+        // if we see a `{` then we have a block
+        // else parse as a function-like call
+        if stream.peek(token::Brace) {
+            syn::braced!(content in stream);
+        } else {
+            syn::parenthesized!(content in stream);
+        }
 
         let cfg: BodyConfig = BodyConfig {
             allow_children: true,

+ 538 - 0
packages/core/CHANGELOG.md

@@ -0,0 +1,538 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## v0.1.3 (2021-12-15)
+
+### Documentation
+
+ - <csr-id-4de16c4779648e591b3869b5df31271ae603c812/> update local examples and docs to support new syntaxes
+ - <csr-id-e495b09bf1c99950b5ea8647b371f296dc64afbe/> fix table
+ - <csr-id-9874f342e2bc1116410142c691545d75b0e0d6fe/> more docs
+ - <csr-id-54d050cf897131ddc4f53651f1aeedaf03f23f57/> strong improvmenets, first major section done
+ - <csr-id-9b5f82af7dce18b75a781b86b188bc713860bb99/> start on components
+ - <csr-id-460783ad549818a85db634ed9c39ffce210b98ec/> lnks to projects
+ - <csr-id-583fdfa5618e11d660985b97e570d4503be2ff49/> big updates to the reference
+ - <csr-id-d9e6d0925b30690212d1d690dfba288f1a694a27/> examples
+ - <csr-id-0826fdfee13d26b08cb8a2fa45cbd59cc4f20c25/> more docs
+ - <csr-id-70cd46dbb2a689ae2d512e142b8aee9c80798430/> move around examples
+ - <csr-id-69f5cc3802af136729bc73e5c3d209270d41b184/> move into a fromjs tutorial
+ - <csr-id-7102fe5f984fe8692cf977ea3a43e2973eed4f45/> add some more sources in the core implementation
+ - <csr-id-e4c06ce8e893779d2aad0883a1bb27d193bc5985/> update cargo tomls
+
+### New Features
+
+ - <csr-id-96b3d56e09a38843f7dc6c1047fe2a3923bd8473/> move back to combined cx/props
+ - <csr-id-19df1bda109aba03c40ff631263bcb7035004ca0/> bubbling
+ - <csr-id-8acdd2ea830b995b608d8bac2ef527db8d40e662/> it compiles once more
+ - <csr-id-74c6211408ea0db5916a4e0973a3f9a7208faa44/> should be functional across the boar
+ - <csr-id-55e6dd9701d3710ff17a25581b99b8f159e609b9/> wire tasks up
+ - <csr-id-c10c1f418bf21e0e54b53e2babeb37c672c06901/> wire up linked nodes
+ - <csr-id-9d8c5ca5ab5784b3f17d7ee20a451ee68fd703d6/> it properly bubbles
+ - <csr-id-fd93ee89c19b085a04307ef30217170518defa8e/> upgrade syntax
+ - <csr-id-11757ddf61e1decb1bd1c2bb30455d0bd01a3e95/> fake bubbling
+ - <csr-id-f2234068ba7cd915a00a81e41660d7d6ee1177cc/> events bubble now
+ - <csr-id-2cf90b6903411e42f01a801f89037686194ee068/> pull children out of component definition
+ - <csr-id-84fd0c616252bf29cd665782258530032b54d13a/> cleanuup
+ - <csr-id-79503f15c5db04fa04575c8735941a2e3a75030b/> full html support
+ - <csr-id-6b2645fd80ab20153e7bb51887443e994fbab5cb/> improve FC handling to allow lifetimes of parent
+ - <csr-id-fda2ebc2a22965845e015384f39f34ce7cb3e428/> improve safety
+ - <csr-id-9726a065b0d4fb1ede5b53a2ddd58c855e51539f/> massage lifetimes
+ - <csr-id-efd0e9b5648c809057f339083ba9d454f810d483/> support desktop more completely
+ - <csr-id-a2b0c50a343005c63c7032bcefb8323b78350bb9/> add update functionality to useref
+ - <csr-id-5502429626023d0788cca352e94ac6ea67c2cb11/> desktop functioning well
+ - <csr-id-4a4c7afca7e1beadd4b213214074fdb420eb0923/> shared state mechanisms
+ - <csr-id-fac42339c272b0e430ebf4f31b6061a0635d3e19/> mutations
+ - <csr-id-687cda1b6d9595357d1dc8720ebe921f61098d8f/> re-enable suspense
+ - <csr-id-4a72b3140bd244da602deada1eeecded65ff5848/> amazingly awesome error handling
+ - <csr-id-d7940aa2ac2017316d62e0f2eac0701dc6ad1f09/> proper handling of events
+ - <csr-id-d717c22d9c5da7b6f343fede11faaf953a3a29e0/> keyed diffing!!
+ - <csr-id-fac2e56ed63fc708a89e14df15f1fc32f58391a9/> update root props
+ - <csr-id-c321532a6cef40b2d2e4adc8c7a55931b6755b08/> some docs, cleaning
+ - <csr-id-1749eba8eb6c8ffa38ab3ad52160b637fe021e86/> more and more sophisticated diff
+ - <csr-id-d618092e9d150589e61516f7bbb169f2db49d3f2/> a new vnode type for anchors
+ - <csr-id-00231adfa2e1d67a9d7ae2fa61c33e3a22d51978/> code quality improvements for core
+ - <csr-id-a2c7d17b0595769f60bc1c2bbf7cbe32cec37486/> mvoe away from compound context
+ - <csr-id-31702dbf878dd0207d101f7869ebefd2bb9f6860/> wire up resource pool
+ - <csr-id-e5c88fe3a49649ecb308decd14c2557963978619/> make hooks free-functions
+ - <csr-id-bfdcb20437c385116fd640e46b6361d09d8d5ff8/> transition to cx, props
+ - <csr-id-f782e142118fb7acf1b88a0f3fbb03e4a5e3e91e/> omg what a dumb mistake
+ - <csr-id-4837d8e741343d26f31b55e4478a374dc761e538/> suspense!
+ - <csr-id-4a0068f09918adbc299150edcf777f342ced0dd3/> bless up, no more segfaults
+ - <csr-id-de9f61bcf48c0d6e35e46c337b72a713c9f9f7d2/> more suspended nodes!
+ - <csr-id-7dfe89c9581f45a445f17f9fe4bb94e61f67e971/> wire up event delegator for webview
+ - <csr-id-0a907b35c647b67172080023462770b761364d51/> fix some lifetime issues
+ - <csr-id-80e6c256980eb3e8c32e30f3dbb43c8b3b9a9cf4/> move over to push based mechanism
+ - <csr-id-e7238762ae518c5688f9339d11832d17f99ad553/> architecture document and edit list
+ - <csr-id-3a57b942624afb8aa6650aeee05466c3c9ce967e/> task system works
+   but I broke the other things :(
+ - <csr-id-f457b7113129479cad577237ef21cb735fffe483/> rebuild doesn't return errors
+ - <csr-id-4091846934b4b3b2bc03d3ca8aaf7712aebd4e36/> add aria
+ - <csr-id-c79d9ae674e235c8e9c2c069d24902122b9c7464/> buff up html allowed attributes
+ - <csr-id-bbcb5a0234dbce48ffeb64903c3ec04562a87ad6/> enable components in ssr
+ - <csr-id-0479252a5fba96e554dcf2422a8566e248fc6593/> keyed diffing
+ - <csr-id-9abb0470b7869019d539a2fc21da3872348ae38b/> static node infrastructure and ssr changes
+ - <csr-id-e6f56563bc84516e017b3db06f11fab2549b9a50/> tests and benchmarks
+ - <csr-id-db6d0184aa5aa612bd7229a06f72b4c2ec5f6409/> dedicated mutations module
+ - <csr-id-1cc1679a6ba33ff68d45ad1e964b73230224bc23/> refactor out the hooks implementation
+ - <csr-id-2ce0752a9cd253fee1c8b205400aa191b09c9dcb/> fix compiling
+ - <csr-id-99d94b69aba192be7e41ebe891aca4bb4f6cae88/> move webview to wry
+ - <csr-id-e4cdb645aad800484b19ec35ba1f8bb9ccf71d12/> beaf up the use_state hook
+ - <csr-id-22e659c2bd7797ca5a822180aca0cb5d950c5287/> namespaced attributes
+   this commit adds namespaced attributes. This lets us support attribute groups, and thus, inline styles.
+   
+   This namespaced attribute stuff is only available for styles at the moment, though it theoretically could be enabled for any other attributes.
+ - <csr-id-904b26f7111c3fc66400744ff6192e4b20bf6d74/> add edits back! and more webview support!
+   This commit adds a new type - the DomEdit - for serializing the changes made by the diffing machine. The architecture of how DomEdits fit into the cooperative scheduling is still TBD but it will allow us to build change lists without applying them immediately. This is more performant  and allows us to only render parts of the page at a time.
+   
+   This commit also adds more infrastructure around webview. Dioxus can now run on the web, generate static pages, run in the desktop, and run on mobile, with a large part of thanks to webview.
+ - <csr-id-b5e5ef171aa9f8986fb4ab04d793eb63f557c4ae/> two calculator examples
+ - <csr-id-7665f2c6cf05cea64bb9131381d4ac11cbdeb932/> move to slotmap
+ - <csr-id-f4fb5bb454536d9f108c7e276ce98a8924ab45e1/> integrate serialization and string borrowing
+   This commit adds lifetimes to the diff and realdom methods so consumers may borrow the contents of the DOM for serialization or asynchronous modifications.
+ - <csr-id-9d7ee79826a3b3fb952a70abcbb16dcd3363d2fb/> events work again!
+ - <csr-id-73047fe95678d50fcfd62a4ace7c6b406c5304e1/> props memoization is more powerful
+   This commit solves the memoization , properly memoizing properties that don't have any generic parameters. This is a rough heuristic to prevent non-static lifetimes from creeping into props and breaking our minual lifetime management.
+   
+   Props that have a generic parameter are opted-out of the `partialeq` requirement and props *without* lifetimes must implement partialeq. We're going to leave manual disabling of memoization for future work.
+ - <csr-id-cfa0927cdd40bc3dba22996018605dbad91d0391/> todomvc
+ - <csr-id-d4f1ceaffbc0551ea3b179a101885275690cebec/> somewhat working with rc and weak
+ - <csr-id-89f22906926ccb5aa4cbe3fe1b6d834b06dd91e7/> dyn scope
+ - <csr-id-8329268d39238f030dd703ab4614253e58339e0b/> update builder
+
+### Bug Fixes
+
+ - <csr-id-52c7154897111b570918127ffe3285bb1d5951a0/> really big bug around hooks
+ - <csr-id-601078f9cf78a58d7502a377676ac94f3cf037bf/> desktop and mobile
+ - <csr-id-77686ba329cba0679d0339589a00df77d3c4c1a1/> it compiles again
+ - <csr-id-27d891934a70424b45e6278b7e2baaa2d1b78b35/> use annotation method from rust/58052 to fix closure lifetimes
+ - <csr-id-ba9e1dbb8fa24048a6c9ccef8a8722688226a845/> messed up how lifetimes worked, need to render once per component
+ - <csr-id-478255f40d4de1d2e3f3cc9b6d758b30ff394b39/> all the bugs!
+ - <csr-id-a33f7701fcf5f917fea8719253650b5ad92554fd/> tags
+ - <csr-id-868f6739d2b2c5f2ace0c5240cff8008901e818c/> keyword length
+
+### Performance
+
+ - <csr-id-8b3ac0b57ca073c1451e8d5df93882c9360ca52a/> remove global allocation for props
+ - <csr-id-ea91fc984dc648150acbafd0abb79d9f42aca500/> refcell to cell for hookidx
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 400 commits contributed to the release over the course of 335 calendar days.
+ - 383 commits where understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' where seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`0d480a4`](https://github.comgit//DioxusLabs/dioxus/commit/0d480a4c437d424f0eaff486e510a8fd3f3e6584))
+    - keyword length ([`868f673`](https://github.comgit//DioxusLabs/dioxus/commit/868f6739d2b2c5f2ace0c5240cff8008901e818c))
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`b32665d`](https://github.comgit//DioxusLabs/dioxus/commit/b32665d7212a5b9a3e21cb7af7abba63ae399fac))
+    - tags ([`a33f770`](https://github.comgit//DioxusLabs/dioxus/commit/a33f7701fcf5f917fea8719253650b5ad92554fd))
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`3a706ac`](https://github.comgit//DioxusLabs/dioxus/commit/3a706ac4168db137723bea90d7a0058190adfc3c))
+    - update cargo tomls ([`e4c06ce`](https://github.comgit//DioxusLabs/dioxus/commit/e4c06ce8e893779d2aad0883a1bb27d193bc5985))
+    - Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.0 ([`270dfc9`](https://github.comgit//DioxusLabs/dioxus/commit/270dfc9590b2354d083ea8da5cc0e1a1497d30e0))
+    - update local examples and docs to support new syntaxes ([`4de16c4`](https://github.comgit//DioxusLabs/dioxus/commit/4de16c4779648e591b3869b5df31271ae603c812))
+    - fix table ([`e495b09`](https://github.comgit//DioxusLabs/dioxus/commit/e495b09bf1c99950b5ea8647b371f296dc64afbe))
+    - fix ssr ([`ded9696`](https://github.comgit//DioxusLabs/dioxus/commit/ded9696930ec825e0aba990494790e8be43a73e5))
+    - remove portals completely ([`2fd56e7`](https://github.comgit//DioxusLabs/dioxus/commit/2fd56e76192bc70d5503bfcd6b4127d383dd082c))
+    - some basic cleaning ([`f746793`](https://github.comgit//DioxusLabs/dioxus/commit/f746793890d091d3bca4b7c5261b8b2e2d080512))
+    - go back to noisy lifetime solution ([`8daf7a6`](https://github.comgit//DioxusLabs/dioxus/commit/8daf7a6ed86df72522b089aa2647eea7bee0f3b6))
+    - clean up the core crate ([`e6c6bbd`](https://github.comgit//DioxusLabs/dioxus/commit/e6c6bbdc1ec6a8c251b78c05ca104f006b6fad26))
+    - rename fc to component ([`1e4a599`](https://github.comgit//DioxusLabs/dioxus/commit/1e4a599d14af85a2d1c29a442dd489f8dc8df321))
+    - docs ([`8814977`](https://github.comgit//DioxusLabs/dioxus/commit/8814977eeebe06748a3b9677a8070e42a037ebd7))
+    - polish ([`8bf57dc`](https://github.comgit//DioxusLabs/dioxus/commit/8bf57dc21dfbcbae5b95650203b68d3f41227652))
+    - update hooks ([`597a045`](https://github.comgit//DioxusLabs/dioxus/commit/597a0456f59872bd5dc60d382acdec76a98b1db2))
+    - really big bug around hooks ([`52c7154`](https://github.comgit//DioxusLabs/dioxus/commit/52c7154897111b570918127ffe3285bb1d5951a0))
+    - better desktop support ([`25a8411`](https://github.comgit//DioxusLabs/dioxus/commit/25a8411485e85bb7e3c8f20701d484529efe9a80))
+    - move back to combined cx/props ([`96b3d56`](https://github.comgit//DioxusLabs/dioxus/commit/96b3d56e09a38843f7dc6c1047fe2a3923bd8473))
+    - rename ([`36d89be`](https://github.comgit//DioxusLabs/dioxus/commit/36d89beb34821694cb0afb546d3b0cb4e01aaae1))
+    - bubbling ([`19df1bd`](https://github.comgit//DioxusLabs/dioxus/commit/19df1bda109aba03c40ff631263bcb7035004ca0))
+    - it compiles once more ([`8acdd2e`](https://github.comgit//DioxusLabs/dioxus/commit/8acdd2ea830b995b608d8bac2ef527db8d40e662))
+    - some docs and suspense ([`93d4b8c`](https://github.comgit//DioxusLabs/dioxus/commit/93d4b8ca7c1b133e5dba2a8dc9a310dbe1357001))
+    - update readme ([`9bd56ee`](https://github.comgit//DioxusLabs/dioxus/commit/9bd56ee499dd8d3ce2b382655487d150e5a6cacf))
+    - should be functional across the boar ([`74c6211`](https://github.comgit//DioxusLabs/dioxus/commit/74c6211408ea0db5916a4e0973a3f9a7208faa44))
+    - move examples around ([`1e6e5e6`](https://github.comgit//DioxusLabs/dioxus/commit/1e6e5e611b61571f272289adefc9cdd7d59c4399))
+    - updates to router ([`bab21a0`](https://github.comgit//DioxusLabs/dioxus/commit/bab21a0aa1cbf8e6bd95f823e49f53c082e8d6cc))
+    - wire tasks up ([`55e6dd9`](https://github.comgit//DioxusLabs/dioxus/commit/55e6dd9701d3710ff17a25581b99b8f159e609b9))
+    - wire up linked nodes ([`c10c1f4`](https://github.comgit//DioxusLabs/dioxus/commit/c10c1f418bf21e0e54b53e2babeb37c672c06901))
+    - add router ([`d298b62`](https://github.comgit//DioxusLabs/dioxus/commit/d298b626d3ae21a39a8ec4426373369ac94edf9f))
+    - docs and router ([`a5f05d7`](https://github.comgit//DioxusLabs/dioxus/commit/a5f05d73acc0e47b05cff64a373482519414bc7c))
+    - it properly bubbles ([`9d8c5ca`](https://github.comgit//DioxusLabs/dioxus/commit/9d8c5ca5ab5784b3f17d7ee20a451ee68fd703d6))
+    - upgrade syntax ([`fd93ee8`](https://github.comgit//DioxusLabs/dioxus/commit/fd93ee89c19b085a04307ef30217170518defa8e))
+    - more docs ([`9874f34`](https://github.comgit//DioxusLabs/dioxus/commit/9874f342e2bc1116410142c691545d75b0e0d6fe))
+    - strong improvmenets, first major section done ([`54d050c`](https://github.comgit//DioxusLabs/dioxus/commit/54d050cf897131ddc4f53651f1aeedaf03f23f57))
+    - fake bubbling ([`11757dd`](https://github.comgit//DioxusLabs/dioxus/commit/11757ddf61e1decb1bd1c2bb30455d0bd01a3e95))
+    - remove scopechildren in favor of elements directly ([`574d7fd`](https://github.comgit//DioxusLabs/dioxus/commit/574d7fdb9e72a5254130589f13f9efd31e3d2870))
+    - remove send requirement on root props ([`5a21493`](https://github.comgit//DioxusLabs/dioxus/commit/5a21493fb7162287989bd7c0cd1c496cc3143605))
+    - events bubble now ([`f223406`](https://github.comgit//DioxusLabs/dioxus/commit/f2234068ba7cd915a00a81e41660d7d6ee1177cc))
+    - move hooklist into scope ([`b9fc5fc`](https://github.comgit//DioxusLabs/dioxus/commit/b9fc5fc251b874fe4a9b5bc46718093029c07bad))
+    - Merge branch 'master' into jk/remove_node_safety ([`db00047`](https://github.comgit//DioxusLabs/dioxus/commit/db0004758c77331cc3b93ea8cf227c060028e12e))
+    - bubbling reserves nodes ([`b6262ed`](https://github.comgit//DioxusLabs/dioxus/commit/b6262edd53767bf0d87ed1af3bb0c32612380a23))
+    - move testdom methods into virtualdom ([`d2f0547`](https://github.comgit//DioxusLabs/dioxus/commit/d2f0547692cb8b4594fbec1d9fa0934e169d1706))
+    - pull children out of component definition ([`2cf90b6`](https://github.comgit//DioxusLabs/dioxus/commit/2cf90b6903411e42f01a801f89037686194ee068))
+    - Merge branch 'master' of https://github.com/jkelleyrtp/dioxus ([`60d6eb2`](https://github.comgit//DioxusLabs/dioxus/commit/60d6eb204a10633e5e52f91e855bd12c5cda40f2))
+    - Various typos/grammar/rewording ([`5747e00`](https://github.comgit//DioxusLabs/dioxus/commit/5747e00b27b1b69c4f9c2820e7e78030feaff71e))
+    - bubbling in progress ([`a21020e`](https://github.comgit//DioxusLabs/dioxus/commit/a21020ea575e467ba0d608737269fe1b0792dba7))
+    - cleanup src ([`f2e343c`](https://github.comgit//DioxusLabs/dioxus/commit/f2e343c1548588ad01ddac6e39e5014132cff91c))
+    - move children onto scope ([`f438bbc`](https://github.comgit//DioxusLabs/dioxus/commit/f438bbcfd20be889aac9a9ca8486e5896af1ce14))
+    - desktop and mobile ([`601078f`](https://github.comgit//DioxusLabs/dioxus/commit/601078f9cf78a58d7502a377676ac94f3cf037bf))
+    - start on components ([`9b5f82a`](https://github.comgit//DioxusLabs/dioxus/commit/9b5f82af7dce18b75a781b86b188bc713860bb99))
+    - cleanuup ([`84fd0c6`](https://github.comgit//DioxusLabs/dioxus/commit/84fd0c616252bf29cd665782258530032b54d13a))
+    - it compiles again ([`77686ba`](https://github.comgit//DioxusLabs/dioxus/commit/77686ba329cba0679d0339589a00df77d3c4c1a1))
+    - move debugging virtualdom into its own feature ([`d1b294f`](https://github.comgit//DioxusLabs/dioxus/commit/d1b294fff0c8618e50969ca59f198baf0565777d))
+    - clean up using new children syntax ([`9c13436`](https://github.comgit//DioxusLabs/dioxus/commit/9c1343610b3907bd8c6acadc086bfc9a8c7b3f3e))
+    - fix some bugs around the rsx macro ([`339e450`](https://github.comgit//DioxusLabs/dioxus/commit/339e450027b4a5d2e1317e13863cd1b2e7ab5853))
+    - full html support ([`79503f1`](https://github.comgit//DioxusLabs/dioxus/commit/79503f15c5db04fa04575c8735941a2e3a75030b))
+    - slim deps and upgrade docs ([`83dd49d`](https://github.comgit//DioxusLabs/dioxus/commit/83dd49d89044b618fa371e09f9f34ea28b9fd529))
+    - work on scheduler, async, coroutines, and merge scope into context ([`b56ea6c`](https://github.comgit//DioxusLabs/dioxus/commit/b56ea6c9a99cd747f376aca4a3c439c13f082714))
+    - implement dst magic ([`d4192d0`](https://github.comgit//DioxusLabs/dioxus/commit/d4192d0de2fb352d31f33f2fadfc21de0b1b950c))
+    - working on re-enabling components ([`fffc7ea`](https://github.comgit//DioxusLabs/dioxus/commit/fffc7ea061922120cd2288982a310a87691948cd))
+    - a few things left, slme cleanup ([`289d2f2`](https://github.comgit//DioxusLabs/dioxus/commit/289d2f2518cef937a6fc823495a8bd32f287b84e))
+    - implement lazy nodes properly ([`3e07214`](https://github.comgit//DioxusLabs/dioxus/commit/3e07214272f20a47b168d6431fcb39880cd41a9d))
+    - fix rebuild ([`15c31d5`](https://github.comgit//DioxusLabs/dioxus/commit/15c31d545a84f05fe17254009dc275aac93e7574))
+    - dst drops properly ([`f33510b`](https://github.comgit//DioxusLabs/dioxus/commit/f33510b13fa515e496e6a934650c5a7c61838a39))
+    - remove cx.children. start to move towards a "children" field ([`7b97e00`](https://github.comgit//DioxusLabs/dioxus/commit/7b97e009ec74cd2f134bbb8e576404e7a964db74))
+    - clean up, use old approach to components ([`2559740`](https://github.comgit//DioxusLabs/dioxus/commit/2559740463d298d27a058607c5d80196dc736c11))
+    - dst nodes leak but work ([`62ed920`](https://github.comgit//DioxusLabs/dioxus/commit/62ed9208a44c7aa038613f73ff0573bd2010f4d0))
+    - improve FC handling to allow lifetimes of parent ([`6b2645f`](https://github.comgit//DioxusLabs/dioxus/commit/6b2645fd80ab20153e7bb51887443e994fbab5cb))
+    - improve safety ([`fda2ebc`](https://github.comgit//DioxusLabs/dioxus/commit/fda2ebc2a22965845e015384f39f34ce7cb3e428))
+    - move more stuff out ([`464b457`](https://github.comgit//DioxusLabs/dioxus/commit/464b457b80a40c0ff24386342a0e81ecfeac4723))
+    - try to get lifetimes passed in properly ([`f70b5b4`](https://github.comgit//DioxusLabs/dioxus/commit/f70b5b4e4acf589372f769153968922d2fcfedf1))
+    - listen to clippy ([`f492443`](https://github.comgit//DioxusLabs/dioxus/commit/f49244344c06a6d05edfe041fd3afa59ef89ca21))
+    - remove bumpframe ([`e4cda7c`](https://github.comgit//DioxusLabs/dioxus/commit/e4cda7c2cbba536b045fa7bed1263b78ed33c096))
+    - use annotation method from rust/58052 to fix closure lifetimes ([`27d8919`](https://github.comgit//DioxusLabs/dioxus/commit/27d891934a70424b45e6278b7e2baaa2d1b78b35))
+    - it compiles cleanly ([`fd0c384`](https://github.comgit//DioxusLabs/dioxus/commit/fd0c384daccf89cec408e3ad674ea04c00797eae))
+    - worked backwards a bit and got it slightly figured out ([`9ee2bfb`](https://github.comgit//DioxusLabs/dioxus/commit/9ee2bfb010ce90ec97e93e173c31aab281db32c4))
+    - massage lifetimes ([`9726a06`](https://github.comgit//DioxusLabs/dioxus/commit/9726a065b0d4fb1ede5b53a2ddd58c855e51539f))
+    - book documentation ([`16dbf4a`](https://github.comgit//DioxusLabs/dioxus/commit/16dbf4a6f84103857385fb4b142a718b0ce72118))
+    - more changes to scheduler ([`059294a`](https://github.comgit//DioxusLabs/dioxus/commit/059294ab55e9e945c9aede1fd4b4faf39a7b9ea9))
+    - messed up how lifetimes worked, need to render once per component ([`ba9e1db`](https://github.comgit//DioxusLabs/dioxus/commit/ba9e1dbb8fa24048a6c9ccef8a8722688226a845))
+    - major cleanups to scheduler ([`2933e4b`](https://github.comgit//DioxusLabs/dioxus/commit/2933e4bc11b3074c2bde8d76ec55364fca841988))
+    - move everything over to a stack dst ([`0e9d5fc`](https://github.comgit//DioxusLabs/dioxus/commit/0e9d5fc5306ab508d5af6999a4064f9b8b48460f))
+    - event system ([`1f22a06`](https://github.comgit//DioxusLabs/dioxus/commit/1f22a06a36f72073188b8c9009dd4950b3f4ff9a))
+    - no more lifetimes ([`d96276a`](https://github.comgit//DioxusLabs/dioxus/commit/d96276a715a9f62943909cfc429c9fe47fd28146))
+    - support desktop more completely ([`efd0e9b`](https://github.comgit//DioxusLabs/dioxus/commit/efd0e9b5648c809057f339083ba9d454f810d483))
+    - compiling again with runtime safety ([`857c92f`](https://github.comgit//DioxusLabs/dioxus/commit/857c92f7f096108317b1854715b4dcbeaae6f759))
+    - add update functionality to useref ([`a2b0c50`](https://github.comgit//DioxusLabs/dioxus/commit/a2b0c50a343005c63c7032bcefb8323b78350bb9))
+    - more raw ptrs ([`95bd17e`](https://github.comgit//DioxusLabs/dioxus/commit/95bd17e38fc936dcc9383d0ba8beac5ed64b41eb))
+    - lnks to projects ([`460783a`](https://github.comgit//DioxusLabs/dioxus/commit/460783ad549818a85db634ed9c39ffce210b98ec))
+    - desktop functioning well ([`5502429`](https://github.comgit//DioxusLabs/dioxus/commit/5502429626023d0788cca352e94ac6ea67c2cb11))
+    - remove resource pool in favor of raw ptrs ([`b8d9869`](https://github.comgit//DioxusLabs/dioxus/commit/b8d98698c6056a330fe62f52833504fb1c728bbb))
+    - overhaul event system ([`7a03c1d`](https://github.comgit//DioxusLabs/dioxus/commit/7a03c1d2b48590276b182465679387655fe08f3a))
+    - consolidation, simplification ([`70b983d`](https://github.comgit//DioxusLabs/dioxus/commit/70b983d0909a332d357da9bb07adc263059bce19))
+    - threadsafe ([`82953f2`](https://github.comgit//DioxusLabs/dioxus/commit/82953f2ac37913f83a822333acd0c47e20777d31))
+    - all the bugs! ([`478255f`](https://github.comgit//DioxusLabs/dioxus/commit/478255f40d4de1d2e3f3cc9b6d758b30ff394b39))
+    - ssr ([`71f0df6`](https://github.comgit//DioxusLabs/dioxus/commit/71f0df63745fe5c17468693144c552ea3a0a7101))
+    - shared state mechanisms ([`4a4c7af`](https://github.comgit//DioxusLabs/dioxus/commit/4a4c7afca7e1beadd4b213214074fdb420eb0923))
+    - fix typo ([`4a5041c`](https://github.comgit//DioxusLabs/dioxus/commit/4a5041c5902e1dab99f25ce00d754ac8a5ee30c1))
+    - fix web list issue ([`da4423c`](https://github.comgit//DioxusLabs/dioxus/commit/da4423c141f1f376df5f3f2580e5284831744a7e))
+    - move macro crate out of core ([`7bdad1e`](https://github.comgit//DioxusLabs/dioxus/commit/7bdad1e2e6f67e74c9f67dde2150140cf8a090e8))
+    - portals ([`4a0bb8c`](https://github.comgit//DioxusLabs/dioxus/commit/4a0bb8cf84da7960d7090de3d5f95248318540a3))
+    - polish ([`a5f82be`](https://github.comgit//DioxusLabs/dioxus/commit/a5f82be433309790e0cac07a77e59c996a53796d))
+    - exampels ([`04d16b4`](https://github.comgit//DioxusLabs/dioxus/commit/04d16b41dc9bc06ca0320a9fec27744318e48355))
+    - fix some event stuff for web and core ([`725b4a1`](https://github.comgit//DioxusLabs/dioxus/commit/725b4a1d7f5d629b1b0a163b65bfd93b2f8a151b))
+    - garbage collection ([`dfe9f86`](https://github.comgit//DioxusLabs/dioxus/commit/dfe9f86bfff48ae3166fd41d673245ed142c26f0))
+    - on collaborative scheduling ([`1a32383`](https://github.comgit//DioxusLabs/dioxus/commit/1a323835c8c4f667e5744bbf5447776f1dc51fca))
+    - examples ([`1a2f91e`](https://github.comgit//DioxusLabs/dioxus/commit/1a2f91ed91c13dae553ecde585462ab261b1b95d))
+    - working down warnings ([`958c02a`](https://github.comgit//DioxusLabs/dioxus/commit/958c02a26e86b07431d3e5f51f00afe116656981))
+    - mutations ([`fac4233`](https://github.comgit//DioxusLabs/dioxus/commit/fac42339c272b0e430ebf4f31b6061a0635d3e19))
+    - performance looks good, needs more testing ([`4b6ca05`](https://github.comgit//DioxusLabs/dioxus/commit/4b6ca05f2c3ad647842c858967da9c87f1915825))
+    - add test_dom ([`a652090`](https://github.comgit//DioxusLabs/dioxus/commit/a652090dc5708db334fa7430fededb1bac207880))
+    - bottom up dropping ([`f2334c1`](https://github.comgit//DioxusLabs/dioxus/commit/f2334c17be2612d926361686d7d40a57e3ffe9b9))
+    - cleanup ([`1745a44`](https://github.comgit//DioxusLabs/dioxus/commit/1745a44d949b994b64ea1fb715cbe36963ae7027))
+    - more scheduler work ([`44b4384`](https://github.comgit//DioxusLabs/dioxus/commit/44b43849613a52cee8dc98ea3068095416b201c2))
+    - re-enable suspense ([`687cda1`](https://github.comgit//DioxusLabs/dioxus/commit/687cda1b6d9595357d1dc8720ebe921f61098d8f))
+    - fill out the snippets ([`6051b0e`](https://github.comgit//DioxusLabs/dioxus/commit/6051b0ec86927704451f4ce6cdf8f988e59702ae))
+    - amazingly awesome error handling ([`4a72b31`](https://github.comgit//DioxusLabs/dioxus/commit/4a72b3140bd244da602deada1eeecded65ff5848))
+    - some ideas ([`05c909f`](https://github.comgit//DioxusLabs/dioxus/commit/05c909f320765aec1bf4c1c55ca59ffd5525a2c7))
+    - proper handling of events ([`d7940aa`](https://github.comgit//DioxusLabs/dioxus/commit/d7940aa2ac2017316d62e0f2eac0701dc6ad1f09))
+    - more work on scheduler ([`1cd5e69`](https://github.comgit//DioxusLabs/dioxus/commit/1cd5e697128877e911ece2c9b34ec38d74eeec80))
+    - websys dom working properly ([`cfa0247`](https://github.comgit//DioxusLabs/dioxus/commit/cfa0247cbb1233e1df275374a73f431650a9250f))
+    - big updates to the reference ([`583fdfa`](https://github.comgit//DioxusLabs/dioxus/commit/583fdfa5618e11d660985b97e570d4503be2ff49))
+    - fix invalid is_empty bug ([`c7d2d9d`](https://github.comgit//DioxusLabs/dioxus/commit/c7d2d9d050548f06244caeeedc2c0e0e52eb329f))
+    - more work on rebuild ([`5c3dc0a`](https://github.comgit//DioxusLabs/dioxus/commit/5c3dc0a8741df251dd3cb7f954fae2243df155f7))
+    - keyed diffing!! ([`d717c22`](https://github.comgit//DioxusLabs/dioxus/commit/d717c22d9c5da7b6f343fede11faaf953a3a29e0))
+    - docs, html! macro, more ([`caf772c`](https://github.comgit//DioxusLabs/dioxus/commit/caf772cf249d2f56c8d0b0fa2737ad48e32c6e82))
+    - update root props ([`fac2e56`](https://github.comgit//DioxusLabs/dioxus/commit/fac2e56ed63fc708a89e14df15f1fc32f58391a9))
+    - get keyed diffing compiling ([`0a0be95`](https://github.comgit//DioxusLabs/dioxus/commit/0a0be95c3e58dc065409f02f703b82700c1003f8))
+    - changes to scheduler ([`098d382`](https://github.comgit//DioxusLabs/dioxus/commit/098d3821ed89ad38d99077a6556b48a7e91fc3fc))
+    - some docs, cleaning ([`c321532`](https://github.comgit//DioxusLabs/dioxus/commit/c321532a6cef40b2d2e4adc8c7a55931b6755b08))
+    - more and more sophisticated diff ([`1749eba`](https://github.comgit//DioxusLabs/dioxus/commit/1749eba8eb6c8ffa38ab3ad52160b637fe021e86))
+    - clean up warnings ([`b32e261`](https://github.comgit//DioxusLabs/dioxus/commit/b32e2611e37b17c2371ffb10cf1ac647f017d917))
+    - a new vnode type for anchors ([`d618092`](https://github.comgit//DioxusLabs/dioxus/commit/d618092e9d150589e61516f7bbb169f2db49d3f2))
+    - more cleanup ([`5cbdc57`](https://github.comgit//DioxusLabs/dioxus/commit/5cbdc571e3abe54391aec8f296d7389410b373b6))
+    - more work on bumpframe ([`63a85e4`](https://github.comgit//DioxusLabs/dioxus/commit/63a85e4865929dbd32a1b72ebeac271561e9ed92))
+    - heuristics engine ([`6aaad1c`](https://github.comgit//DioxusLabs/dioxus/commit/6aaad1c9ef97fa407b660aec60999d263c172ecc))
+    - more cleanup in scheduler ([`9f99f46`](https://github.comgit//DioxusLabs/dioxus/commit/9f99f46cfd6355ce46afdf84d60dd049047c6b57))
+    - making progress on diffing and hydration ([`49856cc`](https://github.comgit//DioxusLabs/dioxus/commit/49856ccd6865f88d63765f26d27f7e945b554da0))
+    - code quality improvements for core ([`00231ad`](https://github.comgit//DioxusLabs/dioxus/commit/00231adfa2e1d67a9d7ae2fa61c33e3a22d51978))
+    - mvoe away from compound context ([`a2c7d17`](https://github.comgit//DioxusLabs/dioxus/commit/a2c7d17b0595769f60bc1c2bbf7cbe32cec37486))
+    - examples ([`f1cff84`](https://github.comgit//DioxusLabs/dioxus/commit/f1cff845ce11231cb4b2dd4857f9ca9f0265b925))
+    - wire up resource pool ([`31702db`](https://github.comgit//DioxusLabs/dioxus/commit/31702dbf878dd0207d101f7869ebefd2bb9f6860))
+    - make hooks free-functions ([`e5c88fe`](https://github.comgit//DioxusLabs/dioxus/commit/e5c88fe3a49649ecb308decd14c2557963978619))
+    - more work on suspense and documentation ([`37ed4be`](https://github.comgit//DioxusLabs/dioxus/commit/37ed4bed8cf28eb65465d41e15e8d758cb3d9679))
+    - transition to cx, props ([`bfdcb20`](https://github.comgit//DioxusLabs/dioxus/commit/bfdcb20437c385116fd640e46b6361d09d8d5ff8))
+    - more doc ([`adf202e`](https://github.comgit//DioxusLabs/dioxus/commit/adf202eab9201c69ec455e621c755500329815fe))
+    - cleanup public apis ([`927b05f`](https://github.comgit//DioxusLabs/dioxus/commit/927b05f358221aa4b9c440608704e86c2400ab64))
+    - omg what a dumb mistake ([`f782e14`](https://github.comgit//DioxusLabs/dioxus/commit/f782e142118fb7acf1b88a0f3fbb03e4a5e3e91e))
+    - suspense! ([`4837d8e`](https://github.comgit//DioxusLabs/dioxus/commit/4837d8e741343d26f31b55e4478a374dc761e538))
+    - refactor ([`8b0eb87`](https://github.comgit//DioxusLabs/dioxus/commit/8b0eb87c72ea9d444dee99a8b05643f19fea2634))
+    - bless up, no more segfaults ([`4a0068f`](https://github.comgit//DioxusLabs/dioxus/commit/4a0068f09918adbc299150edcf777f342ced0dd3))
+    - more suspended nodes! ([`de9f61b`](https://github.comgit//DioxusLabs/dioxus/commit/de9f61bcf48c0d6e35e46c337b72a713c9f9f7d2))
+    - more docs ([`34c3107`](https://github.comgit//DioxusLabs/dioxus/commit/34c3107418df89620cb9dfbd9300f89a1fe6e68f))
+    - algo for scheduler finished ([`9ad5e49`](https://github.comgit//DioxusLabs/dioxus/commit/9ad5e4965409464c6ca63b3434bbe182dde26943))
+    - wire up event delegator for webview ([`7dfe89c`](https://github.comgit//DioxusLabs/dioxus/commit/7dfe89c9581f45a445f17f9fe4bb94e61f67e971))
+    - basic support for scheduled rendering ([`c52af22`](https://github.comgit//DioxusLabs/dioxus/commit/c52af221f755601a9e826ffc2c355def138999d0))
+    - feeling goodish about scheduler ([`5f63eda`](https://github.comgit//DioxusLabs/dioxus/commit/5f63eda29473b82ce708ec66e4dd862c3717e958))
+    - fix some lifetime issues ([`0a907b3`](https://github.comgit//DioxusLabs/dioxus/commit/0a907b35c647b67172080023462770b761364d51))
+    - move over to push based mechanism ([`80e6c25`](https://github.comgit//DioxusLabs/dioxus/commit/80e6c256980eb3e8c32e30f3dbb43c8b3b9a9cf4))
+    - bubbling ([`7978a17`](https://github.comgit//DioxusLabs/dioxus/commit/7978a17419be0c1e6a7ddd2c21cfa96b9660038b))
+    - some structure ([`bcaa76a`](https://github.comgit//DioxusLabs/dioxus/commit/bcaa76a37fb7ff48ab3345c594a20fbdcda6074a))
+    - solve some issues regarding listeners ([`dfaf5ad`](https://github.comgit//DioxusLabs/dioxus/commit/dfaf5adee164f44a679ab21d730caaab3610e01f))
+    - architecture document and edit list ([`e723876`](https://github.comgit//DioxusLabs/dioxus/commit/e7238762ae518c5688f9339d11832d17f99ad553))
+    - before scheduler simplify ([`c16b92e`](https://github.comgit//DioxusLabs/dioxus/commit/c16b92ee7ee3a02153d651db1a84c7dc781c26da))
+    - considering making vdom passed verywehre ([`ac3a7b1`](https://github.comgit//DioxusLabs/dioxus/commit/ac3a7b1fbc1665482354ddf4f0de3d6ceb5b400a))
+    - move to slab ([`6084fbc`](https://github.comgit//DioxusLabs/dioxus/commit/6084fbcd11d1669db135098d920488e2c01a7014))
+    - change in cx to cx ([`9971ff2`](https://github.comgit//DioxusLabs/dioxus/commit/9971ff215db6f771b7ec1cae2517c85d47d38622))
+    - more work on scheduler ([`d4d7114`](https://github.comgit//DioxusLabs/dioxus/commit/d4d7114bebe09a5e265a29105a9bdf3b369ecd67))
+    - move things into a "shared" object ([`f644d7c`](https://github.comgit//DioxusLabs/dioxus/commit/f644d7c44159eef091552dcc90acbb151ea76b21))
+    - reduce warnings ([`0ded32e`](https://github.comgit//DioxusLabs/dioxus/commit/0ded32e184a4b48b848b078585fbe1ca61d09b1d))
+    - it compiles again ([`07efb6a`](https://github.comgit//DioxusLabs/dioxus/commit/07efb6a1b656b24eb1ff25c62f84bb529df936b2))
+    - task system works ([`3a57b94`](https://github.comgit//DioxusLabs/dioxus/commit/3a57b942624afb8aa6650aeee05466c3c9ce967e))
+    - more polish on display ([`12afd2b`](https://github.comgit//DioxusLabs/dioxus/commit/12afd2b0f24c6968c1498fcedebb03a06e9bc135))
+    - more overhaul on virtualevents ([`41cc429`](https://github.comgit//DioxusLabs/dioxus/commit/41cc42919d42453f8f2560aa852211364af4ad3d))
+    - cargo fix ([`84c3e9f`](https://github.comgit//DioxusLabs/dioxus/commit/84c3e9fcb11bab921818fbb090632a54dc16423f))
+    - more polish on scopes ([`2386772`](https://github.comgit//DioxusLabs/dioxus/commit/238677208ea93d39e26b17af0c17c4f0b512d007))
+    - more work on priority ([`cef116a`](https://github.comgit//DioxusLabs/dioxus/commit/cef116aa3a435857c9a3a818bcd81de8ef03a771))
+    - cargo fix ([`beceda5`](https://github.comgit//DioxusLabs/dioxus/commit/beceda511c514d743bce17ed19df9dba8675fcda))
+    - polish up some safety stuff and add suspense support in ([`ff1398b`](https://github.comgit//DioxusLabs/dioxus/commit/ff1398b943de14f7573ad13577e83500ed9c146e))
+    - refactor to fix some ownership quirks ([`05e960b`](https://github.comgit//DioxusLabs/dioxus/commit/05e960b6b037d237ddcaf4fef4d33179883b6644))
+    - cargo fix ([`fd03b9d`](https://github.comgit//DioxusLabs/dioxus/commit/fd03b9d252c9e57a281557fbe91786fba2f28e3b))
+    - remove unnecessary import ([`fb0c6d2`](https://github.comgit//DioxusLabs/dioxus/commit/fb0c6d2ea4d1edbf1cec4c78179395114071a520))
+    - fix props update ([`79e8df2`](https://github.comgit//DioxusLabs/dioxus/commit/79e8df26f5a84f5d765921ae307b33db83c14d4e))
+    - more work on web ([`3bf19d8`](https://github.comgit//DioxusLabs/dioxus/commit/3bf19d8106e0cca7749b7346e9b0adfce654d782))
+    - cargo fix ([`c7ca7c2`](https://github.comgit//DioxusLabs/dioxus/commit/c7ca7c227325dee85fec0f1bc7d8ab00cbf68f66))
+    - more clean up ([`5a09ec1`](https://github.comgit//DioxusLabs/dioxus/commit/5a09ec161031abaa01582435839a8077fd80b228))
+    - ricraf polyfill ([`59219b9`](https://github.comgit//DioxusLabs/dioxus/commit/59219b9ef22caa5896046ccaabc8a225cc4b5a53))
+    - cut down on errors ([`775e9e2`](https://github.comgit//DioxusLabs/dioxus/commit/775e9e29b8cde45a13bdae22a6f54b25518e7192))
+    - ....sigh..... so the diffing algorithm is robust ([`68ed1c0`](https://github.comgit//DioxusLabs/dioxus/commit/68ed1c04e7e773f9e6c0a5148f0ea89b97b6784e))
+    - remove global allocation for props ([`8b3ac0b`](https://github.comgit//DioxusLabs/dioxus/commit/8b3ac0b57ca073c1451e8d5df93882c9360ca52a))
+    - ric_raf wired up ([`8b0d04c`](https://github.comgit//DioxusLabs/dioxus/commit/8b0d04ce585596f561f15e92fc087e2c7063eb07))
+    - wip ([`996247a`](https://github.comgit//DioxusLabs/dioxus/commit/996247a1644d91ebb00e2b2188d21cacdc48257b))
+    - lots of changes to diffing ([`ff0a3d1`](https://github.comgit//DioxusLabs/dioxus/commit/ff0a3d1c83a4349a228a742fccc761822f1711d3))
+    - change around how deadline works ([`369b36b`](https://github.comgit//DioxusLabs/dioxus/commit/369b36b2c64a4bc3d4895f1e04b412c4edbf3c99))
+    - rebuild doesn't return errors ([`f457b71`](https://github.comgit//DioxusLabs/dioxus/commit/f457b7113129479cad577237ef21cb735fffe483))
+    - add aria ([`4091846`](https://github.comgit//DioxusLabs/dioxus/commit/4091846934b4b3b2bc03d3ca8aaf7712aebd4e36))
+    - more examples ([`56e7eb8`](https://github.comgit//DioxusLabs/dioxus/commit/56e7eb83a97ebd6d5bcd23464cfb9d718e5ac26d))
+    - tests and documentation ([`da81591`](https://github.comgit//DioxusLabs/dioxus/commit/da8159190b84d13caa9dfe7dea385a809cf84199))
+    - buff up html allowed attributes ([`c79d9ae`](https://github.comgit//DioxusLabs/dioxus/commit/c79d9ae674e235c8e9c2c069d24902122b9c7464))
+    - move examples around ([`304259d`](https://github.comgit//DioxusLabs/dioxus/commit/304259d8186d1d34224a74c95f4fd7d14126b499))
+    - it works but the page is backwards ([`cdcd861`](https://github.comgit//DioxusLabs/dioxus/commit/cdcd8611e87ffb5e24de7b9fe6c656af3053276e))
+    - use the new structure ([`a05047d`](https://github.comgit//DioxusLabs/dioxus/commit/a05047d01e606425fb0d6595e9d27d3e15f32050))
+    - ssr + tide ([`269e81b`](https://github.comgit//DioxusLabs/dioxus/commit/269e81b0fdb32ae0706160cd278cf3a1b731387b))
+    - more test ([`a0a977a`](https://github.comgit//DioxusLabs/dioxus/commit/a0a977a12d4008155fe332ee226f04e5f59acf95))
+    - enable components in ssr ([`bbcb5a0`](https://github.comgit//DioxusLabs/dioxus/commit/bbcb5a0234dbce48ffeb64903c3ec04562a87ad6))
+    - documentation and badges ([`3f68be7`](https://github.comgit//DioxusLabs/dioxus/commit/3f68be79ae326f6d169ee771bf86490aed4d7885))
+    - keyed diffing ([`0479252`](https://github.comgit//DioxusLabs/dioxus/commit/0479252a5fba96e554dcf2422a8566e248fc6593))
+    - static node infrastructure and ssr changes ([`9abb047`](https://github.comgit//DioxusLabs/dioxus/commit/9abb0470b7869019d539a2fc21da3872348ae38b))
+    - naming ([`1a6b238`](https://github.comgit//DioxusLabs/dioxus/commit/1a6b2388299bf005006e23b75c65a09449049f8d))
+    - it works? ([`778baff`](https://github.comgit//DioxusLabs/dioxus/commit/778baffb10c2b14ac350b38229d1b3acfa49ec39))
+    - more refactor for async ([`975fa56`](https://github.comgit//DioxusLabs/dioxus/commit/975fa566f9809f8fa2bb0bdb07fbfc7f855dcaeb))
+    - refactor non_keyed diff ([`082765f`](https://github.comgit//DioxusLabs/dioxus/commit/082765f6873d9ba72d67e3383dfab6c901eb772a))
+    - some project refactor ([`8cfc437`](https://github.comgit//DioxusLabs/dioxus/commit/8cfc437bfe4110d7f984428f01df90bdf8f8d9ec))
+    - tests and benchmarks ([`e6f5656`](https://github.comgit//DioxusLabs/dioxus/commit/e6f56563bc84516e017b3db06f11fab2549b9a50))
+    - some work ([`feab50f`](https://github.comgit//DioxusLabs/dioxus/commit/feab50f24a8ab82a2cf1d02af1c54d13dd539b01))
+    - structure coming together and tests ([`2d541ec`](https://github.comgit//DioxusLabs/dioxus/commit/2d541eca640d15bb56bccb4191b1dc0fe02dfc22))
+    - more refactor ([`58ab51a`](https://github.comgit//DioxusLabs/dioxus/commit/58ab51a4e4e8a2a7b9b03a4c9a136648112d39dc))
+    - compiles again ([`16bfc6d`](https://github.comgit//DioxusLabs/dioxus/commit/16bfc6d2488f7ec0266ff5b174142232fb04849f))
+    - more refactor ([`c811a89`](https://github.comgit//DioxusLabs/dioxus/commit/c811a8982c08a778f1484ed8aa1dd6b991790086))
+    - dedicated mutations module ([`db6d018`](https://github.comgit//DioxusLabs/dioxus/commit/db6d0184aa5aa612bd7229a06f72b4c2ec5f6409))
+    - refactor ([`9276fd7`](https://github.comgit//DioxusLabs/dioxus/commit/9276fd7db78e48c530b8f5dbc317be2d8d51ad7f))
+    - basic creates working properly ([`1622f48`](https://github.comgit//DioxusLabs/dioxus/commit/1622f484b34412110723645cffc4c8c286b6ca80))
+    - refactor out the hooks implementation ([`1cc1679`](https://github.comgit//DioxusLabs/dioxus/commit/1cc1679a6ba33ff68d45ad1e964b73230224bc23))
+    - tests added for new iterative ([`24572b6`](https://github.comgit//DioxusLabs/dioxus/commit/24572b63deec590f810df0b95a12cbd5b0bd61f5))
+    - webview and async ([`eb82051`](https://github.comgit//DioxusLabs/dioxus/commit/eb82051000fe8772b97f879195fc412092228023))
+    - fix compiling ([`2ce0752`](https://github.comgit//DioxusLabs/dioxus/commit/2ce0752a9cd253fee1c8b205400aa191b09c9dcb))
+    - move webview to wry ([`99d94b6`](https://github.comgit//DioxusLabs/dioxus/commit/99d94b69aba192be7e41ebe891aca4bb4f6cae88))
+    - moving over instructions ([`0987760`](https://github.comgit//DioxusLabs/dioxus/commit/098776095844013469f68c0b585f75587c0edd75))
+    - more examples ([`2547da3`](https://github.comgit//DioxusLabs/dioxus/commit/2547da36a089f09d219e7d701efd35f74f66784c))
+    - remove old create ([`7b06820`](https://github.comgit//DioxusLabs/dioxus/commit/7b068202cea3e513cf885826f303df7e4f707afd))
+    - beaf up the use_state hook ([`e4cdb64`](https://github.comgit//DioxusLabs/dioxus/commit/e4cdb645aad800484b19ec35ba1f8bb9ccf71d12))
+    - back to vnode enum ([`64f289a`](https://github.comgit//DioxusLabs/dioxus/commit/64f289a61c18b6b4c1adf785a864171e51615780))
+    - move from recursive to iterative ([`9652ccd`](https://github.comgit//DioxusLabs/dioxus/commit/9652ccdcf19189e2aac9262bcfa30e2b04c36d37))
+    - move CLI into its own "studio" app ([`fd79335`](https://github.comgit//DioxusLabs/dioxus/commit/fd7933561fe81922e4d5d77f6ac3b6f19efb5a90))
+    - working on async diff ([`f41cff5`](https://github.comgit//DioxusLabs/dioxus/commit/f41cff571fd11bb00820c0bf9d147e81ed5a6a53))
+    - more work on scheduler ([`882d695`](https://github.comgit//DioxusLabs/dioxus/commit/882d69571dcc807a5fa3734f14980e5233f895f5))
+    - move some examples around ([`98a0933`](https://github.comgit//DioxusLabs/dioxus/commit/98a09339fd3190799ea4dd316908f0a53fdf2413))
+    - scheduler skeleton ([`9d14faf`](https://github.comgit//DioxusLabs/dioxus/commit/9d14faf62c654e6958b5e5dc444374146977f52c))
+    - remove the scoped trait ([`cca7c5f`](https://github.comgit//DioxusLabs/dioxus/commit/cca7c5fc3a9e341996e2d5a23b981b658e54ea62))
+    - more work on deadline, support immediates ([`5965bee`](https://github.comgit//DioxusLabs/dioxus/commit/5965bee1d143ee50ed24d4bde5176e057bce4363))
+    - move the functions around a bit ([`36542b4`](https://github.comgit//DioxusLabs/dioxus/commit/36542b482f33e5abd58d3d2c40250f6ffac1a99d))
+    - got the structure figured out! ([`97745c6`](https://github.comgit//DioxusLabs/dioxus/commit/97745c6a7f2094deca32c7a1c30890853067848e))
+    - fix issues with lifetimes ([`a38a81e`](https://github.comgit//DioxusLabs/dioxus/commit/a38a81e1290375cae685f7c49d3745e4298fab26))
+    - close on putting it all together ([`85e2dc2`](https://github.comgit//DioxusLabs/dioxus/commit/85e2dc259aba38ec1654ab7581418aaa9c1c543c))
+    - namespaced attributes ([`22e659c`](https://github.comgit//DioxusLabs/dioxus/commit/22e659c2bd7797ca5a822180aca0cb5d950c5287))
+    - groundwork for noderefs ([`c1afeba`](https://github.comgit//DioxusLabs/dioxus/commit/c1afeba1efb1a063705466a14648beee08cacb86))
+    - more work on jank free ([`a44e9fc`](https://github.comgit//DioxusLabs/dioxus/commit/a44e9fcffa4da6dd01966a62575ff4f4832e5fcc))
+    - more examples ([`11f89e5`](https://github.comgit//DioxusLabs/dioxus/commit/11f89e5d338d14a7aeece0a6275c24ae65913ce7))
+    - add edits back! and more webview support! ([`904b26f`](https://github.comgit//DioxusLabs/dioxus/commit/904b26f7111c3fc66400744ff6192e4b20bf6d74))
+    - enable more diffing ([`e8f29a8`](https://github.comgit//DioxusLabs/dioxus/commit/e8f29a8f8ac56020bee0048021efa52547307a77))
+    - two calculator examples ([`b5e5ef1`](https://github.comgit//DioxusLabs/dioxus/commit/b5e5ef171aa9f8986fb4ab04d793eb63f557c4ae))
+    - examples ([`d9e6d09`](https://github.comgit//DioxusLabs/dioxus/commit/d9e6d0925b30690212d1d690dfba288f1a694a27))
+    - wip ([`952a91d`](https://github.comgit//DioxusLabs/dioxus/commit/952a91d5408aaf789b496f11d01c3b3f7fcf9059))
+    - integrate signals ([`93900aa`](https://github.comgit//DioxusLabs/dioxus/commit/93900aac4443db2e63631ed928294af74201a9ff))
+    - move to slotmap ([`7665f2c`](https://github.comgit//DioxusLabs/dioxus/commit/7665f2c6cf05cea64bb9131381d4ac11cbdeb932))
+    - more work on diffing ([`21685fb`](https://github.comgit//DioxusLabs/dioxus/commit/21685fbb164cf58120e9d37e994a25fa7d902b21))
+    - integrate serialization and string borrowing ([`f4fb5bb`](https://github.comgit//DioxusLabs/dioxus/commit/f4fb5bb454536d9f108c7e276ce98a8924ab45e1))
+    - more work on diffing machine ([`9813f23`](https://github.comgit//DioxusLabs/dioxus/commit/9813f23cdf7b32bc058771c91db3f182d6224905))
+    - more work on diffing. ([`ca3b80f`](https://github.comgit//DioxusLabs/dioxus/commit/ca3b80f06929f30a32c4d50387977cc8724daa8d))
+    - stack-based "real child iterator" ([`895cc01`](https://github.comgit//DioxusLabs/dioxus/commit/895cc0142b8c0a380ecc71aa6acb5c9d7820862d))
+    - more docs ([`0826fdf`](https://github.comgit//DioxusLabs/dioxus/commit/0826fdfee13d26b08cb8a2fa45cbd59cc4f20c25))
+    - refcell to cell for hookidx ([`ea91fc9`](https://github.comgit//DioxusLabs/dioxus/commit/ea91fc984dc648150acbafd0abb79d9f42aca500))
+    - rename ctx to cx ([`81382e7`](https://github.comgit//DioxusLabs/dioxus/commit/81382e7044fb3dba61d4abb1e6086b7b29143116))
+    - rethinking stack machine ([`62ae5d3`](https://github.comgit//DioxusLabs/dioxus/commit/62ae5d3bb94cb9ead030ae0b39d9d9bc2b8b4532))
+    - move around examples ([`70cd46d`](https://github.comgit//DioxusLabs/dioxus/commit/70cd46dbb2a689ae2d512e142b8aee9c80798430))
+    - start moving events to rc<event> ([`b9ff95f`](https://github.comgit//DioxusLabs/dioxus/commit/b9ff95fa12c46365fe73b64a4926a506d5da2342))
+    - rename recoil to atoms ([`36ea39a`](https://github.comgit//DioxusLabs/dioxus/commit/36ea39ae30aa3f1fb2d718c0fdf08850c6bfd3ac))
+    - more examples and docs ([`7fbaf69`](https://github.comgit//DioxusLabs/dioxus/commit/7fbaf69cabbdde712bb3fd9e4b2a5dc18b9390e9))
+    - more work on updating syntad ([`47e8960`](https://github.comgit//DioxusLabs/dioxus/commit/47e896038ef3655566f3eda83d1d2adfefbc8862))
+    - some cleanup and documentation ([`517d7f1`](https://github.comgit//DioxusLabs/dioxus/commit/517d7f14957c4dae9fc894bfbdcd00a955d09f20))
+    - pre-diffmachine merge fork ([`424a181`](https://github.comgit//DioxusLabs/dioxus/commit/424a18137f1fa9528408ce96a57e8120251b9ed5))
+    - docs ([`f5683a2`](https://github.comgit//DioxusLabs/dioxus/commit/f5683a23464992ecace463a61414795b5a2c58c8))
+    - pre vnodes instead of vnode ([`fe6938c`](https://github.comgit//DioxusLabs/dioxus/commit/fe6938ceb3dba0796ae8bab52ae41248dc0d3650))
+    - move into a fromjs tutorial ([`69f5cc3`](https://github.comgit//DioxusLabs/dioxus/commit/69f5cc3802af136729bc73e5c3d209270d41b184))
+    - events work again! ([`9d7ee79`](https://github.comgit//DioxusLabs/dioxus/commit/9d7ee79826a3b3fb952a70abcbb16dcd3363d2fb))
+    - successfully building ([`e3d9db0`](https://github.comgit//DioxusLabs/dioxus/commit/e3d9db0847ecc4ff5156929adb6d22e324f93df3))
+    - props memoization is more powerful ([`73047fe`](https://github.comgit//DioxusLabs/dioxus/commit/73047fe95678d50fcfd62a4ace7c6b406c5304e1))
+    - merge in some code from the other branch ([`7790750`](https://github.comgit//DioxusLabs/dioxus/commit/7790750349b40055673a0ec16074a0426b84d3b3))
+    - move the rsx macro around ([`50c8b93`](https://github.comgit//DioxusLabs/dioxus/commit/50c8b93aade1bfa83a091fb51ee48638507f89b0))
+    - add some more sources in the core implementation ([`7102fe5`](https://github.comgit//DioxusLabs/dioxus/commit/7102fe5f984fe8692cf977ea3a43e2973eed4f45))
+    - new approach at direct access to vdom ([`795a54a`](https://github.comgit//DioxusLabs/dioxus/commit/795a54a2e427bc7f2b37e636d50aa300977a42a1))
+    - some docs ([`1919f88`](https://github.comgit//DioxusLabs/dioxus/commit/1919f88f035fadadfc2b9bce6157f2effcd2a4b0))
+    - get diff compiling ([`cff0547`](https://github.comgit//DioxusLabs/dioxus/commit/cff0547f1a3e2e28ba1946f347c161078818ac66))
+    - massive changes to definition of components ([`508c560`](https://github.comgit//DioxusLabs/dioxus/commit/508c560320d78730fa058156421523ffa5695d9d))
+    - moving to IDs ([`79127ea`](https://github.comgit//DioxusLabs/dioxus/commit/79127ea6cdabf62bf91e777aaacb563e3aa5e619))
+    - move to static props ([`c1fd848`](https://github.comgit//DioxusLabs/dioxus/commit/c1fd848f89b0146581d8e485fa0d4a847387b963))
+    - moving to imperative method of dom ([`45ee803`](https://github.comgit//DioxusLabs/dioxus/commit/45ee803609bf94404f22d89ab2a20ce0698271ff))
+    - more progress on parity docs. ([`c5089ba`](https://github.comgit//DioxusLabs/dioxus/commit/c5089ba3c5a8daad4de4d6257604011cc87f6ac7))
+    - dirty hack to enable send + sync on virtual dom ([`4d5c528`](https://github.comgit//DioxusLabs/dioxus/commit/4d5c528b07e61d6cb0ac8fc0c27ce2e0fdf7e7d2))
+    - doesnt share on thread ([`fe67ff9`](https://github.comgit//DioxusLabs/dioxus/commit/fe67ff9fa4c9d5009670c922e192dccedb7cd09a))
+    - recoil ([`ee67654`](https://github.comgit//DioxusLabs/dioxus/commit/ee67654f58aecca91c640fc49451d0b99bc05981))
+    - Todomvc in progress ([`b843dbd`](https://github.comgit//DioxusLabs/dioxus/commit/b843dbd3679abf86a34347d87fd4ce5fe9e2aca5))
+    - introduce children for walking down the tree ([`0d44f00`](https://github.comgit//DioxusLabs/dioxus/commit/0d44f009b0176cb9cf8203374cf534f5af7de63c))
+    - context api wired up ([`24805a0`](https://github.comgit//DioxusLabs/dioxus/commit/24805a02f6a46539ff76ddcd569ecfc336ca2171))
+    - about to consolidate context and scope ([`4c8130c`](https://github.comgit//DioxusLabs/dioxus/commit/4c8130c4e48a4f0eaef53c696154958d6e0ec6f2))
+    - remove old code ([`3de54d0`](https://github.comgit//DioxusLabs/dioxus/commit/3de54d0b5202aca678d485a68ef8de006a63e21b))
+    - abstraction lifetimes work out nicely ([`2284b35`](https://github.comgit//DioxusLabs/dioxus/commit/2284b357823336aafd8c622b466cd4695b78c690))
+    - Clean up repo a bit ([`a99147c`](https://github.comgit//DioxusLabs/dioxus/commit/a99147c85b53b4ee336a94deee463d793cebf572))
+    - some code health ([`c28697e`](https://github.comgit//DioxusLabs/dioxus/commit/c28697e1fe3136d1835f2b663715f34aab9f4b17))
+    - major overhaul to diffing ([`9810fee`](https://github.comgit//DioxusLabs/dioxus/commit/9810feebf57f93114e3d7faf6de053ac192593a9))
+    - Wip ([`c809095`](https://github.comgit//DioxusLabs/dioxus/commit/c809095124d06175e7f49853c34e48d7335573c5))
+    - refactor a bit ([`2eeb8f2`](https://github.comgit//DioxusLabs/dioxus/commit/2eeb8f2386409b53836fab687097d89af7b883c3))
+    - todos ([`8c541f6`](https://github.comgit//DioxusLabs/dioxus/commit/8c541f66d5f7ef2286f2cdf9b0496a9c404471f9))
+    - todomvc ([`cfa0927`](https://github.comgit//DioxusLabs/dioxus/commit/cfa0927cdd40bc3dba22996018605dbad91d0391))
+    - todomvc ([`ce33031`](https://github.comgit//DioxusLabs/dioxus/commit/ce33031519fbbbd207f1dffb75acf62bf59e3c9e))
+    - more ergonomics, more examples ([`0bcff1f`](https://github.comgit//DioxusLabs/dioxus/commit/0bcff1f88e4b1a633b7a9b7c6c2e39b8bd3666c4))
+    - use rsx! inline! ([`44aad27`](https://github.comgit//DioxusLabs/dioxus/commit/44aad2746c117ba9742c86a53327f4f9e96509e7))
+    - building large apps, revamp macro ([`9f7f43b`](https://github.comgit//DioxusLabs/dioxus/commit/9f7f43b6614aaef2d7dded7058e81934f28f5dec))
+    - begint to accept iterator types ([`742f150`](https://github.comgit//DioxusLabs/dioxus/commit/742f150eb3eba89913f5a0fabb229e72e2a0a5ee))
+    - livehost bones ([`7856f2b`](https://github.comgit//DioxusLabs/dioxus/commit/7856f2b1537b52478a6fa1ca55d0a8c5793a91e5))
+    - some stuff related to event listeners. POC for lifecyel ([`5b7887d`](https://github.comgit//DioxusLabs/dioxus/commit/5b7887d76c714d11e0cea5207197ffaac856a0a7))
+    - diffing approach slightly broken ([`4e48e05`](https://github.comgit//DioxusLabs/dioxus/commit/4e48e0514e1caed9f60bcac4048114008ac76439))
+    - remove old macro ([`9d0727e`](https://github.comgit//DioxusLabs/dioxus/commit/9d0727edabbf759dac8a3cffabd7103d08b728c1))
+    - update examples ([`39bd185`](https://github.comgit//DioxusLabs/dioxus/commit/39bd1856f4d7c2364d6ca2c7812ab5d6e71252b9))
+    - ensure mutabality is okay when not double-using the components ([`305ff91`](https://github.comgit//DioxusLabs/dioxus/commit/305ff919effa919ff7ea5db2a71cf21eca106588))
+    - props now autoderives its own trait ([`b3c96a5`](https://github.comgit//DioxusLabs/dioxus/commit/b3c96a5996f434332813c737bb83ad564d91af5f))
+    - somewhat working with rc and weak ([`d4f1cea`](https://github.comgit//DioxusLabs/dioxus/commit/d4f1ceaffbc0551ea3b179a101885275690cebec))
+    - foregin eq from comparapable comp type. ([`ec801ea`](https://github.comgit//DioxusLabs/dioxus/commit/ec801eab167f9be5325ab877e74e2b65d501e129))
+    - staticify? ([`5ad8188`](https://github.comgit//DioxusLabs/dioxus/commit/5ad81885e499bf02ac79e0098f7956d02ee5f2e5))
+    - cargo fix to clean up things ([`78d093a`](https://github.comgit//DioxusLabs/dioxus/commit/78d093a9454386397a991bd01e603e4ad554521f))
+    - implement vcomp fully ([`29751a4`](https://github.comgit//DioxusLabs/dioxus/commit/29751a4babfb46da25446ecf4077bfe9aa695655))
+    - add some docs ([`5abda91`](https://github.comgit//DioxusLabs/dioxus/commit/5abda91892f32fd82a88d902aaefaccaabf07c7d))
+    - update component so build passes ([`8fcd001`](https://github.comgit//DioxusLabs/dioxus/commit/8fcd001677146d83dc8e89402495c4e2a0ccc2f8))
+    - wire up props macro ([`37f5a7a`](https://github.comgit//DioxusLabs/dioxus/commit/37f5a7ad33e272a9e210bf480304d54ff0df0d67))
+    - still a bit stumped on DFS vs BFS ([`3740f81`](https://github.comgit//DioxusLabs/dioxus/commit/3740f81383b45e3300edda9c04f414852a828d12))
+    - Feat:  it's awersome ([`8dc2619`](https://github.comgit//DioxusLabs/dioxus/commit/8dc26195e274874a7de6c806372f9f77a5c82c5d))
+    - revert FC changes (like the old style). ([`7158bc3`](https://github.comgit//DioxusLabs/dioxus/commit/7158bc3575e180dbe8641549b040e74ae3baf80b))
+    - dyn scope ([`89f2290`](https://github.comgit//DioxusLabs/dioxus/commit/89f22906926ccb5aa4cbe3fe1b6d834b06dd91e7))
+    - yeet, synthetic somewhat wired up ([`d959806`](https://github.comgit//DioxusLabs/dioxus/commit/d9598066c2679d9d0b9ca0ce1d3f26110a238cd2))
+    - synthetic events wired up (ish) ([`3087813`](https://github.comgit//DioxusLabs/dioxus/commit/30878135707ea86702a2f1f8c6f269c14576879f))
+    - remove FC ([`92d9521`](https://github.comgit//DioxusLabs/dioxus/commit/92d9521a73aefb620b354ae5954617109dd06e7e))
+    - notes on safety, and inline listeners ([`bdd6be3`](https://github.comgit//DioxusLabs/dioxus/commit/bdd6be309e8fa4c05a03c5cfc164f7564e7c3051))
+    - cleanup edit module ([`c70652a`](https://github.comgit//DioxusLabs/dioxus/commit/c70652a3c91411e816012f79291926a716615d5c))
+    - more cleanup ([`5a9155b`](https://github.comgit//DioxusLabs/dioxus/commit/5a9155b059acc1fb3c8b8accbeca3701ce4f0ab6))
+    - add context to builder ([`cf16090`](https://github.comgit//DioxusLabs/dioxus/commit/cf16090838d127354e333dcbc0b06474835b87d6))
+    - listeners now have scope information ([`fcd68e6`](https://github.comgit//DioxusLabs/dioxus/commit/fcd68e61d2400628469ba193b009e7bf1fd3acdf))
+    - broken, but solved ([`cb74d70`](https://github.comgit//DioxusLabs/dioxus/commit/cb74d70f831b5510f1ee191d91eaff621ffa6256))
+    - use_reducer ([`879e107`](https://github.comgit//DioxusLabs/dioxus/commit/879e107634f596d555f62f8853afcf5b3796b180))
+    - wowza got it all working ([`4b8e9f4`](https://github.comgit//DioxusLabs/dioxus/commit/4b8e9f4a125b9d55439d919786f33d9d5df234e8))
+    - parse custom rsx syntax ([`da00df6`](https://github.comgit//DioxusLabs/dioxus/commit/da00df66889f4fa2e39651491e08794e1fe78549))
+    - update readme and examples ([`ffaf687`](https://github.comgit//DioxusLabs/dioxus/commit/ffaf6878963981860089c2362947bf77a84c9058))
+    - view -> render ([`c8bb392`](https://github.comgit//DioxusLabs/dioxus/commit/c8bb392cadb22ddb41e53a776ab0677945579a9c))
+    - bump core version ([`4997976`](https://github.comgit//DioxusLabs/dioxus/commit/499797626144738ec088ced0ca272c2e7a920c19))
+    - remove html crate ([`9dcee01`](https://github.comgit//DioxusLabs/dioxus/commit/9dcee01b335901cf2c80b453b97180e0d2551dc2))
+    - add core macro crate ([`c32a6ef`](https://github.comgit//DioxusLabs/dioxus/commit/c32a6ef7fe50d8901a0585c7e426ff0b16b1de6e))
+    - bump version for web release ([`422d5ac`](https://github.comgit//DioxusLabs/dioxus/commit/422d5ac5af4c3d05627edd36a623663db158c3dd))
+    - a few bugs, but the event system works! ([`3b30fa6`](https://github.comgit//DioxusLabs/dioxus/commit/3b30fa61b8f1927f22ffec373a3405ddfdefde39))
+    - patch to diff to allow scopes ([`2041c88`](https://github.comgit//DioxusLabs/dioxus/commit/2041c88d07e8d68494bc77a10eaeb4707da078d9))
+    - moving to CbIdx as serializable event system ([`e840f47`](https://github.comgit//DioxusLabs/dioxus/commit/e840f472faf25d8e1d65abeb610daed6a522771d))
+    - custom format_args for inlining variables into html templates ([`e4b1f6e`](https://github.comgit//DioxusLabs/dioxus/commit/e4b1f6ea0d0db707cf757dabf8635e9fc91a3e0f))
+    - begin WIP on html macro ([`a8b1225`](https://github.comgit//DioxusLabs/dioxus/commit/a8b1225c4853a61c7862e1a33eba64b8ed4e06d5))
+    - move webview logic into library ([`32b45e5`](https://github.comgit//DioxusLabs/dioxus/commit/32b45e5ba168390e338a343eef6baba5cca9468b))
+    - comments ([`18a7a1f`](https://github.comgit//DioxusLabs/dioxus/commit/18a7a1f9c40eb3b1ac263cbd21b1daa6da9c7093))
+    - wire up rebuild ([`06ae4fc`](https://github.comgit//DioxusLabs/dioxus/commit/06ae4fc17833ff9695b0645f940b5ea32eeb4ef0))
+    - clean up code ([`8345137`](https://github.comgit//DioxusLabs/dioxus/commit/83451372aa28ba4e137b553f07838a2db06c92da))
+    - fix internal lifecycle ([`5204862`](https://github.comgit//DioxusLabs/dioxus/commit/5204862bc220e55afe8d2f8f4422cb530a6ea1cf))
+    - add css example ([`edf09c1`](https://github.comgit//DioxusLabs/dioxus/commit/edf09c1892f2521f41bf84372629e84bed86e921))
+    - borrowing ([`7a4594e`](https://github.comgit//DioxusLabs/dioxus/commit/7a4594e237acc9864ca9426f6d7002a8ab223d83))
+    - finally solve the component lifetime problem <3 ([`bdc25b5`](https://github.comgit//DioxusLabs/dioxus/commit/bdc25b581b12ee536933032803785d3531b13693))
+    - WIP ctx ([`7a6aabe`](https://github.comgit//DioxusLabs/dioxus/commit/7a6aabe4f39aa38bec7b548d030c11b2d9f481cb))
+    - desktop app wired up ([`b3e6886`](https://github.comgit//DioxusLabs/dioxus/commit/b3e68863514a33291556ce278b7255fdf53e8b50))
+    - remove our use of ouroborous. ([`bcbb93b`](https://github.comgit//DioxusLabs/dioxus/commit/bcbb93b69764dbff0d6130dc0f32bcf58ad7807f))
+    - re-enable stack machine approach ([`e3ede7f`](https://github.comgit//DioxusLabs/dioxus/commit/e3ede7fcbf7acb5d8762bcddb5f1499104bb0ce7))
+    - WIP on deserialize ([`f22ff83`](https://github.comgit//DioxusLabs/dioxus/commit/f22ff8319078d283e675ff8dc735da5bf8efe0df))
+    - wire up a very basic dom updater ([`c4e8d8b`](https://github.comgit//DioxusLabs/dioxus/commit/c4e8d8bb31d54d70c8da2f4a5e3e3926ff7df92b))
+    - major overhaul to diffing, using a "diffing machine" now ([`4dfdf91`](https://github.comgit//DioxusLabs/dioxus/commit/4dfdf9123608c69b86a56acbd6d8810b0cf1918c))
+    - remove generic paramter on VDOM ([`4c291a0`](https://github.comgit//DioxusLabs/dioxus/commit/4c291a0efdbaadf5c2212248367c0a78046e2f83))
+    - wire up some of the changelist for diff ([`d063a19`](https://github.comgit//DioxusLabs/dioxus/commit/d063a199391383288e807ac03d333091bac6ba60))
+    - event loop ([`ea2aa4b`](https://github.comgit//DioxusLabs/dioxus/commit/ea2aa4b0c97b3292178284e05756d1415902a9e2))
+    - major overhaul, wire up event system ([`8295ac4`](https://github.comgit//DioxusLabs/dioxus/commit/8295ac4b3dd2954e2aa23ef3a1f2e7c740a29961))
+    - overall API updates ([`f47651b`](https://github.comgit//DioxusLabs/dioxus/commit/f47651b32afb385297ddae00616f4308083a36e6))
+    - push new component API and context API ([`125f542`](https://github.comgit//DioxusLabs/dioxus/commit/125f5426a4719bdbad42c6c166e3a6002a2ce3f0))
+    - update builder ([`8329268`](https://github.comgit//DioxusLabs/dioxus/commit/8329268d39238f030dd703ab4614253e58339e0b))
+    - update solved problems with context API ([`c97a964`](https://github.comgit//DioxusLabs/dioxus/commit/c97a9647e3ccc477f5068d567a17d540c0bd199c))
+    - Feat: - integrate subscription service into context. - Update documentation ([`204f0d9`](https://github.comgit//DioxusLabs/dioxus/commit/204f0d9f16c97fb847b7265296b43db36411b393))
+    - fix docs names ([`ee23ea6`](https://github.comgit//DioxusLabs/dioxus/commit/ee23ea6c3a43cb6a3f5f36d8eab3a0df0daeb760))
+    - implememt nodes better ([`edbb33b`](https://github.comgit//DioxusLabs/dioxus/commit/edbb33b2ee3692cac155b9e206cd7c2d6382eb9d))
+    - move out scope into its own file ([`c9d95dd`](https://github.comgit//DioxusLabs/dioxus/commit/c9d95dd1dc35bde6f395dd95a951a0260ecfbb8a))
+    - capture pointer type ([`e939373`](https://github.comgit//DioxusLabs/dioxus/commit/e939373616680ae74948fa2c36388332c52d0d1f))
+    - more updates to hooks ([`2c2882c`](https://github.comgit//DioxusLabs/dioxus/commit/2c2882c9a24ed22aa6d17800ad3b1c308eb6579f))
+    - found a fast solution to hook state ([`4d01436`](https://github.comgit//DioxusLabs/dioxus/commit/4d01436c3f45ef32ea17fa06c363f4c76dc8c227))
+    - comment out examples and move lifetime in FC type ([`62d4ad5`](https://github.comgit//DioxusLabs/dioxus/commit/62d4ad58787185032100a2d25e79b70f6ec97a3c))
+    - include the helper ([`07341d2`](https://github.comgit//DioxusLabs/dioxus/commit/07341d2c65dc61b90587e2e5daadf72ec82623a8))
+    - updates to docs, extension ([`a2406b3`](https://github.comgit//DioxusLabs/dioxus/commit/a2406b33d6c11174f95bd003a59650b86f14159f))
+    - webview example ([`7730fd4`](https://github.comgit//DioxusLabs/dioxus/commit/7730fd4a8c0183699684704777fb581129eddd8e))
+    - Dioxus-webview ([`9c01736`](https://github.comgit//DioxusLabs/dioxus/commit/9c0173689539210d14847613f9a1694e6cb34506))
+    - add router ([`6aeea9b`](https://github.comgit//DioxusLabs/dioxus/commit/6aeea9b79081a2a711d8eee7e6edd299caf379ef))
+    - dioxus frontend crate ([`4d7ac5b`](https://github.comgit//DioxusLabs/dioxus/commit/4d7ac5bb5d3aa1897c0f6c1f322aca08c0c791f0))
+    - Add versioning for package ([`33a805d`](https://github.comgit//DioxusLabs/dioxus/commit/33a805da4024a02f7fd2c68d97ce270c31154461))
+    - clean up naming ([`2afbfea`](https://github.comgit//DioxusLabs/dioxus/commit/2afbfea324317003c601a331bd759414cce6b742))
+    - prep for cargo ([`be8d267`](https://github.comgit//DioxusLabs/dioxus/commit/be8d2678b58ceb15c30ce75de630d0398c8951c3))
+    - include diffing and patching in Dioxus ([`f3c650b`](https://github.comgit//DioxusLabs/dioxus/commit/f3c650b073b57073d30b65fb4f7fe15a6c5b2be6))
+    - more docs, dissolve vnode crate into dioxus-core ([`9c616ea`](https://github.comgit//DioxusLabs/dioxus/commit/9c616ea5c092a756a437ccf175c8b04ada50b1b6))
+    - more docs, example, mroe nodes ([`d13e04c`](https://github.comgit//DioxusLabs/dioxus/commit/d13e04c9ff4c2a98e295d762d631d47e0c762049))
+    - some updates, pull in the vnode enums ([`152bced`](https://github.comgit//DioxusLabs/dioxus/commit/152bced9f38576f359c9270efd868179298528bc))
+    - WIP ([`ce34d0d`](https://github.comgit//DioxusLabs/dioxus/commit/ce34d0dfcda82d847a6032f8f42749b39e0fba18))
+    - docs, code frm percy ([`2b9c8d0`](https://github.comgit//DioxusLabs/dioxus/commit/2b9c8d09d926ff6b5ad8a7e7b7b0b6f93bb8eb36))
+</details>
+

+ 18 - 13
packages/core/Cargo.toml

@@ -1,20 +1,24 @@
 [package]
 name = "dioxus-core"
 version = "0.1.3"
-authors = ["Jonathan Kelley <jkelleyrtp@gmail.com>"]
+authors = ["Jonathan Kelley"]
 edition = "2018"
 description = "Core functionality for Dioxus - a concurrent renderer-agnostic Virtual DOM for interactive user experiences"
-"license" = "MIT/Apache-2.0"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/DioxusLabs/dioxus/"
+homepage = "https://dioxuslabs.com"
+documentation = "https://dioxuslabs.com"
+keywords = ["dom", "ui", "gui", "react", "wasm"]
 
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
 # Bumpalo is used as a micro heap backing each component
-bumpalo = { version = "3.6.0", features = ["collections", "boxed"] }
+bumpalo = { version = "3.6", features = ["collections", "boxed"] }
 
 # faster hashmaps
-fxhash = "0.2.1"
+fxhash = "0.2"
 
 # Used in diffing
 longest-increasing-subsequence = "0.1.0"
@@ -22,24 +26,24 @@ longest-increasing-subsequence = "0.1.0"
 # internall used
 log = { version = "0.4", features = ["release_max_level_off"] }
 
-futures-util = { version = "0.3.15", default-features = false }
+futures-util = { version = "0.3", default-features = false }
 
-smallvec = "1.6.1"
+smallvec = "1.6"
 
-slab = "0.4.3"
+slab = "0.4"
 
-futures-channel = "0.3.18"
+futures-channel = "0.3"
 
 # used for noderefs
-once_cell = "1.8.0"
+once_cell = "1.8"
 
-indexmap = "1.7.0"
+indexmap = "1.7"
 
 # Serialize the Edits for use in Webview/Liveview instances
 serde = { version = "1", features = ["derive"], optional = true }
 
 # todo: I want to get rid of this
-backtrace = "0.3.63"
+backtrace = "0.3"
 
 [dev-dependencies]
 anyhow = "1.0.42"
@@ -47,9 +51,10 @@ dioxus-html = { path = "../html" }
 fern = { version = "0.6.0", features = ["colored"] }
 rand = { version = "0.8.4", features = ["small_rng"] }
 simple_logger = "1.13.0"
-dioxus-core-macro = { path = "../core-macro", version = "0.1.2" }
-dioxus-hooks = { path = "../hooks" }
+dioxus-core-macro = { path = "../core-macro", version = "^0.1.2" }
+# dioxus-hooks = { path = "../hooks" }
 criterion = "0.3.5"
+thiserror = "1.0.30"
 
 [features]
 default = []

+ 55 - 41
packages/core/README.md

@@ -2,77 +2,91 @@
 
 This is the core crate for the Dioxus Virtual DOM. This README will focus on the technical design and layout of this Virtual DOM implementation. If you want to read more about using Dioxus, then check out the Dioxus crate, documentation, and website.
 
-To build new apps with Dioxus or to extend the ecosystem with new hooks or components, use the `Dioxus` crate with the appropriate feature flags.
+To build new apps with Dioxus or to extend the ecosystem with new hooks or components, use the higher-level `dioxus` crate with the appropriate feature flags.
 
+
+```rust
+fn app(cx: Scope<()>) -> Element {
+    cx.render(rsx!(
+        div { "hello world" }
+    ))
+}
+
+
+fn main() {
+    let mut renderer = SomeRenderer::new();
+
+
+    // Creating a new virtualdom from a component
+    let mut dom = VirtualDom::new(app);
+
+    // Patching the renderer with the changes to draw the screen
+    let edits = dom.rebuild();
+    renderer.apply(edits);
+
+    // Injecting events
+    dom.handle_message(SchedulerMsg::UserEvent());
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
 ## Internals
 
 Dioxus-core builds off the many frameworks that came before it. Notably, Dioxus borrows these concepts:
 
 - React: hooks, concurrency, suspense
 - Dodrio: bump allocation, double buffering, and some diffing architecture
-- Percy: html! macro architecture, platform-agnostic edits
-- InfernoJS: approach to keyed diffing
-- Preact: approach for normalization and ref
-- Yew: passion and inspiration ❤️
 
 Dioxus-core leverages some really cool techniques and hits a very high level of parity with mature frameworks. However, Dioxus also brings some new unique features:
 
 - managed lifetimes for borrowed data
-- suspended nodes (task/fiber endpoints) for asynchronous vnodes
+- placeholder approach for suspended vnodes
+- fiber/interruptible diffing algorithm
 - custom memory allocator for vnodes and all text content
 - support for fragments w/ lazy normalization
 - slab allocator for scopes
 - mirrored-slab approach for remote vdoms
+- dedicated subtrees for rendering into separate contexts from the same app
 
-There's certainly more to the story, but these optimizations make Dioxus memory use and allocation count extremely minimal. For an average application, it is possible that zero allocations will need to be performed once the app has been mounted. Only when new components are added to the dom will allocations occur - and only en mass. The space of old VNodes is dynamically recycled as new nodes are added. Additionally, Dioxus tracks the average memory footprint of previous components to estimate how much memory allocate for future components.
+There's certainly more to the story, but these optimizations make Dioxus memory use and allocation count extremely minimal. For an average application, it is possible that zero allocations will need to be performed once the app has been loaded. Only when new components are added to the dom will allocations occur. For a given component, the space of old VNodes is dynamically recycled as new nodes are added. Additionally, Dioxus tracks the average memory footprint of previous components to estimate how much memory allocate for future components.
 
-All in all, Dioxus treats memory as an incredibly valuable resource. Combined with the memory-efficient footprint of Wasm compilation, Dioxus apps can scale to thousands of components and still stay snappy and respect your RAM usage.
+All in all, Dioxus treats memory as a valuable resource. Combined with the memory-efficient footprint of Wasm compilation, Dioxus apps can scale to thousands of components and still stay snappy.
 
 ## Goals
 
-We have big goals for Dioxus. The final implementation must:
+The final implementation of Dioxus must:
 
 - Be **fast**. Allocators are typically slow in Wasm/Rust, so we should have a smart way of allocating.
-- Be extremely memory efficient. Servers should handle tens of thousands of simultaneous VDoms with no problem.
-- Be concurrent. Components should be able to pause rendering using a threading mechanism.
-- Be "remote". Edit lists should be separate from the Renderer implementation.
-- Support SSR. VNodes should render to a string that can be served via a web server.
+- Be memory efficient. Servers should handle tens of thousands of simultaneous VDoms with no problem.
+- Be concurrent. Components should be able to pause rendering to let the screen paint the next frame.
+- Be disconnected from a specific renderer (no WebSys dependency in the core crate).
+- Support server-side-rendering (SSR). VNodes should render to a string that can be served via a web server.
 - Be "live". Components should be able to be both server rendered and client rendered without needing frontend APIs.
 - Be modular. Components and hooks should be work anywhere without worrying about target platform.
 
 
-
 ## Safety
 
-Dioxus deals with arenas, lifetimes, asynchronous tasks, custom allocators, pinning, and a lot more foundational low-level work that is very difficult to implement with 0 unsafe.
-
-If you don't want to use a crate that uses unsafe, then this crate is not for you.
-
-however, we are always interested in decreasing the scope of the core VirtualDom to make it easier to review.
-
-We'd also be happy to welcome PRs that can eliminate unsafe code while still upholding the numerous variants required to execute certain features.
-
-There's a few invariants that are very important:
-
-- References to `ScopeInner` and `Props` passed into components are *always* valid for as long as the component exists. Even if the scope backing is resized to fit more scopes, the scope has to stay the same place in memory.
+Dioxus uses unsafe. The design of Dioxus *requires* unsafe (self-referential trees).
 
+All of our test suite passes MIRI without errors.
 
+Dioxus deals with arenas, lifetimes, asynchronous tasks, custom allocators, pinning, and a lot more foundational low-level work that is very difficult to implement with 0 unsafe.
 
-## Suspense
+If you don't want to use a crate that uses unsafe, then this crate is not for you.
 
-Suspense is done through combinators on values. 
+However, we are always interested in decreasing the scope of the core VirtualDom to make it easier to review. We'd be happy to welcome PRs that can eliminate unsafe code while still upholding the numerous variants required to execute certain features.
 
-```rust
-let name = get_name(cx).suspend();
-
-rsx!(
-    div {
-        {name}
-        div {
-            div {
-    
-            }
-        }
-    }
-)
-```

+ 2 - 0
packages/core/architecture.md

@@ -1,5 +1,7 @@
 # Dioxus Core Architecture:
 
+This document is mostly a brain-dump on how things work. A lot of this information might be outdated. Certain features (priority queues, swim lanes) might not be implemented yet.
+
 Main topics covered here:
 - Fiber, Concurrency, and Cooperative Scheduling
 - Suspense

+ 4 - 4
packages/core/benches/jsframework.rs

@@ -23,7 +23,7 @@ criterion_group!(mbenches, create_rows);
 criterion_main!(mbenches);
 
 fn create_rows(c: &mut Criterion) {
-    static App: Component<()> = |cx, _| {
+    static App: Component<()> = |cx| {
         let mut rng = SmallRng::from_entropy();
         let rows = (0..10_000_usize).map(|f| {
             let label = Label::new(&mut rng);
@@ -53,11 +53,11 @@ struct RowProps {
     row_id: usize,
     label: Label,
 }
-fn Row(cx: Scope, props: &RowProps) -> Element {
-    let [adj, col, noun] = props.label.0;
+fn Row(cx: Scope<RowProps>) -> Element {
+    let [adj, col, noun] = cx.props.label.0;
     cx.render(rsx! {
         tr {
-            td { class:"col-md-1", "{props.row_id}" }
+            td { class:"col-md-1", "{cx.props.row_id}" }
             td { class:"col-md-1", onclick: move |_| { /* run onselect */ }
                 a { class: "lbl", "{adj}" "{col}" "{noun}" }
             }

+ 1 - 19
packages/core/examples/borrowed.rs

@@ -20,7 +20,7 @@ struct Borrowed<'a> {
 
 fn App2<'a>(cx: Scope<'a, Borrowed<'a>>) -> Element {
     let g = eat2(&cx);
-    todo!()
+    rsx!(cx, "")
 }
 
 fn eat2(s: &ScopeState) {}
@@ -31,21 +31,3 @@ fn bleat() {
     let blah = String::from("asd");
     eat(&blah);
 }
-
-// struct Lower {}
-
-// #[derive(Clone, Copy)]
-// struct Upper {}
-// impl std::ops::Deref for Upper {
-//     type Target = Lower;
-
-//     fn deref(&self) -> &Self::Target {
-//         todo!()
-//     }
-// }
-
-// fn mark(f: &Lower) {}
-// fn bark() {
-//     let up = Upper {};
-//     mark(&up);
-// }

+ 40 - 0
packages/core/examples/component_children.rs

@@ -0,0 +1,40 @@
+#![allow(non_snake_case)]
+
+use dioxus::prelude::*;
+use dioxus_core as dioxus;
+use dioxus_core_macro::*;
+use dioxus_html as dioxus_elements;
+
+fn main() {
+    let mut dom = VirtualDom::new(parent);
+    let edits = dom.rebuild();
+    dbg!(edits);
+}
+
+fn parent(cx: Scope<()>) -> Element {
+    let value = cx.use_hook(|_| String::new(), |f| f);
+
+    cx.render(rsx! {
+        div {
+            child(
+                name: value,
+                h1 {"hi"}
+            )
+        }
+    })
+}
+
+#[derive(Props)]
+struct ChildProps<'a> {
+    name: &'a str,
+    children: Element<'a>,
+}
+
+fn child<'a>(cx: Scope<'a, ChildProps<'a>>) -> Element {
+    cx.render(rsx! {
+        div {
+            "it's nested {cx.props.name}"
+            {&cx.props.children}
+        }
+    })
+}

+ 17 - 0
packages/core/examples/handlerror.rs

@@ -0,0 +1,17 @@
+//! Handling errors and early aborts
+//!
+//!
+//!
+//!
+
+use dioxus_core::prelude::*;
+use thiserror::Error;
+
+fn main() {
+
+    /*
+    If a component returns None, do we leave it the same way it was before?
+    We spent all this time wiping the component
+
+    */
+}

+ 0 - 10
packages/core/examples/hooks.rs

@@ -1,16 +1,6 @@
 use dioxus::prelude::*;
 use dioxus_core as dioxus;
 use dioxus_core_macro::*;
-use dioxus_hooks::use_state;
 use dioxus_html as dioxus_elements;
 
 fn main() {}
-
-fn App(cx: Scope<()>) -> Element {
-    let color = use_state(&cx, || "white");
-
-    cx.render(rsx!(
-        div { onclick: move |_| color.set("red"), "red" }
-        div { onclick: move |_| color.set("blue"), "blue" }
-    ))
-}

+ 24 - 7
packages/core/examples/works.rs

@@ -6,16 +6,15 @@ use dioxus_core_macro::*;
 use dioxus_html as dioxus_elements;
 
 fn main() {
-    let _ = VirtualDom::new(Parent);
+    let _ = VirtualDom::new(parent);
 }
 
-fn Parent(cx: Scope<()>) -> Element {
+fn parent(cx: Scope<()>) -> Element {
     let value = cx.use_hook(|_| String::new(), |f| f);
 
     cx.render(rsx! {
         div {
-            Child { name: value }
-            Fragment { "asd" }
+            child( name: value )
         }
     })
 }
@@ -25,11 +24,11 @@ struct ChildProps<'a> {
     name: &'a str,
 }
 
-fn Child<'a>(cx: Scope<'a, ChildProps<'a>>) -> Element {
+fn child<'a>(cx: Scope<'a, ChildProps<'a>>) -> Element {
     cx.render(rsx! {
         div {
             h1 { "it's nested" }
-            Child2 { name: cx.props.name }
+            grandchild( name: cx.props.name )
         }
     })
 }
@@ -39,8 +38,26 @@ struct Grandchild<'a> {
     name: &'a str,
 }
 
-fn Child2<'a>(cx: Scope<'a, Grandchild<'a>>) -> Element {
+fn grandchild<'a>(cx: Scope<'a, Grandchild>) -> Element<'a> {
     cx.render(rsx! {
         div { "Hello {cx.props.name}!" }
+        great_grandchild( name: cx.props.name )
     })
 }
+
+fn great_grandchild<'a>(cx: Scope<'a, Grandchild>) -> Element<'a> {
+    cx.render(rsx! {
+        div {
+            h1 { "it's nested" }
+        }
+    })
+}
+
+/*
+can we implement memoization as a wrapper or something? Like we just intercept the
+render function?
+
+
+
+
+*/

+ 0 - 412
packages/core/flamegraph.svg

@@ -1,412 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg version="1.1" width="1200" height="518" onload="init(evt)" viewBox="0 0 1200 518" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fg="http://github.com/jonhoo/inferno"><!--Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples.--><!--NOTES: --><defs><linearGradient id="background" y1="0" y2="1" x1="0" x2="0"><stop stop-color="#eeeeee" offset="5%"/><stop stop-color="#eeeeb0" offset="95%"/></linearGradient></defs><style type="text/css">
-text { font-family:"Verdana"; font-size:12px; fill:rgb(0,0,0); }
-#title { text-anchor:middle; font-size:17px; }
-#search { opacity:0.1; cursor:pointer; }
-#search:hover, #search.show { opacity:1; }
-#subtitle { text-anchor:middle; font-color:rgb(160,160,160); }
-#unzoom { cursor:pointer; }
-#frames > *:hover { stroke:black; stroke-width:0.5; cursor:pointer; }
-.hide { display:none; }
-.parent { opacity:0.5; }
-</style><script type="text/ecmascript"><![CDATA[var nametype = 'Function:';
-var fontsize = 12;
-var fontwidth = 0.59;
-var xpad = 10;
-var inverted = false;
-var searchcolor = 'rgb(230,0,230)';
-var fluiddrawing = true;
-var truncate_text_right = false;]]><![CDATA["use strict";
-var details, searchbtn, unzoombtn, matchedtxt, svg, searching, frames;
-function init(evt) {
-    details = document.getElementById("details").firstChild;
-    searchbtn = document.getElementById("search");
-    unzoombtn = document.getElementById("unzoom");
-    matchedtxt = document.getElementById("matched");
-    svg = document.getElementsByTagName("svg")[0];
-    frames = document.getElementById("frames");
-    total_samples = parseInt(frames.attributes.total_samples.value);
-    searching = 0;
-
-    // Use GET parameters to restore a flamegraph's state.
-    var restore_state = function() {
-        var params = get_params();
-        if (params.x && params.y)
-            zoom(find_group(document.querySelector('[*|x="' + params.x + '"][y="' + params.y + '"]')));
-        if (params.s)
-            search(params.s);
-    };
-
-    if (fluiddrawing) {
-        // Make width dynamic so the SVG fits its parent's width.
-        svg.removeAttribute("width");
-        // Edge requires us to have a viewBox that gets updated with size changes.
-        var isEdge = /Edge\/\d./i.test(navigator.userAgent);
-        if (!isEdge) {
-          svg.removeAttribute("viewBox");
-        }
-        var update_for_width_change = function() {
-            if (isEdge) {
-                svg.attributes.viewBox.value = "0 0 " + svg.width.baseVal.value + " " + svg.height.baseVal.value;
-            }
-
-            // Keep consistent padding on left and right of frames container.
-            frames.attributes.width.value = svg.width.baseVal.value - xpad * 2;
-
-            // Text truncation needs to be adjusted for the current width.
-            var el = frames.children;
-            for(var i = 0; i < el.length; i++) {
-                update_text(el[i]);
-            }
-
-            // Keep search elements at a fixed distance from right edge.
-            var svgWidth = svg.width.baseVal.value;
-            searchbtn.attributes.x.value = svgWidth - xpad - 100;
-            matchedtxt.attributes.x.value = svgWidth - xpad - 100;
-        };
-        window.addEventListener('resize', function() {
-            update_for_width_change();
-        });
-        // This needs to be done asynchronously for Safari to work.
-        setTimeout(function() {
-            unzoom();
-            update_for_width_change();
-            restore_state();
-        }, 0);
-    } else {
-        restore_state();
-    }
-}
-// event listeners
-window.addEventListener("click", function(e) {
-    var target = find_group(e.target);
-    if (target) {
-        if (target.nodeName == "a") {
-            if (e.ctrlKey === false) return;
-            e.preventDefault();
-        }
-        if (target.classList.contains("parent")) unzoom();
-        zoom(target);
-
-        // set parameters for zoom state
-        var el = target.querySelector("rect");
-        if (el && el.attributes && el.attributes.y && el.attributes["fg:x"]) {
-            var params = get_params()
-            params.x = el.attributes["fg:x"].value;
-            params.y = el.attributes.y.value;
-            history.replaceState(null, null, parse_params(params));
-        }
-    }
-    else if (e.target.id == "unzoom") {
-        unzoom();
-
-        // remove zoom state
-        var params = get_params();
-        if (params.x) delete params.x;
-        if (params.y) delete params.y;
-        history.replaceState(null, null, parse_params(params));
-    }
-    else if (e.target.id == "search") search_prompt();
-}, false)
-// mouse-over for info
-// show
-window.addEventListener("mouseover", function(e) {
-    var target = find_group(e.target);
-    if (target) details.nodeValue = nametype + " " + g_to_text(target);
-}, false)
-// clear
-window.addEventListener("mouseout", function(e) {
-    var target = find_group(e.target);
-    if (target) details.nodeValue = ' ';
-}, false)
-// ctrl-F for search
-window.addEventListener("keydown",function (e) {
-    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
-        e.preventDefault();
-        search_prompt();
-    }
-}, false)
-// functions
-function get_params() {
-    var params = {};
-    var paramsarr = window.location.search.substr(1).split('&');
-    for (var i = 0; i < paramsarr.length; ++i) {
-        var tmp = paramsarr[i].split("=");
-        if (!tmp[0] || !tmp[1]) continue;
-        params[tmp[0]]  = decodeURIComponent(tmp[1]);
-    }
-    return params;
-}
-function parse_params(params) {
-    var uri = "?";
-    for (var key in params) {
-        uri += key + '=' + encodeURIComponent(params[key]) + '&';
-    }
-    if (uri.slice(-1) == "&")
-        uri = uri.substring(0, uri.length - 1);
-    if (uri == '?')
-        uri = window.location.href.split('?')[0];
-    return uri;
-}
-function find_child(node, selector) {
-    var children = node.querySelectorAll(selector);
-    if (children.length) return children[0];
-    return;
-}
-function find_group(node) {
-    var parent = node.parentElement;
-    if (!parent) return;
-    if (parent.id == "frames") return node;
-    return find_group(parent);
-}
-function orig_save(e, attr, val) {
-    if (e.attributes["fg:orig_" + attr] != undefined) return;
-    if (e.attributes[attr] == undefined) return;
-    if (val == undefined) val = e.attributes[attr].value;
-    e.setAttribute("fg:orig_" + attr, val);
-}
-function orig_load(e, attr) {
-    if (e.attributes["fg:orig_"+attr] == undefined) return;
-    e.attributes[attr].value = e.attributes["fg:orig_" + attr].value;
-    e.removeAttribute("fg:orig_" + attr);
-}
-function g_to_text(e) {
-    var text = find_child(e, "title").firstChild.nodeValue;
-    return (text)
-}
-function g_to_func(e) {
-    var func = g_to_text(e);
-    // if there's any manipulation we want to do to the function
-    // name before it's searched, do it here before returning.
-    return (func);
-}
-function update_text(e) {
-    var r = find_child(e, "rect");
-    var t = find_child(e, "text");
-    var w = parseFloat(r.attributes.width.value) * frames.attributes.width.value / 100 - 3;
-    var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,"");
-    t.attributes.x.value = format_percent((parseFloat(r.attributes.x.value) + (100 * 3 / frames.attributes.width.value)));
-    // Smaller than this size won't fit anything
-    if (w < 2 * fontsize * fontwidth) {
-        t.textContent = "";
-        return;
-    }
-    t.textContent = txt;
-    // Fit in full text width
-    if (/^ *\$/.test(txt) || t.getComputedTextLength() < w)
-        return;
-    if (truncate_text_right) {
-        // Truncate the right side of the text.
-        for (var x = txt.length - 2; x > 0; x--) {
-            if (t.getSubStringLength(0, x + 2) <= w) {
-                t.textContent = txt.substring(0, x) + "..";
-                return;
-            }
-        }
-    } else {
-        // Truncate the left side of the text.
-        for (var x = 2; x < txt.length; x++) {
-            if (t.getSubStringLength(x - 2, txt.length) <= w) {
-                t.textContent = ".." + txt.substring(x, txt.length);
-                return;
-            }
-        }
-    }
-    t.textContent = "";
-}
-// zoom
-function zoom_reset(e) {
-    if (e.tagName == "rect") {
-        e.attributes.x.value = format_percent(100 * parseInt(e.attributes["fg:x"].value) / total_samples);
-        e.attributes.width.value = format_percent(100 * parseInt(e.attributes["fg:w"].value) / total_samples);
-    }
-    if (e.childNodes == undefined) return;
-    for(var i = 0, c = e.childNodes; i < c.length; i++) {
-        zoom_reset(c[i]);
-    }
-}
-function zoom_child(e, x, zoomed_width_samples) {
-    if (e.tagName == "text") {
-        var parent_x = parseFloat(find_child(e.parentNode, "rect[x]").attributes.x.value);
-        e.attributes.x.value = format_percent(parent_x + (100 * 3 / frames.attributes.width.value));
-    } else if (e.tagName == "rect") {
-        e.attributes.x.value = format_percent(100 * (parseInt(e.attributes["fg:x"].value) - x) / zoomed_width_samples);
-        e.attributes.width.value = format_percent(100 * parseInt(e.attributes["fg:w"].value) / zoomed_width_samples);
-    }
-    if (e.childNodes == undefined) return;
-    for(var i = 0, c = e.childNodes; i < c.length; i++) {
-        zoom_child(c[i], x, zoomed_width_samples);
-    }
-}
-function zoom_parent(e) {
-    if (e.attributes) {
-        if (e.attributes.x != undefined) {
-            e.attributes.x.value = "0.0%";
-        }
-        if (e.attributes.width != undefined) {
-            e.attributes.width.value = "100.0%";
-        }
-    }
-    if (e.childNodes == undefined) return;
-    for(var i = 0, c = e.childNodes; i < c.length; i++) {
-        zoom_parent(c[i]);
-    }
-}
-function zoom(node) {
-    var attr = find_child(node, "rect").attributes;
-    var width = parseInt(attr["fg:w"].value);
-    var xmin = parseInt(attr["fg:x"].value);
-    var xmax = xmin + width;
-    var ymin = parseFloat(attr.y.value);
-    unzoombtn.classList.remove("hide");
-    var el = frames.children;
-    for (var i = 0; i < el.length; i++) {
-        var e = el[i];
-        var a = find_child(e, "rect").attributes;
-        var ex = parseInt(a["fg:x"].value);
-        var ew = parseInt(a["fg:w"].value);
-        // Is it an ancestor
-        if (!inverted) {
-            var upstack = parseFloat(a.y.value) > ymin;
-        } else {
-            var upstack = parseFloat(a.y.value) < ymin;
-        }
-        if (upstack) {
-            // Direct ancestor
-            if (ex <= xmin && (ex+ew) >= xmax) {
-                e.classList.add("parent");
-                zoom_parent(e);
-                update_text(e);
-            }
-            // not in current path
-            else
-                e.classList.add("hide");
-        }
-        // Children maybe
-        else {
-            // no common path
-            if (ex < xmin || ex >= xmax) {
-                e.classList.add("hide");
-            }
-            else {
-                zoom_child(e, xmin, width);
-                update_text(e);
-            }
-        }
-    }
-}
-function unzoom() {
-    unzoombtn.classList.add("hide");
-    var el = frames.children;
-    for(var i = 0; i < el.length; i++) {
-        el[i].classList.remove("parent");
-        el[i].classList.remove("hide");
-        zoom_reset(el[i]);
-        update_text(el[i]);
-    }
-}
-// search
-function reset_search() {
-    var el = document.querySelectorAll("#frames rect");
-    for (var i = 0; i < el.length; i++) {
-        orig_load(el[i], "fill")
-    }
-    var params = get_params();
-    delete params.s;
-    history.replaceState(null, null, parse_params(params));
-}
-function search_prompt() {
-    if (!searching) {
-        var term = prompt("Enter a search term (regexp " +
-            "allowed, eg: ^ext4_)", "");
-        if (term != null) {
-            search(term)
-        }
-    } else {
-        reset_search();
-        searching = 0;
-        searchbtn.classList.remove("show");
-        searchbtn.firstChild.nodeValue = "Search"
-        matchedtxt.classList.add("hide");
-        matchedtxt.firstChild.nodeValue = ""
-    }
-}
-function search(term) {
-    var re = new RegExp(term);
-    var el = frames.children;
-    var matches = new Object();
-    var maxwidth = 0;
-    for (var i = 0; i < el.length; i++) {
-        var e = el[i];
-        // Skip over frames which are either not visible, or below the zoomed-to frame
-        if (e.classList.contains("hide") || e.classList.contains("parent")) {
-            continue;
-        }
-        var func = g_to_func(e);
-        var rect = find_child(e, "rect");
-        if (func == null || rect == null)
-            continue;
-        // Save max width. Only works as we have a root frame
-        var w = parseInt(rect.attributes["fg:w"].value);
-        if (w > maxwidth)
-            maxwidth = w;
-        if (func.match(re)) {
-            // highlight
-            var x = parseInt(rect.attributes["fg:x"].value);
-            orig_save(rect, "fill");
-            rect.attributes.fill.value = searchcolor;
-            // remember matches
-            if (matches[x] == undefined) {
-                matches[x] = w;
-            } else {
-                if (w > matches[x]) {
-                    // overwrite with parent
-                    matches[x] = w;
-                }
-            }
-            searching = 1;
-        }
-    }
-    if (!searching)
-        return;
-    var params = get_params();
-    params.s = term;
-    history.replaceState(null, null, parse_params(params));
-
-    searchbtn.classList.add("show");
-    searchbtn.firstChild.nodeValue = "Reset Search";
-    // calculate percent matched, excluding vertical overlap
-    var count = 0;
-    var lastx = -1;
-    var lastw = 0;
-    var keys = Array();
-    for (k in matches) {
-        if (matches.hasOwnProperty(k))
-            keys.push(k);
-    }
-    // sort the matched frames by their x location
-    // ascending, then width descending
-    keys.sort(function(a, b){
-        return a - b;
-    });
-    // Step through frames saving only the biggest bottom-up frames
-    // thanks to the sort order. This relies on the tree property
-    // where children are always smaller than their parents.
-    for (var k in keys) {
-        var x = parseInt(keys[k]);
-        var w = matches[keys[k]];
-        if (x >= lastx + lastw) {
-            count += w;
-            lastx = x;
-            lastw = w;
-        }
-    }
-    // display matched percent
-    matchedtxt.classList.remove("hide");
-    var pct = 100 * count / maxwidth;
-    if (pct != 100) pct = pct.toFixed(1);
-    matchedtxt.firstChild.nodeValue = "Matched: " + pct + "%";
-}
-function format_percent(n) {
-    return n.toFixed(4) + "%";
-}
-]]></script><rect x="0" y="0" width="100%" height="518" fill="url(#background)"/><text id="title" x="50.0000%" y="24.00">Flame Graph</text><text id="details" x="10" y="501.00"> </text><text id="unzoom" class="hide" x="10" y="24.00">Reset Zoom</text><text id="search" x="1090" y="24.00">Search</text><text id="matched" x="1090" y="501.00"> </text><svg id="frames" x="10" width="1180" total_samples="55"><g><title>jsframework-a8f4acf5955e8e7f`core::ptr::drop_in_place&lt;dioxus_core::virtual_dom::VirtualDom&gt; (1 samples, 1.82%)</title><rect x="0.0000%" y="261" width="1.8182%" height="15" fill="rgb(227,0,7)" fg:x="0" fg:w="1"/><text x="0.2500%" y="271.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;dioxus_core::scopearena::ScopeArena&gt;&gt; (1 samples, 1.82%)</title><rect x="0.0000%" y="245" width="1.8182%" height="15" fill="rgb(217,0,24)" fg:x="0" fg:w="1"/><text x="0.2500%" y="255.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;bumpalo::Bump as core::ops::drop::Drop&gt;::drop (1 samples, 1.82%)</title><rect x="0.0000%" y="229" width="1.8182%" height="15" fill="rgb(221,193,54)" fg:x="0" fg:w="1"/><text x="0.2500%" y="239.50">j..</text></g><g><title>libsystem_malloc.dylib`free_medium (1 samples, 1.82%)</title><rect x="0.0000%" y="213" width="1.8182%" height="15" fill="rgb(248,212,6)" fg:x="0" fg:w="1"/><text x="0.2500%" y="223.50">l..</text></g><g><title>libsystem_kernel.dylib`madvise (1 samples, 1.82%)</title><rect x="0.0000%" y="197" width="1.8182%" height="15" fill="rgb(208,68,35)" fg:x="0" fg:w="1"/><text x="0.2500%" y="207.50">l..</text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (2 samples, 3.64%)</title><rect x="9.0909%" y="181" width="3.6364%" height="15" fill="rgb(232,128,0)" fg:x="5" fg:w="2"/><text x="9.3409%" y="191.50">libs..</text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (2 samples, 3.64%)</title><rect x="9.0909%" y="165" width="3.6364%" height="15" fill="rgb(207,160,47)" fg:x="5" fg:w="2"/><text x="9.3409%" y="175.50">libs..</text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (2 samples, 3.64%)</title><rect x="9.0909%" y="149" width="3.6364%" height="15" fill="rgb(228,23,34)" fg:x="5" fg:w="2"/><text x="9.3409%" y="159.50">libs..</text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (1 samples, 1.82%)</title><rect x="10.9091%" y="133" width="1.8182%" height="15" fill="rgb(218,30,26)" fg:x="6" fg:w="1"/><text x="11.1591%" y="143.50">l..</text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (1 samples, 1.82%)</title><rect x="10.9091%" y="117" width="1.8182%" height="15" fill="rgb(220,122,19)" fg:x="6" fg:w="1"/><text x="11.1591%" y="127.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::create_element_node (7 samples, 12.73%)</title><rect x="1.8182%" y="229" width="12.7273%" height="15" fill="rgb(250,228,42)" fg:x="1" fg:w="7"/><text x="2.0682%" y="239.50">jsframework-a8f4acf..</text></g><g><title>jsframework-a8f4acf5955e8e7f`alloc::raw_vec::RawVec&lt;T,A&gt;::reserve::do_reserve_and_handle (3 samples, 5.45%)</title><rect x="9.0909%" y="213" width="5.4545%" height="15" fill="rgb(240,193,28)" fg:x="5" fg:w="3"/><text x="9.3409%" y="223.50">jsframe..</text></g><g><title>jsframework-a8f4acf5955e8e7f`alloc::raw_vec::finish_grow (3 samples, 5.45%)</title><rect x="9.0909%" y="197" width="5.4545%" height="15" fill="rgb(216,20,37)" fg:x="5" fg:w="3"/><text x="9.3409%" y="207.50">jsframe..</text></g><g><title>libsystem_malloc.dylib`realloc (1 samples, 1.82%)</title><rect x="12.7273%" y="181" width="1.8182%" height="15" fill="rgb(206,188,39)" fg:x="7" fg:w="1"/><text x="12.9773%" y="191.50">l..</text></g><g><title>libsystem_malloc.dylib`malloc_zone_realloc (1 samples, 1.82%)</title><rect x="12.7273%" y="165" width="1.8182%" height="15" fill="rgb(217,207,13)" fg:x="7" fg:w="1"/><text x="12.9773%" y="175.50">l..</text></g><g><title>libsystem_malloc.dylib`szone_realloc (1 samples, 1.82%)</title><rect x="12.7273%" y="149" width="1.8182%" height="15" fill="rgb(231,73,38)" fg:x="7" fg:w="1"/><text x="12.9773%" y="159.50">l..</text></g><g><title>libsystem_platform.dylib`_platform_memmove$VARIANT$Haswell (1 samples, 1.82%)</title><rect x="12.7273%" y="133" width="1.8182%" height="15" fill="rgb(225,20,46)" fg:x="7" fg:w="1"/><text x="12.9773%" y="143.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scopearena::ScopeArena::fin_head (1 samples, 1.82%)</title><rect x="16.3636%" y="213" width="1.8182%" height="15" fill="rgb(210,31,41)" fg:x="9" fg:w="1"/><text x="16.6136%" y="223.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;bumpalo::Bump as core::default::Default&gt;::default (4 samples, 7.27%)</title><rect x="21.8182%" y="197" width="7.2727%" height="15" fill="rgb(221,200,47)" fg:x="12" fg:w="4"/><text x="22.0682%" y="207.50">jsframewor..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;bumpalo::Bump as core::ops::drop::Drop&gt;::drop (1 samples, 1.82%)</title><rect x="29.0909%" y="197" width="1.8182%" height="15" fill="rgb(226,26,5)" fg:x="16" fg:w="1"/><text x="29.3409%" y="207.50">j..</text></g><g><title>libsystem_malloc.dylib`free_tiny (1 samples, 1.82%)</title><rect x="29.0909%" y="181" width="1.8182%" height="15" fill="rgb(249,33,26)" fg:x="16" fg:w="1"/><text x="29.3409%" y="191.50">l..</text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (1 samples, 1.82%)</title><rect x="29.0909%" y="165" width="1.8182%" height="15" fill="rgb(235,183,28)" fg:x="16" fg:w="1"/><text x="29.3409%" y="175.50">l..</text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (1 samples, 1.82%)</title><rect x="29.0909%" y="149" width="1.8182%" height="15" fill="rgb(221,5,38)" fg:x="16" fg:w="1"/><text x="29.3409%" y="159.50">l..</text></g><g><title>libsystem_malloc.dylib`malloc_zone_realloc (1 samples, 1.82%)</title><rect x="30.9091%" y="149" width="1.8182%" height="15" fill="rgb(247,18,42)" fg:x="17" fg:w="1"/><text x="31.1591%" y="159.50">l..</text></g><g><title>libsystem_platform.dylib`DYLD-STUB$$_platform_memmove (1 samples, 1.82%)</title><rect x="30.9091%" y="133" width="1.8182%" height="15" fill="rgb(241,131,45)" fg:x="17" fg:w="1"/><text x="31.1591%" y="143.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`alloc::raw_vec::RawVec&lt;T,A&gt;::reserve::do_reserve_and_handle (2 samples, 3.64%)</title><rect x="30.9091%" y="197" width="3.6364%" height="15" fill="rgb(249,31,29)" fg:x="17" fg:w="2"/><text x="31.1591%" y="207.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`alloc::raw_vec::finish_grow (2 samples, 3.64%)</title><rect x="30.9091%" y="181" width="3.6364%" height="15" fill="rgb(225,111,53)" fg:x="17" fg:w="2"/><text x="31.1591%" y="191.50">jsfr..</text></g><g><title>libsystem_malloc.dylib`realloc (2 samples, 3.64%)</title><rect x="30.9091%" y="165" width="3.6364%" height="15" fill="rgb(238,160,17)" fg:x="17" fg:w="2"/><text x="31.1591%" y="175.50">libs..</text></g><g><title>libsystem_malloc.dylib`szone_size (1 samples, 1.82%)</title><rect x="32.7273%" y="149" width="1.8182%" height="15" fill="rgb(214,148,48)" fg:x="18" fg:w="1"/><text x="32.9773%" y="159.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`bumpalo::Bump::with_capacity (1 samples, 1.82%)</title><rect x="34.5455%" y="197" width="1.8182%" height="15" fill="rgb(232,36,49)" fg:x="19" fg:w="1"/><text x="34.7955%" y="207.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`bumpalo::Bump::with_capacity (2 samples, 3.64%)</title><rect x="36.3636%" y="181" width="3.6364%" height="15" fill="rgb(209,103,24)" fg:x="20" fg:w="2"/><text x="36.6136%" y="191.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scope::BumpFrame::new (3 samples, 5.45%)</title><rect x="36.3636%" y="197" width="5.4545%" height="15" fill="rgb(229,88,8)" fg:x="20" fg:w="3"/><text x="36.6136%" y="207.50">jsframe..</text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (1 samples, 1.82%)</title><rect x="40.0000%" y="181" width="1.8182%" height="15" fill="rgb(213,181,19)" fg:x="22" fg:w="1"/><text x="40.2500%" y="191.50">l..</text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (1 samples, 1.82%)</title><rect x="40.0000%" y="165" width="1.8182%" height="15" fill="rgb(254,191,54)" fg:x="22" fg:w="1"/><text x="40.2500%" y="175.50">l..</text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (1 samples, 1.82%)</title><rect x="40.0000%" y="149" width="1.8182%" height="15" fill="rgb(241,83,37)" fg:x="22" fg:w="1"/><text x="40.2500%" y="159.50">l..</text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (1 samples, 1.82%)</title><rect x="40.0000%" y="133" width="1.8182%" height="15" fill="rgb(233,36,39)" fg:x="22" fg:w="1"/><text x="40.2500%" y="143.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scopearena::ScopeArena::new_with_key (14 samples, 25.45%)</title><rect x="18.1818%" y="213" width="25.4545%" height="15" fill="rgb(226,3,54)" fg:x="10" fg:w="14"/><text x="18.4318%" y="223.50">jsframework-a8f4acf5955e8e7f`dioxus_core:..</text></g><g><title>jsframework-a8f4acf5955e8e7f`hashbrown::raw::RawTable&lt;T,A&gt;::insert (1 samples, 1.82%)</title><rect x="41.8182%" y="197" width="1.8182%" height="15" fill="rgb(245,192,40)" fg:x="23" fg:w="1"/><text x="42.0682%" y="207.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::element (6 samples, 10.91%)</title><rect x="43.6364%" y="117" width="10.9091%" height="15" fill="rgb(238,167,29)" fg:x="24" fg:w="6"/><text x="43.8864%" y="127.50">jsframework-a8f4..</text></g><g><title>jsframework-a8f4acf5955e8e7f`bumpalo::Bump::alloc_layout_slow (6 samples, 10.91%)</title><rect x="43.6364%" y="101" width="10.9091%" height="15" fill="rgb(232,182,51)" fg:x="24" fg:w="6"/><text x="43.8864%" y="111.50">jsframework-a8f4..</text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (2 samples, 3.64%)</title><rect x="50.9091%" y="85" width="3.6364%" height="15" fill="rgb(231,60,39)" fg:x="28" fg:w="2"/><text x="51.1591%" y="95.50">libs..</text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (2 samples, 3.64%)</title><rect x="50.9091%" y="69" width="3.6364%" height="15" fill="rgb(208,69,12)" fg:x="28" fg:w="2"/><text x="51.1591%" y="79.50">libs..</text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (2 samples, 3.64%)</title><rect x="50.9091%" y="53" width="3.6364%" height="15" fill="rgb(235,93,37)" fg:x="28" fg:w="2"/><text x="51.1591%" y="63.50">libs..</text></g><g><title>libsystem_malloc.dylib`set_tiny_meta_header_in_use (1 samples, 1.82%)</title><rect x="52.7273%" y="37" width="1.8182%" height="15" fill="rgb(213,116,39)" fg:x="29" fg:w="1"/><text x="52.9773%" y="47.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::raw_element (12 samples, 21.82%)</title><rect x="54.5455%" y="117" width="21.8182%" height="15" fill="rgb(222,207,29)" fg:x="30" fg:w="12"/><text x="54.7955%" y="127.50">jsframework-a8f4acf5955e8e7f`dioxu..</text></g><g><title>jsframework-a8f4acf5955e8e7f`bumpalo::Bump::alloc_layout_slow (12 samples, 21.82%)</title><rect x="54.5455%" y="101" width="21.8182%" height="15" fill="rgb(206,96,30)" fg:x="30" fg:w="12"/><text x="54.7955%" y="111.50">jsframework-a8f4acf5955e8e7f`bumpa..</text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (1 samples, 1.82%)</title><rect x="74.5455%" y="85" width="1.8182%" height="15" fill="rgb(218,138,4)" fg:x="41" fg:w="1"/><text x="74.7955%" y="95.50">l..</text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (1 samples, 1.82%)</title><rect x="74.5455%" y="69" width="1.8182%" height="15" fill="rgb(250,191,14)" fg:x="41" fg:w="1"/><text x="74.7955%" y="79.50">l..</text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (1 samples, 1.82%)</title><rect x="74.5455%" y="53" width="1.8182%" height="15" fill="rgb(239,60,40)" fg:x="41" fg:w="1"/><text x="74.7955%" y="63.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;&amp;T as core::fmt::Display&gt;::fmt (1 samples, 1.82%)</title><rect x="76.3636%" y="101" width="1.8182%" height="15" fill="rgb(206,27,48)" fg:x="42" fg:w="1"/><text x="76.6136%" y="111.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`bumpalo::collections::string::String::into_bump_str (1 samples, 1.82%)</title><rect x="78.1818%" y="101" width="1.8182%" height="15" fill="rgb(225,35,8)" fg:x="43" fg:w="1"/><text x="78.4318%" y="111.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::text (3 samples, 5.45%)</title><rect x="76.3636%" y="117" width="5.4545%" height="15" fill="rgb(250,213,24)" fg:x="42" fg:w="3"/><text x="76.6136%" y="127.50">jsframe..</text></g><g><title>jsframework-a8f4acf5955e8e7f`core::fmt::write (1 samples, 1.82%)</title><rect x="80.0000%" y="101" width="1.8182%" height="15" fill="rgb(247,123,22)" fg:x="44" fg:w="1"/><text x="80.2500%" y="111.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;&amp;mut W as core::fmt::Write&gt;::write_str (1 samples, 1.82%)</title><rect x="80.0000%" y="85" width="1.8182%" height="15" fill="rgb(231,138,38)" fg:x="44" fg:w="1"/><text x="80.2500%" y="95.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::call (22 samples, 40.00%)</title><rect x="43.6364%" y="149" width="40.0000%" height="15" fill="rgb(231,145,46)" fg:x="24" fg:w="22"/><text x="43.8864%" y="159.50">jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::c..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::new::_{{closure}} (22 samples, 40.00%)</title><rect x="43.6364%" y="133" width="40.0000%" height="15" fill="rgb(251,118,11)" fg:x="24" fg:w="22"/><text x="43.8864%" y="143.50">jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::n..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::empty_cell (1 samples, 1.82%)</title><rect x="81.8182%" y="117" width="1.8182%" height="15" fill="rgb(217,147,25)" fg:x="45" fg:w="1"/><text x="82.0682%" y="127.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scope::Scope::render (23 samples, 41.82%)</title><rect x="43.6364%" y="165" width="41.8182%" height="15" fill="rgb(247,81,37)" fg:x="24" fg:w="23"/><text x="43.8864%" y="175.50">jsframework-a8f4acf5955e8e7f`dioxus_core::scope::Scope::render</text></g><g><title>libsystem_platform.dylib`_platform_memmove$VARIANT$Haswell (1 samples, 1.82%)</title><rect x="83.6364%" y="149" width="1.8182%" height="15" fill="rgb(209,12,38)" fg:x="46" fg:w="1"/><text x="83.8864%" y="159.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::create_node (40 samples, 72.73%)</title><rect x="14.5455%" y="229" width="72.7273%" height="15" fill="rgb(227,1,9)" fg:x="8" fg:w="40"/><text x="14.7955%" y="239.50">jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::create_node</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scopearena::ScopeArena::run_scope (24 samples, 43.64%)</title><rect x="43.6364%" y="213" width="43.6364%" height="15" fill="rgb(248,47,43)" fg:x="24" fg:w="24"/><text x="43.8864%" y="223.50">jsframework-a8f4acf5955e8e7f`dioxus_core::scopearena::ScopeArena::run_s..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::component::_{{closure}} (24 samples, 43.64%)</title><rect x="43.6364%" y="197" width="43.6364%" height="15" fill="rgb(221,10,30)" fg:x="24" fg:w="24"/><text x="43.8864%" y="207.50">jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::component..</text></g><g><title>jsframework-a8f4acf5955e8e7f`jsframework::Row (24 samples, 43.64%)</title><rect x="43.6364%" y="181" width="43.6364%" height="15" fill="rgb(210,229,1)" fg:x="24" fg:w="24"/><text x="43.8864%" y="191.50">jsframework-a8f4acf5955e8e7f`jsframework::Row</text></g><g><title>libsystem_platform.dylib`_platform_memmove$VARIANT$Haswell (1 samples, 1.82%)</title><rect x="85.4545%" y="165" width="1.8182%" height="15" fill="rgb(222,148,37)" fg:x="47" fg:w="1"/><text x="85.7045%" y="175.50">l..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::work (48 samples, 87.27%)</title><rect x="1.8182%" y="245" width="87.2727%" height="15" fill="rgb(234,67,33)" fg:x="1" fg:w="48"/><text x="2.0682%" y="255.50">jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::work</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::diff::DiffState::mount (1 samples, 1.82%)</title><rect x="87.2727%" y="229" width="1.8182%" height="15" fill="rgb(247,98,35)" fg:x="48" fg:w="1"/><text x="87.5227%" y="239.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;core::option::Option&lt;dioxus_core::lazynodes::LazyNodes&gt; as dioxus_core::nodes::IntoVNode&gt;::into_vnode (1 samples, 1.82%)</title><rect x="89.0909%" y="133" width="1.8182%" height="15" fill="rgb(247,138,52)" fg:x="49" fg:w="1"/><text x="89.3409%" y="143.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::call (1 samples, 1.82%)</title><rect x="89.0909%" y="117" width="1.8182%" height="15" fill="rgb(213,79,30)" fg:x="49" fg:w="1"/><text x="89.3409%" y="127.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::new::_{{closure}} (1 samples, 1.82%)</title><rect x="89.0909%" y="101" width="1.8182%" height="15" fill="rgb(246,177,23)" fg:x="49" fg:w="1"/><text x="89.3409%" y="111.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::component (1 samples, 1.82%)</title><rect x="89.0909%" y="85" width="1.8182%" height="15" fill="rgb(230,62,27)" fg:x="49" fg:w="1"/><text x="89.3409%" y="95.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`main (51 samples, 92.73%)</title><rect x="0.0000%" y="421" width="92.7273%" height="15" fill="rgb(216,154,8)" fg:x="0" fg:w="51"/><text x="0.2500%" y="431.50">jsframework-a8f4acf5955e8e7f`main</text></g><g><title>jsframework-a8f4acf5955e8e7f`std::rt::lang_start_internal (51 samples, 92.73%)</title><rect x="0.0000%" y="405" width="92.7273%" height="15" fill="rgb(244,35,45)" fg:x="0" fg:w="51"/><text x="0.2500%" y="415.50">jsframework-a8f4acf5955e8e7f`std::rt::lang_start_internal</text></g><g><title>jsframework-a8f4acf5955e8e7f`std::rt::lang_start::_{{closure}} (51 samples, 92.73%)</title><rect x="0.0000%" y="389" width="92.7273%" height="15" fill="rgb(251,115,12)" fg:x="0" fg:w="51"/><text x="0.2500%" y="399.50">jsframework-a8f4acf5955e8e7f`std::rt::lang_start::_{{closure}}</text></g><g><title>jsframework-a8f4acf5955e8e7f`std::sys_common::backtrace::__rust_begin_short_backtrace (51 samples, 92.73%)</title><rect x="0.0000%" y="373" width="92.7273%" height="15" fill="rgb(240,54,50)" fg:x="0" fg:w="51"/><text x="0.2500%" y="383.50">jsframework-a8f4acf5955e8e7f`std::sys_common::backtrace::__rust_begin_short_backtrace</text></g><g><title>jsframework-a8f4acf5955e8e7f`jsframework::main (51 samples, 92.73%)</title><rect x="0.0000%" y="357" width="92.7273%" height="15" fill="rgb(233,84,52)" fg:x="0" fg:w="51"/><text x="0.2500%" y="367.50">jsframework-a8f4acf5955e8e7f`jsframework::main</text></g><g><title>jsframework-a8f4acf5955e8e7f`criterion::Criterion&lt;M&gt;::bench_function (51 samples, 92.73%)</title><rect x="0.0000%" y="341" width="92.7273%" height="15" fill="rgb(207,117,47)" fg:x="0" fg:w="51"/><text x="0.2500%" y="351.50">jsframework-a8f4acf5955e8e7f`criterion::Criterion&lt;M&gt;::bench_function</text></g><g><title>jsframework-a8f4acf5955e8e7f`criterion::benchmark_group::BenchmarkGroup&lt;M&gt;::bench_function (51 samples, 92.73%)</title><rect x="0.0000%" y="325" width="92.7273%" height="15" fill="rgb(249,43,39)" fg:x="0" fg:w="51"/><text x="0.2500%" y="335.50">jsframework-a8f4acf5955e8e7f`criterion::benchmark_group::BenchmarkGroup&lt;M&gt;::bench_function</text></g><g><title>jsframework-a8f4acf5955e8e7f`criterion::routine::Routine::test (51 samples, 92.73%)</title><rect x="0.0000%" y="309" width="92.7273%" height="15" fill="rgb(209,38,44)" fg:x="0" fg:w="51"/><text x="0.2500%" y="319.50">jsframework-a8f4acf5955e8e7f`criterion::routine::Routine::test</text></g><g><title>jsframework-a8f4acf5955e8e7f`&lt;alloc::vec::Vec&lt;T&gt; as alloc::vec::spec_from_iter::SpecFromIter&lt;T,I&gt;&gt;::from_iter (51 samples, 92.73%)</title><rect x="0.0000%" y="293" width="92.7273%" height="15" fill="rgb(236,212,23)" fg:x="0" fg:w="51"/><text x="0.2500%" y="303.50">jsframework-a8f4acf5955e8e7f`&lt;alloc::vec::Vec&lt;T&gt; as alloc::vec::spec_from_iter::SpecFromIter&lt;T,I&gt;&gt;::from_iter</text></g><g><title>jsframework-a8f4acf5955e8e7f`criterion::bencher::Bencher&lt;M&gt;::iter (51 samples, 92.73%)</title><rect x="0.0000%" y="277" width="92.7273%" height="15" fill="rgb(242,79,21)" fg:x="0" fg:w="51"/><text x="0.2500%" y="287.50">jsframework-a8f4acf5955e8e7f`criterion::bencher::Bencher&lt;M&gt;::iter</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::virtual_dom::VirtualDom::rebuild (50 samples, 90.91%)</title><rect x="1.8182%" y="261" width="90.9091%" height="15" fill="rgb(211,96,35)" fg:x="1" fg:w="50"/><text x="2.0682%" y="271.50">jsframework-a8f4acf5955e8e7f`dioxus_core::virtual_dom::VirtualDom::rebuild</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scopearena::ScopeArena::run_scope (2 samples, 3.64%)</title><rect x="89.0909%" y="245" width="3.6364%" height="15" fill="rgb(253,215,40)" fg:x="49" fg:w="2"/><text x="89.3409%" y="255.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::virtual_dom::VirtualDom::new_with_props_and_scheduler::_{{closure}} (2 samples, 3.64%)</title><rect x="89.0909%" y="229" width="3.6364%" height="15" fill="rgb(211,81,21)" fg:x="49" fg:w="2"/><text x="89.3409%" y="239.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`core::ops::function::FnOnce::call_once (2 samples, 3.64%)</title><rect x="89.0909%" y="213" width="3.6364%" height="15" fill="rgb(208,190,38)" fg:x="49" fg:w="2"/><text x="89.3409%" y="223.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::scope::Scope::render (2 samples, 3.64%)</title><rect x="89.0909%" y="197" width="3.6364%" height="15" fill="rgb(235,213,38)" fg:x="49" fg:w="2"/><text x="89.3409%" y="207.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::call (2 samples, 3.64%)</title><rect x="89.0909%" y="181" width="3.6364%" height="15" fill="rgb(237,122,38)" fg:x="49" fg:w="2"/><text x="89.3409%" y="191.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::lazynodes::LazyNodes::new::_{{closure}} (2 samples, 3.64%)</title><rect x="89.0909%" y="165" width="3.6364%" height="15" fill="rgb(244,218,35)" fg:x="49" fg:w="2"/><text x="89.3409%" y="175.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`dioxus_core::nodes::NodeFactory::fragment_from_iter (2 samples, 3.64%)</title><rect x="89.0909%" y="149" width="3.6364%" height="15" fill="rgb(240,68,47)" fg:x="49" fg:w="2"/><text x="89.3409%" y="159.50">jsfr..</text></g><g><title>jsframework-a8f4acf5955e8e7f`core::ops::function::impls::_&lt;impl core::ops::function::FnOnce&lt;A&gt; for &amp;mut F&gt;::call_once (1 samples, 1.82%)</title><rect x="90.9091%" y="133" width="1.8182%" height="15" fill="rgb(210,16,53)" fg:x="50" fg:w="1"/><text x="91.1591%" y="143.50">j..</text></g><g><title>jsframework-a8f4acf5955e8e7f`rand::rng::Rng::gen_range (1 samples, 1.82%)</title><rect x="90.9091%" y="117" width="1.8182%" height="15" fill="rgb(235,124,12)" fg:x="50" fg:w="1"/><text x="91.1591%" y="127.50">j..</text></g><g><title>all (55 samples, 100%)</title><rect x="0.0000%" y="469" width="100.0000%" height="15" fill="rgb(224,169,11)" fg:x="0" fg:w="55"/><text x="0.2500%" y="479.50"></text></g><g><title>0x1 (55 samples, 100.00%)</title><rect x="0.0000%" y="453" width="100.0000%" height="15" fill="rgb(250,166,2)" fg:x="0" fg:w="55"/><text x="0.2500%" y="463.50">0x1</text></g><g><title>libdyld.dylib`start (55 samples, 100.00%)</title><rect x="0.0000%" y="437" width="100.0000%" height="15" fill="rgb(242,216,29)" fg:x="0" fg:w="55"/><text x="0.2500%" y="447.50">libdyld.dylib`start</text></g><g><title>libsystem_kernel.dylib`__exit (4 samples, 7.27%)</title><rect x="92.7273%" y="421" width="7.2727%" height="15" fill="rgb(230,116,27)" fg:x="51" fg:w="4"/><text x="92.9773%" y="431.50">libsystem_..</text></g></svg></svg>

+ 3 - 3
packages/core/src/component.rs

@@ -40,7 +40,7 @@ impl<'a, const A: bool> FragmentBuilder<'a, A> {
 /// ## Example
 ///
 /// ```rust, ignore
-/// fn App(cx: Context, props: &()) -> Element {
+/// fn App(cx: Scope<()>) -> Element {
 ///     cx.render(rsx!{
 ///         CustomCard {
 ///             h1 {}2
@@ -54,11 +54,11 @@ impl<'a, const A: bool> FragmentBuilder<'a, A> {
 ///     children: Element
 /// }
 ///
-/// fn CustomCard(cx: Context, props: &CardProps) -> Element {
+/// fn CustomCard(cx: Scope<CardProps>) -> Element {
 ///     cx.render(rsx!{
 ///         div {
 ///             h1 {"Title card"}
-///             {props.children}
+///             {cx.props.children}
 ///         }
 ///     })
 /// }

+ 114 - 133
packages/core/src/diff.rs

@@ -239,15 +239,6 @@ impl<'bump> DiffStack<'bump> {
 }
 
 impl<'bump> DiffState<'bump> {
-    pub fn diff_scope(&mut self, id: ScopeId) {
-        let (old, new) = (self.scopes.wip_head(id), self.scopes.fin_head(id));
-        self.stack.push(DiffInstruction::Diff { old, new });
-        self.stack.scope_stack.push(id);
-        let scope = self.scopes.get_scope(id).unwrap();
-        self.stack.element_stack.push(scope.container);
-        self.work(|| false);
-    }
-
     /// Progress the diffing for this "fiber"
     ///
     /// This method implements a depth-first iterative tree traversal.
@@ -302,7 +293,7 @@ impl<'bump> DiffState<'bump> {
                 for child in el.children.iter() {
                     num_on_stack += self.push_all_nodes(child);
                 }
-                self.mutations.push_root(el.dom_id.get().unwrap());
+                self.mutations.push_root(el.id.get().unwrap());
 
                 num_on_stack + 1
             }
@@ -358,7 +349,7 @@ impl<'bump> DiffState<'bump> {
         let real_id = self.scopes.reserve_node(node);
 
         self.mutations.create_text_node(vtext.text, real_id);
-        vtext.dom_id.set(Some(real_id));
+        vtext.id.set(Some(real_id));
         self.stack.add_child_count(1);
     }
 
@@ -366,20 +357,20 @@ impl<'bump> DiffState<'bump> {
         let real_id = self.scopes.reserve_node(node);
 
         self.mutations.create_placeholder(real_id);
-        anchor.dom_id.set(Some(real_id));
+        anchor.id.set(Some(real_id));
 
         self.stack.add_child_count(1);
     }
 
     fn create_element_node(&mut self, element: &'bump VElement<'bump>, node: &'bump VNode<'bump>) {
         let VElement {
-            tag_name,
+            tag: tag_name,
             listeners,
             attributes,
             children,
             namespace,
-            dom_id,
-            parent_id,
+            id: dom_id,
+            parent: parent_id,
             ..
         } = element;
 
@@ -415,7 +406,7 @@ impl<'bump> DiffState<'bump> {
         }
 
         // todo: the settext optimization
-
+        //
         // if children.len() == 1 {
         //     if let VNode::Text(vtext) = children[0] {
         //         self.mutations.set_text(vtext.text, real_id.as_u64());
@@ -436,51 +427,37 @@ impl<'bump> DiffState<'bump> {
         let parent_idx = self.stack.current_scope().unwrap();
 
         // Insert a new scope into our component list
-        let parent_scope = self.scopes.get_scope(parent_idx).unwrap();
-        let height = parent_scope.height + 1;
-        let subtree = parent_scope.subtree.get();
-
-        let parent_scope = unsafe { self.scopes.get_scope_raw(parent_idx) };
-        let caller = unsafe { std::mem::transmute(vcomponent.caller as *const _) };
-        let fc_ptr = vcomponent.user_fc;
-
-        let container = *self.stack.element_stack.last().unwrap();
-
-        let new_idx =
-            self.scopes
-                .new_with_key(fc_ptr, caller, parent_scope, container, height, subtree);
+        let props: Box<dyn AnyProps + 'bump> = vcomponent.props.borrow_mut().take().unwrap();
+        let props: Box<dyn AnyProps + 'static> = unsafe { std::mem::transmute(props) };
+        let new_idx = self.scopes.new_with_key(
+            vcomponent.user_fc,
+            props,
+            Some(parent_idx),
+            self.stack.element_stack.last().copied().unwrap(),
+            0,
+        );
 
         // Actually initialize the caller's slot with the right address
-        vcomponent.associated_scope.set(Some(new_idx));
+        vcomponent.scope.set(Some(new_idx));
 
-        if !vcomponent.can_memoize {
-            let cur_scope = self.scopes.get_scope(parent_idx).unwrap();
-            let extended = unsafe { std::mem::transmute(vcomponent) };
-            cur_scope.items.borrow_mut().borrowed_props.push(extended);
-        } else {
-            // the props are currently bump allocated but we need to move them to the heap
+        match vcomponent.can_memoize {
+            true => {
+                // todo: implement promotion logic. save us from boxing props that we don't need
+            }
+            false => {
+                // track this component internally so we know the right drop order
+                let cur_scope = self.scopes.get_scope(parent_idx).unwrap();
+                let extended = unsafe { std::mem::transmute(vcomponent) };
+                cur_scope.items.borrow_mut().borrowed_props.push(extended);
+            }
         }
 
-        // TODO: add noderefs to current noderef list Noderefs
-        let _new_component = self.scopes.get_scope(new_idx).unwrap();
-
-        log::debug!(
-            "initializing component {:?} with height {:?}",
-            new_idx,
-            height + 1
-        );
-
         // Run the scope for one iteration to initialize it
-        if self.scopes.run_scope(new_idx) {
-            // Take the node that was just generated from running the component
-            let nextnode = self.scopes.fin_head(new_idx);
-            self.stack.create_component(new_idx, nextnode);
-
-            // todo: subtrees
-            // if new_component.is_subtree_root.get() {
-            //     self.stack.push_subtree();
-            // }
-        }
+        self.scopes.run_scope(new_idx);
+
+        // Take the node that was just generated from running the component
+        let nextnode = self.scopes.fin_head(new_idx);
+        self.stack.create_component(new_idx, nextnode);
 
         // Finally, insert this scope as a seen node.
         self.mutations.dirty_scopes.insert(new_idx);
@@ -494,15 +471,30 @@ impl<'bump> DiffState<'bump> {
         use VNode::*;
         match (old_node, new_node) {
             // Check the most common cases first
+            // these are *actual* elements, not wrappers around lists
             (Text(old), Text(new)) => {
                 self.diff_text_nodes(old, new, old_node, new_node);
             }
+            (Element(old), Element(new)) => self.diff_element_nodes(old, new, old_node, new_node),
+            (Placeholder(old), Placeholder(new)) => {
+                if let Some(root) = old.id.get() {
+                    self.scopes.update_node(new_node, root);
+                    new.id.set(Some(root))
+                }
+            }
+
+            // These two sets are pointers to nodes but are not actually nodes themselves
             (Component(old), Component(new)) => {
                 self.diff_component_nodes(old_node, new_node, *old, *new)
             }
             (Fragment(old), Fragment(new)) => self.diff_fragment_nodes(old, new),
-            (Placeholder(old), Placeholder(new)) => new.dom_id.set(old.dom_id.get()),
-            (Element(old), Element(new)) => self.diff_element_nodes(old, new, old_node, new_node),
+
+            // The normal pathway still works, but generates slightly weird instructions
+            // This pathway just ensures we get create and replace
+            (Placeholder(_), Fragment(new)) => {
+                self.stack
+                    .create_children(new.children, MountType::Replace { old: old_node });
+            }
 
             // Anything else is just a basic replace and create
             (
@@ -521,13 +513,13 @@ impl<'bump> DiffState<'bump> {
         _old_node: &'bump VNode<'bump>,
         new_node: &'bump VNode<'bump>,
     ) {
-        if let Some(root) = old.dom_id.get() {
+        if let Some(root) = old.id.get() {
             if old.text != new.text {
                 self.mutations.set_text(new.text, root.as_u64());
             }
             self.scopes.update_node(new_node, root);
 
-            new.dom_id.set(Some(root));
+            new.id.set(Some(root));
         }
     }
 
@@ -538,13 +530,13 @@ impl<'bump> DiffState<'bump> {
         old_node: &'bump VNode<'bump>,
         new_node: &'bump VNode<'bump>,
     ) {
-        let root = old.dom_id.get().unwrap();
+        let root = old.id.get().unwrap();
 
         // If the element type is completely different, the element needs to be re-rendered completely
         // This is an optimization React makes due to how users structure their code
         //
         // This case is rather rare (typically only in non-keyed lists)
-        if new.tag_name != old.tag_name || new.namespace != old.namespace {
+        if new.tag != old.tag || new.namespace != old.namespace {
             // maybe make this an instruction?
             // issue is that we need the "vnode" but this method only has the velement
             self.stack.push_nodes_created(0);
@@ -557,8 +549,8 @@ impl<'bump> DiffState<'bump> {
 
         self.scopes.update_node(new_node, root);
 
-        new.dom_id.set(Some(root));
-        new.parent_id.set(old.parent_id.get());
+        new.id.set(Some(root));
+        new.parent.set(old.parent.get());
 
         // todo: attributes currently rely on the element on top of the stack, but in theory, we only need the id of the
         // element to modify its attributes.
@@ -634,7 +626,9 @@ impl<'bump> DiffState<'bump> {
         }
 
         // todo: this is for the "settext" optimization
-        // it works, but i'm not sure if it's the direction we want to take
+        // it works, but i'm not sure if it's the direction we want to take right away
+        // I haven't benchmarked the performance imporvemenet yet. Perhaps
+        // we can make it a config?
 
         // match (old.children.len(), new.children.len()) {
         //     (0, 0) => {}
@@ -699,40 +693,56 @@ impl<'bump> DiffState<'bump> {
         old: &'bump VComponent<'bump>,
         new: &'bump VComponent<'bump>,
     ) {
-        let scope_addr = old.associated_scope.get().unwrap();
-
-        log::debug!(
-            "Diffing components. old_scope: {:?}, old_addr: {:?}, new_addr: {:?}",
-            scope_addr,
-            old.user_fc,
-            new.user_fc
-        );
+        let scope_addr = old.scope.get().unwrap();
 
         // Make sure we're dealing with the same component (by function pointer)
         if old.user_fc == new.user_fc {
             self.stack.scope_stack.push(scope_addr);
 
             // Make sure the new component vnode is referencing the right scope id
-            new.associated_scope.set(Some(scope_addr));
+            new.scope.set(Some(scope_addr));
 
             // make sure the component's caller function is up to date
-            let scope = unsafe {
-                self.scopes
-                    .get_scope_mut(scope_addr)
-                    .unwrap_or_else(|| panic!("could not find {:?}", scope_addr))
+            let scope = self
+                .scopes
+                .get_scope(scope_addr)
+                .unwrap_or_else(|| panic!("could not find {:?}", scope_addr));
+
+            // take the new props out regardless
+            // when memoizing, push to the existing scope if memoization happens
+            let new_props = new.props.borrow_mut().take().unwrap();
+
+            let should_run = {
+                if old.can_memoize {
+                    let props_are_the_same = unsafe {
+                        scope
+                            .props
+                            .borrow()
+                            .as_ref()
+                            .unwrap()
+                            .memoize(new_props.as_ref())
+                    };
+                    !props_are_the_same || self.force_diff
+                } else {
+                    true
+                }
             };
 
-            scope.caller = unsafe { std::mem::transmute(new.caller) };
+            if should_run {
+                let _old_props = scope
+                    .props
+                    .replace(unsafe { std::mem::transmute(Some(new_props)) });
 
-            // React doesn't automatically memoize, but we do.
-            let props_are_the_same = old.comparator.unwrap();
-
-            if (self.force_diff || !props_are_the_same(new)) && self.scopes.run_scope(scope_addr) {
+                // this should auto drop the previous props
+                self.scopes.run_scope(scope_addr);
                 self.diff_node(
                     self.scopes.wip_head(scope_addr),
                     self.scopes.fin_head(scope_addr),
                 );
-            }
+            } else {
+                // memoization has taken place
+                drop(new_props);
+            };
 
             self.stack.scope_stack.pop();
         } else {
@@ -778,30 +788,8 @@ impl<'bump> DiffState<'bump> {
         // Remember, fragments can never be empty (they always have a single child)
         match (old, new) {
             ([], []) => {}
-            ([], _) => {
-                // we need to push the
-                self.stack.create_children(new, MountType::Append);
-            }
-            (_, []) => {
-                self.remove_nodes(old, true);
-            }
-            ([VNode::Placeholder(old_anchor)], [VNode::Placeholder(new_anchor)]) => {
-                old_anchor.dom_id.set(new_anchor.dom_id.get());
-            }
-            ([VNode::Placeholder(_)], _) => {
-                self.stack
-                    .create_children(new, MountType::Replace { old: &old[0] });
-            }
-            (_, [VNode::Placeholder(_)]) => {
-                let new: &'bump VNode<'bump> = &new[0];
-                if let Some(first_old) = old.get(0) {
-                    self.remove_nodes(&old[1..], true);
-                    self.stack
-                        .create_node(new, MountType::Replace { old: first_old });
-                } else {
-                    self.stack.create_node(new, MountType::Append {});
-                }
-            }
+            ([], _) => self.stack.create_children(new, MountType::Append),
+            (_, []) => self.remove_nodes(old, true),
             _ => {
                 let new_is_keyed = new[0].key().is_some();
                 let old_is_keyed = old[0].key().is_some();
@@ -1192,14 +1180,14 @@ impl<'bump> DiffState<'bump> {
 
         loop {
             match &search_node.take().unwrap() {
-                VNode::Text(t) => break t.dom_id.get(),
-                VNode::Element(t) => break t.dom_id.get(),
-                VNode::Placeholder(t) => break t.dom_id.get(),
+                VNode::Text(t) => break t.id.get(),
+                VNode::Element(t) => break t.id.get(),
+                VNode::Placeholder(t) => break t.id.get(),
                 VNode::Fragment(frag) => {
                     search_node = frag.children.last();
                 }
                 VNode::Component(el) => {
-                    let scope_id = el.associated_scope.get().unwrap();
+                    let scope_id = el.scope.get().unwrap();
                     search_node = Some(self.scopes.root_node(scope_id));
                 }
             }
@@ -1216,12 +1204,12 @@ impl<'bump> DiffState<'bump> {
                     search_node = Some(&frag.children[0]);
                 }
                 VNode::Component(el) => {
-                    let scope_id = el.associated_scope.get().unwrap();
+                    let scope_id = el.scope.get().unwrap();
                     search_node = Some(self.scopes.root_node(scope_id));
                 }
-                VNode::Text(t) => break t.dom_id.get(),
-                VNode::Element(t) => break t.dom_id.get(),
-                VNode::Placeholder(t) => break t.dom_id.get(),
+                VNode::Text(t) => break t.id.get(),
+                VNode::Element(t) => break t.id.get(),
+                VNode::Placeholder(t) => break t.id.get(),
             }
         }
     }
@@ -1233,8 +1221,6 @@ impl<'bump> DiffState<'bump> {
                     .try_mounted_id()
                     .unwrap_or_else(|| panic!("broke on {:?}", old));
 
-                log::debug!("element parent is {:?}", el.parent_id.get());
-
                 self.mutations.replace_with(id, nodes_created as u32);
                 self.remove_nodes(el.children, false);
             }
@@ -1253,11 +1239,11 @@ impl<'bump> DiffState<'bump> {
             }
 
             VNode::Component(c) => {
-                let node = self.scopes.fin_head(c.associated_scope.get().unwrap());
+                let node = self.scopes.fin_head(c.scope.get().unwrap());
                 self.replace_node(node, nodes_created);
 
-                let scope_id = c.associated_scope.get().unwrap();
-                log::debug!("Destroying scope {:?}", scope_id);
+                let scope_id = c.scope.get().unwrap();
+
                 self.scopes.try_remove(scope_id).unwrap();
             }
         }
@@ -1265,7 +1251,7 @@ impl<'bump> DiffState<'bump> {
 
     /// schedules nodes for garbage collection and pushes "remove" to the mutation stack
     /// remove can happen whenever
-    fn remove_nodes(
+    pub(crate) fn remove_nodes(
         &mut self,
         nodes: impl IntoIterator<Item = &'bump VNode<'bump>>,
         gen_muts: bool,
@@ -1275,7 +1261,7 @@ impl<'bump> DiffState<'bump> {
             match node {
                 VNode::Text(t) => {
                     // this check exists because our null node will be removed but does not have an ID
-                    if let Some(id) = t.dom_id.get() {
+                    if let Some(id) = t.id.get() {
                         self.scopes.collect_garbage(id);
 
                         if gen_muts {
@@ -1284,7 +1270,7 @@ impl<'bump> DiffState<'bump> {
                     }
                 }
                 VNode::Placeholder(a) => {
-                    let id = a.dom_id.get().unwrap();
+                    let id = a.id.get().unwrap();
                     self.scopes.collect_garbage(id);
 
                     if gen_muts {
@@ -1292,7 +1278,7 @@ impl<'bump> DiffState<'bump> {
                     }
                 }
                 VNode::Element(e) => {
-                    let id = e.dom_id.get().unwrap();
+                    let id = e.id.get().unwrap();
 
                     if gen_muts {
                         self.mutations.remove(id.as_u64());
@@ -1306,20 +1292,15 @@ impl<'bump> DiffState<'bump> {
                 }
 
                 VNode::Component(c) => {
-                    self.destroy_vomponent(c, gen_muts);
+                    let scope_id = c.scope.get().unwrap();
+                    let root = self.scopes.root_node(scope_id);
+                    self.remove_nodes(Some(root), gen_muts);
+                    self.scopes.try_remove(scope_id).unwrap();
                 }
             }
         }
     }
 
-    fn destroy_vomponent(&mut self, vc: &VComponent, gen_muts: bool) {
-        let scope_id = vc.associated_scope.get().unwrap();
-        let root = self.scopes.root_node(scope_id);
-        self.remove_nodes(Some(root), gen_muts);
-        log::debug!("Destroying scope {:?}", scope_id);
-        self.scopes.try_remove(scope_id).unwrap();
-    }
-
     /// Adds a listener closure to a scope during diff.
     fn attach_listener_to_scope(&mut self, listener: &'bump Listener<'bump>, scope: &ScopeState) {
         let long_listener = unsafe { std::mem::transmute(listener) };

+ 18 - 1
packages/core/src/lazynodes.rs

@@ -35,7 +35,6 @@ enum StackNodeStorage<'a, 'b> {
 }
 
 impl<'a, 'b> LazyNodes<'a, 'b> {
-    
     pub fn new_some<F>(_val: F) -> Option<Self>
     where
         F: FnOnce(NodeFactory<'a>) -> VNode<'a> + 'b,
@@ -43,6 +42,24 @@ impl<'a, 'b> LazyNodes<'a, 'b> {
         Some(Self::new(_val))
     }
 
+    /// force this call onto the stack
+    pub fn new_boxed<F>(_val: F) -> Option<Self>
+    where
+        F: FnOnce(NodeFactory<'a>) -> VNode<'a> + 'b,
+    {
+        // there's no way to call FnOnce without a box, so we need to store it in a slot and use static dispatch
+        let mut slot = Some(_val);
+
+        let val = move |fac: Option<NodeFactory<'a>>| {
+            let inner = slot.take().unwrap();
+            fac.map(inner)
+        };
+
+        Some(Self {
+            inner: StackNodeStorage::Heap(Box::new(val)),
+        })
+    }
+
     pub fn new<F>(_val: F) -> Self
     where
         F: FnOnce(NodeFactory<'a>) -> VNode<'a> + 'b,

+ 52 - 5
packages/core/src/lib.rs

@@ -6,8 +6,7 @@ pub(crate) mod diff;
 pub(crate) mod lazynodes;
 pub(crate) mod mutations;
 pub(crate) mod nodes;
-pub(crate) mod scope;
-pub(crate) mod scopearena;
+pub(crate) mod scopes;
 pub(crate) mod virtual_dom;
 
 pub(crate) mod innerlude {
@@ -16,12 +15,51 @@ pub(crate) mod innerlude {
     pub use crate::lazynodes::*;
     pub use crate::mutations::*;
     pub use crate::nodes::*;
-    pub use crate::scope::*;
-    pub(crate) use crate::scopearena::*;
+    pub use crate::scopes::*;
     pub use crate::virtual_dom::*;
 
+    /// An [`Element`] is a possibly-none [`VNode`] created by calling `render` on [`Scope`] or [`ScopeState`].
+    ///
+    /// Any [`None`] [`Element`] will automatically be coerced into a placeholder [`VNode`] with the [`VNode::Placeholder`] variant.
     pub type Element<'a> = Option<VNode<'a>>;
-    pub type Component<P> = for<'a> fn(Scope<'a, P>) -> Element<'a>;
+
+    /// A [`Component`] is a function that takes a [`Scope`] and returns an [`Element`].
+    ///
+    /// Components can be used in other components with two syntax options:
+    /// - lowercase as a function call with named arguments (rust style)
+    /// - uppercase as an element (react style)
+    ///
+    /// ## Rust-Style
+    ///
+    /// ```rust
+    /// fn example(cx: Scope<Props>) -> Element {
+    ///     // ...
+    /// }
+    ///
+    /// rsx!(
+    ///     example()
+    /// )
+    /// ```
+    /// ## React-Style
+    /// ```rust
+    /// fn Example(cx: Scope<Props>) -> Element {
+    ///     // ...
+    /// }
+    ///
+    /// rsx!(
+    ///     Example {}
+    /// )
+    /// ```
+    ///
+    /// ## As a closure
+    /// This particular type alias lets you even use static closures for pure/static components:
+    ///
+    /// ```rust
+    /// static Example: Component<Props> = |cx| {
+    ///     // ...
+    /// };
+    /// ```
+    pub type Component<P> = fn(Scope<P>) -> Element;
 }
 
 pub use crate::innerlude::{
@@ -46,3 +84,12 @@ pub mod exports {
     pub use bumpalo;
     pub use futures_channel;
 }
+
+/// Functions that wrap unsafe functionality to prevent us from misusing it at the callsite
+pub(crate) mod unsafe_utils {
+    use crate::VNode;
+
+    pub unsafe fn extend_vnode<'a, 'b>(node: &'a VNode<'a>) -> &'b VNode<'b> {
+        std::mem::transmute(node)
+    }
+}

+ 5 - 0
packages/core/src/mutations.rs

@@ -45,6 +45,11 @@ pub enum DomEdit<'bump> {
         many: u32,
     },
 
+    // // save a possibly-fragment node as a template
+    // SaveAsTemplate {
+    //     many: u32,
+    // },
+
     // "Root" refers to the item directly
     // it's a waste of an instruction to push the root directly
     ReplaceWith {

部分文件因为文件数量过多而无法显示