Skip to content

Releases: leptos-rs/leptos

v0.4.5

18 Jul 18:27
@gbj gbj
Compare
Choose a tag to compare

I've gotten back into a regular rhythm of patch releases pulling in some of the smaller bugfixes, but haven't had time to write release notes for each one. I should just auto-generate them, I supposeβ€”sorry about that!

Anyway here's a quick summary of the new features included in the past few releases. The full changelog below includes various bugfixes, chores, and updates to the docs as well.

  • Some useful fixes to support for cargo leptos watch --hot-reload
  • leptos_axum::extract_with_state to support extractors that use a State, if it's been provided via context in a custom handler
  • The watch function, which functions as a more configurable create_effect, including the ability to explicitly list dependencies, stop listening to them, whether to run immediately or lazily, etc.
  • Better 404 page support in Actix examples and templates
  • Added support for adding Content-Security-Policy nonces to inline script and style tags with use_nonce and the nonce feature
  • Rewritten <For/> diffing algorithm that both fixes a number of correctness issues/edge cases in <For/> and drops ~10kb from the WASM binary

Basically, a bunch of small but really useful changes, and about a hundred bugfixes.

I also just want to give a shout-out to @agilarity, who's become one of the top contributors to the library through a very helpful focus on CI and testing. If you're ever looking for a great model of how to test a Leptos frontend app, the counters_stable example now features two complete test suites, one in JS using Playwright and one written in Rust using wasm_bindgen_test. This has been a huge amount of very impressive work.

Complete Changelog

  • v0.4.0 by @gbj in #1250
  • chore: remove unused variable warnings with ssr props by @tqwewe in #1244
  • test(counters_stable): add missing e2e tests by @agilarity in #1251
  • docs: update server fn docs by @gbj in #1252
  • test(router_example): add playwright tests by @nomorechokedboy in #1247
  • Add fallback support for workspace in get_config_from_str by @afiqzx in #1249
  • fix: regression in ability to use signals directly in the view in stable by @gbj in #1254
  • fix: hot-reloading view marker line number by @gbj in #1255
  • docs: update 02_getting_started.md by @gbj in #1256
  • example/readme: Link to 'VS Browser' ext; format. by @srid in #1261
  • chore: new cargo fmt by @gbj in #1266
  • feat: implement PartialEq on ServerFnError by @M1cha in #1260
  • Minor: Ran cargo clippy --fix and reviewed changes. by @martinfrances107 in #1259
  • fix: HtmlElement::dyn_classes() when adding classes by @gbj in #1265
  • fix: clearing <For/> that has a previous sibling in release mode (fixes #1258) by @gbj in #1267
  • Added watch by @maccesch in #1262
  • fix: error messages in dyn_classes by @gbj in #1270
  • docs: add docs on responses/redirects and clarification re: Axum State(_) extractors by @gbj in #1272
  • fix: improved diagnostics about non-reactive signal access by @gbj in #1277
  • fix: duplicate text nodes during <For/> hydration (closes #1279) by @gbj in #1281
  • fix: untracked read in <Redirect/> by @gbj in #1280
  • fix: issue with class hydration not removing classes correctly by @gbj in #1287
  • fix: use once_cell::OnceCell rather than std::OnceCell by @gbj in #1288
  • leptos axum extract with state by @sjud in #1275
  • examples: add 404 support in Actix examples (closes #1031) by @gbj in #1291
  • fixed example for error handling by @webmstk in #1292
  • Adding instructions to add a tailwind plugin to examples. by @dessalines in #1293
  • chore: add mdbook in flake by @gbj in #1299
  • test(counters_stable): add wasm testing by @agilarity in #1278
  • fixed typo in parent-child doc by @webmstk in #1300
  • Rework diff functionality for Each component by @g-re-g in #1296
  • docs: must use View by @gbj in #1302
  • docs: fix braces in <Show/> example by @gbj in #1303
  • fix: <ActionForm/> should check origin correctly before doing a full-page refresh by @gbj in #1304
  • feat: use lazy thread local for regex by @tqwewe in #1309
  • test(counters_stable/wasm): enter count by @agilarity in #1307
  • docs: clarify WASM target by @gbj in #1318
  • update warnings to remove mention of csr as a default feature by @Heliozoa in #1313
  • docs: typo by @maheshbansod in #1315
  • docs: typo & punctuation by @maheshbansod in #1316
  • refactor(ci): improve the organization of cargo make tasks by @agilarity in #1320
  • feat(leptos-config): kebab-case via serde's rename_all by @filipdutescu in #1308
  • fix: <ActionForm/> should set value even if redirected by @gbj in #1321
  • feat(config): implement common traits for Env by @filipdutescu in #1324
  • fix: Actix server fn redirect() duplicate Location headers by @gbj in #1326
  • Bump indexmap to version 2 by @g-re-g in #1325
  • fix: warning generated by new #[must_use] on views by @gbj in #1329
  • docs: clarify nightly in "Getting Started" by @gbj in #1330
  • fix: event delegation issue with <input name="host"> by @gbj in #1332
  • feat: allow active_class prop on <A/> by @gbj in #1323
  • fix: routing logic to scroll to top was broken by @gbj in #1335
  • fix: check LEPTOS_OUTPUT_NAME correctly at compile time (closes #1337) by @gbj in #1338
  • fix: un-register <Suspense/> from resource reads when <Suspense/> is unmounted by @gbj in #1342
  • build: run tasks from workpace or member directory by @agilarity in #1339
  • docs: how not to mutate the DOM during rendering by @gbj in #1344
  • fix: server_fn rustls feature shouldn't pull in default-tls by @gbj in #1343
  • Book, don't run rust code snippets and update getting started by @g-re-g in #1346
  • use cfg_attr for conditional derives by @circuitsacul in #1349
  • docs: improve ServerFnError when a server function is not found by @gbj in #1350
  • docs: don't warn when a resource resolves after its scope has been disposed by @gbj in #1351
  • fix: duplicated meta content during async rendering by @gbj in #1352
  • ci: speed up verification by @agilarity in #1347
  • fix: hydration-key conflicts between <ErrorBoundary/> children and fallback by @gbj in #1354
  • feat: add support for adding CSP nonces by @gbj in #1348
  • docs/warning: fix <ActionForm/> docs and add runtime warning for invalid encodings by @gbj in #1360
  • ci(ci): only run on source change by @agilarity in #1357
  • ci(check-examples): only run on source change by @agilarity in #1356
  • fix: correctly show fallback for Transition on first load even if not hydrating by @gbj in #1362
  • fix: update link to example code in book testing page by @BakerNet in #1365
  • doc: previews to backup CodeSandbox by @jdevries3133 in #1169
  • Hot reload bug-fix by @sebastian in #1368
  • perf: exclude hydration code in CSR mode by @gbj in #1372
  • fix: release lock on stored values...
Read more

`v0.4.0`

29 Jun 20:42
@gbj gbj
33c83c3
Compare
Choose a tag to compare

v0.4.0

Enough bugfixes and features have accumulated in the main branch that it's time for a new release. However, a very early change meant this needs to be a semver bump. Rather than continuing the confusion of the feature/bug gap between 0.3.1 and main, this releases the current state of the main branch.

I was actually surprised, putting together these release notes, how much good stuff there is in here that I'd forgotten was new to this release!

This does not include the reactive ownership rewrite (#918), which I'd guess will be 0.5. But it does include the following...

Breaking Changes

  • leptos_axum now uses the (more common, more type-safe, more extensible) State and sub-state patterns rather than Extension to pass LeptosOptions. This will require a few small but key changes to apps uses Axum migrating from 0.3.x to 0.4.0. Click here to see a diff with the necessary changes.
  • Switch from defaulting to nightly and opting into stable, to requiring an opt-in for nightly features. Click here to see a diff with the necessary changes.
    • If you're using stable, remove the stable feature (it's now the default.)
    • If you're using nightly, add the nightly feature to leptos, leptos_router, and leptos_meta
  • leptos no longer defaults to csr, but is opt-in.
    • If you're using CSR, add the csr feature to leptos (same as leptos_router and leptos_meta
    • If you're using SSR/hydration, you can remove most default-features = false on Leptos dependencies, as that mainly served to disable the default csr feature, which is no longer enabled by default.
  • ServerFnError no longer implements std::error::Error (see below). ServerFnErrorErr does, if that's needed.
  • The children of a <Suspense/> or <Transition/> are now rendered once, then subsequently cloned. If you are reading resources reactively (move || data.read(cx)) they should continue to update reactively. If you are reading resources non-reactively (<div>{resource.read(cx)}</div>) this would have worked previously, and now will not be reactive.

Features

Automatic Server Function Registration

Server functions no longer need to be registered (except on exotic platforms like server-side WASM). Instead, they are registered automatically, making it even easier to define and use them.

Axum Extractor Support

You can now use Axum extractors directly in server functions.

#[server(QueryExtract, "/api")]
pub async fn query_extract(cx: Scope) -> Result<String, ServerFnError> {
    use axum::{extract::Query, http::Method};
    use leptos_axum::extract;

    extract(cx, |method: Method, res: Query<MyQuery>| async move {
            format!("{method:?} and {}", res.q)
        },
    )
    .await
    .map_err(|_| ServerFnError::ServerError("Error with server extractor".into()))
}

Improved Error Handling

Leptos now provides a leptos::error::Result type that behaves much like anyhow::Result (i.e., other errors can be converted into it using ?) but can be rendered directly in the view and caught by <ErrorBoundary/>. ServerFnError can also handle conversion from any error, making errors in server functions easier to handle.

use leptos::error::Result;

async fn fetch_cats(count: CatCount) -> Result<Vec<String>> {
    if count > 0 {
        // make the request
        let res = reqwasm::http::Request::get(&format!(
            "https://api.thecatapi.com/v1/images/search?limit={count}",
        ))
        .send()
        .await?
        // convert it to JSON
        .json::<Vec<Cat>>()
        .await?
        // extract the URL field for each cat
        .into_iter()
        .take(count)
        .map(|cat| cat.url)
        .collect::<Vec<_>>();
        Ok(res)
    } else {
        Err(CatError::NonZeroCats.into())
    }
}

#[server(AddTodo, "/api")]
pub async fn add_todo(title: String) -> Result<(), ServerFnError> {
    let mut conn = db().await?;

    Ok(
        sqlx::query("INSERT INTO todos (title, completed) VALUES ($1, false)")
            .bind(title)
            .execute(&mut conn)
            .await
            .map(|_| ())?,
    )
}

Async Routing

While routing, optionally wait for the next route to load before navigating, approximating the behavior of a multi-page app more closely, by using the set_is_pending prop on <Router/> and the <RoutingProgress/> component. (See #1055.)

#[component]
pub fn App(cx: Scope) -> impl IntoView {
    let (is_routing, set_is_routing) = create_signal(cx, false);

    view! { cx,
        <Router set_is_routing> // will wait for async data on next page to load before navigating
Screen.Recording.2023-05-20.at.9.34.42.PM.mov

<Await/>

The new <Await/> component improves the ergonomics of loading async blocks.

async fn fetch_monkeys(monkey: i32) -> i32 {
  // do some expensive work
  3
}

view! { cx,
	<Await
        future=|cx| fetch_monkeys(3)
        bind:data // see below for bind:
    >
        <p>{*data} " little monkeys, jumping on the bed."</p>
    </Await>
}

bind: syntax on components and slots

The children prop currently only supports one argument, the Scope. It's sometimes useful to be able to pass additional arguments to be used in children, but they need to be named. bind: allows you to define a children prop that takes additional arguments and name them. For example, the <Await/> component (see above) is defined like this

pub fn Await<T, Fut, FF, VF, V>(
	/* ... other props */
    children: VF,
) -> impl IntoView
where
    /* ... other generics */
    VF: Fn(Scope, &T) -> V + 'static,

The identifier for this second &T argument is then given with bind:{ident} (again, see above.)

Other Features

  • Rewritten and less-buggy <For/> implementation.
  • Specify exact server function paths with a fourth argument, rather than the hashed path used by default to avoid name collisions
#[server(MyServerFnType, "/api-prefix", "Url", "hello")] // will be at `/api-prefix/hello`
  • Significant reductions in overhead of hydration keys, and therefore in SSR performance.
  • Improvements to recoverability, error handling, and syntax highlighting in the view macro.

Full Changelog

  • fix: typo in actix extract documentation by @markcatley in #1043
  • fix: <Suspense/> hydration when no resources are read under it by @gbj in #1046
  • docs: fix small docs issues (closes #1045) by @gbj in #1049
  • docs: fix typo in view fn by @kasbuunk in #1050
  • Update lib.rs by @sjud in #1053
  • fix: multipart forms on server fns by @yuuma03 in #1048
  • tests: fix broken SSR doctests by @gbj in #1056
  • fix: todomvc example style errors by @agilarity in #1058
  • Added Debug, PartialEq and Eq derives to trigger. by @dgsantana in #1060
  • examples: fix todo_app_sqlite_axum by @gbj in #1064
  • test: verify tailwind example with playwright tests by @agilarity in #1062
  • fix: docs note on style refers to class by @gbj in #1066
  • docs: update notes on WASM binary size to work with SSR too (closes #1059) by @gbj in #1068
  • docs: clarify SSR/WASM binary size comments by @gbj in #1070
  • Specify Server Fn Paths by @benwis in #1069
  • test: setup e2e automatically for tailwind example by @agilarity in #1067
  • Rsx parser with recovery after errors, and unquoted text by @vldm in #1054
  • feat: add "async routing" feature by @gbj in #1055
  • fix/change: remove ? prefix from search in browser (matching server behavior) - closes #1071 by @gbj in #1077
  • fix: debug-mode bugs in <For/> (closes #955, #1075, #1076) by @gbj in #1078
  • docs: clarify difference between set() and update() by @gbj in #1082
  • feat: manually implement Debug, PartialEq, Eq and Hash for reactive types by @Skyliegirl33 in #1080
  • fix: correctly handle new navigations while in the middle of an async navigation by @gbj in #1084
  • Docs edit: added a hint for a common error when using use_navigate by @sjud in #1063
  • Remove LeptosProvider trait and use Axum SubStates by @benwis in #1085
  • fix: missing ? in navigation now that it is removed on browser side to match server by @gbj in #1092
  • feat: add <Await/> component to improve ergonomics of loading async blocks by @gbj in #1091
  • updated axum_database_sessions to axum_session. by @genusistimelord in #1090
  • Improve fetch example by @anacrolix in #1096
  • fix: duplicate headers (like Set-Cookie) on the a...
Read more

`v0.3.1`

14 Jun 14:17
@gbj gbj
Compare
Choose a tag to compare

Earlier this week, the ouroboros crate, a dependency of leptos_reactive, identified a fundamental soundness issue. This was fixed immediately in Leptos on the main branch by switching to self_cell instead. However, there have been a number of breaking changes on main since 0.3.0 in preparation for 0.4.0, so main could not be released as 0.3.1. There are a number of other changes that need to be made before 0.4.0, so it did not make sense to immediately release a new major version.

This patch release just rewinds to 0.3.0 and replaces ouroboros, without including any additional features or changes since then. If you have already been using main, you should continue using main. If you have been using 0.3.0, you should update to 0.3.1.

See additional discussion here.

`v0.3.0`

14 May 19:23
@gbj gbj
Compare
Choose a tag to compare

v0.3.0 is another incremental-ish release with a bunch of new features, many on the server end but including a bunch of general-purpose improvements. It includes several things that are breaking changes in the semantic-versioning sense, but you may find that not much breaks in your actual app. (For example, no code in any of the the three starter templates needed to change.)

New Features and Small Fixes

General

  • No longer necessary to import __Props types for components; you can just use app::MyComponent; instead of app::{MyComponent, MyComponentProps};
  • #[slot] syntax to define typed component children.
  • Typed events in window_event_listener
  • Optional event listeners with HtmlElement::optional_event
  • Adds style: syntax in the view macro to set individual styles, much like class: sets individual classes
  • Simplify work with resources by adding a Resource::update method to reactively update current value.
  • expect_context::<T>(cx) shorthand for use_context::<T>(cx).unwrap()

Server

  • Support for server functions that use GET requests (with either URL or CBOR encoding), for easier caching.
  • extract helper to directly use Actix extractors in a server function.
  • Allow more complex data like structs and Vec<_> as server function arguments (anything that can be de/serialized by serde_qs)
  • Support for rendering a <Route/> in response to additional HTTP methods/verbs, e.g., the classic PHP/multi-page-app style in which a POST request can be sent to a page and it will render a response. (See methods prop.)
  • Support for SsrMode::PartiallyBlocked which works like out-of-order streaming but replaces the HTML for any β€œblocked” fragments on the server. Improves UX when JS is disabled.

Developer Experience and Ergonomics

  • Top-to-bottom integration with the tracing crate
  • Adding some "real-time docs" via several runtime warnings and compile-time errors to prevent common bugs (for example, using leptos_meta with no features enabled or accidentally ending the view a component returns with a semicolon, meaning it renders nothing)

Performance

  • Improve performance of Axum integration by spawning requests into a local threadpool.
  • Improve performance of router on the server side by caching branch generation.
  • Performance improvements in the reactive system and renderer, and closing a memory leak in <Suspense/>/<Transition/>.

And as always...

  • Lots of bug fixes! Full changelog below.

Breaking Changes

  • &'a str can no longer be directly rendered as a view: add .to_string() to effected variables. (Previously, all &str were converted to String by the renderer; using Cow<'static, str> now allows &'static str to be rendered without the additional allocation, at the cost of requiring the conversion of &str to String to be more explicit.)
  • window_event_listener now takes a typed event (like ev::keypress). Use window_event_listener_untyped for the old behavior.
  • When deriving Params to use typed router search/params, the FromStr error for any type needs to be Send + Sync so they are ErrorBoundary compatible
  • Generics in create_slice have changed to allow different input types for getter/setter; only relevant if (for some reason?) you were specifying them manually.
  • Exact interfaces for a few public-but-rarely-needed functions in the server integrations have changed.

What's Changed

  • Fix server functions default macro on stable by @Demonthos in #784
  • docs: add runtime "strict mode" checks that warn if you’re non-reactively accessing a value by @gbj in #786
  • fix: warnings about untracked signal access in <Router/> by @gbj in #790
  • Remove unused fs dependency from leptos_config by @valeth in #787
  • fix: untrack should disable warnings about untracked reads by @gbj in #791
  • fix: nested <Suspense/> by @gbj in #781
  • docs: <Form/> component by @gbj in #792
  • Fix server functions with non-copy server contexts by @Demonthos in #785
  • fix: unused warning on cx in server functions by @markcatley in #794
  • docs: warn if you are using leptos_meta without features by @gbj in #797
  • fix: warning in Cargo.toml by @markcatley in #800
  • feat: Add ability to include options to event listeners by @Ofenhed in #799
  • fix: fixes #802 as a temporary measure without resorting to #803 yet by @gbj in #804
  • fix: prevent router panic on root-level <Redirect/> during route list generation by @gbj in #801
  • Reduce size of RuntimeId when slotmap is not used by @novacrazy in #805
  • fix: unused warning in reactive signal diagnostics by @markcatley in #807
  • Add the ability for server fns to be submitted via GET requests by @benwis in #789
  • chore: fix unused variable warning in property now that it's not memoized by @gbj in #810
  • Optimize Runtime::mark_dirty by @novacrazy in #808
  • Optimize memory usage of update methods by @novacrazy in #809
  • fix: correctly escape HTML special characters in text nodes during SSR by @gbj in #812
  • Publish book ci by @bram209 in #817
  • remove Leptos guide link by @bram209 in #818
  • docs: add sandbox links and max height by @gbj in #824
  • fix: correctly pass server fn errors to client by @gbj in #822
  • fix: server functions with url as argument name (closes issue #823) by @gbj in #825
  • chore: deny warnings on github actions by @markcatley in #814
  • Use local pools for axum handlers by @akarras in #815
  • tests: update benchmarks by @gbj in #827
  • feat: make __Props imports unnecessary (closes #746) by @gbj in #828
  • Various optimizations, size reductions and stability improvements by @novacrazy in #831
  • Fix leaked memo nodes by @novacrazy in #841
  • [Fix] Correct broken MaybeSignal link by @hoangph271 in #840
  • feat: rustls feature for reqwest and any other relevant dependencies by @gbj in #842
  • fix: don't entity-encode HTML special characters inside <script> or <style> (closes #837) by @gbj in #846
  • feat: allow multiple HTTP request methods/verbs by @gbj in #695
  • [WIP] Trigger prototype by @novacrazy in #838
  • fix static text nodes with curly braces in SSR by @gbj in #849
  • docs: emit error when trying to combine global class and dynamic class in a bugged way by @gbj in #850
  • fix: custom events in SSR mode by @gbj in #852
  • fix: Strip & from the end of params queries by @mondeja in #854
  • fix: match statement in leptos book by @chroth7 in #860
  • Fix the counter without macros test by @agilarity in #863
  • feat: add ability to set node_ref and pass additional attributes to <Form/> and friends by @gbj in #853
  • Fixed typo in life cycle docs by @Stackingttv in #869
  • examples: fix error handling in fetch example by @gbj in #870
  • feat: add the ability to specify animations on route transitions by @gbj in #736
  • [fix] updated nix flakes lock files on session auth axum examples by @mustafasegf in #872
  • docs: Add per-project toolchain override readme by @kamilogorek in #876
  • feat: add non-animation base classes to <AnimatedOutlet/> and <AnimatedRoutes/> by @gbj in #877
  • Use override key, if available, for server function calling by @snapbug in #878
  • feat: add expect_context function by @markcatley in #864
    -...
Read more

`v0.2.5`

01 Apr 15:36
@gbj gbj
e78ce7e
Compare
Choose a tag to compare

v0.2.5

This update includes many bug fixes and documentation improvements, along with a few new features:

  • A <ProtectedRoute/> component that allows you to create route guards to either render or redirect away from a route depending on some condition.
  • The ability to add arbitrary attributes to the <Html/> and <Body/> components in leptos_meta.
  • Additional head data injected using leptos_meta is now injected at the beginning of the <head> rather than the end, which allows you to inject an import map if necessary for JavaScript module imports.

I'm beginning to merge a few server-rendering changes that should be invisible to most users but will technically be breaking API changes, and will be building toward v0.3.0 which will probably include reconfiguring the Cargo setup for nightly/stable support (see #591), so this is may be the last 0.2.x release.

What's Changed

  • chore: fix clippy warnings by @gbj in #721
  • chore: make wasm-bindgen dependency optional in leptos_reactive by @gbj in #723
  • chore: Upgrade console_log dependency to stable by @mondeja in #724
  • fix: relative routing should update when navigating between <Outlet/>s (closes issue #725) by @gbj in #729
  • fix: include query params in navigation when <ActionForm> response redirects. by @andrew-chang-dewitt in #728
  • docs: fix typo in router docs by @gbj in #730
  • avoid panic in counter_isomorphic Multi-User counter by @mwcz in #732
  • leptos-reactive: Bumped serde-lite from 0.3 to 0.4. by @martinfrances107 in #737
  • fix: always run individual classes after the class attribute (closes #735) by @gbj in #738
  • Fix typo in docs. by @grandafrato in #739
  • docs: fix typo in server_fn docs by @isti115 in #740
  • Document cargo workspace feature resolver footgun by @jmintb in #745
  • docs: warn when reading resource outside <Suspense/> (closes issue #742) by @gbj in #743
  • fix: correct typecast on Memo::get_untracked (closes issue #754) by @gbj in #755
  • examples: improve counter_without_macros by @gbj in #751
  • Add is_mounted and dyn_classes by @jquesada2016 in #714
  • Fix a few typos by @bnzone in #756
  • Add property field to Meta tag by @benwis in #759
  • Allow component decl without use leptos::* in scope by @lpotthast in #748
  • fix: escape </script> and other HTML tags in serialized resources by @gbj in #763
  • added the id attribute to the Leptos router A tag by @Houski in #770
  • fix: <Redirect/> between nested routes at same level by @gbj in #767
  • fix: prevent forms from entering infinite loops (closes issue #760) by @gbj in #762
  • fix: stop memoizing properties in a way that breaks prop:value (closes #768) by @gbj in #772
  • example: proxy settings to work on all OS by @Kaszanas in #771
  • feat: Added ProtectedRoute component to route file by @Kaszanas in #741
  • change: insert <head> metadata tags at the beginning of the <head> by @gbj in #731
  • docs: fixed parentheses and formatting issues by @luoxiaozero in #775
  • Add arbitrary attributes to Html meta tag by @step4 in #726
  • chore: clippy and docs warnings by @gbj in #779
  • docs: warn if you put something invalid inside <Routes/> by @gbj in #780

New Contributors

Full Changelog: v0.2.4...v0.2.5

`v0.2.4`

21 Mar 16:19
@gbj gbj
cfd5c98
Compare
Choose a tag to compare

v0.2.3 fixed support for stable Rust, which I temporarily broke in v0.2.2.

The main change in v0.2.4 is a rewritten reactive system. This didn't involve any breaking API changes, except to the extent that fixing bugs and glitchy behavior breaks apps that depend on the glitches. It pretty significantly improves the performance of the reactive system on deep graphs (i.e., when you have a chain of dependencies like memos leading from a signal to an effect), as well as fixing reactive "glitching" behaviors in ways that make effects run more efficiently. You can read more about the details here.

Other changes:

  • improved error handling in <ActionForm/>
  • Support for using signals directly in the view in stable Rust
  • cancelable versions of set_timeout, request_idle_callback, and request_animation_frame (all ending with with_handle)
  • a debounce helper that makes it easy to debounce event listeners
  • allow manual disposal of signals before the current reactive cope is disposed with the SignalDispose trait (and .dispose()) function, to avoid leaking memory if you create a list of signals at the root scope
  • allow batching multiple updates with Scope::batch() before running effects
  • many small bugfixes

What's Changed

  • fix broken stable support by @gbj in #670
  • feat: <ActionForm/> improvements by @gbj in #676
  • chore: apply cargo machete systematically by @gbj in #671
  • feat: new reactive system implementation by @gbj in #637
  • Fixed building in release (cfg(not(debug_assertions))) by @Buzzec in #679
  • feat: maintain order of sources and dependencies by @gbj in #678
  • CI: add --release checks by @gbj in #681
  • fix: leaking stored values by @gbj in #683
  • fix: suppress spurious hydration warnings for tags in leptos_meta by @gbj in #684
  • Added IntoView for ReadSignal and RwSignal in the stable feature. by @Buzzec in #677
  • docs: typos by @ryndin32 in #685
  • fix: allow multiple <Suspense/> on same page during in-order or async rendering by @gbj in #687
  • Added example using Tailwind, CSR (only) and Trunk by @vascokk in #666
  • fix: hydration errors with <Suspense/> inside components in SSR mode by @gbj in #688
  • feat: support diffing inside component children in hot-reload by @gbj in #690
  • examples: remove duplicate console_error_panic_hook::set_once() calls by @elliotwaite in #692
  • docs: beginning work on router docs by @gbj in #682
  • fix issues in release mode (closes #700) by @gbj in #701
  • fix: ignore view markers in DynChild hydration (closes issue #697) by @gbj in #703
  • feat: add cancellable versions of request_animation_frame and request_idle_callback by @elliotwaite in #698
  • feat: add a debounce helper for event listeners by @gbj in #691
  • view! macro not compiling with a non-default scope name by @alexisfontaine in #704
  • Clippy: less .clone() calls, simpler pointer passing. by @martinfrances107 in #707
  • feat: add set_interval_with_handle and deprecate set_interval by @gbj in #709
  • feat: allow manual signal disposal before the scope is disposed by @gbj in #710
  • feat: add Scope::batch() by @gbj in #711
  • chores: clearing up some warnings and adding missing exports by @gbj in #712
  • Used modulo rather than bitwise & for is_odd check. by @carltongibson in #713
  • docs: small fixes by @gbj in #715
  • fix: <Transition/> behavior by @gbj in #717
  • Minor: Simplifiy Box::Pin() call. by @martinfrances107 in #718

New Contributors

Full Changelog: v0.2.2...v0.2.4

`v0.2.2`

12 Mar 19:03
@gbj gbj
8f94c8e
Compare
Choose a tag to compare

I forgot to make a tag or publish release notes for 0.2.1. These are both patch releases that include some performance improvements, a number of bugfixes, and spinning out a framework-independent server function crate, but don't include any particularly big new features.

Small new features

  • rkyv encoding as an option for resources
  • allowing multiple class names in class = syntax in view! macro
  • provide a new LeptosRequest<_> type that allows Leptos Axum apps access to the request via use_context, which allows you to use Axum extractors without a special handler
  • preliminary hot-reloading support, to be built into cargo-leptos, for updating static parts of the view before recompiling the Rust parts of your app

What's Changed

  • Some cleanups in router/matching/resolve_paths by @g-re-g in #569
  • perf: improvements to element creation in <For/> by @gbj in #579
  • feat: Support rkyv encoding by @617a7a in #577
  • make counter test compile by @eiswind in #588
  • fix: mouseenter and mouseleave do not bubble by @gbj in #593
  • Update example readme by @brendonotto in #595
  • examples: include missing examples in CI by @gbj in #598
  • fix: SSR + hydration improvements by @gbj in #599
  • cx typo in 02_getting_started.md by @iagafonov in #602
  • Fix typo in 03_components.md by @makoven in #603
  • In Action::dispatch() set new value before resetting input signal by @Qwox0 in #604
  • fix: memory leak in render_to_stream by @gbj in #601
  • Make server functions framework agnostic by @Demonthos in #596
  • use create_node_ref instead of NodeRef::new by @iagafonov in #607
  • publish framework-independent server_fn crate by @gbj in #605
  • fix compilation error, Issue #608 by @kulak in #609
  • updated error handling code in book by @iagafonov in #610
  • feat: support expr for #[prop(default=...)] by @ModProg in #611
  • Minor: Clippy - Simplified conditional logic in transition.rs. by @martinfrances107 in #615
  • docs: improve "Getting Started" page by @gbj in #618
  • feat: allow multiple class names in view! macro class = (closes #612) by @gbj in #614
  • tests: use check instead of build in CI for disk space by @gbj in #616
  • docs: add patterns for global state (closes #245) by @gbj in #619
  • feat: allow easier client-side form validation (closes #413) by @gbj in #620
  • fix: suppress warnings caused by resource loading in generate_route_list (closes #582) by @gbj in #621
  • CI: exclude rkyv combos with other serialization traits by @gbj in #622
  • docs: add a chapter on async actions and create_action by @gbj in #623
  • [WIP] feat: hot reloading support for cargo-leptos by @gbj in #592
  • fix: added missing attributes of events that don't bubble by @WafflePersonThing in #625
  • fix: boolean attributes in SSR by @gbj in #629
  • docs: fix instruction typos by @Banyc in #631
  • docs: Update 04_iteration.md by @jfloresremar in #630
  • bump typed-builder to version 0.13. by @martinfrances107 in #633
  • de-duplicate todomvc example by @erwanvivien in #634
  • CI: split into three actions by @gbj in #636
  • New example: session_auth_axum by @j0lol in #589
  • fix: custom events (closes issue #641) by @gbj in #642
  • Bump tower-http upto 0.4. by @martinfrances107 in #638
  • Minor: form component Removed unused variables. by @martinfrances107 in #640
  • Bump serde-wasm-bindgen to 0.5. by @martinfrances107 in #639
  • Cargo machete: Strip down leptos_server. by @martinfrances107 in #644
  • Unit tests for leptos-config and new functions for loading configuration by @vaniusrb in #628
  • chore: typo (closes issue #645) by @gbj in #646
  • bump bytecheck to 0.7, remove deprecated simdutf8_std. by @martinfrances107 in #647
  • Bumped typed-builder up to 0.14. by @martinfrances107 in #648
  • fix spelling error for document by @zackshen in #651
  • docs: add create_effect chapter by @gbj in #653
  • Make server functions work outside of WASM by @Demonthos in #643
  • πŸ”§ Fix(leptos_dom/logging): Fix showing warning instead of error by @pikhosh in #654
  • feat: impl IntoView for &Fragment by @gbj in #655
  • cargo machete: leptos_macro - Removed unused crates. by @martinfrances107 in #656
  • Put the Request on the Context for Axum by @benwis in #632
  • feat: add fragment support for hot reloading and fix some stuff by @gbj in #659
  • Copy & Clone for MaybeSignal by @CharlesTaylor7 in #660
  • fix: text node issue in template macro by @gbj in #661
  • fix: apply patches to all instances of a view, not just the first one by @gbj in #663
  • Typo fixes and other small changes to the docs by @elliotwaite in #662
  • Clippy: signal_wrappers_read, was using .clone() when copy is available. by @martinfrances107 in #665
  • v0.2.2 by @gbj in #667

New Contributors

Full Changelog: v0.2.0...v0.2.2

`v0.2.0`

25 Feb 21:03
@gbj gbj
Compare
Choose a tag to compare

v0.2.0

v0.2.0 is an incremental change over 0.1.x. There are a few small things that have been breaking changes over the last two months, one big new feature, and a lot of small improvements and changes.

Async Rendering and In-Order Streaming

The biggest new feature of 0.2.0 that requires explanation is support for async rendering and in-order streaming, which you can activate via the new ssr prop on a <Route/>. (See the ssr_modes and ssr_modes_axum examples.)

With this new feature, Leptos now supports four different ways to render HTML that contains async data loaded under <Suspense/>. You can opt in to one or the other on a per-route basis.

  1. Synchronous: Serve an HTML shell that includes fallback for any Suspense. Load data on the client, replacing fallback once they're loaded.
    • Pros: App shell appears very quickly: great TTFB (time to first byte).
    • Cons: Resources load relatively slowly; you need to wait for JS + WASM to load before even making a request.
  2. Out-of-order streaming: Serve an HTML shell that includes fallback for any Suspense. Load data on the server, streaming it down to the client as it resolves, and streaming down HTML for Suspense nodes.
    • Pros: Combines the best of synchronous and async, with a very fast shell and resources that begin loading on the server.
    • Cons: Requires JS for suspended fragments to appear in correct order. Weaker meta tag support when it depends on data that's under suspense (has already streamed down <head>)
  3. In-order streaming: Walk through the tree, returning HTML synchronously as in synchronous rendering and out-of-order streaming until you hit a Suspense. At that point, wait for all its data to load, then render it, then the rest of the tree.
    • Pros: Does not require JS for HTML to appear in correct order.
    • Cons: Loads the shell more slowly than out-of-order streaming or synchronous rendering because it needs to pause at every Suspense. Cannot begin hydration until the entire page has loaded, so earlier pieces
      of the page will not be interactive until the suspended chunks have loaded.
  4. async: Load all resources on the server. Wait until all data are loaded, and render HTML in one sweep.
    • Pros: Better handling for meta tags (because you know async data even before you render the <head>). Faster complete load than synchronous because async resources begin loading on server.
    • Cons: Slower load time/TTFB: you need to wait for all async resources to load before displaying anything on the client.

The mode defaults to out-of-order streaming. For a path that includes multiple nested routes, the most
restrictive mode will be used: i.e., if even a single nested route asks for async rendering, the whole initial
request will be rendered async. (async is the most restrictive requirement, followed by in-order, out-of-order, and synchronous.)

Because you have the ability to opt into these different modes on a per-route basis, you can choose the rendering strategy that is best for youβ€”not only for your app in general, but for any given page.

Other Features and Improvements

  • New <Html/> and <Body/> components in leptos_meta that let you change things like <html> lang and dir, and add a class to the <body>
  • Restoring on: event listeners on <Component/> nodes, e.g., <MyFancyButton on:click=.../> without needing to create an on_click prop
  • Adding a <Redirect/> component in the router that works during client-side navigation or server-side rendering
  • Children, AttributeValue, and other type aliases to make it easier to accept a variety of types in your components
  • Experimentation with new docs using CodeSandboxes and an expanding set of tutorials
  • So, so, so, so many bugfixes, typos, docs improvements, and small changes by many, many, many members of the community. Thanks to you all!

Breaking Changes Since 0.1.3

  • Resource::read() and Resource::with() now take a Scope as their first argument, i.e., resource.read() is now resource.read(cx). This is necessary for correct <Suspense/> behavior.
  • The Errors type has been modified to hide its internals and expose IntoIter directly. In 99% of cases this just means replacing references like errors.get().0.into_iter() with errors.get().into_iter()
  • Most of the methods on various signal types have been moved into traits instead. This should not cause any actual changes to the way you use them, and if you are accustomed to use leptos::* you probably won't notice the difference; if you are manually importing types you will need to import the signal traits as well.
  • The <For/> component view argument now takes a Scope as its first argument, i.e., a change from view=move |counter| { ... } to view=move |cx, counter| { ... }
  • The <ErrorBoundary/> component fallback argument now takes a Fn(Scope, RwSignal<Errors>) -> impl IntoView instead of Fn(Scope, Option<RwSignal<Errors>>) -> impl IntoView
  • NodeRef now takes NodeRef<T> instead of NodeRef<HtmlElement<T>>. We're also deprecating NodeRef::new(cx) in favor of create_node_ref(cx) to follow the same pattern as everything else in the framework.
  • We've finally achieved full consistency between cargo-leptos and the server integrations whether you're using cargo-leptos or not. The site_address field is now named site_addr; the compiler should actually prompt you correctly for this one.
  • The current Leptos global namespace is polluted with a huge number of types and reexports, making it harder to find things in docs and adding compile-time overhead. If you're used to use leptos::* you may need to manually import a few additional types. We're also no longer reexporting wasm-bindgen, web-sys, and js-sys so you may need to add them as dependencies to your Cargo.toml
  • APIs to modify status code and headers in HTTP responses are now synchronous, making them easier to set in components

Complete CHANGELOG

  • Add Children type alias by @gbj in #403
  • Fix boolean attributes in view macro fast-path SSR by @gbj in #408
  • Add <Html/> and <Body/> components in leptos_meta by @gbj in #407
  • Minor: Bump typed-builder from 0.11 to 0.12. by @martinfrances107 in #409
  • Escape and tokens in documentation markup. by @martinfrances107 in #410
  • fix: correct types for top-level <option> and <use> in SSR view macro by @gbj in #416
  • Switch RwLock to parking_lot so they are no longer async by @benwis in #414
  • Add leptos_routes functions for integrations by @b4-io in #415
  • Fix issues with attribute names in SSR by @gbj in #418
  • Implemented update_returning for StoredValue by @thestarmaker in #419
  • Update ErrorBoundary to use miette::Diagnostic instead of Error, and various other tweaks by @benwis in #401
  • Fix some small issues in axum_errors example by @gbj in #424
  • fix: Make all fragment rendering lazy (closes #299 and #421) by @gbj in #425
  • fixes cx not found on components marked with #[component(transparent)] by @jquesada2016 in #423
  • Several Minor Updates on Examples by @Indrazar in #427
  • Make RouteDefinition public by @gbj in #430
  • docs: Document inner_html attribute by @gbj in #429
  • chore: switch examples to check instead of build (for CI) & add missing examples by @gbj in #437
  • Fix top-level SVG elements in SSR by @gbj in #435
  • fix: correct behavior of <Show/> by @gbj in #436
  • Dedup from_str implementations for Env by @g-re-g in #426
  • leptos-server: Removed unused dependency on log, linear-map and rmp-serde. by @martinfrances107 in #439
  • leptos_macro: Machete - Removed unused deps. by @martinfrances107 in #441
  • router: Machete - Removed unused deps. by @martinfrances107 in #442
  • use latest tokio in leptos_axum by @Gentle in #443
  • fix: successfully pass context to nested routes via <Outlet/> by @gbj in #447
  • feature: allow on: event listeners on <Component/> nodes by @gbj in #448
  • fix: update leptos dependencies paths to the workspace by @turbotobias in #449
  • fix: leptos_router hydration issues by @gbj in #450
  • Clippy: "{input} is not a supported environment." by @martinfrances107 in #451
  • fix: stack overflow in with nested outlet (closes #452) by @gbj in #453
  • fix: typo in leptos_config description by @odiseo0 in #455
  • docs: add new Children types to macro docs by @gbj in https://g...
Read more

`v0.2.0-beta`

20 Feb 16:21
@gbj gbj
3220419
Compare
Choose a tag to compare
`v0.2.0-beta` Pre-release
Pre-release

v0.2.0-beta

This release is a preview, and also serves to generate new docs on docs.rs, as the current ones are getting slightly out of sync with our main branch here.

Changes from 0.2.0-alpha to 0.2.0-beta

  • Resource::read() and Resource::with() now take a Scope as their first argument, i.e., resource.read() is now resource.read(cx). This is necessary for correct <Suspense/> behavior.
  • The Errors type has been modified to hide its internals and expose IntoIter directly. In 99% of cases this just means replacing references like errors.get().0.into_iter() with errors.get().into_iter()
  • Most of the methods on various signal types have been moved into traits instead. This should not cause any actual changes to the way you use them, and if you are accustomed to use leptos::* you probably won't notice the difference; if you are manually importing types you will need to import the signal traits as well.

Included below are the notes for 0.2.0-alpha, so you can see changes since 0.1.3 as well.

Breaking Changes since 0.1.3

  • The <For/> component view argument now takes a Scope as its first argument, i.e., a change from view=move |counter| { ... } to view=move |cx, counter| { ... }
  • The <ErrorBoundary/> component fallback argument now takes a Fn(Scope, RwSignal<Errors>) -> impl IntoView instead of Fn(Scope, Option<RwSignal<Errors>>) -> impl IntoView
  • NodeRef now takes NodeRef<T> instead of NodeRef<HtmlElement<T>>. We're also deprecating NodeRef::new(cx) in favor of create_node_ref(cx) to follow the same pattern as everything else in the framework.
  • We've finally achieved full consistency between cargo-leptos and the server integrations whether you're using cargo-leptos or not. The site_address field is now named site_addr; the compiler should actually prompt you correctly for this one.
  • The current Leptos global namespace is polluted with a huge number of types and reexports, making it harder to find things in docs and adding compile-time overhead. If you're used to use leptos::* you may need to manually import a few additional types. We're also no longer reexporting wasm-bindgen, web-sys, and js-sys so you may need to add them as dependencies to your Cargo.toml
  • APIs to modify status code and headers in HTTP responses are now synchronous, making them easier to set in components

Other Improvements

  • New <Html/> and <Body/> components in leptos_meta that let you change things like <html> lang and dir, and add a class to the <body>
  • Restoring on: event listeners on <Component/> nodes, e.g., <MyFancyButton on:click=.../> without needing to create an on_click prop
  • Adding a <Redirect/> component in the router that works during client-side navigation or server-side rendering
  • Children, AttributeValue, and other type aliases to make it easier to accept a variety of types in your components
  • Experimentation with new docs using CodeSandboxes and an expanding set of tutorials
  • So, so, so, so many bugfixes, typos, docs improvements, and small changes by many, many, many members of the community. Thanks to you all!

What's Changed

  • leptos_dom erros.rs remove() does not need to be generic. by @martinfrances107 in #516
  • fix: correct namespace for Unit in empty views (closes #518) by @gbj in #520
  • Reexport web-sys event types to make it easier to type handlers by @gbj in #521
  • Identify CSS to reload from the href by @akesson in #524
  • change: tweak API of Errors and implement IntoIter by @gbj in #522
  • fix: top-level SVG in view macro with new exports by @gbj in #525
  • feature: reintroduce limited template-node cloning w/ template macro by @gbj in #526
  • fix: hydration IDs for elements following <Suspense/> (closes #527) by @gbj in #531
  • feature: in-order streaming and async rendering by @gbj in #496
  • fix compile of leptos dom by @seanaye in #535
  • Signal traits by @jquesada2016 in #490
  • v0.2.0-alpha2 by @gbj in #539
  • fix: building leptos_reactive in release mode by @gbj in #540
  • 533 by @jquesada2016 in #538
  • fix(examples): hackernews_axum styles href by @ApplY3D in #536
  • revert PR #538 by @gbj in #544
  • fix: more work on hydration IDs with <Suspense/> by @gbj in #545
  • change: pass Scope into Resource::read() and Resource::with() by @gbj in #542
  • document typo by @chrislearn in #553
  • Fix typo in hydration.rs by @eltociear in #552
  • Fix issue with redirects in server fns creating multiple Location headers by @benwis in #550

New Contributors

Full Changelog: v0.2.0-alpha...v0.2.0-beta

`v0.2.0-alpha`

14 Feb 00:50
@gbj gbj
8a99623
Compare
Choose a tag to compare
`v0.2.0-alpha` Pre-release
Pre-release

v0.2.0-alpha

This release is a preview, and also serves to generate new docs on docs.rs, as the current ones are getting slightly out of sync with our main branch here.

I do not expect significant difficulties in migrating from 0.1.3 to 0.2.0. There are a few API tweaks here that necessitate a version bump but it's an order of magnitude smaller than the change from 0.0.x to 0.1.0 and will not touch most parts of your application.

Breaking Changes

  • The <For/> component view argument now takes a Scope as its first argument, i.e., a change from view=move |counter| { ... } to view=move |cx, counter| { ... }
  • The <ErrorBoundary/> component fallback argument now takes a Fn(Scope, RwSignal<Errors>) -> impl IntoView instead of Fn(Scope, Option<RwSignal<Errors>>) -> impl IntoView
  • NodeRef now takes NodeRef<T> instead of NodeRef<HtmlElement<T>>. We're also deprecating NodeRef::new(cx) in favor of create_node_ref(cx) to follow the same pattern as everything else in the framework.
  • We've finally achieved full consistency between cargo-leptos and the server integrations whether you're using cargo-leptos or not. The site_address field is now named site_addr; the compiler should actually prompt you correctly for this one.
  • The current Leptos global namespace is polluted with a huge number of types and reexports, making it harder to find things in docs and adding compile-time overhead. If you're used to use leptos::* you may need to manually import a few additional types. We're also no longer reexporting wasm-bindgen, web-sys, and js-sys so you may need to add them as dependencies to your Cargo.toml
  • APIs to modify status code and headers in HTTP responses are now synchronous, making them easier to set in components

Other Improvements

  • New <Html/> and <Body/> components in leptos_meta that let you change things like <html> lang and dir, and add a class to the <body>
  • Restoring on: event listeners on <Component/> nodes, e.g., <MyFancyButton on:click=.../> without needing to create an on_click prop
  • Adding a <Redirect/> component in the router that works during client-side navigation or server-side rendering
  • Children, AttributeValue, and other type aliases to make it easier to accept a variety of types in your components
  • Experimentation with new docs using CodeSandboxes and an expanding set of tutorials
  • So, so, so, so many bugfixes, typos, docs improvements, and small changes by many, many, many members of the community. Thanks to you all!

Complete Changelog

  • Add Children type alias by @gbj in #403
  • Fix boolean attributes in view macro fast-path SSR by @gbj in #408
  • Add <Html/> and <Body/> components in leptos_meta by @gbj in #407
  • Minor: Bump typed-builder from 0.11 to 0.12. by @martinfrances107 in #409
  • Escape and tokens in documentation markup. by @martinfrances107 in #410
  • fix: correct types for top-level <option> and <use> in SSR view macro by @gbj in #416
  • Switch RwLock to parking_lot so they are no longer async by @benwis in #414
  • Add leptos_routes functions for integrations by @b4-io in #415
  • Fix issues with attribute names in SSR by @gbj in #418
  • Implemented update_returning for StoredValue by @thestarmaker in #419
  • Various tweaks to ErrorBoundary by @benwis in #401
  • Fix some small issues in axum_errors example by @gbj in #424
  • fix: Make all fragment rendering lazy (closes #299 and #421) by @gbj in #425
  • fixes cx not found on components marked with #[component(transparent)] by @jquesada2016 in #423
  • Several Minor Updates on Examples by @Indrazar in #427
  • Make RouteDefinition public by @gbj in #430
  • docs: Document inner_html attribute by @gbj in #429
  • chore: switch examples to check instead of build (for CI) & add missing examples by @gbj in #437
  • Fix top-level SVG elements in SSR by @gbj in #435
  • fix: correct behavior of <Show/> by @gbj in #436
  • Dedup from_str implementations for Env by @g-re-g in #426
  • leptos-server: Removed unused dependency on log, linear-map and rmp-serde. by @martinfrances107 in #439
  • leptos_macro: Machete - Removed unused deps. by @martinfrances107 in #441
  • router: Machete - Removed unused deps. by @martinfrances107 in #442
  • use latest tokio in leptos_axum by @Gentle in #443
  • fix: successfully pass context to nested routes via <Outlet/> by @gbj in #447
  • feature: allow on: event listeners on <Component/> nodes by @gbj in #448
  • fix: update leptos dependencies paths to the workspace by @turbotobias in #449
  • fix: leptos_router hydration issues by @gbj in #450
  • Clippy: "{input} is not a supported environment." by @martinfrances107 in #451
  • fix: stack overflow in with nested outlet (closes #452) by @gbj in #453
  • fix: typo in leptos_config description by @odiseo0 in #455
  • docs: add new Children types to macro docs by @gbj in #454
  • Derive debug for params struct in server macro by @g-re-g in #458
  • perf: further reduce WASM binary size by ~5-7% by @gbj in #459
  • Fix #457 by @Threated in #460
  • docs: add note about optional fallback in <Show/> (closes #406) by @gbj in #463
  • impl Default for MaybeSignal by @ModProg in #464
  • feature: add isomorphic <Redirect/> component (closes #412) by @gbj in #466
  • Add simple icon logo by @underscorefunk in #468
  • error on non meta input for prop attribute by @ModProg in #469
  • fix: don't override element event listeners with component event listeners by @gbj in #470
  • fix: fix node_ref in SSR by @gbj in #471
  • Convert site_address to site_addr by @benwis in #462
  • impl From<&str> for MaybeSignal by @g-re-g in #472
  • fix: correct out-of-order streaming behavior (closes #473) by @gbj in #475
  • fix: cargo doc in projects using #[server] by @gbj in #476
  • fix: adding/removing errors from <ErrorBoundary/> by @gbj in #478
  • Experiments in new tutorial/guide format with integrated CodeSandboxes by @gbj in #375
  • remove unnecessary "openssl" feature from Actix examples by @gbj in #480
  • Better styling for router related components by @Threated in #477
  • fix: errors on 404 page in axum_errors example by @gbj in #485
  • Minor: Clippy router now uses types OnFormData and OnResponse. by @martinfrances107 in #484
  • fix: correct behavior for inner_html in SSR by @gbj in #487
  • fix: typed route params with #[derive(Params)] by @gbj in #488
  • Fix node ref generics by @jquesada2016 in #481
  • fix: fix debug_warn behavior in reactive crate and remove log dependency by @gbj in #491
  • change: add Scope to view function in <For/> to avoid memory "leak" by @gbj in #492
  • fix: error boundary hydration by @gbj in #494
  • Suspense: removed unused .clone() call. by @martinfrances107 in #486
  • examples: remove unused index.html by @gbj in #497
  • Allow literal string as class in view macro by @g-re-g in #500
  • fix: proper disposal of nested route scopes by @gbj in #499
  • workspace rustfmt by @jquesada2016 in #483
  • apply new formatting everywhere by @gbj in #502
  • Docs improvements by @gbj in #505
  • fix: <For/> in todomvc example by @gbj in #504
  • docs: add docs on testing (clos...
Read more