This is a major breaking release, adding REST bot support, dependency injection, removing global state from the library, and generally cleaning up old mistakes and weirdness that accumulated over the past 2 years.
Alongside this release comes overhauled [documentation](https://miru.hypergonial.com/), with improved navigation, layout & search and extended examples. If you are looking for the v3 docs, you can find them [here](https://hikari-miru.readthedocs.io/en/v3/index.html).
> [!TIP]
> If you already have an application that depends on v3 of miru, see the [migration guide](https://miru.hypergonial.com/guides/migrating_from_v3/).
- **BREAKING:** Raised the minimum supported Python version to **3.10** or greater.
- **BREAKING:** Change all `miru` decorators to take `Context` as their first argument and the item (button/select etc..) as their second.
- **BREAKING:** Seperate link buttons out of `miru.Button` as `miru.LinkButton`.
- **BREAKING:** Remove `miru.install()`. Use `miru.Client` instead.
- **BREAKING:** Remove `View.start()` and `Modal.start()`. Use `Client.start_view()` and `Client.start_modal()` respectively instead.
- **BREAKING:** Remove `NavigatorView.send()`. Use `NavigatorView.build_response()` instead and send the builder.
- **BREAKING:** Remove `Modal.send()`. Use `Modal.build_response()` instead and send the builder.
- **BREAKING:** Remove `Menu.send()`. Use `Menu.build_response()` instead and send the builder.
- **BREAKING:** Remove `miru.ModalInteractionCreateEvent` and `miru.ComponentInteractionCreateEvent`. Use the unhandled interaction hooks instead.
- **BREAKING:** Made `ViewItem.callback` only accept positional arguments. This is to allow renaming the context variable's name when overriding it in subclasses. This should not affect most people.
- **BREAKING:** Move `miru.Context` to `miru.abc.Context`.
- **BREAKING:** Move `miru.SelectBase` to `miru.abc.SelectBase`.
- **DEPRECATION:** Passing `buttons=` to `ext.nav.NavigatorView()` constructor. Use the newly added `items=` instead. The `buttons=` argument will be removed in v4.2.0.
- Add `miru.Client`. The client manages the state of all currently running views & modals & routes interactions to them.
- Add **RESTBot** support. Simply pass a RESTBot to `miru.Client` when initializing it.
- Add first-class support for **dependency injection**. This allows to better manage state across the library, along with adding better compatibility to `arc` and `Tanjun` via `Client.from_arc()` and `Client.from_tanjun()` classmethods respectively.
- Add the ability to configure `autodefer` at the item level for views. If an item does not specify `autodefer`, the view's setting will be used.
- Add the ability to configure if the autodefer should be ephemeral, along with it's response type through `AutodeferOptions`.
- Stabilize `Context.issued_response`. This property returns a boolean that is `True` if the underlying interaction has already received an initial response.
- Add response builders for entire responses from views or modals.
- Add `Context.respond_with_builder()`.
- Add `Client.set_unhandled_component_interaction_hook` and `Client.set_unhandled_modal_interaction_hook`. These are called when an interaction is received that is not handled by any running modal or view.
- Add `miru.abc.InteractiveViewItem` for all view items that have callbacks. This includes all current `miru.abc.ViewItem` except `miru.LinkButton`.