Skip to content

Releases: leptos-rs/leptos

v0.8.0-rc2

18 Apr 13:12
@gbj gbj
Compare
Choose a tag to compare
v0.8.0-rc2 Pre-release
Pre-release

Release notes copied from 0.8.0-alpha/beta/rc1. Changelog relative to 0.8.0-rc1. This release includes some bugfixes, but is mostly intended to fix compilation on the latest nightly release.

0.8 has been planned for a while, primarily to accommodate small changes that arose during the course of testing and adopting 0.7, most of which are technically semver-breaking but should not meaningfully affect user code.

If we don't hear any feedback about issues with this rc2 release, we will plan to release it as 0.8.0 in the next week or so.

Noteworthy features:

  • Axum 0.8 support. (This alone required a major version bump, as we reexport some Axum types.) (thanks to @sabify for the migration work here)
  • Significant improvements to compile times when using --cfg=erase_components, which is useful as a dev-mode optimization (thanks to @zakstucke) This is the default setting for debug mode in future releases of cargo-leptos, and can be set up manually for use with Trunk. (See docs here.)
  • Support for the new islands-router features that allow a client-side routing experience while using islands (see the islands_router example) (this one was me)
  • Improved server function error handling by allowing you to use any type that implements FromServerFnError rather than being constrained to use ServerFnError (see #3274). (Note: This will require changes if you're using a custom error type, but should be a better experience.) (thanks to @ryo33)
  • Support for creating WebSockets via server fns (thanks to @ealmloff)
  • Changes to make custom errors significantly more ergonomic when using server functions

As you can see this was a real team effort and, as always, I'm grateful for the contributions of everyone named above, and all those who made commits below.

WebSocket Example

The WebSocket support is particularly exciting, as it allows you to call server functions using the default Rust Stream trait from the futures crate, and have those streams send messages over websockets without you needing to know anything about that process. The API landed in a place that feels like a great extension of the "server function" abstraction in which you can make HTTP requests as if they were ordinary async calls. The websocket stuff doesn't integrate directly with Resources/SSR (which make more sense for one-shot things) but is really easy to use:

use server_fn::{codec::JsonEncoding, BoxedStream, ServerFnError, Websocket};

// The websocket protocol can be used on any server function that accepts and returns a [`BoxedStream`]
// with items that can be encoded by the input and output encoding generics.
//
// In this case, the input and output encodings are [`Json`] and [`Json`], respectively which requires
// the items to implement [`Serialize`] and [`Deserialize`].
#[server(protocol = Websocket<JsonEncoding, JsonEncoding>)]
async fn echo_websocket(
    input: BoxedStream<String, ServerFnError>,
) -> Result<BoxedStream<String, ServerFnError>, ServerFnError> {
    use futures::channel::mpsc;
    use futures::{SinkExt, StreamExt};
    let mut input = input; // FIXME :-) server fn fields should pass mut through to destructure

    // create a channel of outgoing websocket messages 
    // we'll return rx, so sending a message to tx will send a message to the client via the websocket
    let (mut tx, rx) = mpsc::channel(1);

    // spawn a task to listen to the input stream of messages coming in over the websocket 
    tokio::spawn(async move {
        while let Some(msg) = input.next().await {
            // do some work on each message, and then send our responses 
            tx.send(msg.map(|msg| msg.to_ascii_uppercase())).await;
        }
    });

    Ok(rx.into())
}

#[component]
pub fn App() -> impl IntoView {
    use futures::channel::mpsc;
    use futures::StreamExt;
    let (mut tx, rx) = mpsc::channel(1);
    let latest = RwSignal::new(None);

    // we'll only listen for websocket messages on the client
    if cfg!(feature = "hydrate") {
        spawn_local(async move {
            match echo_websocket(rx.into()).await {
                Ok(mut messages) => {
                    while let Some(msg) = messages.next().await {
                        latest.set(Some(msg));
                    }
                }
                Err(e) => leptos::logging::warn!("{e}"),
            }
        });
    }

    view! {
        <input type="text" on:input:target=move |ev| {
            tx.try_send(Ok(ev.target().value()));
        }/>
        <p>{latest}</p>
    }
}

What's Changed

  • fix: call additional_context after providing other server context in all cases by @gbj in #3841
  • fix: correctly decode base64-encoded server action error messages stored in URL by @gbj in #3842
  • fix: don't try to move keyed elements within the DOM if they're not yet mounted (closes #3844) by @gbj in #3846
  • chore(nightly): update proc-macro span file name method name by @gbj in #3852
  • fix: reactive_graph keymap impl and clippy warnings by @sabify in #3843
  • chore: ran cargo outdated. by @martinfrances107 in #3722

Full Changelog: v0.8.0-rc1...v0.8.0-rc2

0.8.0-rc1

11 Apr 16:13
@gbj gbj
Compare
Choose a tag to compare
0.8.0-rc1 Pre-release
Pre-release

Release notes copied from 0.8.0-alpha/beta. Changelog relative to 0.8.0-beta.

0.8 has been planned for a while, primarily to accommodate small changes that arose during the course of testing and adopting 0.7, most of which are technically semver-breaking but should not meaningfully affect user code.

If we don't hear any feedback about issues with this rc1 release, we will plan to release it as 0.8.0 in the next week or so.

Noteworthy features:

  • Axum 0.8 support. (This alone required a major version bump, as we reexport some Axum types.) (thanks to @sabify for the migration work here)
  • Significant improvements to compile times when using --cfg=erase_components, which is useful as a dev-mode optimization (thanks to @zakstucke) This is the default setting for debug mode in future releases of cargo-leptos, and can be set up manually for use with Trunk. (See docs here.)
  • Support for the new islands-router features that allow a client-side routing experience while using islands (see the islands_router example) (this one was me)
  • Improved server function error handling by allowing you to use any type that implements FromServerFnError rather than being constrained to use ServerFnError (see #3274). (Note: This will require changes if you're using a custom error type, but should be a better experience.) (thanks to @ryo33)
  • Support for creating WebSockets via server fns (thanks to @ealmloff)
  • Changes to make custom errors significantly more ergonomic when using server functions

As you can see this was a real team effort and, as always, I'm grateful for the contributions of everyone named above, and all those who made commits below.

WebSocket Example

The WebSocket support is particularly exciting, as it allows you to call server functions using the default Rust Stream trait from the futures crate, and have those streams send messages over websockets without you needing to know anything about that process. The API landed in a place that feels like a great extension of the "server function" abstraction in which you can make HTTP requests as if they were ordinary async calls. The websocket stuff doesn't integrate directly with Resources/SSR (which make more sense for one-shot things) but is really easy to use:

use server_fn::{codec::JsonEncoding, BoxedStream, ServerFnError, Websocket};

// The websocket protocol can be used on any server function that accepts and returns a [`BoxedStream`]
// with items that can be encoded by the input and output encoding generics.
//
// In this case, the input and output encodings are [`Json`] and [`Json`], respectively which requires
// the items to implement [`Serialize`] and [`Deserialize`].
#[server(protocol = Websocket<JsonEncoding, JsonEncoding>)]
async fn echo_websocket(
    input: BoxedStream<String, ServerFnError>,
) -> Result<BoxedStream<String, ServerFnError>, ServerFnError> {
    use futures::channel::mpsc;
    use futures::{SinkExt, StreamExt};
    let mut input = input; // FIXME :-) server fn fields should pass mut through to destructure

    // create a channel of outgoing websocket messages 
    // we'll return rx, so sending a message to tx will send a message to the client via the websocket
    let (mut tx, rx) = mpsc::channel(1);

    // spawn a task to listen to the input stream of messages coming in over the websocket 
    tokio::spawn(async move {
        while let Some(msg) = input.next().await {
            // do some work on each message, and then send our responses 
            tx.send(msg.map(|msg| msg.to_ascii_uppercase())).await;
        }
    });

    Ok(rx.into())
}

#[component]
pub fn App() -> impl IntoView {
    use futures::channel::mpsc;
    use futures::StreamExt;
    let (mut tx, rx) = mpsc::channel(1);
    let latest = RwSignal::new(None);

    // we'll only listen for websocket messages on the client
    if cfg!(feature = "hydrate") {
        spawn_local(async move {
            match echo_websocket(rx.into()).await {
                Ok(mut messages) => {
                    while let Some(msg) = messages.next().await {
                        latest.set(Some(msg));
                    }
                }
                Err(e) => leptos::logging::warn!("{e}"),
            }
        });
    }

    view! {
        <input type="text" on:input:target=move |ev| {
            tx.try_send(Ok(ev.target().value()));
        }/>
        <p>{latest}</p>
    }
}

What's Changed

  • Fix typo by @NCura in #3727
  • fix: matching optional params after an initial static param (closes #3730) by @gbj in #3732
  • docs: update example tailwind input css to v4 by @bimoadityar in #3702
  • More flexible server fn macro api by @ealmloff in #3725
  • fix(CI): switch to stable in semver for most compatibility by @sabify in #3737
  • fix(CI): cancel in-group inflight and pending jobs on new pushes in pull requests by @sabify in #3739
  • fix(CI): free-up disk, properly gate nightly feature and pre-install deps by @sabify in #3735
  • ArcLocalResource fix (0.8) by @zakstucke in #3741
  • ArcLocalResource fix (0.7) by @zakstucke in #3740
  • fix(CI): cleanup the directory no matter of the results by @sabify in #3743
  • fix(CI): sermver job name by @sabify in #3748
  • chore: no need to filter out "nightly" feature as of #3735 by @sabify in #3747
  • fix: use signals rather than Action::new_local() (closes #3746) by @gbj in #3749
  • feat: switch extract() helper to use ServerFnErrorErr (closes #3745) by @ilyvion in #3750
  • docs(Effect::watch): refer to dependency_fn and handler args by @jmevel in #3731
  • Leptos 0.8 by @gbj in #3529
  • chore: ensure WASM target is installed for examples with provided rust-toolchain.toml (closes #3717) by @gbj in #3752
  • Make trailing comma optional for either macro by @NCura in #3736
  • chore: add SignalSetter to prelude (closes #3547) by @gbj in #3753
  • fix: properly feature gating ui macro tests (Closes #3742) by @sabify in #3756
  • fix(CI): optimize CI workflow by @sabify in #3758
  • fix(CI): remove duplicate semver ci, #3758 follow-up by @sabify in #3764
  • fix(CI): install deps only if needed, speeds up CI by @sabify in #3768
  • fix: support IntoFragment for single element (closes #3757) by @gbj in #3759
  • fix: clippy errors by @sabify in #3772
  • fix(CI): install deno only if needed, #3768 follow-up by @sabify in #3773
  • fix(CI): remove caching by @sabify in #3776
  • fix(CI): conditional executions of only changed examples by @sabify in #3777
  • Make docs match reality by @ilyvion in #3775
  • fix(CI): toolchain will be determined and test against by CI by @sabify in #3778
  • Reduce use local signals for Action::new_local and similar primitives by @gbj in #3762
  • Tweaks to MaybeSendWrapperOption<_> by @gbj in #3781
  • fix: correctly handle optional parameters in ParentRoute by @gbj in #3784
  • fix: router example build process by @sabify in #3779
  • fix(CI): run only the exact examples on the only examples change by @sabify in #3782
  • Re-export the codee crate by @zakstucke in #3761
  • fix: allow repeated class= for all tuples, not only static ones (closes #3794) by @gbj in #3801
  • Fix Store notification order for nested keyed fields by @gbj in #3799
  • Improved handling of <Title/> by @gbj in #3793
  • derive_local for ArcSignal<T, LocalStorage> by @zakstucke in #3798
  • fix: portal example by @sabify in #3785
  • feat: add support for more HTTP methods in server fn codecs by @ChosunOne in #3797
  • Store test fixes by @gbj in #3803
  • Add track_caller to store field methods by @jvdwrf in #3805
  • fix: allow custom status codes or redirects for route fallbacks by @gbj in #3808
  • fix: Move several Into* trait impls for store fields out of stable module for wider use by @mahdi739 in #3807
  • fix: remove SendOption from public API of actions by @gbj in https://github.com/leptos-rs/leptos/pul...
Read more

0.8.0-beta

20 Mar 01:13
@gbj gbj
Compare
Choose a tag to compare
0.8.0-beta Pre-release
Pre-release

Release notes copied from 0.8.0-alpha. Changelog relative to 0.8.0-alpha.

0.8 has been planned for a while, primarily to accommodate small changes that arose during the course of testing and adopting 0.7, most of which are technically semver-breaking but should not meaningfully affect user code.

Noteworthy features:

  • Axum 0.8 support. (This alone required a major version bump, as we reexport some Axum types.) (thanks to @sabify for the migration work here)
  • Significant improvements to compile times when using --cfg=erase_components, which is useful as a dev-mode optimization (thanks to @zakstucke)
  • Support for the new islands-router features that allow a client-side routing experience while using islands (see the islands_router example) (this one was me)
  • Improved server function error handling by allowing you to use any type that implements FromServerFnError rather than being constrained to use ServerFnError (see #3274). (Note: This will require changes if you're using a custom error type, but should be a better experience.) (thanks to @ryo33)
  • Support for creating WebSockets via server fns (thanks to @ealmloff)

As you can see this was a real team effort and, as always, I'm grateful for the contributions of everyone named above, and all those who made commits below. (Apologies if I missed any big features! I will add missing things to release notes as release nears.)

WebSocket Example

The WebSocket support is particularly exciting, as it allows you to call server functions using the default Rust Stream trait from the futures crate, and have those streams send messages over websockets without you needing to know anything about that process. The API landed in a place that feels like a great extension of the "server function" abstraction in which you can make HTTP requests as if they were ordinary async calls. The websocket stuff doesn't integrate directly with Resources/SSR (which make more sense for one-shot things) but is really easy to use:

use server_fn::{codec::JsonEncoding, BoxedStream, ServerFnError, Websocket};

// The websocket protocol can be used on any server function that accepts and returns a [`BoxedStream`]
// with items that can be encoded by the input and output encoding generics.
//
// In this case, the input and output encodings are [`Json`] and [`Json`], respectively which requires
// the items to implement [`Serialize`] and [`Deserialize`].
#[server(protocol = Websocket<JsonEncoding, JsonEncoding>)]
async fn echo_websocket(
    input: BoxedStream<String, ServerFnError>,
) -> Result<BoxedStream<String, ServerFnError>, ServerFnError> {
    use futures::channel::mpsc;
    use futures::{SinkExt, StreamExt};
    let mut input = input; // FIXME :-) server fn fields should pass mut through to destructure

    // create a channel of outgoing websocket messages 
    // we'll return rx, so sending a message to tx will send a message to the client via the websocket
    let (mut tx, rx) = mpsc::channel(1);

    // spawn a task to listen to the input stream of messages coming in over the websocket 
    tokio::spawn(async move {
        while let Some(msg) = input.next().await {
            // do some work on each message, and then send our responses 
            tx.send(msg.map(|msg| msg.to_ascii_uppercase())).await;
        }
    });

    Ok(rx.into())
}

#[component]
pub fn App() -> impl IntoView {
    use futures::channel::mpsc;
    use futures::StreamExt;
    let (mut tx, rx) = mpsc::channel(1);
    let latest = RwSignal::new(None);

    // we'll only listen for websocket messages on the client
    if cfg!(feature = "hydrate") {
        spawn_local(async move {
            match echo_websocket(rx.into()).await {
                Ok(mut messages) => {
                    while let Some(msg) = messages.next().await {
                        latest.set(Some(msg));
                    }
                }
                Err(e) => leptos::logging::warn!("{e}"),
            }
        });
    }

    view! {
        <input type="text" on:input:target=move |ev| {
            tx.try_send(Ok(ev.target().value()));
        }/>
        <p>{latest}</p>
    }
}

What's Changed

  • Allow LocalResource sync methods to be used outside Suspense by @zakstucke in #3708
  • fix: ensure that store subfield mutations notify from the root down (closes #3704) by @gbj in #3714
  • fix(reactive_stores_macro): Make tuple struct field locator in impl Patch be syn::Index instead of usize by @DanikVitek in #3700
  • feat(reactive_stores): Replace AsRef bound of StoreFieldIterator blanket impl with Len bound by @DanikVitek in #3701
  • refactor: make shell parameter in file_and_error_handler* generic by @tversteeg in #3711
  • Various issues related to setting signals and context in cleanups by @gbj in #3687
  • view!{} macro optimisation: don't wrap string types in closures when passing to ToChildren by @zakstucke in #3716
  • test: regression from #3502 by @metatoaster in #3720
  • Remove SendWrapper from the external interface of LocalResource by @zakstucke in #3715

Full Changelog: 0.8.0-alpha...0.8.0-beta

v0.7.8

20 Mar 15:31
Compare
Choose a tag to compare

A minor release with some quality of life improvements and bugfixes

What's Changed

New Contributors

Full Changelog: v0.7.7...v0.7.8

0.8.0-alpha

13 Mar 01:12
@gbj gbj
Compare
Choose a tag to compare
0.8.0-alpha Pre-release
Pre-release

0.8 has been planned for a while, primarily to accommodate small changes that arose during the course of testing and adopting 0.7, most of which are technically semver-breaking but should not meaningfully affect user code.

Noteworthy features:

  • Axum 0.8 support. (This alone required a major version bump, as we reexport some Axum types.) (thanks to @sabify for the migration work here)
  • Significant improvements to compile times when using --cfg=erase_components, which is useful as a dev-mode optimization (thanks to @zakstucke)
  • Support for the new islands-router features that allow a client-side routing experience while using islands (see the islands_router example) (this one was me)
  • Improved server function error handling by allowing you to use any type that implements FromServerFnError rather than being constrained to use ServerFnError (see #3274). (Note: This will require changes if you're using a custom error type, but should be a better experience.) (thanks to @ryo33)
  • Support for creating WebSockets via server fns (thanks to @ealmloff)

As you can see this was a real team effort and, as always, I'm grateful for the contributions of everyone named above, and all those who made commits below. (Apologies if I missed any big features! I will add missing things to release notes as release nears.)

WebSocket Example

The WebSocket support is particularly exciting, as it allows you to call server functions using the default Rust Stream trait from the futures crate, and have those streams send messages over websockets without you needing to know anything about that process. The API landed in a place that feels like a great extension of the "server function" abstraction in which you can make HTTP requests as if they were ordinary async calls. The websocket stuff doesn't integrate directly with Resources/SSR (which make more sense for one-shot things) but is really easy to use:

use server_fn::{codec::JsonEncoding, BoxedStream, ServerFnError, Websocket};

// The websocket protocol can be used on any server function that accepts and returns a [`BoxedStream`]
// with items that can be encoded by the input and output encoding generics.
//
// In this case, the input and output encodings are [`Json`] and [`Json`], respectively which requires
// the items to implement [`Serialize`] and [`Deserialize`].
#[server(protocol = Websocket<JsonEncoding, JsonEncoding>)]
async fn echo_websocket(
    input: BoxedStream<String, ServerFnError>,
) -> Result<BoxedStream<String, ServerFnError>, ServerFnError> {
    use futures::channel::mpsc;
    use futures::{SinkExt, StreamExt};
    let mut input = input; // FIXME :-) server fn fields should pass mut through to destructure

    // create a channel of outgoing websocket messages 
    // we'll return rx, so sending a message to tx will send a message to the client via the websocket
    let (mut tx, rx) = mpsc::channel(1);

    // spawn a task to listen to the input stream of messages coming in over the websocket 
    tokio::spawn(async move {
        while let Some(msg) = input.next().await {
            // do some work on each message, and then send our responses 
            tx.send(msg.map(|msg| msg.to_ascii_uppercase())).await;
        }
    });

    Ok(rx.into())
}

#[component]
pub fn App() -> impl IntoView {
    use futures::channel::mpsc;
    use futures::StreamExt;
    let (mut tx, rx) = mpsc::channel(1);
    let latest = RwSignal::new(None);

    // we'll only listen for websocket messages on the client
    if cfg!(feature = "hydrate") {
        spawn_local(async move {
            match echo_websocket(rx.into()).await {
                Ok(mut messages) => {
                    while let Some(msg) = messages.next().await {
                        latest.set(Some(msg));
                    }
                }
                Err(e) => leptos::logging::warn!("{e}"),
            }
        });
    }

    view! {
        <input type="text" on:input:target=move |ev| {
            tx.try_send(Ok(ev.target().value()));
        }/>
        <p>{latest}</p>
    }
}

What's Changed

Read more

v0.7.7

12 Feb 01:34
@gbj gbj
Compare
Choose a tag to compare

If you're migrating from 0.6 to 0.7, please see the 0.7.0 release notes here.

This is a small patch release including primarily bugfixes, and some small ergonomic improvements.

What's Changed

New Contributors

Full Changelog: v0.7.5...v0.7.7

v0.7.5

31 Jan 02:47
@gbj gbj
Compare
Choose a tag to compare

If you're migrating from 0.6 to 0.7, please see the 0.7.0 release notes here.

This is a small patch release including primarily bugfixes.

What's Changed

  • chore: work around wasm-bindgen breakage by @gbj in #3498
  • Add support for custom patch by @mscofield0 in #3449
  • feat: either_or combinator by @geovie in #3417
  • (wip): implement unboxing support for recursive store nodes (closes #3491) by @gbj in #3493
  • fix: correctly handle ErrorBoundary through reactive views (closes #3487) by @gbj in #3492
  • chore: restore reactivity warning at top level of components (closes #3354) by @gbj in #3499
  • feat: #[lazy] macros to support lazy loading and code splitting by @gbj in #3477
  • chore(ci): add CI for leptos_0.8 branch by @gbj in #3500
  • fix: including node_ref after {..} on arbitrary components by @gbj in #3503
  • Enhanced docs for reactive_stores by @dcsturman in #3508
  • Adding a project detailing flexible mocking architecture inspired by hexagonal architecture for leptos app by @sjud in #3342
  • issue-3467 - bumping codee version to support rkyv 8 by @thestarmaker in #3504
  • docs: Fix README.md & Add MSRV badge by @DanikVitek in #3480
  • update workspace dependency versions by @gbj in #3506
  • feat (either_of): Extent API; Implement other iterator methods; Update deps by @DanikVitek in #3478
  • AddAnyAttr working with erase_components by @zakstucke in #3518
  • impl IntoAttributeValue for TextProp by @SleeplessOne1917 in #3517
  • Fix memo recomputation by @stefnotch in #3495
  • feat(callback): implement matches method for Callback and UnsyncCallback by @geoffreygarrett in #3520
  • fix: correctly notify descendants and ancestors of store fields (closes #3523) by @gbj in #3524
  • feat: allow raw identifiers in Params derive macro by @geovie in #3525

New Contributors

Full Changelog: v0.7.4...v0.7.5

v0.7.4

16 Jan 19:49
@gbj gbj
Compare
Choose a tag to compare

If you're migrating from 0.6 to 0.7, please see the 0.7.0 release notes here.

This is a small patch release including a couple of bugfixes,

What's Changed

  • Rkyv feature should propagate properly by @thestarmaker in #3448
  • fix: allow multiple overlapping notifications of AsyncDerived/LocalResource (closes #3454) by @gbj in #3455
  • Derive clone for RouteChildren by @Innominus in #3462
  • fix: do not overwrite SuspenseContext in adjacent Transition components (closes #3465) by @gbj in #3471
  • Implement AddAnyAttr trait for Static by @geoffreygarrett in #3464
  • feat: add [Arc]LocalResource::refetch method by @linw1995 in #3394
  • chore: fix tracing warning mess by @gbj in #3473
  • Fix: values being moved with the debug_warn! macro when compiling with not(debug_assertions) by @WorldSEnder in #3446
  • docs: warn about callbacks outside the ownership tree by @tversteeg in #3442
  • fix: do not use stale values in AsyncDerived if it is mutated before running by @gbj in #3475
  • fix: include missing nonces on streaming script tags and on leptos_meta components (closes #3482) by @gbj in #3485

New Contributors

Full Changelog: v0.7.3...v0.7.4

v0.7.3

04 Jan 14:01
@gbj gbj
Compare
Choose a tag to compare

If you're migrating from 0.6 to 0.7, please see the 0.7.0 release notes here.

This is a small patch release including a couple of bugfixes, as well as the ability to destructure prop value in components with a new #[prop(name = ...)] syntax (see #3382)

#[prop(name = "data")] UserInfo { email, user_id }: UserInfo,

What's Changed

  • Enable console feature of web-sys for reactive_graph by @alexisfontaine in #3406
  • fix: correctly track updates to keyed fields in keyed iterator (closes #3401) by @gbj in #3403
  • fix: getrandom needs js feature (used when nonce feature is active) (closes #3409) by @gbj in #3410
  • Provide custom state in file_and_error_handler by @spencewenski in #3408
  • feat: allow to destructure props by @geovie in #3382
  • Add missing #[track_caller]s by @mscofield0 in #3422
  • Fix issues with island hydration when nested in a closure, and with context (closes #3419) by @gbj in #3424
  • docs: remove islands mention from leptos_axum by @chrisp60 in #3423
  • fix: correct ownership in redirect route hook (closes #3425) by @gbj in #3428
  • fix failure on try_new() methods which should not fail by @kstep in #3436
  • Add Default to stores by @mscofield0 in #3432
  • add Dispose for Store by @mscofield0 in #3429
  • Tachy class: impl IntoClass for Cow<'_, str> by @sgued in #3420
  • fix: erase_components with AttributeInterceptor by @gbj in #3435

New Contributors

Full Changelog: v0.7.2...v0.7.3

v0.7.2

21 Dec 19:25
@gbj gbj
Compare
Choose a tag to compare

If you're migrating from 0.6 to 0.7, please see the 0.7.0 release notes here.

This is a small patch release including a couple of bugfixes, importantly to the hydration of static text nodes on nightly.

What's Changed

  • Update elements.rs to include popovertarget and popovertargetaction for the <button> element by @Figments in #3379
  • fix(ci): missing glib in ci by @sabify in #3376
  • docs: showcase let syntax in for_loop by @purung in #3383
  • Add From<ArcStore<T>> for Store<T, S> by @mscofield0 in #3389
  • fix: correct span for let: syntax (closes #3387) by @gbj in #3391
  • fix(ci): add missing glib for semver checks by @sabify in #3393
  • fix: correct hydration position for static text nodes in nightly (closes #3395) by @gbj in #3396

New Contributors

Full Changelog: v0.7.1...v0.7.2