Showing preview only (5,854K chars total). Download the full file or copy to clipboard to get everything.
Repository: yewstack/yew
Branch: master
Commit: 195730db49c2
Files: 1780
Total size: 5.2 MB
Directory structure:
gitextract_gxaqlxdv/
├── .cargo/
│ └── config.toml
├── .firebaserc
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── documentation.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── auto-approve-maintainer-pr.yml
│ ├── benchmark-core.yml
│ ├── benchmark-ssr.yml
│ ├── benchmark.yml
│ ├── build-api-docs.yml
│ ├── build-website.yml
│ ├── clippy.yml
│ ├── fmt.yml
│ ├── inspect-next-changelogs.yml
│ ├── main-checks.yml
│ ├── post-benchmark-core.yml
│ ├── post-benchmark-ssr.yml
│ ├── post-benchmark.yml
│ ├── post-size-cmp.yml
│ ├── publish-api-docs.yml
│ ├── publish-examples.yml
│ ├── publish-website.yml
│ ├── publish.yml
│ ├── size-cmp.yml
│ └── test-website.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE-APACHE
├── LICENSE-MIT
├── Makefile.toml
├── README.md
├── SECURITY.md
├── _typos.toml
├── api-docs/
│ ├── .gitignore
│ ├── before-content.html
│ └── styles.css
├── ci/
│ ├── collect_sizes.py
│ ├── install-wasm-bindgen-cli.sh
│ ├── make_benchmark_ssr_cmt.py
│ ├── make_example_size_cmt.py
│ └── write-min-size-flags.sh
├── examples/
│ ├── .cargo/
│ │ ├── config.toml
│ │ ├── dummy-min-size-config.toml
│ │ └── min-size-config.toml
│ ├── .gitignore
│ ├── README.md
│ ├── async_clock/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── main.rs
│ │ └── services.rs
│ ├── boids/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── boid.rs
│ │ ├── main.rs
│ │ ├── math.rs
│ │ ├── settings.rs
│ │ ├── simulation.rs
│ │ └── slider.rs
│ ├── communication_child_to_parent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_grandchild_with_grandparent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── grandparent.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_grandparent_to_grandchild/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── grandparent.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_parent_to_child/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── contexts/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ ├── msg_ctx.rs
│ │ ├── producer.rs
│ │ ├── struct_component_producer.rs
│ │ ├── struct_component_subscriber.rs
│ │ └── subscriber.rs
│ ├── counter/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── counter_functional/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── dyn_create_destroy_apps/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── counter.rs
│ │ └── main.rs
│ ├── file_upload/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── function_delayed_input/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── function_memory_game/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── scss/
│ │ │ ├── chess_board.scss
│ │ │ ├── chess_board_card.scss
│ │ │ ├── game_progress.scss
│ │ │ ├── game_status_board.scss
│ │ │ ├── index.scss
│ │ │ ├── score_board.scss
│ │ │ └── score_board_best_score.scss
│ │ └── src/
│ │ ├── components/
│ │ │ ├── app.rs
│ │ │ ├── chessboard.rs
│ │ │ ├── chessboard_card.rs
│ │ │ ├── game_status_board.rs
│ │ │ ├── score_board.rs
│ │ │ ├── score_board_best_score.rs
│ │ │ ├── score_board_logo.rs
│ │ │ └── score_board_progress.rs
│ │ ├── components.rs
│ │ ├── constant.rs
│ │ ├── helper.rs
│ │ ├── main.rs
│ │ └── state.rs
│ ├── function_router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── data/
│ │ │ ├── keywords.txt
│ │ │ ├── syllables.txt
│ │ │ └── yew.txt
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── app.rs
│ │ ├── bin/
│ │ │ └── function_router.rs
│ │ ├── components/
│ │ │ ├── author_card.rs
│ │ │ ├── mod.rs
│ │ │ ├── nav.rs
│ │ │ ├── pagination.rs
│ │ │ ├── post_card.rs
│ │ │ └── progress_delay.rs
│ │ ├── content.rs
│ │ ├── generator.rs
│ │ ├── imagegen.rs
│ │ ├── lib.rs
│ │ └── pages/
│ │ ├── author.rs
│ │ ├── author_list.rs
│ │ ├── home.rs
│ │ ├── mod.rs
│ │ ├── page_not_found.rs
│ │ ├── post.rs
│ │ └── post_list.rs
│ ├── function_todomvc/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── components/
│ │ │ ├── entry.rs
│ │ │ ├── filter.rs
│ │ │ ├── header_input.rs
│ │ │ └── info_footer.rs
│ │ ├── components.rs
│ │ ├── hooks/
│ │ │ └── use_bool_toggle.rs
│ │ ├── hooks.rs
│ │ ├── main.rs
│ │ └── state.rs
│ ├── futures/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ └── markdown.rs
│ ├── game_of_life/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── conway.rs
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── immutable/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── array.rs
│ │ ├── main.rs
│ │ ├── map.rs
│ │ └── string.rs
│ ├── inner_html/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── document.html
│ │ └── main.rs
│ ├── js_callback/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── js/
│ │ │ ├── imp.js
│ │ │ └── unimp.js
│ │ ├── src/
│ │ │ ├── bindings.rs
│ │ │ └── main.rs
│ │ └── trunk_post_build.rs
│ ├── keyed_list/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── main.rs
│ │ │ ├── person.rs
│ │ │ └── random.rs
│ │ └── styles.css
│ ├── mount_point/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── nested_list/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── app.rs
│ │ │ ├── header.rs
│ │ │ ├── item.rs
│ │ │ ├── list.rs
│ │ │ └── main.rs
│ │ └── styles.scss
│ ├── node_refs/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── input.rs
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── password_strength/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── app.rs
│ │ ├── main.rs
│ │ ├── password.rs
│ │ └── text_input.rs
│ ├── portals/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── data/
│ │ │ ├── keywords.txt
│ │ │ ├── syllables.txt
│ │ │ └── yew.txt
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── components/
│ │ │ ├── author_card.rs
│ │ │ ├── mod.rs
│ │ │ ├── pagination.rs
│ │ │ ├── post_card.rs
│ │ │ └── progress_delay.rs
│ │ ├── content.rs
│ │ ├── generator.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ └── pages/
│ │ ├── author.rs
│ │ ├── author_list.rs
│ │ ├── home.rs
│ │ ├── mod.rs
│ │ ├── page_not_found.rs
│ │ ├── post.rs
│ │ └── post_list.rs
│ ├── simple_ssr/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── bin/
│ │ │ │ ├── simple_ssr_hydrate.rs
│ │ │ │ └── simple_ssr_server.rs
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── e2e.rs
│ ├── ssr_router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── bin/
│ │ │ │ ├── ssr_router_hydrate.rs
│ │ │ │ └── ssr_router_server.rs
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── e2e.rs
│ ├── suspense/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── main.rs
│ │ ├── struct_consumer.rs
│ │ └── use_sleep.rs
│ ├── timer/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── timer_functional/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── todomvc/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ └── state.rs
│ ├── two_apps/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── wasi_ssr_module/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ ├── main.rs
│ │ └── router.rs
│ ├── web_worker_fib/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── agent.rs
│ │ ├── bin/
│ │ │ ├── app.rs
│ │ │ └── worker.rs
│ │ └── lib.rs
│ ├── web_worker_prime/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── agent.rs
│ │ ├── bin/
│ │ │ ├── app.rs
│ │ │ └── worker.rs
│ │ └── lib.rs
│ └── webgl/
│ ├── Cargo.toml
│ ├── README.md
│ ├── Trunk.toml
│ ├── index.html
│ └── src/
│ ├── basic.frag
│ ├── basic.vert
│ └── main.rs
├── firebase.json
├── packages/
│ ├── yew/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── src/
│ │ │ ├── app_handle.rs
│ │ │ ├── callback.rs
│ │ │ ├── context.rs
│ │ │ ├── dom_bundle/
│ │ │ │ ├── bcomp.rs
│ │ │ │ ├── blist.rs
│ │ │ │ ├── bnode.rs
│ │ │ │ ├── bportal.rs
│ │ │ │ ├── braw.rs
│ │ │ │ ├── bsuspense.rs
│ │ │ │ ├── btag/
│ │ │ │ │ ├── attributes.rs
│ │ │ │ │ ├── listeners.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── btext.rs
│ │ │ │ ├── fragment.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── position.rs
│ │ │ │ ├── subtree_root.rs
│ │ │ │ ├── traits.rs
│ │ │ │ └── utils.rs
│ │ │ ├── functional/
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── use_callback.rs
│ │ │ │ │ ├── use_context.rs
│ │ │ │ │ ├── use_effect.rs
│ │ │ │ │ ├── use_force_update.rs
│ │ │ │ │ ├── use_memo.rs
│ │ │ │ │ ├── use_prepared_state/
│ │ │ │ │ │ ├── feat_hydration.rs
│ │ │ │ │ │ ├── feat_hydration_ssr.rs
│ │ │ │ │ │ ├── feat_none.rs
│ │ │ │ │ │ ├── feat_ssr.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── use_reducer.rs
│ │ │ │ │ ├── use_ref.rs
│ │ │ │ │ ├── use_state.rs
│ │ │ │ │ └── use_transitive_state/
│ │ │ │ │ ├── feat_hydration.rs
│ │ │ │ │ ├── feat_hydration_ssr.rs
│ │ │ │ │ ├── feat_none.rs
│ │ │ │ │ ├── feat_ssr.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── html/
│ │ │ │ ├── classes.rs
│ │ │ │ ├── component/
│ │ │ │ │ ├── children.rs
│ │ │ │ │ ├── lifecycle.rs
│ │ │ │ │ ├── marker.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── properties.rs
│ │ │ │ │ └── scope.rs
│ │ │ │ ├── conversion/
│ │ │ │ │ ├── into_prop_value.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── listener/
│ │ │ │ │ ├── events.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── lib.rs
│ │ │ ├── platform.rs
│ │ │ ├── renderer.rs
│ │ │ ├── scheduler.rs
│ │ │ ├── sealed.rs
│ │ │ ├── server_renderer.rs
│ │ │ ├── suspense/
│ │ │ │ ├── component.rs
│ │ │ │ ├── hooks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── suspension.rs
│ │ │ ├── tests/
│ │ │ │ ├── layout_tests.rs
│ │ │ │ └── mod.rs
│ │ │ ├── utils/
│ │ │ │ └── mod.rs
│ │ │ └── virtual_dom/
│ │ │ ├── key.rs
│ │ │ ├── listeners.rs
│ │ │ ├── mod.rs
│ │ │ ├── vcomp.rs
│ │ │ ├── vlist.rs
│ │ │ ├── vnode.rs
│ │ │ ├── vportal.rs
│ │ │ ├── vraw.rs
│ │ │ ├── vsuspense.rs
│ │ │ ├── vtag.rs
│ │ │ └── vtext.rs
│ │ └── tests/
│ │ ├── common/
│ │ │ └── mod.rs
│ │ ├── hydration.rs
│ │ ├── layout.rs
│ │ ├── mod.rs
│ │ ├── raw_html.rs
│ │ ├── suspense.rs
│ │ ├── use_callback.rs
│ │ ├── use_context.rs
│ │ ├── use_effect.rs
│ │ ├── use_memo.rs
│ │ ├── use_prepared_state.rs
│ │ ├── use_reducer.rs
│ │ ├── use_ref.rs
│ │ ├── use_state.rs
│ │ └── use_transitive_state.rs
│ ├── yew-agent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ ├── codec.rs
│ │ ├── lib.rs
│ │ ├── oneshot/
│ │ │ ├── bridge.rs
│ │ │ ├── hooks.rs
│ │ │ ├── mod.rs
│ │ │ ├── provider.rs
│ │ │ ├── registrar.rs
│ │ │ ├── spawner.rs
│ │ │ ├── traits.rs
│ │ │ └── worker.rs
│ │ ├── reach.rs
│ │ ├── reactor/
│ │ │ ├── bridge.rs
│ │ │ ├── hooks.rs
│ │ │ ├── messages.rs
│ │ │ ├── mod.rs
│ │ │ ├── provider.rs
│ │ │ ├── registrar.rs
│ │ │ ├── scope.rs
│ │ │ ├── spawner.rs
│ │ │ ├── traits.rs
│ │ │ └── worker.rs
│ │ ├── scope_ext.rs
│ │ ├── traits.rs
│ │ ├── utils.rs
│ │ └── worker/
│ │ ├── bridge.rs
│ │ ├── handler_id.rs
│ │ ├── hooks.rs
│ │ ├── lifecycle.rs
│ │ ├── messages.rs
│ │ ├── mod.rs
│ │ ├── native_worker.rs
│ │ ├── provider.rs
│ │ ├── registrar.rs
│ │ ├── scope.rs
│ │ ├── spawner.rs
│ │ └── traits.rs
│ ├── yew-agent-macro/
│ │ ├── Cargo.toml
│ │ ├── release.toml
│ │ └── src/
│ │ ├── agent_fn.rs
│ │ ├── lib.rs
│ │ ├── oneshot.rs
│ │ └── reactor.rs
│ ├── yew-macro/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── release.toml
│ │ ├── src/
│ │ │ ├── classes/
│ │ │ │ └── mod.rs
│ │ │ ├── derive_props/
│ │ │ │ ├── builder.rs
│ │ │ │ ├── field.rs
│ │ │ │ ├── generics.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── wrapper.rs
│ │ │ ├── function_component.rs
│ │ │ ├── hook/
│ │ │ │ ├── body.rs
│ │ │ │ ├── lifetime.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── signature.rs
│ │ │ ├── html_tree/
│ │ │ │ ├── html_block.rs
│ │ │ │ ├── html_component.rs
│ │ │ │ ├── html_dashed_name.rs
│ │ │ │ ├── html_element.rs
│ │ │ │ ├── html_for.rs
│ │ │ │ ├── html_if.rs
│ │ │ │ ├── html_iterable.rs
│ │ │ │ ├── html_list.rs
│ │ │ │ ├── html_node.rs
│ │ │ │ ├── lint/
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tag.rs
│ │ │ ├── lib.rs
│ │ │ ├── props/
│ │ │ │ ├── component.rs
│ │ │ │ ├── element.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── prop.rs
│ │ │ │ └── prop_macro.rs
│ │ │ ├── stringify.rs
│ │ │ ├── use_prepared_state.rs
│ │ │ └── use_transitive_state.rs
│ │ └── tests/
│ │ ├── classes_macro/
│ │ │ ├── classes-fail.rs
│ │ │ ├── classes-fail.stderr
│ │ │ └── classes-pass.rs
│ │ ├── classes_macro_test.rs
│ │ ├── derive_props/
│ │ │ ├── fail.rs
│ │ │ ├── fail.stderr
│ │ │ └── pass.rs
│ │ ├── derive_props_test.rs
│ │ ├── function_attr_test.rs
│ │ ├── function_component_attr/
│ │ │ ├── applied-to-non-fn-fail.rs
│ │ │ ├── applied-to-non-fn-fail.stderr
│ │ │ ├── async-fail.rs
│ │ │ ├── async-fail.stderr
│ │ │ ├── bad-name-fail.rs
│ │ │ ├── bad-name-fail.stderr
│ │ │ ├── bad-props-param-fail.rs
│ │ │ ├── bad-props-param-fail.stderr
│ │ │ ├── bad-return-type-fail.rs
│ │ │ ├── bad-return-type-fail.stderr
│ │ │ ├── const-fail.rs
│ │ │ ├── const-fail.stderr
│ │ │ ├── extern-fail.rs
│ │ │ ├── extern-fail.stderr
│ │ │ ├── generic-lifetime-fail.rs
│ │ │ ├── generic-lifetime-fail.stderr
│ │ │ ├── generic-pass.rs
│ │ │ ├── generic-props-fail.rs
│ │ │ ├── generic-props-fail.stderr
│ │ │ ├── hook_location-fail.rs
│ │ │ ├── hook_location-fail.stderr
│ │ │ ├── hook_location-pass.rs
│ │ │ ├── lifetime-props-param-fail.rs
│ │ │ ├── lifetime-props-param-fail.stderr
│ │ │ ├── multiple-param-fail.rs
│ │ │ ├── multiple-param-fail.stderr
│ │ │ ├── mut-ref-props-param-fail.rs
│ │ │ ├── mut-ref-props-param-fail.stderr
│ │ │ ├── no-name-default-pass.rs
│ │ │ ├── with-defaulted-type-param-pass.rs
│ │ │ ├── with-props-pass.rs
│ │ │ ├── with-receiver-fail.rs
│ │ │ ├── with-receiver-fail.stderr
│ │ │ └── without-props-pass.rs
│ │ ├── hook_attr/
│ │ │ ├── hook-call-generics-pass.rs
│ │ │ ├── hook-const-generic-pass.rs
│ │ │ ├── hook-dynamic-dispatch-pass.rs
│ │ │ ├── hook-impl-trait-pass.rs
│ │ │ ├── hook-lifetime-pass.rs
│ │ │ ├── hook-must-use-fail.rs
│ │ │ ├── hook-must-use-fail.stderr
│ │ │ ├── hook-must-use-pass.rs
│ │ │ ├── hook-return-impl-trait-pass.rs
│ │ │ ├── hook-return-ref-pass.rs
│ │ │ ├── hook-trait-item-pass.rs
│ │ │ ├── hook_location-fail.rs
│ │ │ ├── hook_location-fail.stderr
│ │ │ ├── hook_location-pass.rs
│ │ │ ├── hook_macro-fail.rs
│ │ │ ├── hook_macro-fail.stderr
│ │ │ └── hook_macro-pass.rs
│ │ ├── hook_attr_test.rs
│ │ ├── hook_macro/
│ │ │ ├── use_prepared_state-fail.rs
│ │ │ ├── use_prepared_state-fail.stderr
│ │ │ ├── use_transitive_state-fail.rs
│ │ │ └── use_transitive_state-fail.stderr
│ │ ├── hook_macro_test.rs
│ │ ├── html_lints/
│ │ │ ├── fail.rs
│ │ │ └── fail.stderr
│ │ ├── html_lints_test.rs
│ │ ├── html_macro/
│ │ │ ├── as-return-value-pass.rs
│ │ │ ├── block-fail.rs
│ │ │ ├── block-fail.stderr
│ │ │ ├── block-pass.rs
│ │ │ ├── component-any-children-pass.rs
│ │ │ ├── component-fail.rs
│ │ │ ├── component-fail.stderr
│ │ │ ├── component-pass.rs
│ │ │ ├── component-unimplemented-fail.rs
│ │ │ ├── component-unimplemented-fail.stderr
│ │ │ ├── dyn-element-pass.rs
│ │ │ ├── element-fail.rs
│ │ │ ├── element-fail.stderr
│ │ │ ├── for-fail.rs
│ │ │ ├── for-fail.stderr
│ │ │ ├── for-pass.rs
│ │ │ ├── generic-component-fail.rs
│ │ │ ├── generic-component-fail.stderr
│ │ │ ├── generic-component-pass.rs
│ │ │ ├── html-component-fail.stderr
│ │ │ ├── html-element-pass.rs
│ │ │ ├── html-if-fail.rs
│ │ │ ├── html-if-fail.stderr
│ │ │ ├── html-if-pass.rs
│ │ │ ├── html-node-pass.rs
│ │ │ ├── iterable-fail.rs
│ │ │ ├── iterable-fail.stderr
│ │ │ ├── iterable-pass.rs
│ │ │ ├── list-fail.rs
│ │ │ ├── list-fail.stderr
│ │ │ ├── list-pass.rs
│ │ │ ├── missing-props-diagnostics-fail.rs
│ │ │ ├── missing-props-diagnostics-fail.stderr
│ │ │ ├── node-fail.rs
│ │ │ ├── node-fail.stderr
│ │ │ ├── node-pass.rs
│ │ │ └── svg-pass.rs
│ │ ├── html_macro_test.rs
│ │ ├── props_macro/
│ │ │ ├── props-fail.rs
│ │ │ ├── props-fail.stderr
│ │ │ ├── props-pass.rs
│ │ │ ├── resolve-prop-fail.rs
│ │ │ ├── resolve-prop-fail.stderr
│ │ │ └── resolve-prop-pass.rs
│ │ └── props_macro_test.rs
│ ├── yew-router/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── link.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── redirect.rs
│ │ │ ├── hooks.rs
│ │ │ ├── lib.rs
│ │ │ ├── macro_helpers.rs
│ │ │ ├── navigator.rs
│ │ │ ├── routable.rs
│ │ │ ├── router.rs
│ │ │ ├── scope_ext.rs
│ │ │ ├── switch.rs
│ │ │ └── utils.rs
│ │ └── tests/
│ │ ├── basename.rs
│ │ ├── browser_router.rs
│ │ ├── hash_router.rs
│ │ ├── link.rs
│ │ ├── router_unit_tests.rs
│ │ ├── url_encoded_routes.rs
│ │ └── utils.rs
│ └── yew-router-macro/
│ ├── Cargo.toml
│ ├── Makefile.toml
│ ├── release.toml
│ ├── src/
│ │ ├── lib.rs
│ │ └── routable_derive.rs
│ └── tests/
│ ├── routable_derive/
│ │ ├── bad-ats-fail.rs
│ │ ├── bad-ats-fail.stderr
│ │ ├── invalid-not-found-fail.rs
│ │ ├── invalid-not-found-fail.stderr
│ │ ├── relative-path-fail.rs
│ │ ├── relative-path-fail.stderr
│ │ ├── route-with-hash-fail.rs
│ │ ├── route-with-hash-fail.stderr
│ │ ├── struct-fail.rs
│ │ ├── struct-fail.stderr
│ │ ├── unnamed-fields-fail.rs
│ │ ├── unnamed-fields-fail.stderr
│ │ └── valid-pass.rs
│ └── routable_derive_test.rs
├── release.toml
├── rustfmt.toml
├── tools/
│ ├── benchmark-core/
│ │ ├── Cargo.toml
│ │ └── benches/
│ │ └── vnode.rs
│ ├── benchmark-hooks/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ └── src/
│ │ └── lib.rs
│ ├── benchmark-ssr/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── benchmark-struct/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ └── src/
│ │ └── lib.rs
│ ├── build-examples/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── bin/
│ │ │ └── update-wasm-opt.rs
│ │ ├── lib.rs
│ │ └── main.rs
│ ├── changelog/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── src/
│ │ │ ├── cli.rs
│ │ │ ├── create_log_line.rs
│ │ │ ├── create_log_lines.rs
│ │ │ ├── get_latest_version.rs
│ │ │ ├── github_fetch.rs
│ │ │ ├── github_issue_labels_fetcher.rs
│ │ │ ├── github_user_fetcher.rs
│ │ │ ├── lib.rs
│ │ │ ├── log_line.rs
│ │ │ ├── main.rs
│ │ │ ├── mod.rs
│ │ │ ├── new_version_level.rs
│ │ │ ├── stdout_tag_description_changelog.rs
│ │ │ ├── write_changelog_file.rs
│ │ │ ├── write_log_lines.rs
│ │ │ ├── write_version_changelog.rs
│ │ │ └── yew_package.rs
│ │ └── tests/
│ │ ├── generate_yew_changelog_file.rs
│ │ ├── test_base.md
│ │ └── test_expected.md
│ ├── collect-release-info/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── process-benchmark-results/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── main.rs
│ ├── ssr-e2e/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── ssr-e2e-harness/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ └── website-test/
│ ├── Cargo.toml
│ ├── Makefile.toml
│ ├── build.rs
│ └── src/
│ └── lib.rs
└── website/
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── README.md
├── babel.config.js
├── blog/
│ ├── 2022-01-20-hello-yew.md
│ ├── 2022-11-24-release-0-20.md
│ ├── 2023-09-23-release-0-21.md
│ ├── 2024-10-14-release-0-22.md
│ ├── 2025-11-29-release-0-22.md
│ └── authors.yml
├── check-translations.js
├── community/
│ ├── awesome.md
│ └── external-libs.mdx
├── docs/
│ ├── advanced-topics/
│ │ ├── children.mdx
│ │ ├── how-it-works.mdx
│ │ ├── immutable.mdx
│ │ ├── optimizations.mdx
│ │ ├── portals.mdx
│ │ ├── server-side-rendering.mdx
│ │ └── struct-components/
│ │ ├── callbacks.mdx
│ │ ├── hoc.mdx
│ │ ├── introduction.mdx
│ │ ├── lifecycle.mdx
│ │ ├── properties.mdx
│ │ ├── refs.mdx
│ │ └── scope.mdx
│ ├── concepts/
│ │ ├── agents.mdx
│ │ ├── basic-web-technologies/
│ │ │ ├── css.mdx
│ │ │ ├── html.mdx
│ │ │ ├── js.mdx
│ │ │ ├── wasm-bindgen.mdx
│ │ │ └── web-sys.mdx
│ │ ├── contexts.mdx
│ │ ├── function-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── children.mdx
│ │ │ ├── communication.mdx
│ │ │ ├── generics.mdx
│ │ │ ├── hooks/
│ │ │ │ ├── custom-hooks.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── node-refs.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── pure-components.mdx
│ │ │ └── state.mdx
│ │ ├── html/
│ │ │ ├── classes.mdx
│ │ │ ├── components.mdx
│ │ │ ├── conditional-rendering.mdx
│ │ │ ├── elements.mdx
│ │ │ ├── events.mdx
│ │ │ ├── fragments.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lists.mdx
│ │ │ └── literals-and-expressions.mdx
│ │ ├── router.mdx
│ │ └── suspense.mdx
│ ├── getting-started/
│ │ ├── build-a-sample-app.mdx
│ │ ├── editor-setup.mdx
│ │ ├── examples.mdx
│ │ └── introduction.mdx
│ ├── migration-guides/
│ │ ├── yew/
│ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ ├── from-0_21_0-to-0_22_0.mdx
│ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ ├── yew-agent/
│ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ ├── from-0_3_0-to-0_4_0.mdx
│ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ └── yew-router/
│ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ ├── from-0_16_0-to-0_17_0.mdx
│ │ └── from-0_19_0-to-0_20_0.mdx
│ ├── more/
│ │ ├── css.mdx
│ │ ├── debugging.mdx
│ │ ├── deployment.mdx
│ │ ├── roadmap.mdx
│ │ └── testing.mdx
│ └── tutorial/
│ └── index.mdx
├── docusaurus.config.js
├── i18n/
│ ├── ja/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── current.json
│ │ │ ├── version-0.20/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ └── refs.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.20.json
│ │ │ ├── version-0.21/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.md
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ └── properties.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.21.json
│ │ │ ├── version-0.22/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── version-0.22.json
│ │ │ ├── version-0.23/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ └── version-0.23.json
│ │ ├── docusaurus-plugin-content-docs-community/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-docs-router/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-pages/
│ │ │ └── index.mdx
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── zh-Hans/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── current.json
│ │ │ ├── version-0.20/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ └── refs.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ └── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.20.json
│ │ │ ├── version-0.21/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.md
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ └── custom-hooks.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ └── properties.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.21.json
│ │ │ ├── version-0.22/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── version-0.22.json
│ │ │ ├── version-0.23/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ └── version-0.23.json
│ │ ├── docusaurus-plugin-content-docs-community/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-docs-router/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-pages/
│ │ │ └── index.mdx
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ └── zh-Hant/
│ ├── code.json
│ ├── docusaurus-plugin-content-blog/
│ │ └── options.json
│ ├── docusaurus-plugin-content-docs/
│ │ ├── current/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── migration-guides/
│ │ │ │ ├── yew/
│ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ ├── yew-agent/
│ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ └── yew-router/
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ ├── current.json
│ │ ├── version-0.20/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ └── refs.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ └── router.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ └── examples.mdx
│ │ │ └── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ ├── version-0.20.json
│ │ ├── version-0.21/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.md
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ └── properties.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ └── router.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ └── examples.mdx
│ │ │ └── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ ├── version-0.21.json
│ │ ├── version-0.22/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ ├── version-0.22.json
│ │ ├── version-0.23/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── migration-guides/
│ │ │ │ ├── yew/
│ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ ├── yew-agent/
│ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ └── yew-router/
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ └── version-0.23.json
│ ├── docusaurus-plugin-content-docs-community/
│ │ └── current.json
│ ├── docusaurus-plugin-content-docs-router/
│ │ └── current.json
│ ├── docusaurus-plugin-content-pages/
│ │ └── index.mdx
│ └── docusaurus-theme-classic/
│ ├── footer.json
│ └── navbar.json
├── package.json
├── sidebars/
│ ├── community.js
│ └── docs.js
├── src/
│ ├── constants.js
│ ├── css/
│ │ └── custom.css
│ ├── pages/
│ │ ├── index.module.scss
│ │ └── index.tsx
│ └── theme/
│ └── NavbarItem/
│ └── DefaultNavbarItem.tsx
├── static/
│ ├── .nojekyll
│ └── tutorial/
│ └── data.json
├── tsconfig.json
├── versioned_docs/
│ ├── version-0.20/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.md
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ └── from-0_1_0-to-0_2_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ ├── version-0.21/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.md
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ │ └── from-0_20_0-to-next.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ └── from-0_1_0-to-0_2_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ ├── version-0.22/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.mdx
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ │ └── from-0_21_0-to-0_22_0.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ │ └── from-0_3_0-to-0_4_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ └── version-0.23/
│ ├── advanced-topics/
│ │ ├── children.mdx
│ │ ├── how-it-works.mdx
│ │ ├── immutable.mdx
│ │ ├── optimizations.mdx
│ │ ├── portals.mdx
│ │ ├── server-side-rendering.mdx
│ │ └── struct-components/
│ │ ├── callbacks.mdx
│ │ ├── hoc.mdx
│ │ ├── introduction.mdx
│ │ ├── lifecycle.mdx
│ │ ├── properties.mdx
│ │ ├── refs.mdx
│ │ └── scope.mdx
│ ├── concepts/
│ │ ├── agents.mdx
│ │ ├── basic-web-technologies/
│ │ │ ├── css.mdx
│ │ │ ├── html.mdx
│ │ │ ├── js.mdx
│ │ │ ├── wasm-bindgen.mdx
│ │ │ └── web-sys.mdx
│ │ ├── contexts.mdx
│ │ ├── function-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── children.mdx
│ │ │ ├── communication.mdx
│ │ │ ├── generics.mdx
│ │ │ ├── hooks/
│ │ │ │ ├── custom-hooks.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── node-refs.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── pure-components.mdx
│ │ │ └── state.mdx
│ │ ├── html/
│ │ │ ├── classes.mdx
│ │ │ ├── components.mdx
│ │ │ ├── conditional-rendering.mdx
│ │ │ ├── elements.mdx
│ │ │ ├── events.mdx
│ │ │ ├── fragments.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lists.mdx
│ │ │ └── literals-and-expressions.mdx
│ │ ├── router.mdx
│ │ └── suspense.mdx
│ ├── getting-started/
│ │ ├── build-a-sample-app.mdx
│ │ ├── editor-setup.mdx
│ │ ├── examples.mdx
│ │ └── introduction.mdx
│ ├── migration-guides/
│ │ ├── yew/
│ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ ├── from-0_21_0-to-0_22_0.mdx
│ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ ├── yew-agent/
│ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ ├── from-0_3_0-to-0_4_0.mdx
│ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ └── yew-router/
│ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ ├── from-0_16_0-to-0_17_0.mdx
│ │ └── from-0_19_0-to-0_20_0.mdx
│ ├── more/
│ │ ├── css.mdx
│ │ ├── debugging.mdx
│ │ ├── deployment.mdx
│ │ ├── roadmap.mdx
│ │ └── testing.mdx
│ └── tutorial/
│ └── index.mdx
├── versioned_sidebars/
│ ├── version-0.20-sidebars.json
│ ├── version-0.21-sidebars.json
│ ├── version-0.22-sidebars.json
│ └── version-0.23-sidebars.json
├── versions.json
└── write-translations.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[target.'cfg(all(target_arch = "wasm32", not(target_os = "wasi")))']
runner = 'wasm-bindgen-test-runner'
[target.'cfg(all(target_arch = "wasm32", target_os = "wasi"))']
runner = 'wasmtime -W unknown-imports-trap=y'
[target.wasm32-unknown-unknown]
rustflags = ['--cfg', 'getrandom_backend="wasm_js"']
================================================
FILE: .firebaserc
================================================
{
"projects": {
"default": "yew-rs"
},
"targets": {
"yew-rs": {
"hosting": {
"website": [
"yew-rs"
],
"examples": [
"yew-rs-examples"
],
"api": [
"yew-rs-api"
]
}
}
}
}
================================================
FILE: .gitattributes
================================================
*.mdx linguist-detectable=false
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: yew
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve Yew
title: ''
labels: bug
assignees: ''
---
**Problem**
<!-- A clear and concise description of what the bug is. -->
**Steps To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment:**
- Yew version: [e.g. v0.17, `master`]
- Rust version: [e.g. 1.43.0, `nightly`]
- Target, if relevant: [e.g. `wasm32-unknown-emscripten`]
- Build tool, if relevant: [e.g. `wasm-pack`, `trunk`]
- OS, if relevant: [e.g. MacOS]
- Browser and version, if relevant: [e.g. Chrome v83]
**Questionnaire**
<!-- Developing Yew is a community effort! -->
<!-- If you feel up to the challenge, please check one of the boxes below: -->
- [ ] I'm interested in fixing this myself but don't know where to start
- [ ] I would like to fix and I have a solution
- [ ] I don't have time to fix this right now, but maybe later
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Ask question
url: https://discord.gg/VQck8X4
about: Looking for a quick answer? Ask the community!
- name: Feature proposal
url: https://github.com/yewstack/yew/discussions/categories/ideas
about: Start a discussion for a feature you would like to see
- name: Issue with the Playground?
url: https://github.com/yewstack/yew-playground/issues/new
about: Open an issue on the yew-playground repository
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.md
================================================
---
name: Documentation
about: Report an issue relating to this project's documentation.
title: ''
labels: documentation
assignees: ''
---
<!-- Please only include one item in each issue! -->
This is about:
- [ ] A typo
- [ ] Inaccurate/misleading documentation (e.g. technically incorrect advice)
- [ ] Undocumented code
- [ ] Outdated documentation
- [ ] Other
**Problem**
<!-- PLEASE INCLUDE A WAY TO LOCATE WHERE THE ISSUE IS, e.g.
- A Github link to the text
- The filename and line number
- An excerpt from the docs that someone could use text search to locate
-->
<!-- What's wrong? -->
<!-- EXAMPLES FOR TYPOS: -->
<!-- e.g. There's a typo in the documentation about the `html!` macro.
It's in the word on line 14 column 5 in file "..." Here's a link to the text on Github "https://github.com/..." -->
<!-- e.g. There's a typo in this sentence "..." on the webpage "https://yew.rs/..." -->
<!-- EXAMPLES FOR MISLEADING DOCS -->
<!-- e.g. The sentence "..." implies "..." but this is misleading because it might cause someone
to think "..." which is wrong. -->
<!-- EXAMPLES FOR MISSING DOCS -->
<!-- e.g. There's no API documentation for the console service. -->
<!-- e.g. There's no documentation on yew.rs for the console service. -->
<!-- EXAMPLES FOR OUTDATED DOCS -->
<!-- e.g. The documentation about the `html!` macro was written for a previous version of Yew and should be updated. -->
**Details about the solution you'd like** _(Optional)_
**Additional context** _(Optional)_
<!-- e.g. examples of similar documentation which is of high quality -->
**Questionaire** _(Optional)_
- [ ] I'd like to write this documentation
- [ ] I'd like to write this documentation but I'm not sure what's needed
- [ ] I don't have time to add this right now, but maybe later
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### Description
<!-- Please include a summary of the change. -->
Fixes #0000 <!-- replace with issue number or remove if not applicable -->
#### Checklist
<!-- For further details, please read CONTRIBUTING.md -->
- [ ] I have reviewed my own code
- [ ] I have added tests
<!-- If this is a bug fix, these tests will fail if the bug is present (to stop it from cropping up again) -->
<!-- If this is a feature, my tests prove that the feature works -->
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 2
groups:
cargo-deps:
patterns:
- "*"
- package-ecosystem: "npm"
directory: "/website"
schedule:
interval: "monthly"
target-branch: "master"
groups:
website-deps:
patterns:
- "*"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
target-branch: "master"
================================================
FILE: .github/workflows/auto-approve-maintainer-pr.yml
================================================
name: Auto approve
on:
pull_request_target:
types:
- opened
- reopened
- synchronize
- ready_for_review
- review_requested
jobs:
auto-approve:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
steps:
- name: Check if organization member
id: is_organization_member
uses: JamesSingleton/is-organization-member@1.1.0
with:
organization: "yewstack"
username: ${{ github.event.pull_request.user.login }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Auto approve
uses: hmarr/auto-approve-action@v4
if: ${{ steps.is_organization_member.outputs.result == 'true' || github.actor == 'dependabot[bot]' }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/benchmark-core.yml
================================================
name: Benchmark - core
on:
pull_request:
branches: [master]
paths:
- .github/workflows/benchmark-core.yml
- "packages/yew/**"
- "tools/benchmark-core/**"
jobs:
benchmark-core:
name: Benchmark - core
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v6
with:
repository: "yewstack/yew"
ref: master
path: yew-master
- name: Checkout pull request
uses: actions/checkout@v6
with:
path: current-pr
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Restore Rust cache for yew packages
uses: Swatinem/rust-cache@v2
with:
workspaces: |
yew-master
current-pr
- name: Run pull request benchmark
working-directory: current-pr/tools/benchmark-core
run: cargo bench -q > ../output.log
- name: Run master benchmark
working-directory: yew-master/tools/benchmark-core
run: cargo bench -q > ../output.log
- name: Write Pull Request ID
run: |
echo "${{ github.event.number }}" > .PR_NUMBER
- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: benchmark-core
include-hidden-files: true
path: |
.PR_NUMBER
yew-master/tools/output.log
current-pr/tools/output.log
retention-days: 1
================================================
FILE: .github/workflows/benchmark-ssr.yml
================================================
name: Benchmark - SSR
on:
pull_request:
branches: [master]
paths:
- .github/workflows/benchmark-ssr.yml
- "packages/yew/**"
- "packages/yew-macro/**"
- "packages/yew-router/**"
- "packages/yew-router-macro/**"
- "examples/function_router/**"
- "tools/benchmark-ssr/**"
jobs:
benchmark-ssr:
name: Benchmark - SSR
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v6
with:
repository: "yewstack/yew"
ref: master
path: yew-master
- name: Checkout pull request
uses: actions/checkout@v6
with:
path: current-pr
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
targets: wasm32-unknown-unknown
- name: Restore Rust cache for yew packages
uses: Swatinem/rust-cache@v2
with:
workspaces: |
yew-master
current-pr
- name: Run pull request benchmark
working-directory: current-pr/tools/benchmark-ssr
run: cargo run --profile=bench -- --output-path ../output.json
- name: Run master benchmark
working-directory: yew-master/tools/benchmark-ssr
run: cargo run --profile=bench -- --output-path ../output.json
- name: Write Pull Request ID
run: |
echo "${{ github.event.number }}" > .PR_NUMBER
- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: benchmark-ssr
include-hidden-files: true
path: |
.PR_NUMBER
yew-master/tools/output.json
current-pr/tools/output.json
retention-days: 1
================================================
FILE: .github/workflows/benchmark.yml
================================================
name: Benchmark
on:
push:
paths-ignore:
- "website/**"
branches:
- master
pull_request:
paths-ignore:
- "website/**"
types: [labeled, synchronize, opened, reopened]
# Cancel outstanding benchmarks on pull requests
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-a-fallback-value
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
benchmark:
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'performance')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
path: "yew"
- uses: actions/checkout@v6
with:
repository: krausest/js-framework-benchmark
path: "js-framework-benchmark"
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
targets: wasm32-unknown-unknown
- name: Setup wasm-pack
uses: jetli/wasm-pack-action@v0.4.0
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: "lts/Jod"
cache: "npm"
cache-dependency-path: js-framework-benchmark/package-lock.json
- name: Restore Rust cache for yew packages
uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
workspaces: |
yew
- name: Setup chrome
id: setup-chrome
uses: browser-actions/setup-chrome@v2
with:
install-chromedriver: true
- name: Setup js-framework-benchmark
working-directory: js-framework-benchmark
run: |
npm ci
npm run install-server
npm run install-webdriver-ts
- name: Setup benchmark-struct benchmark
run: |
ls -lauh
rm *.js
rm *.wasm
echo "STRUCT_BUILD_DIR=$PWD" >> $GITHUB_ENV
working-directory: js-framework-benchmark/frameworks/keyed/yew/bundled-dist/
- name: Build benchmark-struct app
working-directory: yew/tools/benchmark-struct
run: |
RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack build \
--release \
--target web \
--no-typescript \
--out-name js-framework-benchmark-yew \
--out-dir $STRUCT_BUILD_DIR
- name: Show built benchmark-struct benchmark files
run: |
ls -lauh js-framework-benchmark/frameworks/keyed/yew/bundled-dist/
- name: Setup yew-hooks benchmark
run: |
ls -lauh
rm *.js
rm *.wasm
echo "HOOKS_BUILD_DIR=$PWD" >> $GITHUB_ENV
working-directory: js-framework-benchmark/frameworks/keyed/yew-hooks/bundled-dist/
- name: Build benchmark-hooks app
working-directory: yew/tools/benchmark-hooks
run: |
RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack build \
--release \
--target web \
--no-typescript \
--out-name js-framework-benchmark-yew-hooks \
--out-dir $HOOKS_BUILD_DIR
- name: Show built benchmark-hooks benchmark files
run: |
ls -lauh js-framework-benchmark/frameworks/keyed/yew-hooks/bundled-dist/
- name: Run js-framework-benchmark server
working-directory: js-framework-benchmark
run: |
npm start &
sleep 5
# https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md
- run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
- name: Run js-framework-benchmark/webdriver-ts npm run bench
working-directory: js-framework-benchmark/webdriver-ts
run: xvfb-run npm run bench -- --framework keyed/yew keyed/yew-hooks --runner playwright --chromeBinary "${{ steps.setup-chrome.outputs.chrome-path }}"
- name: Transform results to be fit for display benchmark-action/github-action-benchmark@v1
run: |
mkdir artifacts/
jq -s . js-framework-benchmark/webdriver-ts/results/*.json | cargo run --manifest-path yew/Cargo.toml --release -p process-benchmark-results > artifacts/results.json
echo "$EVENT_INFO" > artifacts/.PR_INFO
env:
EVENT_INFO: ${{ toJSON(github.event) }}
- name: Upload result artifacts
uses: actions/upload-artifact@v7
with:
name: results
path: artifacts/
if-no-files-found: error
include-hidden-files: true
retention-days: 1
================================================
FILE: .github/workflows/build-api-docs.yml
================================================
name: Build API Docs (Rustdoc)
on:
pull_request:
branches: [master]
paths:
- "packages/**"
- "firebase.json"
- ".github/workflows/*-docs.yml"
push:
branches: [master]
paths:
- "packages/**"
- "firebase.json"
- ".github/workflows/*-docs.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: rust-docs
- name: Run cargo doc
env:
RUSTDOCFLAGS: --cfg documenting --html-before-content ./api-docs/before-content.html --extend-css ./api-docs/styles.css -Z unstable-options --enable-index-page
run: |
cargo doc \
--no-deps \
--all-features \
-p yew \
-p yew-macro \
-p yew-router \
-p yew-router-macro \
-p yew-agent
- name: Move files in correct directory
run: |
mkdir -p api-docs/dist/next
cp -r target/doc/* api-docs/dist/next
- name: Upload build artifact
uses: actions/upload-artifact@v7
with:
name: api-docs
path: api-docs/
retention-days: 1
- if: github.event_name == 'pull_request'
name: Build pr info
run: |
echo "${{ github.event.number }}" > .PR_INFO
- if: github.event_name == 'pull_request'
name: Upload pr info
uses: actions/upload-artifact@v7
with:
name: pr-info
include-hidden-files: true
path: .PR_INFO
retention-days: 1
================================================
FILE: .github/workflows/build-website.yml
================================================
name: Build website
on:
pull_request:
branches: [master]
paths:
- "website/**"
- "firebase.json"
- ".github/workflows/*-website.yml"
push:
branches: [master]
paths:
- "website/**"
- "firebase.json"
- ".github/workflows/*-website.yml"
jobs:
build:
name: Build Website
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup node
uses: actions/setup-node@v6
with:
node-version: "lts/Jod"
package-manager-cache: false
- name: Install dependencies
run: |
cd website
npm ci
- name: Run prettier
id: fmt
continue-on-error: true
run: |
cd website
npm run fmt
- if: steps.fmt.outcome == 'failure'
run: |
cd website
npm run fmt:write
git diff
exit 1
- name: Check Translations
run: |
cd website
npm run check-translations
- name: Build
run: |
cd website
npm run build
- name: Upload build artifact
uses: actions/upload-artifact@v7
with:
name: website
path: website/build/
retention-days: 1
- if: github.event_name == 'pull_request'
name: Build pr info
run: |
echo "${{ github.event.number }}" > .PR_INFO
- if: github.event_name == 'pull_request'
name: Upload pr info
uses: actions/upload-artifact@v7
with:
name: pr-info
include-hidden-files: true
path: .PR_INFO
retention-days: 1
================================================
FILE: .github/workflows/clippy.yml
================================================
name: Clippy
on:
pull_request:
paths:
- ".github/workflows/clippy.yml"
- "tools/**/*"
- "examples/**/*"
- "packages/**/*"
- "Cargo.toml"
- "Cargo.lock"
push:
branches: [master]
jobs:
feature-soundness:
name: Feature Soundness
runs-on: ubuntu-latest
# if normal clippy doesn't succeed, do not try to lint feature soundness
needs: clippy
strategy:
fail-fast: false
matrix:
profile:
- dev
- release
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
components: clippy
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- uses: taiki-e/install-action@cargo-hack
- name: Lint feature soundness
if: matrix.profile == 'dev'
run: >-
cargo hack clippy
-p yew -p yew-agent -p yew-router
--feature-powerset --no-dev-deps
--keep-going
-- -D warnings
- name: Lint feature soundness
if: matrix.profile == 'release'
run: >-
cargo hack clippy
-p yew -p yew-agent -p yew-router
--feature-powerset --no-dev-deps
--keep-going --release
-- -D warnings
clippy:
name: Clippy Workspace
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- stable
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
components: clippy
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Run clippy
run: |
cargo clippy \
--all-targets \
--all-features \
--workspace \
-- -D warnings
================================================
FILE: .github/workflows/fmt.yml
================================================
name: cargo fmt
on:
pull_request:
paths:
- "**/*.rs"
push:
branches: [master]
paths:
- "**/*.rs"
jobs:
format:
name: cargo fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: rustfmt
- name: Run fmt
run: cargo +nightly fmt --all -- --check
================================================
FILE: .github/workflows/inspect-next-changelogs.yml
================================================
name: Inspect next changelogs
permissions:
contents: write
on:
workflow_dispatch:
jobs:
generate:
name: Generate changelogs
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Build changelog generator
run: cargo build --release -p changelog --
- name: Read yew changelog in this step
shell: bash
run: ./target/release/changelog yew minor -t ${{ secrets.GITHUB_TOKEN }} -f "$(pwd)/CHANGELOG.md"
- name: Read yew-router changelog in this step
shell: bash
run: ./target/release/changelog yew-router minor -t ${{ secrets.GITHUB_TOKEN }} -f "$(pwd)/CHANGELOG.md"
- name: Read yew-agent changelog in this step
shell: bash
run: ./target/release/changelog yew-agent minor -t ${{ secrets.GITHUB_TOKEN }} -f "$(pwd)/CHANGELOG.md"
================================================
FILE: .github/workflows/main-checks.yml
================================================
name: Main Checks
on:
pull_request:
paths:
- ".github/workflows/main-checks.yml"
- "ci/**"
- "packages/**/*"
- "examples/**/*"
- "tools/**/*"
- "Cargo.toml"
- "Cargo.lock"
push:
branches: [master]
jobs:
spell_check:
name: spellcheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check spelling
uses: crate-ci/typos@v1.44.0
doc_tests:
name: Documentation Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
# for wasm-bindgen-cli, always use stable rust
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Install wasm-bindgen-cli
shell: bash
run: ./ci/install-wasm-bindgen-cli.sh
- uses: browser-actions/setup-geckodriver@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: nanasess/setup-chromedriver@v2
- name: Run doctest
run: |
ls packages | xargs -I {} \
cargo test \
-p {} \
--doc \
--all-features \
--target wasm32-unknown-unknown
integration_tests:
name: Integration Tests on ${{ matrix.toolchain }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- 1.84.0
- stable
steps:
- uses: actions/checkout@v6
# for wasm-bindgen-cli, always use stable rust
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Install wasm-bindgen-cli
shell: bash
run: ./ci/install-wasm-bindgen-cli.sh
- uses: browser-actions/setup-geckodriver@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: nanasess/setup-chromedriver@v2
- name: Run tests - yew
run: |
cd packages/yew
CHROMEDRIVER=$(which chromedriver) cargo test --features csr,hydration,ssr,test --target wasm32-unknown-unknown
GECKODRIVER=$(which geckodriver) cargo test --features csr,hydration,ssr,test --target wasm32-unknown-unknown
- name: Run tests - yew-router
run: |
cd packages/yew-router
CHROMEDRIVER=$(which chromedriver) cargo test --target wasm32-unknown-unknown
GECKODRIVER=$(which geckodriver) cargo test --target wasm32-unknown-unknown
unit_tests:
name: Unit Tests on ${{ matrix.toolchain }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- 1.84.0
- stable
- nightly
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Run native tests
env:
# workaround for lack of ternary operator
# see https://github.com/orgs/community/discussions/25725
RUSTFLAGS: ${{ matrix.toolchain == 'nightly' && '--cfg nightly_yew' || '' }}
run: |
if [[ "${{ matrix.toolchain }}" == "1.84.0" ]]; then
cargo test --all-targets -p yew-agent -p yew-agent-macro -p yew-router
else
ls packages | grep -v "^yew$" | xargs -I {} cargo test --all-targets -p {}
fi
- name: Run native tests for yew
env:
# workaround for lack of ternary operator
# see https://github.com/orgs/community/discussions/25725
RUSTFLAGS: ${{ matrix.toolchain == 'nightly' && '--cfg nightly_yew' || '' }}
run: cargo test -p yew --all-features
test-lints:
name: Test lints on nightly
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Run tests
env:
RUSTFLAGS: --cfg nightly_yew --cfg yew_lints
run: cargo test -p yew-macro test_html_lints
macro_tests_discovery:
name: Discover macro tests
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.discover.outputs.matrix }}
steps:
- uses: actions/checkout@v6
- id: discover
run: |
matrix=$(
find packages/*/tests -name '*_test.rs' ! -name 'html_lints_test.rs' -printf '%h/%f\n' \
| while IFS= read -r path; do
pkg=$(echo "$path" | cut -d/ -f2)
test=$(basename "$path" .rs)
printf '{"package":"%s","test":"%s"}\n' "$pkg" "$test"
done \
| jq -sc '{include: .}'
)
echo "matrix=$matrix" >> "$GITHUB_OUTPUT"
macro_tests:
name: Macro Tests (${{ matrix.test }})
needs: macro_tests_discovery
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.macro_tests_discovery.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.84.0
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Run ${{ matrix.test }}
run: cargo test -p ${{ matrix.package }} --test ${{ matrix.test }}
unit_tests_wasi:
name: Unit Tests (WASI) on ${{ matrix.toolchain }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- stable
- nightly
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
target: wasm32-wasip1
- name: Install wasmtime
run: |
wget https://github.com/bytecodealliance/wasmtime/releases/download/v24.0.0/wasmtime-v24.0.0-x86_64-linux.tar.xz
tar xf wasmtime-v24.0.0-x86_64-linux.tar.xz
mv wasmtime-v24.0.0-x86_64-linux/wasmtime ~/wasmtime
rm -rf wasmtime-v24.0.0-x86_64-linux.tar.xz wasmtime-v24.0.0-x86_64-linux
chmod +x ~/wasmtime
mv ~/wasmtime /usr/local/bin
source ~/.bashrc
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Run WASI tests for yew
run: |
RUST_LOG=info
cargo test --features ssr,hydration,test --target wasm32-wasip1 -p yew
example-runnable-tests-on-wasi:
name: Example Runnable Tests on WASI
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
package:
- wasi_ssr_module
toolchain:
- stable
- nightly
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
target: wasm32-wasip1
- name: Install wasmtime
run: |
wget https://github.com/bytecodealliance/wasmtime/releases/download/v24.0.0/wasmtime-v24.0.0-x86_64-linux.tar.xz
tar xf wasmtime-v24.0.0-x86_64-linux.tar.xz
mv wasmtime-v24.0.0-x86_64-linux/wasmtime ~/wasmtime
rm -rf wasmtime-v24.0.0-x86_64-linux.tar.xz wasmtime-v24.0.0-x86_64-linux
chmod +x ~/wasmtime
mv ~/wasmtime /usr/local/bin
source ~/.bashrc
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Build and run ${{ matrix.package }}
run: |
cargo build --target wasm32-wasip1 -p ${{ matrix.package }}
wasmtime -W unknown-imports-trap=y target/wasm32-wasip1/debug/${{ matrix.package }}.wasm
ssr_e2e_tests:
name: SSR E2E Tests (${{ matrix.example }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- example: ssr_router
server_bin: ssr_router_server
trunk_dir: examples/ssr_router
- example: simple_ssr
server_bin: simple_ssr_server
trunk_dir: examples/simple_ssr
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- name: Install wasm-bindgen-cli
shell: bash
run: ./ci/install-wasm-bindgen-cli.sh
- name: Install trunk
uses: jetli/trunk-action@v0.5.1
with:
version: "latest"
- uses: browser-actions/setup-geckodriver@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Run SSR E2E tests
run: |
GECKODRIVER=$(which geckodriver) cargo run -p ssr-e2e -- \
--trunk-dir ${{ matrix.trunk_dir }} \
--server-cmd "cargo run -p ${{ matrix.example }} --bin ${{ matrix.server_bin }} --features ssr -- --dir ${{ matrix.trunk_dir }}/dist" \
--health-url http://127.0.0.1:8080/ \
--test-pkg ${{ matrix.example }} \
-- --target wasm32-unknown-unknown --test e2e
================================================
FILE: .github/workflows/post-benchmark-core.yml
================================================
name: Post Comment for Benchmark - core
on:
workflow_run:
workflows: ["Benchmark - core"]
types:
- completed
jobs:
post-benchmark-core:
name: Post Benchmark Comment on Pull Request
if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Download Repository
uses: actions/checkout@v6
- name: Download Artifact
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: benchmark-core
path: benchmark-core/
- name: Make pull request comment
run: |
cat - >>comment.txt <<EOF
### Benchmark - core
#### Yew Master
\`\`\`
EOF
cat benchmark-core/yew-master/tools/output.log >>comment.txt
cat - >>comment.txt <<EOF
\`\`\`
#### Pull Request
\`\`\`
EOF
cat benchmark-core/current-pr/tools/output.log >>comment.txt
cat - >>comment.txt <<EOF
\`\`\`
EOF
- name: Read Pull Request ID
run: echo "PR_NUMBER=$(cat benchmark-core/.PR_NUMBER)" >> $GITHUB_ENV
- name: Post Comment
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
const commentInfo = {
...context.repo,
issue_number: ${{ env.PR_NUMBER }},
};
const comment = {
...commentInfo,
body: fs.readFileSync("comment.txt", 'utf-8'),
};
function isCommentByBot(comment) {
return comment.user.type === "Bot" && comment.body.includes("### Benchmark - core");
}
let commentId = null;
const comments = (await github.rest.issues.listComments(commentInfo)).data;
for (let i = comments.length; i--; ) {
const c = comments[i];
if (isCommentByBot(c)) {
commentId = c.id;
break;
}
}
if (commentId) {
try {
await github.rest.issues.updateComment({
...context.repo,
comment_id: commentId,
body: comment.body,
});
} catch (e) {
commentId = null;
}
}
if (!commentId) {
await github.rest.issues.createComment(comment);
}
================================================
FILE: .github/workflows/post-benchmark-ssr.yml
================================================
name: Post Comment for Benchmark - SSR
on:
workflow_run:
workflows: ["Benchmark - SSR"]
types:
- completed
jobs:
post-benchmark-ssr:
name: Post Comment on Pull Request
if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Download Repository
uses: actions/checkout@v6
- name: Download Artifact
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: benchmark-ssr
path: benchmark-ssr/
- name: Make pull request comment
run: python3 ci/make_benchmark_ssr_cmt.py
- name: Read Pull Request ID
run: echo "PR_NUMBER=$(cat benchmark-ssr/.PR_NUMBER)" >> $GITHUB_ENV
- name: Post Comment
uses: actions/github-script@v8
with:
script: |
const commentInfo = {
...context.repo,
issue_number: ${{ env.PR_NUMBER }},
};
const comment = {
...commentInfo,
body: JSON.parse(process.env.YEW_BENCH_SSR),
};
function isCommentByBot(comment) {
return comment.user.type === "Bot" && comment.body.includes("### Benchmark - SSR");
}
let commentId = null;
const comments = (await github.rest.issues.listComments(commentInfo)).data;
for (let i = comments.length; i--; ) {
const c = comments[i];
if (isCommentByBot(c)) {
commentId = c.id;
break;
}
}
if (commentId) {
try {
await github.rest.issues.updateComment({
...context.repo,
comment_id: commentId,
body: comment.body,
});
} catch (e) {
commentId = null;
}
}
if (!commentId) {
await github.rest.issues.createComment(comment);
}
================================================
FILE: .github/workflows/post-benchmark.yml
================================================
name: "Post benchmark results"
on:
workflow_run:
workflows: ["Benchmark"]
types:
- completed
jobs:
post-benchmark-results:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
# Checkout repo for the github-action-benchmark action
- uses: actions/checkout@v6
- name: Download result artifacts
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: results
path: ./artifacts
- name: Test for PR
uses: mathiasvr/command-output@v1
id: test-pr
with:
run: cat artifacts/.PR_INFO
# gh-pages branch is updated and pushed automatically with extracted benchmark data
- name: Store benchmark result
uses: benchmark-action/github-action-benchmark@v1
with:
name: "Yew master branch benchmarks (Lower is better)"
tool: "customSmallerIsBetter"
output-file-path: artifacts/results.json
gh-pages-branch: "gh-pages"
# Access token to deploy GitHub Pages branch
github-token: ${{ secrets.GITHUB_TOKEN }}
# Push and deploy GitHub pages branch automatically
alert-threshold: "200%"
alert-comment-cc-users: "@yewstack/yew"
# Only push when this is a non-pr commit that has been benchmarked, i.e. master
auto-push: ${{ fromJSON(steps.test-pr.outputs.stdout).number == '' }}
save-data-file: ${{ fromJSON(steps.test-pr.outputs.stdout).number == '' }}
# Enable job summary
summary-always: true
comment-always: true
ref: ${{ github.event.workflow_run.head_sha }}
================================================
FILE: .github/workflows/post-size-cmp.yml
================================================
name: Post Comment for Size Comparison
on:
workflow_run:
workflows: ["Size Comparison"]
types:
- completed
jobs:
post-size-cmp:
name: Post Size Comment on Pull Request
if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Download Repository
uses: actions/checkout@v6
- name: Download Artifact (master)
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: size-cmp-master-info
path: "size-cmp-master-info/"
- name: Download Artifact (PR)
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: size-cmp-pr-info
path: "size-cmp-pr-info/"
- name: Make pull request comment
run: python3 ci/make_example_size_cmt.py
- name: Post Comment
uses: actions/github-script@v8
with:
script: |
const commentInfo = {
...context.repo,
issue_number: ${{ env.PR_NUMBER }},
};
const comment = {
...commentInfo,
body: JSON.parse(process.env.YEW_EXAMPLE_SIZES),
};
function isCommentByBot(comment) {
return comment.user.type === "Bot" && comment.body.includes("### Size Comparison");
}
let commentId = null;
const comments = (await github.rest.issues.listComments(commentInfo)).data;
for (let i = comments.length; i--; ) {
const c = comments[i];
if (isCommentByBot(c)) {
commentId = c.id;
break;
}
}
if (commentId) {
try {
await github.rest.issues.updateComment({
...context.repo,
comment_id: commentId,
body: comment.body,
});
} catch (e) {
commentId = null;
}
}
if (!commentId) {
await github.rest.issues.createComment(comment);
}
================================================
FILE: .github/workflows/publish-api-docs.yml
================================================
name: Publish API Docs
on:
workflow_run:
workflows: ["Build API Docs (Rustdoc)"]
types:
- completed
jobs:
publish:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
# need to checkout to get "firebase.json", ".firebaserc"
- uses: actions/checkout@v6
- name: Download build artifact
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: api-docs
path: api-docs/
- if: github.event.workflow_run.event == 'pull_request'
name: Download pr info
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: pr-info
path: artifacts
- if: github.event.workflow_run.event == 'pull_request'
name: Apply pull request environment
run: |
pr_number=$(cat "artifacts/.PR_INFO")
if ! [[ "$pr_number" =~ ^[0-9]+$ ]]; then
echo "pr number invalid"
exit 1
fi
echo "PR_NUMBER=$pr_number" >> $GITHUB_ENV
echo "PR_BRANCH=${{ github.event.workflow_run.head_branch }}" >> $GITHUB_ENV
echo "COMMIT_SHA=${{ github.event.workflow_run.head_sha }}" >> $GITHUB_ENV
- if: github.event.workflow_run.event == 'push'
name: Apply push environment
run: |
echo "CHANNEL_ID=live" >> $GITHUB_ENV
- name: Deploy to Firebase
uses: siku2/action-hosting-deploy@v1
with:
repoToken: "${{ secrets.GITHUB_TOKEN }}"
firebaseToken: "${{ secrets.FIREBASE_TOKEN }}"
targets: api
channelId: "${{ env.CHANNEL_ID }}"
# link to the next version because that's what we care about
commentURLPath: "/next/yew"
# PR information
prNumber: "${{ env.PR_NUMBER }}"
prBranchName: "${{ env.PR_BRANCH }}"
commitSHA: "${{ env.COMMIT_SHA }}"
================================================
FILE: .github/workflows/publish-examples.yml
================================================
name: Publish Examples
on:
push:
branches: [master]
paths:
- 'tools/build-examples/**'
- 'examples/**'
jobs:
publish:
runs-on: ubuntu-latest
env:
# leave empty for /
PUBLIC_URL_PREFIX: ""
RUSTUP_TOOLCHAIN: nightly
steps:
- uses: actions/checkout@v6
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
targets: wasm32-unknown-unknown
components: rust-src
- uses: Swatinem/rust-cache@v2
- uses: jetli/trunk-action@v0.5.1
with:
version: 'latest'
- name: Get latest wasm-opt version
id: wasm-opt
uses: pozetroninc/github-action-get-latest-release@master
with:
repository: WebAssembly/binaryen
excludes: prerelease, draft
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build examples
run: cargo run -p build-examples --bin build-examples
env:
LATEST_WASM_OPT_VERSION: ${{ steps.wasm-opt.outputs.release }}
- name: Deploy to Firebase
uses: siku2/action-hosting-deploy@v1
with:
repoToken: "${{ secrets.GITHUB_TOKEN }}"
firebaseToken: "${{ secrets.FIREBASE_TOKEN }}"
channelId: live
targets: examples
================================================
FILE: .github/workflows/publish-website.yml
================================================
name: Publish website
on:
workflow_run:
workflows: ["Build website"]
types:
- completed
jobs:
publish:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
# need to checkout to get "firebase.json", ".firebaserc"
- uses: actions/checkout@v6
- name: Download build artifact
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: website
path: website/build
- if: github.event.workflow_run.event == 'pull_request'
name: Download pr info
uses: actions/download-artifact@v8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
run-id: ${{ github.event.workflow_run.id }}
name: pr-info
path: artifacts
- if: github.event.workflow_run.event == 'pull_request'
name: Apply pull request environment
run: |
pr_number=$(cat "artifacts/.PR_INFO")
if ! [[ "$pr_number" =~ ^[0-9]+$ ]]; then
echo "pr number invalid"
exit 1
fi
echo "PR_NUMBER=$pr_number" >> $GITHUB_ENV
echo "PR_BRANCH=${{ github.event.workflow_run.head_branch }}" >> $GITHUB_ENV
echo "COMMIT_SHA=${{ github.event.workflow_run.head_sha }}" >> $GITHUB_ENV
- if: github.event.workflow_run.event == 'push'
name: Apply push environment
run: |
echo "CHANNEL_ID=live" >> $GITHUB_ENV
- name: Deploy to Firebase
uses: siku2/action-hosting-deploy@v1
with:
repoToken: "${{ secrets.GITHUB_TOKEN }}"
firebaseToken: "${{ secrets.FIREBASE_TOKEN }}"
targets: website
channelId: "${{ env.CHANNEL_ID }}"
# link to the next version because that's what we care about
commentURLPath: "/docs/next"
# PR information
prNumber: "${{ env.PR_NUMBER }}"
prBranchName: "${{ env.PR_BRANCH }}"
commitSHA: "${{ env.COMMIT_SHA }}"
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish yew package(s)
permissions:
contents: write
on:
workflow_dispatch:
inputs:
level:
description: "Version Level major|minor|patch"
required: true
type: choice
options:
- patch
- minor
- major
packages:
description: "List of packages to publish (space separated)"
required: true
type: string
jobs:
publish:
name: Publish yew
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
with:
token: "${{ secrets.YEWTEMPBOT_TOKEN }}"
fetch-depth: 0
- name: Config Git
uses: oleksiyrudenko/gha-git-credentials@v2.1.2
with:
token: "${{ secrets.YEWTEMPBOT_TOKEN }}"
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Install cargo binary dependencies
uses: baptiste0928/cargo-install@v3
with:
crate: cargo-release
version: =1.1.1
- name: Cargo login
run: cargo login ${{ secrets.CRATES_IO_TOKEN }}
- name: Build command
shell: bash
env:
PACKAGES: ${{ github.event.inputs.packages }}
run: |
output=""
for pkg in ${{ github.event.inputs.packages }}
do
output+="--package $pkg "
done
echo "pkg=$output" >> $GITHUB_ENV
- name: Release yew
run: cargo release ${{ github.event.inputs.level }} --execute --no-confirm ${{ env.pkg }}
- name: Collect release info
id: releaseinfo
run: cargo run -p collect-release-info -- ${{ github.event.inputs.packages }}
- name: Create a version branch
if: github.event.inputs.level != 'patch'
uses: peterjgrainger/action-create-branch@v3.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
branch: ${{ steps.releaseinfo.outputs.version_branch }}
- name: Create releases
env:
GH_TOKEN: ${{ secrets.YEWTEMPBOT_TOKEN }}
RELEASES: ${{ steps.releaseinfo.outputs.releases }}
run: |
echo "$RELEASES" | jq -c '.[]' | while read -r release; do
tag=$(echo "$release" | jq -r '.tag')
name=$(echo "$release" | jq -r '.name')
body=$(echo "$release" | jq -r '.body')
gh release create "$tag" --title "$name" --notes "$body"
done
================================================
FILE: .github/workflows/size-cmp.yml
================================================
name: Size Comparison
on:
pull_request:
branches: [master]
paths:
- .github/workflows/size-cmp.yml
- "ci/**"
- "packages/**"
- "examples/**"
- "Cargo.toml"
jobs:
size-cmp:
name: Collect ${{ matrix.target }} Size
runs-on: ubuntu-latest
strategy:
matrix:
target: ["master", "pr"]
steps:
- name: Checkout master
uses: actions/checkout@v6
if: ${{ matrix.target == 'master' }}
with:
repository: "yewstack/yew"
ref: master
- name: Checkout pull request
uses: actions/checkout@v6
if: ${{ matrix.target == 'pr' }}
- name: Write Optimisation Flags
run: |
if [ -x ci/write-min-size-flags.sh ] ; then
ci/write-min-size-flags.sh
else
# this branch is a fallback used only for compatibility with earlier commits
# in the repository and other branches and can be removed in the future.
echo 'build-std = ["std", "panic_abort"]' >> .cargo/config.toml
echo '[build]' >> .cargo/config.toml
echo 'rustflags = ["-Cpanic=abort"]' >> .cargo/config.toml
fi
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: rust-src
targets: wasm32-unknown-unknown
- name: Restore Rust cache
uses: Swatinem/rust-cache@v2
- name: Setup Trunk
uses: jetli/trunk-action@v0.5.1
with:
version: "latest"
- name: Get latest wasm-opt version
id: wasm-opt
uses: pozetroninc/github-action-get-latest-release@master
with:
repository: WebAssembly/binaryen
excludes: prerelease, draft
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build examples
run: cargo run -p build-examples --bin build-examples
env:
LATEST_WASM_OPT_VERSION: ${{ steps.wasm-opt.outputs.release }}
- name: Collect size information
run: python3 ci/collect_sizes.py
env:
ISSUE_NUMBER: ${{ github.event.number }}
- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: size-cmp-${{ matrix.target }}-info
include-hidden-files: true
path: ".SIZE_CMP_INFO"
retention-days: 1
================================================
FILE: .github/workflows/test-website.yml
================================================
name: "Test Website"
on:
pull_request:
paths:
- ".github/workflows/test-website.yml"
- "packages/**/*"
- "website/**/*"
push:
branches: [master]
jobs:
website_tests:
name: Tests Website Snippets
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
# for wasm-bindgen-cli, always use stable rust
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Install wasm-bindgen-cli
shell: bash
run: ./ci/install-wasm-bindgen-cli.sh
- name: Setup toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
- uses: browser-actions/setup-geckodriver@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: nanasess/setup-chromedriver@v2
- name: Run website code snippet tests
run: cargo test -p website-test --target wasm32-unknown-unknown
================================================
FILE: .gitignore
================================================
target/
dist/
# backup files generated by rustfmt
**/*.rs.bk
# editor config files and directories
*.iml
/.idea/
/.vscode/
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## ✨ yew **0.23.0** *(2026-03-10)*
bumping from 0.22 should require no code changes for most users.
### 🚨 Breaking changes
- Performance: use_reducer now skips re-rendering for the same Rc. [[@Pascal Sommer](https://github.com/Pascal-So), [#3945](https://github.com/yewstack/yew/pull/3945)]
NOTE: Whether this is breaking is arguable. It merely breaks the promise that a dispatch will always cause a re-render. For code that wishes to force re-render, [use_force_update](https://docs.rs/yew/latest/yew/functional/fn.use_force_update.html) helps. Please refer to [the migration guide](https://yew.rs/docs/next/migration-guides/yew/from-0_22_0-to-0_23_0) for details.
### ⚡️ Features
- `&str` and `String` can now be used for props of type `Option<Html>`. [[@Cashew](https://github.com/Casheeew), [#4020](https://github.com/yewstack/yew/pull/4020)]
- Added a `scheduler::flush` function to reliably finish rendering. Useful in testing as a replacement for timeouts. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4044](https://github.com/yewstack/yew/pull/4044)]
### 🛠 Fixes
- No more broken child re-renders while setting parents' states. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4060](https://github.com/yewstack/yew/pull/4060)]
- Ergonomics: Bare `None`s are now allowed for `Option<T>` props in the `html!` macro. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4021](https://github.com/yewstack/yew/pull/4021)]
### ⚙️ Improvements
- Yew's scheduler now yields to the main thread from time to time. This fix will make the web page more responsive and reduce warnings about long tasks in the console. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4033](https://github.com/yewstack/yew/pull/4033)]
## ✨ yew-router **0.20.0** *(2026-03-10)*
Yew pinned to 0.23 now.
### 🛠 Fixes
- '/' is no longer wrongly encoded in wildcard route segments. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4056](https://github.com/yewstack/yew/pull/4056)]
- Fixed a url corruption issue causing redirection to `/basename//basename` resulting in a 404. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4030](https://github.com/yewstack/yew/pull/4030)]
## ✨ yew-agent **0.5.0** *(2026-03-10)*
No changes.
Yew pinned to 0.23 now.
## ✨ yew **0.22.1** *(2026-02-28)*
### 🛠 Fixes
- Domslot hydration panic caused by suspension [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4003](https://github.com/yewstack/yew/pull/4003)]
- Some `Option<T>` and `&T` types can be used as children again. e.g. `Option<AttrValue>` [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4005](https://github.com/yewstack/yew/pull/4005)]
- Custom hooks now compiles in edition 2024. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3992](https://github.com/yewstack/yew/pull/3992)]
- No more stale states in callbacks when multiple events fire rapidly. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3988](https://github.com/yewstack/yew/pull/3988)]
- Fixed invisible svg issue on Chrome when included with `from_html_unchecked` [[@Jason Heard](https://github.com/101100), [#3970](https://github.com/yewstack/yew/pull/3970)]
- Fixed documentation typo in introduction.mdx. [[@devfbe](https://github.com/devfbe), [#3417](https://github.com/yewstack/yew/pull/3417)]
### ⚙️ Improvements
- Improved SSR example with meta rendering. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4011](https://github.com/yewstack/yew/pull/4011)]
- Replaced once_cell with std equivalents (LazyLock, OnceLock). [[@Siyuan Yan](https://github.com/Madoshakalaka), [#4010](https://github.com/yewstack/yew/pull/4010)]
- Updated rust dependencies.
## ✨ yew **0.22.0** *(2025-12-08)*
### 🚨 Breaking changes
- **MSRV raised to 1.84.0.** [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3900](https://github.com/yewstack/yew/pull/3900)]
- Allow setting JsValue as properties. [[@Elina](https://github.com/ranile), [#3458](https://github.com/yewstack/yew/pull/3458)]
- Remove deprecated `class=(...)` syntax. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3497](https://github.com/yewstack/yew/pull/3497)]
- Remove ToHtml trait. [[@Elina](https://github.com/ranile), [#3453](https://github.com/yewstack/yew/pull/3453)]
- Make `<textarea>` a void element (no children allowed anymore). [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3465](https://github.com/yewstack/yew/pull/3465)]
### ⚡️ Features
- **Add for-loops to `html!` macro.** [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3498](https://github.com/yewstack/yew/pull/3498)]
- **Rename `#[function_component]` to `#[component]`.** [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3885](https://github.com/yewstack/yew/pull/3885)]
- Add `serde` feature to yew. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3880](https://github.com/yewstack/yew/pull/3880)]
- Add `use_ref` hook. [[@Alex Parrill](https://github.com/ColonelThirtyTwo), [#3548](https://github.com/yewstack/yew/pull/3548)]
- Better ImplicitClone ergonomics. Fewer ampersands and stars needed in the `html!` macro. [[@Cecile Tonglet](https://github.com/cecton), [#3508](https://github.com/yewstack/yew/pull/3508), [#3431](https://github.com/yewstack/yew/pull/3431)] [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3892](https://github.com/yewstack/yew/pull/3878)]
- Preserve camelCase for known SVG elements. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3875](https://github.com/yewstack/yew/pull/3875)]
- Add `inert` to the boolean attributes list. [[@Tomoaki Kawada](https://github.com/kawadakk), [#3678](https://github.com/yewstack/yew/pull/3678)]
- Namespace support for `VRaw`. [[@Finn Bear](https://github.com/finnbear), [#3640](https://github.com/yewstack/yew/pull/3640)]
- `to_callback` methods and From impls to convert reducer dispatchers and state setters to callbacks. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3519](https://github.com/yewstack/yew/pull/3519)]
- Allows converting `ChildrenRenderer<VNode>` and `VChild` to VList. [[@Muhammad Hamza](https://github.com/ranile), [#3444](https://github.com/yewstack/yew/pull/3444)]
- Add `CallbackRef` that takes ref in argument instead of value. [[@Cecile Tonglet](https://github.com/cecton), [#3419](https://github.com/yewstack/yew/pull/3419)]
- Allow import of layout_test into 3rd party crates. [[@rollo-b2c2](https://github.com/rollo-b2c2), [#3463](https://github.com/yewstack/yew/pull/3463)]
- Add WASI support for server-side rendering. [[@langyo](https://github.com/langyo), [#3534](https://github.com/yewstack/yew/pull/3534)]
- Make `UseFutureHandle` Clone. [[@Adam Steinberg](https://github.com/AdamSteinberg1), [#3529](https://github.com/yewstack/yew/pull/3529)]
- Allow `Self` in prop fields. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3569](https://github.com/yewstack/yew/pull/3569)]
- Allow boolean in `html!`. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3441](https://github.com/yewstack/yew/pull/3441)]
### 🛠 Fixes
- Fix panic when hydrating components with unstable render order. [[@WorldSEnder](https://github.com/WorldSEnder), [#3914](https://github.com/yewstack/yew/pull/3914)]
- Fix hydration panic on camelCased elements. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3876](https://github.com/yewstack/yew/pull/3876)]
- Fix autocompletion in html macro for rust-analyzer. [[@Moritz Hedtke](https://github.com/mohe2015), [#3829](https://github.com/yewstack/yew/pull/3829)]
- Fix empty lists hydration failure when they were placed next to suspensions and other components. [[@WorldSEnder](https://github.com/WorldSEnder), [#3630](https://github.com/yewstack/yew/pull/3630)]
- Silenced non-normalised element name warnings for SVG elements. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3769](https://github.com/yewstack/yew/pull/3769)]
- Fixed inconsistent clone() requirement when passing Classes to HTML elements vs. components. [[@Siddhant Shekhar](https://github.com/sshekhar563), [#3931](https://github.com/yewstack/yew/pull/3931)]
- Fix svg animation always starting immediately. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3892](https://github.com/yewstack/yew/pull/3892)]
- Better diagnostics for byte literals in `html!`. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3441](https://github.com/yewstack/yew/pull/3441)]
- Concise diagnostics for missing props. [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3873](https://github.com/yewstack/yew/pull/3873)]
- Use the namespace when xmlns attributes are specified. [[@JasonCG](https://github.com/jasoncg), [#3629](https://github.com/yewstack/yew/pull/3629)]
- Fix generic type missing errors in hooks. [[@Michael Meyer](https://github.com/Ichmed), [#3633](https://github.com/yewstack/yew/pull/3633)]
- Better duplicate key diagnostics. [[@WorldSEnder](https://github.com/WorldSEnder), [#3785](https://github.com/yewstack/yew/pull/3785)]
- Fix autocompletion in html macro for rust-analyzer. [[@Moritz Hedtke](https://github.com/mohe2015), [#3829](https://github.com/yewstack/yew/pull/3829)]
- `#[hook]`: `clippy::multiple_bound_locations` lint no longer triggered. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3803](https://github.com/yewstack/yew/pull/3803)]
### ⚙️ Improvements
- Avoid unnecessary scheduling. [[@WorldSEnder](https://github.com/WorldSEnder), [#3935](https://github.com/yewstack/yew/pull/3935)]
- Remove the dependency on `boolinator`. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3420](https://github.com/yewstack/yew/pull/3420)]
- Avoid string copy for Key: From<String> implementation. [[@flumm](https://github.com/flumm), [#3858](https://github.com/yewstack/yew/pull/3858)]
- Switch to tokise from tokio [[@Elina](https://github.com/ranile), [#3776](https://github.com/yewstack/yew/pull/3776)]
- use_future_with: simplify code a bit by using read-only use_memo rather than use_state. [[@Léo Gaspard](https://github.com/Ekleog), [#3610](https://github.com/yewstack/yew/pull/3610)]
### 📝 Documentation
- website: modernise the Yew usage in the tutorial. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3882](https://github.com/yewstack/yew/pull/3882)]
- website: make tutorial testable. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3879](https://github.com/yewstack/yew/pull/3879)]
- fix the docs of use_prepared_state. [[@Tim Kurdov](https://github.com/its-the-shrimp), [#3881](https://github.com/yewstack/yew/pull/3881)]
- Update tutorial placeholder image generator. [[@Nashwan Azhari](https://github.com/aznashwan), [#3830](https://github.com/yewstack/yew/pull/3830)]
- Refactor(NavbarItem): improve readability and maintainability. [[@Brilliantkid](https://github.com/brilliantkid87), [#3763](https://github.com/yewstack/yew/pull/3763)]
- Fix website search. [[@Muhammad Hamza](https://github.com/ranile), [#3522](https://github.com/yewstack/yew/pull/3522)]
- Addition and improvements to example crates. [[@Oliver Bilbie](https://github.com/Oliver-Bilbie), [#3587](https://github.com/yewstack/yew/pull/3587)] [[@Astariul](https://github.com/astariul), [#3631](https://github.com/yewstack/yew/pull/3631)] [[@Yann Dirson](https://github.com/ydirson), [#3570](https://github.com/yewstack/yew/pull/3570)] [[@Cecile Tonglet](https://github.com/cecton), [#3505](https://github.com/yewstack/yew/pull/3505)] [[@Kaede Hoshikawa](https://github.com/futursolo), [#3436](https://github.com/yewstack/yew/pull/3436)]
- Wording and typo fixes. [[@Waldir Pimenta](https://github.com/waldyrious), [#3754](https://github.com/yewstack/yew/pull/3754)] [[@Jupp56](https://github.com/Jupp56), [#3429](https://github.com/yewstack/yew/pull/3429)] [[@Flavio Moreira](https://github.com/fdvmoreira), [#3418](https://github.com/yewstack/yew/pull/3418)] [[@ronanM](https://github.com/ronanM), [#3413](https://github.com/yewstack/yew/pull/3413)] [[@Waldir Pimenta](https://github.com/waldyrious), [#3754](https://github.com/yewstack/yew/pull/3754)] [[@Damien Lachaume](https://github.com/dlachaume), [#3790](https://github.com/yewstack/yew/pull/3790)] [[@Edwin Amsler](https://github.com/RandomInsano), [#3788](https://github.com/yewstack/yew/pull/3788)] [[@Tushar GH](https://github.com/Tushar12222), [#3585](https://github.com/yewstack/yew/pull/3585)] [[@zhengwu](https://github.com/rockyzhengwu), [#3574](https://github.com/yewstack/yew/pull/3574)] [[@Raahim Fareed](https://github.com/raahimfareed), [#3539](https://github.com/yewstack/yew/pull/3539)] [[@gcmutator](https://github.com/gcmutator), [#3628](https://github.com/yewstack/yew/pull/3628)] [[@Raphael Martin Schindler](https://github.com/rmschindler), [#3605](https://github.com/yewstack/yew/pull/3605)] [[@Jonathan Picques](https://github.com/JonathanPicques), [#3448](https://github.com/yewstack/yew/pull/3448)] [[@Ikko Eltociear Ashimine](https://github.com/eltociear), [#3432](https://github.com/yewstack/yew/pull/3432)] [[@Daniel Sousa](https://github.com/moyeah), [#3425](https://github.com/yewstack/yew/pull/3425)]
## ✨ yew-router **0.19.0** *(2025-12-08)*
### ⚡️ Features
- Introduce `FromQuery` and `IntoQuery` traits. [[@Robert Schütte](https://github.com/Roba1993), [#3565](https://github.com/yewstack/yew/pull/3565)]
- Dynamic basename support. [[@Finn Bear](https://github.com/finnbear), [#3725](https://github.com/yewstack/yew/pull/3725)]
### 🚨 Breaking changes
- **MSRV raised to 1.84.0.** [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3900](https://github.com/yewstack/yew/pull/3900)]
## ✨ yew-agent **0.4.0** *(2025-12-08)*
### 🛠 Fixes
- Fix calls of the disconnected method of on every render. [[@Shihpin Tseng](https://github.com/deftsp), [#3435](https://github.com/yewstack/yew/pull/3435)]
### ⚡️ Features
- **Support module type web worker.** [[@Luca Cappelletti](https://github.com/LucaCappelletti94), [#3859](https://github.com/yewstack/yew/pull/3859)]
### 🚨 Breaking changes
- **MSRV raised to 1.84.0.** [[@Siyuan Yan](https://github.com/Madoshakalaka), [#3900](https://github.com/yewstack/yew/pull/3900)]
## ✨ yew **0.21.0** *(2023-09-23)*
### 🛠 Fixes
- Fix rust-analyzer non_camel_case_types warning. [[@Sean Bruton](https://github.com/Sean Bruton), [#3388](https://github.com/yewstack/yew/pull/3388)]
- Fix incorrect text escaping during SSR. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3381](https://github.com/yewstack/yew/pull/3381)]
- Fix top-level reconciliation in portals. [[@WorldSEnder](https://github.com/WorldSEnder), [#3020](https://github.com/yewstack/yew/pull/3020)]
- Fix clippy::let_unit_value lint in propless components. [[@WorldSEnder](https://github.com/WorldSEnder), [#2970](https://github.com/yewstack/yew/pull/2970)]
### ⚡️ Features
- Updated the docs of `set_event_bubbling`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3391](https://github.com/yewstack/yew/pull/3391)]
- feat: support arrays for Classes/classes!(). [[@Pouriya](https://github.com/Pouriya), [#3393](https://github.com/yewstack/yew/pull/3393)]
- Mark VNode as #[must_use]. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3387](https://github.com/yewstack/yew/pull/3387)]
- Add `IntoPropValue` implementation to convert from `Cow`s to `AttrValue`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3346](https://github.com/yewstack/yew/pull/3346)]
- Remove compatibility code before 1.64. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3379](https://github.com/yewstack/yew/pull/3379)]
- Keep checked attribute for elements without special handling. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3373](https://github.com/yewstack/yew/pull/3373)]
- feat: implement hydration for vraw. [[@Dillen Meijboom](https://github.com/Dillen Meijboom), [#3245](https://github.com/yewstack/yew/pull/3245)]
- Add webkitdirectory to the boolean attributes list. [[@Julius Lungys](https://github.com/Julius Lungys), [#3214](https://github.com/yewstack/yew/pull/3214)]
- Incremental performance improvements to element creation. [[@Greg Johnston](https://github.com/Greg Johnston), [#3169](https://github.com/yewstack/yew/pull/3169)]
- Make VList's children Rc'ed. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3050](https://github.com/yewstack/yew/pull/3050)]
- Update dependencies. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3171](https://github.com/yewstack/yew/pull/3171)]
- Pass string types to Html props. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#2872](https://github.com/yewstack/yew/pull/2872)]
- Implement an internal DomSlot for positioning instead of NodeRef. [[@WorldSEnder](https://github.com/WorldSEnder), [#3048](https://github.com/yewstack/yew/pull/3048)]
- Prefer pop_first if it is available. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3084](https://github.com/yewstack/yew/pull/3084)]
- Add method map() on Children to wrap easily. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3039](https://github.com/yewstack/yew/pull/3039)]
- Reentrant event listeners. [[@WorldSEnder](https://github.com/WorldSEnder), [#3037](https://github.com/yewstack/yew/pull/3037)]
- Add impl IntoIterator on &Classes. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3038](https://github.com/yewstack/yew/pull/3038)]
- Assert there are no circular references. [[@WorldSEnder](https://github.com/WorldSEnder), [#3025](https://github.com/yewstack/yew/pull/3025)]
### 🚨 Breaking changes
- Remove special handling of struct fields of type `Option` in `derive(Properties)`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3398](https://github.com/yewstack/yew/pull/3398)]
- Agent v2. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2773](https://github.com/yewstack/yew/pull/2773)]
- Update signature of use_prepared_state/use_transitive_state. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3376](https://github.com/yewstack/yew/pull/3376)]
- Make signature of use_future_with consistent. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3372](https://github.com/yewstack/yew/pull/3372)]
- Allow any type to be used as Children (take 2). [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3289](https://github.com/yewstack/yew/pull/3289)]
- Enable PartialEq for all virtual dom types. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3206](https://github.com/yewstack/yew/pull/3206)]
- Pass hook dependencies as the first function argument. [[@Arniu Tseng](https://github.com/Arniu Tseng), [#2861](https://github.com/yewstack/yew/pull/2861)]
- Make Classes cheap to clone. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3021](https://github.com/yewstack/yew/pull/3021)]
## ✨ yew-router **0.18.0** *(2023-09-xx)*
### ⚡️ Features
- Update dependencies. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3171](https://github.com/yewstack/yew/pull/3171)]
- Only handle "normal" clicks on <Link>s. [[@Kai Salmon](https://github.com/Kai Salmon), [#3056](https://github.com/yewstack/yew/pull/3056)]
### 🚨 Breaking changes
- Encode Path Parameters in `yew-router`. [[@Jedd Dryden](https://github.com/Jedd Dryden), [#3187](https://github.com/yewstack/yew/pull/3187)]
- Pass hook dependencies as the first function argument. [[@Arniu Tseng](https://github.com/Arniu Tseng), [#2861](https://github.com/yewstack/yew/pull/2861)]
## ✨ yew-agent **0.3.0** *(2023-09-xx)*
### 🚨 Breaking changes
- Agent v2. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2773](https://github.com/yewstack/yew/pull/2773)]
## ✨ yew **0.20.0** *(2022-11-xx)*
- ##### 🛠 Fixes
- Fix onsubmit event type in docs. [[@Allan](https://github.com/Allan), [#2926](https://github.com/yewstack/yew/pull/2926)]
- Fix issues with tuples in closing tag. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2886](https://github.com/yewstack/yew/pull/2886)]
- Fix checked property being reset. [[@WorldSEnder](https://github.com/WorldSEnder), [#2907](https://github.com/yewstack/yew/pull/2907)]
- Fix VList Stream in SSR. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2801](https://github.com/yewstack/yew/pull/2801)]
- Fixed `NodeRef` not being implicitly cloned with components. [[@wdcocq](https://github.com/wdcocq), [#2775](https://github.com/yewstack/yew/pull/2775)]
- Attributes: Fix apply_diff_index_maps. [[@Dietmar Maurer](https://github.com/Dietmar Maurer), [#2653](https://github.com/yewstack/yew/pull/2653)]
- Fix bubbling of events originating in shadow dom. [[@WorldSEnder](https://github.com/WorldSEnder), [#2627](https://github.com/yewstack/yew/pull/2627)]
- Fix some Hook edge cases. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2592](https://github.com/yewstack/yew/pull/2592)]
- Fix issue with node refs and hydration. [[@WorldSEnder](https://github.com/WorldSEnder), [#2597](https://github.com/yewstack/yew/pull/2597)]
- Fix macro hygiene issues. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2585](https://github.com/yewstack/yew/pull/2585)]
- Fix casing of dynamic tags. [[@WorldSEnder](https://github.com/WorldSEnder), [#2578](https://github.com/yewstack/yew/pull/2578)]
- Automatically convert closure to callback for component properties. [[@Finn Bear](https://github.com/Finn Bear), [#2554](https://github.com/yewstack/yew/pull/2554)]
- Fix a problem with NodeRefs and VTags, ref. [[@WorldSEnder](https://github.com/WorldSEnder), [#2279](https://github.com/yewstack/yew/pull/2279)]
- Fix defaulted type parameter.. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2284](https://github.com/yewstack/yew/pull/2284)]
- Use Ref::filter_map if rustc is later than 1.63. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2904](https://github.com/yewstack/yew/pull/2904)]
- Evaluate props in the order they're defined. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2887](https://github.com/yewstack/yew/pull/2887)]
- Context: Avoid storing a copy of children. [[@Dietmar Maurer](https://github.com/Dietmar Maurer), [#2885](https://github.com/yewstack/yew/pull/2885)]
- Various improvements to Classes, oriented around reducing allocations. [[@Nathan West](https://github.com/Nathan West), [#2870](https://github.com/yewstack/yew/pull/2870)]
- Resume Suspension upon unmount. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2874](https://github.com/yewstack/yew/pull/2874)]
- Make fn update() re-render the component by default. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#2786](https://github.com/yewstack/yew/pull/2786)]
- Do not detach child elements if parent element is about to be detached. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2420](https://github.com/yewstack/yew/pull/2420)]
- remove some unsafes by using atomics. [[@WorldSEnder](https://github.com/WorldSEnder), [#2186](https://github.com/yewstack/yew/pull/2186)]
- `use_prepared_state` & `use_transitive_state`. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2650](https://github.com/yewstack/yew/pull/2650)]
- Silence some warnings from derive(Properties). [[@WorldSEnder](https://github.com/WorldSEnder), [#2266](https://github.com/yewstack/yew/pull/2266)]
- onsubmit should be a SubmitEvent. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2816](https://github.com/yewstack/yew/pull/2816)]
- ##### ⚡️ Features
- Add VNode::from_html_unchecked. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2842](https://github.com/yewstack/yew/pull/2842)]
- Make Yew lints opt-in. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2882](https://github.com/yewstack/yew/pull/2882)]
- Allow skipping a callback when reforming. [[@Jens Reimann](https://github.com/Jens Reimann), [#2864](https://github.com/yewstack/yew/pull/2864)]
- Polled SSR Stream. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2824](https://github.com/yewstack/yew/pull/2824)]
- Add send_stream method for Scope. [[@laizy](https://github.com/laizy), [#2619](https://github.com/yewstack/yew/pull/2619)]
- Allow functions returning unit in `use_effect`. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2849](https://github.com/yewstack/yew/pull/2849)]
- Configurable Runtime. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2772](https://github.com/yewstack/yew/pull/2772)]
- Pinned Channels. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2811](https://github.com/yewstack/yew/pull/2811)]
- Bind to properties instead of attributes by default. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2819](https://github.com/yewstack/yew/pull/2819)]
- Convert nightly from a feature flag to a compiler flag. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2827](https://github.com/yewstack/yew/pull/2827)]
- Reduce SSR Buffers in VList. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2826](https://github.com/yewstack/yew/pull/2826)]
- Allow keywords after dash in element and attribute names. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2820](https://github.com/yewstack/yew/pull/2820)]
- Replace custom logging by tracing. [[@WorldSEnder](https://github.com/WorldSEnder), [#2814](https://github.com/yewstack/yew/pull/2814)]
- Implement sleep and interval for Yew Platform. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2784](https://github.com/yewstack/yew/pull/2784)]
- Remove component NodeRef. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2783](https://github.com/yewstack/yew/pull/2783)]
- Prepared States dependency should be Reference Counted. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2769](https://github.com/yewstack/yew/pull/2769)]
- Document features automatically.. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2780](https://github.com/yewstack/yew/pull/2780)]
- Streamed SSR Response. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2697](https://github.com/yewstack/yew/pull/2697)]
- Nightly features. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2743](https://github.com/yewstack/yew/pull/2743)]
- Allow VNode props to be converted to Children.. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2749](https://github.com/yewstack/yew/pull/2749)]
- Redo derive(Properties), take 2. [[@WorldSEnder](https://github.com/WorldSEnder), [#2729](https://github.com/yewstack/yew/pull/2729)]
- `Callback::reform()` should return `Callback<T, OUT>`. [[@orzogc](https://github.com/orzogc), [#2719](https://github.com/yewstack/yew/pull/2719)]
- Span hygiene and editor UX. [[@WorldSEnder](https://github.com/WorldSEnder), [#2702](https://github.com/yewstack/yew/pull/2702)]
- Block props update during hydration. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2665](https://github.com/yewstack/yew/pull/2665)]
- Point to `callback_future` in `callback` docs. [[@Shadlock0133](https://github.com/Shadlock0133), [#2674](https://github.com/yewstack/yew/pull/2674)]
- Change access to VList children to a wrapper. [[@WorldSEnder](https://github.com/WorldSEnder), [#2673](https://github.com/yewstack/yew/pull/2673)]
- Partially undo #2673, different approach for the DerefMut impl of VList. [[@WorldSEnder](https://github.com/WorldSEnder), [#2692](https://github.com/yewstack/yew/pull/2692)]
- Rework a bunch of cfg(feature) flags to be more principled. [[@WorldSEnder](https://github.com/WorldSEnder), [#2666](https://github.com/yewstack/yew/pull/2666)]
- Delay Hydration second render until all assistive nodes have been removed. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2629](https://github.com/yewstack/yew/pull/2629)]
- Allow to consume deps in use_callback. [[@Jet Li](https://github.com/Jet Li), [#2617](https://github.com/yewstack/yew/pull/2617)]
- Add `use_future` hook to make consuming futures as suspense easier. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2609](https://github.com/yewstack/yew/pull/2609)]
- Add the ability to use non-literal string as attribute names. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2593](https://github.com/yewstack/yew/pull/2593)]
- Introduce a dedicated use_force_update hook. [[@WorldSEnder](https://github.com/WorldSEnder), [#2586](https://github.com/yewstack/yew/pull/2586)]
- Impl ImplicitClone for Rc<T> where T: Sized. [[@Nano](https://github.com/Nano), [#2594](https://github.com/yewstack/yew/pull/2594)]
- SSR Hydration. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2552](https://github.com/yewstack/yew/pull/2552)]
- Add use_callback hook. [[@Jet Li](https://github.com/Jet Li), [#2566](https://github.com/yewstack/yew/pull/2566)]
- Introduce additional information in SSR artifact to facilitate Hydration. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2540](https://github.com/yewstack/yew/pull/2540)]
- Scoped event handlers. [[@WorldSEnder](https://github.com/WorldSEnder), [#2510](https://github.com/yewstack/yew/pull/2510)]
- An ever Increasing Component ID. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2537](https://github.com/yewstack/yew/pull/2537)]
- Prevents Fallback UI from becoming suspended. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2532](https://github.com/yewstack/yew/pull/2532)]
- `#[cfg(feature = "render")]` and `yew::Renderer`. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2498](https://github.com/yewstack/yew/pull/2498)]
- Introduce explicit internal datastructures modeling dom state. [[@WorldSEnder](https://github.com/WorldSEnder), [#2330](https://github.com/yewstack/yew/pull/2330)]
- Improve AnyScope API. [[@Aaron Erhardt](https://github.com/Aaron Erhardt), [#2445](https://github.com/yewstack/yew/pull/2445)]
- Automatic Message Batching. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2421](https://github.com/yewstack/yew/pull/2421)]
- Add Other variant to the ListenerKind. [[@Alexander Mescheryakov](https://github.com/Alexander Mescheryakov), [#2417](https://github.com/yewstack/yew/pull/2417)]
- Function Components & Hooks V2. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2401](https://github.com/yewstack/yew/pull/2401)]
- Add ContextHandle in yew::prelude. [[@Anuvrat Singh](https://github.com/Anuvrat Singh), [#2372](https://github.com/yewstack/yew/pull/2372)]
- Separate scheduler rendered call from create and render. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2374](https://github.com/yewstack/yew/pull/2374)]
- Update to edition 2021. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2354](https://github.com/yewstack/yew/pull/2354)]
- Server-side Rendering (without hydration). [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2335](https://github.com/yewstack/yew/pull/2335)]
- Make BaseComponent Sealed.. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2359](https://github.com/yewstack/yew/pull/2359)]
- Remove start_app_as_body.. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2346](https://github.com/yewstack/yew/pull/2346)]
- Bump minimal supported rust version (MSRV) to 1.56. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2334](https://github.com/yewstack/yew/pull/2334)]
- Suspense Support. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2212](https://github.com/yewstack/yew/pull/2212)]
- make layout testing code public. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2310](https://github.com/yewstack/yew/pull/2310)]
- Refactor and simplify `Callback`. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2301](https://github.com/yewstack/yew/pull/2301)]
- Add pending event listener on the VTag. [[@Alexander Mescheryakov](https://github.com/Alexander Mescheryakov), [#2300](https://github.com/yewstack/yew/pull/2300)]
- constify VList::new. [[@Alexander Mescheryakov](https://github.com/Alexander Mescheryakov), [#2293](https://github.com/yewstack/yew/pull/2293)]
- Allow `function_component` creation based on function name. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2292](https://github.com/yewstack/yew/pull/2292)]
- Implement IntoPropValue for Rc<str>. [[@Zachary Stewart](https://github.com/Zachary Stewart), [#2285](https://github.com/yewstack/yew/pull/2285)]
- Raw field names in property structs. [[@WorldSEnder](https://github.com/WorldSEnder), [#2273](https://github.com/yewstack/yew/pull/2273)]
## ✨ yew-router **0.17.0** *(2022-11-xx)*
- ##### 🛠 Fixes
- Fix basename handling in router. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2297](https://github.com/yewstack/yew/pull/2297)]
- ##### ⚡️ Features
- Simple `NodeRef` passing to `<Link>` for yew-router. [[@Athan Clark](https://github.com/Athan Clark), [#2877](https://github.com/yewstack/yew/pull/2877)]
- Make Switch to accept a closure as render function directly. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2659](https://github.com/yewstack/yew/pull/2659)]
- `#[cfg(feature = "render")]` and `yew::Renderer`. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2498](https://github.com/yewstack/yew/pull/2498)]
- Includes query parameters in rendered Link component. [[@Yuki Kodama](https://github.com/Yuki Kodama), [#2464](https://github.com/yewstack/yew/pull/2464)]
- Update to edition 2021. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2354](https://github.com/yewstack/yew/pull/2354)]
- Support named wildcards when deriving Routable.. [[@Jonathan Bailey](https://github.com/Jonathan Bailey), [#2345](https://github.com/yewstack/yew/pull/2345)]
- Add HashRouter, basename and use gloo-history. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2239](https://github.com/yewstack/yew/pull/2239)]
## ✨ yew-agent **0.2.0** *(2022-11-xx)*
- ##### ⚡️ Features
- add `use_bridge` docs. [[@Shrey Sudhir](https://github.com/Shrey Sudhir), [#2722](https://github.com/yewstack/yew/pull/2722)]
- Update to edition 2021. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2354](https://github.com/yewstack/yew/pull/2354)]
- Move yew-agent to gloo. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#2326](https://github.com/yewstack/yew/pull/2326)]
- Implement PrivateAgent. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2318](https://github.com/yewstack/yew/pull/2318)]
- Remove context & job agent. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2295](https://github.com/yewstack/yew/pull/2295)]
## ✨ yew **0.19.0** *(2021-11-26)*
- ##### 🛠 Fixes
- Attempt to fix recursion on display. [[@mibes](https://github.com/mibes), [#2149](https://github.com/yewstack/yew/pull/2149)]
- Fix default passive option. [[@mc1098](https://github.com/mc1098), [#2111](https://github.com/yewstack/yew/pull/2111)]
- Fix trybuild. [[@mc1098](https://github.com/mc1098), [#2103](https://github.com/yewstack/yew/pull/2103)]
- Fix event handler during capture phase. [[@mc1098](https://github.com/mc1098), [#2062](https://github.com/yewstack/yew/pull/2062)]
- Fix `VTag` reuse to reset ancestor `NodeRef`. [[@mc1098](https://github.com/mc1098), [#2030](https://github.com/yewstack/yew/pull/2030)]
- Fix IntoEventCallback over IntoPropValue. [[@mc1098](https://github.com/mc1098), [#2025](https://github.com/yewstack/yew/pull/2025)]
- Remove underscore prefix on fn parameters. [[@mc1098](https://github.com/mc1098), [#2010](https://github.com/yewstack/yew/pull/2010)]
- Fix rust-analyzer #[derive(Properties)] warnings. [[@KarlitosVII](https://github.com/KarlitosVII), [#2007](https://github.com/yewstack/yew/pull/2007)]
- Fix clippy lints from 1.54.0. [[@Xavientois](https://github.com/Xavientois), [#1976](https://github.com/yewstack/yew/pull/1976)]
- Fix scheduler main queue delay (#1953). [[@intendednull](https://github.com/intendednull), [#1954](https://github.com/yewstack/yew/pull/1954)]
- Fix case warning on derived properties. [[@nitnelave](https://github.com/nitnelave), [#1929](https://github.com/yewstack/yew/pull/1929)]
- yew-macro: fix inability to set the autoplay attribute. [[@bakape](https://github.com/bakape), [#1866](https://github.com/yewstack/yew/pull/1866)]
- Fix duplicate `with props` error messages.. [[@teymour-aldridge](https://github.com/teymour-aldridge), [#1730](https://github.com/yewstack/yew/pull/1730)]
- Remove extra braces in html_nested macro. [[@Madoshakalaka](https://github.com/Madoshakalaka), [#2169](https://github.com/yewstack/yew/pull/2169)]
- Remove unused punct field from props. [[@Xavientois](https://github.com/Xavientois), [#1969](https://github.com/yewstack/yew/pull/1969)]
- ##### ⚡️ Features
- Check event bubbling cancellation at each step of propagation. [[@rjmac](https://github.com/rjmac), [#2191](https://github.com/yewstack/yew/pull/2191)]
- Add possibility to cancel bubbling. [[@voidpumpkin](https://github.com/voidpumpkin), [#2172](https://github.com/yewstack/yew/pull/2172)]
- Add the ability to add child nodes conditionally in `html!`. [[@cecton](https://github.com/cecton), [#1609](https://github.com/yewstack/yew/pull/1609)]
- Add basic lints to the HTML macro.. [[@teymour-aldridge](https://github.com/teymour-aldridge), [#1748](https://github.com/yewstack/yew/pull/1748)]
- Refactor use ref hooks. [[@mc1098](https://github.com/mc1098), [#2093](https://github.com/yewstack/yew/pull/2093)]
- Implementation of portals. [[@WorldSEnder](https://github.com/WorldSEnder), [#2147](https://github.com/yewstack/yew/pull/2147)]
- Allow Classes properties to be created from string literals. [[@jplatte](https://github.com/jplatte), [#2141](https://github.com/yewstack/yew/pull/2141)]
- Use functions from `gloo_utils` instead of re-implementing them. [[@hamza1311](https://github.com/hamza1311), [#2124](https://github.com/yewstack/yew/pull/2124)]
- Reliable `use_reducer` dispatch and `use_state` setter. [[@futursolo](https://github.com/futursolo), [#2126](https://github.com/yewstack/yew/pull/2126)]
- Add custom type for attribute values. [[@hamza1311](https://github.com/hamza1311), [#1994](https://github.com/yewstack/yew/pull/1994)]
- Remove trailing semicolon in macro used in expression position. [[@vrmiguel](https://github.com/vrmiguel), [#2127](https://github.com/yewstack/yew/pull/2127)]
- Add set_if_neq for UseStateHandle. [[@voidpumpkin](https://github.com/voidpumpkin), [#2109](https://github.com/yewstack/yew/pull/2109)]
- Add safe first_node fn. [[@mc1098](https://github.com/mc1098), [#2094](https://github.com/yewstack/yew/pull/2094)]
- impl PartialEq for `UseStateHandle` and `UseReducerHandle`. [[@hamza1311](https://github.com/hamza1311), [#2092](https://github.com/yewstack/yew/pull/2092)]
- Remove `web_sys` re-export. [[@mc1098](https://github.com/mc1098), [#2084](https://github.com/yewstack/yew/pull/2084)]
- Use into_prop_value to convert str prop to Option<String>. [[@Xavientois](https://github.com/Xavientois), [#2080](https://github.com/yewstack/yew/pull/2080)]
- Component lifecycle scheduler optimizations. [[@bakape](https://github.com/bakape), [#2065](https://github.com/yewstack/yew/pull/2065)]
- Update dependencies. [[@mc1098](https://github.com/mc1098), [#2064](https://github.com/yewstack/yew/pull/2064)]
- Add support for missing boolean attributes. [[@mc1098](https://github.com/mc1098), [#2051](https://github.com/yewstack/yew/pull/2051)]
- Add fully qualified primitives in proc macro. [[@mc1098](https://github.com/mc1098), [#2037](https://github.com/yewstack/yew/pull/2037)]
- Remove 'static lifetime from hook init function. [[@mc1098](https://github.com/mc1098), [#2039](https://github.com/yewstack/yew/pull/2039)]
- Add "struct update" syntax to pass props to component (`..props` instead of `with props`). [[@Xavientois](https://github.com/Xavientois), [#2024](https://github.com/yewstack/yew/pull/2024)]
- Add `no_implicit_prelude` to proc macro tests. [[@mc1098](https://github.com/mc1098), [#2033](https://github.com/yewstack/yew/pull/2033)]
- Dev/listener multiplexer. [[@bakape](https://github.com/bakape), [#1542](https://github.com/yewstack/yew/pull/1542)]
- Remove ShouldRender type alias. [[@mc1098](https://github.com/mc1098), [#2011](https://github.com/yewstack/yew/pull/2011)]
- Components v2 (2). [[@hamza1311](https://github.com/hamza1311), [#1961](https://github.com/yewstack/yew/pull/1961)]
- Remove InputData & ChangeData. [[@mc1098](https://github.com/mc1098), [#2000](https://github.com/yewstack/yew/pull/2000)]
- Support const generics in `#[derive(Properties)]`. [[@maciejhirsz](https://github.com/maciejhirsz), [#1978](https://github.com/yewstack/yew/pull/1978)]
- Add shorthand syntax for props. [[@Xavientois](https://github.com/Xavientois), [#1970](https://github.com/yewstack/yew/pull/1970)]
- Static attribute lists. [[@bakape](https://github.com/bakape), [#1962](https://github.com/yewstack/yew/pull/1962)]
- yew/vlist: optimize diffing and patching. [[@bakape](https://github.com/bakape), [#1555](https://github.com/yewstack/yew/pull/1555)]
- Add requirement for braces around most props. [[@Xavientois](https://github.com/Xavientois), [#1939](https://github.com/yewstack/yew/pull/1939)]
- Optimize VTag construction, memory footprint and patching. [[@bakape](https://github.com/bakape), [#1947](https://github.com/yewstack/yew/pull/1947)]
- Refactor and cleanup codebase. [[@hamza1311](https://github.com/hamza1311), [#1842](https://github.com/yewstack/yew/pull/1842)]
- Helper to build changelog. [[@cecton](https://github.com/cecton), [#1845](https://github.com/yewstack/yew/pull/1845)]
- Implicit optional attributes. [[@siku2](https://github.com/siku2), [#1637](https://github.com/yewstack/yew/pull/1637)]
- yew: reduce scheduler call indirection. [[@bakape](https://github.com/bakape), [#1903](https://github.com/yewstack/yew/pull/1903)]
- Change match statement to if. [[@Xavientois](https://github.com/Xavientois), [#1884](https://github.com/yewstack/yew/pull/1884)]
- Optimize vtag construction. [[@bakape](https://github.com/bakape), [#1867](https://github.com/yewstack/yew/pull/1867)]
- Apply Clippy lints.. [[@teymour-aldridge](https://github.com/teymour-aldridge), [#1863](https://github.com/yewstack/yew/pull/1863)]
- Change the app struct to be a real handle to an Yew app instance and make it possible to destroy a running app. [[@nicklaswj](https://github.com/nicklaswj), [#1825](https://github.com/yewstack/yew/pull/1825)]
- Bring context to standard components. [[@Diggsey](https://github.com/Diggsey), [#1835](https://github.com/yewstack/yew/pull/1835)]
- Upgraded Hook API (2). [[@hamza1311](https://github.com/hamza1311), [#1780](https://github.com/yewstack/yew/pull/1780)]
- Store hook state in a mutable scoped-TLS. [[@Diggsey](https://github.com/Diggsey), [#1831](https://github.com/yewstack/yew/pull/1831)]
- Remove unnecessary allocation from `AnyScope`. [[@Diggsey](https://github.com/Diggsey), [#1830](https://github.com/yewstack/yew/pull/1830)]
- Added missing licenses to Cargo.toml files and updated to use SPDX syntax. [[@jbg](https://github.com/jbg), [#1822](https://github.com/yewstack/yew/pull/1822)]
- Update Rust version for macro tests to 1.51 & enable const generics tests. [[@hamza1311](https://github.com/hamza1311), [#1801](https://github.com/yewstack/yew/pull/1801)]
- Allow the use of Rust keywords for element names. [[@siku2](https://github.com/siku2), [#1772](https://github.com/yewstack/yew/pull/1772)]
- Refactor html tag peeking. [[@lukechu10](https://github.com/lukechu10), [#1738](https://github.com/yewstack/yew/pull/1738)]
- Generic functional components. [[@lukechu10](https://github.com/lukechu10), [#1756](https://github.com/yewstack/yew/pull/1756)]
- Add support for the unit struct in Properties derive. [[@Xavientois](https://github.com/Xavientois), [#1752](https://github.com/yewstack/yew/pull/1752)]
- Rip out stdweb. [[@philip-peterson](https://github.com/philip-peterson), [#1697](https://github.com/yewstack/yew/pull/1697)]
## ✨ yew-router **0.16.0** *(2021-11-26)*
- ##### 🛠 Fixes
- Fix Some Router Behaviour. [[@futursolo](https://github.com/futursolo), [#2107](https://github.com/yewstack/yew/pull/2107)]
- Fix multiple field enum tokens. [[@mc1098](https://github.com/mc1098), [#1988](https://github.com/yewstack/yew/pull/1988)]
- Fix clippy lints from 1.54.0. [[@Xavientois](https://github.com/Xavientois), [#1976](https://github.com/yewstack/yew/pull/1976)]
- Fix router. [[@hamza1311](https://github.com/hamza1311), [#1856](https://github.com/yewstack/yew/pull/1856)]
- update nom 6.1.2 and fix compile errors.. [[@higumachan](https://github.com/higumachan), [#1806](https://github.com/yewstack/yew/pull/1806)]
- ##### ⚡️ Features
- Add missing router docs: Redirect, Nested Router, and Path Segament capturing. [[@Madoshakalaka](https://github.com/Madoshakalaka), [#2192](https://github.com/yewstack/yew/pull/2192)]
- use base url for href of links. [[@WorldSEnder](https://github.com/WorldSEnder), [#2177](https://github.com/yewstack/yew/pull/2177)]
- Use functions from `gloo_utils` instead of re-implementing them. [[@hamza1311](https://github.com/hamza1311), [#2124](https://github.com/yewstack/yew/pull/2124)]
- Update Yew Router as per #2113. [[@futursolo](https://github.com/futursolo), [#2118](https://github.com/yewstack/yew/pull/2118)]
- Update dependencies. [[@mc1098](https://github.com/mc1098), [#2064](https://github.com/yewstack/yew/pull/2064)]
- Add "replace route" call as a companion to "push route". [[@rjmac](https://github.com/rjmac), [#2023](https://github.com/yewstack/yew/pull/2023)]
- Add shorthand syntax for props. [[@Xavientois](https://github.com/Xavientois), [#1970](https://github.com/yewstack/yew/pull/1970)]
- Add requirement for braces around most props. [[@Xavientois](https://github.com/Xavientois), [#1939](https://github.com/yewstack/yew/pull/1939)]
- Clean-up and optimize router a little bit. [[@hamza1311](https://github.com/hamza1311), [#1869](https://github.com/yewstack/yew/pull/1869)]
- Apply Clippy lints.. [[@teymour-aldridge](https://github.com/teymour-aldridge), [#1863](https://github.com/yewstack/yew/pull/1863)]
- Rewrite router. [[@hamza1311](https://github.com/hamza1311), [#1791](https://github.com/yewstack/yew/pull/1791)]
- Added missing licenses to Cargo.toml files and updated to use SPDX syntax. [[@jbg](https://github.com/jbg), [#1822](https://github.com/yewstack/yew/pull/1822)]
- Update Rust version for macro tests to 1.51 & enable const generics tests. [[@hamza1311](https://github.com/hamza1311), [#1801](https://github.com/yewstack/yew/pull/1801)]
- Add support for the unit struct in Properties derive. [[@Xavientois](https://github.com/Xavientois), [#1752](https://github.com/yewstack/yew/pull/1752)]
## ✨ yew-agent **0.1.0** *(2021-11-26)*
- ##### 🛠 Fixes
- Fix unmaintained anymap dependency. [[@mc1098](https://github.com/mc1098), [#2071](https://github.com/yewstack/yew/pull/2071)]
- Fix clippy lints from 1.54.0. [[@Xavientois](https://github.com/Xavientois), [#1976](https://github.com/yewstack/yew/pull/1976)]
- Fix crash in link to destroyed agents. [[@kristoff3r](https://github.com/kristoff3r), [#1827](https://github.com/yewstack/yew/pull/1827)]
- ##### ⚡️ Features
- allow web worker resource to be relative. [[@astraw](https://github.com/astraw), [#2086](https://github.com/yewstack/yew/pull/2086)]
- `use_bridge` hook for agents. [[@futursolo](https://github.com/futursolo), [#2125](https://github.com/yewstack/yew/pull/2125)]
- Use functions from `gloo_utils` instead of re-implementing them. [[@hamza1311](https://github.com/hamza1311), [#2124](https://github.com/yewstack/yew/pull/2124)]
- yew-agent: add missing web-sys features. [[@astraw](https://github.com/astraw), [#2085](https://github.com/yewstack/yew/pull/2085)]
- Update dependencies. [[@mc1098](https://github.com/mc1098), [#2064](https://github.com/yewstack/yew/pull/2064)]
- Drop Private worker handler when bridge is dropped. [[@FrancisMurillo](https://github.com/FrancisMurillo), [#1944](https://github.com/yewstack/yew/pull/1944)]
## ✨ yew **0.18.0** *(2021-05-15)*
- ##### 🛠 Fixes
- Fix missing redirects. [[@siku2](https://github.com/siku2), [#1640](https://github.com/yewstack/yew/pull/1640)]
- Remove Drop bound from Task trait. [[@siku2](https://github.com/siku2), [#1627](https://github.com/yewstack/yew/pull/1627)]
- Enable std feature for indexmap. [[@jstarry](https://github.com/jstarry), [#1709](https://github.com/yewstack/yew/pull/1709)]
- ##### ⚡️ Features
- Implicit optional attributes. [[@siku2](https://github.com/siku2), [#1637](https://github.com/yewstack/yew/pull/1637)]
- Added callback_future_once in yewtil.(#1712). [[@fraillt](https://github.com/fraillt), [#1696](https://github.com/yewstack/yew/pull/1696)]
- Added relevant examples section to the docs. [[@oOBoomberOo](https://github.com/oOBoomberOo), [#1695](https://github.com/yewstack/yew/pull/1695)]
- Added missing KeyboardService re-export. [[@SOF3](https://github.com/SOF3), [#1694](https://github.com/yewstack/yew/pull/1694)]
- Rename internal Agent structs to match Component. [[@jstarry](https://github.com/jstarry), [#1688](https://github.com/yewstack/yew/pull/1688)]
- Add discussion link to issue selector. [[@jstarry](https://github.com/jstarry), [#1674](https://github.com/yewstack/yew/pull/1674)]
- Update link to Material Design Components. [[@TapioT](https://github.com/TapioT), [#1662](https://github.com/yewstack/yew/pull/1662)]
- Extract Classes to a separate macro. [[@cecton](https://github.com/cecton), [#1601](https://github.com/yewstack/yew/pull/1601)]
- Improve the "keyed_list" example. [[@titaneric](https://github.com/titaneric), [#1650](https://github.com/yewstack/yew/pull/1650)]
- Add documentation for component children. [[@K4rakara](https://github.com/K4rakara), [#1616](https://github.com/yewstack/yew/pull/1616)]
- Add a macro for building properties outside of html!. [[@siku2](https://github.com/siku2), [#1599](https://github.com/yewstack/yew/pull/1599)]
## ✨ yew-router **0.15.0** *(2021-05-15)*
- ##### ⚡️ Features
- None
- ##### 🛠 Fixes
- None
- ##### 🚨 Breaking changes
- `RouterButton` now prevents default events per default @TheNeikos
## ✨ yew **0.17.4** *(2020-10-18)*
- ##### 🛠 Fixes
- Fixed a "call stack exceeded" panic that occurred if a `Component` was updated many times [[@jstarry], [#1624](https://github.com/yewstack/yew/pull/1624)]
## ✨ yew **0.17.3** *(2020-08-16)*
- ##### ⚡️ Features
- Added `prompt` function to `DialogService`. [[@teymour-aldridge], [#1350](https://github.com/yewstack/yew/pull/1350)]
- Implement `From<&[T]>` where `T: AsRef<str>` for `Classes`. [[@alexschrod], [#1448](https://github.com/yewstack/yew/pull/1448)]
- Added `batch_callback_once` to `ComponentLink`. [[@ctron], [#1463](https://github.com/yewstack/yew/pull/1463)]
- ##### 🛠 Fixes
- Properties with default type params can now have `Properties` trait derived. [[@siku2], [#1408](https://github.com/yewstack/yew/pull/1408)]
- `html!`: Improved compile error messages for invalid list fragments. [[@siku2], [#1445](https://github.com/yewstack/yew/pull/1445)]
- Batch component updates are processed more efficiently. [[@bakape], [#1470](https://github.com/yewstack/yew/pull/1470)]
## ✨ yew **0.17.2** *(2020-07-04)*
- ##### ⚡️ Features
- `Key` now implements `Deref<Target = str>`. [[@faulesocke], [#1370](https://github.com/yewstack/yew/pull/1370)]
- ##### 🛠 Fixes
- Uncontrolled input values are no cleared when component renders. [[@jstarry], [#1374](https://github.com/yewstack/yew/pull/1374)]
- Revert lazy rendering behavior introduced in `0.17.0`. Yew will render the component between each update. [[@jstarry], [#1373](https://github.com/yewstack/yew/pull/1373)]
## ✨ yew **0.17.1** *(2020-07-01)*
- ##### 🛠 Fixes
- Fixed regression where component `rendered` lifecycle method was called before children components finish rendering. [[@jstarry], [#1360](https://github.com/yewstack/yew/pull/1360)]
## ✨ yew-router **0.14.0** *(2020-06-30)*
- ##### ⚡️ Features
- None
- ##### 🛠 Fixes
- None
- ##### 🚨 Breaking changes
- The `unit_state` module has been removed.
- Bump `yew` version to `0.17`.
## ✨ yew **0.17.0** *(2020-06-29)*
- ##### ⚡️ Features
- Allow agents to send input messages to themselves. [[@mkawalec], [#1278](https://github.com/yewstack/yew/pull/1278)]
- Rendering performance has been improved by [~20%](http://static.yew.rs/v0.17-benchmarks.png). [[@jstarry], [#1296](https://github.com/yewstack/yew/pull/1296), [#1309](https://github.com/yewstack/yew/pull/1309)]
- `html!`: Elements can be specified with dynamic tag names. [[@siku2], [#1266](https://github.com/yewstack/yew/pull/1266)]
In order to specify a dynamic tag name, wrap an expression with `@{..}`:
```rust
let tag_name = "input";
html! { <@{tag_name} value="Hello" /> }
```
- HTML button element `type` can now be specified (`"submit"`, `"reset"`, or `"button"`). [[@captain-yossarian], [#1033](https://github.com/yewstack/yew/pull/1033)]
- All global event listeners can be used as listeners (`onerror`, `onloadend`, and many more). [[@siku2], [#1244](https://github.com/yewstack/yew/pull/1242)]
- `PartialEq` is now implemented for `VChild` when properties also implement `PartialEq`. [[@kellpossible], [#1242](https://github.com/yewstack/yew/pull/1242)]
- Agent callbacks now accept `Into<Message>` to improve ergonomics. [[@totorigolo], [#1215](https://github.com/yewstack/yew/pull/1215)]
- Agents can now send messages to themselves. [[@totorigolo], [#1215](https://github.com/yewstack/yew/pull/1215)]
- ##### 🛠 Fixes
- Bincode dependency version has been loosened `1.2.1` -> `1`. [[@jstarry], [#1349](https://github.com/yewstack/yew/pull/1349)]
- Keyed list ordering algorithm has been fixed. [[@totorigolo] and [@jstarry], [#1231](https://github.com/yewstack/yew/pull/1231)]
- `html!`: `key` and `ref` are no longer ignored for components with no properties. [[@jstarry], [#1338](https://github.com/yewstack/yew/pull/1338)]
- `html!`: List rendering behavior is consistent no matter which syntax is chosen. [[@siku2], [#1275](https://github.com/yewstack/yew/pull/1275)]
`html! { for node_list }` is now equivalent to `html! { node_list }` when `node_list` is a `Vec<VNode>`.
- `KeyboardService` events can now have default behavior prevented. [[@ghpu], [#1286](https://github.com/yewstack/yew/pull/1286)]
- Yew will check the current DOM `input` value before comparing with the desired value. [[@ShadoySV], [#1268](https://github.com/yewstack/yew/pull/1268)]
- `html!`: Void elements (`<br/>`, `<input />`) are no longer allowed to have children. [[@kaoet], [#1217](https://github.com/yewstack/yew/pull/1217)]
- Local agents no longer require `Input` and `Output` to implement `Serializable`. [[@mkawalec], [#1195](https://github.com/yewstack/yew/pull/1195)]
- ##### 🚨 Breaking changes
- Renders are now done lazily and will not be executed until all updates have been processed. [[@jstarry], [#1309](https://github.com/yewstack/yew/pull/1309)]
- `ConsoleService`, `DialogService`, `IntervalService`, `RenderService`, `TimeoutService`, and `WebSocketService` methods are now static. [[@teymour-aldridge], [#1313](https://github.com/yewstack/yew/pull/1313)]
- `html!`: `Children` no longer implements `Renderable`. [[@siku2], [#1275](https://github.com/yewstack/yew/pull/1275)]
Replace instances of `self.props.children.render()` with `self.props.children.clone()`.
- Yew no longer stops propagation of events by default. [[@jstarry], [#1256](https://github.com/yewstack/yew/pull/1256)]
Event propagation is usually stopped when you have event listeners attached to nested elements and do not want the event to bubble up from where it was first captured. If your app has this behavior, you can stop propagation by calling `stop_propagation()` on the desired event.
- The `onsubmit` listener now uses `FocusEvent` instead `Event` when using `web-sys`. [[@siku2], [#1244](https://github.com/yewstack/yew/pull/1244)]
- The `onmousewheel` and `ontouchenter` listeners have been removed. [[@siku2], [#1244](https://github.com/yewstack/yew/pull/1244)]
- The `ondoubleclick` listener is now named `ondblclick`. [[@siku2], [#1244](https://github.com/yewstack/yew/pull/1244)]
- `FetchService` methods are now static. [[@teymour-aldridge], [#1235](https://github.com/yewstack/yew/pull/1235)]
Instead of `FetchService::new().fetch(..)` you should now use `FetchService::fetch(..)`
- The `send_message_batch` method has been removed from `AgentLink`. [[@totorigolo], [#1215](https://github.com/yewstack/yew/pull/1215)]
- Minimum supported rust version has been bumped from `1.40.0` to `1.42.0`. [[@mkawalec], [#1195](https://github.com/yewstack/yew/pull/1195)]
- Every agent `Reach` type is now generic. [[@mkawalec], [#1195](https://github.com/yewstack/yew/pull/1195)]
In order to fix your app, simply append `<Self>` to the reach:
`Reach = Context` -> `Reach = Context<Self>`
- Removed `Global` agent because it was never implemented. [[@jstarry], [#1202](https://github.com/yewstack/yew/pull/1202)]
- Reduced visibility of internal agent types that were not intended to be public. [[@jstarry], [#1202](https://github.com/yewstack/yew/pull/1202)]
## ✨ yew **0.16.2** *(2020-05-14)*
- ##### 🛠 Fixes
- Fixed regression where messages sent from `Component::create` were skipped. [[@jstarry], [#1225](https://github.com/yewstack/yew/pull/1225)]
## ✨ yew **0.16.1** *(2020-05-14)*
- ##### 🛠 Fixes
- Worker script is now loaded from absolute path. [[@domdir], [#1175](https://github.com/yewstack/yew/pull/1175)]
- Improved `html!` macro error messages. [[@teymour-aldridge], [#1192](https://github.com/yewstack/yew/pull/1192)], [[@kaoet], [#1219](https://github.com/yewstack/yew/pull/1219)]
## ✨ yew-router **0.13.0** *(2020-05-12)*
- ##### 🚨 Breaking changes
- Bump `yew` version to `0.16`.
## ✨ yew **0.16** *(2020-05-09)*
- ##### ⚡️ Features
- Added optional `id`, `class`, and `placeholder` properties to the `Select` component. [[@Stigjb], [#1187](https://github.com/yewstack/yew/pull/1187)]
- Re-export `web-sys` from Yew. This allows projects to use `web-sys` without adding it to their `Cargo.toml`. [[@D4nte], [#1176](https://github.com/yewstack/yew/pull/1176)]
- Added support for `Option` wrapped class names. [[@liquidblock], [#1085](https://github.com/yewstack/yew/pull/1085)]
The following code is now supported:
```rust
let color: &Option<String> = &self.color;
html! { <div class=("btn", color)></div> }
```
- Added `get_parent` and `get_component` methods to `ComponentLink` to allow access to parent component state. [[@jstarry], [#1151](https://github.com/yewstack/yew/pull/1151)]
- ##### 🛠 Fixes
- Fixed bug that caused html class attributes to be set to an empty string. [[@liquidblock], [#1085](https://github.com/yewstack/yew/pull/1085)]
- Fixed `Private` worker lifecycle event sending. [[@joaquindk], [#1146](https://github.com/yewstack/yew/pull/1146)]
- ##### 🚨 Breaking changes
- Bumped minimum supported Rust version (MSRV) to 1.40.0. [[@jstarry], [#1152](https://github.com/yewstack/yew/pull/1152)]
## ✨ yew-router **0.12.1** *(2020-04-26)*
- ##### 🛠 Fixes
- Fix infinite rerender bug in 'Router' component. (Thanks @dancespiele)
## ✨ yew **0.15** *(2020-04-25)*
#### Attention!
`yew` now uses `web-sys` by default. If your project uses `web-sys`, you can now drop the `"web_sys"` feature from your yew dependency.
Don't worry `stdweb` users, we have created a new alias crate for y'all called `yew-stdweb`. In order to use it, update your `Cargo.toml` yew dependency to the following:
```toml
yew = { version = "0.15", package = "yew-stdweb" }
```
#### Dev Survey Results
Thank you to everyone that took the time to fill out the Yew Dev Survey! 🙇♂️
Results have been posted here: https://github.com/yewstack/yew/wiki/Dev-Survey-%5BSpring-2020%5D
#### New Chatroom
We moved from Gitter to Discord! Join us: https://discord.gg/VQck8X4
- ##### ⚡️ Features
- Add support for single use callbacks (useful for `TimeoutService`). [[@lukerandall], [#1125](https://github.com/yewstack/yew/pull/1125)]
- Updated scheduler to eagerly destroy components to avoid unnecessary renders. [[@jstarry], [#1072](https://github.com/yewstack/yew/pull/1072)]
- Add support `key` attribute to improve rendering performance. [[@mrh0057], [#1076](https://github.com/yewstack/yew/pull/1076)]
- ##### 🛠 Fixes
- Split class names on whitespace when passed within `tuple` or `Vec`. [[@bryanjswift], [#1084](https://github.com/yewstack/yew/pull/1084)]
- ##### 🚨 Breaking changes
- The `components` module has been moved out `yew` and into `yew-components`. [[@jstarry], [#1132](https://github.com/yewstack/yew/pull/1132)]
- Replaced `mounted` component lifecycle method with `rendered` which is called after each render. [[@jstarry], [#1072](https://github.com/yewstack/yew/pull/1072)]
- Components must now implement the `change` method (forgetting this was a very common issue). [[@jstarry], [#1071](https://github.com/yewstack/yew/pull/1071)]
- Yew now builds with `web-sys` by default. [[@jstarry], [#1092](https://github.com/yewstack/yew/pull/1092)]
## ✨ yew-router **0.12.0** *(2020-04-25)*
- ##### 🚨 Breaking changes
- Bump `yew` version to `0.15`.
- #### Extraneous
- Remove `guide` example.
## ✨ yew **0.14.3** *(2020-04-04)*
- ##### 🛠 Fixes
- Remove `html!` component validation to allow generic components. [[@mankinskin], [#1065](https://github.com/yewstack/yew/pull/1065)]
- Improve `Debug` formatting for `VTag` and `VText`. [[@dancespiele], [#1059](https://github.com/yewstack/yew/pull/1059)]
- Implement `Default` for `Callback`. [[@TheNeikos], [#1043](https://github.com/yewstack/yew/pull/1043)]
## ✨ yew **0.14.2** *(2020-03-23)*
- ##### 🛠 Fixes
- Fix issue where components were rendered out of order. [[@mrh0057] & [@jstarry], [#1051](https://github.com/yewstack/yew/pull/1051)]
- Reset Select component correctly in Firefox / Edge. [[@kuy], [#987](https://github.com/yewstack/yew/pull/987)]
## ✨ yew **0.14.1** *(2020-03-14)*
- ##### 🛠 Fixes
- `Connected` message was only called for first bridge creation. [[@nicklaswj], [#1029](https://github.com/yewstack/yew/pull/1029)]
## ✨ yew **0.14** *(2020-03-14)*
Happy 🥧 (PI) Day! This release brings a number of bug fixes for `web-sys` apps and ergonomic improvements to the API. Huge thanks to the community for diving into the migration from `stdweb` to `web-sys` so quickly and uncovering these issues!
- ##### ⚡️ Features
- Implemented `Clone` for `WebSocketStatus`. [[@kellytk], [#1023](https://github.com/yewstack/yew/pull/1023)]
- Improved ergonomics for message APIs by accepting `Into<Msg>`. [[@captain-yossarian], [#999](https://github.com/yewstack/yew/pull/999)]
- `html!` improved compiler messages and flexible syntax for `with props`. [[@captain-yossarian], [#960](https://github.com/yewstack/yew/pull/960)]
- ##### 🛠 Fixes
- Fixed panic in `stdweb` `ResizeService` event handling. [[@nicklaswj], [#1014](https://github.com/yewstack/yew/pull/1014)]
- Removed build check for OS compatibility. [[@jstarry], [#1019](https://github.com/yewstack/yew/pull/1019)]
- Fixed interval and timer usage in `web-sys` workers by updating `gloo`. [[@jstarry], [#1018](https://github.com/yewstack/yew/pull/1018)]
- Send `Connected` message for Public agents. [[@TheNeikos], [#1007](https://github.com/yewstack/yew/pull/1007)]
- Fixed `web-sys` Public / Private agent initialization. [[@jstarry], [#1006](https://github.com/yewstack/yew/pull/1006)]
- Fixed websocket 'text' message handling for `web-sys` agents. [[@jstarry], [#1005](https://github.com/yewstack/yew/pull/1005)]
- ##### 🚨 Breaking changes
- `FetchError::FetchFailed` enum variant now wraps a `String` to hold the failure reason. [[@jstarry], [#1025](https://github.com/yewstack/yew/pull/1025)]
- Message APIs now accept `Into<Msg>`, so calling `msg.into()` will cause compile errors. [[@captain-yossarian], [#999](https://github.com/yewstack/yew/pull/999)]
## ✨ yew-router **0.11.0** *(2020-03-14)*
- ##### 🛠 Fixes
- Fixed docs.rs document generation [[254](https://github.com/yewstack/yew_router/pull/254)] (Thanks @jetli)
- Fixed clippy for web_sys target [[249](https://github.com/yewstack/yew_router/pull/249)] (Thanks @jetli)
## ✨ yew **0.13.2** *(2020-03-05)*
- ##### 🛠 Fixes
- Fix clippy warning when building with `web_sys` feature. [[@jstarry], [#1001](https://github.com/yewstack/yew/pull/1001)]
## ✨ yew **0.13.1** *(2020-03-04)*
- ##### 🛠 Fixes
- Fix for `web-sys` version `0.3.36`. [[@detegr], [#997](https://github.com/yewstack/yew/pull/997)]
## ✨ yew-router **0.10.0** *(2020-03-02)*
- Bumped version of Yew from v0.12.0 to v0.13.0
- This brings support for web_sys, which necessitates specifying either "web_sys" or "std_web" as a feature. (Thanks @tarkah)
## ✨ yew **0.13** *(2020-03-01)*
`web-sys` support has arrived! [@daxpedda] spear-headed the effort and courageously integrated `web-sys` while maintaining support for `stdweb` through no small amount of `cfg` macro usage. We chose to continue support for apps built with `stdweb` because the dev experience is still quite a bit better _(Unfortunately `cargo-web` is incompatible with `web-sys`)_. However, the Yew team recognizes that the future of `cargo-web` of `stdweb` are uncertain. For this reason, we recommend devs start making the switch over to `web-sys` and `wasm-bindgen`. We will likely invest in improving the dev experience with these tools so that switching over is eventually a no-brainer. Please reach out with ideas and feedback for this migration through Github issues and in our Gitter chatroom!
After upgrading to v0.13, devs will now have to opt in to either `stdweb` or `web-sys` by using either the `"web_sys"` or `"std_web"` on the `yew` crate in their `Cargo.toml`.
```toml
# Choose `stdweb`
yew = { version = "0.13", features = ["std_web"] }
# Choose `web-sys`
yew = { version = "0.13", features = ["web_sys"] }
```
Lastly, take note that API docs on https://docs.rs/yew will be using the `"web_sys"` feature. For `"std_web"` docs, please visit https://docs.rs/yew-stdweb.
- ##### ⚡️ Features
- Added support for building apps with `web-sys`. [[@daxpedda], [#961](https://github.com/yewstack/yew/pull/961)]
- Properties 2.0 [[@AlephAlpha], [#975](https://github.com/yewstack/yew/pull/975)]
Component properties are now assumed to be required unless otherwise annotated with a default value. Check out the proposal issue [#928](https://github.com/yewstack/yew/issues/928) for more details!
- ##### 🛠 Fixes
- Fixed `Component` children re-rendering bug. [[@jstarry], [#980](https://github.com/yewstack/yew/pull/980)]
- Fixed panic when interacting with agents after receiving an agent message. [[@jstarry], [#981](https://github.com/yewstack/yew/pull/981)]
- Fixed panic when a component with a root `VRef` node is detached. [[@jstarry], [#983](https://github.com/yewstack/yew/pull/983)]
- Fixed annoying warning when a component with a root `VTag` node is detached. [[@jstarry], [#983](https://github.com/yewstack/yew/pull/983)]
- ##### 🚨 Breaking changes
- Changed `Properties` macro behavior. Check out the proposal issue [#928](https://github.com/yewstack/yew/issues/928) for more details! [[@AlephAlpha], [#975](https://github.com/yewstack/yew/pull/975)]
- Cleaned up exported apis and doc visibility. [[@jstarry], [#977](https://github.com/yewstack/yew/pull/977)]
- `ReaderService` methods now return a `Result` instead of panicking. [[@daxpedda], [#868](https://github.com/yewstack/yew/pull/868)]
- `FetchService` methods now return a `Result` instead of panicking. [[@daxpedda], [#867](https://github.com/yewstack/yew/pull/867)]
- `StorageService` methods now return a `Result` instead of panicking. [[@daxpedda], [#827](https://github.com/yewstack/yew/pull/827)]
## ✨ yew-router **0.9.0** *(2020-02-25)*
- ##### ⚡️ Features
- Improved error handling in macro. [[233](https://github.com/yewstack/yew_router/pull/233)] @jplatte
- ##### 🛠 Fixes
- Fix RouterAnchor href [[228](https://github.com/yewstack/yew_router/pull/228)] @jetli
- Undo non-passive state for prevent_default [[240](https://github.com/yewstack/yew_router/pull/240)] @jetli
## ✨ yew **0.12** *(2020-02-16)*
- ##### ⚡️ Features
- Improved ergonomics for `html! { for .. }`. [[@jstarry], [#875](https://github.com/yewstack/yew/pull/875)]
- Added `#[props(default = "fn_path")]` for specifying a default property value. [[@AlephAlpha], [#881](https://github.com/yewstack/yew/pull/881)]
- Exposed the macros for creating format types. [[@ctm], [#883](https://github.com/yewstack/yew/pull/883)]
- Added support for binary-only and text-only formats in `WebSocketService`. [[@ctm], [#851](https://github.com/yewstack/yew/pull/851)]
- Implemented `PartialEq` for `ChildrenRenderer` to allow `children` comparison. [[@jstarry], [#916](https://github.com/yewstack/yew/pull/916)]
- Reduced restrictions on `ComponentLink` methods to improve `Future` support. [[@jplatte], [#931](https://github.com/yewstack/yew/pull/931)]
- Added `referrer`, `referrer_policy` and `integrity` to `FetchOptions`. [[@leo-lb], [#931](https://github.com/yewstack/yew/pull/931)]
- ##### 🛠 Fixes
- Fixed touch event listeners. [[@AlephAlpha], [#872](https://github.com/yewstack/yew/pull/872)]
- Fixed bad behavior when setting a `ref` on a `Component`. [[@jstarry], [#913](https://github.com/yewstack/yew/pull/913)]
- Fixed ResizeTask cancellation. [[@jstarry], [#915](https://github.com/yewstack/yew/pull/915)]
- ##### 🚨 Breaking changes
- Switched from using `failure` to `anyhow` and `thiserror` for Yew errors. [[@daxpedda], [#863](https://github.com/yewstack/yew/pull/863)]
- Removed `cancel` method from `Task` trait in favor of relying on [`Drop`](https://doc.rust-lang.org/book/ch15-03-drop.html). [[@kakoc], [#899](https://github.com/yewstack/yew/pull/899)]
- Renamed `NodeRef.try_into` to `NodeRef.cast` to avoid trait conflicts. [[@jstarry], [#917](https://github.com/yewstack/yew/pull/917)]
## ✨ yew-router **0.8.1** *(2020-01-10)*
- ##### 🛠 Fixes
- Fixed a dependency issue with `wasm-bindgen` that would cause builds to fail when building for the `wasm32-unknown-unknown` target.
## ✨ yew-router **0.8.0** *(2020-01-09)*
- ##### ⚡️ Features
- Use a default type parameter of `()` to specify state-related type parameters instead of the old macro-based solution. [[157](https://github.com/yewstack/yew_router/issues/157)]
- Remove need for `JsSerializable` bound on the state parameter used for storing extra data in the history API.[[185](https://github.com/yewstack/yew_router/issues/185)]
- RouterLink and RouterButton now support having children Html. This deprecates the `text` prop. [[192](https://github.com/yewstack/yew_router/issues/192)]
- Fragment routing is now easily implementable by using an adapter because parser rules for the routing syntax were relaxed. [[195](https://github.com/yewstack/yew_router/issues/195)] [[211](https://github.com/yewstack/yew_router/pull/211)]
- Support using this library only with the Switch derive, allowing it to run in non-web contexts. [[199](https://github.com/yewstack/yew_router/issues/199)]
- ##### 🚨 Breaking changes
- If you were using `default-features = false`, you will have to now specify `features = ["service"]` to get the same behavior as before. [[199](https://github.com/yewstack/yew_router/issues/199)]
- `RouterAnchor` and `RouterButton` now have props that take a `route: SW where SW: Switch` prop instead of a `link: String` and they now have a mandatory type parameter that specifies this `SW`. [[207](https://github.com/yewstack/yew_router/issues/207)]
- `Route`'s state field now holds a `T` instead of an `Option<T>`. [[205](https://github.com/yewstack/yew_router/issues/205)]
- Using default type parameters to specify the state typ instead of the macro that generated a module (`unit_state`) means that any imports from that module should now be replaced with the path that the type normally has in the project. [[157](https://github.com/yewstack/yew_router/issues/157)]
- #### Inconsequential
- Change state related type parameters from `T` to `STATE`. [[208](https://github.com/yewstack/yew_router/issues/208)]
## ✨ yew **0.11** *(2020-01-06)*
This release aims to lay the groundwork for Yew component libraries and clean up the API for the ever elusive 1.0 release.
### Transition Guide
This release comes with a lot of breaking changes. We understand it's a hassle to update projects but the Yew team felt it was necessary to rip a few bandaids off now as we approach a 1.0 release in the (hopefully) near future. To ease the transition, here's a guide which outlines the main refactoring you will need to do for your project. (Note: all of the changes are reflected in the many example projects if you would like a proper reference example)
#### 1. Callback syntax
This is the main painful breaking change. It applies to both element listeners as well as `Component` callback properties. A good rule of thumb is that your components will now have to retain a `ComponentLink` to create callbacks on demand or initialize callbacks in your component's `create()` method.
Before:
```rust
struct MyComponent;
enum Msg {
Click,
}
impl Component for MyComponent {
type Message = Msg;
type Properties = ();
fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
MyComponent
}
fn update(&mut self, msg: Self::Message) -> ShouldRender {
match msg {
Msg::Click => true,
}
}
fn view(&self) -> Html<Self> {
// BEFORE: Callbacks were created implicitly from this closure syntax
html! {
<button onclick=|_| Msg::Click>{ "Click me!" }</button>
}
}
}
```
After:
```rust
struct MyComponent {
link: ComponentLink<Self>,
}
enum Msg {
Click,
}
impl Component for MyComponent {
type Message = Msg;
type Properties = ();
fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self {
MyComponent { link }
}
fn update(&mut self, msg: Self::Message) -> ShouldRender {
match msg {
Msg::Click => true,
}
}
fn view(&self) -> Html {
// AFTER: Callbacks need to be explicitly created now
let onclick = self.link.callback(|_| Msg::Click);
html! {
<button onclick=onclick>{ "Click me!" }</button>
}
}
}
```
If a closure has a parameter you will now need to specify the parameter's type. A tip for finding the appropriate type is to search Yew's repo for the HTML attribute the closure is assigned to.
For example, `onkeydown` of `<button>`:
```
let onkeydown = self.link.callback(|e: KeyDownEvent| {
// ...
});
```
and
```
html! {
<button onkeydown=onkeydown type="button">
{ "button" }
</button>
}
```
#### 2. Method Renames
It should be safe to do a project-wide find/replace for the following:
- `send_self(` -> `send_message(`
- `send_back(` -> `callback(`
- `response(` -> `respond(`
- `AgentUpdate` -> `AgentLifecycleEvent`
These renames will probably require some more care:
- `fn handle(` -> `fn handle_input(` *(for Agent trait implementations)*
#### 3. Drop Generic Types for `Html<Self>` -> `Html`
:tada: We are pretty excited about this change! The generic type parameter
was confusing and restrictive and is now a thing of the past!
Before:
```rust
impl Component for MyComponent {
// ...
fn view(&self) -> Html<Self> {
html! { /* ... */ }
}
}
```
After:
```rust
impl Component for MyComponent {
// ...
fn view(&self) -> Html {
html! { /* ... */ }
}
}
```
#### 4. Properties must implement `Clone`
In yew v0.8 we removed the requirement that component properties implement `Clone`
and in this release we are adding the requirement again. This change is needed
to improve the ergonomics of nested components. The only time properties will be
cloned is when a wrapper component re-renders nested children components.
- ##### ⚡️ Features
- Added `html_nested!` macro to support nested iterable children access. [[@trivigy], [#843](https://github.com/yewstack/yew/pull/843)]
- Added `bincode` to the list of supported formats. [[@serzhiio], [#806](https://github.com/yewstack/yew/pull/806)]
- Added a `noop()` convenience method to `Callback` which creates a no-op callback. [[@mdtusz], [#793](https://github.com/yewstack/yew/pull/793)]
- The `html!` macro now accepts a `Callback` for element listeners. [[@jstarry], [#777](https://github.com/yewstack/yew/pull/777)]
```rust
struct MyComponent {
onclick: Callback<ClickEvent>,
}
enum Msg {
Click,
}
impl Component for MyComponent {
type Message = Msg;
type Properties = ();
fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self {
MyComponent {
onclick: link.callback(|_| Msg::Click),
}
}
fn update(&mut self, msg: Self::Message) -> ShouldRender {
match msg {
Msg::Click => true,
}
}
fn view(&self) -> Html {
html! {
<button onclick=&self.onclick>{ "Click me!" }</button>
}
}
}
```
- Add `send_message_batch` method to `ComponentLink`. [[@hgzimmerman], [#748](https://github.com/yewstack/yew/pull/748)]
- Allow compilation to `wasi` target without `wasm_bindgen`. [[@dunnock], [#746](https://github.com/yewstack/yew/pull/746)]
- `AgentLink` now implements `Clone` which enables `Future` usage without explicit Yew framework support. [[@izissise], [#802](https://github.com/yewstack/yew/pull/802)]
- `ComponentLink` now implements `Clone` which enables `Future` usage without explicit Yew framework support. [[@hgzimmerman], [#749](https://github.com/yewstack/yew/pull/749)]
```rust
use wasm_bindgen::JsValue;
use wasm_bindgen_futures::future_to_promise;
// future must implement `Future<Output = Component::Message> + 'static`
let link = self.link.clone();
let js_future = async move {
link.send_message(future.await);
Ok(JsValue::NULL)
};
future_to_promise(js_future);
```
- ##### 🛠 Fixes
- Fixed handling of boolean tag attributes. [[@mrh0057], [#840](https://github.com/yewstack/yew/pull/840)]
- Improved nested component ergonomics. [[@jstarry], [#780](https://github.com/yewstack/yew/pull/780)]
```rust
fn view(&self) -> Html {
html! {
<Wrapper>
// This is now valid. (before #780, this would cause a lifetime
// compile error because children nodes were moved into a closure)
<Nested on_click=&self.nested_on_click />
</Wrapper>
}
}
```
- Creating a `Callback` with `ComponentLink` is no longer restricted to mutable references, improving ergonomics. [[@jstarry], [#780](https://github.com/yewstack/yew/pull/780)]
- The `Callback` `reform` method no longer consumes self making it easier to "reverse map" a `Callback`. [[@jstarry], [#779](https://github.com/yewstack/yew/pull/779)]
```rust
pub struct ListHeader {
props: Props,
}
#[derive(Properties, Clone)]
pub struct Props {
#[props(required)]
pub on_hover: Callback<Hovered>,
#[props(required)]
pub text: String,
}
impl Component for ListHeader {
type Message = ();
type Properties = Props;
fn create(props: Self::Properties, _: ComponentLink<Self>) -> Self {
ListHeader { props }
}
fn update(&mut self, _: Self::Message) -> ShouldRender {
false
}
fn view(&self) -> Html {
let onmouseover = self.props.on_hover.reform(|_| Hovered::Header);
html! {
<div class="list-header" onmouseover=onmouseover>
{ &self.props.text }
</div>
}
}
}
```
- Reduced allocations in the `Classes` `to_string` method. [[@hgzimmerman], [#772](https://github.com/yewstack/yew/pull/772)]
- Empty string class names are now filtered out to prevent panics. [[@jstarry], [#770](https://github.com/yewstack/yew/pull/770)]
- ##### 🚨 Breaking changes
- Components with generic args now need to be closed with the full type path. (e.g. `html! { <Wrapper<String>></Wrapper<String>>}`) [[@jstarry], [#837](https://github.com/yewstack/yew/pull/837)]
- Changed `VTag` listener type from `Box<dyn Listener>` to `Rc<dyn Listener>`. [[@jstarry], [#786](https://github.com/yewstack/yew/pull/786)]
- `Properties` need to implement `Clone` again in order to improve nested component ergonomics. [[@jstarry], [#786](https://github.com/yewstack/yew/pull/786)]
- Removed `send_future` method from `ComponentLink` since it is no longer necessary for using Futures with Yew. [[@hgzimmerman], [#799](https://github.com/yewstack/yew/pull/799)]
- Removed generic type parameter from `Html` and all virtual node types: `VNode`, `VComp`, `VTag`, `VList`, `VText`, etc. [[@jstarry], [#783](https://github.com/yewstack/yew/pull/783)]
- Removed support for macro magic closure syntax for element listeners. (See transition guide for how to pass a `Callback` explicitly instead). [[@jstarry], [#782](https://github.com/yewstack/yew/pull/782)]
- Renamed `Agent` methods and event type for clarity. `handle` -> `handle_input`, `AgentUpdate` -> `AgentLifecycleEvent`, `response` -> `respond`. [[@philip-peterson], [#751](https://github.com/yewstack/yew/pull/751)]
- The `ComponentLink` `send_back` method has been renamed to `callback` for clarity. [[@jstarry], [#780](https://github.com/yewstack/yew/pull/780)]
- The `ComponentLink` `send_self` and `send_self_batch` methods have been renamed to `send_message` and `send_message_batch` for clarity. [[@jstarry], [#780](https://github.com/yewstack/yew/pull/780)]
- The `Agent` `send_back` method has been renamed to `callback` for clarity. [[@jstarry], [#780](https://github.com/yewstack/yew/pull/780)]
- The `VTag` `children` value type has changed from `Vec<VNode>` to `VList`. [[@jstarry], [#754](https://github.com/yewstack/yew/pull/754)]
## ✨ yew **0.10** *(2019-11-11)*
- ##### ⚡️ Features
- `Future` support :tada: A `Component` can update following the completion of a `Future`. Check out [this example](https://github.com/yewstack/yew/tree/v0.14.0/examples/futures) to see how it works. This approach was borrowed from a fork of Yew called [`plaster`](https://github.com/carlosdp/plaster) created by [@carlosdp]. [[@hgzimmerman], [#717](https://github.com/yewstack/yew/pull/717)]
- Added the `agent` and `services` features so that this functionality can be disabled (useful if you are switching to using `Future`s). [[@hgzimmerman], [#684](https://github.com/yewstack/yew/pull/684)]
- Add `ref` keyword for allowing a `Component` to have a direct reference to its rendered elements. For example, you can now easily focus an `<input>` element after mounting. [[@jstarry], [#715](https://github.com/yewstack/yew/pull/715)]
```rust
use stdweb::web::html_element::InputElement;
use stdweb::web::IHtmlElement;
use yew::prelude::*;
pub struct Input {
node_ref: NodeRef,
}
impl Component for Input {
type Message = ();
type Properties = ();
fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
Input {
node_ref: NodeRef::default(),
}
}
fn mounted(&mut self) -> ShouldRender {
if let Some(input) = self.node_ref.try_into::<InputElement>() {
input.focus();
}
false
}
fn update(&mut self, _: Self::Message) -> ShouldRender {
false
}
fn view(&self) -> Html<Self> {
html! {
<input ref=self.node_ref.clone() type="text" />
}
}
}
```
- Make `Agent` related types `public` to allow other crates to create custom agents. [[@dunnock], [#721](https://github.com/yewstack/yew/pull/721)]
- `Component::change` will now return `false` for components that have `Component::Properties == ()`. [[@kellytk], [#690](https://github.com/yewstack/yew/pull/690)]]
- Updated `wasm-bindgen` dependency to `0.2.54`. Please update your `wasm-bindgen-cli` tool by running `cargo install --force --version 0.2.54 -- wasm-bindgen-cli`. [[@jstarry], [#730](https://github.com/yewstack/yew/pull/730)], [[@ctaggart], [#681](https://github.com/yewstack/yew/pull/681)]
- ##### 🛠 Fixes
- Fixed the mount order of components. The root component will be mounted after all descendants have been mounted. [[@jstarry], [#725](https://github.com/yewstack/yew/pull/725)]
- All public items now implement `Debug`. [[@hgzimmerman], [#673](https://github.com/yewstack/yew/pull/673)]
- ##### 🚨 Breaking changes
- Minimum rustc version has been bumped to `1.39.0` for `Future` support. [[@jstarry], [#730](https://github.com/yewstack/yew/pull/730)]
- `Component` now has a required `view` method and automatically implements the `Renderable` trait. The `view` method in the `Renderable` trait has been renamed to `render`. [[@jstarry], [#563](https://github.com/yewstack/yew/pull/563)]
Before:
```rust
impl Component for MyComponent {
type Message = Msg;
type Properties = ();
fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
MyComponent {}
}
fn update(&mut self, msg: Self::Message) -> ShouldRender {
true
}
}
impl Renderable<MyComponent> for MyComponent {
fn view(&self) -> Html<Self> {
html! { "hello" }
}
}
```
After:
```rust
impl Component for MyComponent {
type Message = Msg;
type Properties = ();
fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
MyComponent {}
}
fn update(&mut self, msg: Self::Message) -> ShouldRender {
true
}
fn view(&self) -> Html<Self> {
html! { "hello" }
}
}
```
- Removed the `Transferable` trait since it did no more than extend the serde `Serialize` and `Deserialize` traits. [[@hgzimmerman], [#319](https://github.com/yewstack/yew/pull/319)]
Before:
```rust
impl Transferable for Input {}
#[derive(Serialize, Deserialize)]
pub enum Input {
Connect,
}
```
After:
```rust
#[derive(Serialize, Deserialize)]
pub enum Input {
Connect,
}
```
- `WebSocketService::connect` will now return a `Result` in order to stop panicking on malformed urls. [[@lizhaoxian], [#727](https://github.com/yewstack/yew/pull/727)]
- `VTag` now is boxed within `VNode` to shrink the size of its enum representation. [[@hgzimmerman], [#675](https://github.com/yewstack/yew/pull/675)]
## ✨ yew-router **0.7.0** *(2019-11-11)*
- ##### ⚡️ Features
- Redirects that happen in the `Router` component actually change the url in the browser [[171](https://github.com/yewstack/yew_router/issues/171)]
- Allow parsing (almost) any character after a `#` is encountered in matcher strings.
This enables this library to be used as a fragment router. [[150](https://github.com/yewstack/yew_router/issues/150)]
- ##### 🛠 Fixes
- Allow `!` to appear after `{...}` in matcher strings. [[148](https://github.com/yewstack/yew_router/issues/148)]
- Matcher strings can now start with `&`. [[168](https://github.com/yewstack/yew_router/issues/168)]
- ##### 🚨 Breaking changes
- Upgrade to Yew 0.10.0
- Switch components now need to implement `Clone` in order to be used with the `Router` [[171](https://github.com/yewstack/yew_router/issues/171)]
## ✨ yew-router **0.6.1** *(2019-11-01)*
- ##### ⚡️ Features
- Bring back `{}`, `{*}`, and `{<number>}` capture syntax for tuple structs/enum variants.
If your variant or struct doesn't have named fields, you don't need to supply names in the matcher string [[116](https://github.com/yewstack/yew_router/issues/116)]
- Allow ! special character in more places.
- Greatly improve the quality of matcher string parsing errors. [[171](https://github.com/yewstack/yew_router/issues/149)]
- Add `impl<SW: Switch, T> From<SW> for Route<T>`. Now Routes can be created from Switches easily.
- Allow escaping {, }, and ! special characters by using `{{`, `}}`, and `!!` respectively.
- Provide a correct error message when attempting to derive `Switch` for a Unit struct/variant with a capture group.
## ✨ yew-router **0.6.0** *(2019-10-24)*
- ##### ⚡️ Features
- `Switch` trait and Proc Macro enables extracting data from route strings.
- `Router` component added.
- `RouterLink` and `RouterButton` helper components added.
- ##### 🚨 Breaking changes
- Nearly everything. Most items were renamed.
- Upgrade to Yew 0.9.0
## ✨ yew **0.9.2** *(2019-10-12)*
- ##### 🛠 Fixes
- Fix `yew-macro` dependency version
## ✨ yew **0.9.1** *(2019-10-12)*
Happy Canadian Thanksgiving! 🦃
- ##### ⚡️ Features
- Implemented `Default` trait for `VNode` so that `unwrap_or_default` can be called on `Option<Html<Self>>`. [[@hgzimmerman], [#672](https://github.com/yewstack/yew/pull/672)]
- Implemented `PartialEq` trait for `Classes` so that is more ergonomic to use `Classes` type in component props. [[@hgzimmerman], [#680](https://github.com/yewstack/yew/pull/680)]
- Updated `wasm-bindgen` dependency to `0.2.50`. Please update your `wasm-bindgen-cli` tool by running `cargo install --force --version 0.2.50 -- wasm-bindgen-cli`. [[@jstarry], [#695](https://github.com/yewstack/yew/pull/695)]
- ##### 🛠 Fixes
- Fixed issue where text nodes were sometimes rendered out of order. [[@jstarry], [#697](https://github.com/yewstack/yew/pull/697)]
- Fixed regression introduced in 0.9.0 that prevented tag attributes from updating properly. [[@jstarry], [#698](https://github.com/yewstack/yew/pull/698)]
- Fixed emscripten builds by pinning the version for the `ryu` downstream dependency. [[@jstarry], [#703](https://github.com/yewstack/yew/pull/703)]
- Updated `stdweb` to `0.4.20` which fixed emscripten builds and unblocked updating `wasm-bindgen` to `0.2.50`. [[@ctaggart], [@jstarry], [#683](https://github.com/yewstack/yew/pull/683), [#694](https://github.com/yewstack/yew/pull/694)]
- Cleaned up build warnings for missing `dyn` keywords. [[@benreyn], [#687](https://github.com/yewstack/yew/pull/687)]
## ✨ yew **0.9** *(2019-09-27)*
- ##### ⚡️ Features
- New `KeyboardService` for setting up key listeners on browsers which support the feature. [[@hgzimmerman], [#647](https://github.com/yewstack/yew/pull/647)]
- `ComponentLink` can now create a `Callback` with more than one `Message`. The `Message`'s will be batched together so that the `Component` will not be re-rendered more than necessary. [[@stkevintan], [#660](https://github.com/yewstack/yew/pull/660)]
- `Message`'s to `Public` `Agent`'s will now be queued if the `Agent` hasn't finished setting up yet. [[@serzhiio], [#596](https://github.com/yewstack/yew/pull/596)]
- `Agent`'s can now be connected to without a `Callback`. Instead of creating a bridge to the agent, create a dispatcher like so: `MyAgent::dispatcher()`. [[@hgzimmerman], [#639](https://github.com/yewstack/yew/pull/639)]
- `Component`'s can now accept children in the `html!` macro. [[@jstarry], [#589](https://github.com/yewstack/yew/pull/589)]
```rust
// app.rs
html! {
<MyList name="Grocery List">
<MyListItem text="Apples" />
</MyList>
}
```
```rust
// my_list.rs
use yew::prelude::*;
pub struct MyList(Props);
#[derive(Properties)]
pub struct Props {
#[props(required)]
pub name: String,
pub children: Children<MyListItem>,
}
impl Renderable<MyList> for MyList {
fn view(&self) -> Html<Self> {
html! {{
self.props.children.iter().collect::<Html<Self>>()
}}
}
}
```
- `Iterator`s can now be rendered in the `html!` macro without using the `for` keyword. [[@hgzimmerman], [#622](https://github.com/yewstack/yew/pull/622)]
Before:
```rust
html! {{
for self.props.items.iter().map(renderItem)
}}
```
After:
```rust
html! {{
self.props.items.iter().map(renderItem).collect::<Html<Self>>()
}}
```
- Closures are now able to be transformed into optional `Callback` properties. [[@Wodann], [#612](https://github.com/yewstack/yew/pull/612)]
- Improved CSS class ergonomics with new `Classes` type. [[@DenisKolodin], [#585](https://github.com/yewstack/yew/pull/585)], [[@hgzimmerman], [#626](https://github.com/yewstack/yew/pull/626)]
- Touch events are now supported `<div ontouchstart=|_| Msg::TouchStart>` [[@boydjohnson], [#584](https://github.com/yewstack/yew/pull/584)], [[@jstarry], [#656](https://github.com/yewstack/yew/pull/656)]
- The `Component` trait now has an `mounted` method which can be implemented to react to when your components have been mounted to the DOM. [[@hgzimmerman], [#583](https://github.com/yewstack/yew/pull/583)]
- Additional Fetch options `mode`, `cache`, and `redirect` are now supported [[@davidkna], [#579](https://github.com/yewstack/yew/pull/579)]
- The derive props macro now supports Properties with lifetimes [[@jstarry], [#580](https://github.com/yewstack/yew/pull/580)]
- New `ResizeService` for registering for `window` size updates [[@hgzimmerman], [#577](https://github.com/yewstack/yew/pull/577)]
- ##### 🛠 Fixes
- Fixed JS typo in RenderService. This was causing animation frames to not be dropped correctly. [[@jstarry], [#658](https://github.com/yewstack/yew/pull/658)]
- Fixed `VNode` orphaning bug when destroying `VTag` elements. This caused some `Component`s to not be properly destroyed when they should have been. [[@hgzimmerman], [#651](https://github.com/yewstack/yew/pull/651)]
- Fix mishandling of Properties `where` clause in derive_props macro [[@astraw], [#640](https://github.com/yewstack/yew/pull/640)]
- ##### 🚨 Breaking changes
None
## ✨ yew **0.8** *(2019-08-10)*
***Props! Props! Props!***
This release introduces a more developer friendly way to handle your `Component` props. Use the new `#[derive(Properties)]` macro to beef up your props! Property values can now be annotated as `#[props(required)]` which will enforce that props are present at compile time. This means that your props struct no longer needs to implement `Default`, so time to clean up all of those prop values you wrapped in `Option` to have a default value.
- ##### ⚡️ Features
- `html!` - Self-closing html tags can now be used: `<div class="marker" />` [[@totorigolo], [#523](https://github.com/yewstack/yew/pull/523)]
- `html!` - SVG name-spaced tags are now supported! [[@jstarry], [#550](https://github.com/yewstack/yew/pull/550)]
- Properties can now be required at compile time [[@jstarry], [#553](https://github.com/yewstack/yew/pull/525)]
- App components can now be mounted with properties [[@jstarry], [#567](https://github.com/yewstack/yew/pull/567)]
- Apps can now be mounted as the `<body>` tag [[@jstarry], [@kellytk], [#540](https://github.com/yewstack/yew/pull/540)]
- Content editable elements can now trigger `oninput` events [[@tiziano88], [#549](https://github.com/yewstack/yew/pull/549)]
- ##### 🛠 Fixes
- `html!` - Class name order is now preserved which unlocks the use of Semantic UI [[@charvp], [#424](https://github.com/yewstack/yew/pull/424)]
- `html!` - Dashed tag names and properties are supported [[@jstarry], [#512](https://github.com/yewstack/yew/pull/512), [#550](https://github.com/yewstack/yew/pull/550)]
- `html!` - All rust keywords can be used as tag attributes [[@jstarry], [#550](https://github.com/yewstack/yew/pull/550)]
- `html!` - Support `Callback` closure with explicit return type [[@totorigolo], [#564](https://github.com/yewstack/yew/pull/564)]
- `html!` - Fixed edge case where `>` token would break parser [[@totorigolo], [#565](https://github.com/yewstack/yew/pull/565)]
- Performance improvement to the diff engine [[@totorigolo], [#539](https://github.com/yewstack/yew/pull/539)]
- `Properties` no longer need to implement the `PartialEq`, `Clone`, or `Default` traits [[@jstarry], [#553](https://github.com/yewstack/yew/pull/553)]
- `Component` will not panic if the `change` method is unimplemented [[@jstarry], [#554](https://github.com/yewstack/yew/pull/554)]
- ##### 🚨 Breaking changes
- The `Component::Properties` associated type must implement the new `Properties` trait [[@jstarry], [#553](https://github.com/yewstack/yew/pull/553)]
The new `Properties` trait is what powers the ability to check required props are present at compile time. Use the derive props macro to implement automatically.
```rust
use yew::Properties;
#[derive(Properties)]
pub struct Props {
#[props(required)]
pub value: MyStruct,
}
```
- `Callback` props no longer transform into `Option` types [[@jstarry], [#553](https://github.com/yewstack/yew/pull/553)]
```rust
html! { <Button on_click=Msg::Click /> }
```
***before:***
```rust
#[derive(PartialEq, Clone, Default)]
pub struct Props {
on_click: Option<Callback<()>>,
}
```
***after:*** *note the `#[props(required)]` attribute*
```rust
#[derive(PartialEq, Properties)]
pub struct Props {
#[props(required)]
on_click: Callback<()>,
}
```
## ✨ yew **0.7** *(2019-07-19)*
***Commas? We don't need no stinkin' commas!***
This release brings a new and improved `html!` macro for writing JSX-like syntax. Commas and colons are no longer necessary now that the macro is written as a procedural macro.
- ##### ⚡️ Features
- `html!{}` is now valid syntax and can be used to render nothing [[@jstarry], [#500](https://github.com/yewstack/yew/pull/500)]
- Apps can now be built without `cargo-web` using `wasm-bindgen` [[@jstarry], [#497](https://github.com/yewstack/yew/pull/497)]
- `Callback` now implements `Debug` [[@DenisKolodin], [#485](https://github.com/yewstack/yew/pull/485)]
- New utility method for getting the `host` of the current page [[@DenisKolodin], [#509](https://github.com/yewstack/yew/pull/509)]
- ##### 🛠 Fixes
- `html!` - Commas are no longer necessary for splitting up attributes [[@jstarry], [#500](https://github.com/yewstack/yew/pull/500)]
- `html!` - Colons are no longer necessary for denoting a `Component` tag [[@jstarry], [#500](https://github.com/yewstack/yew/pull/500)]
- Textarea value can be now be set: `<textarea value="content">` [[@DenisKolodin], [#476](https://github.com/yewstack/yew/pull/476)]
- changed `StorageService::restore` to take an immutable receiver [[@dermetfan], [#480](https://github.com/yewstack/yew/pull/480)]
- Fixed a component rendering bug [[@jstarry], [#502](https://github.com/yewstack/yew/pull/502)]
## ✨ yew **0.6** *(2019-02-20)*
- ##### ⚡️ Features
- Added `start_app` convenience method for initializing the app and mounting it to the body [[@DenisKolodin], [#462](https://github.com/yewstack/yew/pull/462)]
- Added handling of files of `input` element. There is now a `ChangeData::Files` variant for the `onchange` handler [[@DenisKolodin], [#464](https://github.com/yewstack/yew/pull/464)]
- Added `ReaderService` to read data from `File` instances. [[@DenisKolodin], [#464](https://github.com/yewstack/yew/pull/464), [#468](https://github.com/yewstack/yew/pull/468)]
- ##### 🛠 Fixes
- It was impossible to set `value` attribute for any tag instead of `option`, because it used
inner value of `VTag` to keep the value for `input` element. Now `value` attribute works
for `options`, `progress` tags, etc.
- #### 🔮 Examples
- New example `file_upload` that prints sizes of uploaded files [[@DenisKolodin], [#464](https://github.com/yewstack/yew/pull/464)]
## ✨ yew **0.5** *(2019-02-01)*
**🎶 Secret Agent Man 🎶**
This release introduces the concept of an `Agent`. Agents are separate activities which you could run in the same thread or in a separate thread. There are three types of agents `Context`, `Job`, `Public` described below. To connect to an agent use the `Worker::bridge` method and pass a link of component's environment to it.
- ##### ⚡️ Features
- Introduced the concept of an `Agent` which can run processes in other contexts:
- `Context` agent spawns once per thread
- `Job` agent spawns for every bridge
- `Public` agent spawns an agent in a separate thread (it uses [Web Workers API] under the hood).
- Allow setting the whole properties struct of a component with `<Component: with props />`
- `ComponentLink` now has a `send_self` method which allows components to update themselves [[@DenisKolodin], [#365](https://github.com/yewstack/yew/pull/365)]
- All services are re-exported within the `yew::services` module.
- `html!` macro supports multiple classes in a single string:
`<a class="button is-primary",>`.
- Added `FetchOptions` to allow setting `Credentials` of `fetch` request.
- `FetchService` aborts requests using `AbortController`.
- Added `SubmitEvent` with `onsubmit` rule.
- ##### 🛠 Fixes
- Bug with emscripten target `RuntimeError: index out of bounds` fixed with a new scheduler [[@DenisKolodin], [#272](https://github.com/yewstack/yew/pull/272)]
- ##### 🚨 Breaking changes
- `send_back` method requires a mutable reference to `self`. This was added to prevent creating callbacks in `view` implementations. [[@DenisKolodin], [#367](https://github.com/yewstack/yew/pull/367)]
- `Context` requirement removed. It's no longer necessary to use `Component<CTX>` type parameter. Instead, a link to the environment is provided with the `Component::create` call. [[@DenisKolodin], [#272](https://github.com/yewstack/yew/pull/272)]
## ✨ yew **0.4** *(2018-06-01)*
## ✨ yew **0.3** *(2018-04-23)*
## ✨ yew **0.2** *(2018-01-08)*
## ✨ yew **0.1** *(2017-12-31)*
[Web Workers API]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API
[@alexschrod]: https://github.com/alexschrod
[@AlephAlpha]: https://github.com/AlephAlpha
[@astraw]: https://github.com/astraw
[@bakape]: https://github.com/bakape
[@bryanjswift]: https://github.com/bryanjswift
[@boydjohnson]: https://github.com/boydjohnson
[@captain-yossarian]: https://github.com/captain-yossarian
[@carlosdp]: https://github.com/carlosdp
[@charvp]: https://github.com/charvp
[@ctaggart]: https://github.com/ctaggart
[@ctm]: https://github.com/ctm
[@ctron]: https://github.com/ctron
[@domdir]: https://github.com/domdir
[@D4nte]: https://github.com/D4nte
[@dancespiele]: https://github.com/dancespiele
[@daxpedda]: https://github.com/daxpedda
[@davidkna]: https://github.com/davidkna
[@DenisKolodin]: https://github.com/DenisKolodin
[@dermetfan]: https://github.com/dermetfan
[@detegr]: https://github.com/Detegr
[@dunnock]: https://github.com/dunnock
[@faulesocke]: https://github.com/faulesocke
[@hgzimmerman]: https://github.com/hgzimmerman
[@izissise]: https://github.com/izissise
[@joaquindk]: https://github.com/joaquindk
[@jplatte]: https://github.com/jplatte
[@jstarry]: https://github.com/jstarry
[@kakoc]: https://github.com/kakoc
[@kaoet]: https://github.com/kaoet
[@kellytk]: https://github.com/kellytk
[@kuy]: https://github.com/kuy
[@leo-lb]: https://github.com/leo-lb
[@liquidblock]: https://github.com/liquidblock
[@lizhaoxian]: https://github.com/lizhaoxian
[@lukerandall]: https://github.com/lukerandall
[@mankinskin]: https://github.com/mankinskin
[@mdtusz]: https://github.com/mdtusz
[@mkawalec]: https://github.com/mkawalec
[@mrh0057]: https://github.com/mrh0057
[@nicklaswj]: https://github.com/nicklaswj
[@philip-peterson]: https://github.com/philip-peterson
[@serzhiio]: https://github.com/serzhiio
[@siku2]: https://github.com/siku2
[@Stigjb]: https://github.com/Stigjb
[@stkevintan]: https://github.com/stkevintan
[@TheNeikos]: https://github.com/TheNeikos
[@teymour-aldridge]: https://github.com/teymour-aldridge
[@tiziano88]: https://github.com/tiziano88
[@trivigy]: https://github.com/trivigy
[@totorigolo]: https://github.com/totorigolo
[@Wodann]: https://github.com/Wodann
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
* Accepting and using the preferred gender pronouns of all people who have specified them involved in the project.
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement by emailing
`maintainers@yew.rs`.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: CONTRIBUTING.md
================================================
# Contribution Guide
## Setting up your local development environment
### Add the Wasm target
```bash
rustup target add wasm32-unknown-unknown
```
### Install [cargo-make](https://github.com/sagiegurari/cargo-make)
```bash
cargo install cargo-make
```
You can use the following command to list all available tasks for Yew:
```bash
cargo make --list-all-steps
```
The most important tasks are outlined below.
## Tests
To run all tests, use the following command:
```bash
cargo make test-flow
```
### Browser tests
`cargo make test` will automatically download Geckodriver to a temporary location if it isn't in the PATH.
Because Geckodriver looks for `firefox` in the path, if you use
FireFox Developer Edition, you may get an error, because Developer Editions
binary is called `firefox-developer-edition`.
To fix this, either install the standard version of Firefox or symlink
`firefox` to `firefox-developer-edition`.
### Fetch service tests
The tests for the fetch service require a local [httpbin](https://httpbin.org/) server.
If you have [Docker](https://www.docker.com/) installed,
`cargo make test` will automatically run httpbin in a container for you.
Alternatively, you can set the `HTTPBIN_URL` environment variable to the URL you wish to run tests against.
### Macro tests
When adding or updating tests, please make sure to update the appropriate `stderr` file, which you can find [here](https://github.com/yewstack/yew/tree/master/packages/yew-macro/tests/macro) for the `html!` macro.
These files ensure that macro compilation errors are correct and easy to understand.
These errors can change with each release of the compiler, so they should be generated with the Rust version 1.56
(because some tests make use of const generics which were stabilized in that version).
To update or generate a new `stderr` file you can run `cargo make test-overwrite` in the `yew-macro` directory.
## Spell Checking
We use [typos](https://github.com/crate-ci/typos) to catch spelling mistakes. CI runs it automatically on every PR.
To run it locally:
```bash
cargo install typos-cli --locked
typos # check for typos
typos -w # auto-fix typos
```
False positives can be configured in `_typos.toml` at the repo root.
## Linting
The following command checks the code using Rustfmt and Clippy:
```bash
cargo make lint
```
To automatically fix formatting issues, run `cargo +nightly fmt` first.
## Benchmarks
js-framework-benchmark is used as a benchmark for the framework as a whole.
Simply clone [bakape/js-framework-benchmark](https://github.com/bakape/js-framework-benchmark)
and follow the repository's README.
## Writing APIs
When building new APIs, think about what it would be like to use them. Would this API cause confusing and hard to pin error messages? Would this API integrate well with other APIs? Is it intuitive to use this API?
Below, you can find some useful guidance and best practices on how to write APIs. These are only _guidelines_ and while they are helpful and should be followed where possible, in some cases, it may not be possible to do so.
- [The Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)
- [Elegant Library APIs in Rust](https://deterministic.space/elegant-apis-in-rust.html)
## Website
The source code of our website ([https://yew.rs](https://yew.rs)) is in the [website directory](website).
Most of the times, edits can be done in markdown.
[website/README.md](website/README.md) has more detailed instructions.
================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
"packages/*",
"tools/*",
"examples/*",
]
exclude = ["examples/.cargo"]
default-members = [
"packages/*",
]
resolver = "3"
[profile.release]
lto = true
codegen-units = 1
panic = "abort"
opt-level = "z"
[profile.bench]
lto = true
codegen-units = 1
opt-level = 3
[workspace.lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = [
"cfg(documenting)",
"cfg(verbose_tests)",
"cfg(yew_lints)",
"cfg(nightly_yew)",
"cfg(wasm_bindgen_unstable_test_coverage)"
]}
[workspace.dependencies]
tokio = { version = "1.50.0" }
implicit-clone = { version = "0.6.0" }
proc-macro2 = "1"
quote = "1"
syn = { version = "2" }
trybuild = "1"
clap = { version = "4", features = ["derive"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
wasm-bindgen-test = "0.3"
js-sys = "0.3"
web-sys = "0.3"
gloo = "0.11"
serde = "1"
serde_json = "1"
futures = { version = "0.3", default-features = false }
log = "0.4"
wasm-logger = "0.2"
rand = "0.9"
getrandom = { version = "0.3", features = ["wasm_js"] }
instant = { version = "0.1", features = ["wasm-bindgen"] }
rustversion = "1"
strum = "0.28"
strum_macros = "0.28"
anyhow = "1"
chrono = "0.4"
thiserror = "2.0"
bincode = { version = "2.0.0-rc.3", features = ["serde"] }
reqwest = "0.13"
================================================
FILE: LICENSE-APACHE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2017 Denis Kolodin
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: LICENSE-MIT
================================================
Copyright (c) 2017 Denis Kolodin
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
================================================
FILE: Makefile.toml
================================================
######################
#
# public tasks:
# * checks-flow
# * lint
# * lint-release
# * format
# * test-flow
# * test
# * doc-test
# * website-test
#
# packages/yew also contains `clippy-feature-soundness` (requires cargo-hack)
# Run `cargo make --list-all-steps` for more details.
#
######################
[config]
min_version = "0.32.4"
skip_core_tasks = true
default_to_workspace = false
[env]
CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CLIPPY_ARGS = "-- --deny=warnings"
CARGO_MAKE_WORKSPACE_SKIP_MEMBERS = [
"examples/*",
"tools/*",
]
[config.modify_core_tasks]
private = true
namespace = "core"
# checks
[tasks.lint]
category = "Checks"
description = "Runs clippy"
command = "cargo"
args = ["clippy", "--", "--deny=warnings"]
# Needed, because we have some code differences between debug and release builds
[tasks.lint-release]
category = "Checks"
command = "cargo"
args = ["clippy", "--all-targets", "--release", "--", "--deny=warnings"]
[tasks.format]
category = "Checks"
toolchain = "nightly"
env = { CARGO_MAKE_RUST_CHANNEL = "nightly" }
[tasks.checks-flow]
category = "Checks"
description = "Runs clippy in debug and release mode and format all the code"
run_task = { name = ["lint", "lint-release", "format"], fork = true }
# Tests
[tasks.test]
command = "cargo"
args = ["test", "--all-targets"]
workspace = true
[tasks.doc-test]
command = "cargo"
args = ["test", "--doc", "--all-features"]
workspace = true
[tasks.website-test]
command = "cargo"
args = ["test", "-p", "website-test"]
[tasks.test-flow]
category = "Testing"
description = "Run all tests"
run_task = { name = ["test", "doc-test", "website-test"], fork = true, parallel = true }
# misc
[tasks.generate-change-log]
category = "Maintainer processes"
toolchain = "stable"
command = "cargo"
args = ["run", "-p", "changelog", "--release", "${@}"]
[tasks.default]
#run_task = { name = ["checks-flow", "test-flow"], fork = true }
dependencies = ["checks-flow", "test-flow"]
================================================
FILE: README.md
================================================
<div align="center">
<a href="https://yew.rs/" target="_blank"><img src="https://yew.rs/img/logo.png" width="150" /></a>
<h1>Yew</h1>
<p>
<strong>Rust / Wasm client web app framework</strong>
</p>
<p>
<a href="https://crates.io/crates/yew"><img alt="Crate Info" src="https://img.shields.io/crates/v/yew.svg"/></a>
<a href="https://docs.rs/yew/"><img alt="API Docs" src="https://img.shields.io/badge/docs.rs-yew-green"/></a>
<a href="https://discord.gg/VQck8X4"><img alt="Discord Chat" src="https://img.shields.io/discord/701068342760570933"/></a>
</p>
<h4>
<a href="https://yew.rs/">Documentation (stable)</a>
<span> | </span>
<a href="https://yew.rs/docs/next/">Documentation (latest)</a>
<span> | </span>
<a href="https://github.com/yewstack/yew/tree/master/examples">Examples</a>
<span> | </span>
<a href="https://github.com/yewstack/yew/blob/master/CHANGELOG.md">Changelog</a>
<span> | </span>
<a href="https://yew.rs/docs/more/roadmap">Roadmap</a>
<span> | </span>
<a href="https://yew.rs/zh-Hans">简体中文文档</a>
<span> | </span>
<a href="https://yew.rs/zh-Hant">繁體中文文檔</a>
<span> | </span>
<a href="https://yew.rs/ja">ドキュメント</a>
</h4>
</div>
## About
**Yew** is a modern Rust framework for creating multi-threaded, front-end web apps with WebAssembly.
* Features a macro for declaring interactive HTML with Rust expressions. Developers who have experience using JSX in React should feel quite at home when using Yew.
* Achieves high performance by minimizing DOM API calls for each page render and by making it easy to offload processing to background web workers.
* Supports JavaScript interoperability, allowing developers to leverage NPM packages and integrate with existing JavaScript applications.
Yew is named after a type of evergreen tree, and is pronounced /juː/. [Entry with audio on Cambridge Dictionary](https://dictionary.cambridge.org/dictionary/english/yew).
*Note: Yew is not 1.0 yet. Be prepared to do major refactoring due to breaking API changes.*
## Contributing
Yew is a community-driven effort and we welcome all kinds of contributions, big or small, from developers of all backgrounds. We want the Yew community to be a fun and friendly place, so please review our [Code of Conduct](https://github.com/yewstack/yew/blob/master/CODE_OF_CONDUCT.md) to learn what behavior will not be tolerated.
#### 🤠 New to Yew?
Start learning about the framework by helping us improve our [documentation](https://github.com/yewstack/yew/tree/master/website/docs). Pull requests which improve test coverage are also very welcome.
#### 😎 Looking for inspiration?
Check out the community curated list of awesome things related to Yew / WebAssembly at [jetli/awesome-yew](https://github.com/jetli/awesome-yew).
#### 🤔 Confused about something?
Feel free to drop into our [Discord chatroom](https://discord.gg/VQck8X4) or open a [new "Question" issue](https://github.com/yewstack/yew/issues/new/choose) to get help from contributors. Often questions lead to improvements to the ergonomics of the framework, better documentation and even new features!
#### 🙂 Ready to dive into the code?
After reviewing the [Contribution Guide](https://github.com/yewstack/yew/blob/master/CONTRIBUTING.md), check out the ["Good First Issues"](https://github.com/yewstack/yew/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) (they are eager for attention!). Once you find one that interests you, feel free to assign yourself to an issue and don't hesitate to reach out for guidance, the issues vary in complexity.
#### 😱 Found a bug?
Please [report all bugs!](https://github.com/yewstack/yew/issues/new/choose) We are happy to help support developers fix the bugs they find if they are interested and have the time.
## Contributors
### Code Contributors
This project exists thanks to all the people who contribute.
<a href="https://github.com/yewstack/yew/graphs/contributors"><img src="https://opencollective.com/yew/contributors.svg?width=890&button=false" /></a>
### Financial Contributors
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/yew/contribute)]
#### Individuals
<a href="https://opencollective.com/yew"><img src="https://opencollective.com/yew/individuals.svg?width=890"></a>
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/yew/contribute)]
<a href="https://opencollective.com/yew/organization/0/website"><img src="https://opencollective.com/yew/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/1/website"><img src="https://opencollective.com/yew/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/2/website"><img src="https://opencollective.com/yew/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/3/website"><img src="https://opencollective.com/yew/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/4/website"><img src="https://opencollective.com/yew/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/5/website"><img src="https://opencollective.com/yew/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/6/website"><img src="https://opencollective.com/yew/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/7/website"><img src="https://opencollective.com/yew/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/8/website"><img src="https://opencollective.com/yew/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/yew/organization/9/website"><img src="https://opencollective.com/yew/organization/9/avatar.svg"></a>
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Reporting a Vulnerability
Please do not create a GitHub issue for security vulnerabilities, Instead do the following:
1. Click on the **Security** tab and then click on the **"Report a Vulnerability"** button.

2. After that give a **title** and a **description**.

When reporting the vulnerability, please provide the following information, if possible:
- **MCVE (Minimum Complete Verifiable Example)**: Please include a concise code snippet that demonstrates the error in a simplified manner.
- **Versions of Yew**: Specify the versions of Yew in which the vulnerability is present. This helps us narrow down the scope of the issue and assess its impact accurately.
- **Impact and Severity**: Describe the effects of the vulnerability and its seriousness. Provide details about any potential risks, security breaches, or the impact it may have on the system.
> For contacting the maintainers, you can reach out to them via email at maintainers@yew.rs
================================================
FILE: _typos.toml
================================================
[files]
extend-exclude = ["examples/router/data/syllables.txt", "examples/function_router/data/syllables.txt"]
[default.extend-words]
ba = "ba"
================================================
FILE: api-docs/.gitignore
================================================
dist
================================================
FILE: api-docs/before-content.html
================================================
<div id="unreleased-version-header">
<div>This is unreleased documentation for Yew Next version.</div>
<div>For up-to-date documentation, see <a href="https://docs.rs/yew">the latest version on docs.rs</a>.</div>
</div>
================================================
FILE: api-docs/styles.css
================================================
#unreleased-version-header {
background-color: rgb(200, 237, 248);
z-index: 400;
position: absolute;
left: 0;
top: 0;
right: 0;
height: 70px;
padding-top: 10px;
padding-bottom: 10px;
text-align: center;
font-family: sans-serif;
box-shadow: 0 0 5px 0 rgb(100, 100, 100);
}
@media (prefers-color-scheme: dark) {
#unreleased-version-header {
background-color: rgb(32, 43, 57);
box-shadow: 0 0 5px 0 black;
}
}
body {
padding-top: 70px !important;
}
================================================
FILE: ci/collect_sizes.py
================================================
from typing import Dict, List, Optional
from pathlib import Path
import glob
import os
import json
def find_example_sizes(parent_dir: Path) -> Dict[str, int]:
example_sizes: Dict[str, int] = {}
for example_dist_dir in (parent_dir / "dist").iterdir():
total_size = 0
# For examples with multiple bundles, we add them together.
for bundle in example_dist_dir.glob(f"*.wasm"):
size = bundle.stat().st_size
print(f"{bundle} has a size of {size}.")
total_size += size
if total_size > 0:
example_sizes[example_dist_dir.name] = total_size
return example_sizes
def main() -> None:
sizes = find_example_sizes(Path.cwd())
size_cmp_info = {
"sizes": sizes,
"issue_number": os.environ["ISSUE_NUMBER"],
}
with open(".SIZE_CMP_INFO", "w+") as f:
f.write(json.dumps(size_cmp_info, indent=4))
if __name__ == "__main__":
main()
================================================
FILE: ci/install-wasm-bindgen-cli.sh
================================================
#!/usr/bin/env bash
if [ ! -f "Cargo.lock" ]; then
cargo fetch
fi
VERSION=$(cargo pkgid --frozen wasm-bindgen | cut -d ":" -f 3)
# Cargo decided to change syntax after 1.61
if [ "$VERSION" = "" ]; then
VERSION=$(cargo pkgid --frozen wasm-bindgen | cut -d "@" -f 2)
fi
if [ "$(wasm-bindgen --version)" != "wasm-bindgen $VERSION" ]; then
cargo +stable install --version "$VERSION" wasm-bindgen-cli --force
fi
================================================
FILE: ci/make_benchmark_ssr_cmt.py
================================================
from typing import Dict, List, Optional, Tuple
import os
import json
header = "| Benchmark | Round | Min (ms) | Max (ms) | Mean (ms) | Standard Deviation |"
sep = "| --- | --- | --- | --- | --- | --- |"
def write_benchmark(lines: List[str], content: List[Dict[str, str]]) -> None:
lines.append("<details>")
lines.append("")
lines.append(header)
lines.append(sep)
for i in content:
lines.append(
f"| {i['name']} | {i['round']} | {i['min']} | {i['max']} | {i['mean']} | {i['std_dev']} |"
)
lines.append("")
lines.append("</details>")
lines.append("")
def main() -> None:
with open("benchmark-ssr/yew-master/tools/output.json") as f:
master_content = json.loads(f.read())
with open("benchmark-ssr/current-pr/tools/output.json") as f:
pr_content = json.loads(f.read())
lines: List[str] = []
lines.append("### Benchmark - SSR")
lines.append("")
lines.append("#### Yew Master")
lines.append("")
write_benchmark(lines, master_content)
lines.append("#### Pull Request")
lines.append("")
write_benchmark(lines, pr_content)
output = "\n".join(lines)
with open(os.environ["GITHUB_ENV"], "a+") as f:
f.write(f"YEW_BENCH_SSR={json.dumps(output)}\n")
if __name__ == "__main__":
main()
================================================
FILE: ci/make_example_size_cmt.py
================================================
from typing import Dict, List, Optional, Tuple
import os
import json
header = "| examples | master (KB) | pull request (KB) | diff (KB) | diff (%) |"
sep = "| --- | --- | --- | --- | --- |"
def format_size(size: Optional[int]) -> str:
if size is None:
return "N/A"
if size == 0:
return "0"
return f"{size / 1024:.3f}"
def format_diff_size(
master_size: Optional[int], pr_size: Optional[int]
) -> Tuple[str, str, bool]:
if master_size is None or pr_size is None:
return ("N/A", "N/A", False)
diff = pr_size - master_size
if diff == 0:
return ("0", "0.000%", False)
diff_percent = diff / master_size
return (f"{diff / 1024:+.3f}", f"{diff_percent:+.3%}", abs(diff_percent) >= 0.01)
def main() -> None:
with open("size-cmp-pr-info/.SIZE_CMP_INFO") as f:
pr_content = json.loads(f.read())
with open("size-cmp-master-info/.SIZE_CMP_INFO") as f:
master_content = json.loads(f.read())
master_sizes: dict[str, int] = master_content["sizes"]
pr_sizes: dict[str, int] = pr_content["sizes"]
example_names = sorted(set([*master_sizes.keys(), *pr_sizes.keys()]))
joined_sizes = [(i, [master_sizes.get(i), pr_sizes.get(i)]) for i in example_names]
assert pr_content["issue_number"] == master_content["issue_number"], \
"Issue number differs between master and pr?"
issue_number = pr_content["issue_number"]
lines: List[str] = []
significant_lines: List[str] = []
lines.append("### Size Comparison")
lines.append("")
lines.append("<details>")
lines.append("")
lines.append(header)
lines.append(sep)
for (i, sizes) in joined_sizes:
(master_size, pr_size) = sizes
master_size_str = format_size(master_size)
pr_size_str = format_size(pr_size)
(diff_str, diff_percent, diff_significan
gitextract_gxaqlxdv/
├── .cargo/
│ └── config.toml
├── .firebaserc
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── documentation.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── auto-approve-maintainer-pr.yml
│ ├── benchmark-core.yml
│ ├── benchmark-ssr.yml
│ ├── benchmark.yml
│ ├── build-api-docs.yml
│ ├── build-website.yml
│ ├── clippy.yml
│ ├── fmt.yml
│ ├── inspect-next-changelogs.yml
│ ├── main-checks.yml
│ ├── post-benchmark-core.yml
│ ├── post-benchmark-ssr.yml
│ ├── post-benchmark.yml
│ ├── post-size-cmp.yml
│ ├── publish-api-docs.yml
│ ├── publish-examples.yml
│ ├── publish-website.yml
│ ├── publish.yml
│ ├── size-cmp.yml
│ └── test-website.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE-APACHE
├── LICENSE-MIT
├── Makefile.toml
├── README.md
├── SECURITY.md
├── _typos.toml
├── api-docs/
│ ├── .gitignore
│ ├── before-content.html
│ └── styles.css
├── ci/
│ ├── collect_sizes.py
│ ├── install-wasm-bindgen-cli.sh
│ ├── make_benchmark_ssr_cmt.py
│ ├── make_example_size_cmt.py
│ └── write-min-size-flags.sh
├── examples/
│ ├── .cargo/
│ │ ├── config.toml
│ │ ├── dummy-min-size-config.toml
│ │ └── min-size-config.toml
│ ├── .gitignore
│ ├── README.md
│ ├── async_clock/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── main.rs
│ │ └── services.rs
│ ├── boids/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── boid.rs
│ │ ├── main.rs
│ │ ├── math.rs
│ │ ├── settings.rs
│ │ ├── simulation.rs
│ │ └── slider.rs
│ ├── communication_child_to_parent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_grandchild_with_grandparent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── grandparent.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_grandparent_to_grandchild/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── grandparent.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── communication_parent_to_child/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── child.rs
│ │ ├── main.rs
│ │ └── parent.rs
│ ├── contexts/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ ├── msg_ctx.rs
│ │ ├── producer.rs
│ │ ├── struct_component_producer.rs
│ │ ├── struct_component_subscriber.rs
│ │ └── subscriber.rs
│ ├── counter/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── counter_functional/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── dyn_create_destroy_apps/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── counter.rs
│ │ └── main.rs
│ ├── file_upload/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── function_delayed_input/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── function_memory_game/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── scss/
│ │ │ ├── chess_board.scss
│ │ │ ├── chess_board_card.scss
│ │ │ ├── game_progress.scss
│ │ │ ├── game_status_board.scss
│ │ │ ├── index.scss
│ │ │ ├── score_board.scss
│ │ │ └── score_board_best_score.scss
│ │ └── src/
│ │ ├── components/
│ │ │ ├── app.rs
│ │ │ ├── chessboard.rs
│ │ │ ├── chessboard_card.rs
│ │ │ ├── game_status_board.rs
│ │ │ ├── score_board.rs
│ │ │ ├── score_board_best_score.rs
│ │ │ ├── score_board_logo.rs
│ │ │ └── score_board_progress.rs
│ │ ├── components.rs
│ │ ├── constant.rs
│ │ ├── helper.rs
│ │ ├── main.rs
│ │ └── state.rs
│ ├── function_router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── data/
│ │ │ ├── keywords.txt
│ │ │ ├── syllables.txt
│ │ │ └── yew.txt
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── app.rs
│ │ ├── bin/
│ │ │ └── function_router.rs
│ │ ├── components/
│ │ │ ├── author_card.rs
│ │ │ ├── mod.rs
│ │ │ ├── nav.rs
│ │ │ ├── pagination.rs
│ │ │ ├── post_card.rs
│ │ │ └── progress_delay.rs
│ │ ├── content.rs
│ │ ├── generator.rs
│ │ ├── imagegen.rs
│ │ ├── lib.rs
│ │ └── pages/
│ │ ├── author.rs
│ │ ├── author_list.rs
│ │ ├── home.rs
│ │ ├── mod.rs
│ │ ├── page_not_found.rs
│ │ ├── post.rs
│ │ └── post_list.rs
│ ├── function_todomvc/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── components/
│ │ │ ├── entry.rs
│ │ │ ├── filter.rs
│ │ │ ├── header_input.rs
│ │ │ └── info_footer.rs
│ │ ├── components.rs
│ │ ├── hooks/
│ │ │ └── use_bool_toggle.rs
│ │ ├── hooks.rs
│ │ ├── main.rs
│ │ └── state.rs
│ ├── futures/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ └── markdown.rs
│ ├── game_of_life/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── conway.rs
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── immutable/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── array.rs
│ │ ├── main.rs
│ │ ├── map.rs
│ │ └── string.rs
│ ├── inner_html/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── document.html
│ │ └── main.rs
│ ├── js_callback/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── js/
│ │ │ ├── imp.js
│ │ │ └── unimp.js
│ │ ├── src/
│ │ │ ├── bindings.rs
│ │ │ └── main.rs
│ │ └── trunk_post_build.rs
│ ├── keyed_list/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── main.rs
│ │ │ ├── person.rs
│ │ │ └── random.rs
│ │ └── styles.css
│ ├── mount_point/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── nested_list/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── app.rs
│ │ │ ├── header.rs
│ │ │ ├── item.rs
│ │ │ ├── list.rs
│ │ │ └── main.rs
│ │ └── styles.scss
│ ├── node_refs/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── input.rs
│ │ │ └── main.rs
│ │ └── styles.css
│ ├── password_strength/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── app.rs
│ │ ├── main.rs
│ │ ├── password.rs
│ │ └── text_input.rs
│ ├── portals/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── data/
│ │ │ ├── keywords.txt
│ │ │ ├── syllables.txt
│ │ │ └── yew.txt
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── components/
│ │ │ ├── author_card.rs
│ │ │ ├── mod.rs
│ │ │ ├── pagination.rs
│ │ │ ├── post_card.rs
│ │ │ └── progress_delay.rs
│ │ ├── content.rs
│ │ ├── generator.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ └── pages/
│ │ ├── author.rs
│ │ ├── author_list.rs
│ │ ├── home.rs
│ │ ├── mod.rs
│ │ ├── page_not_found.rs
│ │ ├── post.rs
│ │ └── post_list.rs
│ ├── simple_ssr/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── bin/
│ │ │ │ ├── simple_ssr_hydrate.rs
│ │ │ │ └── simple_ssr_server.rs
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── e2e.rs
│ ├── ssr_router/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── src/
│ │ │ ├── bin/
│ │ │ │ ├── ssr_router_hydrate.rs
│ │ │ │ └── ssr_router_server.rs
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── e2e.rs
│ ├── suspense/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ ├── main.rs
│ │ ├── struct_consumer.rs
│ │ └── use_sleep.rs
│ ├── timer/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── timer_functional/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ ├── index.scss
│ │ └── src/
│ │ └── main.rs
│ ├── todomvc/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── main.rs
│ │ └── state.rs
│ ├── two_apps/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ └── main.rs
│ ├── wasi_ssr_module/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ ├── main.rs
│ │ └── router.rs
│ ├── web_worker_fib/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── agent.rs
│ │ ├── bin/
│ │ │ ├── app.rs
│ │ │ └── worker.rs
│ │ └── lib.rs
│ ├── web_worker_prime/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── Trunk.toml
│ │ ├── index.html
│ │ └── src/
│ │ ├── agent.rs
│ │ ├── bin/
│ │ │ ├── app.rs
│ │ │ └── worker.rs
│ │ └── lib.rs
│ └── webgl/
│ ├── Cargo.toml
│ ├── README.md
│ ├── Trunk.toml
│ ├── index.html
│ └── src/
│ ├── basic.frag
│ ├── basic.vert
│ └── main.rs
├── firebase.json
├── packages/
│ ├── yew/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── src/
│ │ │ ├── app_handle.rs
│ │ │ ├── callback.rs
│ │ │ ├── context.rs
│ │ │ ├── dom_bundle/
│ │ │ │ ├── bcomp.rs
│ │ │ │ ├── blist.rs
│ │ │ │ ├── bnode.rs
│ │ │ │ ├── bportal.rs
│ │ │ │ ├── braw.rs
│ │ │ │ ├── bsuspense.rs
│ │ │ │ ├── btag/
│ │ │ │ │ ├── attributes.rs
│ │ │ │ │ ├── listeners.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── btext.rs
│ │ │ │ ├── fragment.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── position.rs
│ │ │ │ ├── subtree_root.rs
│ │ │ │ ├── traits.rs
│ │ │ │ └── utils.rs
│ │ │ ├── functional/
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── use_callback.rs
│ │ │ │ │ ├── use_context.rs
│ │ │ │ │ ├── use_effect.rs
│ │ │ │ │ ├── use_force_update.rs
│ │ │ │ │ ├── use_memo.rs
│ │ │ │ │ ├── use_prepared_state/
│ │ │ │ │ │ ├── feat_hydration.rs
│ │ │ │ │ │ ├── feat_hydration_ssr.rs
│ │ │ │ │ │ ├── feat_none.rs
│ │ │ │ │ │ ├── feat_ssr.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── use_reducer.rs
│ │ │ │ │ ├── use_ref.rs
│ │ │ │ │ ├── use_state.rs
│ │ │ │ │ └── use_transitive_state/
│ │ │ │ │ ├── feat_hydration.rs
│ │ │ │ │ ├── feat_hydration_ssr.rs
│ │ │ │ │ ├── feat_none.rs
│ │ │ │ │ ├── feat_ssr.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── html/
│ │ │ │ ├── classes.rs
│ │ │ │ ├── component/
│ │ │ │ │ ├── children.rs
│ │ │ │ │ ├── lifecycle.rs
│ │ │ │ │ ├── marker.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── properties.rs
│ │ │ │ │ └── scope.rs
│ │ │ │ ├── conversion/
│ │ │ │ │ ├── into_prop_value.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── listener/
│ │ │ │ │ ├── events.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── lib.rs
│ │ │ ├── platform.rs
│ │ │ ├── renderer.rs
│ │ │ ├── scheduler.rs
│ │ │ ├── sealed.rs
│ │ │ ├── server_renderer.rs
│ │ │ ├── suspense/
│ │ │ │ ├── component.rs
│ │ │ │ ├── hooks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── suspension.rs
│ │ │ ├── tests/
│ │ │ │ ├── layout_tests.rs
│ │ │ │ └── mod.rs
│ │ │ ├── utils/
│ │ │ │ └── mod.rs
│ │ │ └── virtual_dom/
│ │ │ ├── key.rs
│ │ │ ├── listeners.rs
│ │ │ ├── mod.rs
│ │ │ ├── vcomp.rs
│ │ │ ├── vlist.rs
│ │ │ ├── vnode.rs
│ │ │ ├── vportal.rs
│ │ │ ├── vraw.rs
│ │ │ ├── vsuspense.rs
│ │ │ ├── vtag.rs
│ │ │ └── vtext.rs
│ │ └── tests/
│ │ ├── common/
│ │ │ └── mod.rs
│ │ ├── hydration.rs
│ │ ├── layout.rs
│ │ ├── mod.rs
│ │ ├── raw_html.rs
│ │ ├── suspense.rs
│ │ ├── use_callback.rs
│ │ ├── use_context.rs
│ │ ├── use_effect.rs
│ │ ├── use_memo.rs
│ │ ├── use_prepared_state.rs
│ │ ├── use_reducer.rs
│ │ ├── use_ref.rs
│ │ ├── use_state.rs
│ │ └── use_transitive_state.rs
│ ├── yew-agent/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ ├── codec.rs
│ │ ├── lib.rs
│ │ ├── oneshot/
│ │ │ ├── bridge.rs
│ │ │ ├── hooks.rs
│ │ │ ├── mod.rs
│ │ │ ├── provider.rs
│ │ │ ├── registrar.rs
│ │ │ ├── spawner.rs
│ │ │ ├── traits.rs
│ │ │ └── worker.rs
│ │ ├── reach.rs
│ │ ├── reactor/
│ │ │ ├── bridge.rs
│ │ │ ├── hooks.rs
│ │ │ ├── messages.rs
│ │ │ ├── mod.rs
│ │ │ ├── provider.rs
│ │ │ ├── registrar.rs
│ │ │ ├── scope.rs
│ │ │ ├── spawner.rs
│ │ │ ├── traits.rs
│ │ │ └── worker.rs
│ │ ├── scope_ext.rs
│ │ ├── traits.rs
│ │ ├── utils.rs
│ │ └── worker/
│ │ ├── bridge.rs
│ │ ├── handler_id.rs
│ │ ├── hooks.rs
│ │ ├── lifecycle.rs
│ │ ├── messages.rs
│ │ ├── mod.rs
│ │ ├── native_worker.rs
│ │ ├── provider.rs
│ │ ├── registrar.rs
│ │ ├── scope.rs
│ │ ├── spawner.rs
│ │ └── traits.rs
│ ├── yew-agent-macro/
│ │ ├── Cargo.toml
│ │ ├── release.toml
│ │ └── src/
│ │ ├── agent_fn.rs
│ │ ├── lib.rs
│ │ ├── oneshot.rs
│ │ └── reactor.rs
│ ├── yew-macro/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── release.toml
│ │ ├── src/
│ │ │ ├── classes/
│ │ │ │ └── mod.rs
│ │ │ ├── derive_props/
│ │ │ │ ├── builder.rs
│ │ │ │ ├── field.rs
│ │ │ │ ├── generics.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── wrapper.rs
│ │ │ ├── function_component.rs
│ │ │ ├── hook/
│ │ │ │ ├── body.rs
│ │ │ │ ├── lifetime.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── signature.rs
│ │ │ ├── html_tree/
│ │ │ │ ├── html_block.rs
│ │ │ │ ├── html_component.rs
│ │ │ │ ├── html_dashed_name.rs
│ │ │ │ ├── html_element.rs
│ │ │ │ ├── html_for.rs
│ │ │ │ ├── html_if.rs
│ │ │ │ ├── html_iterable.rs
│ │ │ │ ├── html_list.rs
│ │ │ │ ├── html_node.rs
│ │ │ │ ├── lint/
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tag.rs
│ │ │ ├── lib.rs
│ │ │ ├── props/
│ │ │ │ ├── component.rs
│ │ │ │ ├── element.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── prop.rs
│ │ │ │ └── prop_macro.rs
│ │ │ ├── stringify.rs
│ │ │ ├── use_prepared_state.rs
│ │ │ └── use_transitive_state.rs
│ │ └── tests/
│ │ ├── classes_macro/
│ │ │ ├── classes-fail.rs
│ │ │ ├── classes-fail.stderr
│ │ │ └── classes-pass.rs
│ │ ├── classes_macro_test.rs
│ │ ├── derive_props/
│ │ │ ├── fail.rs
│ │ │ ├── fail.stderr
│ │ │ └── pass.rs
│ │ ├── derive_props_test.rs
│ │ ├── function_attr_test.rs
│ │ ├── function_component_attr/
│ │ │ ├── applied-to-non-fn-fail.rs
│ │ │ ├── applied-to-non-fn-fail.stderr
│ │ │ ├── async-fail.rs
│ │ │ ├── async-fail.stderr
│ │ │ ├── bad-name-fail.rs
│ │ │ ├── bad-name-fail.stderr
│ │ │ ├── bad-props-param-fail.rs
│ │ │ ├── bad-props-param-fail.stderr
│ │ │ ├── bad-return-type-fail.rs
│ │ │ ├── bad-return-type-fail.stderr
│ │ │ ├── const-fail.rs
│ │ │ ├── const-fail.stderr
│ │ │ ├── extern-fail.rs
│ │ │ ├── extern-fail.stderr
│ │ │ ├── generic-lifetime-fail.rs
│ │ │ ├── generic-lifetime-fail.stderr
│ │ │ ├── generic-pass.rs
│ │ │ ├── generic-props-fail.rs
│ │ │ ├── generic-props-fail.stderr
│ │ │ ├── hook_location-fail.rs
│ │ │ ├── hook_location-fail.stderr
│ │ │ ├── hook_location-pass.rs
│ │ │ ├── lifetime-props-param-fail.rs
│ │ │ ├── lifetime-props-param-fail.stderr
│ │ │ ├── multiple-param-fail.rs
│ │ │ ├── multiple-param-fail.stderr
│ │ │ ├── mut-ref-props-param-fail.rs
│ │ │ ├── mut-ref-props-param-fail.stderr
│ │ │ ├── no-name-default-pass.rs
│ │ │ ├── with-defaulted-type-param-pass.rs
│ │ │ ├── with-props-pass.rs
│ │ │ ├── with-receiver-fail.rs
│ │ │ ├── with-receiver-fail.stderr
│ │ │ └── without-props-pass.rs
│ │ ├── hook_attr/
│ │ │ ├── hook-call-generics-pass.rs
│ │ │ ├── hook-const-generic-pass.rs
│ │ │ ├── hook-dynamic-dispatch-pass.rs
│ │ │ ├── hook-impl-trait-pass.rs
│ │ │ ├── hook-lifetime-pass.rs
│ │ │ ├── hook-must-use-fail.rs
│ │ │ ├── hook-must-use-fail.stderr
│ │ │ ├── hook-must-use-pass.rs
│ │ │ ├── hook-return-impl-trait-pass.rs
│ │ │ ├── hook-return-ref-pass.rs
│ │ │ ├── hook-trait-item-pass.rs
│ │ │ ├── hook_location-fail.rs
│ │ │ ├── hook_location-fail.stderr
│ │ │ ├── hook_location-pass.rs
│ │ │ ├── hook_macro-fail.rs
│ │ │ ├── hook_macro-fail.stderr
│ │ │ └── hook_macro-pass.rs
│ │ ├── hook_attr_test.rs
│ │ ├── hook_macro/
│ │ │ ├── use_prepared_state-fail.rs
│ │ │ ├── use_prepared_state-fail.stderr
│ │ │ ├── use_transitive_state-fail.rs
│ │ │ └── use_transitive_state-fail.stderr
│ │ ├── hook_macro_test.rs
│ │ ├── html_lints/
│ │ │ ├── fail.rs
│ │ │ └── fail.stderr
│ │ ├── html_lints_test.rs
│ │ ├── html_macro/
│ │ │ ├── as-return-value-pass.rs
│ │ │ ├── block-fail.rs
│ │ │ ├── block-fail.stderr
│ │ │ ├── block-pass.rs
│ │ │ ├── component-any-children-pass.rs
│ │ │ ├── component-fail.rs
│ │ │ ├── component-fail.stderr
│ │ │ ├── component-pass.rs
│ │ │ ├── component-unimplemented-fail.rs
│ │ │ ├── component-unimplemented-fail.stderr
│ │ │ ├── dyn-element-pass.rs
│ │ │ ├── element-fail.rs
│ │ │ ├── element-fail.stderr
│ │ │ ├── for-fail.rs
│ │ │ ├── for-fail.stderr
│ │ │ ├── for-pass.rs
│ │ │ ├── generic-component-fail.rs
│ │ │ ├── generic-component-fail.stderr
│ │ │ ├── generic-component-pass.rs
│ │ │ ├── html-component-fail.stderr
│ │ │ ├── html-element-pass.rs
│ │ │ ├── html-if-fail.rs
│ │ │ ├── html-if-fail.stderr
│ │ │ ├── html-if-pass.rs
│ │ │ ├── html-node-pass.rs
│ │ │ ├── iterable-fail.rs
│ │ │ ├── iterable-fail.stderr
│ │ │ ├── iterable-pass.rs
│ │ │ ├── list-fail.rs
│ │ │ ├── list-fail.stderr
│ │ │ ├── list-pass.rs
│ │ │ ├── missing-props-diagnostics-fail.rs
│ │ │ ├── missing-props-diagnostics-fail.stderr
│ │ │ ├── node-fail.rs
│ │ │ ├── node-fail.stderr
│ │ │ ├── node-pass.rs
│ │ │ └── svg-pass.rs
│ │ ├── html_macro_test.rs
│ │ ├── props_macro/
│ │ │ ├── props-fail.rs
│ │ │ ├── props-fail.stderr
│ │ │ ├── props-pass.rs
│ │ │ ├── resolve-prop-fail.rs
│ │ │ ├── resolve-prop-fail.stderr
│ │ │ └── resolve-prop-pass.rs
│ │ └── props_macro_test.rs
│ ├── yew-router/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── link.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── redirect.rs
│ │ │ ├── hooks.rs
│ │ │ ├── lib.rs
│ │ │ ├── macro_helpers.rs
│ │ │ ├── navigator.rs
│ │ │ ├── routable.rs
│ │ │ ├── router.rs
│ │ │ ├── scope_ext.rs
│ │ │ ├── switch.rs
│ │ │ └── utils.rs
│ │ └── tests/
│ │ ├── basename.rs
│ │ ├── browser_router.rs
│ │ ├── hash_router.rs
│ │ ├── link.rs
│ │ ├── router_unit_tests.rs
│ │ ├── url_encoded_routes.rs
│ │ └── utils.rs
│ └── yew-router-macro/
│ ├── Cargo.toml
│ ├── Makefile.toml
│ ├── release.toml
│ ├── src/
│ │ ├── lib.rs
│ │ └── routable_derive.rs
│ └── tests/
│ ├── routable_derive/
│ │ ├── bad-ats-fail.rs
│ │ ├── bad-ats-fail.stderr
│ │ ├── invalid-not-found-fail.rs
│ │ ├── invalid-not-found-fail.stderr
│ │ ├── relative-path-fail.rs
│ │ ├── relative-path-fail.stderr
│ │ ├── route-with-hash-fail.rs
│ │ ├── route-with-hash-fail.stderr
│ │ ├── struct-fail.rs
│ │ ├── struct-fail.stderr
│ │ ├── unnamed-fields-fail.rs
│ │ ├── unnamed-fields-fail.stderr
│ │ └── valid-pass.rs
│ └── routable_derive_test.rs
├── release.toml
├── rustfmt.toml
├── tools/
│ ├── benchmark-core/
│ │ ├── Cargo.toml
│ │ └── benches/
│ │ └── vnode.rs
│ ├── benchmark-hooks/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ └── src/
│ │ └── lib.rs
│ ├── benchmark-ssr/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── benchmark-struct/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── package.json
│ │ └── src/
│ │ └── lib.rs
│ ├── build-examples/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── bin/
│ │ │ └── update-wasm-opt.rs
│ │ ├── lib.rs
│ │ └── main.rs
│ ├── changelog/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── src/
│ │ │ ├── cli.rs
│ │ │ ├── create_log_line.rs
│ │ │ ├── create_log_lines.rs
│ │ │ ├── get_latest_version.rs
│ │ │ ├── github_fetch.rs
│ │ │ ├── github_issue_labels_fetcher.rs
│ │ │ ├── github_user_fetcher.rs
│ │ │ ├── lib.rs
│ │ │ ├── log_line.rs
│ │ │ ├── main.rs
│ │ │ ├── mod.rs
│ │ │ ├── new_version_level.rs
│ │ │ ├── stdout_tag_description_changelog.rs
│ │ │ ├── write_changelog_file.rs
│ │ │ ├── write_log_lines.rs
│ │ │ ├── write_version_changelog.rs
│ │ │ └── yew_package.rs
│ │ └── tests/
│ │ ├── generate_yew_changelog_file.rs
│ │ ├── test_base.md
│ │ └── test_expected.md
│ ├── collect-release-info/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── process-benchmark-results/
│ │ ├── Cargo.toml
│ │ ├── Makefile.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── main.rs
│ ├── ssr-e2e/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── ssr-e2e-harness/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ └── website-test/
│ ├── Cargo.toml
│ ├── Makefile.toml
│ ├── build.rs
│ └── src/
│ └── lib.rs
└── website/
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── README.md
├── babel.config.js
├── blog/
│ ├── 2022-01-20-hello-yew.md
│ ├── 2022-11-24-release-0-20.md
│ ├── 2023-09-23-release-0-21.md
│ ├── 2024-10-14-release-0-22.md
│ ├── 2025-11-29-release-0-22.md
│ └── authors.yml
├── check-translations.js
├── community/
│ ├── awesome.md
│ └── external-libs.mdx
├── docs/
│ ├── advanced-topics/
│ │ ├── children.mdx
│ │ ├── how-it-works.mdx
│ │ ├── immutable.mdx
│ │ ├── optimizations.mdx
│ │ ├── portals.mdx
│ │ ├── server-side-rendering.mdx
│ │ └── struct-components/
│ │ ├── callbacks.mdx
│ │ ├── hoc.mdx
│ │ ├── introduction.mdx
│ │ ├── lifecycle.mdx
│ │ ├── properties.mdx
│ │ ├── refs.mdx
│ │ └── scope.mdx
│ ├── concepts/
│ │ ├── agents.mdx
│ │ ├── basic-web-technologies/
│ │ │ ├── css.mdx
│ │ │ ├── html.mdx
│ │ │ ├── js.mdx
│ │ │ ├── wasm-bindgen.mdx
│ │ │ └── web-sys.mdx
│ │ ├── contexts.mdx
│ │ ├── function-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── children.mdx
│ │ │ ├── communication.mdx
│ │ │ ├── generics.mdx
│ │ │ ├── hooks/
│ │ │ │ ├── custom-hooks.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── node-refs.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── pure-components.mdx
│ │ │ └── state.mdx
│ │ ├── html/
│ │ │ ├── classes.mdx
│ │ │ ├── components.mdx
│ │ │ ├── conditional-rendering.mdx
│ │ │ ├── elements.mdx
│ │ │ ├── events.mdx
│ │ │ ├── fragments.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lists.mdx
│ │ │ └── literals-and-expressions.mdx
│ │ ├── router.mdx
│ │ └── suspense.mdx
│ ├── getting-started/
│ │ ├── build-a-sample-app.mdx
│ │ ├── editor-setup.mdx
│ │ ├── examples.mdx
│ │ └── introduction.mdx
│ ├── migration-guides/
│ │ ├── yew/
│ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ ├── from-0_21_0-to-0_22_0.mdx
│ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ ├── yew-agent/
│ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ ├── from-0_3_0-to-0_4_0.mdx
│ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ └── yew-router/
│ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ ├── from-0_16_0-to-0_17_0.mdx
│ │ └── from-0_19_0-to-0_20_0.mdx
│ ├── more/
│ │ ├── css.mdx
│ │ ├── debugging.mdx
│ │ ├── deployment.mdx
│ │ ├── roadmap.mdx
│ │ └── testing.mdx
│ └── tutorial/
│ └── index.mdx
├── docusaurus.config.js
├── i18n/
│ ├── ja/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── current.json
│ │ │ ├── version-0.20/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ └── refs.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.20.json
│ │ │ ├── version-0.21/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.md
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ └── properties.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.21.json
│ │ │ ├── version-0.22/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── version-0.22.json
│ │ │ ├── version-0.23/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ └── version-0.23.json
│ │ ├── docusaurus-plugin-content-docs-community/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-docs-router/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-pages/
│ │ │ └── index.mdx
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── zh-Hans/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── current.json
│ │ │ ├── version-0.20/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ └── refs.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ └── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.20.json
│ │ │ ├── version-0.21/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.md
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ └── custom-hooks.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ └── properties.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ └── router.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ └── examples.mdx
│ │ │ │ └── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ ├── version-0.21.json
│ │ │ ├── version-0.22/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ ├── version-0.22.json
│ │ │ ├── version-0.23/
│ │ │ │ ├── advanced-topics/
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── how-it-works.mdx
│ │ │ │ │ ├── immutable.mdx
│ │ │ │ │ ├── optimizations.mdx
│ │ │ │ │ ├── portals.mdx
│ │ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ │ └── struct-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── hoc.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lifecycle.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── refs.mdx
│ │ │ │ │ └── scope.mdx
│ │ │ │ ├── concepts/
│ │ │ │ │ ├── agents.mdx
│ │ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ │ ├── css.mdx
│ │ │ │ │ │ ├── html.mdx
│ │ │ │ │ │ ├── js.mdx
│ │ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ │ └── web-sys.mdx
│ │ │ │ │ ├── contexts.mdx
│ │ │ │ │ ├── function-components/
│ │ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ │ ├── children.mdx
│ │ │ │ │ │ ├── communication.mdx
│ │ │ │ │ │ ├── generics.mdx
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ │ ├── properties.mdx
│ │ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ │ └── state.mdx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── classes.mdx
│ │ │ │ │ │ ├── components.mdx
│ │ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ │ ├── elements.mdx
│ │ │ │ │ │ ├── events.mdx
│ │ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ │ ├── lists.mdx
│ │ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ │ ├── router.mdx
│ │ │ │ │ └── suspense.mdx
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ │ ├── editor-setup.mdx
│ │ │ │ │ ├── examples.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── migration-guides/
│ │ │ │ │ ├── yew/
│ │ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ │ ├── yew-agent/
│ │ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ │ └── yew-router/
│ │ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── more/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── debugging.mdx
│ │ │ │ │ ├── deployment.mdx
│ │ │ │ │ ├── roadmap.mdx
│ │ │ │ │ └── testing.mdx
│ │ │ │ └── tutorial/
│ │ │ │ └── index.mdx
│ │ │ └── version-0.23.json
│ │ ├── docusaurus-plugin-content-docs-community/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-docs-router/
│ │ │ └── current.json
│ │ ├── docusaurus-plugin-content-pages/
│ │ │ └── index.mdx
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ └── zh-Hant/
│ ├── code.json
│ ├── docusaurus-plugin-content-blog/
│ │ └── options.json
│ ├── docusaurus-plugin-content-docs/
│ │ ├── current/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── migration-guides/
│ │ │ │ ├── yew/
│ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ ├── yew-agent/
│ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ └── yew-router/
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ ├── current.json
│ │ ├── version-0.20/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ └── refs.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ └── router.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ └── examples.mdx
│ │ │ └── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ ├── version-0.20.json
│ │ ├── version-0.21/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.md
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ └── properties.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ └── router.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ └── examples.mdx
│ │ │ └── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ ├── version-0.21.json
│ │ ├── version-0.22/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ ├── version-0.22.json
│ │ ├── version-0.23/
│ │ │ ├── advanced-topics/
│ │ │ │ ├── children.mdx
│ │ │ │ ├── how-it-works.mdx
│ │ │ │ ├── immutable.mdx
│ │ │ │ ├── optimizations.mdx
│ │ │ │ ├── portals.mdx
│ │ │ │ ├── server-side-rendering.mdx
│ │ │ │ └── struct-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── hoc.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lifecycle.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── refs.mdx
│ │ │ │ └── scope.mdx
│ │ │ ├── concepts/
│ │ │ │ ├── agents.mdx
│ │ │ │ ├── basic-web-technologies/
│ │ │ │ │ ├── css.mdx
│ │ │ │ │ ├── html.mdx
│ │ │ │ │ ├── js.mdx
│ │ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ │ └── web-sys.mdx
│ │ │ │ ├── contexts.mdx
│ │ │ │ ├── function-components/
│ │ │ │ │ ├── callbacks.mdx
│ │ │ │ │ ├── children.mdx
│ │ │ │ │ ├── communication.mdx
│ │ │ │ │ ├── generics.mdx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ │ └── introduction.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── node-refs.mdx
│ │ │ │ │ ├── properties.mdx
│ │ │ │ │ ├── pure-components.mdx
│ │ │ │ │ └── state.mdx
│ │ │ │ ├── html/
│ │ │ │ │ ├── classes.mdx
│ │ │ │ │ ├── components.mdx
│ │ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ │ ├── elements.mdx
│ │ │ │ │ ├── events.mdx
│ │ │ │ │ ├── fragments.mdx
│ │ │ │ │ ├── introduction.mdx
│ │ │ │ │ ├── lists.mdx
│ │ │ │ │ └── literals-and-expressions.mdx
│ │ │ │ ├── router.mdx
│ │ │ │ └── suspense.mdx
│ │ │ ├── getting-started/
│ │ │ │ ├── build-a-sample-app.mdx
│ │ │ │ ├── editor-setup.mdx
│ │ │ │ ├── examples.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── migration-guides/
│ │ │ │ ├── yew/
│ │ │ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ │ │ ├── yew-agent/
│ │ │ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ │ │ └── yew-router/
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── more/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── debugging.mdx
│ │ │ │ ├── deployment.mdx
│ │ │ │ ├── roadmap.mdx
│ │ │ │ └── testing.mdx
│ │ │ └── tutorial/
│ │ │ └── index.mdx
│ │ └── version-0.23.json
│ ├── docusaurus-plugin-content-docs-community/
│ │ └── current.json
│ ├── docusaurus-plugin-content-docs-router/
│ │ └── current.json
│ ├── docusaurus-plugin-content-pages/
│ │ └── index.mdx
│ └── docusaurus-theme-classic/
│ ├── footer.json
│ └── navbar.json
├── package.json
├── sidebars/
│ ├── community.js
│ └── docs.js
├── src/
│ ├── constants.js
│ ├── css/
│ │ └── custom.css
│ ├── pages/
│ │ ├── index.module.scss
│ │ └── index.tsx
│ └── theme/
│ └── NavbarItem/
│ └── DefaultNavbarItem.tsx
├── static/
│ ├── .nojekyll
│ └── tutorial/
│ └── data.json
├── tsconfig.json
├── versioned_docs/
│ ├── version-0.20/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.md
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ └── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ └── from-0_1_0-to-0_2_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ ├── version-0.21/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.md
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ │ └── from-0_20_0-to-next.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ └── from-0_1_0-to-0_2_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ ├── version-0.22/
│ │ ├── advanced-topics/
│ │ │ ├── children.mdx
│ │ │ ├── how-it-works.mdx
│ │ │ ├── immutable.mdx
│ │ │ ├── optimizations.mdx
│ │ │ ├── portals.mdx
│ │ │ ├── server-side-rendering.mdx
│ │ │ └── struct-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── hoc.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lifecycle.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── refs.mdx
│ │ │ └── scope.mdx
│ │ ├── concepts/
│ │ │ ├── agents.mdx
│ │ │ ├── basic-web-technologies/
│ │ │ │ ├── css.mdx
│ │ │ │ ├── html.mdx
│ │ │ │ ├── js.mdx
│ │ │ │ ├── wasm-bindgen.mdx
│ │ │ │ └── web-sys.mdx
│ │ │ ├── contexts.mdx
│ │ │ ├── function-components/
│ │ │ │ ├── callbacks.mdx
│ │ │ │ ├── children.mdx
│ │ │ │ ├── communication.mdx
│ │ │ │ ├── generics.mdx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── custom-hooks.mdx
│ │ │ │ │ └── introduction.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── node-refs.mdx
│ │ │ │ ├── properties.mdx
│ │ │ │ ├── pure-components.mdx
│ │ │ │ └── state.mdx
│ │ │ ├── html/
│ │ │ │ ├── classes.mdx
│ │ │ │ ├── components.mdx
│ │ │ │ ├── conditional-rendering.mdx
│ │ │ │ ├── elements.mdx
│ │ │ │ ├── events.mdx
│ │ │ │ ├── fragments.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ ├── lists.mdx
│ │ │ │ └── literals-and-expressions.mdx
│ │ │ ├── router.mdx
│ │ │ └── suspense.mdx
│ │ ├── getting-started/
│ │ │ ├── build-a-sample-app.mdx
│ │ │ ├── editor-setup.mdx
│ │ │ ├── examples.mdx
│ │ │ └── introduction.mdx
│ │ ├── migration-guides/
│ │ │ ├── yew/
│ │ │ │ ├── from-0_18_0-to-0_19_0.mdx
│ │ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ │ └── from-0_21_0-to-0_22_0.mdx
│ │ │ ├── yew-agent/
│ │ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ │ └── from-0_3_0-to-0_4_0.mdx
│ │ │ └── yew-router/
│ │ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ │ └── from-0_16_0-to-0_17_0.mdx
│ │ ├── more/
│ │ │ ├── css.mdx
│ │ │ ├── debugging.mdx
│ │ │ ├── deployment.mdx
│ │ │ ├── roadmap.mdx
│ │ │ └── testing.mdx
│ │ └── tutorial/
│ │ └── index.mdx
│ └── version-0.23/
│ ├── advanced-topics/
│ │ ├── children.mdx
│ │ ├── how-it-works.mdx
│ │ ├── immutable.mdx
│ │ ├── optimizations.mdx
│ │ ├── portals.mdx
│ │ ├── server-side-rendering.mdx
│ │ └── struct-components/
│ │ ├── callbacks.mdx
│ │ ├── hoc.mdx
│ │ ├── introduction.mdx
│ │ ├── lifecycle.mdx
│ │ ├── properties.mdx
│ │ ├── refs.mdx
│ │ └── scope.mdx
│ ├── concepts/
│ │ ├── agents.mdx
│ │ ├── basic-web-technologies/
│ │ │ ├── css.mdx
│ │ │ ├── html.mdx
│ │ │ ├── js.mdx
│ │ │ ├── wasm-bindgen.mdx
│ │ │ └── web-sys.mdx
│ │ ├── contexts.mdx
│ │ ├── function-components/
│ │ │ ├── callbacks.mdx
│ │ │ ├── children.mdx
│ │ │ ├── communication.mdx
│ │ │ ├── generics.mdx
│ │ │ ├── hooks/
│ │ │ │ ├── custom-hooks.mdx
│ │ │ │ └── introduction.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── node-refs.mdx
│ │ │ ├── properties.mdx
│ │ │ ├── pure-components.mdx
│ │ │ └── state.mdx
│ │ ├── html/
│ │ │ ├── classes.mdx
│ │ │ ├── components.mdx
│ │ │ ├── conditional-rendering.mdx
│ │ │ ├── elements.mdx
│ │ │ ├── events.mdx
│ │ │ ├── fragments.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── lists.mdx
│ │ │ └── literals-and-expressions.mdx
│ │ ├── router.mdx
│ │ └── suspense.mdx
│ ├── getting-started/
│ │ ├── build-a-sample-app.mdx
│ │ ├── editor-setup.mdx
│ │ ├── examples.mdx
│ │ └── introduction.mdx
│ ├── migration-guides/
│ │ ├── yew/
│ │ │ ├── from-0_19_0-to-0_20_0.mdx
│ │ │ ├── from-0_20_0-to-0_21_0.mdx
│ │ │ ├── from-0_21_0-to-0_22_0.mdx
│ │ │ └── from-0_22_0-to-0_23_0.mdx
│ │ ├── yew-agent/
│ │ │ ├── from-0_0_0-to-0_1_0.mdx
│ │ │ ├── from-0_1_0-to-0_2_0.mdx
│ │ │ ├── from-0_3_0-to-0_4_0.mdx
│ │ │ └── from-0_4_0-to-0_5_0.mdx
│ │ └── yew-router/
│ │ ├── from-0_15_0-to-0_16_0.mdx
│ │ ├── from-0_16_0-to-0_17_0.mdx
│ │ └── from-0_19_0-to-0_20_0.mdx
│ ├── more/
│ │ ├── css.mdx
│ │ ├── debugging.mdx
│ │ ├── deployment.mdx
│ │ ├── roadmap.mdx
│ │ └── testing.mdx
│ └── tutorial/
│ └── index.mdx
├── versioned_sidebars/
│ ├── version-0.20-sidebars.json
│ ├── version-0.21-sidebars.json
│ ├── version-0.22-sidebars.json
│ └── version-0.23-sidebars.json
├── versions.json
└── write-translations.js
Showing preview only (281K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3764 symbols across 429 files)
FILE: ci/collect_sizes.py
function find_example_sizes (line 9) | def find_example_sizes(parent_dir: Path) -> Dict[str, int]:
function main (line 30) | def main() -> None:
FILE: ci/make_benchmark_ssr_cmt.py
function write_benchmark (line 11) | def write_benchmark(lines: List[str], content: List[Dict[str, str]]) -> ...
function main (line 27) | def main() -> None:
FILE: ci/make_example_size_cmt.py
function format_size (line 11) | def format_size(size: Optional[int]) -> str:
function format_diff_size (line 21) | def format_diff_size(
function main (line 37) | def main() -> None:
FILE: examples/async_clock/src/main.rs
type AsyncComponent (line 17) | pub struct AsyncComponent {
type Msg (line 24) | pub enum Msg {
type Message (line 32) | type Message = Msg;
type Properties (line 33) | type Properties = ();
method create (line 35) | fn create(ctx: &Context<Self>) -> Self {
method update (line 56) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 97) | fn view(&self, _ctx: &Context<Self>) -> Html {
function main (line 124) | fn main() {
FILE: examples/async_clock/src/services.rs
constant ONE_SEC (line 11) | const ONE_SEC: Duration = Duration::from_secs(1);
constant TEN_SECS (line 12) | const TEN_SECS: Duration = Duration::from_secs(10);
function initialize_atomic_clocks (line 15) | pub async fn initialize_atomic_clocks() {
function stream_time (line 21) | pub fn stream_time() -> impl Stream<Item = DateTime<Local>> {
function emit_jokes (line 26) | pub fn emit_jokes(joke_cb: Callback<AttrValue>) {
function compute_fun_score (line 48) | pub fn compute_fun_score(fun_score_cb: Callback<i16>) -> UnboundedSender...
FILE: examples/boids/src/boid.rs
type Boid (line 12) | pub struct Boid {
method new_random (line 20) | pub fn new_random(settings: &Settings) -> Self {
method coherence (line 36) | fn coherence(&self, boids: VisibleBoidIter, factor: f64) -> Vector2D {
method separation (line 44) | fn separation(&self, boids: VisibleBoidIter, settings: &Settings) -> V...
method alignment (line 57) | fn alignment(&self, boids: VisibleBoidIter, factor: f64) -> Vector2D {
method adapt_color (line 63) | fn adapt_color(&mut self, boids: VisibleBoidIter, factor: f64) {
method keep_in_bounds (line 76) | fn keep_in_bounds(&mut self, settings: &Settings) {
method update_velocity (line 101) | fn update_velocity(&mut self, settings: &Settings, boids: VisibleBoidI...
method update (line 109) | fn update(&mut self, settings: &Settings, boids: VisibleBoidIter) {
method update_all (line 116) | pub fn update_all(settings: &Settings, boids: &mut [Self]) {
method render (line 127) | pub fn render(&self) -> Html {
function iter_shape_points (line 142) | fn iter_shape_points(radius: f64, rotation: f64) -> impl Iterator<Item =...
type VisibleBoid (line 155) | struct VisibleBoid<'a> {
type VisibleBoidIter (line 162) | struct VisibleBoidIter<'boid> {
function new (line 170) | fn new(
type Item (line 184) | type Item = VisibleBoid<'boid>;
method next (line 186) | fn next(&mut self) -> Option<Self::Item> {
FILE: examples/boids/src/main.rs
type Msg (line 13) | pub enum Msg {
type App (line 20) | pub struct App {
method view_panel (line 78) | fn view_panel(&self, link: &Scope<Self>) -> Html {
method view_settings (line 92) | fn view_settings(&self, link: &Scope<Self>) -> Html {
type Message (line 26) | type Message = Msg;
type Properties (line 27) | type Properties = ();
method create (line 29) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 37) | fn update(&mut self, _ctx: &Context<Self>, msg: Msg) -> bool {
method view (line 60) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 165) | fn main() {
FILE: examples/boids/src/math.rs
constant TAU (line 6) | pub const TAU: f64 = 2.0 * PI;
constant FRAC_TAU_3 (line 7) | pub const FRAC_TAU_3: f64 = 2.0 * FRAC_PI_3;
function smallest_angle_between (line 11) | pub fn smallest_angle_between(source: f64, target: f64) -> f64 {
type Vector2D (line 17) | pub struct Vector2D {
method new (line 22) | pub const fn new(x: f64, y: f64) -> Self {
method from_polar (line 26) | pub fn from_polar(angle: f64, radius: f64) -> Self {
method magnitude_squared (line 31) | pub fn magnitude_squared(self) -> f64 {
method magnitude (line 35) | pub fn magnitude(self) -> f64 {
method clamp_magnitude (line 39) | pub fn clamp_magnitude(self, max: f64) -> Self {
method angle (line 49) | pub fn angle(self) -> f64 {
method mul_assign (line 93) | fn mul_assign(&mut self, scalar: f64) {
type Output (line 99) | type Output = Self;
method mul (line 101) | fn mul(mut self, rhs: f64) -> Self::Output {
method div_assign (line 108) | fn div_assign(&mut self, scalar: f64) {
type Output (line 114) | type Output = Self;
method div (line 116) | fn div(mut self, rhs: f64) -> Self::Output {
type Output (line 55) | type Output = Self;
method neg (line 57) | fn neg(self) -> Self::Output {
method add_assign (line 63) | fn add_assign(&mut self, other: Self) {
type Output (line 69) | type Output = Self;
method add (line 71) | fn add(mut self, rhs: Self) -> Self::Output {
method sub_assign (line 78) | fn sub_assign(&mut self, other: Self) {
type Output (line 84) | type Output = Self;
method sub (line 86) | fn sub(mut self, rhs: Self) -> Self::Output {
method sum (line 123) | fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
type WeightedMean (line 128) | pub trait WeightedMean<T = Self>: Sized {
method weighted_mean (line 129) | fn weighted_mean(it: impl Iterator<Item = (T, f64)>) -> Option<Self>;
method weighted_mean (line 136) | fn weighted_mean(it: impl Iterator<Item = (T, f64)>) -> Option<T> {
type Mean (line 152) | pub trait Mean<T = Self>: Sized {
method mean (line 153) | fn mean(it: impl Iterator<Item = T>) -> Option<Self>;
method mean (line 160) | fn mean(it: impl Iterator<Item = T>) -> Option<T> {
FILE: examples/boids/src/settings.rs
type Settings (line 5) | pub struct Settings {
constant KEY (line 30) | const KEY: &'static str = "yew.boids.settings";
method load (line 32) | pub fn load() -> Self {
method remove (line 36) | pub fn remove() {
method store (line 40) | pub fn store(&self) {
method default (line 45) | fn default() -> Self {
FILE: examples/boids/src/simulation.rs
constant SIZE (line 8) | pub const SIZE: Vector2D = Vector2D::new(1600.0, 1000.0);
type Msg (line 11) | pub enum Msg {
type Props (line 16) | pub struct Props {
type Simulation (line 25) | pub struct Simulation {
type Message (line 31) | type Message = Msg;
type Properties (line 32) | type Properties = Props;
method create (line 34) | fn create(ctx: &Context<Self>) -> Self {
method update (line 55) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method changed (line 74) | fn changed(&mut self, ctx: &Context<Self>, old_props: &Self::Properties)...
method view (line 101) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/boids/src/slider.rs
function next_slider_id (line 10) | fn next_slider_id() -> usize {
type Props (line 15) | pub struct Props {
type Slider (line 30) | pub struct Slider {
type Message (line 34) | type Message = ();
type Properties (line 35) | type Properties = Props;
method create (line 37) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 43) | fn update(&mut self, _ctx: &Context<Self>, _msg: Self::Message) -> bool {
method view (line 47) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_child_to_parent/src/child.rs
type Child (line 5) | pub struct Child;
type ChildProps (line 8) | pub struct ChildProps {
type Message (line 14) | type Message = ();
type Properties (line 15) | type Properties = ChildProps;
method create (line 17) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 21) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_child_to_parent/src/main.rs
function main (line 8) | fn main() {
FILE: examples/communication_child_to_parent/src/parent.rs
type Msg (line 3) | pub enum Msg {
type Parent (line 8) | pub struct Parent {
type Message (line 15) | type Message = Msg;
type Properties (line 16) | type Properties = ();
method create (line 18) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 25) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 38) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_grandchild_with_grandparent/src/child.rs
type Child (line 5) | pub struct Child {
type ChildMsg (line 10) | pub enum ChildMsg {
type ChildProps (line 15) | pub struct ChildProps {
type Message (line 20) | type Message = ChildMsg;
type Properties (line 21) | type Properties = ChildProps;
method create (line 23) | fn create(ctx: &Context<Self>) -> Self {
method update (line 34) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 43) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_grandchild_with_grandparent/src/grandparent.rs
type Msg (line 3) | pub enum Msg {
type GrandParent (line 8) | pub struct GrandParent {
type Message (line 12) | type Message = Msg;
type Properties (line 13) | type Properties = ();
method create (line 15) | fn create(ctx: &Context<Self>) -> Self {
method update (line 25) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 37) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/communication_grandchild_with_grandparent/src/main.rs
type AppState (line 18) | pub struct AppState {
function main (line 28) | fn main() {
FILE: examples/communication_grandchild_with_grandparent/src/parent.rs
function Parent (line 6) | pub fn Parent() -> Html {
FILE: examples/communication_grandparent_to_grandchild/src/child.rs
type Child (line 5) | pub struct Child {
type ChildMsg (line 10) | pub enum ChildMsg {
type Message (line 15) | type Message = ChildMsg;
type Properties (line 16) | type Properties = ();
method create (line 18) | fn create(ctx: &Context<Self>) -> Self {
method update (line 29) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 38) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/communication_grandparent_to_grandchild/src/grandparent.rs
type GrandParent (line 4) | pub struct GrandParent {
type Msg (line 8) | pub enum Msg {
type Message (line 13) | type Message = Msg;
type Properties (line 14) | type Properties = ();
method create (line 16) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 21) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 30) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_grandparent_to_grandchild/src/main.rs
type AppState (line 15) | pub struct AppState {
function main (line 20) | fn main() {
FILE: examples/communication_grandparent_to_grandchild/src/parent.rs
function Parent (line 6) | pub fn Parent() -> Html {
FILE: examples/communication_parent_to_child/src/child.rs
type Child (line 5) | pub struct Child;
type ChildProps (line 8) | pub struct ChildProps {
type Message (line 13) | type Message = ();
type Properties (line 14) | type Properties = ChildProps;
method create (line 16) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 20) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/communication_parent_to_child/src/main.rs
function main (line 8) | fn main() {
FILE: examples/communication_parent_to_child/src/parent.rs
type Parent (line 4) | pub struct Parent {
type Msg (line 9) | pub enum Msg {
type Message (line 14) | type Message = Msg;
type Properties (line 15) | type Properties = ();
method create (line 17) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 21) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 30) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/contexts/src/main.rs
function App (line 15) | pub fn App() -> Html {
function main (line 26) | fn main() {
FILE: examples/contexts/src/msg_ctx.rs
type Message (line 6) | pub struct Message {
type Action (line 11) | type Action = String;
method reduce (line 13) | fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
type MessageContext (line 18) | pub type MessageContext = UseReducerHandle<Message>;
type MessageProviderProps (line 21) | pub struct MessageProviderProps {
function MessageProvider (line 27) | pub fn MessageProvider(props: &MessageProviderProps) -> Html {
FILE: examples/contexts/src/producer.rs
function Producer (line 6) | pub fn Producer() -> Html {
FILE: examples/contexts/src/struct_component_producer.rs
type StructComponentProducer (line 5) | pub struct StructComponentProducer;
type Message (line 8) | type Message = ();
type Properties (line 9) | type Properties = ();
method create (line 11) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 15) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/contexts/src/struct_component_subscriber.rs
type Msg (line 5) | pub enum Msg {
type StructComponentSubscriber (line 9) | pub struct StructComponentSubscriber {
type Message (line 15) | type Message = Msg;
type Properties (line 16) | type Properties = ();
method create (line 18) | fn create(ctx: &Context<Self>) -> Self {
method update (line 30) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 39) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/contexts/src/subscriber.rs
function Subscriber (line 6) | pub fn Subscriber() -> Html {
FILE: examples/counter/src/main.rs
type Msg (line 6) | pub enum Msg {
type App (line 11) | pub struct App {
type Message (line 16) | type Message = Msg;
type Properties (line 17) | type Properties = ();
method create (line 19) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 23) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 38) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 74) | fn main() {
FILE: examples/counter_functional/src/main.rs
function App (line 4) | fn App() -> Html {
function main (line 26) | fn main() {
FILE: examples/dyn_create_destroy_apps/src/counter.rs
type CounterModel (line 5) | pub struct CounterModel {
type CounterProps (line 11) | pub struct CounterProps {
type CounterMessage (line 15) | pub enum CounterMessage {
type Message (line 20) | type Message = CounterMessage;
type Properties (line 21) | type Properties = CounterProps;
method create (line 23) | fn create(ctx: &Context<Self>) -> Self {
method update (line 33) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 43) | fn view(&self, ctx: &Context<Self>) -> Html {
method destroy (line 63) | fn destroy(&mut self, _ctx: &Context<Self>) {
FILE: examples/dyn_create_destroy_apps/src/main.rs
type Msg (line 11) | pub enum Msg {
type App (line 18) | pub struct App {
type Message (line 25) | type Message = Msg;
type Properties (line 26) | type Properties = ();
method create (line 28) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 35) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 88) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 110) | fn main() {
FILE: examples/file_upload/src/main.rs
type FileDetails (line 11) | pub struct FileDetails {
type Msg (line 17) | pub enum Msg {
type App (line 22) | pub struct App {
method view_file (line 108) | fn view_file(file: &FileDetails) -> Html {
type Message (line 28) | type Message = Msg;
type Properties (line 29) | type Properties = ();
method create (line 31) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 38) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 67) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 127) | fn main() {
FILE: examples/function_delayed_input/src/main.rs
function App (line 9) | fn App() -> Html {
function main (line 84) | fn main() {
FILE: examples/function_memory_game/src/components/app.rs
function App (line 15) | pub fn App() -> Html {
FILE: examples/function_memory_game/src/components/chessboard.rs
type Props (line 8) | pub struct Props {
function Chessboard (line 13) | pub fn Chessboard(props: &Props) -> Html {
FILE: examples/function_memory_game/src/components/chessboard_card.rs
type Props (line 9) | pub struct Props {
function ChessboardCard (line 15) | pub fn ChessboardCard(props: &Props) -> Html {
FILE: examples/function_memory_game/src/components/game_status_board.rs
type Props (line 7) | pub struct Props {
function GameStatusBoard (line 14) | pub fn GameStatusBoard(props: &Props) -> Html {
FILE: examples/function_memory_game/src/components/score_board.rs
type Props (line 8) | pub struct Props {
function ScoreBoard (line 14) | pub fn ScoreBoard(props: &Props) -> Html {
FILE: examples/function_memory_game/src/components/score_board_best_score.rs
type Props (line 4) | pub struct Props {
function BestScore (line 9) | pub fn BestScore(props: &Props) -> Html {
FILE: examples/function_memory_game/src/components/score_board_logo.rs
function Logo (line 4) | pub fn Logo() -> Html {
FILE: examples/function_memory_game/src/components/score_board_progress.rs
type Props (line 4) | pub struct Props {
function GameProgress (line 9) | pub fn GameProgress(props: &Props) -> Html {
FILE: examples/function_memory_game/src/constant.rs
constant KEY_BEST_SCORE (line 4) | pub const KEY_BEST_SCORE: &str = "memory.game.best.score";
type CardName (line 7) | pub enum CardName {
type Status (line 19) | pub enum Status {
constant RAW_CARDS (line 25) | pub const RAW_CARDS: [CardName; 16] = [
FILE: examples/function_memory_game/src/helper.rs
function shuffle_cards (line 8) | pub fn shuffle_cards() -> Vec<Card> {
FILE: examples/function_memory_game/src/main.rs
function main (line 8) | fn main() {
FILE: examples/function_memory_game/src/state.rs
type RawCard (line 11) | pub struct RawCard {
type Card (line 17) | pub struct Card {
type State (line 24) | pub struct State {
method reset (line 146) | pub fn reset() -> State {
function eq (line 34) | fn eq(&self, other: &RawCard) -> bool {
type Action (line 39) | pub enum Action {
type Action (line 47) | type Action = Action;
method reduce (line 49) | fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
FILE: examples/function_router/src/app.rs
function route_meta (line 15) | pub fn route_meta(route: &Route) -> (&'static str, &'static str) {
type Route (line 27) | pub enum Route {
function App (line 44) | pub fn App() -> Html {
type ServerAppProps (line 65) | pub struct ServerAppProps {
function ServerApp (line 71) | pub fn ServerApp(props: &ServerAppProps) -> Html {
function switch (line 96) | fn switch(routes: Route) -> Html {
FILE: examples/function_router/src/bin/function_router.rs
function main (line 3) | fn main() {
FILE: examples/function_router/src/components/author_card.rs
type Props (line 11) | pub struct Props {
type AuthorState (line 16) | pub struct AuthorState {
type Action (line 21) | type Action = u32;
method reduce (line 23) | fn reduce(self: Rc<Self>, action: u32) -> Rc<Self> {
function AuthorCard (line 32) | pub fn AuthorCard(props: &Props) -> Html {
FILE: examples/function_router/src/components/nav.rs
function Nav (line 7) | pub fn Nav() -> Html {
FILE: examples/function_router/src/components/pagination.rs
constant ELLIPSIS (line 9) | const ELLIPSIS: &str = "\u{02026}";
type PageQuery (line 12) | pub struct PageQuery {
type Props (line 17) | pub struct Props {
function RelNavButtons (line 24) | pub fn RelNavButtons(props: &Props) -> Html {
type RenderLinksProps (line 54) | pub struct RenderLinksProps {
function RenderLinks (line 62) | pub fn RenderLinks(props: &RenderLinksProps) -> Html {
type RenderLinkProps (line 96) | pub struct RenderLinkProps {
function RenderLink (line 102) | pub fn RenderLink(props: &RenderLinkProps) -> Html {
function Links (line 127) | pub fn Links(props: &Props) -> Html {
function Pagination (line 152) | pub fn Pagination(props: &Props) -> Html {
FILE: examples/function_router/src/components/post_card.rs
type Props (line 11) | pub struct Props {
type PostMetaState (line 16) | pub struct PostMetaState {
type Action (line 21) | type Action = u32;
method reduce (line 23) | fn reduce(self: Rc<Self>, action: u32) -> Rc<Self> {
function PostCard (line 32) | pub fn PostCard(props: &Props) -> Html {
FILE: examples/function_router/src/components/progress_delay.rs
constant RESOLUTION (line 7) | const RESOLUTION: u32 = 500;
constant MIN_INTERVAL_MS (line 8) | const MIN_INTERVAL_MS: u32 = 50;
type ValueAction (line 10) | pub enum ValueAction {
type ValueState (line 16) | pub struct ValueState {
type Action (line 25) | type Action = ValueAction;
method reduce (line 27) | fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
type Props (line 61) | pub struct Props {
function ProgressDelay (line 69) | pub fn ProgressDelay(props: &Props) -> Html {
FILE: examples/function_router/src/content.rs
type Author (line 4) | pub struct Author {
method generate (line 12) | fn generate(gen: &mut Generator) -> Self {
type PostMeta (line 26) | pub struct PostMeta {
method generate (line 35) | fn generate(gen: &mut Generator) -> Self {
type Post (line 52) | pub struct Post {
method generate (line 58) | fn generate(gen: &mut Generator) -> Self {
type PostPart (line 72) | pub enum PostPart {
method generate (line 78) | fn generate(gen: &mut Generator) -> Self {
type Section (line 91) | pub struct Section {
method generate (line 98) | fn generate(gen: &mut Generator) -> Self {
type Quote (line 116) | pub struct Quote {
method generate (line 122) | fn generate(gen: &mut Generator) -> Self {
FILE: examples/function_router/src/generator.rs
constant KEYWORDS (line 9) | const KEYWORDS: &str = include_str!("../data/keywords.txt");
constant SYLLABLES (line 10) | const SYLLABLES: &str = include_str!("../data/syllables.txt");
constant YEW_CONTENT (line 11) | const YEW_CONTENT: &str = include_str!("../data/yew.txt");
type Generator (line 19) | pub struct Generator {
method from_seed (line 24) | pub fn from_seed(seed: u32) -> Self {
method new_seed (line 31) | pub fn new_seed(&mut self) -> u32 {
method range (line 36) | pub fn range(&mut self, low: u32, high: u32) -> u32 {
method chance (line 41) | pub fn chance(&mut self, n: u32, d: u32) -> bool {
method image_url (line 45) | pub fn image_url(&mut self, dimension: (u32, u32), _keywords: &[String...
method face_image_url (line 51) | pub fn face_image_url(&mut self, dimension: (u32, u32)) -> String {
method human_name (line 57) | pub fn human_name(&mut self) -> String {
method keywords (line 76) | pub fn keywords(&mut self) -> Vec<String> {
method title (line 87) | pub fn title(&mut self) -> String {
method sentence (line 117) | pub fn sentence(&mut self) -> String {
method paragraph (line 125) | pub fn paragraph(&mut self) -> String {
function join_words (line 142) | fn join_words<'a>(words: impl Iterator<Item = &'a str>) -> String {
function title_case (line 160) | fn title_case(word: &str) -> String {
type Generated (line 172) | pub trait Generated: Sized {
method generate (line 173) | fn generate(gen: &mut Generator) -> Self;
method generate_from_seed (line 174) | fn generate_from_seed(seed: u32) -> Self {
FILE: examples/function_router/src/imagegen.rs
type ImageCache (line 7) | type ImageCache = Mutex<HashMap<(u32, u32, u32), String>>;
type Palette (line 13) | struct Palette {
constant PALETTES (line 20) | const PALETTES: &[Palette] = &[
function palette_color (line 58) | fn palette_color(pal: &Palette, t: f64) -> [u8; 3] {
function hash (line 68) | fn hash(mut x: i32, mut y: i32, seed: u32) -> u32 {
function grad (line 80) | fn grad(hash: u32, dx: f64, dy: f64) -> f64 {
function lerp (line 89) | fn lerp(a: f64, b: f64, t: f64) -> f64 {
function fade (line 93) | fn fade(t: f64) -> f64 {
function noise2d (line 97) | fn noise2d(x: f64, y: f64, seed: u32) -> f64 {
function fbm (line 113) | fn fbm(x: f64, y: f64, seed: u32, octaves: u32) -> f64 {
function warped_fbm (line 125) | fn warped_fbm(x: f64, y: f64, seed: u32, warp: f64, octaves: u32) -> f64 {
function generate_image (line 134) | pub fn generate_image(width: u32, height: u32, seed: u32) -> ImageBuffer...
function generate_png (line 154) | pub fn generate_png(width: u32, height: u32, seed: u32) -> Vec<u8> {
function generate_data_url (line 164) | pub fn generate_data_url(width: u32, height: u32, seed: u32) -> String {
function base64_encode (line 190) | fn base64_encode(data: &[u8]) -> String {
FILE: examples/function_router/src/pages/author.rs
type Props (line 8) | pub struct Props {
function Author (line 13) | pub fn Author(props: &Props) -> Html {
FILE: examples/function_router/src/pages/author_list.rs
constant CAROUSEL_DELAY_MS (line 8) | const CAROUSEL_DELAY_MS: u32 = 15000;
function AuthorList (line 11) | pub fn AuthorList() -> Html {
function random_author_seeds (line 61) | fn random_author_seeds() -> Vec<u32> {
FILE: examples/function_router/src/pages/home.rs
function InfoTiles (line 4) | fn InfoTiles() -> Html {
function Home (line 46) | pub fn Home() -> Html {
FILE: examples/function_router/src/pages/page_not_found.rs
function PageNotFound (line 4) | pub fn PageNotFound() -> Html {
FILE: examples/function_router/src/pages/post.rs
type Props (line 11) | pub struct Props {
type PostState (line 16) | pub struct PostState {
type Action (line 21) | type Action = u32;
method reduce (line 23) | fn reduce(self: Rc<Self>, action: u32) -> Rc<Self> {
function Post (line 32) | pub fn Post(props: &Props) -> Html {
FILE: examples/function_router/src/pages/post_list.rs
constant ITEMS_PER_PAGE (line 8) | const ITEMS_PER_PAGE: u32 = 10;
constant TOTAL_PAGES (line 9) | const TOTAL_PAGES: u32 = u32::MAX / ITEMS_PER_PAGE;
function PostList (line 12) | pub fn PostList() -> Html {
FILE: examples/function_todomvc/src/components/entry.rs
type EntryProps (line 9) | pub struct EntryProps {
function entry (line 17) | pub fn entry(props: &EntryProps) -> Html {
type EntryEditProps (line 80) | pub struct EntryEditProps {
function entry_edit (line 87) | pub fn entry_edit(props: &EntryEditProps) -> Html {
FILE: examples/function_todomvc/src/components/filter.rs
type FilterProps (line 6) | pub struct FilterProps {
function Filter (line 13) | pub fn Filter(props: &FilterProps) -> Html {
FILE: examples/function_todomvc/src/components/header_input.rs
type HeaderInputProps (line 6) | pub struct HeaderInputProps {
function header_input (line 11) | pub fn header_input(props: &HeaderInputProps) -> Html {
FILE: examples/function_todomvc/src/components/info_footer.rs
function info_footer (line 4) | pub fn info_footer() -> Html {
FILE: examples/function_todomvc/src/hooks/use_bool_toggle.rs
type UseBoolToggleHandle (line 7) | pub struct UseBoolToggleHandle {
method toggle (line 13) | pub fn toggle(self) {
type Target (line 19) | type Target = bool;
method deref (line 21) | fn deref(&self) -> &Self::Target {
function use_bool_toggle (line 52) | pub fn use_bool_toggle(default: bool) -> UseBoolToggleHandle {
FILE: examples/function_todomvc/src/main.rs
constant KEY (line 15) | const KEY: &str = "yew.functiontodomvc.self";
function app (line 18) | fn app() -> Html {
function main (line 118) | fn main() {
FILE: examples/function_todomvc/src/state.rs
type State (line 9) | pub struct State {
type Entry (line 15) | pub struct Entry {
type Filter (line 22) | pub enum Filter {
method fits (line 29) | pub fn fits(&self, entry: &Entry) -> bool {
method as_href (line 37) | pub fn as_href(&self) -> &'static str {
method into_prop_value (line 47) | fn into_prop_value(self) -> Html {
type Action (line 52) | pub enum Action {
type Action (line 63) | type Action = Action;
method reduce (line 65) | fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
FILE: examples/futures/src/main.rs
constant MARKDOWN_URL (line 12) | const MARKDOWN_URL: &str = "https://raw.githubusercontent.com/yewstack/y...
constant INCORRECT_URL (line 13) | const INCORRECT_URL: &str = "https://raw.githubusercontent.com/yewstack/...
type FetchError (line 17) | pub struct FetchError {
method from (line 28) | fn from(value: JsValue) -> Self {
method fmt (line 21) | fn fmt(&self, f: &mut Formatter) -> fmt::Result {
type FetchState (line 34) | pub enum FetchState<T> {
function fetch_markdown (line 45) | async fn fetch_markdown(url: &'static str) -> Result<String, FetchError> {
type Msg (line 60) | enum Msg {
type App (line 65) | struct App {
type Message (line 70) | type Message = Msg;
type Properties (line 71) | type Properties = ();
method create (line 73) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 79) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 110) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 129) | fn main() {
FILE: examples/futures/src/markdown.rs
type TableContext (line 7) | struct TableContext {
type TagWriter (line 14) | struct TagWriter {
method new (line 21) | fn new() -> Self {
method finish (line 29) | fn finish(mut self) -> VNode {
method add_child (line 41) | fn add_child(&mut self, child: VNode) {
method pop_spine (line 49) | fn pop_spine(&mut self) {
method get_table_ctx (line 54) | fn get_table_ctx(&mut self) -> &mut TableContext {
method open_table_ctx (line 58) | fn open_table_ctx(&mut self, alignment: Vec<Alignment>) {
method close_table_ctx (line 68) | fn close_table_ctx(&mut self) -> TableContext {
method start_tag (line 72) | fn start_tag(&mut self, tag: Tag) {
method end_tag (line 212) | fn end_tag(&mut self, tag: TagEnd) {
method write_event (line 232) | fn write_event(&mut self, ev: Event) {
function render_markdown (line 247) | pub fn render_markdown(src: &str) -> Html {
FILE: examples/game_of_life/src/conway.rs
type Conway (line 3) | pub struct Conway {
method new (line 10) | pub fn new(width: usize, height: usize) -> Self {
method alive (line 18) | pub fn alive(&self, row: usize, col: usize) -> bool {
method toggle (line 22) | pub fn toggle(&mut self, row: usize, col: usize) {
method random_mutate (line 27) | pub fn random_mutate(&mut self) {
method reset (line 32) | pub fn reset(&mut self) {
method step (line 36) | pub fn step(&mut self) {
method live_neighbours (line 52) | fn live_neighbours(&self, row: isize, col: isize) -> usize {
method row_col_as_idx (line 60) | fn row_col_as_idx(&self, row: isize, col: isize) -> usize {
function wrap (line 67) | fn wrap(idx: isize, range: isize) -> usize {
FILE: examples/game_of_life/src/main.rs
type Msg (line 7) | pub enum Msg {
type App (line 17) | pub struct App {
method view_cellule (line 24) | fn view_cellule(&self, row: usize, col: usize, link: &Scope<Self>) -> ...
type Message (line 39) | type Message = Msg;
type Properties (line 40) | type Properties = ();
method create (line 42) | fn create(ctx: &Context<Self>) -> Self {
method update (line 52) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 88) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 137) | fn main() {
FILE: examples/immutable/src/array.rs
type FolksViewProps (line 7) | struct FolksViewProps {
function folks_view (line 12) | fn folks_view(props: &FolksViewProps) -> Html {
function array_example (line 24) | pub fn array_example() -> Html {
FILE: examples/immutable/src/main.rs
function App (line 12) | fn App() -> Html {
function main (line 27) | fn main() {
FILE: examples/immutable/src/map.rs
type DisplayProps (line 7) | struct DisplayProps {
function Display (line 12) | fn Display(props: &DisplayProps) -> Html {
type MapExample (line 23) | pub struct MapExample {
type MapExampleMessage (line 27) | pub enum MapExampleMessage {
type Message (line 33) | type Message = MapExampleMessage;
type Properties (line 34) | type Properties = ();
method create (line 36) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 42) | fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool {
method view (line 60) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/immutable/src/string.rs
type DisplayProps (line 7) | struct DisplayProps {
function Display (line 12) | fn Display(props: &DisplayProps) -> Html {
type StringExample (line 18) | pub struct StringExample {
type StringExampleMessage (line 22) | pub enum StringExampleMessage {
type Message (line 27) | type Message = StringExampleMessage;
type Properties (line 28) | type Properties = ();
method create (line 30) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 36) | fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool {
method view (line 45) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/inner_html/src/main.rs
constant HTML (line 3) | const HTML: &str = include_str!("document.html");
type App (line 5) | pub struct App;
type Message (line 8) | type Message = ();
type Properties (line 9) | type Properties = ();
method create (line 11) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 15) | fn view(&self, _ctx: &Context<Self>) -> Html {
function main (line 20) | fn main() {
FILE: examples/js_callback/js/imp.js
function hello (line 1) | function hello() {
FILE: examples/js_callback/js/unimp.js
function bye (line 1) | function bye() {
FILE: examples/js_callback/src/bindings.rs
function import (line 9) | pub fn import(name: &str) -> js_sys::Promise;
function wasm_bindgen_snippets_path (line 14) | pub fn wasm_bindgen_snippets_path(this: &Window) -> String;
function hello (line 20) | pub fn hello() -> String;
function bye (line 28) | pub fn bye(this: &UnimpModule) -> String;
function _dummy_fn_so_wasm_bindgen_copies_over_the_file (line 36) | fn _dummy_fn_so_wasm_bindgen_copies_over_the_file();
FILE: examples/js_callback/src/main.rs
function Important (line 14) | fn Important() -> Html {
function use_do_bye (line 25) | fn use_do_bye() -> SuspensionResult<String> {
function UnImportant (line 40) | fn UnImportant() -> HtmlResult {
function App (line 51) | fn App() -> Html {
function main (line 72) | fn main() {
FILE: examples/js_callback/trunk_post_build.rs
function read_env (line 4) | fn read_env(env: &'static str) -> String {
function main (line 8) | fn main() {
FILE: examples/keyed_list/src/main.rs
type Msg (line 12) | pub enum Msg {
type App (line 27) | pub struct App {
method action_view (line 162) | fn action_view(&self, link: &Scope<Self>) -> Html {
method button_view (line 184) | fn button_view(&self, link: &Scope<Self>) -> Html {
method info_view (line 265) | fn info_view(&self) -> Html {
type Message (line 37) | type Message = Msg;
type Properties (line 38) | type Properties = ();
method create (line 40) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 51) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method rendered (line 133) | fn rendered(&mut self, _ctx: &Context<Self>, _first_render: bool) {
method view (line 142) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 288) | fn main() {
FILE: examples/keyed_list/src/person.rs
type PersonInfo (line 12) | pub struct PersonInfo {
method new_random (line 19) | pub fn new_random(id: usize) -> Self {
method render (line 37) | fn render(&self) -> Html {
type PersonProps (line 51) | pub struct PersonProps {
type PersonComponent (line 55) | pub struct PersonComponent;
type Message (line 58) | type Message = ();
type Properties (line 59) | type Properties = PersonProps;
method create (line 61) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 65) | fn view(&self, ctx: &Context<Self>) -> Html {
type PersonType (line 74) | pub enum PersonType {
method info (line 79) | pub fn info(&self) -> &PersonInfo {
method new_random (line 86) | pub fn new_random(id: usize, ratio: f64) -> Self {
method render (line 95) | pub fn render(&self, keyed: bool) -> Html {
FILE: examples/keyed_list/src/random.rs
function chance (line 5) | pub fn chance(p: f64) -> bool {
function range_exclusive (line 11) | pub fn range_exclusive(min: usize, max: usize) -> usize {
function choose_two_distinct_mut (line 15) | pub fn choose_two_distinct_mut<T>(items: &mut [T]) -> Option<(&mut T, &m...
FILE: examples/mount_point/src/main.rs
type Msg (line 7) | pub enum Msg {
type App (line 11) | pub struct App {
type Message (line 16) | type Message = Msg;
type Properties (line 17) | type Properties = ();
method create (line 19) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 25) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 34) | fn view(&self, ctx: &Context<Self>) -> Html {
function create_canvas (line 50) | fn create_canvas(document: &Document) -> HtmlCanvasElement {
function main (line 62) | fn main() {
FILE: examples/nested_list/src/app.rs
type Msg (line 10) | pub enum Msg {
type App (line 14) | pub struct App {
method view_last_hovered (line 103) | fn view_last_hovered(&self) -> Html {
type Message (line 21) | type Message = Msg;
type Properties (line 22) | type Properties = ();
method create (line 24) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 32) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 41) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/nested_list/src/header.rs
type Props (line 7) | pub struct Props {
type ListHeader (line 13) | pub struct ListHeader;
type Message (line 16) | type Message = ();
type Properties (line 17) | type Properties = Props;
method create (line 19) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 23) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/nested_list/src/item.rs
type Props (line 6) | pub struct Props {
type ListItem (line 15) | pub struct ListItem;
method view_details (line 43) | fn view_details(children: &Children) -> Html {
type Message (line 18) | type Message = ();
type Properties (line 19) | type Properties = Props;
method create (line 21) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 25) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/nested_list/src/list.rs
type Msg (line 9) | pub enum Msg {
type Props (line 14) | pub struct Props {
type List (line 24) | pub struct List {
method view_items (line 69) | fn view_items(children: &IArray<VChild<ListItem>>) -> Html {
type Message (line 29) | type Message = Msg;
type Properties (line 30) | type Properties = Props;
method create (line 32) | fn create(ctx: &Context<Self>) -> Self {
method update (line 40) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 49) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/nested_list/src/main.rs
type WeakComponentLink (line 14) | pub struct WeakComponentLink<COMP: Component>(Rc<RefCell<Option<Scope<CO...
method clone (line 17) | fn clone(&self) -> Self {
method default (line 24) | fn default() -> Self {
type Target (line 30) | type Target = Rc<RefCell<Option<Scope<COMP>>>>;
method deref (line 32) | fn deref(&self) -> &Self::Target {
method eq (line 38) | fn eq(&self, other: &Self) -> bool {
type Hovered (line 44) | pub enum Hovered {
method fmt (line 52) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function into_prop_value (line 67) | fn into_prop_value(self) -> Html {
function main (line 72) | fn main() {
FILE: examples/node_refs/src/input.rs
type Msg (line 3) | pub enum Msg {
type Props (line 8) | pub struct Props {
type InputComponent (line 14) | pub struct InputComponent;
type Message (line 17) | type Message = Msg;
type Properties (line 18) | type Properties = Props;
method create (line 20) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 24) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 33) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/node_refs/src/main.rs
type Msg (line 7) | pub enum Msg {
type App (line 12) | pub struct App {
method apply_focus (line 19) | fn apply_focus(&self) {
type Message (line 26) | type Message = Msg;
type Properties (line 27) | type Properties = ();
method create (line 29) | fn create(_ctx: &Context<Self>) -> Self {
method rendered (line 38) | fn rendered(&mut self, _ctx: &Context<Self>, first_render: bool) {
method update (line 44) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 72) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 117) | fn main() {
FILE: examples/password_strength/src/app.rs
type Msg (line 9) | pub enum Msg {
type App (line 15) | pub struct App {
method get_estimate (line 20) | fn get_estimate(&self) -> u8 {
method redout_top_row_text (line 25) | fn redout_top_row_text(&self) -> String {
type Message (line 41) | type Message = Msg;
type Properties (line 42) | type Properties = ();
method create (line 44) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 48) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 56) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/password_strength/src/main.rs
function main (line 10) | fn main() {
FILE: examples/password_strength/src/password.rs
constant PASSWORD_LEN (line 1) | const PASSWORD_LEN: i32 = 17;
function generate_password (line 3) | pub fn generate_password() -> String {
FILE: examples/password_strength/src/text_input.rs
type Props (line 6) | pub struct Props {
function get_value_from_input_event (line 11) | fn get_value_from_input_event(e: InputEvent) -> String {
function text_input (line 21) | pub fn text_input(props: &Props) -> Html {
FILE: examples/portals/src/main.rs
type ShadowDOMProps (line 6) | pub struct ShadowDOMProps {
type ShadowDOMHost (line 11) | pub struct ShadowDOMHost {
type Message (line 17) | type Message = ();
type Properties (line 18) | type Properties = ShadowDOMProps;
method create (line 20) | fn create(_: &Context<Self>) -> Self {
method rendered (line 27) | fn rendered(&mut self, ctx: &Context<Self>, first_render: bool) {
method update (line 47) | fn update(&mut self, _: &Context<Self>, _: Self::Message) -> bool {
method view (line 51) | fn view(&self, ctx: &Context<Self>) -> Html {
type App (line 65) | pub struct App {
type AppMessage (line 71) | pub enum AppMessage {
type Message (line 76) | type Message = AppMessage;
type Properties (line 77) | type Properties = ();
method create (line 79) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 101) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 108) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 138) | fn main() {
FILE: examples/router/src/components/author_card.rs
type Props (line 9) | pub struct Props {
type AuthorCard (line 13) | pub struct AuthorCard {
type Message (line 17) | type Message = ();
type Properties (line 18) | type Properties = Props;
method create (line 20) | fn create(ctx: &Context<Self>) -> Self {
method changed (line 26) | fn changed(&mut self, ctx: &Context<Self>, _old_props: &Self::Properties...
method view (line 31) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/components/pagination.rs
constant ELLIPSIS (line 7) | const ELLIPSIS: &str = "\u{02026}";
type PageQuery (line 10) | pub struct PageQuery {
type Props (line 15) | pub struct Props {
type Pagination (line 21) | pub struct Pagination;
method render_link (line 43) | fn render_link(&self, to_page: u64, props: &Props) -> Html {
method render_links (line 65) | fn render_links<P>(&self, mut pages: P, len: usize, max_links: usize, ...
method view_links (line 91) | fn view_links(&self, props: &Props) -> Html {
method view_relnav_buttons (line 115) | fn view_relnav_buttons(&self, props: &Props) -> Html {
type Message (line 24) | type Message = ();
type Properties (line 25) | type Properties = Props;
method create (line 27) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 31) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/router/src/components/post_card.rs
type Props (line 9) | pub struct Props {
type PostCard (line 13) | pub struct PostCard {
type Message (line 17) | type Message = ();
type Properties (line 18) | type Properties = Props;
method create (line 20) | fn create(ctx: &Context<Self>) -> Self {
method changed (line 26) | fn changed(&mut self, ctx: &Context<Self>, _old_props: &Self::Properties...
method view (line 31) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/components/progress_delay.rs
constant RESOLUTION (line 5) | const RESOLUTION: u64 = 500;
constant MIN_INTERVAL_MS (line 6) | const MIN_INTERVAL_MS: u64 = 50;
type Msg (line 8) | pub enum Msg {
type Props (line 13) | pub struct Props {
type ProgressDelay (line 20) | pub struct ProgressDelay {
type Message (line 26) | type Message = Msg;
type Properties (line 27) | type Properties = Props;
method create (line 29) | fn create(ctx: &Context<Self>) -> Self {
method update (line 40) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 58) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/content.rs
type Author (line 4) | pub struct Author {
method generate (line 11) | fn generate(gen: &mut Generator) -> Self {
type PostMeta (line 25) | pub struct PostMeta {
method generate (line 33) | fn generate(gen: &mut Generator) -> Self {
type Post (line 50) | pub struct Post {
method generate (line 55) | fn generate(gen: &mut Generator) -> Self {
type PostPart (line 69) | pub enum PostPart {
method generate (line 74) | fn generate(gen: &mut Generator) -> Self {
type Section (line 87) | pub struct Section {
method generate (line 93) | fn generate(gen: &mut Generator) -> Self {
type Quote (line 111) | pub struct Quote {
method generate (line 116) | fn generate(gen: &mut Generator) -> Self {
FILE: examples/router/src/generator.rs
constant KEYWORDS (line 9) | const KEYWORDS: &str = include_str!("../data/keywords.txt");
constant SYLLABLES (line 10) | const SYLLABLES: &str = include_str!("../data/syllables.txt");
constant YEW_CONTENT (line 11) | const YEW_CONTENT: &str = include_str!("../data/yew.txt");
type Generator (line 19) | pub struct Generator {
method from_seed (line 24) | pub fn from_seed(seed: u64) -> Self {
method new_seed (line 31) | pub fn new_seed(&mut self) -> u64 {
method range (line 36) | pub fn range(&mut self, low: usize, high: usize) -> usize {
method chance (line 41) | pub fn chance(&mut self, n: u32, d: u32) -> bool {
method image_url (line 45) | pub fn image_url(&mut self, dimension: (usize, usize), _keywords: &[St...
method face_image_url (line 51) | pub fn face_image_url(&mut self, dimension: (usize, usize)) -> String {
method human_name (line 57) | pub fn human_name(&mut self) -> String {
method keywords (line 76) | pub fn keywords(&mut self) -> Vec<String> {
method title (line 87) | pub fn title(&mut self) -> String {
method sentence (line 116) | pub fn sentence(&mut self) -> String {
method paragraph (line 124) | pub fn paragraph(&mut self) -> String {
function join_words (line 141) | fn join_words<'a>(words: impl Iterator<Item = &'a str>) -> String {
function title_case (line 159) | fn title_case(word: &str) -> String {
type Generated (line 171) | pub trait Generated: Sized {
method generate (line 172) | fn generate(gen: &mut Generator) -> Self;
method generate_from_seed (line 173) | fn generate_from_seed(seed: u64) -> Self {
FILE: examples/router/src/main.rs
type Route (line 17) | pub enum Route {
type Msg (line 33) | pub enum Msg {
type App (line 37) | pub struct App {
method view_nav (line 80) | fn view_nav(&self, link: &Scope<Self>) -> Html {
type Message (line 41) | type Message = Msg;
type Properties (line 42) | type Properties = ();
method create (line 44) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 50) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 59) | fn view(&self, ctx: &Context<Self>) -> Html {
function switch (line 125) | fn switch(routes: Route) -> Html {
function main (line 148) | fn main() {
FILE: examples/router/src/pages/author.rs
type Props (line 7) | pub struct Props {
type Author (line 11) | pub struct Author {
type Message (line 15) | type Message = ();
type Properties (line 16) | type Properties = Props;
method create (line 18) | fn create(ctx: &Context<Self>) -> Self {
method changed (line 24) | fn changed(&mut self, ctx: &Context<Self>, _old_props: &Self::Properties...
method view (line 29) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/pages/author_list.rs
constant CAROUSEL_DELAY_MS (line 8) | const CAROUSEL_DELAY_MS: u64 = 15000;
type Msg (line 10) | pub enum Msg {
type AuthorList (line 14) | pub struct AuthorList {
type Message (line 18) | type Message = Msg;
type Properties (line 19) | type Properties = ();
method create (line 21) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 27) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 36) | fn view(&self, ctx: &Context<Self>) -> Html {
function random_author_seeds (line 77) | fn random_author_seeds() -> Vec<u64> {
FILE: examples/router/src/pages/home.rs
type Home (line 3) | pub struct Home;
method view_info_tiles (line 36) | fn view_info_tiles(&self) -> Html {
type Message (line 5) | type Message = ();
type Properties (line 6) | type Properties = ();
method create (line 8) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 12) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/pages/page_not_found.rs
type PageNotFound (line 3) | pub struct PageNotFound;
type Message (line 6) | type Message = ();
type Properties (line 7) | type Properties = ();
method create (line 9) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 13) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/pages/post.rs
type Props (line 9) | pub struct Props {
type Post (line 13) | pub struct Post {
method render_quote (line 69) | fn render_quote(&self, quote: &content::Quote) -> Html {
method render_section_hero (line 91) | fn render_section_hero(&self, section: &content::Section) -> Html {
method render_section (line 104) | fn render_section(&self, section: &content::Section, show_hero: bool) ...
method view_content (line 123) | fn view_content(&self) -> Html {
type Message (line 17) | type Message = ();
type Properties (line 18) | type Properties = Props;
method create (line 20) | fn create(ctx: &Context<Self>) -> Self {
method changed (line 26) | fn changed(&mut self, ctx: &Context<Self>, _old_props: &Self::Properties...
method view (line 31) | fn view(&self, _ctx: &Context<Self>) -> Html {
FILE: examples/router/src/pages/post_list.rs
constant ITEMS_PER_PAGE (line 8) | const ITEMS_PER_PAGE: u64 = 10;
constant TOTAL_PAGES (line 9) | const TOTAL_PAGES: u64 = u64::MAX / ITEMS_PER_PAGE;
type Msg (line 11) | pub enum Msg {
type PostList (line 15) | pub struct PostList {
method view_posts (line 68) | fn view_posts(&self, _ctx: &Context<Self>) -> Html {
function current_page (line 20) | fn current_page(ctx: &Context<PostList>) -> u64 {
type Message (line 27) | type Message = Msg;
type Properties (line 28) | type Properties = ();
method create (line 30) | fn create(ctx: &Context<Self>) -> Self {
method update (line 43) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 50) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/simple_ssr/src/bin/simple_ssr_hydrate.rs
function main (line 3) | fn main() {
FILE: examples/simple_ssr/src/bin/simple_ssr_server.rs
type Opt (line 11) | struct Opt {
function render (line 17) | async fn render(
function main (line 29) | async fn main() {
FILE: examples/simple_ssr/src/lib.rs
type UuidResponse (line 6) | struct UuidResponse {
function fetch_uuid (line 11) | async fn fetch_uuid() -> Uuid {
function Content (line 20) | fn Content() -> HtmlResult {
function App (line 29) | pub fn App() -> Html {
FILE: examples/simple_ssr/tests/e2e.rs
constant SERVER_BASE (line 9) | const SERVER_BASE: &str = "http://127.0.0.1:8080";
function hydration_succeeds (line 12) | async fn hydration_succeeds() {
FILE: examples/ssr_router/src/bin/ssr_router_hydrate.rs
function main (line 3) | fn main() {
FILE: examples/ssr_router/src/bin/ssr_router_server.rs
type Opt (line 34) | struct Opt {
function head_tags_for (line 40) | fn head_tags_for(path: &str) -> String {
function render (line 49) | async fn render(
type Executor (line 79) | struct Executor {
method execute (line 87) | fn execute(&self, fut: F) {
function main (line 95) | async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
FILE: examples/ssr_router/tests/e2e.rs
constant SERVER_BASE (line 13) | const SERVER_BASE: &str = "http://127.0.0.1:8080";
function get_title_text (line 15) | fn get_title_text() -> Option<String> {
function hydrate_post_page (line 24) | async fn hydrate_post_page() {
function hydrate_posts_list (line 43) | async fn hydrate_posts_list() {
function hydrate_home (line 62) | async fn hydrate_home() {
FILE: examples/suspense/src/main.rs
type PleaseWaitProps (line 10) | struct PleaseWaitProps {
function please_wait (line 15) | fn please_wait(props: &PleaseWaitProps) -> Html {
function app_content (line 20) | fn app_content() -> HtmlResult {
function app (line 49) | fn app() -> Html {
function main (line 71) | fn main() {
FILE: examples/suspense/src/struct_consumer.rs
function WithSleep (line 7) | pub fn WithSleep<Comp>() -> HtmlResult
type AppContentProps (line 17) | pub struct AppContentProps {
type AppContent (line 21) | pub type AppContent = WithSleep<BaseAppContent>;
type Msg (line 23) | pub enum Msg {
type BaseAppContent (line 28) | pub struct BaseAppContent {
type Message (line 33) | type Message = Msg;
type Properties (line 34) | type Properties = AppContentProps;
method create (line 36) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 42) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 54) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: examples/suspense/src/use_sleep.rs
type SleepState (line 9) | pub struct SleepState {
method new (line 14) | fn new() -> Self {
type Action (line 24) | type Action = ();
method reduce (line 26) | fn reduce(self: Rc<Self>, _action: Self::Action) -> Rc<Self> {
function use_sleep (line 32) | pub fn use_sleep() -> SuspensionResult<Rc<dyn Fn()>> {
FILE: examples/timer/src/main.rs
type Msg (line 5) | pub enum Msg {
type App (line 14) | pub struct App {
method get_current_time (line 24) | fn get_current_time() -> String {
method cancel (line 29) | fn cancel(&mut self) {
method log (line 151) | fn log(&mut self, message: impl Into<AttrValue>) {
type Message (line 36) | type Message = Msg;
type Properties (line 37) | type Properties = ();
method create (line 39) | fn create(ctx: &Context<Self>) -> Self {
method update (line 58) | fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 122) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 156) | fn main() {
FILE: examples/timer_functional/src/main.rs
function get_current_time (line 6) | fn get_current_time() -> String {
type TimerAction (line 11) | enum TimerAction {
type TimerState (line 20) | struct TimerState {
type Messages (line 27) | struct Messages(Vec<AttrValue>);
method log (line 30) | fn log(&mut self, message: impl Into<AttrValue>) {
type Target (line 36) | type Target = Vec<AttrValue>;
method deref (line 38) | fn deref(&self) -> &Self::Target {
method from_iter (line 44) | fn from_iter<T: IntoIterator<Item = &'static str>>(it: T) -> Self {
method eq (line 50) | fn eq(&self, other: &Self) -> bool {
type Action (line 57) | type Action = TimerAction;
method reduce (line 59) | fn reduce(self: Rc<Self>, action: TimerAction) -> Rc<Self> {
function clock (line 103) | fn clock() -> Html {
function App (line 118) | fn App() -> Html {
function main (line 188) | fn main() {
FILE: examples/todomvc/src/main.rs
constant KEY (line 11) | const KEY: &str = "yew.todomvc.self";
type Msg (line 13) | pub enum Msg {
type App (line 25) | pub struct App {
method view_filter (line 147) | fn view_filter(&self, filter: Filter, link: &Scope<Self>) -> Html {
method view_input (line 165) | fn view_input(&self, link: &Scope<Self>) -> Html {
method view_entry (line 192) | fn view_entry(&self, (idx, entry): (usize, &Entry), link: &Scope<Self>...
method view_entry_edit_input (line 217) | fn view_entry_edit_input(&self, (idx, entry): (usize, &Entry), link: &...
type Message (line 31) | type Message = Msg;
type Properties (line 32) | type Properties = ();
method create (line 34) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 41) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 90) | fn view(&self, ctx: &Context<Self>) -> Html {
function main (line 248) | fn main() {
FILE: examples/todomvc/src/state.rs
type State (line 7) | pub struct State {
method new (line 14) | pub fn new(entries: Vec<Entry>) -> Self {
method total (line 22) | pub fn total(&self) -> usize {
method total_completed (line 26) | pub fn total_completed(&self) -> usize {
method is_all_completed (line 33) | pub fn is_all_completed(&self) -> bool {
method clear_completed (line 47) | pub fn clear_completed(&mut self) {
method toggle_completed (line 51) | pub fn toggle_completed(&mut self, idx: usize) {
method set_completed (line 56) | pub fn set_completed(&mut self, value: bool) {
method toggle_edit (line 64) | pub fn toggle_edit(&mut self, idx: usize) {
method clear_all_edit (line 69) | pub fn clear_all_edit(&mut self) {
method complete_edit (line 75) | pub fn complete_edit(&mut self, idx: usize, val: String) {
method remove (line 85) | pub fn remove(&mut self, idx: usize) {
type Entry (line 91) | pub struct Entry {
type Filter (line 98) | pub enum Filter {
method fits (line 104) | pub fn fits(&self, entry: &Entry) -> bool {
method as_href (line 112) | pub fn as_href(&self) -> &'static str {
method into_prop_value (line 122) | fn into_prop_value(self) -> yew::Html {
FILE: examples/two_apps/src/main.rs
type Msg (line 4) | pub enum Msg {
type App (line 10) | pub struct App {
type Message (line 17) | type Message = Msg;
type Properties (line 18) | type Properties = ();
method create (line 20) | fn create(_ctx: &Context<Self>) -> Self {
method update (line 28) | fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
method view (line 59) | fn view(&self, ctx: &Context<Self>) -> Html {
function mount_app (line 72) | fn mount_app(selector: &'static str) -> AppHandle<App> {
function main (line 78) | fn main() {
FILE: examples/wasi_ssr_module/src/main.rs
function Content (line 12) | fn Content() -> Html {
function App (line 24) | fn App() -> Html {
function render (line 40) | pub async fn render() -> Result<String> {
function main (line 55) | async fn main() -> Result<()> {
FILE: examples/wasi_ssr_module/src/router.rs
type Route (line 5) | pub enum Route {
function switch (line 17) | pub fn switch(routes: Route) -> Html {
FILE: examples/web_worker_fib/src/agent.rs
type Postcard (line 8) | pub struct Postcard;
method encode (line 11) | fn encode<I>(input: I) -> JsValue
method decode (line 19) | fn decode<O>(input: JsValue) -> O
function FibonacciTask (line 29) | pub async fn FibonacciTask(n: u32) -> u32 {
FILE: examples/web_worker_fib/src/bin/app.rs
function main (line 1) | fn main() {
FILE: examples/web_worker_fib/src/bin/worker.rs
function main (line 4) | fn main() {
FILE: examples/web_worker_fib/src/lib.rs
function Main (line 14) | fn Main() -> Html {
function App (line 74) | pub fn App() -> Html {
FILE: examples/web_worker_prime/src/agent.rs
type ControlSignal (line 10) | pub enum ControlSignal {
function PrimeReactor (line 16) | pub async fn PrimeReactor(mut scope: ReactorScope<ControlSignal, u64>) {
FILE: examples/web_worker_prime/src/bin/app.rs
function main (line 1) | fn main() {
FILE: examples/web_worker_prime/src/bin/worker.rs
function main (line 4) | fn main() {
FILE: examples/web_worker_prime/src/lib.rs
function Main (line 7) | fn Main() -> Html {
function App (line 58) | pub fn App() -> Html {
FILE: examples/webgl/src/main.rs
type App (line 10) | pub struct App {
method request_animation_frame (line 54) | fn request_animation_frame(f: &Closure<dyn FnMut()>) {
method render_gl (line 61) | fn render_gl(gl: WebGlRenderingContext) {
type Message (line 15) | type Message = ();
type Properties (line 16) | type Properties = ();
method create (line 18) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 24) | fn view(&self, _ctx: &Context<Self>) -> Html {
method rendered (line 30) | fn rendered(&mut self, _ctx: &Context<Self>, first_render: bool) {
function main (line 126) | fn main() {
FILE: packages/yew-agent-macro/src/agent_fn.rs
type AgentFnType (line 8) | pub trait AgentFnType {
method attr_name (line 12) | fn attr_name() -> &'static str;
method agent_type_name (line 13) | fn agent_type_name() -> &'static str;
method parse_recv_type (line 14) | fn parse_recv_type(sig: &Signature) -> syn::Result<Self::RecvType>;
method parse_output_type (line 15) | fn parse_output_type(sig: &Signature) -> syn::Result<Self::OutputType>;
method extract_fn_arg_type (line 17) | fn extract_fn_arg_type(arg: &FnArg) -> syn::Result<Type> {
method assert_no_left_argument (line 32) | fn assert_no_left_argument<I, T>(rest_inputs: I, expected_len: usize) ...
type AgentFn (line 61) | pub struct AgentFn<F>
method parse (line 81) | fn parse(input: ParseStream) -> syn::Result<Self> {
function filter_attrs_for_agent_struct (line 149) | pub fn filter_attrs_for_agent_struct(&self) -> Vec<Attribute> {
function filter_attrs_for_agent_impl (line 164) | pub fn filter_attrs_for_agent_impl(&self) -> Vec<Attribute> {
function phantom_generics (line 178) | pub fn phantom_generics(&self) -> Punctuated<Ident, Comma> {
function merge_agent_name (line 185) | pub fn merge_agent_name(&mut self, name: AgentName) -> syn::Result<()> {
function inner_fn_ident (line 203) | pub fn inner_fn_ident(&self) -> Ident {
function agent_name (line 211) | pub fn agent_name(&self) -> Ident {
function print_inner_fn (line 215) | pub fn print_inner_fn(&self) -> ItemFn {
type AgentName (line 225) | pub struct AgentName {
method parse (line 230) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-agent-macro/src/lib.rs
function reactor (line 13) | pub fn reactor(attr: TokenStream, item: TokenStream) -> TokenStream {
function oneshot (line 23) | pub fn oneshot(attr: TokenStream, item: TokenStream) -> TokenStream {
FILE: packages/yew-agent-macro/src/oneshot.rs
type OneshotFn (line 7) | pub struct OneshotFn {}
type OutputType (line 10) | type OutputType = Type;
type RecvType (line 11) | type RecvType = Type;
method attr_name (line 13) | fn attr_name() -> &'static str {
method agent_type_name (line 17) | fn agent_type_name() -> &'static str {
method parse_recv_type (line 21) | fn parse_recv_type(sig: &Signature) -> syn::Result<Self::RecvType> {
method parse_output_type (line 34) | fn parse_output_type(sig: &Signature) -> syn::Result<Self::OutputType> {
function oneshot_impl (line 46) | pub fn oneshot_impl(name: AgentName, mut agent_fn: AgentFn<OneshotFn>) -...
FILE: packages/yew-agent-macro/src/reactor.rs
type ReactorFn (line 7) | pub struct ReactorFn {}
type OutputType (line 10) | type OutputType = ();
type RecvType (line 11) | type RecvType = Type;
method attr_name (line 13) | fn attr_name() -> &'static str {
method agent_type_name (line 17) | fn agent_type_name() -> &'static str {
method parse_recv_type (line 21) | fn parse_recv_type(sig: &Signature) -> syn::Result<Self::RecvType> {
method parse_output_type (line 34) | fn parse_output_type(sig: &Signature) -> syn::Result<Self::OutputType> {
function reactor_impl (line 49) | pub fn reactor_impl(name: AgentName, mut agent_fn: AgentFn<ReactorFn>) -...
FILE: packages/yew-agent/src/codec.rs
type Codec (line 8) | pub trait Codec {
method encode (line 10) | fn encode<I>(input: I) -> JsValue
method decode (line 15) | fn decode<O>(input: JsValue) -> O
method encode (line 25) | fn encode<I>(input: I) -> JsValue
method decode (line 34) | fn decode<O>(input: JsValue) -> O
type Bincode (line 22) | pub struct Bincode;
FILE: packages/yew-agent/src/oneshot/bridge.rs
type OneshotBridge (line 12) | pub struct OneshotBridge<N>
function new (line 25) | pub(crate) fn new(
function register_callback (line 33) | pub(crate) fn register_callback<CODEC>(
function fork (line 51) | pub fn fork(&self) -> Self {
function run (line 61) | pub async fn run(&mut self, input: N::Input) -> N::Output {
FILE: packages/yew-agent/src/oneshot/hooks.rs
type UseOneshotRunnerHandle (line 8) | pub struct UseOneshotRunnerHandle<T>
function run (line 20) | pub async fn run(&self, input: T::Input) -> T::Output {
method clone (line 29) | fn clone(&self) -> Self {
method eq (line 40) | fn eq(&self, rhs: &Self) -> bool {
function use_oneshot_runner (line 47) | pub fn use_oneshot_runner<T>() -> UseOneshotRunnerHandle<T>
FILE: packages/yew-agent/src/oneshot/provider.rs
type OneshotProviderState (line 14) | pub(crate) struct OneshotProviderState<T>
function fmt (line 28) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function get_held_bridge (line 37) | fn get_held_bridge(&self) -> OneshotBridge<T> {
function create_bridge (line 51) | pub fn create_bridge(&self) -> OneshotBridge<T> {
method clone (line 66) | fn clone(&self) -> Self {
method eq (line 80) | fn eq(&self, rhs: &Self) -> bool {
function OneshotProvider (line 89) | pub fn OneshotProvider<T, C = Bincode>(props: &WorkerProviderProps) -> Html
FILE: packages/yew-agent/src/oneshot/registrar.rs
type OneshotRegistrar (line 13) | pub struct OneshotRegistrar<T, CODEC = Bincode>
method default (line 26) | fn default() -> Self {
function new (line 37) | pub fn new() -> Self {
function encoding (line 44) | pub fn encoding<C>(&self) -> OneshotRegistrar<N, C>
function register (line 54) | pub fn register(&self)
function fmt (line 68) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
FILE: packages/yew-agent/src/oneshot/spawner.rs
type OneshotSpawner (line 12) | pub struct OneshotSpawner<N, CODEC = Bincode>
function new (line 26) | pub const fn new() -> Self {
function encoding (line 33) | pub const fn encoding<C>(&self) -> OneshotSpawner<N, C>
function with_loader (line 46) | pub fn with_loader(mut self, with_loader: bool) -> Self {
function as_module (line 59) | pub fn as_module(mut self, as_module: bool) -> Self {
function spawn (line 66) | pub fn spawn(mut self, path: &str) -> OneshotBridge<N>
FILE: packages/yew-agent/src/oneshot/traits.rs
type Oneshot (line 4) | pub trait Oneshot: Future {
method create (line 9) | fn create(input: Self::Input) -> Self;
FILE: packages/yew-agent/src/oneshot/worker.rs
type Message (line 4) | pub(crate) enum Message<T>
type OneshotWorker (line 14) | pub(crate) struct OneshotWorker<T>
type Input (line 26) | type Input = T::Input;
type Message (line 27) | type Message = Message<T>;
type Output (line 28) | type Output = T::Output;
method create (line 30) | fn create(_scope: &WorkerScope<Self>) -> Self {
method update (line 37) | fn update(&mut self, scope: &WorkerScope<Self>, msg: Self::Message) {
method received (line 49) | fn received(&mut self, scope: &WorkerScope<Self>, input: Self::Input, ha...
method destroy (line 59) | fn destroy(&mut self, _scope: &WorkerScope<Self>, destruct: WorkerDestro...
FILE: packages/yew-agent/src/reach.rs
type Reach (line 3) | pub enum Reach {
FILE: packages/yew-agent/src/reactor/bridge.rs
type ReactorBridge (line 21) | pub struct ReactorBridge<R>
function fmt (line 33) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function new (line 43) | pub(crate) fn new(
function output_callback (line 50) | pub(crate) fn output_callback(
function register_callback (line 65) | pub(crate) fn register_callback<CODEC>(
function fork (line 80) | pub fn fork(&self) -> Self {
function send_input (line 90) | pub fn send_input(&self, msg: <R::Scope as ReactorScoped>::Input) {
type Item (line 99) | type Item = <R::Scope as ReactorScoped>::Output;
method poll_next (line 101) | fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Opt...
method size_hint (line 105) | fn size_hint(&self) -> (usize, Option<usize>) {
method is_terminated (line 114) | fn is_terminated(&self) -> bool {
type ReactorBridgeSinkError (line 121) | pub enum ReactorBridgeSinkError {
type Error (line 131) | type Error = ReactorBridgeSinkError;
function poll_close (line 133) | fn poll_close(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Resul...
function poll_flush (line 137) | fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Resul...
function poll_ready (line 141) | fn poll_ready(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Resul...
function start_send (line 145) | fn start_send(
FILE: packages/yew-agent/src/reactor/hooks.rs
type ReactorTx (line 17) | type ReactorTx<R> =
type ReactorEvent (line 21) | pub enum ReactorEvent<R>
function fmt (line 36) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type UseReactorBridgeHandle (line 45) | pub struct UseReactorBridgeHandle<R>
function fmt (line 58) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method clone (line 69) | fn clone(&self) -> Self {
function send (line 82) | pub fn send(&self, msg: <R::Scope as ReactorScoped>::Input) {
function reset (line 93) | pub fn reset(&self) {
method eq (line 102) | fn eq(&self, rhs: &Self) -> bool {
function use_reactor_bridge (line 116) | pub fn use_reactor_bridge<R, F>(on_output: F) -> UseReactorBridgeHandle<R>
type UseReactorSubscriptionHandle (line 164) | pub struct UseReactorSubscriptionHandle<R>
function send (line 179) | pub fn send(&self, msg: <R::Scope as ReactorScoped>::Input) {
function finished (line 184) | pub fn finished(&self) -> bool {
function reset (line 192) | pub fn reset(&self) {
method clone (line 201) | fn clone(&self) -> Self {
function fmt (line 217) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Target (line 229) | type Target = [Rc<<R::Scope as ReactorScoped>::Output>];
method deref (line 231) | fn deref(&self) -> &Self::Target {
method eq (line 240) | fn eq(&self, rhs: &Self) -> bool {
function use_reactor_subscription (line 249) | pub fn use_reactor_subscription<R>() -> UseReactorSubscriptionHandle<R>
FILE: packages/yew-agent/src/reactor/messages.rs
type ReactorInput (line 5) | pub(crate) enum ReactorInput<I> {
type ReactorOutput (line 12) | pub enum ReactorOutput<O> {
FILE: packages/yew-agent/src/reactor/provider.rs
type ReactorProviderState (line 14) | pub(crate) struct ReactorProviderState<T>
function fmt (line 28) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function get_held_bridge (line 37) | fn get_held_bridge(&self) -> ReactorBridge<T> {
function create_bridge (line 51) | pub fn create_bridge(&self) -> ReactorBridge<T> {
method clone (line 66) | fn clone(&self) -> Self {
method eq (line 80) | fn eq(&self, rhs: &Self) -> bool {
function ReactorProvider (line 89) | pub fn ReactorProvider<R, C = Bincode>(props: &WorkerProviderProps) -> Html
FILE: packages/yew-agent/src/reactor/registrar.rs
type ReactorRegistrar (line 14) | pub struct ReactorRegistrar<R, CODEC = Bincode>
method default (line 27) | fn default() -> Self {
function new (line 38) | pub fn new() -> Self {
function encoding (line 45) | pub fn encoding<C>(&self) -> ReactorRegistrar<R, C>
function register (line 55) | pub fn register(&self)
function fmt (line 69) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
FILE: packages/yew-agent/src/reactor/scope.rs
type ReactorScope (line 10) | pub struct ReactorScope<I, O> {
function fmt (line 16) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Item (line 22) | type Item = I;
method poll_next (line 25) | fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Opt...
method size_hint (line 30) | fn size_hint(&self) -> (usize, Option<usize>) {
method is_terminated (line 37) | fn is_terminated(&self) -> bool {
type ReactorScoped (line 43) | pub trait ReactorScoped: Stream + FusedStream {
method new (line 50) | fn new<IS, OS>(input_stream: IS, output_sink: OS) -> Self
type Input (line 57) | type Input = I;
type Output (line 58) | type Output = O;
method new (line 61) | fn new<IS, OS>(input_stream: IS, output_sink: OS) -> Self
type Error (line 74) | type Error = Infallible;
function start_send (line 76) | fn start_send(mut self: Pin<&mut Self>, item: O) -> Result<(), Self::Err...
function poll_close (line 80) | fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Re...
function poll_flush (line 84) | fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Re...
function poll_ready (line 88) | fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Re...
FILE: packages/yew-agent/src/reactor/spawner.rs
type ReactorSpawner (line 13) | pub struct ReactorSpawner<R, CODEC = Bincode>
function new (line 27) | pub const fn new() -> Self {
function encoding (line 34) | pub const fn encoding<C>(&self) -> ReactorSpawner<R, C>
function with_loader (line 47) | pub fn with_loader(mut self, with_loader: bool) -> Self {
function as_module (line 60) | pub fn as_module(mut self, as_module: bool) -> Self {
function spawn (line 67) | pub fn spawn(mut self, path: &str) -> ReactorBridge<R>
FILE: packages/yew-agent/src/reactor/traits.rs
type Reactor (line 6) | pub trait Reactor: Future<Output = ()> {
method create (line 11) | fn create(scope: Self::Scope) -> Self;
FILE: packages/yew-agent/src/reactor/worker.rs
type Message (line 15) | pub(crate) enum Message {
type ReactorWorker (line 19) | pub(crate) struct ReactorWorker<R>
type Input (line 31) | type Input = ReactorInput<<R::Scope as ReactorScoped>::Input>;
type Message (line 32) | type Message = Message;
type Output (line 33) | type Output = ReactorOutput<<R::Scope as ReactorScoped>::Output>;
method create (line 35) | fn create(_scope: &WorkerScope<Self>) -> Self {
method update (line 42) | fn update(&mut self, scope: &WorkerScope<Self>, msg: Self::Message) {
method connected (line 56) | fn connected(&mut self, scope: &WorkerScope<Self>, id: HandlerId) {
method received (line 95) | fn received(&mut self, _scope: &WorkerScope<Self>, input: Self::Input, i...
method disconnected (line 105) | fn disconnected(&mut self, _scope: &WorkerScope<Self>, id: HandlerId) {
method destroy (line 112) | fn destroy(&mut self, _scope: &WorkerScope<Self>, destruct: WorkerDestro...
FILE: packages/yew-agent/src/scope_ext.rs
type WorkerBridgeHandle (line 21) | pub struct WorkerBridgeHandle<W>
function send (line 33) | pub fn send(&self, input: W::Input) {
type ReactorTx (line 38) | type ReactorTx<R> =
type ReactorBridgeHandle (line 42) | pub struct ReactorBridgeHandle<R>
function fmt (line 53) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function send (line 63) | pub fn send(&self, input: <R::Scope as ReactorScoped>::Input) {
type AgentScopeExt (line 75) | pub trait AgentScopeExt {
method bridge_worker (line 77) | fn bridge_worker<W>(&self, callback: Callback<W::Output>) -> WorkerBri...
method bridge_reactor (line 82) | fn bridge_reactor<R>(&self, callback: Callback<ReactorEvent<R>>) -> Re...
method run_oneshot (line 88) | fn run_oneshot<T>(&self, input: T::Input, callback: Callback<T::Output>)
method bridge_worker (line 97) | fn bridge_worker<W>(&self, callback: Callback<W::Output>) -> WorkerBri...
method bridge_reactor (line 110) | fn bridge_reactor<R>(&self, callback: Callback<ReactorEvent<R>>) -> Re...
method run_oneshot (line 135) | fn run_oneshot<T>(&self, input: T::Input, callback: Callback<T::Output>)
FILE: packages/yew-agent/src/traits.rs
type Spawnable (line 4) | pub trait Spawnable {
method spawner (line 9) | fn spawner() -> Self::Spawner;
type Registrable (line 13) | pub trait Registrable {
method registrar (line 18) | fn registrar() -> Self::Registrar;
FILE: packages/yew-agent/src/utils.rs
function window (line 8) | pub fn window() -> web_sys::Window {
function get_next_id (line 13) | pub(crate) fn get_next_id() -> usize {
type BridgeIdState (line 20) | pub(crate) struct BridgeIdState {
type Action (line 25) | type Action = ();
method reduce (line 27) | fn reduce(self: Rc<Self>, _: Self::Action) -> Rc<Self> {
type OutputsAction (line 35) | pub(crate) enum OutputsAction<T> {
type OutputsState (line 41) | pub(crate) struct OutputsState<T> {
method clone (line 48) | fn clone(&self) -> Self {
type Action (line 58) | type Action = OutputsAction<T>;
method reduce (line 60) | fn reduce(mut self: Rc<Self>, action: Self::Action) -> Rc<Self> {
method default (line 82) | fn default() -> Self {
FILE: packages/yew-agent/src/worker/bridge.rs
type ToWorkerQueue (line 16) | pub(crate) type ToWorkerQueue<W> = Vec<ToWorker<W>>;
type CallbackMap (line 17) | pub(crate) type CallbackMap<W> = HashMap<HandlerId, Weak<dyn Fn(<W as Wo...
type WorkerBridgeInner (line 19) | struct WorkerBridgeInner<W>
function fmt (line 33) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function send_message (line 43) | fn send_message(&self, msg: ToWorker<W>) {
method drop (line 61) | fn drop(&mut self) {
type WorkerBridge (line 68) | pub struct WorkerBridge<W>
function init (line 82) | fn init(&self) {
function new (line 86) | pub(crate) fn new<CODEC>(
function send (line 116) | pub fn send(&self, msg: W::Input) {
function fork (line 124) | pub fn fork<F>(&self, cb: Option<F>) -> Self
method drop (line 154) | fn drop(&mut self) {
function fmt (line 164) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method eq (line 173) | fn eq(&self, rhs: &Self) -> bool {
FILE: packages/yew-agent/src/worker/handler_id.rs
type HandlerId (line 7) | pub struct HandlerId(usize);
method new (line 10) | pub(crate) fn new() -> Self {
FILE: packages/yew-agent/src/worker/hooks.rs
type UseWorkerBridgeHandle (line 14) | pub struct UseWorkerBridgeHandle<T>
function send (line 27) | pub fn send(&self, msg: T::Input) {
function reset (line 34) | pub fn reset(&self) {
method clone (line 43) | fn clone(&self) -> Self {
function fmt (line 55) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method eq (line 66) | fn eq(&self, rhs: &Self) -> bool {
function use_worker_bridge (line 80) | pub fn use_worker_bridge<T, F>(on_output: F) -> UseWorkerBridgeHandle<T>
type UseWorkerSubscriptionHandle (line 115) | pub struct UseWorkerSubscriptionHandle<T>
function send (line 129) | pub fn send(&self, msg: T::Input) {
function reset (line 137) | pub fn reset(&self) {
method clone (line 146) | fn clone(&self) -> Self {
function fmt (line 160) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Target (line 172) | type Target = [Rc<T::Output>];
method deref (line 174) | fn deref(&self) -> &[Rc<T::Output>] {
method eq (line 183) | fn eq(&self, rhs: &Self) -> bool {
function use_worker_subscription (line 192) | pub fn use_worker_subscription<T>() -> UseWorkerSubscriptionHandle<T>
FILE: packages/yew-agent/src/worker/lifecycle.rs
type WorkerState (line 9) | pub(crate) struct WorkerState<W>
function new (line 21) | pub fn new() -> Self {
type WorkerLifecycleEvent (line 30) | pub(crate) enum WorkerLifecycleEvent<W: Worker> {
type WorkerRunnable (line 44) | pub(crate) struct WorkerRunnable<W: Worker> {
function run (line 53) | pub fn run(self) {
FILE: packages/yew-agent/src/worker/messages.rs
type ToWorker (line 8) | pub(crate) enum ToWorker<W>
type FromWorker (line 24) | pub(crate) enum FromWorker<W>
FILE: packages/yew-agent/src/worker/mod.rs
type Shared (line 94) | type Shared<T> = Rc<RefCell<T>>;
type Callback (line 97) | type Callback<IN> = Rc<dyn Fn(IN)>;
FILE: packages/yew-agent/src/worker/native_worker.rs
type WorkerSelf (line 10) | pub(crate) trait WorkerSelf {
method worker_self (line 13) | fn worker_self() -> Self::GlobalScope;
type GlobalScope (line 17) | type GlobalScope = DedicatedWorkerGlobalScope;
method worker_self (line 19) | fn worker_self() -> Self::GlobalScope {
type NativeWorkerExt (line 24) | pub(crate) trait NativeWorkerExt {
method set_on_packed_message (line 25) | fn set_on_packed_message<T, CODEC, F>(&self, handler: F)
method post_packed_message (line 31) | fn post_packed_message<T, CODEC>(&self, data: T)
FILE: packages/yew-agent/src/worker/provider.rs
type WorkerProviderProps (line 16) | pub struct WorkerProviderProps {
type WorkerProviderState (line 46) | pub(crate) struct WorkerProviderState<W>
function fmt (line 60) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function get_held_bridge (line 70) | fn get_held_bridge(&self) -> Rc<WorkerBridge<W>> {
function create_bridge (line 84) | pub fn create_bridge(&self, cb: Callback<W::Output>) -> WorkerBridge<W> {
method eq (line 99) | fn eq(&self, rhs: &Self) -> bool {
function WorkerProvider (line 108) | pub fn WorkerProvider<W, C = Bincode>(props: &WorkerProviderProps) -> Html
FILE: packages/yew-agent/src/worker/registrar.rs
type WorkerRegistrar (line 15) | pub struct WorkerRegistrar<W, CODEC = Bincode>
function fmt (line 24) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function new (line 34) | pub(crate) fn new() -> Self {
function encoding (line 41) | pub fn encoding<C>(&self) -> WorkerRegistrar<W, C>
function register (line 49) | pub fn register(&self)
FILE: packages/yew-agent/src/worker/scope.rs
type WorkerDestroyHandle (line 19) | pub struct WorkerDestroyHandle<W>
function fmt (line 27) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function new (line 36) | pub(crate) fn new(scope: WorkerScope<W>) -> Self {
method drop (line 45) | fn drop(&mut self) {
type WorkerScope (line 51) | pub struct WorkerScope<W: Worker> {
function fmt (line 57) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method clone (line 63) | fn clone(&self) -> Self {
function new (line 76) | pub(crate) fn new<CODEC>() -> Self
function send (line 93) | pub(crate) fn send(&self, event: WorkerLifecycleEvent<W>) {
function respond (line 104) | pub fn respond(&self, id: HandlerId, output: W::Output) {
function send_message (line 110) | pub fn send_message<T>(&self, msg: T)
function callback (line 118) | pub fn callback<F, IN, M>(&self, function: F) -> Rc<dyn Fn(IN)>
function callback_future (line 137) | pub fn callback_future<FN, FU, IN, M>(&self, function: FN) -> Rc<dyn Fn(...
function send_future (line 157) | pub fn send_future<F, M>(&self, future: F)
FILE: packages/yew-agent/src/worker/spawner.rs
type WorkerSpawner (line 23) | pub struct WorkerSpawner<W, CODEC = Bincode>
function fmt (line 39) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method default (line 49) | fn default() -> Self {
function new (line 60) | pub const fn new() -> Self {
function encoding (line 70) | pub fn encoding<C>(&mut self) -> WorkerSpawner<W, C>
function callback (line 83) | pub fn callback<F>(&mut self, cb: F) -> &mut Self
function with_loader (line 96) | pub fn with_loader(&mut self, with_loader: bool) -> &mut Self {
function as_module (line 110) | pub fn as_module(&mut self, as_module: bool) -> &mut Self {
function spawn (line 117) | pub fn spawn(&self, path: &str) -> WorkerBridge<W>
function create_worker (line 127) | fn create_worker(&self, path: &str) -> Option<DedicatedWorker> {
function spawn_inner (line 164) | fn spawn_inner(&self, worker: DedicatedWorker) -> WorkerBridge<W>
FILE: packages/yew-agent/src/worker/traits.rs
type Worker (line 8) | pub trait Worker: Sized {
method create (line 17) | fn create(scope: &WorkerScope<Self>) -> Self;
method update (line 23) | fn update(&mut self, scope: &WorkerScope<Self>, msg: Self::Message);
method connected (line 30) | fn connected(&mut self, scope: &WorkerScope<Self>, id: HandlerId) {
method received (line 39) | fn received(&mut self, scope: &WorkerScope<Self>, msg: Self::Input, id...
method disconnected (line 44) | fn disconnected(&mut self, scope: &WorkerScope<Self>, id: HandlerId) {
method destroy (line 61) | fn destroy(&mut self, scope: &WorkerScope<Self>, destruct: WorkerDestr...
type Spawner (line 71) | type Spawner = WorkerSpawner<Self>;
method spawner (line 73) | fn spawner() -> WorkerSpawner<Self> {
type Registrar (line 82) | type Registrar = WorkerRegistrar<Self>;
method registrar (line 84) | fn registrar() -> WorkerRegistrar<Self> {
FILE: packages/yew-macro/src/classes/mod.rs
type Classes (line 9) | pub struct Classes(Punctuated<ClassExpr, Token![,]>);
method parse (line 12) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 20) | fn to_tokens(&self, tokens: &mut TokenStream) {
type ClassExpr (line 40) | enum ClassExpr {
method parse (line 46) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/derive_props/builder.rs
type PropsBuilder (line 16) | pub struct PropsBuilder<'a> {
method to_tokens (line 25) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
function new (line 55) | pub fn new(
function set_fields (line 73) | fn set_fields(&self) -> impl Iterator<Item = impl ToTokens + '_> {
function impl_assert_props (line 77) | fn impl_assert_props(&self) -> proc_macro2::TokenStream {
FILE: packages/yew-macro/src/derive_props/field.rs
function is_option_type (line 16) | fn is_option_type(ty: &Type) -> bool {
type PropAttr (line 32) | pub enum PropAttr {
type PropField (line 40) | pub struct PropField {
method is_required (line 49) | pub fn is_required(&self) -> bool {
method to_check_name (line 54) | fn to_check_name(&self, props_name: &Ident) -> Ident {
method to_check_arg_name (line 59) | fn to_check_arg_name(&self, props_name: &Ident) -> GenericParam {
method wrapped_name (line 65) | fn wrapped_name(&self) -> &Ident {
method to_field_check (line 72) | pub fn to_field_check<'a>(
method to_field_setter (line 90) | pub fn to_field_setter(&self) -> proc_macro2::TokenStream {
method to_field_def (line 122) | pub fn to_field_def(&self) -> proc_macro2::TokenStream {
method to_default_setter (line 133) | pub fn to_default_setter(&self) -> proc_macro2::TokenStream {
method to_build_step_fn (line 143) | pub fn to_build_step_fn(
method attribute (line 220) | fn attribute(named_field: &Field) -> Result<PropAttr> {
type Error (line 313) | type Error = Error;
method try_from (line 315) | fn try_from(field: Field) -> Result<Self> {
type PropFieldCheck (line 245) | pub struct PropFieldCheck<'a> {
function to_fake_prop_decl (line 254) | pub fn to_fake_prop_decl(&self) -> proc_macro2::TokenStream {
function to_stream (line 267) | pub fn to_stream(
method partial_cmp (line 333) | fn partial_cmp(&self, other: &PropField) -> Option<Ordering> {
method cmp (line 339) | fn cmp(&self, other: &PropField) -> Ordering {
method eq (line 353) | fn eq(&self, other: &Self) -> bool {
FILE: packages/yew-macro/src/derive_props/generics.rs
type GenericArguments (line 6) | pub type GenericArguments = Punctuated<GenericArgument, Token![,]>;
function first_default_or_const_param_position (line 9) | fn first_default_or_const_param_position(generics: &Generics) -> Option<...
function push_type_param (line 18) | pub fn push_type_param(generics: &mut Generics, type_param: GenericParam) {
function to_arguments (line 27) | pub fn to_arguments(generics: &Generics) -> GenericArguments {
function new_generic_type_arg (line 40) | fn new_generic_type_arg(ident: Ident) -> GenericArgument {
FILE: packages/yew-macro/src/derive_props/mod.rs
type DerivePropsInput (line 25) | pub struct DerivePropsInput {
method normalise (line 157) | pub fn normalise(&mut self) {
type Normaliser (line 34) | struct Normaliser<'ast> {
function new (line 42) | pub fn new(new_self: &'ast Ident, generics: &'ast Generics) -> Self {
function get_new_self (line 50) | fn get_new_self(&mut self) -> PathSegment {
method visit_path_mut (line 93) | fn visit_path_mut(&mut self, path: &mut Path) {
function should_preserve_attr (line 105) | fn should_preserve_attr(attr: &Attribute) -> bool {
method parse (line 115) | fn parse(input: ParseStream) -> Result<Self> {
method to_tokens (line 169) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
FILE: packages/yew-macro/src/derive_props/wrapper.rs
type PropsWrapper (line 7) | pub struct PropsWrapper<'a> {
method to_tokens (line 15) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
function new (line 52) | pub fn new(
function field_defs (line 66) | fn field_defs(&self) -> impl Iterator<Item = impl ToTokens + '_> {
function default_setters (line 70) | fn default_setters(&self) -> impl Iterator<Item = impl ToTokens + '_> {
FILE: packages/yew-macro/src/function_component.rs
type FunctionComponent (line 14) | pub struct FunctionComponent {
method filter_attrs_for_component_struct (line 157) | fn filter_attrs_for_component_struct(&self) -> Vec<Attribute> {
method filter_attrs_for_component_impl (line 172) | fn filter_attrs_for_component_impl(&self) -> Vec<Attribute> {
method phantom_generics (line 186) | fn phantom_generics(&self) -> Punctuated<Ident, Comma> {
method merge_component_name (line 193) | fn merge_component_name(&mut self, name: FunctionComponentName) -> syn...
method inner_fn_ident (line 208) | fn inner_fn_ident(&self) -> Ident {
method component_name (line 216) | fn component_name(&self) -> Ident {
method create_static_component_generics (line 223) | fn create_static_component_generics(&self) -> Generics {
method print_inner_fn (line 242) | fn print_inner_fn(&self) -> TokenStream {
method print_base_component_impl (line 273) | fn print_base_component_impl(&self) -> TokenStream {
method print_debug_impl (line 331) | fn print_debug_impl(&self) -> TokenStream {
method print_fn_provider_impl (line 347) | fn print_fn_provider_impl(&self) -> TokenStream {
method print_struct_def (line 375) | fn print_struct_def(&self) -> TokenStream {
method parse (line 29) | fn parse(input: ParseStream) -> syn::Result<Self> {
type FunctionComponentName (line 395) | pub struct FunctionComponentName {
method parse (line 400) | fn parse(input: ParseStream) -> syn::Result<Self> {
function function_component_impl (line 415) | pub fn function_component_impl(
FILE: packages/yew-macro/src/hook/body.rs
type BodyRewriter (line 12) | pub struct BodyRewriter {
method new (line 18) | pub fn new(ctx_ident: Ident) -> Self {
method is_branched (line 25) | fn is_branched(&self) -> bool {
method with_branch (line 29) | fn with_branch<F, O>(&mut self, f: F) -> O
method visit_expr_call_mut (line 40) | fn visit_expr_call_mut(&mut self, i: &mut ExprCall) {
method visit_expr_mut (line 66) | fn visit_expr_mut(&mut self, i: &mut Expr) {
method visit_expr_closure_mut (line 92) | fn visit_expr_closure_mut(&mut self, i: &mut ExprClosure) {
method visit_expr_if_mut (line 96) | fn visit_expr_if_mut(&mut self, i: &mut ExprIf) {
method visit_expr_loop_mut (line 110) | fn visit_expr_loop_mut(&mut self, i: &mut ExprLoop) {
method visit_expr_for_loop_mut (line 114) | fn visit_expr_for_loop_mut(&mut self, i: &mut ExprForLoop) {
method visit_expr_match_mut (line 127) | fn visit_expr_match_mut(&mut self, i: &mut ExprMatch) {
method visit_expr_while_mut (line 141) | fn visit_expr_while_mut(&mut self, i: &mut ExprWhile) {
method visit_item_mut (line 153) | fn visit_item_mut(&mut self, _i: &mut Item) {
FILE: packages/yew-macro/src/hook/lifetime.rs
type CollectLifetimes (line 11) | pub struct CollectLifetimes {
method new (line 22) | pub fn new(name: &'static str, default_span: Span) -> Self {
method is_impl_trait (line 34) | fn is_impl_trait(&self) -> bool {
method is_type_trait_obj (line 38) | fn is_type_trait_obj(&self) -> bool {
method is_impl_fn (line 42) | fn is_impl_fn(&self) -> bool {
method visit_opt_lifetime (line 46) | fn visit_opt_lifetime(&mut self, lifetime: &mut Option<Lifetime>) {
method visit_lifetime (line 53) | fn visit_lifetime(&mut self, lifetime: &mut Lifetime) {
method next_lifetime (line 59) | fn next_lifetime<S: Into<Option<Span>>>(&mut self, span: S) -> Lifetime {
method visit_receiver_mut (line 69) | fn visit_receiver_mut(&mut self, arg: &mut Receiver) {
method visit_type_reference_mut (line 75) | fn visit_type_reference_mut(&mut self, ty: &mut TypeReference) {
method visit_generic_argument_mut (line 85) | fn visit_generic_argument_mut(&mut self, gen: &mut GenericArgument) {
method visit_type_impl_trait_mut (line 97) | fn visit_type_impl_trait_mut(&mut self, impl_trait: &mut TypeImplTrait) {
method visit_type_trait_object_mut (line 108) | fn visit_type_trait_object_mut(&mut self, type_trait_obj: &mut TypeTrait...
method visit_parenthesized_generic_arguments_mut (line 115) | fn visit_parenthesized_generic_arguments_mut(
method visit_type_bare_fn_mut (line 126) | fn visit_type_bare_fn_mut(&mut self, i: &mut TypeBareFn) {
FILE: packages/yew-macro/src/hook/mod.rs
type HookFn (line 19) | pub struct HookFn {
method doc_attr (line 54) | fn doc_attr(&self) -> Attribute {
method parse (line 24) | fn parse(input: ParseStream) -> syn::Result<Self> {
function hook_impl (line 111) | pub fn hook_impl(hook: HookFn) -> syn::Result<TokenStream> {
FILE: packages/yew-macro/src/hook/signature.rs
function type_is_generic (line 18) | fn type_is_generic(ty: &Type, param: &TypeParam) -> bool {
type CollectArgs (line 26) | pub struct CollectArgs {
method new (line 31) | pub fn new() -> Self {
method visit_type_impl_trait_mut (line 37) | fn visit_type_impl_trait_mut(&mut self, impl_trait: &mut TypeImplTrait) {
method visit_receiver_mut (line 43) | fn visit_receiver_mut(&mut self, recv: &mut Receiver) {
type HookSignature (line 50) | pub struct HookSignature {
method rewrite_return_type (line 58) | fn rewrite_return_type(hook_lifetime: &Lifetime, rt_type: &ReturnType)...
method rewrite (line 94) | pub fn rewrite(sig: &Signature) -> Self {
method phantom_types (line 188) | pub fn phantom_types(&self) -> Vec<Ident> {
method phantom_lifetimes (line 196) | pub fn phantom_lifetimes(&self) -> Vec<TypeReference> {
method input_args (line 212) | pub fn input_args(&self) -> Vec<Ident> {
method input_types (line 228) | pub fn input_types(&self) -> Vec<Type> {
method call_generics (line 242) | pub fn call_generics(&self) -> TokenStream {
FILE: packages/yew-macro/src/html_tree/html_block.rs
type HtmlBlock (line 10) | pub struct HtmlBlock {
method peek (line 21) | fn peek(cursor: Cursor) -> Option<()> {
type BlockContent (line 15) | pub enum BlockContent {
method parse (line 27) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 41) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
method to_node_iterator_stream (line 53) | fn to_node_iterator_stream(&self) -> Option<proc_macro2::TokenStream> {
method is_singular (line 63) | fn is_singular(&self) -> bool {
FILE: packages/yew-macro/src/html_tree/html_component.rs
type HtmlComponent (line 12) | pub struct HtmlComponent {
method parse (line 20) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 126) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
type HtmlComponentOpen (line 160) | struct HtmlComponentOpen {
method is_self_closing (line 166) | fn is_self_closing(&self) -> bool {
method to_spanned (line 170) | fn to_spanned(&self) -> impl ToTokens {
method parse (line 176) | fn parse(input: ParseStream) -> syn::Result<Self> {
type HtmlComponentClose (line 194) | struct HtmlComponentClose {
method to_spanned (line 199) | fn to_spanned(&self) -> impl ToTokens {
method parse (line 205) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/html_tree/html_dashed_name.rs
type HtmlDashedName (line 15) | pub struct HtmlDashedName {
method eq_ignore_ascii_case (line 23) | pub fn eq_ignore_ascii_case<S>(&self, other: S) -> bool
method to_ascii_lowercase_string (line 32) | pub fn to_ascii_lowercase_string(&self) -> String {
method to_lit_str (line 38) | pub fn to_lit_str(&self) -> LitStr {
method fmt (line 44) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
method peek (line 54) | fn peek(cursor: Cursor) -> Option<(Self, Cursor)> {
method from (line 111) | fn from(name: Ident) -> Self {
method parse (line 79) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 91) | fn to_tokens(&self, tokens: &mut TokenStream) {
method try_into_lit (line 101) | fn try_into_lit(&self) -> Option<LitStr> {
method stringify (line 105) | fn stringify(&self) -> TokenStream {
FILE: packages/yew-macro/src/html_tree/html_element.rs
function is_normalised_element_name (line 14) | fn is_normalised_element_name(name: &str) -> bool {
type HtmlElement (line 53) | pub struct HtmlElement {
method peek (line 60) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 68) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 155) | fn to_tokens(&self, tokens: &mut TokenStream) {
function wrap_attr_value (line 552) | fn wrap_attr_value<T: ToTokens>(value: T) -> TokenStream {
type DynamicName (line 563) | pub struct DynamicName {
method peek (line 569) | fn peek(cursor: Cursor) -> Option<((), Cursor)> {
method parse (line 586) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 595) | fn to_tokens(&self, tokens: &mut TokenStream) {
type TagKey (line 602) | enum TagKey {
type TagName (line 607) | pub enum TagName {
method get_key (line 613) | fn get_key(&self) -> TagKey {
method peek (line 622) | fn peek(cursor: Cursor) -> Option<(TagKey, Cursor)> {
method parse (line 632) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 642) | fn to_tokens(&self, tokens: &mut TokenStream) {
type HtmlElementOpen (line 650) | struct HtmlElementOpen {
method is_self_closing (line 656) | fn is_self_closing(&self) -> bool {
method to_spanned (line 660) | fn to_spanned(&self) -> impl ToTokens {
method peek (line 666) | fn peek(cursor: Cursor) -> Option<TagKey> {
method parse (line 691) | fn parse(input: ParseStream) -> syn::Result<Self> {
type HtmlElementClose (line 727) | struct HtmlElementClose {
method to_spanned (line 732) | fn to_spanned(&self) -> impl ToTokens {
method peek (line 738) | fn peek(cursor: Cursor) -> Option<TagKey> {
method parse (line 760) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/html_tree/html_for.rs
function is_contextless_pure (line 14) | fn is_contextless_pure(expr: &Expr) -> bool {
type HtmlFor (line 22) | pub struct HtmlFor {
method peek (line 29) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 36) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 69) | fn to_tokens(&self, tokens: &mut TokenStream) {
FILE: packages/yew-macro/src/html_tree/html_if.rs
type HtmlIf (line 11) | pub struct HtmlIf {
method peek (line 19) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 26) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 71) | fn to_tokens(&self, tokens: &mut TokenStream) {
type HtmlRootBracedOrIf (line 91) | pub enum HtmlRootBracedOrIf {
method peek (line 97) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 103) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 113) | fn to_tokens(&self, tokens: &mut TokenStream) {
FILE: packages/yew-macro/src/html_tree/html_iterable.rs
type HtmlIterable (line 11) | pub struct HtmlIterable(Expr);
method peek (line 14) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 21) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 41) | fn to_tokens(&self, tokens: &mut TokenStream) {
method to_node_iterator_stream (line 53) | fn to_node_iterator_stream(&self) -> Option<TokenStream> {
method is_singular (line 62) | fn is_singular(&self) -> bool {
FILE: packages/yew-macro/src/html_tree/html_list.rs
type HtmlList (line 12) | pub struct HtmlList {
method peek (line 19) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 27) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 61) | fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
type HtmlListOpen (line 95) | pub struct HtmlListOpen {
method to_spanned (line 100) | fn to_spanned(&self) -> impl ToTokens {
method peek (line 106) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 123) | fn parse(input: ParseStream) -> syn::Result<Self> {
type HtmlListProps (line 131) | pub struct HtmlListProps {
method parse (line 135) | fn parse(input: ParseStream) -> syn::Result<Self> {
type HtmlListClose (line 158) | struct HtmlListClose(TagTokens);
method to_spanned (line 160) | fn to_spanned(&self) -> impl ToTokens {
method peek (line 165) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 180) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/html_tree/html_node.rs
type HtmlNode (line 12) | pub enum HtmlNode {
method peek (line 44) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 18) | fn parse(input: ParseStream) -> Result<Self> {
method to_tokens (line 56) | fn to_tokens(&self, tokens: &mut TokenStream) {
method to_node_iterator_stream (line 68) | fn to_node_iterator_stream(&self) -> Option<TokenStream> {
method is_singular (line 80) | fn is_singular(&self) -> bool {
FILE: packages/yew-macro/src/html_tree/lint/mod.rs
type Lint (line 14) | pub trait Lint {
method lint (line 16) | fn lint(element: &HtmlElement);
method lint (line 60) | fn lint(element: &HtmlElement) {
method lint (line 98) | fn lint(element: &HtmlElement) {
function lint_all (line 20) | pub fn lint_all(tree: &HtmlTree) {
function lint (line 26) | pub fn lint<L>(tree: &HtmlTree)
function get_attribute (line 49) | fn get_attribute<'a>(props: &'a ElementProps, name: &str) -> Option<&'a ...
type AHrefLint (line 57) | pub struct AHrefLint;
type ImgAltLint (line 95) | pub struct ImgAltLint;
FILE: packages/yew-macro/src/html_tree/mod.rs
type HtmlType (line 36) | pub enum HtmlType {
type HtmlTree (line 46) | pub enum HtmlTree {
method peek_html_type (line 77) | fn peek_html_type(input: ParseStream) -> Option<HtmlType> {
method parse (line 57) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 125) | fn to_tokens(&self, tokens: &mut TokenStream) {
type HtmlRoot (line 141) | pub enum HtmlRoot {
method parse (line 147) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 168) | fn to_tokens(&self, tokens: &mut TokenStream) {
type HtmlRootVNode (line 177) | pub struct HtmlRootVNode(HtmlRoot);
method parse (line 179) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 185) | fn to_tokens(&self, tokens: &mut TokenStream) {
type ToNodeIterator (line 197) | pub trait ToNodeIterator {
method to_node_iterator_stream (line 202) | fn to_node_iterator_stream(&self) -> Option<TokenStream>;
method is_singular (line 206) | fn is_singular(&self) -> bool;
method to_node_iterator_stream (line 210) | fn to_node_iterator_stream(&self) -> Option<TokenStream> {
method is_singular (line 218) | fn is_singular(&self) -> bool {
type HtmlChildrenTree (line 226) | pub struct HtmlChildrenTree(pub Vec<HtmlTree>);
method new (line 229) | pub fn new() -> Self {
method parse_child (line 233) | pub fn parse_child(&mut self, input: ParseStream) -> syn::Result<()> {
method is_empty (line 238) | pub fn is_empty(&self) -> bool {
method only_single_node_children (line 244) | fn only_single_node_children(&self) -> bool {
method to_build_vec_token_stream (line 248) | pub fn to_build_vec_token_stream(&self) -> TokenStream {
method parse_delimited (line 284) | fn parse_delimited(input: ParseStream) -> syn::Result<Self> {
method to_children_renderer_tokens (line 294) | pub fn to_children_renderer_tokens(&self) -> Option<TokenStream> {
method to_vnode_tokens (line 317) | pub fn to_vnode_tokens(&self) -> TokenStream {
method size_hint (line 352) | pub fn size_hint(&self) -> Option<usize> {
method fully_keyed (line 356) | pub fn fully_keyed(&self) -> Option<bool> {
method to_tokens (line 389) | fn to_tokens(&self, tokens: &mut TokenStream) {
type HtmlRootBraced (line 394) | pub struct HtmlRootBraced {
method peek (line 400) | fn peek(cursor: Cursor) -> Option<()> {
method parse (line 406) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 416) | fn to_tokens(&self, tokens: &mut TokenStream) {
FILE: packages/yew-macro/src/html_tree/tag.rs
function span_eq_hack (line 9) | fn span_eq_hack(a: &Span, b: &Span) -> bool {
function error_replace_span (line 14) | fn error_replace_span(err: syn::Error, from: Span, to: impl ToTokens) ->...
type TagTokens (line 30) | pub struct TagTokens {
method parse_start_content (line 39) | pub fn parse_start_content<T>(
method parse_end_content (line 47) | pub fn parse_end_content<T>(
method parse_content (line 54) | fn parse_content<T>(
method parse_start (line 74) | fn parse_start(input: ParseStream) -> syn::Result<(Self, TokenStream)> {
method parse_end (line 83) | fn parse_end(input: ParseStream) -> syn::Result<(Self, TokenStream)> {
method parse_until_end (line 98) | fn parse_until_end(
method to_spanned (line 144) | pub fn to_spanned(&self) -> impl ToTokens {
FILE: packages/yew-macro/src/lib.rs
type Peek (line 70) | trait Peek<'a, T> {
method peek (line 71) | fn peek(cursor: Cursor<'a>) -> Option<(T, Cursor<'a>)>;
type PeekValue (line 74) | trait PeekValue<T> {
method peek (line 75) | fn peek(cursor: Cursor) -> Option<T>;
function non_capitalized_ascii (line 78) | fn non_capitalized_ascii(string: &str) -> bool {
function join_errors (line 90) | fn join_errors(mut it: impl Iterator<Item = syn::Error>) -> syn::Result<...
function is_ide_completion (line 99) | fn is_ide_completion() -> bool {
function derive_props (line 107) | pub fn derive_props(input: TokenStream) -> TokenStream {
function html_nested (line 115) | pub fn html_nested(input: TokenStream) -> TokenStream {
function html (line 122) | pub fn html(input: TokenStream) -> TokenStream {
function props (line 128) | pub fn props(input: TokenStream) -> TokenStream {
function classes (line 134) | pub fn classes(input: TokenStream) -> TokenStream {
function function_component (line 141) | pub fn function_component(attr: TokenStream, item: TokenStream) -> Token...
function hook (line 152) | pub fn hook(attr: TokenStream, item: TokenStream) -> TokenStream {
function use_prepared_state_with_closure (line 167) | pub fn use_prepared_state_with_closure(input: TokenStream) -> TokenStream {
function use_prepared_state_without_closure (line 173) | pub fn use_prepared_state_without_closure(input: TokenStream) -> TokenSt...
function use_transitive_state_with_closure (line 179) | pub fn use_transitive_state_with_closure(input: TokenStream) -> TokenStr...
function use_transitive_state_without_closure (line 185) | pub fn use_transitive_state_without_closure(input: TokenStream) -> Token...
FILE: packages/yew-macro/src/props/component.rs
function is_none_expr (line 12) | fn is_none_expr(expr: &Expr) -> bool {
type BaseExpr (line 23) | struct BaseExpr {
method parse (line 29) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 42) | fn to_tokens(&self, tokens: &mut TokenStream) {
type ComponentProps (line 48) | pub struct ComponentProps {
method special (line 54) | pub fn special(&self) -> &SpecialProps {
method children (line 59) | pub fn children(&self) -> Option<&Prop> {
method prop_validation_tokens (line 63) | fn prop_validation_tokens(&self, props_ty: impl ToTokens, has_children...
method build_properties_tokens (line 94) | pub fn build_properties_tokens<CR: ToTokens>(
type Error (line 208) | type Error = syn::Error;
method try_from (line 210) | fn try_from(props: Props) -> Result<Self, Self::Error> {
method parse (line 187) | fn parse(input: ParseStream) -> syn::Result<Self> {
function validate (line 218) | fn validate(props: Props) -> Result<Props, syn::Error> {
FILE: packages/yew-macro/src/props/element.rs
type ElementProps (line 8) | pub struct ElementProps {
method parse (line 20) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/props/mod.rs
constant CHILDREN_LABEL (line 11) | const CHILDREN_LABEL: &str = "children";
FILE: packages/yew-macro/src/props/prop.rs
type PropDirective (line 15) | pub enum PropDirective {
type Prop (line 19) | pub struct Prop {
method parse_shorthand_prop_assignment (line 45) | fn parse_shorthand_prop_assignment(
method parse_prop_assignment (line 82) | fn parse_prop_assignment(
method parse (line 27) | fn parse(input: ParseStream) -> syn::Result<Self> {
function parse_prop_value (line 112) | fn parse_prop_value(input: &ParseBuffer) -> syn::Result<Expr> {
function strip_braces (line 141) | fn strip_braces(block: ExprBlock) -> syn::Result<Expr> {
function range_expression_peek (line 179) | fn range_expression_peek(input: &ParseBuffer) -> Option<ExprRange> {
function advance_until_next_dot2 (line 186) | fn advance_until_next_dot2(input: &ParseBuffer) -> syn::Result<()> {
type PropList (line 220) | pub struct PropList(Vec<Prop>);
method new (line 224) | pub fn new(props: Vec<Prop>) -> Self {
method position (line 228) | fn position(&self, key: &str) -> Option<usize> {
method get_by_label (line 233) | pub fn get_by_label(&self, key: &str) -> Option<&Prop> {
method pop (line 238) | pub fn pop(&mut self, key: &str) -> Option<Prop> {
method pop_unique (line 243) | pub fn pop_unique(&mut self, key: &str) -> syn::Result<Option<Prop>> {
method into_vec (line 258) | pub fn into_vec(self) -> Vec<Prop> {
method iter_duplicates (line 263) | fn iter_duplicates(&self) -> impl Iterator<Item = &Prop> {
method drain_filter (line 276) | pub fn drain_filter(&mut self, filter: impl FnMut(&Prop) -> bool) -> S...
method check_all (line 284) | pub fn check_all(&self, f: impl FnMut(&Prop) -> syn::Result<()>) -> sy...
method check_no_duplicates (line 289) | pub fn check_no_duplicates(&self) -> syn::Result<()> {
method parse (line 302) | fn parse(input: ParseStream) -> syn::Result<Self> {
type Target (line 313) | type Target = [Prop];
method deref (line 315) | fn deref(&self) -> &Self::Target {
type SpecialProps (line 321) | pub struct SpecialProps {
constant KEY_LABEL (line 326) | const KEY_LABEL: &'static str = "key";
constant REF_LABEL (line 327) | const REF_LABEL: &'static str = "ref";
method pop_from (line 329) | fn pop_from(props: &mut PropList) -> syn::Result<Self> {
method iter (line 335) | fn iter(&self) -> impl Iterator<Item = &Prop> {
method check_all (line 341) | pub fn check_all(&self, f: impl FnMut(&Prop) -> syn::Result<()>) -> sy...
method wrap_node_ref_attr (line 345) | pub fn wrap_node_ref_attr(&self) -> TokenStream {
method wrap_key_attr (line 358) | pub fn wrap_key_attr(&self) -> TokenStream {
type Props (line 373) | pub struct Props {
type Error (line 396) | type Error = syn::Error;
method try_from (line 398) | fn try_from(mut prop_list: PropList) -> Result<Self, Self::Error> {
method parse (line 378) | fn parse(input: ParseStream) -> syn::Result<Self> {
type Target (line 383) | type Target = PropList;
method deref (line 385) | fn deref(&self) -> &Self::Target {
method deref_mut (line 390) | fn deref_mut(&mut self) -> &mut Self::Target {
FILE: packages/yew-macro/src/props/prop_macro.rs
function pop_last_punctuated (line 15) | fn pop_last_punctuated<T, P>(punctuated: &mut Punctuated<T, P>) -> Optio...
function is_associated_properties (line 25) | fn is_associated_properties(ty: &TypePath) -> bool {
type PropValue (line 44) | struct PropValue {
method parse (line 49) | fn parse(input: ParseStream) -> syn::Result<Self> {
method from (line 62) | fn from(prop_value: PropValue) -> Prop {
type PropsExpr (line 72) | struct PropsExpr {
method parse (line 78) | fn parse(input: ParseStream) -> syn::Result<Self> {
type PropsMacroInput (line 102) | pub struct PropsMacroInput {
method parse (line 107) | fn parse(input: ParseStream) -> syn::Result<Self> {
method to_tokens (line 125) | fn to_tokens(&self, tokens: &mut TokenStream) {
FILE: packages/yew-macro/src/stringify.rs
function stringify_at_runtime (line 10) | fn stringify_at_runtime(src: impl ToTokens) -> TokenStream {
type Stringify (line 19) | pub trait Stringify {
method try_into_lit (line 21) | fn try_into_lit(&self) -> Option<LitStr>;
method stringify (line 23) | fn stringify(&self) -> TokenStream;
method optimize_literals (line 26) | fn optimize_literals(&self) -> TokenStream
method optimize_literals_tagged (line 34) | fn optimize_literals_tagged(&self) -> Value
method try_into_lit (line 46) | fn try_into_lit(&self) -> Option<LitStr> {
method stringify (line 50) | fn stringify(&self) -> TokenStream {
method try_into_lit (line 71) | fn try_into_lit(&self) -> Option<LitStr> {
method stringify (line 75) | fn stringify(&self) -> TokenStream {
method try_into_lit (line 83) | fn try_into_lit(&self) -> Option<LitStr> {
method stringify (line 98) | fn stringify(&self) -> TokenStream {
method try_into_lit (line 106) | fn try_into_lit(&self) -> Option<LitStr> {
method stringify (line 114) | fn stringify(&self) -> TokenStream {
type Value (line 57) | pub enum Value {
method to_tokens (line 63) | fn to_tokens(&self, tokens: &mut TokenStream) {
FILE: packages/yew-macro/src/use_prepared_state.rs
type PreparedState (line 7) | pub struct PreparedState {
method rewrite_to_closure_with_async_block (line 63) | pub fn rewrite_to_closure_with_async_block(&self) -> ExprClosure {
method rewrite_to_closure_with_async_block (line 99) | pub fn rewrite_to_closure_with_async_block(&self) -> ExprClosure {
method to_token_stream_with_closure (line 103) | pub fn to_token_stream_with_closure(&self) -> TokenStream {
method to_token_stream_without_closure (line 121) | pub fn to_token_stream_without_closure(&self) -> TokenStream {
method parse (line 14) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/src/use_transitive_state.rs
type TransitiveState (line 7) | pub struct TransitiveState {
method to_token_stream_with_closure (line 61) | pub fn to_token_stream_with_closure(&self) -> TokenStream {
method to_token_stream_without_closure (line 74) | pub fn to_token_stream_without_closure(&self) -> TokenStream {
method parse (line 14) | fn parse(input: ParseStream) -> syn::Result<Self> {
FILE: packages/yew-macro/tests/classes_macro/classes-fail.rs
function compile_pass (line 3) | fn compile_pass() {
function main (line 21) | fn main() {}
FILE: packages/yew-macro/tests/classes_macro/classes-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function compile_pass (line 39) | fn compile_pass() {
function main (line 70) | fn main() {}
FILE: packages/yew-macro/tests/classes_macro_test.rs
function classes_macro (line 3) | fn classes_macro() {
FILE: packages/yew-macro/tests/derive_props/fail.rs
type Value (line 8) | struct Value;
type Props (line 10) | pub struct Props {
type Props (line 20) | pub struct Props {
type Props (line 30) | pub struct Props {
function required_props_should_be_set (line 34) | fn required_props_should_be_set() {
type Props (line 42) | pub struct Props {
function required_option_should_be_provided (line 46) | fn required_option_should_be_provided() {
type Props (line 54) | pub struct Props {
type Props (line 64) | pub struct Props {
type Props (line 74) | pub struct Props {
type Props (line 84) | pub struct Props {
type Props (line 94) | pub struct Props {
function foo (line 100) | fn foo(bar: i32) -> String {
type Props (line 108) | pub struct Props {
function foo (line 114) | fn foo() -> i32 {
function main (line 119) | fn main() {}
FILE: packages/yew-macro/tests/derive_props/pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
type Props (line 41) | pub struct Props<T: ::std::clone::Clone + ::std::default::Default + ::st...
function optional_prop_generics_should_work (line 46) | fn optional_prop_generics_should_work() {
type Value (line 54) | struct Value;
type Props (line 56) | pub struct Props<T: ::std::clone::Clone + ::std::cmp::PartialEq> {
function required_prop_generics_should_work (line 60) | fn required_prop_generics_should_work() {
type Props (line 67) | pub struct Props {
function order_is_alphabetized (line 73) | fn order_is_alphabetized() {
type Props (line 81) | pub struct Props<T>
function optional_prop_generics_should_work (line 89) | fn optional_prop_generics_should_work() {
type Props (line 97) | pub struct Props<
function optional_prop_generics_with_lifetime_should_work (line 106) | fn optional_prop_generics_with_lifetime_should_work() {
type Props (line 117) | pub struct Props<T: ::std::str::FromStr + ::std::clone::Clone + ::std::c...
function required_prop_generics_with_where_clause_should_work (line 124) | fn required_prop_generics_with_where_clause_should_work() {
type Foo (line 133) | pub enum Foo {
type Props (line 139) | pub struct Props {
function prop_or_value_should_work (line 144) | fn prop_or_value_should_work() {
type Props (line 155) | pub struct Props {
function prop_or_else_closure_should_work (line 160) | fn prop_or_else_closure_should_work() {
type Props (line 171) | pub struct Props<T: ::std::str::FromStr + ::std::clone::Clone + ::std::c...
function default_value (line 179) | fn default_value<T: ::std::str::FromStr + ::std::clone::Clone>(
function prop_or_else_function_with_generics_should_work (line 187) | fn prop_or_else_function_with_generics_should_work() {
type Foo (line 200) | pub struct Foo<S, M = S>
type Foo (line 214) | pub struct Foo<T, const N: usize>
type Props (line 224) | pub struct Props<T: ::std::clone::Clone + ::std::cmp::PartialEq> {
function optional_prop_generics_should_work (line 228) | fn optional_prop_generics_should_work() {
type Props (line 238) | struct Props {
type Props (line 247) | pub struct Props {
type Props (line 255) | struct Props {
function Inner (line 262) | fn Inner(_props: &Props) -> ::yew::html::Html {
function Main (line 267) | fn Main() -> ::yew::html::Html {
function main (line 275) | fn main() {}
FILE: packages/yew-macro/tests/derive_props_test.rs
function derive_props (line 3) | fn derive_props() {
FILE: packages/yew-macro/tests/function_attr_test.rs
function tests (line 3) | fn tests() {
FILE: packages/yew-macro/tests/function_component_attr/applied-to-non-fn-fail.rs
type Props (line 4) | struct Props {
type Test (line 9) | struct Test;
function main (line 11) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/async-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | async fn comp(props: &Props) -> Html {
function main (line 18) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/bad-name-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp(props: &Props) -> Html {
function comp_2 (line 18) | fn comp_2(props: &Props) -> Html {
function comp_3 (line 27) | fn comp_3(props: &Props) -> Html {
function component (line 36) | fn component(props: &Props) -> Html {
function main (line 44) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/bad-props-param-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp(props: Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/bad-return-type-fail.rs
type Props (line 4) | struct Props {
function comp_1 (line 9) | fn comp_1(_props: &Props) {}
function comp (line 12) | fn comp(_props: &Props) -> u32 {
function main (line 16) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/const-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | const fn comp(props: &Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/extern-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | extern "C" fn comp(props: &Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/generic-lifetime-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp<'a>(props: &'a Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/generic-pass.rs
type bool (line 4) | pub struct bool;
type char (line 6) | pub struct char;
type f32 (line 8) | pub struct f32;
type f64 (line 10) | pub struct f64;
type i128 (line 12) | pub struct i128;
type i16 (line 14) | pub struct i16;
type i32 (line 16) | pub struct i32;
type i64 (line 18) | pub struct i64;
type i8 (line 20) | pub struct i8;
type isize (line 22) | pub struct isize;
type str (line 24) | pub struct str;
type u128 (line 26) | pub struct u128;
type u16 (line 28) | pub struct u16;
type u32 (line 30) | pub struct u32;
type u64 (line 32) | pub struct u64;
type u8 (line 34) | pub struct u8;
type usize (line 36) | pub struct usize;
type Props (line 39) | struct Props {
function comp (line 44) | fn comp<P>(_props: &P) -> ::yew::Html
function comp1 (line 54) | fn comp1<T1, T2>(_props: &()) -> ::yew::Html {
function const_generics (line 61) | fn const_generics<const N: ::std::primitive::i32>() -> ::yew::Html {
function compile_pass (line 69) | fn compile_pass() {
function main (line 76) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/generic-props-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp<P>(_props: &P) -> Html
type MissingTypeBounds (line 18) | struct MissingTypeBounds;
function compile_fail (line 20) | fn compile_fail() {
function main (line 33) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/hook_location-fail.rs
type Ctx (line 4) | struct Ctx;
function Comp (line 7) | fn Comp() -> Html {
function main (line 39) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/hook_location-pass.rs
type Ctx (line 7) | struct Ctx;
function Comp (line 10) | fn Comp() -> ::yew::prelude::Html {
function main (line 29) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/lifetime-props-param-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp(props: &'static Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/multiple-param-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp(props: &Props, invalid: String) -> Html {
function comp3 (line 19) | fn comp3(props: &Props, invalid: String, another_invalid: u32) -> Html {
function main (line 29) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/mut-ref-props-param-fail.rs
type Props (line 4) | struct Props {
function comp (line 9) | fn comp(props: &mut Props) -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/no-name-default-pass.rs
type Props (line 3) | struct Props {
function Comp (line 8) | fn Comp(props: &Props) -> ::yew::prelude::Html {
function main (line 16) | fn main() {
FILE: packages/yew-macro/tests/function_component_attr/with-defaulted-type-param-pass.rs
type CompProps (line 3) | pub struct CompProps<A> {
function eq (line 9) | fn eq(&self, _rhs: &Self) -> bool {
function comp (line 15) | pub fn comp<A = ()>(_props: &CompProps<A>) -> ::yew::prelude::Html {
function app (line 20) | pub fn app() -> ::yew::prelude::Html {
function main (line 24) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/with-props-pass.rs
type bool (line 3) | pub struct bool;
type char (line 5) | pub struct char;
type f32 (line 7) | pub struct f32;
type f64 (line 9) | pub struct f64;
type i128 (line 11) | pub struct i128;
type i16 (line 13) | pub struct i16;
type i32 (line 15) | pub struct i32;
type i64 (line 17) | pub struct i64;
type i8 (line 19) | pub struct i8;
type isize (line 21) | pub struct isize;
type str (line 23) | pub struct str;
type u128 (line 25) | pub struct u128;
type u16 (line 27) | pub struct u16;
type u32 (line 29) | pub struct u32;
type u64 (line 31) | pub struct u64;
type u8 (line 33) | pub struct u8;
type usize (line 35) | pub struct usize;
type Props (line 38) | struct Props {
function comp (line 43) | fn comp(props: &Props) -> ::yew::Html {
function main (line 51) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/with-receiver-fail.rs
type Props (line 4) | struct Props {
type Test (line 8) | struct Test;
method comp (line 12) | fn comp(self, props: &Props) -> Html {
function main (line 21) | fn main() {}
FILE: packages/yew-macro/tests/function_component_attr/without-props-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function comp (line 40) | fn comp() -> ::yew::Html {
function main (line 48) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-call-generics-pass.rs
function use_reducer_default_action (line 4) | fn use_reducer_default_action<T>() -> T::Action
function main (line 12) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-const-generic-pass.rs
function use_a_const (line 4) | fn use_a_const<const N: u32>() -> u32 {
function main (line 8) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-dynamic-dispatch-pass.rs
function use_boxed_fn (line 4) | fn use_boxed_fn(_f: ::std::boxed::Box<dyn::std::ops::Fn(&str) -> &str>) {
function main (line 8) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-impl-trait-pass.rs
function use_some_string (line 5) | fn use_some_string(a: impl ::std::convert::Into<::std::string::String>) ...
function use_impl_fn (line 10) | fn use_impl_fn<T, U>(_callback: impl ::std::prelude::rust_2021::Fn(&T) -...
function main (line 12) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-lifetime-pass.rs
function use_as_is (line 4) | fn use_as_is<'a>(input: &'a ()) -> &'a () {
function main (line 8) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-must-use-fail.rs
function not_a_hook (line 5) | fn not_a_hook() {
function main (line 9) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-must-use-pass.rs
function use_my_effect (line 6) | fn use_my_effect() {
function Comp (line 11) | fn Comp() -> Html {
function main (line 17) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-return-impl-trait-pass.rs
function use_deref_as_u32 (line 4) | fn use_deref_as_u32() -> impl ::std::ops::Deref<Target = ::std::primitiv...
function main (line 8) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-return-ref-pass.rs
function use_str_ref (line 4) | fn use_str_ref(f: &::std::primitive::str) -> &::std::primitive::str {
function main (line 8) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook-trait-item-pass.rs
type QueryState (line 3) | pub struct QueryState<T> {
type MyTrait (line 7) | pub trait MyTrait {
function use_query_state (line 13) | pub fn use_query_state<Props>(
function main (line 22) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook_location-fail.rs
type Ctx (line 4) | struct Ctx;
function use_some_html (line 7) | fn use_some_html() -> Html {
function main (line 39) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook_location-pass.rs
type Ctx (line 8) | struct Ctx;
function use_some_html (line 11) | fn use_some_html() -> ::yew::prelude::Html {
function main (line 30) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook_macro-fail.rs
function use_some_macro_inner (line 4) | pub fn use_some_macro_inner(val: &str) -> String {
function Comp (line 18) | fn Comp() -> Html {
function main (line 30) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr/hook_macro-pass.rs
function use_some_macro_inner (line 4) | pub fn use_some_macro_inner(val: &str) -> ::std::string::String {
function Comp (line 19) | fn Comp() -> ::yew::Html {
function main (line 28) | fn main() {}
FILE: packages/yew-macro/tests/hook_attr_test.rs
function tests (line 3) | fn tests() {
FILE: packages/yew-macro/tests/hook_macro/use_prepared_state-fail.rs
function Comp (line 5) | fn Comp() -> HtmlResult {
function Comp2 (line 22) | fn Comp2() -> HtmlResult {
function main (line 38) | fn main() {}
FILE: packages/yew-macro/tests/hook_macro/use_transitive_state-fail.rs
function Comp (line 5) | fn Comp() -> HtmlResult {
function Comp2 (line 20) | fn Comp2() -> HtmlResult {
function main (line 34) | fn main() {}
FILE: packages/yew-macro/tests/hook_macro_test.rs
function tests (line 3) | fn tests() {
FILE: packages/yew-macro/tests/html_lints/fail.rs
function main (line 3) | fn main() {
FILE: packages/yew-macro/tests/html_lints_test.rs
function test_html_lints (line 4) | fn test_html_lints() {
FILE: packages/yew-macro/tests/html_macro/as-return-value-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
type MyComponent (line 39) | pub struct MyComponent;
type Message (line 41) | type Message = ();
type Properties (line 42) | type Properties = ();
method create (line 43) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 46) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
function make_my_component (line 53) | fn make_my_component()-> ::yew::virtual_dom::VChild<MyComponent>{
function make_my_component_html (line 59) | fn make_my_component_html()-> ::yew::Html{
function main (line 63) | fn main(){}
FILE: packages/yew-macro/tests/html_macro/block-fail.rs
function compile_fail (line 3) | fn compile_fail() {
function main (line 19) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/block-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro/component-any-children-pass.rs
type bool (line 3) | pub struct bool;
type char (line 5) | pub struct char;
type f32 (line 7) | pub struct f32;
type f64 (line 9) | pub struct f64;
type i128 (line 11) | pub struct i128;
type i16 (line 13) | pub struct i16;
type i32 (line 15) | pub struct i32;
type i64 (line 17) | pub struct i64;
type i8 (line 19) | pub struct i8;
type isize (line 21) | pub struct isize;
type str (line 23) | pub struct str;
type u128 (line 25) | pub struct u128;
type u16 (line 27) | pub struct u16;
type u32 (line 29) | pub struct u32;
type u64 (line 31) | pub struct u64;
type u8 (line 33) | pub struct u8;
type usize (line 35) | pub struct usize;
type ContainerProperties (line 40) | pub struct ContainerProperties {
type Container (line 49) | pub struct Container;
type Message (line 51) | type Message = ();
type Properties (line 52) | type Properties = ContainerProperties;
method create (line 54) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 58) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type ChildrenVariants (line 64) | pub enum ChildrenVariants {
method from (line 70) | fn from(comp: ::yew::virtual_dom::VChild<Child>) -> Self {
method from (line 76) | fn from(comp: ::yew::virtual_dom::VChild<AltChild>) -> Self {
method into (line 82) | fn into(self) -> ::yew::virtual_dom::VNode {
type ChildProperties (line 97) | pub struct ChildProperties {
type Child (line 113) | pub struct Child;
type Message (line 115) | type Message = ();
type Properties (line 116) | type Properties = ChildProperties;
method create (line 118) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 122) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type AltChild (line 127) | pub struct AltChild;
type Message (line 129) | type Message = ();
type Properties (line 130) | type Properties = ();
method create (line 132) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 136) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type RenderPropProps (line 148) | pub struct RenderPropProps {
function RenderPropComp (line 155) | pub fn RenderPropComp(_props: &RenderPropProps) -> ::yew::Html {
function compile_pass (line 159) | fn compile_pass() {
function main (line 330) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/component-fail.rs
type ChildProperties (line 5) | pub struct ChildProperties {
type Child (line 11) | pub struct Child;
type Message (line 13) | type Message = ();
type Properties (line 14) | type Properties = ChildProperties;
method create (line 16) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 19) | fn view(&self, _ctx: &Context<Self>) -> Html {
type ChildContainerProperties (line 25) | pub struct ChildContainerProperties {
type ChildContainer (line 29) | pub struct ChildContainer;
type Message (line 31) | type Message = ();
type Properties (line 32) | type Properties = ChildContainerProperties;
method create (line 34) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 37) | fn view(&self, _ctx: &Context<Self>) -> Html {
function compile_fail (line 42) | fn compile_fail() {
type HtmlInPropsProperties (line 140) | pub struct HtmlInPropsProperties {
function HtmlInProps (line 144) | fn HtmlInProps(props: &HtmlInPropsProperties) -> Html { let _ = (); unim...
function not_expressions (line 146) | fn not_expressions() {
function mismatch_closing_tags (line 151) | fn mismatch_closing_tags() {
function main (line 181) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/component-pass.rs
type bool (line 3) | pub struct bool;
type char (line 5) | pub struct char;
type f32 (line 7) | pub struct f32;
type f64 (line 9) | pub struct f64;
type i128 (line 11) | pub struct i128;
type i16 (line 13) | pub struct i16;
type i32 (line 15) | pub struct i32;
type i64 (line 17) | pub struct i64;
type i8 (line 19) | pub struct i8;
type isize (line 21) | pub struct isize;
type str (line 23) | pub struct str;
type u128 (line 25) | pub struct u128;
type u16 (line 27) | pub struct u16;
type u32 (line 29) | pub struct u32;
type u64 (line 31) | pub struct u64;
type u8 (line 33) | pub struct u8;
type usize (line 35) | pub struct usize;
type ContainerProperties (line 40) | pub struct ContainerProperties {
type Container (line 48) | pub struct Container;
type Message (line 50) | type Message = ();
type Properties (line 51) | type Properties = ContainerProperties;
method create (line 53) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 57) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type ChildrenVariants (line 63) | pub enum ChildrenVariants {
method from (line 69) | fn from(comp: ::yew::virtual_dom::VChild<Child>) -> Self {
method from (line 75) | fn from(comp: ::yew::virtual_dom::VChild<AltChild>) -> Self {
method into (line 81) | fn into(self) -> ::yew::virtual_dom::VNode {
type ChildProperties (line 96) | pub struct ChildProperties {
type Child (line 112) | pub struct Child;
type Message (line 114) | type Message = ();
type Properties (line 115) | type Properties = ChildProperties;
method create (line 117) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 121) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type AltChild (line 126) | pub struct AltChild;
type Message (line 128) | type Message = ();
type Properties (line 129) | type Properties = ();
method create (line 131) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 135) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type ChildContainerProperties (line 143) | pub struct ChildContainerProperties {
type ChildContainer (line 149) | pub struct ChildContainer;
type Message (line 151) | type Message = ();
type Properties (line 152) | type Properties = ChildContainerProperties;
method create (line 154) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 158) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
function compile_pass (line 167) | fn compile_pass() {
type HtmlPassedAsPropProperties (line 379) | pub struct HtmlPassedAsPropProperties {
type HtmlPassedAsProp (line 383) | pub struct HtmlPassedAsProp;
type Message (line 385) | type Message = ();
type Properties (line 386) | type Properties = HtmlPassedAsPropProperties;
method create (line 388) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 392) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type HtmlPassedAsPropContainer (line 397) | pub struct HtmlPassedAsPropContainer;
type Message (line 399) | type Message = ();
type Properties (line 400) | type Properties = ();
method create (line 402) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 406) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
function main (line 418) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/component-unimplemented-fail.rs
type Unimplemented (line 3) | struct Unimplemented;
function compile_fail (line 5) | fn compile_fail() {
function main (line 9) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/dyn-element-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro/element-fail.rs
type NotToString (line 3) | struct NotToString;
function compile_fail (line 5) | fn compile_fail() {
function main (line 93) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/for-fail.rs
constant KEY (line 2) | const KEY: u32 = 42;
function main (line 5) | fn main() {
FILE: packages/yew-macro/tests/html_macro/for-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro/generic-component-fail.rs
type Generic (line 4) | pub struct Generic<T> {
type Message (line 12) | type Message = ();
type Properties (line 13) | type Properties = ();
method create (line 15) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 18) | fn view(&self, _ctx: &Context<Self>) -> Html {
type Generic2 (line 23) | pub struct Generic2<T1, T2> {
type Message (line 32) | type Message = ();
type Properties (line 33) | type Properties = ();
method create (line 35) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 38) | fn view(&self, _ctx: &Context<Self>) -> Html {
function compile_fail (line 42) | fn compile_fail() {
function main (line 54) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/generic-component-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
type Generic (line 39) | pub struct Generic<T> {
type Message (line 47) | type Message = ();
type Properties (line 48) | type Properties = ();
function create (line 50) | fn create(_ctx: &::yew::Context<Self>) -> Self {
function view (line 53) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
type Generic2 (line 58) | pub struct Generic2<T1, T2> {
type Message (line 67) | type Message = ();
type Properties (line 68) | type Properties = ();
function create (line 70) | fn create(_ctx: &::yew::Context<Self>) -> Self {
function view (line 73) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
function compile_pass (line 78) | fn compile_pass() {
function main (line 99) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/html-element-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function compile_pass (line 39) | fn compile_pass() {
function main (line 148) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/html-if-fail.rs
function compile_fail (line 3) | fn compile_fail() {
function main (line 12) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/html-if-pass.rs
function compile_pass_lit (line 3) | fn compile_pass_lit() {
function compile_pass_expr (line 18) | fn compile_pass_expr() {
function main (line 35) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/html-node-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function compile_pass (line 39) | fn compile_pass() {
function main (line 59) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/iterable-fail.rs
function compile_fail (line 3) | fn compile_fail() {
function main (line 23) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/iterable-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function empty_vec (line 39) | fn empty_vec() -> ::std::vec::Vec<::yew::Html> {
function empty_iter (line 43) | fn empty_iter() -> impl ::std::iter::Iterator<Item = ::yew::Html> {
function main (line 47) | fn main() {
FILE: packages/yew-macro/tests/html_macro/list-fail.rs
function compile_fail (line 3) | fn compile_fail() {
function main (line 28) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/list-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro/missing-props-diagnostics-fail.rs
function App (line 4) | pub fn App() -> Html {
function App1 (line 11) | pub fn App1() -> Html {
function App2 (line 18) | pub fn App2() -> Html {
type FooProps (line 25) | pub struct FooProps {
function Foo (line 31) | pub fn Foo(_props: &FooProps) -> Html {
function main (line 35) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/node-fail.rs
function compile_fail (line 3) | fn compile_fail() {
function main (line 21) | fn main() {}
FILE: packages/yew-macro/tests/html_macro/node-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro/svg-pass.rs
type bool (line 5) | pub struct bool;
type char (line 7) | pub struct char;
type f32 (line 9) | pub struct f32;
type f64 (line 11) | pub struct f64;
type i128 (line 13) | pub struct i128;
type i16 (line 15) | pub struct i16;
type i32 (line 17) | pub struct i32;
type i64 (line 19) | pub struct i64;
type i8 (line 21) | pub struct i8;
type isize (line 23) | pub struct isize;
type str (line 25) | pub struct str;
type u128 (line 27) | pub struct u128;
type u16 (line 29) | pub struct u16;
type u32 (line 31) | pub struct u32;
type u64 (line 33) | pub struct u64;
type u8 (line 35) | pub struct u8;
type usize (line 37) | pub struct usize;
function main (line 39) | fn main() {
FILE: packages/yew-macro/tests/html_macro_test.rs
function html_macro (line 5) | fn html_macro() {
function dynamic_tags_catch_void_elements (line 17) | fn dynamic_tags_catch_void_elements() {
function dynamic_tags_catch_non_ascii (line 27) | fn dynamic_tags_catch_non_ascii() {
function html_nested_macro_on_html_element (line 36) | fn html_nested_macro_on_html_element() {
FILE: packages/yew-macro/tests/props_macro/props-fail.rs
type Props (line 4) | struct Props {
function compile_fail (line 8) | fn compile_fail() {
function main (line 18) | fn main() {}
FILE: packages/yew-macro/tests/props_macro/props-pass.rs
type bool (line 4) | pub struct bool;
type char (line 6) | pub struct char;
type f32 (line 8) | pub struct f32;
type f64 (line 10) | pub struct f64;
type i128 (line 12) | pub struct i128;
type i16 (line 14) | pub struct i16;
type i32 (line 16) | pub struct i32;
type i64 (line 18) | pub struct i64;
type i8 (line 20) | pub struct i8;
type isize (line 22) | pub struct isize;
type str (line 24) | pub struct str;
type u128 (line 26) | pub struct u128;
type u16 (line 28) | pub struct u16;
type u32 (line 30) | pub struct u32;
type u64 (line 32) | pub struct u64;
type u8 (line 34) | pub struct u8;
type usize (line 36) | pub struct usize;
type Props (line 39) | struct Props {
function pass_simple_props (line 45) | fn pass_simple_props() {
type RawIdentProps (line 52) | pub struct RawIdentProps {
type SelfRefProps (line 59) | pub struct SelfRefProps<'a, T> {
function eq (line 69) | fn eq(&self, _: &Self) -> ::std::primitive::bool {
function pass_raw_idents (line 74) | fn pass_raw_idents() {
type BuildProp (line 81) | struct BuildProp {
function pass_build_prop (line 85) | fn pass_build_prop() {
type GenericProps (line 90) | struct GenericProps<T: ::std::cmp::PartialEq> {
function pass_generic_props (line 94) | fn pass_generic_props<T: ::std::cmp::PartialEq>(the_item: T) {
function main (line 98) | fn main() {}
FILE: packages/yew-macro/tests/props_macro/resolve-prop-fail.rs
type Props (line 4) | struct Props {}
type MyComp (line 6) | struct MyComp;
type Message (line 8) | type Message = ();
type Properties (line 9) | type Properties = Props;
method create (line 11) | fn create(_ctx: &Context<Self>) -> Self {
method view (line 14) | fn view(&self, _ctx: &Context<Self>) -> Html {
type NotAComponent (line 19) | trait NotAComponent {
type Properties (line 25) | type Properties = ();
type MyNotAComponent (line 23) | struct MyNotAComponent;
function compile_fail (line 28) | fn compile_fail() {
function main (line 34) | fn main() {}
FILE: packages/yew-macro/tests/props_macro/resolve-prop-pass.rs
type bool (line 4) | pub struct bool;
type char (line 6) | pub struct char;
type f32 (line 8) | pub struct f32;
type f64 (line 10) | pub struct f64;
type i128 (line 12) | pub struct i128;
type i16 (line 14) | pub struct i16;
type i32 (line 16) | pub struct i32;
type i64 (line 18) | pub struct i64;
type i8 (line 20) | pub struct i8;
type isize (line 22) | pub struct isize;
type str (line 24) | pub struct str;
type u128 (line 26) | pub struct u128;
type u16 (line 28) | pub struct u16;
type u32 (line 30) | pub struct u32;
type u64 (line 32) | pub struct u64;
type u8 (line 34) | pub struct u8;
type usize (line 36) | pub struct usize;
type Props (line 39) | struct Props {
type MyComp (line 43) | struct MyComp;
type Message (line 45) | type Message = ();
type Properties (line 46) | type Properties = Props;
method create (line 48) | fn create(_ctx: &::yew::Context<Self>) -> Self {
method view (line 51) | fn view(&self, _ctx: &::yew::Context<Self>) -> ::yew::Html {
function compile_pass (line 56) | fn compile_pass() {
function main (line 64) | fn main() {}
FILE: packages/yew-macro/tests/props_macro_test.rs
function props_macro (line 3) | fn props_macro() {
function props_order (line 10) | fn props_order() {
FILE: packages/yew-router-macro/src/lib.rs
function routable_derive (line 27) | pub fn routable_derive(input: proc_macro::TokenStream) -> proc_macro::To...
FILE: packages/yew-router-macro/src/routable_derive.rs
constant AT_ATTR_IDENT (line 8) | const AT_ATTR_IDENT: &str = "at";
constant NOT_FOUND_ATTR_IDENT (line 9) | const NOT_FOUND_ATTR_IDENT: &str = "not_found";
type Routable (line 11) | pub struct Routable {
method build_from_path (line 125) | fn build_from_path(&self) -> TokenStream {
method build_to_path (line 161) | fn build_to_path(&self) -> TokenStream {
method parse (line 19) | fn parse(input: ParseStream) -> syn::Result<Self> {
function parse_variants_attributes (line 49) | fn parse_variants_attributes(
function routable_derive_impl (line 217) | pub fn routable_derive_impl(input: Routable) -> TokenStream {
FILE: packages/yew-router-macro/tests/routable_derive/bad-ats-fail.rs
type Routes (line 2) | enum Routes {
type RoutesTwo (line 7) | enum RoutesTwo {
function main (line 13) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/invalid-not-found-fail.rs
type RoutesOne (line 2) | enum RoutesOne {
type RoutesTwo (line 12) | enum RoutesTwo {
function main (line 18) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/relative-path-fail.rs
type Routes (line 2) | enum Routes {
function main (line 7) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/route-with-hash-fail.rs
type Routes (line 2) | enum Routes {
function main (line 7) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/struct-fail.rs
type Test (line 2) | struct Test {}
function main (line 4) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/unnamed-fields-fail.rs
type Routes (line 2) | enum Routes {
function main (line 7) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive/valid-pass.rs
type Routes (line 4) | enum Routes {
type MoreRoutes (line 17) | enum MoreRoutes {
function main (line 24) | fn main() {}
FILE: packages/yew-router-macro/tests/routable_derive_test.rs
function tests (line 3) | fn tests() {
function main (line 9) | fn main() {}
FILE: packages/yew-router/src/components/link.rs
type LinkProps (line 12) | pub struct LinkProps<R, Q = (), S = ()>
function Link (line 40) | pub fn Link<R, Q = (), S = ()>(props: &LinkProps<R, Q, S>) -> Html
FILE: packages/yew-router/src/components/redirect.rs
type RedirectProps (line 9) | pub struct RedirectProps<R: Routable> {
function redirect (line 16) | pub fn redirect<R>(props: &RedirectProps<R>) -> Html
FILE: packages/yew-router/src/hooks.rs
function use_navigator (line 12) | pub fn use_navigator() -> Option<Navigator> {
function use_location (line 18) | pub fn use_location() -> Option<Location> {
function use_route (line 31) | pub fn use_route<R>() -> Option<R>
FILE: packages/yew-router/src/macro_helpers.rs
function encode_path_for_url (line 3) | pub fn encode_path_for_url(path: &str) -> String {
type Router (line 14) | pub type Router = route_recognizer::Router<String>;
function build_router (line 17) | pub fn build_router<R: Routable>() -> Router {
function recognize_with_router (line 28) | pub fn recognize_with_router<R: Routable>(router: &Router, pathname: &st...
FILE: packages/yew-router/src/navigator.rs
type NavigationError (line 7) | pub type NavigationError = HistoryError;
type NavigationResult (line 8) | pub type NavigationResult<T> = HistoryResult<T>;
type NavigatorKind (line 12) | pub enum NavigatorKind {
type Navigator (line 23) | pub struct Navigator {
method new (line 29) | pub(crate) fn new(history: AnyHistory, basename: Option<String>) -> Se...
method basename (line 37) | pub fn basename(&self) -> Option<&str> {
method back (line 42) | pub fn back(&self) {
method forward (line 47) | pub fn forward(&self) {
method go (line 54) | pub fn go(&self, delta: isize) {
method push (line 59) | pub fn push<R>(&self, route: &R)
method replace (line 67) | pub fn replace<R>(&self, route: &R)
method push_with_state (line 75) | pub fn push_with_state<R, T>(&self, route: &R, state: T)
method replace_with_state (line 85) | pub fn replace_with_state<R, T>(&self, route: &R, state: T)
method push_with_query (line 95) | pub fn push_with_query<R, Q>(&self, route: &R, query: Q) -> Result<(),...
method replace_with_query (line 105) | pub fn replace_with_query<R, Q>(&self, route: &R, query: Q) -> Result<...
method push_with_query_and_state (line 115) | pub fn push_with_query_and_state<R, Q, T>(
method replace_with_query_and_state (line 131) | pub fn replace_with_query_and_state<R, Q, T>(
method kind (line 150) | pub fn kind(&self) -> NavigatorKind {
method prefix_basename (line 158) | pub(crate) fn prefix_basename<'a>(&self, route_s: &'a str) -> Cow<'a, ...
method strip_basename (line 171) | pub(crate) fn strip_basename<'a>(&self, path: Cow<'a, str>) -> Cow<'a,...
FILE: packages/yew-router/src/routable.rs
type Routable (line 16) | pub trait Routable: Clone + PartialEq {
method from_path (line 18) | fn from_path(path: &str, params: &HashMap<&str, &str>) -> Option<Self>;
method to_path (line 21) | fn to_path(&self) -> String;
method routes (line 24) | fn routes() -> Vec<&'static str>;
method not_found_route (line 27) | fn not_found_route() -> Option<Self>;
method recognize (line 30) | fn recognize(pathname: &str) -> Option<Self>;
method from_path (line 43) | fn from_path(path: &str, params: &HashMap<&str, &str>) -> Option<Self> {
method to_path (line 54) | fn to_path(&self) -> String {
method routes (line 58) | fn routes() -> Vec<&'static str> {
method not_found_route (line 62) | fn not_found_route() -> Option<Self> {
method recognize (line 68) | fn recognize(pathname: &str) -> Option<Self> {
type AnyRoute (line 38) | pub struct AnyRoute {
method new (line 76) | pub fn new<S: Into<String>>(pathname: S) -> Self {
FILE: packages/yew-router/src/router.rs
type RouterProps (line 15) | pub struct RouterProps {
type LocationContext (line 24) | pub(crate) struct LocationContext {
method location (line 31) | pub fn location(&self) -> Location {
method eq (line 37) | fn eq(&self, rhs: &Self) -> bool {
type Action (line 43) | type Action = Location;
method reduce (line 45) | fn reduce(self: Rc<Self>, action: Self::Action) -> Rc<Self> {
type NavigatorContext (line 55) | pub(crate) struct NavigatorContext {
method navigator (line 60) | pub fn navigator(&self) -> Navigator {
function base_router (line 70) | fn base_router(props: &RouterProps) -> Html {
function router (line 153) | pub fn router(props: &RouterProps) -> Html {
type ConcreteRouterProps (line 161) | pub struct ConcreteRouterProps {
function browser_router (line 177) | pub fn browser_router(props: &ConcreteRouterProps) -> Html {
function hash_router (line 200) | pub fn hash_router(props: &ConcreteRouterProps) -> Html {
FILE: packages/yew-router/src/scope_ext.rs
type LocationHandle (line 10) | pub struct LocationHandle {
type NavigatorHandle (line 15) | pub struct NavigatorHandle {
type RouterScopeExt (line 78) | pub trait RouterScopeExt {
method navigator (line 80) | fn navigator(&self) -> Option<Navigator>;
method location (line 83) | fn location(&self) -> Option<Location>;
method route (line 86) | fn route<R>(&self) -> Option<R>
method add_location_listener (line 97) | fn add_location_listener(&self, cb: Callback<Location>) -> Option<Loca...
method add_navigator_listener (line 106) | fn add_navigator_listener(&self, cb: Callback<Navigator>) -> Option<Na...
method navigator (line 110) | fn navigator(&self) -> Option<Navigator> {
method location (line 115) | fn location(&self) -> Option<Location> {
method route (line 120) | fn route<R>(&self) -> Option<R>
method add_location_listener (line 132) | fn add_location_listener(&self, cb: Callback<Location>) -> Option<Loca...
method add_navigator_listener (line 139) | fn add_navigator_listener(&self, cb: Callback<Navigator>) -> Option<Na...
FILE: packages/yew-router/src/switch.rs
type SwitchProps (line 9) | pub struct SwitchProps<R>
function Switch (line 28) | pub fn Switch<R>(props: &SwitchProps<R>) -> Html
FILE: packages/yew-router/src/utils.rs
function strip_slash_suffix (line 5) | pub(crate) fn strip_slash_suffix(path: &str) -> &str {
function base_url (line 16) | pub fn base_url() -> Option<String> {
function fetch_base_url (line 25) | pub fn fetch_base_url() -> Option<String> {
function compose_path (line 46) | pub fn compose_path(pathname: &str, query: &str) -> Option<String> {
function compose_path (line 59) | pub fn compose_path(pathname: &str, query: &str) -> Option<String> {
type Routes (line 84) | enum Routes {
function test_base_url (line 94) | fn test_base_url() {
function test_compose_path (line 113) | fn test_compose_path() {
FILE: packages/yew-router/tests/basename.rs
type Query (line 19) | struct Query {
type Routes (line 24) | enum Routes {
type NoProps (line 34) | struct NoProps {
function no (line 39) | fn no(props: &NoProps) -> Html {
function component (line 53) | fn component() -> Html {
function root (line 104) | fn root() -> Html {
function router_works (line 121) | async fn router_works() {
FILE: packages/yew-router/tests/browser_router.rs
type Query (line 19) | struct Query {
type Routes (line 24) | enum Routes {
type NoProps (line 34) | struct NoProps {
function no (line 39) | fn no(props: &NoProps) -> Html {
function component (line 53) | fn component() -> Html {
function root (line 104) | fn root() -> Html {
function router_works (line 121) | async fn router_works() {
FILE: packages/yew-router/tests/hash_router.rs
type Query (line 19) | struct Query {
type Routes (line 24) | enum Routes {
type NoProps (line 34) | struct NoProps {
function no (line 39) | fn no(props: &NoProps) -> Html {
function component (line 53) | fn component() -> Html {
function root (line 104) | fn root() -> Html {
function router_works (line 121) | async fn router_works() {
FILE: packages/yew-router/tests/link.rs
type PageParam (line 22) | struct PageParam {
type SearchParams (line 27) | struct SearchParams {
method new (line 33) | fn new(q: &str) -> Self {
method new_with_lang (line 40) | fn new_with_lang(q: &str, lang: &str) -> Self {
type Routes (line 49) | enum Routes {
type NavigationMenuProps (line 57) | struct NavigationMenuProps {
function navigation_menu (line 63) | fn navigation_menu(props: &NavigationMenuProps) -> Html {
function root_for_browser_router (line 102) | fn root_for_browser_router() -> Html {
function link_in_browser_router (line 110) | async fn link_in_browser_router() {
type BasenameProps (line 138) | struct BasenameProps {
function root_for_basename (line 144) | fn root_for_basename(props: &BasenameProps) -> Html {
function link_with_basename (line 152) | async fn link_with_basename(correct_initial_path: bool) {
function root_for_hash_router (line 287) | fn root_for_hash_router() -> Html {
function link_in_hash_router (line 295) | async fn link_in_hash_router() {
function sequential_tests (line 324) | async fn sequential_tests() {
FILE: packages/yew-router/tests/router_unit_tests.rs
function router_always_404 (line 10) | fn router_always_404() {
function router_trailing_slash (line 33) | fn router_trailing_slash() {
function router_url_encoding (line 56) | fn router_url_encoding() {
function router_wildcard_encoding (line 79) | fn router_wildcard_encoding() {
FILE: packages/yew-router/tests/url_encoded_routes.rs
type AppRoute (line 16) | enum AppRoute {
function Comp (line 24) | fn Comp() -> Html {
function root (line 44) | fn root() -> Html {
function url_encoded_roundtrip (line 53) | async fn url_encoded_roundtrip() {
FILE: packages/yew-router/tests/utils.rs
function obtain_result_by_id (line 4) | pub fn obtain_result_by_id(id: &str) -> String {
function click (line 12) | pub fn click(selector: &str) {
function history_length (line 23) | pub fn history_length() -> u32 {
function link_href (line 32) | pub fn link_href(selector: &str) -> String {
FILE: packages/yew/src/app_handle.rs
type AppHandle (line 13) | pub struct AppHandle<COMP: BaseComponent> {
function mount_with_props (line 31) | pub(crate) fn mount_with_props(host: Element, props: Rc<COMP::Properties...
function update (line 55) | pub fn update(&mut self, new_props: COMP::Properties) {
function destroy (line 64) | pub fn destroy(self) {
type Target (line 73) | type Target = Scope<COMP>;
method deref (line 75) | fn deref(&self) -> &Self::Target {
function clear_element (line 81) | fn clear_element(host: &Element) {
function hydrate_with_props (line 101) | pub(crate) fn hydrate_with_props(host: Element, props: Rc<COMP::Properti...
FILE: packages/yew/src/callback.rs
type Callback (line 176) | pub struct Callback<IN, OUT = ()> {
type CallbackRef (line 186) | pub struct CallbackRef<IN, OUT = ()> {
type CallbackRefMut (line 196) | pub struct CallbackRefMut<IN, OUT = ()> {
function emit (line 210) | fn emit<T, I, R: 'static + Clone, F, OUT>(values: I, f: F) -> Vec<R>
function test_callback (line 228) | fn test_callback() {
function test_reform (line 233) | fn test_reform() {
function test_filter_reform (line 241) | fn test_filter_reform() {
function test_ref (line 253) | fn test_ref() {
function test_ref_mut (line 259) | fn test_ref_mut() {
function test_reform_ref (line 267) | fn test_reform_ref() {
function test_reform_ref_mut (line 274) | fn test_reform_ref_mut() {
function test_filter_reform_ref (line 286) | fn test_filter_reform_ref() {
function test_filter_reform_ref_mut (line 294) | fn test_filter_reform_ref_mut() {
FILE: packages/yew/src/context.rs
type ContextProviderProps (line 12) | pub struct ContextProviderProps<T: Clone + PartialEq> {
type ContextProvider (line 25) | pub struct ContextProvider<T: Clone + PartialEq + 'static> {
type ContextHandle (line 33) | pub struct ContextHandle<T: Clone + PartialEq + 'static> {
method drop (line 39) | fn drop(&mut self) {
function subscribe_consumer (line 49) | pub(crate) fn subscribe_consumer(
function notify_consumers (line 67) | fn notify_consumers(&mut self) {
type Message (line 81) | type Message = ();
type Properties (line 82) | type Properties = ContextProviderProps<T>;
method create (line 84) | fn create(ctx: &Context<Self>) -> Self {
method changed (line 92) | fn changed(&mut self, ctx: &Context<Self>, old_props: &Self::Properties)...
method view (line 105) | fn view(&self, ctx: &Context<Self>) -> Html {
FILE: packages/yew/src/dom_bundle/bcomp.rs
type BComp (line 14) | pub(super) struct BComp {
method key (line 25) | pub fn key(&self) -> Option<&Key> {
method fmt (line 31) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method detach (line 39) | fn detach(self, _root: &BSubtree, _parent: &Element, parent_to_detach: b...
method shift (line 43) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 51) | type Bundle = BComp;
method attach (line 53) | fn attach(
method reconcile_node (line 80) | fn reconcile_node(
method reconcile (line 99) | fn reconcile(
method hydrate (line 121) | fn hydrate(
type Comp (line 168) | struct Comp;
type Props (line 171) | struct Props {
type Message (line 179) | type Message = ();
type Properties (line 180) | type Properties = Props;
method create (line 182) | fn create(_: &Context<Self>) -> Self {
method update (line 186) | fn update(&mut self, _ctx: &Context<Self>, _: Self::Message) -> bool {
method view (line 190) | fn view(&self, _ctx: &Context<Self>) -> Html {
function update_loop (line 196) | fn update_loop() {
function set_properties_to_component (line 211) | fn set_properties_to_component() {
function set_component_key (line 239) | fn set_component_key() {
function vchild_partialeq (line 259) | fn vchild_partialeq() {
type ListProps (line 290) | pub struct ListProps {
type List (line 293) | pub struct List;
type Message (line 295) | type Message = ();
type Properties (line 296) | type Properties = ListProps;
method create (line 298) | fn create(_: &Context<Self>) -> Self {
method update (line 302) | fn update(&mut self, _ctx: &Context<Self>, _: Self::Message) -> bool {
method changed (line 306) | fn changed(&mut self, _ctx: &Context<Self>, _old_props: &Self::Propertie...
method view (line 310) | fn view(&self, ctx: &Context<Self>) -> Html {
function setup_parent (line 322) | fn setup_parent() -> (BSubtree, AnyScope, Element) {
function get_html (line 332) | fn get_html(node: Html, root: &BSubtree, scope: &AnyScope, parent: &Elem...
function all_ways_of_passing_children_work (line 342) | fn all_ways_of_passing_children_work() {
type Comp (line 401) | struct Comp<T> {
type CompProps (line 406) | struct CompProps {
type Message (line 412) | type Message = ();
type Properties (line 413) | type Properties = CompProps;
method create (line 415) | fn create(_: &Context<Self>) -> Self {
method update (line 421) | fn update(&mut self, _ctx: &Context<Self>, _: Self::Message) -> bool {
method view (line 425) | fn view(&self, ctx: &Context<Self>) -> Html {
type A (line 432) | struct A;
type B (line 433) | struct B;
function diff (line 436) | fn diff() {
function component_with_children (line 650) | fn component_with_children() {
FILE: packages/yew/src/dom_bundle/blist.rs
type BList (line 18) | pub(super) struct BList {
method new (line 133) | pub const fn new() -> BList {
method key (line 142) | pub fn key(&self) -> Option<&Key> {
method apply_unkeyed (line 147) | fn apply_unkeyed(
method apply_keyed (line 188) | fn apply_keyed(
method split_for_blist (line 28) | fn split_for_blist(self) -> (Option<Key>, bool, Vec<VNode>) {
type Target (line 41) | type Target = Vec<BNode>;
method deref (line 43) | fn deref(&self) -> &Self::Target {
type NodeWriter (line 50) | struct NodeWriter<'s> {
function add (line 59) | fn add(self, node: VNode) -> (Self, BNode) {
function shift (line 72) | fn shift(&self, bundle: &BNode) {
function patch (line 77) | fn patch(self, node: VNode, bundle: &mut BNode) -> Self {
type KeyedEntry (line 92) | struct KeyedEntry(usize, BNode);
method borrow (line 94) | fn borrow(&self) -> &Key {
method hash (line 99) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
method eq (line 104) | fn eq(&self, other: &Self) -> bool {
method make_list (line 112) | fn make_list(&mut self) -> &mut BList {
method detach (line 413) | fn detach(self, root: &BSubtree, parent: &Element, parent_to_detach: boo...
method shift (line 419) | fn shift(&self, next_parent: &Element, mut slot: DomSlot) -> DomSlot {
type Bundle (line 429) | type Bundle = BList;
method attach (line 431) | fn attach(
method reconcile_node (line 443) | fn reconcile_node(
method reconcile (line 457) | fn reconcile(
method hydrate (line 500) | fn hydrate(
function diff (line 542) | fn diff() {
type Comp (line 620) | struct Comp {}
type CountingCompProps (line 623) | struct CountingCompProps {
type Message (line 630) | type Message = ();
type Properties (line 631) | type Properties = CountingCompProps;
method create (line 633) | fn create(_: &Context<Self>) -> Self {
method update (line 637) | fn update(&mut self, _ctx: &Context<Self>, _: Self::Message) -> bool {
method view (line 641) | fn view(&self, ctx: &Context<Self>) -> Html {
type ListProps (line 647) | pub struct ListProps {
type List (line 651) | pub struct List();
type Message (line 654) | type Message = ();
type Properties (line 655) | type Properties = ListProps;
method create (line 657) | fn create(_: &Context<Self>) -> Self {
method update (line 661) | fn update(&mut self, _ctx: &Context<Self>, _: Self::Message) -> bool {
method view (line 665) | fn view(&self, ctx: &Context<Self>) -> Html {
function diff (line 671) | fn diff() {
function duplicate_keys (line 1473) | fn duplicate_keys() {
FILE: packages/yew/src/dom_bundle/bnode.rs
type BNode (line 14) | pub(super) enum BNode {
method key (line 35) | pub fn key(&self) -> Option<&Key> {
method from (line 205) | fn from(btext: BText) -> Self {
method from (line 212) | fn from(blist: BList) -> Self {
method from (line 219) | fn from(btag: BTag) -> Self {
method from (line 226) | fn from(bcomp: BComp) -> Self {
method from (line 233) | fn from(bportal: BPortal) -> Self {
method from (line 240) | fn from(bsusp: BSuspense) -> Self {
method from (line 247) | fn from(braw: BRaw) -> Self {
method fmt (line 253) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method detach (line 51) | fn detach(self, root: &BSubtree, parent: &Element, parent_to_detach: boo...
method shift (line 69) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 88) | type Bundle = BNode;
method attach (line 90) | fn attach(
method reconcile_node (line 138) | fn reconcile_node(
method reconcile (line 149) | fn reconcile(
method hydrate (line 273) | fn hydrate(
function diff (line 330) | fn diff() {
FILE: packages/yew/src/dom_bundle/bportal.rs
type BPortal (line 12) | pub struct BPortal {
method key (line 116) | pub fn key(&self) -> Option<&Key> {
method detach (line 24) | fn detach(self, _root: &BSubtree, _parent: &Element, _parent_to_detach: ...
method shift (line 29) | fn shift(&self, _next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 36) | type Bundle = BPortal;
method attach (line 38) | fn attach(
method reconcile_node (line 64) | fn reconcile_node(
method reconcile (line 78) | fn reconcile(
function diff (line 142) | fn diff() {
function setup_parent_with_portal (line 225) | fn setup_parent_with_portal() -> (BSubtree, AnyScope, Element, Element) {
function test_no_shift (line 239) | fn test_no_shift() {
FILE: packages/yew/src/dom_bundle/braw.rs
type BRaw (line 11) | pub struct BRaw {
method create_elements (line 18) | fn create_elements(html: &str, parent_namespace: Option<&str>) -> Vec<...
method detach_bundle (line 36) | fn detach_bundle(&self, parent: &Element) {
method position (line 46) | fn position(&self, next_slot: DomSlot) -> DomSlot {
method detach (line 55) | fn detach(self, _root: &BSubtree, parent: &Element, _parent_to_detach: b...
method shift (line 59) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 72) | type Bundle = BRaw;
method attach (line 74) | fn attach(
method reconcile_node (line 110) | fn reconcile_node(
method reconcile (line 125) | fn reconcile(
method hydrate (line 153) | fn hydrate(
function braw_works_one_node (line 198) | fn braw_works_one_node() {
function braw_works_svg (line 209) | fn braw_works_svg() {
function braw_works_no_node (line 228) | fn braw_works_no_node() {
function braw_works_one_node_nested (line 239) | fn braw_works_one_node_nested() {
function braw_works_multi_top_nodes (line 250) | fn braw_works_multi_top_nodes() {
function braw_detach_works_multi_node (line 261) | fn braw_detach_works_multi_node() {
function braw_detach_works_single_node (line 274) | fn braw_detach_works_single_node() {
function braw_detach_works_empty (line 287) | fn braw_detach_works_empty() {
function braw_works_one_node_sibling_attached (line 300) | fn braw_works_one_node_sibling_attached() {
function braw_works_no_node_sibling_attached (line 311) | fn braw_works_no_node_sibling_attached() {
function braw_works_one_node_nested_sibling_attached (line 322) | fn braw_works_one_node_nested_sibling_attached() {
function braw_works_multi_top_nodes_sibling_attached (line 333) | fn braw_works_multi_top_nodes_sibling_attached() {
function braw_detach_works_multi_node_sibling_attached (line 344) | fn braw_detach_works_multi_node_sibling_attached() {
function braw_detach_works_single_node_sibling_attached (line 357) | fn braw_detach_works_single_node_sibling_attached() {
function braw_detach_works_empty_sibling_attached (line 370) | fn braw_detach_works_empty_sibling_attached() {
function braw_shift_works (line 383) | fn braw_shift_works() {
function braw_shift_with_sibling_works (line 402) | fn braw_shift_with_sibling_works() {
function braw_shift_works_multi_node (line 429) | fn braw_shift_works_multi_node() {
function assert_braw (line 447) | fn assert_braw(node: &mut BNode) -> &mut BRaw {
FILE: packages/yew/src/dom_bundle/bsuspense.rs
type Fallback (line 13) | enum Fallback {
type BSuspense (line 23) | pub(super) struct BSuspense {
method key (line 33) | pub fn key(&self) -> Option<&Key> {
method detach (line 39) | fn detach(self, root: &BSubtree, parent: &Element, parent_to_detach: boo...
method shift (line 62) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 73) | type Bundle = BSuspense;
method attach (line 75) | fn attach(
method reconcile_node (line 121) | fn reconcile_node(
method reconcile (line 138) | fn reconcile(
method hydrate (line 231) | fn hydrate(
FILE: packages/yew/src/dom_bundle/btag/attributes.rs
type Bundle (line 15) | type Bundle = Self;
type Element (line 16) | type Element = T;
method apply (line 18) | fn apply(self, _root: &BSubtree, el: &Self::Element) -> Self {
method apply_diff (line 25) | fn apply_diff(self, _root: &BSubtree, el: &Self::Element, bundle: &mut S...
type AccessValue (line 60) | pub(super) trait AccessValue {
method value (line 61) | fn value(&self) -> String;
method set_value (line 62) | fn set_value(&self, v: &str);
type Bundle (line 66) | type Bundle = Self;
type Element (line 67) | type Element = InputElement;
method apply (line 69) | fn apply(mut self, root: &BSubtree, el: &Self::Element) -> Self {
method apply_diff (line 80) | fn apply_diff(self, root: &BSubtree, el: &Self::Element, bundle: &mut Se...
type Bundle (line 92) | type Bundle = Value<TextAreaElement>;
type Element (line 93) | type Element = TextAreaElement;
method apply (line 95) | fn apply(self, root: &BSubtree, el: &Self::Element) -> Self::Bundle {
method apply_diff (line 102) | fn apply_diff(self, root: &BSubtree, el: &Self::Element, bundle: &mut Se...
method apply_diff_index_maps (line 109) | fn apply_diff_index_maps(
method apply_diff_as_maps (line 135) | fn apply_diff_as_maps<'a>(el: &Element, new: &'a Self, old: &'a Self) {
method set (line 171) | fn set(el: &Element, key: &str, value: &AttributeOrProperty) {
method remove (line 186) | fn remove(el: &Element, key: &str, old_value: &AttributeOrProperty) {
type Bundle (line 201) | type Bundle = Self;
type Element (line 202) | type Element = Element;
method apply (line 204) | fn apply(self, _root: &BSubtree, el: &Element) -> Self {
method apply_diff (line 227) | fn apply_diff(self, _root: &BSubtree, el: &Element, bundle: &mut Self) {
function create_element (line 306) | fn create_element() -> (Element, BSubtree) {
function properties_are_set (line 315) | fn properties_are_set() {
function respects_apply_as (line 342) | fn respects_apply_as() {
function class_is_always_attrs (line 366) | fn class_is_always_attrs() {
function macro_syntax_works (line 375) | async fn macro_syntax_works() {
FILE: packages/yew/src/dom_bundle/btag/listeners.rs
function listener_id (line 19) | fn listener_id(this: &EventTargetable) -> Option<u32>;
function set_listener_id (line 21) | fn set_listener_id(this: &EventTargetable, id: u32);
type EventListening (line 26) | pub trait EventListening {
method listener_id (line 27) | fn listener_id(&self) -> Option<u32>;
method set_listener_id (line 28) | fn set_listener_id(&self, id: u32);
method listener_id (line 32) | fn listener_id(&self) -> Option<u32> {
method set_listener_id (line 36) | fn set_listener_id(&self, id: u32) {
type ListenerRegistration (line 43) | pub(super) enum ListenerRegistration {
method register (line 99) | fn register(root: &BSubtree, el: &Element, pending: &[Option<Rc<dyn Li...
method unregister (line 108) | pub fn unregister(&self, root: &BSubtree) {
type Bundle (line 51) | type Bundle = ListenerRegistration;
type Element (line 52) | type Element = Element;
method apply (line 54) | fn apply(self, root: &BSubtree, el: &Self::Element) -> ListenerRegistrat...
method apply_diff (line 61) | fn apply_diff(self, root: &BSubtree, el: &Self::Element, bundle: &mut Li...
type Registry (line 117) | pub struct Registry {
method new (line 126) | pub fn new() -> Self {
method get_handler (line 134) | pub fn get_handler(
method register (line 155) | fn register(&mut self, root: &BSubtree, id: u32, listeners: &[Option<R...
method patch (line 167) | fn patch(&mut self, root: &BSubtree, id: &u32, listeners: &[Option<Rc<...
method unregister (line 183) | fn unregister(&mut self, id: &u32) {
method set_listener_id (line 188) | fn set_listener_id(&mut self, root: &BSubtree, el: &Element) -> u32 {
type Message (line 219) | enum Message {
type State (line 226) | struct State {
type MixinProps (line 233) | struct MixinProps<M: Properties> {
type Mixin (line 238) | trait Mixin: Properties + Sized {
method view (line 239) | fn view<C>(ctx: &Context<C>, state: &State) -> Html
type Comp (line 244) | struct Comp<M>
type Message (line 256) | type Message = Message;
type Properties (line 257) | type Properties = MixinProps<M>;
method create (line 259) | fn create(_: &Context<Self>) -> Self {
method update (line 266) | fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool {
method view (line 281) | fn view(&self, ctx: &Context<Self>) -> crate::Html {
function assert_count (line 287) | fn assert_count(el: &NodeRef, count: isize) {
function click (line 296) | fn click(el: &NodeRef) {
function get_el_by_selector (line 301) | fn get_el_by_selector(selector: &str) -> web_sys::HtmlElement {
function init (line 310) | fn init<M>() -> (AppHandle<Comp<M>>, NodeRef)
function synchronous (line 332) | fn synchronous() {
function non_bubbling_event (line 375) | async fn non_bubbling_event() {
function bubbling (line 421) | fn bubbling() {
function cancel_bubbling (line 466) | fn cancel_bubbling() {
function cancel_bubbling_nested (line 501) | fn cancel_bubbling_nested() {
function non_bubbling (line 540) | fn non_bubbling() {
function portal_bubbling (line 582) | fn portal_bubbling() {
function open_shadow_dom_bubbling (line 626) | fn open_shadow_dom_bubbling() {
function test_input_listener (line 672) | fn test_input_listener<E>(make_event: impl Fn() -> E)
function oninput (line 732) | fn oninput() {
function onchange (line 743) | fn onchange() {
function reentrant_listener (line 754) | fn reentrant_listener() {
FILE: packages/yew/src/dom_bundle/btag/mod.rs
type Apply (line 28) | trait Apply {
method apply (line 34) | fn apply(self, root: &BSubtree, el: &Self::Element) -> Self::Bundle;
method apply_diff (line 37) | fn apply_diff(self, root: &BSubtree, el: &Self::Element, bundle: &mut ...
type BTagInner (line 43) | enum BTagInner {
type BTag (line 65) | pub(super) struct BTag {
method key (line 306) | pub fn key(&self) -> Option<&Key> {
method reference (line 312) | fn reference(&self) -> &Element {
method children (line 318) | fn children(&self) -> Option<&BNode> {
method tag (line 327) | fn tag(&self) -> &str {
method detach (line 78) | fn detach(self, root: &BSubtree, parent: &Element, parent_to_detach: boo...
method shift (line 101) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 109) | type Bundle = BTag;
method attach (line 111) | fn attach(
method reconcile_node (line 164) | fn reconcile_node(
method reconcile (line 198) | fn reconcile(
method create_element (line 247) | fn create_element(&self, parent: &Element) -> Element {
method hydrate (line 344) | fn hydrate(
function it_compares_tags (line 470) | fn it_compares_tags() {
function it_compares_text (line 488) | fn it_compares_text() {
function it_compares_attributes_static (line 506) | fn it_compares_attributes_static() {
function it_compares_attributes_dynamic (line 524) | fn it_compares_attributes_dynamic() {
function it_compares_children (line 542) | fn it_compares_children() {
function it_compares_classes_static (line 566) | fn it_compares_classes_static() {
function it_compares_classes_dynamic (line 589) | fn it_compares_classes_dynamic() {
function assert_vtag (line 611) | fn assert_vtag(node: VNode) -> VTag {
function assert_btag_ref (line 618) | fn assert_btag_ref(node: &BNode) -> &BTag {
function assert_vtag_ref (line 625) | fn assert_vtag_ref(node: &VNode) -> &VTag {
function assert_btag_mut (line 632) | fn assert_btag_mut(node: &mut BNode) -> &mut BTag {
function assert_namespace (line 639) | fn assert_namespace(vtag: &BTag, namespace: &'static str) {
function supports_svg (line 644) | fn supports_svg() {
function supports_mathml (line 672) | fn supports_mathml() {
function it_compares_values (line 685) | fn it_compares_values() {
function it_compares_kinds (line 703) | fn it_compares_kinds() {
function it_compares_checked (line 721) | fn it_compares_checked() {
function it_allows_aria_attributes (line 739) | fn it_allows_aria_attributes() {
function it_does_not_set_missing_class_name (line 775) | fn it_does_not_set_missing_class_name() {
function test_set_class_name (line 785) | fn test_set_class_name(gen_html: impl FnOnce() -> Html) {
function it_sets_class_name_static (line 796) | fn it_sets_class_name_static() {
function it_sets_class_name_dynamic (line 801) | fn it_sets_class_name_dynamic() {
function controlled_input_synced (line 806) | fn controlled_input_synced() {
function uncontrolled_input_unsynced (line 839) | fn uncontrolled_input_unsynced() {
function dynamic_tags_work (line 874) | fn dynamic_tags_work() {
function dynamic_tags_handle_value_attribute (line 893) | fn dynamic_tags_handle_value_attribute() {
function dynamic_tags_handle_weird_capitalization (line 915) | fn dynamic_tags_handle_weird_capitalization() {
function dynamic_tags_allow_custom_capitalization (line 925) | fn dynamic_tags_allow_custom_capitalization() {
function reset_node_ref (line 935) | fn reset_node_ref() {
function vtag_reuse_should_reset_ancestors_node_ref (line 948) | fn vtag_reuse_should_reset_ancestors_node_ref() {
function vtag_should_not_touch_newly_bound_refs (line 972) | fn vtag_should_not_touch_newly_bound_refs() {
function test_index_map_attribute_diff (line 1006) | fn test_index_map_attribute_diff() {
function diff (line 1060) | fn diff() {
function html_if_bool (line 1148) | fn html_if_bool() {
function html_if_option (line 1232) | fn html_if_option() {
function input_checked_stays_there (line 1320) | fn input_checked_stays_there() {
function non_input_checked_stays_there (line 1332) | fn non_input_checked_stays_there() {
FILE: packages/yew/src/dom_bundle/btext.rs
type BText (line 11) | pub(super) struct BText {
method fmt (line 84) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method detach (line 17) | fn detach(self, _root: &BSubtree, parent: &Element, parent_to_detach: bo...
method shift (line 27) | fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
type Bundle (line 35) | type Bundle = BText;
method attach (line 37) | fn attach(
method reconcile_node (line 52) | fn reconcile_node(
method reconcile (line 66) | fn reconcile(
method hydrate (line 98) | fn hydrate(
function text_as_root (line 162) | fn text_as_root() {
function diff (line 186) | fn diff() {
FILE: packages/yew/src/dom_bundle/fragment.rs
type Fragment (line 12) | pub(crate) struct Fragment(VecDeque<Node>, Option<Node>);
method collect_children (line 30) | pub fn collect_children(parent: &Element) -> Self {
method collect_between (line 46) | pub fn collect_between(
method trim_start_text_nodes (line 126) | pub fn trim_start_text_nodes(&mut self) {
method deep_clone (line 139) | pub fn deep_clone(&self) -> Self {
method detach (line 150) | pub fn detach(self, _root: &BSubtree, parent: &Element, parent_to_deta...
method shift (line 161) | pub fn shift(&self, next_parent: &Element, slot: DomSlot) -> DomSlot {
method sibling_at_end (line 170) | pub fn sibling_at_end(&self) -> Option<&Node> {
type Target (line 15) | type Target = VecDeque<Node>;
method deref (line 17) | fn deref(&self) -> &Self::Target {
method deref_mut (line 23) | fn deref_mut(&mut self) -> &mut Self::Target {
FILE: packages/yew/src/dom_bundle/mod.rs
type Bundle (line 48) | pub(crate) struct Bundle(BNode);
method new (line 52) | pub const fn new() -> Self {
method shift (line 57) | pub fn shift(&self, next_parent: &Element, slot: DomSlot) {
method reconcile (line 62) | pub fn reconcile(
method detach (line 74) | pub fn detach(self, root: &BSubtree, parent: &Element, parent_to_detac...
method hydrate (line 91) | pub fn hydrate(
FILE: packages/yew/src/dom_bundle/position.rs
type DomSlot (line 13) | pub(crate) struct DomSlot {
method fmt (line 31) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method at (line 85) | pub fn at(next_sibling: Node) -> Self {
method at_end (line 90) | pub fn at_end() -> Self {
method create (line 94) | pub fn create(next_sibling: Option<Node>) -> Self {
method new_debug_trapped (line 103) | pub fn new_debug_trapped() -> Self {
method with_next_sibling_check_trap (line 109) | fn with_next_sibling_check_trap<R>(&self, f: impl FnOnce(Option<&Node>...
method with_next_sibling (line 125) | fn with_next_sibling<R>(&self, f: impl FnOnce(Option<&Node>) -> R) -> R {
method insert (line 134) | pub(super) fn insert(&self, parent: &Element, node: &Node) {
method get (line 156) | fn get(&self) -> Option<Node> {
type DomSlotVariant (line 18) | enum DomSlotVariant {
type DynamicDomSlot (line 26) | pub(crate) struct DynamicDomSlot {
method fmt (line 44) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method new (line 164) | pub fn new(initial_position: DomSlot) -> Self {
method new_debug_trapped (line 171) | pub fn new_debug_trapped() -> Self {
method take (line 179) | pub fn take(&mut self) -> Self {
method reassign (line 185) | pub fn reassign(&self, next_position: DomSlot) {
method to_position (line 192) | pub fn to_position(&self) -> DomSlot {
method with_next_sibling (line 198) | fn with_next_sibling<R>(&self, f: impl FnOnce(Option<&Node>) -> R) -> R {
function get_trap_node (line 58) | pub fn get_trap_node() -> Option<Node> {
function is_trap (line 69) | pub fn is_trap(node: &Node) -> bool {
function new_at_and_get (line 230) | fn new_at_and_get() {
function new_at_end_and_get (line 241) | fn new_at_end_and_get() {
function get_through_dynamic (line 250) | fn get_through_dynamic() {
function get_after_reassign (line 261) | fn get_after_reassign() {
function get_chain_after_reassign (line 275) | fn get_chain_after_reassign() {
function debug_printing (line 294) | fn debug_printing() {
FILE: packages/yew/src/dom_bundle/subtree_root.rs
type EventGrating (line 21) | pub trait EventGrating {
method subtree_id (line 22) | fn subtree_id(&self) -> Option<TreeId>;
method set_subtree_id (line 23) | fn set_subtree_id(&self, tree_id: TreeId);
method cache_key (line 26) | fn cache_key(&self) -> Option<u32>;
method set_cache_key (line 27) | fn set_cache_key(&self, key: u32);
function subtree_id (line 35) | fn subtree_id(this: &EventTargetable) -> Option<TreeId>;
function set_subtree_id (line 37) | fn set_subtree_id(this: &EventTargetable, id: TreeId);
function cache_key (line 39) | fn cache_key(this: &EventTargetable) -> Option<u32>;
function set_cache_key (line 41) | fn set_cache_key(this: &EventTargetable, key: u32);
type TreeId (line 74) | type TreeId = u32;
function next_root_id (line 80) | fn next_root_id() -> TreeId {
type BSubtree (line 90) | pub struct BSubtree(Rc<SubtreeData>);
method do_create_root (line 510) | fn do_create_root(
method create_root (line 521) | pub fn create_root(host_element: &HtmlEventTarget) -> Self {
method create_subroot (line 527) | pub fn create_subroot(&self, mount_point: Element, host_element: &Html...
method ensure_handled (line 536) | pub fn ensure_handled(&self, desc: &EventDescriptor) {
method with_listener_registry (line 542) | pub fn with_listener_registry<R>(&self, f: impl FnOnce(&mut Registry) ...
method brand_element (line 546) | pub fn brand_element(&self, el: &dyn EventGrating) {
type ParentingInformation (line 96) | struct ParentingInformation {
type Ev
Condensed preview — 1780 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,862K chars).
[
{
"path": ".cargo/config.toml",
"chars": 302,
"preview": "[target.'cfg(all(target_arch = \"wasm32\", not(target_os = \"wasi\")))']\nrunner = 'wasm-bindgen-test-runner'\n\n[target.'cfg(a"
},
{
"path": ".firebaserc",
"chars": 278,
"preview": "{\n \"projects\": {\n \"default\": \"yew-rs\"\n },\n \"targets\": {\n \"yew-rs\": {\n \"hosting\": {\n \"website\": [\n "
},
{
"path": ".gitattributes",
"chars": 32,
"preview": "*.mdx linguist-detectable=false\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 666,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1107,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve Yew\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Problem**"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 480,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: Ask question\n url: https://discord.gg/VQck8X4\n about: Looking "
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.md",
"chars": 1793,
"preview": "---\nname: Documentation\nabout: Report an issue relating to this project's documentation.\ntitle: ''\nlabels: documentation"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 462,
"preview": "#### Description\n\n<!-- Please include a summary of the change. -->\n\nFixes #0000 <!-- replace with issue number or remove"
},
{
"path": ".github/dependabot.yml",
"chars": 553,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"cargo\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n day: "
},
{
"path": ".github/workflows/auto-approve-maintainer-pr.yml",
"chars": 811,
"preview": "name: Auto approve\n\non:\n pull_request_target:\n types:\n - opened\n - reopened\n - synchronize\n - re"
},
{
"path": ".github/workflows/benchmark-core.yml",
"chars": 1535,
"preview": "name: Benchmark - core\n\non:\n pull_request:\n branches: [master]\n paths:\n - .github/workflows/benchmark-core.y"
},
{
"path": ".github/workflows/benchmark-ssr.yml",
"chars": 1767,
"preview": "name: Benchmark - SSR\n\non:\n pull_request:\n branches: [master]\n paths:\n - .github/workflows/benchmark-ssr.yml"
},
{
"path": ".github/workflows/benchmark.yml",
"chars": 4698,
"preview": "name: Benchmark\n\non:\n push:\n paths-ignore:\n - \"website/**\"\n branches:\n - master\n pull_request:\n pat"
},
{
"path": ".github/workflows/build-api-docs.yml",
"chars": 1685,
"preview": "name: Build API Docs (Rustdoc)\non:\n pull_request:\n branches: [master]\n paths:\n - \"packages/**\"\n - \"fire"
},
{
"path": ".github/workflows/build-website.yml",
"chars": 1675,
"preview": "name: Build website\non:\n pull_request:\n branches: [master]\n paths:\n - \"website/**\"\n - \"firebase.json\"\n "
},
{
"path": ".github/workflows/clippy.yml",
"chars": 2032,
"preview": "name: Clippy\n\non:\n pull_request:\n paths:\n - \".github/workflows/clippy.yml\"\n - \"tools/**/*\"\n - \"exampl"
},
{
"path": ".github/workflows/fmt.yml",
"chars": 454,
"preview": "name: cargo fmt\non:\n pull_request:\n paths:\n - \"**/*.rs\"\n push:\n branches: [master]\n paths:\n - \"**/*"
},
{
"path": ".github/workflows/inspect-next-changelogs.yml",
"chars": 1034,
"preview": "name: Inspect next changelogs\n\npermissions:\n contents: write\n\non:\n workflow_dispatch:\n\njobs:\n generate:\n name: Gen"
},
{
"path": ".github/workflows/main-checks.yml",
"chars": 10085,
"preview": "name: Main Checks\n\non:\n pull_request:\n paths:\n - \".github/workflows/main-checks.yml\"\n - \"ci/**\"\n - \"p"
},
{
"path": ".github/workflows/post-benchmark-core.yml",
"chars": 2645,
"preview": "name: Post Comment for Benchmark - core\n\non:\n workflow_run:\n workflows: [\"Benchmark - core\"]\n types:\n - comp"
},
{
"path": ".github/workflows/post-benchmark-ssr.yml",
"chars": 2177,
"preview": "name: Post Comment for Benchmark - SSR\n\non:\n workflow_run:\n workflows: [\"Benchmark - SSR\"]\n types:\n - comple"
},
{
"path": ".github/workflows/post-benchmark.yml",
"chars": 1786,
"preview": "name: \"Post benchmark results\"\n\non:\n workflow_run:\n workflows: [\"Benchmark\"]\n types:\n - completed\n\njobs:\n p"
},
{
"path": ".github/workflows/post-size-cmp.yml",
"chars": 2364,
"preview": "name: Post Comment for Size Comparison\n\non:\n workflow_run:\n workflows: [\"Size Comparison\"]\n types:\n - comple"
},
{
"path": ".github/workflows/publish-api-docs.yml",
"chars": 2104,
"preview": "name: Publish API Docs\non:\n workflow_run:\n workflows: [\"Build API Docs (Rustdoc)\"]\n types:\n - completed\n\njob"
},
{
"path": ".github/workflows/publish-examples.yml",
"chars": 1326,
"preview": "name: Publish Examples\non:\n push:\n branches: [master]\n paths:\n - 'tools/build-examples/**'\n - 'examples"
},
{
"path": ".github/workflows/publish-website.yml",
"chars": 2100,
"preview": "name: Publish website\non:\n workflow_run:\n workflows: [\"Build website\"]\n types:\n - completed\n\njobs:\n publish"
},
{
"path": ".github/workflows/publish.yml",
"chars": 2517,
"preview": "name: Publish yew package(s)\n\npermissions:\n contents: write\n\non:\n workflow_dispatch:\n inputs:\n level:\n "
},
{
"path": ".github/workflows/size-cmp.yml",
"chars": 2399,
"preview": "name: Size Comparison\n\non:\n pull_request:\n branches: [master]\n paths:\n - .github/workflows/size-cmp.yml\n "
},
{
"path": ".github/workflows/test-website.yml",
"chars": 1132,
"preview": "name: \"Test Website\"\n\non:\n pull_request:\n paths:\n - \".github/workflows/test-website.yml\"\n - \"packages/**/*"
},
{
"path": ".gitignore",
"chars": 125,
"preview": "target/\ndist/\n\n# backup files generated by rustfmt\n**/*.rs.bk\n\n# editor config files and directories\n*.iml\n/.idea/\n/.vsc"
},
{
"path": "CHANGELOG.md",
"chars": 104962,
"preview": "# Changelog\n\n## ✨ yew **0.23.0** *(2026-03-10)*\n\nbumping from 0.22 should require no code changes for most users.\n\n### 🚨"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5346,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTING.md",
"chars": 3512,
"preview": "# Contribution Guide\n\n## Setting up your local development environment\n\n### Add the Wasm target\n\n```bash\nrustup target a"
},
{
"path": "Cargo.toml",
"chars": 1277,
"preview": "[workspace]\nmembers = [\n \"packages/*\",\n \"tools/*\",\n \"examples/*\",\n]\nexclude = [\"examples/.cargo\"]\ndefault-membe"
},
{
"path": "LICENSE-APACHE",
"chars": 10836,
"preview": " Apache License\n Version 2.0, January 2004\n http"
},
{
"path": "LICENSE-MIT",
"chars": 1057,
"preview": "Copyright (c) 2017 Denis Kolodin\n\nPermission is hereby granted, free of charge, to any\nperson obtaining a copy of this s"
},
{
"path": "Makefile.toml",
"chars": 1990,
"preview": "######################\n#\n# public tasks:\n# * checks-flow\n# * lint\n# * lint-release\n# * format\n# * test-flow\n# * "
},
{
"path": "README.md",
"chars": 5919,
"preview": "<div align=\"center\">\n <a href=\"https://yew.rs/\" target=\"_blank\"><img src=\"https://yew.rs/img/logo.png\" width=\"150\" /></"
},
{
"path": "SECURITY.md",
"chars": 1218,
"preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nPlease do not create a GitHub issue for security vulnerabilities, Inste"
},
{
"path": "_typos.toml",
"chars": 145,
"preview": "[files]\nextend-exclude = [\"examples/router/data/syllables.txt\", \"examples/function_router/data/syllables.txt\"]\n\n[default"
},
{
"path": "api-docs/.gitignore",
"chars": 5,
"preview": "dist\n"
},
{
"path": "api-docs/before-content.html",
"chars": 228,
"preview": "<div id=\"unreleased-version-header\">\n <div>This is unreleased documentation for Yew Next version.</div>\n <div>For "
},
{
"path": "api-docs/styles.css",
"chars": 524,
"preview": "#unreleased-version-header {\n background-color: rgb(200, 237, 248);\n z-index: 400;\n position: absolute;\n lef"
},
{
"path": "ci/collect_sizes.py",
"chars": 963,
"preview": "from typing import Dict, List, Optional\nfrom pathlib import Path\n\nimport glob\nimport os\nimport json\n\n\ndef find_example_s"
},
{
"path": "ci/install-wasm-bindgen-cli.sh",
"chars": 416,
"preview": "#!/usr/bin/env bash\nif [ ! -f \"Cargo.lock\" ]; then\n cargo fetch\nfi\n\nVERSION=$(cargo pkgid --frozen wasm-bindgen | cut -"
},
{
"path": "ci/make_benchmark_ssr_cmt.py",
"chars": 1331,
"preview": "from typing import Dict, List, Optional, Tuple\n\nimport os\nimport json\n\n\nheader = \"| Benchmark | Round | Min (ms) | Max ("
},
{
"path": "ci/make_example_size_cmt.py",
"chars": 3011,
"preview": "from typing import Dict, List, Optional, Tuple\n\nimport os\nimport json\n\n\nheader = \"| examples | master (KB) | pull reques"
},
{
"path": "ci/write-min-size-flags.sh",
"chars": 107,
"preview": "#!/usr/bin/env bash\ncat examples/.cargo/min-size-config.toml >> examples/.cargo/dummy-min-size-config.toml\n"
},
{
"path": "examples/.cargo/config.toml",
"chars": 41,
"preview": "include = [\"dummy-min-size-config.toml\"]\n"
},
{
"path": "examples/.cargo/dummy-min-size-config.toml",
"chars": 104,
"preview": "# This file is intentionally left empty.\n# It gets filled by `min-size-config.toml` in some cases by CI\n"
},
{
"path": "examples/.cargo/min-size-config.toml",
"chars": 223,
"preview": "[unstable]\nbuild-std = [\"core\", \"std\", \"panic_abort\"]\nbuild-std-features = [\"optimize_for_size\"]\n\n[target.'cfg(target_ar"
},
{
"path": "examples/.gitignore",
"chars": 21,
"preview": "# trunk output\ndist/\n"
},
{
"path": "examples/README.md",
"chars": 11105,
"preview": "# Yew Examples\n\n## How to Run\n\nThe examples are built with [trunk](https://github.com/thedodd/trunk).\nOnce you have the "
},
{
"path": "examples/async_clock/Cargo.toml",
"chars": 282,
"preview": "[package]\nname = \"async_clock\"\nversion = \"0.0.1\"\nauthors = [\"Marcel Ibes <mibes@mibesco.com>\"]\nedition = \"2021\"\nlicense "
},
{
"path": "examples/async_clock/README.md",
"chars": 623,
"preview": "# Asynchronous coding in Yew\n\nAn example of using asynchronous tasks in a component. This example creates a clock in the"
},
{
"path": "examples/async_clock/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/async_clock/index.html",
"chars": 234,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Async Examples</title>\n <link"
},
{
"path": "examples/async_clock/index.scss",
"chars": 702,
"preview": "body {\n font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;\n font-size: 16pt;\n}\n\n.app {"
},
{
"path": "examples/async_clock/src/main.rs",
"chars": 4523,
"preview": "use chrono::{DateTime, Local};\nuse futures::{FutureExt, StreamExt};\nuse services::compute_fun_score;\nuse yew::platform::"
},
{
"path": "examples/async_clock/src/services.rs",
"chars": 1970,
"preview": "use std::time::Duration;\n\nuse chrono::{DateTime, Local};\nuse futures::{Stream, StreamExt};\nuse gloo_net::http::Request;\n"
},
{
"path": "examples/boids/Cargo.toml",
"chars": 544,
"preview": "[package]\nname = \"boids\"\nversion = \"0.1.0\"\nauthors = [\"motoki saito <stmtk13044032@gmail.com>\"]\nedition = \"2021\"\nlicense"
},
{
"path": "examples/boids/README.md",
"chars": 1265,
"preview": "# Boids Example\n\n[](https://"
},
{
"path": "examples/boids/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/boids/index.html",
"chars": 226,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Boids</title>\n\n <link data-tr"
},
{
"path": "examples/boids/index.scss",
"chars": 3637,
"preview": "$shade-0: #fff !default;\n$shade-1: #d7dcdf !default;\n$shade-10: #2c3e50 !default;\n$teal: #1abc9c !default;\n\nhtml,\nbody {"
},
{
"path": "examples/boids/src/boid.rs",
"chars": 6198,
"preview": "use std::fmt::Write;\nuse std::iter;\n\nuse rand::Rng;\nuse yew::{html, Html};\n\nuse crate::math::{self, Mean, Vector2D, Weig"
},
{
"path": "examples/boids/src/main.rs",
"chars": 5628,
"preview": "use settings::Settings;\nuse simulation::Simulation;\nuse slider::Slider;\nuse yew::html::Scope;\nuse yew::{html, Component,"
},
{
"path": "examples/boids/src/math.rs",
"chars": 4006,
"preview": "use std::f64::consts::{FRAC_PI_3, PI};\nuse std::iter::Sum;\nuse std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign"
},
{
"path": "examples/boids/src/settings.rs",
"chars": 1777,
"preview": "use gloo::storage::{LocalStorage, Storage};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, PartialEq, Dese"
},
{
"path": "examples/boids/src/simulation.rs",
"chars": 2943,
"preview": "use gloo::timers::callback::Interval;\nuse yew::{html, Component, Context, Html, Properties};\n\nuse crate::boid::Boid;\nuse"
},
{
"path": "examples/boids/src/slider.rs",
"chars": 2451,
"preview": "use std::cell::Cell;\n\nuse web_sys::HtmlInputElement;\nuse yew::events::InputEvent;\nuse yew::{html, Callback, Component, C"
},
{
"path": "examples/communication_child_to_parent/Cargo.toml",
"chars": 234,
"preview": "[package]\nname = \"communication_child_to_parent\"\nversion = \"0.0.1\"\nauthors = [\"Marcel Ibes <mibes@mibesco.com>\"]\nedition"
},
{
"path": "examples/communication_child_to_parent/README.md",
"chars": 212,
"preview": "# Child-to-Parent Example\n\nA simple example of updating a parent from two children using a callback mechanism.\n\n## Runni"
},
{
"path": "examples/communication_child_to_parent/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/communication_child_to_parent/index.html",
"chars": 262,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Child-to-Parent Communication</t"
},
{
"path": "examples/communication_child_to_parent/index.scss",
"chars": 2628,
"preview": ".page {\n min-height: 100vh;\n min-width: 100vw;\n\n line-height: 1.5;\n tab-size: 4;\n font-family: ui-sans-se"
},
{
"path": "examples/communication_child_to_parent/src/child.rs",
"chars": 1139,
"preview": "use super::*;\n\n/// The `Child` component is the child of the `Parent` component, and will send updates to the\n/// parent"
},
{
"path": "examples/communication_child_to_parent/src/main.rs",
"chars": 198,
"preview": "use child::Child;\nuse parent::Parent;\nuse yew::{html, AttrValue, Callback, Component, Context, Html, Properties};\n\nmod c"
},
{
"path": "examples/communication_child_to_parent/src/parent.rs",
"chars": 2246,
"preview": "use super::*;\n\npub enum Msg {\n ButtonClick(AttrValue),\n}\n\n/// The `Parent` component holds some state that is updated"
},
{
"path": "examples/communication_grandchild_with_grandparent/Cargo.toml",
"chars": 246,
"preview": "[package]\nname = \"communication_grandchild_with_grandparent\"\nversion = \"0.0.1\"\nauthors = [\"Marcel Ibes <mibes@mibesco.co"
},
{
"path": "examples/communication_grandchild_with_grandparent/README.md",
"chars": 359,
"preview": "# Grandchild-with-Grandparent Example\n\nA simple example of updating a grandparent component from two grandchildren using"
},
{
"path": "examples/communication_grandchild_with_grandparent/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/communication_grandchild_with_grandparent/index.html",
"chars": 272,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Grandchild-to-Grandparent Commun"
},
{
"path": "examples/communication_grandchild_with_grandparent/index.scss",
"chars": 3229,
"preview": ".page {\n min-height: 100vh;\n min-width: 100vw;\n\n line-height: 1.5;\n tab-size: 4;\n font-family: ui-sans-se"
},
{
"path": "examples/communication_grandchild_with_grandparent/src/child.rs",
"chars": 2033,
"preview": "use super::*;\n\n/// The `Child` component is the child of the `Parent` component, and will send and receive updates\n/// t"
},
{
"path": "examples/communication_grandchild_with_grandparent/src/grandparent.rs",
"chars": 2264,
"preview": "use super::*;\n\npub enum Msg {\n ButtonClick(AttrValue),\n}\n\n/// Our top-level (grandparent) component that holds a refe"
},
{
"path": "examples/communication_grandchild_with_grandparent/src/main.rs",
"chars": 761,
"preview": "use std::rc::Rc;\n\nuse child::Child;\nuse grandparent::GrandParent;\nuse parent::Parent;\n\nmod child;\nmod grandparent;\nmod p"
},
{
"path": "examples/communication_grandchild_with_grandparent/src/parent.rs",
"chars": 538,
"preview": "use super::*;\n\n/// The `Parent` component is the parent of the `Child` component. It has no logic, and is here to\n/// sh"
},
{
"path": "examples/communication_grandparent_to_grandchild/Cargo.toml",
"chars": 244,
"preview": "[package]\nname = \"communication_grandparent_to_grandchild\"\nversion = \"0.0.1\"\nauthors = [\"Marcel Ibes <mibes@mibesco.com>"
},
{
"path": "examples/communication_grandparent_to_grandchild/README.md",
"chars": 258,
"preview": "# Grandparent-to-Grandchild Example\n\nA simple example of updating a grandchild component from a grandparent using a shar"
},
{
"path": "examples/communication_grandparent_to_grandchild/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/communication_grandparent_to_grandchild/index.html",
"chars": 272,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Grandparent-to-Grandchild Commun"
},
{
"path": "examples/communication_grandparent_to_grandchild/index.scss",
"chars": 3024,
"preview": ".page {\n min-height: 100vh;\n min-width: 100vw;\n\n line-height: 1.5;\n tab-size: 4;\n font-family: ui-sans-se"
},
{
"path": "examples/communication_grandparent_to_grandchild/src/child.rs",
"chars": 1512,
"preview": "use super::*;\n\n/// The `Child` component is the child of the `Parent` component, and will receive updates from the\n/// g"
},
{
"path": "examples/communication_grandparent_to_grandchild/src/grandparent.rs",
"chars": 1630,
"preview": "use super::*;\n\n/// Our top-level (grandparent) component that holds a reference to the shared state.\npub struct GrandPar"
},
{
"path": "examples/communication_grandparent_to_grandchild/src/main.rs",
"chars": 483,
"preview": "use std::rc::Rc;\n\nuse child::Child;\nuse grandparent::GrandParent;\nuse parent::Parent;\n\nmod child;\nmod grandparent;\nmod p"
},
{
"path": "examples/communication_grandparent_to_grandchild/src/parent.rs",
"chars": 488,
"preview": "use super::*;\n\n/// The `Parent` component is the parent of the `Child` component. It has no logic, and is here to\n/// sh"
},
{
"path": "examples/communication_parent_to_child/Cargo.toml",
"chars": 234,
"preview": "[package]\nname = \"communication_parent_to_child\"\nversion = \"0.0.1\"\nauthors = [\"Marcel Ibes <mibes@mibesco.com>\"]\nedition"
},
{
"path": "examples/communication_parent_to_child/README.md",
"chars": 195,
"preview": "# Parent-to-Child Example\n\nA simple example of updating a child from a parent using properties\n\n## Running\n\nRun this app"
},
{
"path": "examples/communication_parent_to_child/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/communication_parent_to_child/index.html",
"chars": 262,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Parent-to-Child Communication</t"
},
{
"path": "examples/communication_parent_to_child/index.scss",
"chars": 2307,
"preview": ".page {\n min-height: 100vh;\n min-width: 100vw;\n\n line-height: 1.5;\n tab-size: 4;\n font-family: ui-sans-se"
},
{
"path": "examples/communication_parent_to_child/src/child.rs",
"chars": 839,
"preview": "use super::*;\n\n/// The `Child` component is the child of the `Parent` component, and will receive updates from the\n/// p"
},
{
"path": "examples/communication_parent_to_child/src/main.rs",
"chars": 177,
"preview": "use child::Child;\nuse parent::Parent;\nuse yew::{html, Component, Context, Html, Properties};\n\nmod child;\nmod parent;\n\nfn"
},
{
"path": "examples/communication_parent_to_child/src/parent.rs",
"chars": 1482,
"preview": "use super::*;\n\n/// The `Parent` component holds some state that is passed down to the children.\npub struct Parent {\n "
},
{
"path": "examples/contexts/Cargo.toml",
"chars": 217,
"preview": "[package]\nname = \"contexts\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"MIT OR Apache-2.0\"\n\n[dependencies]\nyew = { pat"
},
{
"path": "examples/contexts/README.md",
"chars": 455,
"preview": "# Context Example\n\n[](htt"
},
{
"path": "examples/contexts/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/contexts/index.html",
"chars": 175,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Context</title>\n\n <link data-"
},
{
"path": "examples/contexts/src/main.rs",
"chars": 637,
"preview": "mod msg_ctx;\nmod producer;\nmod struct_component_producer;\nmod struct_component_subscriber;\nmod subscriber;\n\nuse msg_ctx:"
},
{
"path": "examples/contexts/src/msg_ctx.rs",
"chars": 811,
"preview": "use std::rc::Rc;\n\nuse yew::prelude::*;\n\n#[derive(Debug, PartialEq, Eq, Clone)]\npub struct Message {\n pub inner: Strin"
},
{
"path": "examples/contexts/src/producer.rs",
"chars": 319,
"preview": "use yew::prelude::*;\n\nuse super::msg_ctx::MessageContext;\n\n#[function_component]\npub fn Producer() -> Html {\n let msg"
},
{
"path": "examples/contexts/src/struct_component_producer.rs",
"chars": 645,
"preview": "use yew::prelude::*;\n\nuse super::msg_ctx::MessageContext;\n\npub struct StructComponentProducer;\n\nimpl Component for Struc"
},
{
"path": "examples/contexts/src/struct_component_subscriber.rs",
"chars": 1062,
"preview": "use yew::prelude::*;\n\nuse super::msg_ctx::MessageContext;\n\npub enum Msg {\n MessageContextUpdated(MessageContext),\n}\n\n"
},
{
"path": "examples/contexts/src/subscriber.rs",
"chars": 266,
"preview": "use yew::prelude::*;\n\nuse super::msg_ctx::MessageContext;\n\n#[function_component]\npub fn Subscriber() -> Html {\n let m"
},
{
"path": "examples/counter/Cargo.toml",
"chars": 295,
"preview": "[package]\nname = \"counter\"\nversion = \"0.1.1\"\nauthors = [\"Denis Kolodin <deniskolodin@gmail.com>\"]\nedition = \"2021\"\nlicen"
},
{
"path": "examples/counter/README.md",
"chars": 408,
"preview": "# Counter Example\n\n[](http"
},
{
"path": "examples/counter/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/counter/index.html",
"chars": 228,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Counter</title>\n\n <link data-"
},
{
"path": "examples/counter/index.scss",
"chars": 372,
"preview": "button {\n background-color: #008f53; /* Green */\n border: 0;\n color: white;\n padding: 14px 14px;\n text-align: cente"
},
{
"path": "examples/counter/src/main.rs",
"chars": 2213,
"preview": "use gloo::console;\nuse js_sys::Date;\nuse yew::{html, Component, Context, Html};\n\n// Define the possible messages which c"
},
{
"path": "examples/counter_functional/Cargo.toml",
"chars": 219,
"preview": "[package]\nname = \"counter_functional\"\nversion = \"0.1.0\"\nauthors = [\"Zahash <zahash.z@gmail.com>\"]\nedition = \"2021\"\nlicen"
},
{
"path": "examples/counter_functional/README.md",
"chars": 309,
"preview": "# Counter Example\n\nA simple example of a counter which can be increased or decreased with the press of a button implemen"
},
{
"path": "examples/counter_functional/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/counter_functional/index.html",
"chars": 180,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Counter Function Yew</title>\n <link"
},
{
"path": "examples/counter_functional/src/main.rs",
"chars": 613,
"preview": "use yew::prelude::*;\n\n#[function_component]\nfn App() -> Html {\n let state = use_state(|| 0);\n\n let incr_counter = "
},
{
"path": "examples/dyn_create_destroy_apps/Cargo.toml",
"chars": 453,
"preview": "[package]\nname = \"dyn_create_destroy_apps\"\nversion = \"0.1.0\"\nauthors = [\"Nicklas Warming Jacobsen <nicklaswj@gmail.com>\""
},
{
"path": "examples/dyn_create_destroy_apps/README.md",
"chars": 310,
"preview": "# Dynamic app creation and destruction example\n\nAn example of how to create and destroy Yew apps on demand.\n\n## Concepts"
},
{
"path": "examples/dyn_create_destroy_apps/Trunk.toml",
"chars": 33,
"preview": "[tools]\nwasm_opt = \"version_128\"\n"
},
{
"path": "examples/dyn_create_destroy_apps/index.html",
"chars": 244,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Yew • Create and destroy apps</title>\n"
},
{
"path": "examples/dyn_create_destroy_apps/index.scss",
"chars": 367,
"preview": "button {\n border: 0;\n color: white;\n padding: 14px 14px;\n text-align: center;\n font-size: 16px;\n}\n\nbutton.create {\n"
},
{
"path": "examples/dyn_create_destroy_apps/src/counter.rs",
"chars": 1759,
"preview": "use gloo::console;\nuse gloo::timers::callback::Interval;\nuse yew::prelude::*;\n\npub struct CounterModel {\n counter: us"
},
{
"path": "examples/dyn_create_destroy_apps/src/main.rs",
"chars": 3706,
"preview": "use gloo::utils::document;\nuse slab::Slab;\nuse web_sys::Element;\nuse yew::prelude::*;\n\nmod counter;\n\nuse counter::{Count"
},
{
"path": "examples/file_upload/Cargo.toml",
"chars": 356,
"preview": "[package]\nname = \"file_upload\"\nversion = \"0.1.0\"\nauthors = [\"Denis Kolodin <deniskolodin@gmail.com>\"]\nedition = \"2021\"\nl"
},
{
"path": "examples/file_upload/README.md",
"chars": 756,
"preview": "# File Upload Example\n\n[]\npub struct Props {\n "
},
{
"path": "examples/function_memory_game/src/components/score_board_logo.rs",
"chars": 248,
"preview": "use yew::{function_component, html, Html};\n\n#[function_component]\npub fn Logo() -> Html {\n html! {\n <h1 class="
},
{
"path": "examples/function_memory_game/src/components/score_board_progress.rs",
"chars": 395,
"preview": "use yew::{function_component, html, Html, Properties};\n\n#[derive(PartialEq, Eq, Properties, Clone)]\npub struct Props {\n "
},
{
"path": "examples/function_memory_game/src/components.rs",
"chars": 194,
"preview": "pub mod app;\npub mod chessboard;\npub mod chessboard_card;\npub mod game_status_board;\npub mod score_board;\npub mod score_"
},
{
"path": "examples/function_memory_game/src/constant.rs",
"chars": 944,
"preview": "use serde::{Deserialize, Serialize};\nuse strum_macros::{Display, EnumIter};\n\npub const KEY_BEST_SCORE: &str = \"memory.ga"
},
{
"path": "examples/function_memory_game/src/helper.rs",
"chars": 394,
"preview": "use nanoid::nanoid;\nuse rand::rng;\nuse rand::seq::SliceRandom;\n\nuse crate::constant::RAW_CARDS;\nuse crate::state::Card;\n"
},
{
"path": "examples/function_memory_game/src/main.rs",
"chars": 144,
"preview": "mod components;\nmod constant;\nmod helper;\nmod state;\n\nuse crate::components::app::App;\n\nfn main() {\n yew::Renderer::<"
},
{
"path": "examples/function_memory_game/src/state.rs",
"chars": 5037,
"preview": "use std::rc::Rc;\n\nuse gloo::storage::{LocalStorage, Storage};\nuse serde::{Deserialize, Serialize};\nuse yew::prelude::*;\n"
},
{
"path": "examples/function_router/Cargo.toml",
"chars": 738,
"preview": "[package]\nname = \"function_router\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"MIT OR Apache-2.0\"\n\n[dependencies]\nimag"
},
{
"path": "examples/function_router/README.md",
"chars": 2054,
"preview": "# Function Router Example\n\nThis is identical to the router example, but written in function\ncomponents.\n\n[ {\n wasm_logger::init(wasm_logger::Config::new(log::Level::Trace));\n yew::Re"
},
{
"path": "examples/function_router/src/components/author_card.rs",
"chars": 1947,
"preview": "use std::rc::Rc;\n\nuse yew::prelude::*;\nuse yew_router::prelude::*;\n\nuse crate::content::Author;\nuse crate::generator::Ge"
},
{
"path": "examples/function_router/src/components/mod.rs",
"chars": 97,
"preview": "pub mod author_card;\npub mod nav;\npub mod pagination;\npub mod post_card;\npub mod progress_delay;\n"
},
{
"path": "examples/function_router/src/components/nav.rs",
"chars": 2014,
"preview": "use yew::prelude::*;\nuse yew_router::prelude::*;\n\nuse crate::Route;\n\n#[function_component]\npub fn Nav() -> Html {\n le"
},
{
"path": "examples/function_router/src/components/pagination.rs",
"chars": 4268,
"preview": "use std::ops::Range;\n\nuse serde::{Deserialize, Serialize};\nuse yew::prelude::*;\nuse yew_router::prelude::*;\n\nuse crate::"
},
{
"path": "examples/function_router/src/components/post_card.rs",
"chars": 1672,
"preview": "use std::rc::Rc;\n\nuse yew::prelude::*;\nuse yew_router::components::Link;\n\nuse crate::content::PostMeta;\nuse crate::gener"
},
{
"path": "examples/function_router/src/components/progress_delay.rs",
"chars": 2591,
"preview": "use std::rc::Rc;\n\nuse gloo::timers::callback::Interval;\nuse instant::Instant;\nuse yew::prelude::*;\n\nconst RESOLUTION: u3"
},
{
"path": "examples/function_router/src/content.rs",
"chars": 3243,
"preview": "use crate::generator::{Generated, Generator};\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct Author {\n pub seed: "
},
{
"path": "examples/function_router/src/generator.rs",
"chars": 5125,
"preview": "use std::sync::LazyLock;\n\nuse lipsum::MarkovChain;\nuse rand::distr::Bernoulli;\nuse rand::rngs::StdRng;\nuse rand::seq::It"
},
{
"path": "examples/function_router/src/imagegen.rs",
"chars": 6231,
"preview": "use std::collections::HashMap;\nuse std::io::Cursor;\nuse std::sync::{LazyLock, Mutex};\n\nuse image::{ImageBuffer, Rgb};\n\nt"
},
{
"path": "examples/function_router/src/lib.rs",
"chars": 721,
"preview": "// # Implementation Note:\n//\n// This example is also used to demonstrate SSR hydration.\n// It is important to follow the"
},
{
"path": "examples/function_router/src/pages/author.rs",
"chars": 2365,
"preview": "use yew::prelude::*;\n\nuse crate::components::author_card::AuthorState;\nuse crate::content;\nuse crate::generator::Generat"
},
{
"path": "examples/function_router/src/pages/author_list.rs",
"chars": 2020,
"preview": "use rand::{distr, Rng};\nuse yew::prelude::*;\n\nuse crate::components::author_card::AuthorCard;\nuse crate::components::pro"
},
{
"path": "examples/function_router/src/pages/home.rs",
"chars": 2744,
"preview": "use yew::prelude::*;\n\n#[function_component]\nfn InfoTiles() -> Html {\n html! {\n <>\n <div class=\"tile"
},
{
"path": "examples/function_router/src/pages/mod.rs",
"chars": 108,
"preview": "pub mod author;\npub mod author_list;\npub mod home;\npub mod page_not_found;\npub mod post;\npub mod post_list;\n"
},
{
"path": "examples/function_router/src/pages/page_not_found.rs",
"chars": 532,
"preview": "use yew::prelude::*;\n\n#[function_component]\npub fn PageNotFound() -> Html {\n html! {\n <section class=\"hero is-"
},
{
"path": "examples/function_router/src/pages/post.rs",
"chars": 4720,
"preview": "use std::rc::Rc;\n\nuse content::PostPart;\nuse yew::prelude::*;\nuse yew_router::prelude::*;\n\nuse crate::generator::Generat"
},
{
"path": "examples/function_router/src/pages/post_list.rs",
"chars": 1603,
"preview": "use yew::prelude::*;\nuse yew_router::prelude::*;\n\nuse crate::components::pagination::{PageQuery, Pagination};\nuse crate:"
},
{
"path": "examples/function_todomvc/Cargo.toml",
"chars": 425,
"preview": "[package]\nname = \"function_todomvc\"\nversion = \"0.1.0\"\nauthors = [\"Drew Hutton <drew.hutton@pm.me>\"]\nedition = \"2021\"\nlic"
},
{
"path": "examples/function_todomvc/README.md",
"chars": 666,
"preview": "# TodoMVC Example\n\n[
About this extraction
This page contains the full source code of the yewstack/yew GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1780 files (5.2 MB), approximately 1.5M tokens, and a symbol index with 3764 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.