Repository: shopware/frontends
Pull request #1049 (2024-06-24 15:37:20)

chore(deps-dev): bump typedoc from 0.25.13 to 0.26.2 in the api-extractor group
Bumps the api-extractor group with 1 update: [typedoc](https://github.com/TypeStrong/TypeDoc).

Updates `typedoc` from 0.25.13 to 0.26.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/TypeStrong/TypeDoc/releases">typedoc's releases</a>.</em></p>
<blockquote>
<h2>v0.26.2</h2>
<h3>Features</h3>
<ul>
<li>Added a <code>--suppressCommentWarningsInDeclarationFiles</code> option to disable warnings from
parsing comments in declaration files, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2611">#2611</a>.</li>
<li>Improved comment discovery to more closely match TypeScript's discovery when getting comments
for members of interfaces/classes, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2084">#2084</a>, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2545">#2545</a>.</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>The <code>text</code> non-highlighted language no longer causes warnings when rendering, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2610">#2610</a>.</li>
<li>If a comment on a method is inherited from a parent class, and the child class does not
use an <code>@param</code> tag from the parent, TypeDoc will no longer warn about the <code>@param</code> tag.</li>
</ul>
<h2>v0.26.1</h2>
<h3>Features</h3>
<ul>
<li>Improved Korean translation coverage, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2602">#2602</a>.</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Added <code>@author</code> to the default list of recognized tags, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2603">#2603</a>.</li>
<li>Anchor links are no longer incorrectly checked for relative paths, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2604">#2604</a>.</li>
<li>Fixed an issue where line numbers reported in error messages could be incorrect, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2605">#2605</a>.</li>
<li>Fixed relative link detection for markdown links containing code in their label, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2606">#2606</a>.</li>
<li>Fixed an issue with packages mode where TypeDoc would use (much) more memory than required, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2607">#2607</a>.</li>
<li>TypeDoc will no longer crash when asked to render highlighted code for an unsupported language, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2609">#2609</a>.</li>
<li>Fixed an issue where relatively-linked files would not be copied to the output directory in packages mode.</li>
<li>Fixed an issue where modifier tags were not applied to top level modules in packages mode.</li>
<li>Fixed an issue where excluded tags were not removed from top level modules in packages mode.</li>
<li><code>.jsonc</code> configuration files are now properly read as JSONC, rather than being passed to <code>require</code>.</li>
</ul>
<h3>Thanks!</h3>
<ul>
<li><a href="https://github.com/KNU-K"><code>@​KNU-K</code></a></li>
</ul>
<h2>v0.26.0</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Drop support for Node 16.</li>
<li>Moved from <code>marked</code> to <code>markdown-it</code> for parsing as marked has moved to an async model which supporting would significantly complicate TypeDoc's rendering code.
This means that any projects setting <code>markedOptions</code> needs to be updated to use <code>markdownItOptions</code>.
Unlike <code>marked@4</code>, <code>markdown-it</code> pushes lots of functionality to plugins. To use plugins, a JavaScript config file must be used with the <code>markdownItLoader</code> option.</li>
<li>Updated Shiki from 0.14 to 1.x. This should mostly be a transparent update which adds another 23 supported languages and 13 supported themes.
As Shiki adds additional languages, the time it takes to load the highlighter increases linearly. To avoid rendering taking longer than necessary,
TypeDoc now only loads a few common languages. Additional languages can be loaded by setting the <code>--highlightLanguages</code> option.</li>
<li>Changed default of <code>--excludePrivate</code> to <code>true</code>.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md">typedoc's changelog</a>.</em></p>
<blockquote>
<h2>v0.26.2 (2024-06-24)</h2>
<h3>Features</h3>
<ul>
<li>Added a <code>--suppressCommentWarningsInDeclarationFiles</code> option to disable warnings from
parsing comments in declaration files, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2611">#2611</a>.</li>
<li>Improved comment discovery to more closely match TypeScript's discovery when getting comments
for members of interfaces/classes, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2084">#2084</a>, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2545">#2545</a>.</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>The <code>text</code> non-highlighted language no longer causes warnings when rendering, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2610">#2610</a>.</li>
<li>If a comment on a method is inherited from a parent class, and the child class does not
use an <code>@param</code> tag from the parent, TypeDoc will no longer warn about the <code>@param</code> tag.</li>
</ul>
<h2>v0.26.1 (2024-06-22)</h2>
<h3>Features</h3>
<ul>
<li>Improved Korean translation coverage, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2602">#2602</a>.</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Added <code>@author</code> to the default list of recognized tags, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2603">#2603</a>.</li>
<li>Anchor links are no longer incorrectly checked for relative paths, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2604">#2604</a>.</li>
<li>Fixed an issue where line numbers reported in error messages could be incorrect, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2605">#2605</a>.</li>
<li>Fixed relative link detection for markdown links containing code in their label, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2606">#2606</a>.</li>
<li>Fixed an issue with packages mode where TypeDoc would use (much) more memory than required, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2607">#2607</a>.</li>
<li>TypeDoc will no longer crash when asked to render highlighted code for an unsupported language, <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2609">#2609</a>.</li>
<li>Fixed an issue where relatively-linked files would not be copied to the output directory in packages mode.</li>
<li>Fixed an issue where modifier tags were not applied to top level modules in packages mode.</li>
<li>Fixed an issue where excluded tags were not removed from top level modules in packages mode.</li>
<li><code>.jsonc</code> configuration files are now properly read as JSONC, rather than being passed to <code>require</code>.</li>
</ul>
<h3>Thanks!</h3>
<ul>
<li><a href="https://github.com/KNU-K"><code>@​KNU-K</code></a></li>
</ul>
<h1>v0.26.0 (2024-06-22)</h1>
<h3>Breaking Changes</h3>
<ul>
<li>Drop support for Node 16.</li>
<li>Moved from <code>marked</code> to <code>markdown-it</code> for parsing as marked has moved to an async model which supporting would significantly complicate TypeDoc's rendering code.
This means that any projects setting <code>markedOptions</code> needs to be updated to use <code>markdownItOptions</code>.
Unlike <code>marked@4</code>, <code>markdown-it</code> pushes lots of functionality to plugins. To use plugins, a JavaScript config file must be used with the <code>markdownItLoader</code> option.</li>
<li>Updated Shiki from 0.14 to 1.x. This should mostly be a transparent update which adds another 23 supported languages and 13 supported themes.
As Shiki adds additional languages, the time it takes to load the highlighter increases linearly. To avoid rendering taking longer than necessary,
TypeDoc now only loads a few common languages. Additional languages can be loaded by setting the <code>--highlightLanguages</code> option.</li>
<li>Changed default of <code>--excludePrivate</code> to <code>true</code>.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/TypeStrong/typedoc/commit/e5ba1e8fae25a43fdb8e6ace061243f7a93dadf6"><code>e5ba1e8</code></a> Update changelog for release</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/f20ec832d3f6970006c21c6572b485bc9bf3d2a1"><code>f20ec83</code></a> Bump version to 0.26.2</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/5890d73f8846395588e0ddba1b18fc493143f034"><code>5890d73</code></a> Fix actions</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/16b2694c270ae0bc3c3a092e0c9a1b2d383c1d3b"><code>16b2694</code></a> Update comment discovery to more closely match TS</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/42a1759f09aca4eb6e568e9a0f8c678631380258"><code>42a1759</code></a> Add a test for <a href="https://redirect.github.com/TypeStrong/TypeDoc/issues/2545">#2545</a></li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/657eb4bdae1ac6d9e897bcdb4567d9876f3f6338"><code>657eb4b</code></a> Add suppressCommentWarningsInDeclarationFiles option</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/8ebd7dbb5b12a5c3978d954511b3563c3dcbd339"><code>8ebd7db</code></a> Correctly handle <code>text</code> when highlighting</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/35958735717f0437ad9d0d7fc2274714d3fd1639"><code>3595873</code></a> Update changelog for release</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/81fb64d3544d0b128cc3cf90ed0d5c1ccee9597f"><code>81fb64d</code></a> Bump version to 0.26.1</li>
<li><a href="https://github.com/TypeStrong/typedoc/commit/6ef1053513c1feb50ad1934cdcaccbf5967c74d7"><code>6ef1053</code></a> Fix even more packages bugs</li>
<li>Additional commits viewable in <a href="https://github.com/TypeStrong/TypeDoc/compare/v0.25.13...v0.26.2">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typedoc&package-manager=npm_and_yarn&previous-version=0.25.13&new-version=0.26.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions


</details>

vercel[bot]: [vc]: #p6hr4e7RJlkYTdJwoxWp2TL1/zXpXMrXsSElwooWWGU=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJzaG9wd2FyZS1mcm9udGVuZHMtZG9jcyIsInJvb3REaXJlY3RvcnkiOiJhcHBzL2RvY3MvIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL3Nob3B3YXJlLWZyb250ZW5kcy9zaG9wd2FyZS1mcm9udGVuZHMtZG9jcy9CampwUzNUbnl1dzFQTnZnNXl6Z01UclhwNXVuIiwicHJldmlld1VybCI6InNob3B3YXJlLWZyb250ZW5kcy1kb2NzLWdpdC1kZXBlbmRhYm8tMmU0MzEwLXNob3B3YXJlLWZyb250ZW5kcy52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IlBFTkRJTkcifSx7Im5hbWUiOiJmcm9udGVuZHMtZGVtbyIsInJvb3REaXJlY3RvcnkiOiJ0ZW1wbGF0ZXMvdnVlLWRlbW8tc3RvcmUiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vc2hvcHdhcmUtZnJvbnRlbmRzL2Zyb250ZW5kcy1kZW1vL0RZNTNNTHJBRlZUNlZSSjZ3Q3RZVTJiYjgxQkYiLCJwcmV2aWV3VXJsIjoiZnJvbnRlbmRzLWRlbW8tZ2l0LWRlcGVuZGFib3QtbnBtYW5keS04OTIzYzEtc2hvcHdhcmUtZnJvbnRlbmRzLnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiUEVORElORyJ9XX0=
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Updated (UTC) |
| :--- | :----- | :------ | :------ |
| **frontends-demo** | 🔄 Building ([Inspect](https://vercel.com/shopware-frontends/frontends-demo/DY53MLrAFVT6VRJ6wCtYU2bb81BF)) | [Visit Preview](https://frontends-demo-git-dependabot-npmandy-8923c1-shopware-frontends.vercel.app) | Jun 24, 2024 3:37pm |
| **shopware-frontends-docs** | 🔄 Building ([Inspect](https://vercel.com/shopware-frontends/shopware-frontends-docs/BjjpS3Tnyuw1PNvg5yzgMTrXp5un)) | [Visit Preview](https://shopware-frontends-docs-git-dependabo-2e4310-shopware-frontends.vercel.app) | Jun 24, 2024 3:37pm |



codspeed-hq[bot]: ## [CodSpeed Performance Report](https://codspeed.io/shopware/frontends/branches/dependabot/npm_and_yarn/api-extractor-476a3c0830)

### Merging #1049 will **not alter performance**

<sub>Comparing <code>dependabot/npm_and_yarn/api-extractor-476a3c0830</code> (88369ee) with <code>main</code> (fc262dd)</sub>



### Summary

`✅ 9` untouched benchmarks






Patch:
diff --git a/.changeset/fast-planes-warn.md b/.changeset/fast-planes-warn.md
new file mode 100644
index 00000000..6b30796e
--- /dev/null
+++ b/.changeset/fast-planes-warn.md
@@ -0,0 +1,5 @@
+---
+"vue-demo-store": minor
+---
+
+Added closing account menu after clicking outside
diff --git a/.changeset/giant-comics-drop.md b/.changeset/giant-comics-drop.md
new file mode 100644
index 00000000..1f1bfe7a
--- /dev/null
+++ b/.changeset/giant-comics-drop.md
@@ -0,0 +1,10 @@
+---
+"@shopware-pwa/composables-next": major
+---
+
+Removed deprecations from the composables:
+
+- `createShopwareContext` is no longer accpting `apiInstance` option. Use `apiClient` instead.
+- `useCart` - `getProductItemsSeoUrlsData` is removed. Use product related methods to fetch an item's URL instead.
+- `useCartItem` - `getProductItemSeoUrlData` is removed
+- `apiInstance` is not exposing `apiInstance` anymore. Use `apiClient` instead.
diff --git a/.changeset/rich-turkeys-approve.md b/.changeset/rich-turkeys-approve.md
new file mode 100644
index 00000000..2e69fcf8
--- /dev/null
+++ b/.changeset/rich-turkeys-approve.md
@@ -0,0 +1,5 @@
+---
+"vue-demo-store": patch
+---
+
+Disable checkout button for empty cart
diff --git a/.changeset/shiny-bugs-judge.md b/.changeset/shiny-bugs-judge.md
new file mode 100644
index 00000000..7491d5bd
--- /dev/null
+++ b/.changeset/shiny-bugs-judge.md
@@ -0,0 +1,9 @@
+---
+"@shopware/api-client": major
+---
+
+Removed deprecations from the code:
+
+- `onContextChanged` function inside `createAPIClient` method. Use `apiClient.hook("onContextChanged", ...)` instead.
+- `apiType` flag from the `createAPIClient`. Use separate methods to create store and admin api clients
+- `onAuthChange` from the `createAdminAPIClient`. Use `adminApiClient.hook('onAuthChange',...)` instead
diff --git a/.changeset/sixty-llamas-greet.md b/.changeset/sixty-llamas-greet.md
new file mode 100644
index 00000000..68a4b591
--- /dev/null
+++ b/.changeset/sixty-llamas-greet.md
@@ -0,0 +1,9 @@
+---
+"@shopware-pwa/helpers-next": major
+---
+
+Removed deprecations from the package:
+
+- `getProductThumbnailUrl` is removed. Use `getSmallestThumbnailUrl` instead.
+- internal method `_debounce` is removed.
+- internal method `_parseUrlQuery` is removed.
diff --git a/.github/workflows/lighthouse.yml b/.github/workflows/lighthouse.yml
index 4dae9fe2..0158ad80 100644
--- a/.github/workflows/lighthouse.yml
+++ b/.github/workflows/lighthouse.yml
@@ -13,7 +13,7 @@ jobs:
         with:
           node-version: 20
       - name: Audit URLs using Lighthouse
-        uses: treosh/lighthouse-ci-action@v11
+        uses: treosh/lighthouse-ci-action@v12
         with:
           serverBaseUrl: ${{ secrets.LHCI_SERVER_URL }}
           serverToken: ${{ secrets.LHCI_SERVER_TOKEN }}
diff --git a/apps/docs/.vitepress/config.ts b/apps/docs/.vitepress/config.ts
index 6b338cb0..6b9cef49 100644
--- a/apps/docs/.vitepress/config.ts
+++ b/apps/docs/.vitepress/config.ts
@@ -141,6 +141,10 @@ export const sidebar = [
             text: "Custom Products extension",
             link: "/getting-started/features/custom-products",
           },
+          {
+            text: "Broadcasting",
+            link: "/getting-started/features/broadcasting",
+          },
           {
             text: "Maintenance mode",
             link: "/getting-started/features/maintenance-mode",
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 0ce9d73d..63fb9f87 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -21,7 +21,7 @@
   },
   "devDependencies": {
     "@types/markdown-it": "14.1.1",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "find-in-files": "0.5.0",
     "ts-dox": "0.1.0",
diff --git a/apps/docs/src/getting-started/e-commerce/product-listing.md b/apps/docs/src/getting-started/e-commerce/product-listing.md
index d393fdf5..87eeb825 100644
--- a/apps/docs/src/getting-started/e-commerce/product-listing.md
+++ b/apps/docs/src/getting-started/e-commerce/product-listing.md
@@ -438,7 +438,7 @@ In the present case, we could use the product's thumbnail or use the translated
 ```ts
 // part of <script setup> section
 import {
-  getProductThumbnailUrl,
+  getSmallestThumbnailUrl,
   getProductUrl,
   getTranslatedProperty,
 } from "@shopware-pwa/helpers-next";
@@ -446,7 +446,7 @@ import {
 
 ```html
 <img
-  :src="getProductThumbnailUrl(product)"
+  :src="getSmallestThumbnailUrl(product)"
   width="100"
   height="100"
   :alt="product.name"
diff --git a/apps/docs/src/getting-started/features/broadcasting.md b/apps/docs/src/getting-started/features/broadcasting.md
new file mode 100644
index 00000000..ac387277
--- /dev/null
+++ b/apps/docs/src/getting-started/features/broadcasting.md
@@ -0,0 +1,94 @@
+---
+head:
+  - - meta
+    - name: og:title
+      content: "Integrations: Broadcasting - Shopware Frontends"
+  - - meta
+    - name: og:description
+      content: "Example of usage broadcasting"
+  - - meta
+    - name: og:image
+      content: "https://frontends-og-image.vercel.app/Integration:%20**Broadcasting**?fontSize=100px"
+---
+
+# Broadcasting
+
+The Broadcast Channel API allows simple communication between browsing contexts (e.g., different tabs, iframes, or workers) on the same origin.
+
+For Vue app we are recommending to use `useBroadcastChannel` from `VueUse` [package](https://vueuse.org/core/useBroadcastChannel/)
+
+## Synchronizing changes between tabs
+
+In our demo store template we provide example of usage broadcasting for synchronizing changes between tabs.
+We rely on the data fetched by the API client and send them to broadcast channel for synchronization.
+This way:
+
+- session data
+- cart data
+  are synchronized between tabs.
+
+<!-- automd:file src="../../../../../templates/vue-demo-store/composables/useBroadcastChannelSync.ts" code -->
+
+```ts [useBroadcastChannelSync.ts]
+import type { Schemas } from "#shopware";
+
+export function useSyncChannel<Entity>(
+  name: string,
+): [Ref<Entity | undefined>, (data: Entity) => void] {
+  const { data, post } = useBroadcastChannel<Entity, Entity>({
+    name,
+  });
+
+  return [data, post];
+}
+
+function isEntity<T extends { apiAlias: string }>(
+  data: T,
+  apiAlias: T["apiAlias"],
+): data is T {
+  return data?.apiAlias === apiAlias;
+}
+
+/**
+ * Sync basic state like session/cart data between tabs
+ */
+export const useBroadcastChannelSync = createSharedComposable(() => {
+  const { apiClient } = useShopwareContext();
+
+  // Synchronize CART data
+  const { refreshCart } = useCart();
+  const [cartData, notifyCartDataChanged] =
+    useSyncChannel<Schemas["Cart"]>("shopware-cart");
+  watch([cartData], () => {
+    refreshCart(cartData.value);
+  });
+
+  // Synchronize SESSION data
+  const { setContext } = useSessionContext();
+  const [sessionData, notifySessionDataChanged] = useSyncChannel<
+    Schemas["SalesChannelContext"]
+  >("shopware-session-data");
+  watch([sessionData], () => {
+    setContext(sessionData.value!);
+  });
+
+  // Listen for API responses and update the shared state
+  apiClient.hook("onSuccessResponse", (response) => {
+    // for cart
+    if (isEntity<Schemas["Cart"]>(<Schemas["Cart"]>response._data, "cart")) {
+      notifyCartDataChanged(<Schemas["Cart"]>response._data);
+    }
+    // for session data
+    else if (
+      isEntity<Schemas["SalesChannelContext"]>(
+        <Schemas["SalesChannelContext"]>response._data,
+        "sales_channel_context",
+      )
+    ) {
+      notifySessionDataChanged(<Schemas["SalesChannelContext"]>response._data);
+    }
+  });
+});
+```
+
+<!-- /automd -->
diff --git a/apps/docs/src/getting-started/features/index.md b/apps/docs/src/getting-started/features/index.md
index 73ddd0d3..cc365da7 100644
--- a/apps/docs/src/getting-started/features/index.md
+++ b/apps/docs/src/getting-started/features/index.md
@@ -9,6 +9,7 @@ nav:
 Collection of specific Composable Frontends Features and documentation how to use them.
 <PageRef page="sitemap" title="Sitemap" sub="A Sitemap is generated by combining two sitemaps, Frontend and Shopware admin." />
 <PageRef page="wishlist" title="Wishlist" sub="How to use the built-in wishlist API to create wishlist functionalities in your application." />
+<PageRef page="broadcasting" title="Broadcasting" sub="How to communicate between browser tabs" />
 <PageRef page="maintenance-mode" title="Maintenance mode" sub="How to use maintenance mode with the Composable Frontends app" />
 
 ## Shopware Extensions
diff --git a/apps/docs/src/getting-started/features/maintenance-mode.md b/apps/docs/src/getting-started/features/maintenance-mode.md
index a1ba64ca..f916f520 100644
--- a/apps/docs/src/getting-started/features/maintenance-mode.md
+++ b/apps/docs/src/getting-started/features/maintenance-mode.md
@@ -17,25 +17,20 @@ You can activate the maintenance mode of your store by selecting your sales chan
 
 ## Detecting maintenance mode via API
 
-Maintenance mode is returned as an error from all of the endpoints. We can detect it by using `onErrorHandler` callback function in `createAPIClient` init api method.
+Maintenance mode is returned as an error from all of the endpoints. We can detect it by using `onResponseError` hook.
 
 ```ts
+import { isMaintenanceMode } from "@shopware-pwa/helpers-next";
+
 const apiClient = createAPIClient({
   baseURL: shopwareEndpoint,
   accessToken: shopwareAccessToken,
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
-  onErrorHandler(response) {
-    const error = response._data?.errors?.find((element) => {
-      return element.code === "FRAMEWORK__API_SALES_CHANNEL_MAINTENANCE_MODE";
-    });
-  },
+});
+
+apiClient.hook("onResponseError", (response) => {
+  const error = isMaintenanceMode(response._data?.errors ?? []);
+  // do proper reaction to maintenance mode
 });
 ```
 
@@ -50,18 +45,17 @@ This example is for Nuxt 3 apps
 Every error thrown within the application is automatically caught and the `error.vue` page is displayed.
 
 ```ts
-    onErrorHandler(response) {
-      const error = response._data?.errors?.find((element) => {
-        return element.code === "FRAMEWORK__API_SALES_CHANNEL_MAINTENANCE_MODE";
-      });
-
-      if (error) {
-        throw createError({
-          statusCode: 503,
-          statusMessage: "MAINTENANCE_MODE",
-        });
-      }
-    },
+import { isMaintenanceMode } from "@shopware-pwa/helpers-next";
+
+apiClient.hook("onResponseError", (response) => {
+  const error = isMaintenanceMode(response._data?.errors ?? []);
+  if (error) {
+    throw createError({
+      statusCode: 503,
+      statusMessage: "MAINTENANCE_MODE",
+    });
+  }
+});
 ```
 
 ### Displaying maintenance mode page
diff --git a/examples/adyen-dropin-component/api-types/storeApiTypes.d.ts b/examples/adyen-dropin-component/api-types/storeApiTypes.d.ts
index e87b8430..73f7f57f 100644
--- a/examples/adyen-dropin-component/api-types/storeApiTypes.d.ts
+++ b/examples/adyen-dropin-component/api-types/storeApiTypes.d.ts
@@ -657,6 +657,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -7651,9 +7653,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/amazon-pay-button-example/package.json b/examples/amazon-pay-button-example/package.json
index bd0831ec..b896a2ac 100644
--- a/examples/amazon-pay-button-example/package.json
+++ b/examples/amazon-pay-button-example/package.json
@@ -36,7 +36,7 @@
     "@nuxt/schema": "3.11.2",
     "@shopware-pwa/composables-next": "canary",
     "@shopware/api-client": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
     "vue-tsc": "2.0.21"
diff --git a/examples/b2b-quote-management/api-types/storeApiTypes.d.ts b/examples/b2b-quote-management/api-types/storeApiTypes.d.ts
index 8a3bcd11..432235bf 100644
--- a/examples/b2b-quote-management/api-types/storeApiTypes.d.ts
+++ b/examples/b2b-quote-management/api-types/storeApiTypes.d.ts
@@ -610,6 +610,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4781,7 +4783,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4808,8 +4812,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7542,9 +7545,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/b2b-quote-management/package.json b/examples/b2b-quote-management/package.json
index 0708d3de..8ea69ce5 100644
--- a/examples/b2b-quote-management/package.json
+++ b/examples/b2b-quote-management/package.json
@@ -20,7 +20,7 @@
     "vue-router": "4.3.3"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@shopware/api-gen": "canary",
     "@vitejs/plugin-vue": "5.0.5",
     "@vueuse/core": "10.11.0",
diff --git a/examples/blank-playground/package.json b/examples/blank-playground/package.json
index abd5c00c..45bc1deb 100644
--- a/examples/blank-playground/package.json
+++ b/examples/blank-playground/package.json
@@ -16,7 +16,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
     "vue-tsc": "2.0.21"
diff --git a/examples/blank-playground/src/apiClient.ts b/examples/blank-playground/src/apiClient.ts
index 89c003b2..db6fcdf7 100644
--- a/examples/blank-playground/src/apiClient.ts
+++ b/examples/blank-playground/src/apiClient.ts
@@ -2,15 +2,18 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/commercial-customized-products/api-types/storeApiTypes.d.ts b/examples/commercial-customized-products/api-types/storeApiTypes.d.ts
index 10acfc6b..924cf1f2 100644
--- a/examples/commercial-customized-products/api-types/storeApiTypes.d.ts
+++ b/examples/commercial-customized-products/api-types/storeApiTypes.d.ts
@@ -636,6 +636,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4807,7 +4809,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4834,8 +4838,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7571,9 +7574,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/commercial-customized-products/package.json b/examples/commercial-customized-products/package.json
index 3dfbe039..1c0ee8d1 100644
--- a/examples/commercial-customized-products/package.json
+++ b/examples/commercial-customized-products/package.json
@@ -18,7 +18,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@shopware/api-gen": "canary",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
diff --git a/examples/commercial-customized-products/src/apiClient.ts b/examples/commercial-customized-products/src/apiClient.ts
index 006de476..1b8cde43 100644
--- a/examples/commercial-customized-products/src/apiClient.ts
+++ b/examples/commercial-customized-products/src/apiClient.ts
@@ -2,16 +2,19 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 import Cookies from "js-cookie";
 
-export const getClient = () =>
-  createAPIClient<operations>({
-    baseURL: "https://demo-frontends.shopware.store/store-api",
-    accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
-    contextToken: Cookies.get("sw-context-token"),
-    onContextChanged(newContextToken) {
-      Cookies.set("sw-context-token", newContextToken, {
-        expires: 365, // days
-        path: "/",
-        sameSite: "lax",
-      });
-    },
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
+export const apiClient = createAPIClient<operations>({
+  baseURL: shopwareEndpoint,
+  accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
+  contextToken: Cookies.get("sw-context-token"),
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
   });
+});
diff --git a/examples/commercial-customized-products/src/main.ts b/examples/commercial-customized-products/src/main.ts
index efa6ce7a..e66d9c52 100644
--- a/examples/commercial-customized-products/src/main.ts
+++ b/examples/commercial-customized-products/src/main.ts
@@ -1,11 +1,11 @@
 import { createApp } from "vue";
 import { createShopwareContext } from "@shopware-pwa/composables-next";
-import { getClient as getDemoClient } from "./apiClient";
+import { apiClient } from "./apiClient";
 
 import App from "./App.vue";
 
 const app = createApp(App);
 const shopwareContext = createShopwareContext(app, {});
-app.provide("apiClient", getDemoClient());
+app.provide("apiClient", apiClient);
 app.use(shopwareContext);
 app.mount("#app");
diff --git a/examples/commercial-quick-order/api-types/storeApiTypes.d.ts b/examples/commercial-quick-order/api-types/storeApiTypes.d.ts
index 1ea5b271..d86c1476 100644
--- a/examples/commercial-quick-order/api-types/storeApiTypes.d.ts
+++ b/examples/commercial-quick-order/api-types/storeApiTypes.d.ts
@@ -634,6 +634,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4805,7 +4807,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4832,8 +4836,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7566,9 +7569,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/commercial-quick-order/package.json b/examples/commercial-quick-order/package.json
index 6266c14e..afa48a25 100644
--- a/examples/commercial-quick-order/package.json
+++ b/examples/commercial-quick-order/package.json
@@ -17,7 +17,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@shopware/api-gen": "canary",
     "@vitejs/plugin-vue": "5.0.5",
     "@vueuse/core": "10.11.0",
diff --git a/examples/commercial-quick-order/src/apiClient.ts b/examples/commercial-quick-order/src/apiClient.ts
index 76666f95..88d6f71e 100644
--- a/examples/commercial-quick-order/src/apiClient.ts
+++ b/examples/commercial-quick-order/src/apiClient.ts
@@ -2,16 +2,19 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "#shopware";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
-  apiType: "store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/example-builder/package.json b/examples/example-builder/package.json
index 411d7f04..8742843b 100644
--- a/examples/example-builder/package.json
+++ b/examples/example-builder/package.json
@@ -15,7 +15,7 @@
     "vue-router": "4.3.3"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "typescript": "5.5.2",
     "vite": "5.2.13",
diff --git a/examples/express-checkout/api-types/storeApiTypes.d.ts b/examples/express-checkout/api-types/storeApiTypes.d.ts
index c31191f0..97f7a79e 100644
--- a/examples/express-checkout/api-types/storeApiTypes.d.ts
+++ b/examples/express-checkout/api-types/storeApiTypes.d.ts
@@ -610,6 +610,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4781,7 +4783,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4808,8 +4812,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7542,9 +7545,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/express-checkout/package.json b/examples/express-checkout/package.json
index aac6a1b8..32a52fd0 100644
--- a/examples/express-checkout/package.json
+++ b/examples/express-checkout/package.json
@@ -21,7 +21,7 @@
   },
   "devDependencies": {
     "@shopware/api-gen": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
     "vue-tsc": "2.0.21"
diff --git a/examples/express-checkout/src/apiClient.ts b/examples/express-checkout/src/apiClient.ts
index e8295dc0..88d6f71e 100644
--- a/examples/express-checkout/src/apiClient.ts
+++ b/examples/express-checkout/src/apiClient.ts
@@ -2,15 +2,19 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "#shopware";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/login-form/package.json b/examples/login-form/package.json
index c32c8aa1..1dcad198 100644
--- a/examples/login-form/package.json
+++ b/examples/login-form/package.json
@@ -16,7 +16,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
     "vue-tsc": "2.0.21"
diff --git a/examples/login-form/src/apiClient.ts b/examples/login-form/src/apiClient.ts
index 89c003b2..db6fcdf7 100644
--- a/examples/login-form/src/apiClient.ts
+++ b/examples/login-form/src/apiClient.ts
@@ -2,15 +2,18 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/mollie-credit-card/api-types/storeApiTypes.d.ts b/examples/mollie-credit-card/api-types/storeApiTypes.d.ts
index a56e9b67..e81c42ce 100644
--- a/examples/mollie-credit-card/api-types/storeApiTypes.d.ts
+++ b/examples/mollie-credit-card/api-types/storeApiTypes.d.ts
@@ -610,6 +610,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4781,7 +4783,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4808,8 +4812,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7542,9 +7545,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/examples/mollie-credit-card/package.json b/examples/mollie-credit-card/package.json
index 57b6e245..c43c80f1 100644
--- a/examples/mollie-credit-card/package.json
+++ b/examples/mollie-credit-card/package.json
@@ -16,7 +16,7 @@
     "@shopware-pwa/nuxt3-module": "canary",
     "@shopware/api-client": "canary",
     "@shopware/api-gen": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vueuse/nuxt": "10.11.0",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
diff --git a/examples/new-api-client/package.json b/examples/new-api-client/package.json
index 67fc5a52..3c9c80f8 100644
--- a/examples/new-api-client/package.json
+++ b/examples/new-api-client/package.json
@@ -15,7 +15,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "typescript": "5.5.2",
     "vite": "5.2.13",
diff --git a/examples/new-api-client/src/adminApiClient.ts b/examples/new-api-client/src/adminApiClient.ts
index 55d17b49..b0574c1c 100644
--- a/examples/new-api-client/src/adminApiClient.ts
+++ b/examples/new-api-client/src/adminApiClient.ts
@@ -8,13 +8,14 @@ import Cookies from "js-cookie";
 export const adminApiClient = createAdminAPIClient<operations>({
   baseURL: "https://demo-frontends.shopware.store/api",
   sessionData: JSON.parse(Cookies.get("sw-admin-session-data") || "{}"),
-  onAuthChange(sessionData) {
-    Cookies.set("sw-admin-session-data", JSON.stringify(sessionData), {
-      expires: 1, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+adminApiClient.hook("onAuthChange", (sessionData) => {
+  Cookies.set("sw-admin-session-data", JSON.stringify(sessionData), {
+    expires: 1, // days
+    path: "/",
+    sameSite: "lax",
+  });
 });
 
 export type ApiSchemas = components["schemas"];
diff --git a/examples/new-api-client/src/apiClient.ts b/examples/new-api-client/src/apiClient.ts
index d773032b..4ca8422b 100644
--- a/examples/new-api-client/src/apiClient.ts
+++ b/examples/new-api-client/src/apiClient.ts
@@ -2,18 +2,21 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "#shopware";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    console.error("changed token", newContextToken);
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
 
 // predefine navigation loading method with depth settings
diff --git a/examples/product-detail-page/package.json b/examples/product-detail-page/package.json
index fef27910..defda6ec 100644
--- a/examples/product-detail-page/package.json
+++ b/examples/product-detail-page/package.json
@@ -17,7 +17,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
     "vue-tsc": "2.0.21"
diff --git a/examples/product-detail-page/src/apiClient.ts b/examples/product-detail-page/src/apiClient.ts
index 89c003b2..1b8cde43 100644
--- a/examples/product-detail-page/src/apiClient.ts
+++ b/examples/product-detail-page/src/apiClient.ts
@@ -2,15 +2,19 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/responsive-images/package.json b/examples/responsive-images/package.json
index 12a9a74d..46ec1441 100644
--- a/examples/responsive-images/package.json
+++ b/examples/responsive-images/package.json
@@ -16,7 +16,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "vite": "5.2.13",
     "vue-tsc": "2.0.21"
diff --git a/examples/responsive-images/src/apiClient.ts b/examples/responsive-images/src/apiClient.ts
index 89c003b2..1b8cde43 100644
--- a/examples/responsive-images/src/apiClient.ts
+++ b/examples/responsive-images/src/apiClient.ts
@@ -2,15 +2,19 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 import Cookies from "js-cookie";
 
+const shopwareEndpoint = "https://demo-frontends.shopware.store/store-api";
+
 export const apiClient = createAPIClient<operations>({
-  baseURL: "https://demo-frontends.shopware.store/store-api",
+  baseURL: shopwareEndpoint,
   accessToken: "SWSCBHFSNTVMAWNZDNFKSHLAYW",
   contextToken: Cookies.get("sw-context-token"),
-  onContextChanged(newContextToken) {
-    Cookies.set("sw-context-token", newContextToken, {
-      expires: 365, // days
-      path: "/",
-      sameSite: "lax",
-    });
-  },
+});
+
+apiClient.hook("onContextChanged", (newContextToken) => {
+  Cookies.set("sw-context-token", newContextToken, {
+    expires: 365, // days
+    path: "/",
+    sameSite: "lax",
+    secure: shopwareEndpoint.startsWith("https://"),
+  });
 });
diff --git a/examples/snippets-middleware/package.json b/examples/snippets-middleware/package.json
index b225ce5c..88a40e12 100644
--- a/examples/snippets-middleware/package.json
+++ b/examples/snippets-middleware/package.json
@@ -16,7 +16,7 @@
     "@shopware-pwa/nuxt3-module": "canary",
     "@shopware/api-client": "canary",
     "@types/lru-cache": "7.10.10",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vueuse/nuxt": "10.11.0",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
diff --git a/examples/use-add-to-cart/package.json b/examples/use-add-to-cart/package.json
index 8e6b247a..8e1f2a9b 100644
--- a/examples/use-add-to-cart/package.json
+++ b/examples/use-add-to-cart/package.json
@@ -14,7 +14,7 @@
     "@shopware-pwa/composables-next": "canary",
     "@shopware-pwa/helpers-next": "canary",
     "@shopware-pwa/nuxt3-module": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@unocss/nuxt": "0.61.0",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
diff --git a/examples/use-cart/package.json b/examples/use-cart/package.json
index 6ab47396..9d650432 100644
--- a/examples/use-cart/package.json
+++ b/examples/use-cart/package.json
@@ -13,7 +13,7 @@
     "@shopware-pwa/composables-next": "canary",
     "@shopware/api-client": "canary",
     "@shopware-pwa/nuxt3-module": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@unocss/nuxt": "0.61.0",
     "@vueuse/nuxt": "10.11.0",
     "nuxt": "3.11.2",
diff --git a/examples/use-checkout/package.json b/examples/use-checkout/package.json
index 7c8c6f8d..5f4ac867 100644
--- a/examples/use-checkout/package.json
+++ b/examples/use-checkout/package.json
@@ -13,7 +13,7 @@
     "@shopware-pwa/composables-next": "canary",
     "@shopware-pwa/nuxt3-module": "canary",
     "@shopware/api-client": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@unocss/nuxt": "0.61.0",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
diff --git a/package.json b/package.json
index 4c11eae0..8c552bdc 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,7 @@
     "prettier": "3.3.2",
     "taze": "0.13.8",
     "turbo": "2.0.4",
-    "typedoc": "0.25.13",
+    "typedoc": "0.26.2",
     "vercel": "34.2.7"
   },
   "engines": {
diff --git a/packages/api-client-next/api-types/storeApiSchema.overrides.json b/packages/api-client-next/api-types/storeApiSchema.overrides.json
index 03fb562b..7b327240 100644
--- a/packages/api-client-next/api-types/storeApiSchema.overrides.json
+++ b/packages/api-client-next/api-types/storeApiSchema.overrides.json
@@ -64,6 +64,15 @@
             ]
           }
         }
+      },
+      {
+        "required": ["apiAlias"],
+        "properties": {
+          "apiAlias": {
+            "type": "string",
+            "enum": ["cart"]
+          }
+        }
       }
     ],
     "CartError": [
@@ -341,6 +350,134 @@
         "required": ["translated"]
       }
     ],
+    "SalesChannelContext": [
+      {
+        "allOf": "_DELETE_"
+      },
+      {
+        "type": "object",
+        "properties": {
+          "token": {
+            "description": "Context the user session",
+            "type": "string"
+          },
+          "currentCustomerGroup": {
+            "type": "object",
+            "description": "Customer group of the current user",
+            "properties": {
+              "name": { "type": "string" },
+              "displayGross": { "type": "boolean" }
+            }
+          },
+          "fallbackCustomerGroup": {
+            "description": "Fallback group if the default customer group is not applicable",
+            "type": "object",
+            "properties": {
+              "name": { "type": "string" },
+              "displayGross": { "type": "boolean" }
+            }
+          },
+          "currency": { "$ref": "#/components/schemas/Currency" },
+          "salesChannel": {
+            "description": "Information about the current sales channel",
+            "type": "object",
+            "properties": {
+              "typeId": { "type": "string" },
+              "languageId": { "type": "string" },
+              "currencyId": { "type": "string" },
+              "paymentMethodId": { "type": "string" },
+              "shippingMethodId": { "type": "string" },
+              "countryId": { "type": "string" },
+              "navigationCategoryId": { "type": "string" },
+              "navigationCategoryDepth": {
+                "type": "integer",
+                "format": "int32"
+              },
+              "footerCategoryId": { "type": "string" },
+              "serviceCategoryId": { "type": "string" },
+              "name": { "type": "string" },
+              "shortName": { "type": "string" },
+              "accessKey": { "type": "string" },
+              "active": { "type": "boolean" },
+              "maintenance": { "type": "boolean" },
+              "maintenanceIpWhitelist": { "type": "string" },
+              "mailHeaderFooterId": { "type": "string" },
+              "customerGroupId": { "type": "string" },
+              "hreflangActive": { "type": "boolean" },
+              "hreflangDefaultDomainId": { "type": "string" },
+              "analyticsId": { "type": "string" }
+            }
+          },
+          "taxRules": {
+            "type": "array",
+            "description": "Currently active tax rules and/or rates",
+            "items": {
+              "type": "object",
+              "properties": {
+                "taxRate": { "type": "number", "format": "float" },
+                "name": { "type": "string" }
+              }
+            }
+          },
+          "customer": { "$ref": "#/components/schemas/Customer" },
+          "paymentMethod": { "$ref": "#/components/schemas/PaymentMethod" },
+          "shippingLocation": {
+            "type": "object",
+            "properties": {
+              "apiAlias": {
+                "type": "string",
+                "enum": ["cart_delivery_shipping_location"]
+              },
+              "country": { "$ref": "#/components/schemas/Country" },
+              "address": { "$ref": "#/components/schemas/CustomerAddress" }
+            }
+          },
+          "shippingMethod": {
+            "$ref": "#/components/schemas/ShippingMethod"
+          },
+          "context": {
+            "description": "Core context with general configuration values and state",
+            "type": "object",
+            "properties": {
+              "versionId": { "type": "string" },
+              "currencyId": { "type": "string" },
+              "currencyFactor": { "type": "integer" },
+              "currencyPrecision": { "type": "integer", "format": "int32" },
+              "languageIdChain": {
+                "type": "array",
+                "items": { "type": "string" }
+              },
+              "scope": { "type": "string" },
+              "source": { "type": "string" },
+              "taxState": { "type": "string" },
+              "useCache": { "type": "boolean" }
+            }
+          }
+        }
+      },
+      {
+        "properties": {
+          "salesChannel": "_DELETE_"
+        }
+      },
+      {
+        "required": ["salesChannel"],
+        "properties": {
+          "salesChannel": {
+            "$ref": "#/components/schemas/SalesChannel"
+          }
+        }
+      },
+      {
+        "required": ["apiAlias"],
+        "properties": {
+          "apiAlias": {
+            "type": "string",
+            "enum": ["sales_channel_context"]
+          }
+        }
+      }
+    ],
     "Quote": [{ "required": ["price"] }, { "required": ["stateMachineState"] }],
     "StateMachineState": [
       {
@@ -422,6 +559,37 @@
         }
       }
     },
+    "/currency": {
+      "post": [
+        {
+          "responses": {
+            "200": {
+              "content": {
+                "application/json": {
+                  "schema": {
+                    "allOf": "_DELETE_"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "responses": {
+            "200": {
+              "content": {
+                "application/json": {
+                  "schema": {
+                    "type": "array",
+                    "items": { "$ref": "#/components/schemas/Currency" }
+                  }
+                }
+              }
+            }
+          }
+        }
+      ]
+    },
     "/quote/detail/{id}": {
       "post": [
         {
diff --git a/packages/api-client-next/api-types/storeApiTypes.d.ts b/packages/api-client-next/api-types/storeApiTypes.d.ts
index 8a3bcd11..432235bf 100644
--- a/packages/api-client-next/api-types/storeApiTypes.d.ts
+++ b/packages/api-client-next/api-types/storeApiTypes.d.ts
@@ -610,6 +610,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4781,7 +4783,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4808,8 +4812,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7542,9 +7545,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/packages/api-client-next/api-types/storeApiTypes.overrides.ts b/packages/api-client-next/api-types/storeApiTypes.overrides.ts
index f9152b52..0a986e71 100644
--- a/packages/api-client-next/api-types/storeApiTypes.overrides.ts
+++ b/packages/api-client-next/api-types/storeApiTypes.overrides.ts
@@ -43,51 +43,6 @@ export type Schemas = {
     entity?: "product";
     sorting?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
-    /** Core context with general configuration values and state */
-    context?: {
-      currencyFactor?: number;
-      currencyId?: string;
-      /** Format: int32 */
-      currencyPrecision?: number;
-      languageIdChain?: string[];
-      scope?: string;
-      source?: string;
-      taxState?: string;
-      useCache?: boolean;
-      versionId?: string;
-    };
-    currency?: components["schemas"]["Currency"];
-    /** Customer group of the current user */
-    currentCustomerGroup?: {
-      displayGross?: boolean;
-      name?: string;
-    };
-    customer?: components["schemas"]["Customer"];
-    /** Fallback group if the default customer group is not applicable */
-    fallbackCustomerGroup?: {
-      displayGross?: boolean;
-      name?: string;
-    };
-    paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
-    shippingLocation?: {
-      address?: components["schemas"]["CustomerAddress"];
-      /** @enum {string} */
-      apiAlias?: "cart_delivery_shipping_location";
-      country?: components["schemas"]["Country"];
-    };
-    shippingMethod?: components["schemas"]["ShippingMethod"];
-    /** Currently active tax rules and/or rates */
-    taxRules?: {
-      name?: string;
-      /** Format: float */
-      taxRate?: number;
-    }[];
-    /** Context the user session */
-    token?: string;
-  };
   SwagPaypalVaultToken: {
     // TODO: [OpenAPI][SwagPaypalVaultToken] - add SwagPaypalVaultToken definition to schema
     /** Format: date-time */
diff --git a/packages/api-client-next/src/createAPIClient.ts b/packages/api-client-next/src/createAPIClient.ts
index 936e200a..6675240a 100644
--- a/packages/api-client-next/src/createAPIClient.ts
+++ b/packages/api-client-next/src/createAPIClient.ts
@@ -2,7 +2,7 @@ import { type FetchResponse, ofetch, FetchOptions } from "ofetch";
 import type { operations } from "../api-types/storeApiTypes";
 import { ClientHeaders, createHeaders } from "./defaultHeaders";
 import { errorInterceptor } from "./errorInterceptor";
-import { type Hookable, createHooks } from "hookable";
+import { createHooks } from "hookable";
 import defu from "defu";
 import { createPathWithParams } from "./transformPathToQuery";
 
@@ -53,28 +53,19 @@ export type InvokeParameters<CURRENT_OPERATION> =
     >;
   };
 
-export type ApiClientHooks = Hookable<{
+export type ApiClientHooks = {
   onContextChanged: (newContextToken: string) => void;
   onResponseError: (response: FetchResponse<ResponseType>) => void;
-  onSuccessResponse: (response: FetchResponse<ResponseType>) => void;
-}>;
+  onSuccessResponse: <T>(response: FetchResponse<T>) => void;
+};
 
 export function createAPIClient<
   OPERATIONS extends Record<string, any> = operations,
   PATHS extends string | number | symbol = keyof OPERATIONS,
 >(params: {
   baseURL?: string;
-  /**
-   * @deprecated this method is only for store-api, for admin API use `createAdminAPIClient`. Remove this param
-   */
-  apiType?: "store-api" | "admin-api";
   accessToken?: string;
   contextToken?: string;
-  /**
-   *
-   * @deprecated use `apiClient.hook("contextChanged". handler)` instead
-   */
-  onContextChanged?: (newContextToken: string) => void;
   defaultHeaders?: ClientHeaders;
 }) {
   const defaultHeaders = createHeaders({
@@ -85,11 +76,7 @@ export function createAPIClient<
   });
 
   // Create a hookable instance
-  const apiClientHooks = createHooks<{
-    onContextChanged: (newContextToken: string) => void;
-    onResponseError: (response: FetchResponse<ResponseType>) => void;
-    onSuccessResponse: (response: FetchResponse<ResponseType>) => void;
-  }>();
+  const apiClientHooks = createHooks<ApiClientHooks>();
 
   const apiFetch = ofetch.create({
     baseURL: params.baseURL,
@@ -106,12 +93,6 @@ export function createAPIClient<
           "sw-context-token",
         ) as string;
         defaultHeaders["sw-context-token"] = newContextToken;
-        if (params.onContextChanged) {
-          console.warn(
-            "DEPRECATED: onContextChanged is deprecated. Use apiClient.hook('contextChanged', handler) instead",
-          );
-          params.onContextChanged?.(newContextToken);
-        }
         apiClientHooks.callHook("onContextChanged", newContextToken);
       }
     },
@@ -195,6 +176,6 @@ export function createAPIClient<
      * Default headers used in every client request (if not overriden in specific request).
      */
     defaultHeaders,
-    hook: apiClientHooks.hook as ApiClientHooks["hook"],
+    hook: apiClientHooks.hook,
   };
 }
diff --git a/packages/api-client-next/src/createAdminAPIClient.ts b/packages/api-client-next/src/createAdminAPIClient.ts
index b37470cf..884e032c 100644
--- a/packages/api-client-next/src/createAdminAPIClient.ts
+++ b/packages/api-client-next/src/createAdminAPIClient.ts
@@ -3,7 +3,7 @@ import type { FetchOptions, FetchResponse } from "ofetch";
 import type { operations } from "../api-types/adminApiTypes";
 import { ClientHeaders, createHeaders } from "./defaultHeaders";
 import { errorInterceptor } from "./errorInterceptor";
-import { type Hookable, createHooks } from "hookable";
+import { createHooks } from "hookable";
 import defu from "defu";
 import { createPathWithParams } from "./transformPathToQuery";
 import type { InvokeParameters } from "./createAPIClient";
@@ -48,11 +48,11 @@ function createAuthorizationHeader(token: string) {
   return `Bearer ${token}`;
 }
 
-export type ApiClientHooks = Hookable<{
-  onContextChanged: (newContextToken: string) => void;
+export type AdminApiClientHooks = {
+  onAuthChange: (authData: AdminSessionData) => void;
   onResponseError: (response: FetchResponse<ResponseType>) => void;
   onSuccessResponse: (response: FetchResponse<ResponseType>) => void;
-}>;
+};
 
 export function createAdminAPIClient<
   OPERATIONS extends Record<string, any> = operations,
@@ -65,11 +65,6 @@ export function createAdminAPIClient<
    */
   credentials?: OPERATIONS["token"]["body"];
   sessionData?: AdminSessionData;
-  /**
-   *
-   * @deprecated use `apiClient.hook("contextChanged". handler)` instead
-   */
-  onAuthChange?: (params: AdminSessionData) => void;
   defaultHeaders?: ClientHeaders;
 }) {
   const isTokenBasedAuth =
@@ -87,11 +82,7 @@ export function createAdminAPIClient<
   });
 
   // Create a hookable instance
-  const apiClientHooks = createHooks<{
-    onAuthChange: (authData: AdminSessionData) => void;
-    onResponseError: (response: FetchResponse<ResponseType>) => void;
-    onSuccessResponse: (response: FetchResponse<ResponseType>) => void;
-  }>();
+  const apiClientHooks = createHooks<AdminApiClientHooks>();
 
   function getSessionData() {
     return { ...sessionData };
@@ -120,7 +111,6 @@ export function createAdminAPIClient<
         refreshToken: responseData.refresh_token,
         expirationTime: Date.now() + responseData.expires_in * 1000,
       });
-      params.onAuthChange?.(dataCopy);
       apiClientHooks.callHook("onAuthChange", dataCopy);
     }
   }
@@ -267,6 +257,6 @@ export function createAdminAPIClient<
     /**
      * Available hooks for the client.
      */
-    hook: apiClientHooks.hook as ApiClientHooks["hook"],
+    hook: apiClientHooks.hook,
   };
 }
diff --git a/packages/composables/src/createShopwareContext.ts b/packages/composables/src/createShopwareContext.ts
index c3fc4f03..3819dede 100644
--- a/packages/composables/src/createShopwareContext.ts
+++ b/packages/composables/src/createShopwareContext.ts
@@ -11,9 +11,6 @@ import type { App, EffectScope } from "vue";
 export function createShopwareContext(
   app: App,
   options: {
-    // initialStore?: any;
-    // shopwareDefaults: ApiDefaults;
-    apiInstance?: unknown;
     devStorefrontUrl?: string | null;
     enableDevtools?: boolean;
   },
@@ -44,7 +41,6 @@ export function createShopwareContext(
     },
     _a: app,
     _e: scope,
-    apiInstance: options.apiInstance,
     devStorefrontUrl: options.devStorefrontUrl,
     state,
   });
diff --git a/packages/composables/src/useCart.ts b/packages/composables/src/useCart.ts
index 9003e2e6..8c756186 100644
--- a/packages/composables/src/useCart.ts
+++ b/packages/composables/src/useCart.ts
@@ -66,10 +66,6 @@ export type UseCartReturn = {
    * The total price of all cart items
    */
   subtotal: ComputedRef<number>;
-  /**
-   * @deprecated - use product related methods to fetch an item's URL instead
-   */
-  getProductItemsSeoUrlsData(): Promise<Partial<Schemas["Product"]>[]>;
   /**
    * `true` if the cart contains no items
    */
@@ -189,21 +185,6 @@ export function useCartFunction(): UseCartReturn {
     return data;
   }
 
-  async function getProductItemsSeoUrlsData() {
-    if (!cartItems.value.length) {
-      return [];
-    }
-
-    const result = await apiClient.invoke("readProduct post /product", {
-      body: {
-        ids: cartItems.value
-          .map(({ referencedId }) => referencedId)
-          .filter(String) as string[],
-      },
-    });
-    return result.data.elements;
-  }
-
   const appliedPromotionCodes = computed(() => {
     return cartItems.value.filter(
       (cartItem: Schemas["LineItem"]) => cartItem.type === "promotion",
@@ -293,7 +274,6 @@ export function useCartFunction(): UseCartReturn {
     totalPrice,
     shippingTotal,
     subtotal,
-    getProductItemsSeoUrlsData,
     isEmpty,
     isVirtualCart,
     consumeCartErrors,
diff --git a/packages/composables/src/useCartItem.ts b/packages/composables/src/useCartItem.ts
index eaebc30e..55020af8 100644
--- a/packages/composables/src/useCartItem.ts
+++ b/packages/composables/src/useCartItem.ts
@@ -1,7 +1,7 @@
 import { computed } from "vue";
 import type { ComputedRef, Ref } from "vue";
 import { getMainImageUrl } from "@shopware-pwa/helpers-next";
-import { useShopwareContext, useCart } from "#imports";
+import { useCart } from "#imports";
 import type { Schemas } from "#shopware";
 
 export type UseCartItemReturn = {
@@ -65,14 +65,6 @@ export type UseCartItemReturn = {
    * Removes the current item from the cart
    */
   removeItem(): Promise<Schemas["Cart"]>;
-  /**
-   * Get SEO data for the current item
-   *
-   * @deprecated
-   */
-  getProductItemSeoUrlData(): Promise<
-    Schemas["ProductDetailResponse"]["product"] | undefined
-  >;
 };
 
 /**
@@ -87,8 +79,7 @@ export function useCartItem(
     throw new Error("[useCartItem] mandatory cartItem argument is missing.");
   }
 
-  const { apiClient } = useShopwareContext();
-  const { refreshCart, changeProductQuantity } = useCart();
+  const { changeProductQuantity, removeItem: cartRemoveItem } = useCart();
 
   const itemQuantity = computed(() => cartItem.value.quantity);
   const itemImageThumbnailUrl = computed(() => getMainImageUrl(cartItem.value));
@@ -132,14 +123,7 @@ export function useCartItem(
   const isRemovable = computed(() => !!cartItem.value.removable);
 
   async function removeItem() {
-    const { data: newCart } = await apiClient.invoke(
-      "removeLineItem post /checkout/cart/line-item/delete",
-      {
-        body: { ids: [cartItem.value.id] },
-      },
-    );
-    await refreshCart(newCart);
-    return newCart;
+    return await cartRemoveItem(cartItem.value);
   }
 
   async function changeItemQuantity(
@@ -153,40 +137,9 @@ export function useCartItem(
     return result;
   }
 
-  /**
-   * @deprecated Method is not used anymore and the case should be solved on project level instead due to performance reasons.
-   */
-  async function getProductItemSeoUrlData() {
-    console.warn(
-      "[useCartItem][getProductItemSeoUrlData] is deprecated and will be removed in the next major release.",
-    );
-    if (!cartItem.value.referencedId) {
-      return;
-    }
-
-    try {
-      const result = await apiClient.invoke(
-        "readProductDetail post /product/{productId}",
-        {
-          headers: {
-            "sw-include-seo-urls": true,
-          },
-          pathParams: { productId: cartItem.value.referencedId },
-        },
-      );
-
-      return result.data.product;
-    } catch (error) {
-      console.error("[useCart][getProductItemsSeoUrlsData]", error);
-    }
-
-    return;
-  }
-
   return {
     changeItemQuantity,
     removeItem,
-    getProductItemSeoUrlData,
     itemRegularPrice,
     itemSpecialPrice,
     itemTotalPrice,
diff --git a/packages/composables/src/useSessionContext.ts b/packages/composables/src/useSessionContext.ts
index 4bc6da34..37bb1412 100644
--- a/packages/composables/src/useSessionContext.ts
+++ b/packages/composables/src/useSessionContext.ts
@@ -73,6 +73,10 @@ export type UseSessionContextReturn = {
   setActiveBillingAddress(
     address: Partial<Schemas["CustomerAddress"]>,
   ): Promise<void>;
+  /**
+   * Patches the context with new context
+   */
+  setContext(context: Schemas["SalesChannelContext"]): void;
   /**
    * current context's country id
    */
@@ -230,6 +234,10 @@ export function useSessionContext(
     refreshSessionContext();
   };
 
+  const setContext = (context: Schemas["SalesChannelContext"]) => {
+    _sessionContext.value = context;
+  };
+
   const countryId = computed(
     () => sessionContext.value?.shippingLocation?.country?.id,
   );
@@ -268,5 +276,6 @@ export function useSessionContext(
     languageId,
     languageIdChain,
     setCountry,
+    setContext,
   };
 }
diff --git a/packages/composables/src/useShopwareContext.ts b/packages/composables/src/useShopwareContext.ts
index 9144dca9..3efcf572 100644
--- a/packages/composables/src/useShopwareContext.ts
+++ b/packages/composables/src/useShopwareContext.ts
@@ -3,11 +3,6 @@ import ContextError from "./helpers/ContextError";
 import type { ApiClient } from "#shopware";
 
 export type ShopwareContext = {
-  /**
-   * Shopware API instance
-   * @deprecated use `apiClient` instead
-   */
-  apiInstance: unknown;
   devStorefrontUrl: string | null;
   /**
    * Shopware API client
@@ -30,10 +25,6 @@ export function useShopwareContext(): ShopwareContext {
   }
 
   return {
-    /**
-     * @deprecated use `apiClient` instead
-     */
-    apiInstance: shopwareContext.apiInstance,
     apiClient,
     devStorefrontUrl: shopwareContext.devStorefrontUrl,
   };
diff --git a/packages/helpers/src/_debounce.ts b/packages/helpers/src/_debounce.ts
deleted file mode 100644
index 0ecc1492..00000000
--- a/packages/helpers/src/_debounce.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Debouce helper to invoke a method with a delay
- *
- * @deprecated - use useDebounceFn from @vueuse/core instead
- */
-
-// biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-export function _debounce<T extends (...args: any[]) => any>(
-  fn: T,
-  delay = 300,
-): T {
-  let prevTimer: number | null = null;
-  // biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-  return ((...args: any[]) => {
-    if (prevTimer) {
-      clearTimeout(prevTimer);
-    }
-    prevTimer = window.setTimeout(() => {
-      fn(...args);
-      prevTimer = null;
-    }, delay);
-    // biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-  }) as any;
-}
diff --git a/packages/helpers/src/index.ts b/packages/helpers/src/index.ts
index ff4ba54c..2a2d66e4 100644
--- a/packages/helpers/src/index.ts
+++ b/packages/helpers/src/index.ts
@@ -2,14 +2,14 @@ export * from "./product";
 export * from "./category";
 export * from "./ui-interfaces";
 export * from "./cms";
-export * from "./urlHelpers";
-export * from "./_debounce";
 export * from "./getTranslatedProperty";
 export * from "./listing";
 export * from "./price";
-export * from "./media/image";
-export * from "./media/getMedia";
 export * from "./media/downloadFile";
+export * from "./media/getBiggestThumbnailUrl";
+export * from "./media/getMedia";
+export * from "./media/getSmallestThumbnailUrl";
+export * from "./media/getSrcSetForMedia";
 export * from "./checkout";
 export * from "./languages";
 export * from "./relativeUrlSlash";
diff --git a/packages/helpers/src/media/getBiggestThumbnailUrl.ts b/packages/helpers/src/media/getBiggestThumbnailUrl.ts
new file mode 100644
index 00000000..efb71bfb
--- /dev/null
+++ b/packages/helpers/src/media/getBiggestThumbnailUrl.ts
@@ -0,0 +1,26 @@
+/**
+ * Returns the biggest thumbnail url from the media object
+ *
+ * @param media image object
+ *
+ * @public
+ * @category Media
+ */
+export function getBiggestThumbnailUrl<
+  T extends {
+    thumbnails?: Array<{
+      width: number;
+      url: string;
+    }>;
+  },
+>(media?: T): string | undefined {
+  if (!media?.thumbnails?.length) {
+    return;
+  }
+
+  const biggest = media.thumbnails.reduce((previous, current) => {
+    return current.width > previous.width ? current : previous;
+  });
+
+  return biggest?.url;
+}
diff --git a/packages/helpers/src/media/getSmallestThumbnailUrl.ts b/packages/helpers/src/media/getSmallestThumbnailUrl.ts
new file mode 100644
index 00000000..b9b6dfe2
--- /dev/null
+++ b/packages/helpers/src/media/getSmallestThumbnailUrl.ts
@@ -0,0 +1,26 @@
+/**
+ * Returns the smallest thumbnail url from the media object
+ *
+ * @param media image object
+ *
+ * @public
+ * @category Media
+ */
+export function getSmallestThumbnailUrl<
+  T extends {
+    thumbnails?: Array<{
+      width: number;
+      url: string;
+    }>;
+  },
+>(media?: T): string | undefined {
+  if (!media || !media?.thumbnails?.length) {
+    return;
+  }
+
+  const lowest = media.thumbnails.reduce((previous, current) => {
+    return current.width < previous.width ? current : previous;
+  });
+
+  return lowest?.url;
+}
diff --git a/packages/helpers/src/media/getSrcSetForMedia.ts b/packages/helpers/src/media/getSrcSetForMedia.ts
new file mode 100644
index 00000000..ce6dfc1e
--- /dev/null
+++ b/packages/helpers/src/media/getSrcSetForMedia.ts
@@ -0,0 +1,26 @@
+/**
+ * Returns the srcset attribute for the image, for available breakpoints
+ *
+ * @param media image object
+ *
+ * @public
+ * @category Media
+ */
+export function getSrcSetForMedia<
+  T extends {
+    thumbnails?: Array<{
+      width: number;
+      url: string;
+    }>;
+  },
+>(media?: T): string {
+  if (!media?.thumbnails?.length) {
+    return "";
+  }
+
+  return media.thumbnails
+    .map((thumbnail) => {
+      return `${thumbnail.url} ${thumbnail.width}w`;
+    })
+    .join(", ");
+}
diff --git a/packages/helpers/src/media/image.ts b/packages/helpers/src/media/image.ts
deleted file mode 100644
index 555ac480..00000000
--- a/packages/helpers/src/media/image.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Returns the smallest thumbnail url from the media object
- *
- * @param media image object
- *
- * @public
- * @category Media
- */
-export function getSmallestThumbnailUrl<
-  T extends {
-    thumbnails?: Array<{
-      width: number;
-      url: string;
-    }>;
-  },
->(media?: T): string | undefined {
-  if (!media || !media?.thumbnails?.length) {
-    return;
-  }
-
-  const lowest = media.thumbnails.reduce((previous, current) => {
-    return current.width < previous.width ? current : previous;
-  });
-
-  return lowest?.url;
-}
-
-/**
- * Returns the biggest thumbnail url from the media object
- *
- * @param media image object
- *
- * @public
- * @category Media
- */
-export function getBiggestThumbnailUrl<
-  T extends {
-    thumbnails?: Array<{
-      width: number;
-      url: string;
-    }>;
-  },
->(media?: T): string | undefined {
-  if (!media?.thumbnails?.length) {
-    return;
-  }
-
-  const biggest = media.thumbnails.reduce((previous, current) => {
-    return current.width > previous.width ? current : previous;
-  });
-
-  return biggest?.url;
-}
-
-/**
- * Returns the srcset attribute for the image, for available breakpoints
- *
- * @param media image object
- *
- * @public
- * @category Media
- */
-export function getSrcSetForMedia<
-  T extends {
-    thumbnails?: Array<{
-      width: number;
-      url: string;
-    }>;
-  },
->(media?: T): string {
-  if (!media?.thumbnails?.length) {
-    return "";
-  }
-
-  return media.thumbnails
-    .map((thumbnail) => {
-      return `${thumbnail.url} ${thumbnail.width}w`;
-    })
-    .join(", ");
-}
diff --git a/packages/helpers/src/product/getProductThumbnailUrl.spec.ts b/packages/helpers/src/product/getProductThumbnailUrl.spec.ts
deleted file mode 100644
index 1e9ffe20..00000000
--- a/packages/helpers/src/product/getProductThumbnailUrl.spec.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { getProductThumbnailUrl } from "./getProductThumbnailUrl";
-
-describe("Helpers - getProductThumbnailUrl", () => {
-  it("should return the smallest thumbnail contained in thumbnails array", () => {
-    const product = {
-      cover: {
-        media: {
-          url: "https://shopware.test/media/image.jpg",
-          thumbnails: [
-            {
-              width: 1920,
-              height: 1920,
-              url: "https://shopware.test/media/image_1920x1920.jpg",
-            },
-            {
-              width: 500,
-              height: 500,
-              url: "https://shopware.test/media/image_500x500.jpg",
-            },
-          ],
-        },
-      },
-    };
-    const coverUrl = getProductThumbnailUrl(product);
-    expect(coverUrl).toEqual("https://shopware.test/media/image_500x500.jpg");
-  });
-
-  it("should return the smallest thumbnail contained in thumbnails array", () => {
-    const product = {
-      cover: {
-        media: {
-          url: "https://shopware.test/media/image.jpg",
-          thumbnails: [
-            {
-              width: 500,
-              height: 500,
-              url: "https://shopware.test/media/image_500x500.jpg",
-            },
-            {
-              width: 1920,
-              height: 500,
-              url: "https://shopware.test/media/image_1920x500.jpg",
-            },
-          ],
-        },
-      },
-    };
-    const coverUrl = getProductThumbnailUrl(product);
-    expect(coverUrl).toEqual("https://shopware.test/media/image_500x500.jpg");
-  });
-
-  it("should return the main media url as a fallback if there is no thumbnail in the list", () => {
-    const product = {
-      cover: {
-        media: {
-          url: "https://shopware.test/media/image.jpg",
-          thumbnails: null,
-        },
-      },
-    };
-    // @ts-expect-error type should be wrong here
-    const coverUrl = getProductThumbnailUrl(product);
-    expect(coverUrl).toEqual("https://shopware.test/media/image.jpg");
-  });
-
-  it("should return empty string as a fallback if the thumbnails array can't be reached", () => {
-    const product = {
-      cover: {},
-    };
-    const coverUrl = getProductThumbnailUrl(product);
-    expect(coverUrl).toEqual("");
-  });
-
-  it("should return null for product without cover media, cover or thumnails", () => {
-    const emptyProduct = {};
-    const coverUrl = getProductThumbnailUrl(emptyProduct);
-    expect(coverUrl).toEqual("");
-  });
-
-  it("should return default negative value if argument wasn't provided", () => {
-    // @ts-expect-error type should be wrong here
-    const coverUrl = getProductThumbnailUrl(undefined);
-    expect(coverUrl).toEqual("");
-  });
-
-  it("should return default value if product was null", () => {
-    const argument = null;
-    // @ts-expect-error type should be wrong here
-    const coverUrl = getProductThumbnailUrl(argument);
-    expect(coverUrl).toEqual("");
-  });
-  it("should return default value if product cover.media has no thumnbails in array", () => {
-    const argument = {
-      cover: {
-        media: {
-          url: "https://shopware-pwa.com/image.png",
-          thumbnails: [],
-        },
-      },
-    };
-    const coverUrl = getProductThumbnailUrl(argument);
-    expect(coverUrl).toEqual("https://shopware-pwa.com/image.png");
-  });
-});
diff --git a/packages/helpers/src/product/getProductThumbnailUrl.ts b/packages/helpers/src/product/getProductThumbnailUrl.ts
deleted file mode 100644
index c760f3eb..00000000
--- a/packages/helpers/src/product/getProductThumbnailUrl.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * get the thumbnail image URL with the smallest width
- *
- * @deprecated use `getSmallestThumbnailUrl` helper instead
- *
- * @param {Product} product product entity
- *
- * @beta
- *
- * @category Product
- */
-export function getProductThumbnailUrl<
-  T extends {
-    cover?: {
-      media?: {
-        thumbnails?: Array<{
-          width: number;
-          url: string;
-        }>;
-        url?: string;
-      };
-    };
-  },
->(product: T): string {
-  const coverImageUrlFallback = product?.cover?.media?.url || "";
-  const thumbnailImage =
-    (product?.cover?.media?.thumbnails?.length &&
-      product.cover.media.thumbnails.reduce((res, thumb) =>
-        thumb.width < res.width ? thumb : res,
-      )) ||
-    null;
-  return thumbnailImage?.url || coverImageUrlFallback;
-}
diff --git a/packages/helpers/src/product/index.ts b/packages/helpers/src/product/index.ts
index a604079d..8003a3df 100644
--- a/packages/helpers/src/product/index.ts
+++ b/packages/helpers/src/product/index.ts
@@ -5,7 +5,6 @@ export * from "./getProductReviews";
 export * from "./getProductTierPrices";
 export * from "./getProductUrl";
 export * from "./getProductRatingAverage";
-export * from "./getProductThumbnailUrl";
 export * from "./getProductCalculatedListingPrice";
 export * from "./getProductFromPrice";
 export * from "./getProductRoute";
diff --git a/packages/helpers/src/urlHelpers.ts b/packages/helpers/src/urlHelpers.ts
deleted file mode 100644
index 621321cc..00000000
--- a/packages/helpers/src/urlHelpers.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-type SearchCriteria<T = unknown> = T & { [key: string]: any };
-
-/**
- * @internal
- * @deprecated not used anymore, remove in v1.0
- */
-// biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-export function _parseUrlQuery(query: any): SearchCriteria {
-  // biome-ignore lint/suspicious/noExplicitAny: deprecated method, will be removed
-  const searchCriteria: any = {};
-  if (!query || typeof query !== "object") {
-    return searchCriteria;
-  }
-
-  // biome-ignore lint/complexity/noForEach: deprecated method, will be removed
-  Object.keys(query).forEach((key: string) => {
-    try {
-      searchCriteria[key] =
-        typeof query[key] === "string" &&
-        ["{", "["].includes(query[key].charAt(0)) // it's a JSON
-          ? JSON.parse(query[key])
-          : query[key];
-    } catch (e) {
-      console.error(
-        `[helpers][parseUrlQuery] Problem with resolving url param: ${key}`,
-      );
-    }
-  });
-
-  return searchCriteria;
-}
diff --git a/packages/nuxt3-module/plugin.ts b/packages/nuxt3-module/plugin.ts
index 3ee7afa1..a04d9ccd 100644
--- a/packages/nuxt3-module/plugin.ts
+++ b/packages/nuxt3-module/plugin.ts
@@ -65,7 +65,6 @@ export default defineNuxtPlugin((NuxtApp) => {
 
   // Shopware context
   const shopwareContext = createShopwareContext(NuxtApp.vueApp, {
-    apiInstance: null,
     enableDevtools: true,
     devStorefrontUrl: runtimeConfig.public.shopware?.devStorefrontUrl || null,
   });
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 641a4283..110fd769 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,10 +51,10 @@ importers:
         version: 2.27.1
       '@microsoft/api-documenter':
         specifier: 7.25.3
-        version: 7.25.3(@types/node@20.14.7)
+        version: 7.25.3(@types/node@20.14.8)
       '@microsoft/api-extractor':
         specifier: 7.47.0
-        version: 7.47.0(@types/node@20.14.7)
+        version: 7.47.0(@types/node@20.14.8)
       '@microsoft/tsdoc':
         specifier: 0.15.0
         version: 0.15.0
@@ -89,8 +89,8 @@ importers:
         specifier: 2.0.4
         version: 2.0.4
       typedoc:
-        specifier: 0.25.13
-        version: 0.25.13(typescript@4.9.5)
+        specifier: 0.26.2
+        version: 0.26.2(typescript@4.9.5)
       vercel:
         specifier: 34.2.7
         version: 34.2.7(@swc/core@1.5.28)(encoding@0.1.13)
@@ -185,13 +185,13 @@ importers:
         version: link:../../packages/api-gen
       '@unocss/nuxt':
         specifier: 0.61.0
-        version: 0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
+        version: 0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
       '@vueuse/nuxt':
         specifier: 10.11.0
-        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
+        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
       nuxt:
         specifier: 3.11.2
-        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       vue-tsc:
         specifier: 2.0.21
         version: 2.0.21(typescript@5.5.2)
@@ -475,7 +475,7 @@ importers:
     dependencies:
       '@vueuse/nuxt':
         specifier: 10.11.0
-        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
+        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
       vue:
         specifier: 3.4.27
         version: 3.4.27(typescript@5.5.2)
@@ -494,7 +494,7 @@ importers:
         version: 12.1.0(eslint@8.57.0)(typescript@5.5.2)
       '@unocss/nuxt':
         specifier: 0.61.0
-        version: 0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
+        version: 0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
       '@unocss/reset':
         specifier: 0.61.0
         version: 0.61.0
@@ -503,10 +503,10 @@ importers:
         version: 8.57.0
       nuxt:
         specifier: 3.11.2
-        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       unocss:
         specifier: 0.61.0
-        version: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+        version: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
 
   examples/mollie-credit-card:
     devDependencies:
@@ -785,7 +785,7 @@ importers:
         version: link:../api-client-next
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       eslint-config-shopware:
         specifier: workspace:*
         version: link:../eslint-config-shopware
@@ -800,7 +800,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
 
   packages/api-client-next:
     dependencies:
@@ -816,13 +816,13 @@ importers:
     devDependencies:
       '@codspeed/vitest-plugin':
         specifier: 3.1.0
-        version: 3.1.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 3.1.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       '@types/prettier':
         specifier: 3.0.0
         version: 3.0.0
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       eslint-config-shopware:
         specifier: workspace:*
         version: link:../eslint-config-shopware
@@ -837,7 +837,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
 
   packages/api-gen:
     dependencies:
@@ -868,7 +868,7 @@ importers:
         version: 17.0.32
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       eslint-config-shopware:
         specifier: workspace:*
         version: link:../eslint-config-shopware
@@ -886,7 +886,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
 
   packages/cms-base:
     dependencies:
@@ -938,7 +938,7 @@ importers:
         version: 0.165.0
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       '@vue/eslint-config-typescript':
         specifier: 13.0.0
         version: 13.0.0(eslint-plugin-vue@9.24.1(eslint@8.57.0))(eslint@8.57.0)(typescript@5.5.2)
@@ -950,7 +950,7 @@ importers:
         version: 9.24.1(eslint@8.57.0)
       nuxt:
         specifier: 3.11.2
-        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       tsconfig:
         specifier: workspace:*
         version: link:../tsconfig
@@ -962,7 +962,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
       vue-eslint-parser:
         specifier: 9.4.3
         version: 9.4.3(eslint@8.57.0)
@@ -996,7 +996,7 @@ importers:
         version: 3.11.2(rollup@4.18.0)
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       '@vue/test-utils':
         specifier: 2.4.6
         version: 2.4.6
@@ -1017,7 +1017,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
       vue:
         specifier: 3.4.27
         version: 3.4.27(typescript@5.5.2)
@@ -1044,7 +1044,7 @@ importers:
     devDependencies:
       '@vitest/coverage-v8':
         specifier: 1.6.0
-        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))
+        version: 1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))
       happy-dom:
         specifier: 14.12.3
         version: 14.12.3
@@ -1056,7 +1056,7 @@ importers:
         version: 2.0.0(typescript@5.5.2)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+        version: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
 
   packages/nuxt3-module:
     dependencies:
@@ -1087,7 +1087,7 @@ importers:
         version: link:../eslint-config-shopware
       nuxt:
         specifier: 3.11.2
-        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       tsconfig:
         specifier: workspace:*
         version: link:../tsconfig
@@ -1117,10 +1117,10 @@ importers:
     dependencies:
       '@astrojs/node':
         specifier: 8.3.1
-        version: 8.3.1(astro@4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2))
+        version: 8.3.1(astro@4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2))
       '@astrojs/vue':
         specifier: 4.5.0
-        version: 4.5.0(astro@4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+        version: 4.5.0(astro@4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@shopware-pwa/composables-next':
         specifier: canary
         version: link:../../packages/composables
@@ -1129,13 +1129,13 @@ importers:
         version: link:../../packages/api-client-next
       '@vitejs/plugin-vue':
         specifier: 5.0.5
-        version: 5.0.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+        version: 5.0.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vitejs/plugin-vue-jsx':
         specifier: 4.0.0
-        version: 4.0.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+        version: 4.0.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       astro:
         specifier: 4.11.0
-        version: 4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2)
+        version: 4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2)
       js-cookie:
         specifier: 3.0.5
         version: 3.0.5
@@ -1198,7 +1198,7 @@ importers:
         version: link:../../packages/api-client-next
       '@unocss/nuxt':
         specifier: 0.61.0
-        version: 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
+        version: 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))
       '@vuelidate/core':
         specifier: 2.0.3
         version: 2.0.3(vue@3.4.27(typescript@5.5.2))
@@ -1207,7 +1207,7 @@ importers:
         version: 2.0.4(vue@3.4.27(typescript@5.5.2))
       '@vueuse/nuxt':
         specifier: 10.11.0
-        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
+        version: 10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))
       defu:
         specifier: 6.1.4
         version: 6.1.4
@@ -1241,7 +1241,7 @@ importers:
         version: 9.24.1(eslint@8.57.0)
       nuxt:
         specifier: 3.11.2
-        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+        version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       typescript:
         specifier: 5.5.2
         version: 5.5.2
@@ -3389,6 +3389,9 @@ packages:
   '@shikijs/core@1.7.0':
     resolution: {integrity: sha512-O6j27b7dGmJbR3mjwh/aHH8Ld+GQvA0OQsNO43wKWnqbAae3AYXrhFyScHGX8hXZD6vX2ngjzDFkZY5srtIJbQ==}
 
+  '@shikijs/core@1.9.0':
+    resolution: {integrity: sha512-cbSoY8P/jgGByG8UOl3jnP/CWg/Qk+1q+eAKWtcrU3pNoILF8wTsLB0jT44qUBV8Ce1SvA9uqcM9Xf+u3fJFBw==}
+
   '@sigstore/bundle@2.3.0':
     resolution: {integrity: sha512-MU3XYHkOvKEFnuUtcAtVh0s4RTemRyi1NN87+v9fAL0qR9JZuK/nF27YJ79wjPvvi1W9sz3qc7cTgshH5tji6Q==}
     engines: {node: ^16.14.0 || >=18.0.0}
@@ -3821,8 +3824,11 @@ packages:
   '@types/node@20.14.2':
     resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==}
 
-  '@types/node@20.14.7':
-    resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==}
+  '@types/node@20.14.8':
+    resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==}
+
+  '@types/node@20.14.8':
+    resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==}
 
   '@types/normalize-package-data@2.4.4':
     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -5978,6 +5984,9 @@ packages:
   es-module-lexer@1.5.3:
     resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==}
 
+  es-module-lexer@1.5.4:
+    resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
   es-set-tostringtag@2.0.3:
     resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
     engines: {node: '>= 0.4'}
@@ -7818,11 +7827,6 @@ packages:
   markdown-table@3.0.3:
     resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
 
-  marked@4.3.0:
-    resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
-    engines: {node: '>= 12'}
-    hasBin: true
-
   match-sorter@6.3.1:
     resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==}
 
@@ -9572,6 +9576,9 @@ packages:
   shiki@1.7.0:
     resolution: {integrity: sha512-H5pMn4JA7ayx8H0qOz1k2qANq6mZVCMl1gKLK6kWIrv1s2Ial4EmD4s4jE8QB5Dw03d/oCQUxc24sotuyR5byA==}
 
+  shiki@1.9.0:
+    resolution: {integrity: sha512-i6//Lqgn7+7nZA0qVjoYH0085YdNk4MC+tJV4bo+HgjgRMJ0JmkLZzFAuvVioJqLkcGDK5GAMpghZEZkCnwxpQ==}
+
   side-channel@1.0.5:
     resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==}
     engines: {node: '>= 0.4'}
@@ -10260,12 +10267,12 @@ packages:
     resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==}
     engines: {node: '>= 0.4'}
 
-  typedoc@0.25.13:
-    resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==}
-    engines: {node: '>= 16'}
+  typedoc@0.26.2:
+    resolution: {integrity: sha512-q/t+M+PZqhN9gPWLBZ3CCvP+KT8O1tyYkSzEYbcQ6mo89avdIrMlBEl3vfo5BgSzwC6Lbmq0W64E8RkY+eVsLA==}
+    engines: {node: '>= 18'}
     hasBin: true
     peerDependencies:
-      typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x
+      typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x
 
   typescript@4.9.5:
     resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
@@ -11398,9 +11405,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@astrojs/node@8.3.1(astro@4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2))':
+  '@astrojs/node@8.3.1(astro@4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2))':
     dependencies:
-      astro: 4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2)
+      astro: 4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2)
       send: 0.18.0
       server-destroy: 1.0.1
     transitivePeerDependencies:
@@ -11422,13 +11429,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@astrojs/vue@4.5.0(astro@4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@astrojs/vue@4.5.0(astro@4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
-      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vitejs/plugin-vue-jsx': 4.0.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue-jsx': 4.0.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/compiler-sfc': 3.4.29
-      astro: 4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2)
-      vite-plugin-vue-devtools: 7.3.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      astro: 4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2)
+      vite-plugin-vue-devtools: 7.3.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       vue: 3.4.27(typescript@5.5.2)
     transitivePeerDependencies:
       - '@nuxt/kit'
@@ -12062,11 +12069,11 @@ snapshots:
     transitivePeerDependencies:
       - debug
 
-  '@codspeed/vitest-plugin@3.1.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))':
+  '@codspeed/vitest-plugin@3.1.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))':
     dependencies:
       '@codspeed/core': 3.1.0
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vitest: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vitest: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
     transitivePeerDependencies:
       - debug
 
@@ -12688,7 +12695,7 @@ snapshots:
   '@manypkg/find-root@1.1.0':
     dependencies:
       '@babel/runtime': 7.24.4
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       find-up: 4.1.0
       fs-extra: 8.1.0
 
@@ -12716,35 +12723,35 @@ snapshots:
       - encoding
       - supports-color
 
-  '@microsoft/api-documenter@7.25.3(@types/node@20.14.7)':
+  '@microsoft/api-documenter@7.25.3(@types/node@20.14.8)':
     dependencies:
-      '@microsoft/api-extractor-model': 7.29.2(@types/node@20.14.7)
+      '@microsoft/api-extractor-model': 7.29.2(@types/node@20.14.8)
       '@microsoft/tsdoc': 0.15.0
-      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.7)
-      '@rushstack/terminal': 0.13.0(@types/node@20.14.7)
-      '@rushstack/ts-command-line': 4.22.0(@types/node@20.14.7)
+      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.8)
+      '@rushstack/terminal': 0.13.0(@types/node@20.14.8)
+      '@rushstack/ts-command-line': 4.22.0(@types/node@20.14.8)
       js-yaml: 3.13.1
       resolve: 1.22.8
     transitivePeerDependencies:
       - '@types/node'
 
-  '@microsoft/api-extractor-model@7.29.2(@types/node@20.14.7)':
+  '@microsoft/api-extractor-model@7.29.2(@types/node@20.14.8)':
     dependencies:
       '@microsoft/tsdoc': 0.15.0
       '@microsoft/tsdoc-config': 0.17.0
-      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.7)
+      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.8)
     transitivePeerDependencies:
       - '@types/node'
 
-  '@microsoft/api-extractor@7.47.0(@types/node@20.14.7)':
+  '@microsoft/api-extractor@7.47.0(@types/node@20.14.8)':
     dependencies:
-      '@microsoft/api-extractor-model': 7.29.2(@types/node@20.14.7)
+      '@microsoft/api-extractor-model': 7.29.2(@types/node@20.14.8)
       '@microsoft/tsdoc': 0.15.0
       '@microsoft/tsdoc-config': 0.17.0
-      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.7)
+      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.8)
       '@rushstack/rig-package': 0.5.2
-      '@rushstack/terminal': 0.13.0(@types/node@20.14.7)
-      '@rushstack/ts-command-line': 4.22.0(@types/node@20.14.7)
+      '@rushstack/terminal': 0.13.0(@types/node@20.14.8)
+      '@rushstack/ts-command-line': 4.22.0(@types/node@20.14.8)
       lodash: 4.17.21
       minimatch: 3.0.8
       resolve: 1.22.8
@@ -12880,35 +12887,35 @@ snapshots:
       - rollup
       - supports-color
 
-  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       execa: 7.2.0
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
       - supports-color
 
-  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       execa: 7.2.0
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
       - supports-color
 
-  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@nuxt/devtools-kit@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       execa: 7.2.0
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
       - supports-color
@@ -12991,14 +12998,14 @@ snapshots:
       - utf-8-validate
       - vue
 
-  '@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@antfu/utils': 0.7.7
-      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@nuxt/devtools-wizard': 1.3.3
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
-      '@vue/devtools-applet': 7.1.3(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-applet': 7.1.3(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.5.2))
       birpc: 0.2.17
       consola: 3.2.3
@@ -13015,7 +13022,7 @@ snapshots:
       launch-editor: 2.6.1
       local-pkg: 0.5.0
       magicast: 0.3.4
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       nypm: 0.3.8
       ohash: 1.1.3
       pacote: 18.0.6
@@ -13028,9 +13035,9 @@ snapshots:
       simple-git: 3.24.0
       sirv: 2.0.4
       unimport: 3.7.2(rollup@4.18.0)
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
-      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
+      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       which: 3.0.1
       ws: 8.17.1
     transitivePeerDependencies:
@@ -13121,14 +13128,14 @@ snapshots:
       - utf-8-validate
       - vue
 
-  '@nuxt/devtools@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@nuxt/devtools@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@antfu/utils': 0.7.7
-      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@nuxt/devtools-wizard': 1.3.3
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
-      '@vue/devtools-applet': 7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-applet': 7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.5.2))
       birpc: 0.2.17
       consola: 3.2.3
@@ -13145,7 +13152,7 @@ snapshots:
       launch-editor: 2.6.1
       local-pkg: 0.5.0
       magicast: 0.3.4
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       nypm: 0.3.8
       ohash: 1.1.3
       pacote: 18.0.6
@@ -13158,9 +13165,9 @@ snapshots:
       simple-git: 3.24.0
       sirv: 2.0.4
       unimport: 3.7.2(rollup@4.18.0)
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
-      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
+      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       which: 3.0.1
       ws: 8.17.1
     transitivePeerDependencies:
@@ -13186,14 +13193,14 @@ snapshots:
       - utf-8-validate
       - vue
 
-  '@nuxt/devtools@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@nuxt/devtools@1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@antfu/utils': 0.7.7
-      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@nuxt/devtools-kit': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@nuxt/devtools-wizard': 1.3.3
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
-      '@vue/devtools-applet': 7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-applet': 7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-core': 7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.5.2))
       birpc: 0.2.17
       consola: 3.2.3
@@ -13210,7 +13217,7 @@ snapshots:
       launch-editor: 2.6.1
       local-pkg: 0.5.0
       magicast: 0.3.4
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       nypm: 0.3.8
       ohash: 1.1.3
       pacote: 18.0.6
@@ -13223,9 +13230,9 @@ snapshots:
       simple-git: 3.24.0
       sirv: 2.0.4
       unimport: 3.7.2(rollup@4.18.0)
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
-      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-inspect: 0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
+      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       which: 3.0.1
       ws: 8.17.1
     transitivePeerDependencies:
@@ -13387,7 +13394,7 @@ snapshots:
       '@types/file-loader': 5.0.4
       '@types/html-minifier': 4.0.5
       '@types/less': 3.0.6
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@types/optimize-css-assets-webpack-plugin': 5.0.8
       '@types/pug': 2.0.10
       '@types/serve-static': 1.15.5
@@ -13525,12 +13532,12 @@ snapshots:
       - vti
       - vue-tsc
 
-  '@nuxt/vite-builder@3.11.2(@types/node@20.14.7)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))':
+  '@nuxt/vite-builder@3.11.2(@types/node@20.14.8)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@rollup/plugin-replace': 5.0.7(rollup@4.18.0)
-      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       autoprefixer: 10.4.19(postcss@8.4.38)
       clear: 0.1.0
       consola: 3.2.3
@@ -13557,9 +13564,9 @@ snapshots:
       ufo: 1.5.3
       unenv: 1.9.0
       unplugin: 1.10.1
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-node: 1.6.0(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-node: 1.6.0(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       vue: 3.4.27(typescript@5.5.2)
       vue-bundle-renderer: 2.1.0
     transitivePeerDependencies:
@@ -13582,12 +13589,12 @@ snapshots:
       - vti
       - vue-tsc
 
-  '@nuxt/vite-builder@3.11.2(@types/node@20.14.7)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue@3.4.27(typescript@5.5.2))':
+  '@nuxt/vite-builder@3.11.2(@types/node@20.14.8)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@rollup/plugin-replace': 5.0.7(rollup@4.18.0)
-      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
-      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue': 5.0.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       autoprefixer: 10.4.19(postcss@8.4.38)
       clear: 0.1.0
       consola: 3.2.3
@@ -13614,9 +13621,9 @@ snapshots:
       ufo: 1.5.3
       unenv: 1.9.0
       unplugin: 1.10.1
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-node: 1.6.0(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-node: 1.6.0(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       vue: 3.4.27(typescript@5.5.2)
       vue-bundle-renderer: 2.1.0
     transitivePeerDependencies:
@@ -14081,7 +14088,7 @@ snapshots:
   '@rollup/rollup-win32-x64-msvc@4.18.0':
     optional: true
 
-  '@rushstack/node-core-library@5.4.1(@types/node@20.14.7)':
+  '@rushstack/node-core-library@5.4.1(@types/node@20.14.8)':
     dependencies:
       ajv: 8.13.0
       ajv-draft-04: 1.0.0(ajv@8.13.0)
@@ -14092,23 +14099,23 @@ snapshots:
       resolve: 1.22.8
       semver: 7.6.2
     optionalDependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@rushstack/rig-package@0.5.2':
     dependencies:
       resolve: 1.22.8
       strip-json-comments: 3.1.1
 
-  '@rushstack/terminal@0.13.0(@types/node@20.14.7)':
+  '@rushstack/terminal@0.13.0(@types/node@20.14.8)':
     dependencies:
-      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.7)
+      '@rushstack/node-core-library': 5.4.1(@types/node@20.14.8)
       supports-color: 8.1.1
     optionalDependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
-  '@rushstack/ts-command-line@4.22.0(@types/node@20.14.7)':
+  '@rushstack/ts-command-line@4.22.0(@types/node@20.14.8)':
     dependencies:
-      '@rushstack/terminal': 0.13.0(@types/node@20.14.7)
+      '@rushstack/terminal': 0.13.0(@types/node@20.14.8)
       '@types/argparse': 1.0.38
       argparse: 1.0.10
       string-argv: 0.3.2
@@ -14170,6 +14177,8 @@ snapshots:
 
   '@shikijs/core@1.7.0': {}
 
+  '@shikijs/core@1.9.0': {}
+
   '@sigstore/bundle@2.3.0':
     dependencies:
       '@sigstore/protobuf-specs': 0.3.1
@@ -14761,13 +14770,13 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/changelog-parser@2.8.4': {}
 
   '@types/clean-css@4.2.6':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       source-map: 0.6.1
 
   '@types/compression@1.7.5':
@@ -14776,7 +14785,7 @@ snapshots:
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/cookie@0.6.0': {}
 
@@ -14800,11 +14809,11 @@ snapshots:
 
   '@types/etag@1.8.3':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/express-serve-static-core@4.17.41':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@types/qs': 6.9.11
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -14844,7 +14853,7 @@ snapshots:
 
   '@types/http-proxy@1.17.14':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/js-cookie@2.2.7': {}
 
@@ -14904,7 +14913,11 @@ snapshots:
     dependencies:
       undici-types: 5.26.5
 
-  '@types/node@20.14.7':
+  '@types/node@20.14.8':
+    dependencies:
+      undici-types: 5.26.5
+
+  '@types/node@20.14.8':
     dependencies:
       undici-types: 5.26.5
 
@@ -14948,7 +14961,7 @@ snapshots:
 
   '@types/sax@1.2.7':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/scheduler@0.16.8': {}
 
@@ -14957,13 +14970,13 @@ snapshots:
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/serve-static@1.15.5':
     dependencies:
       '@types/http-errors': 2.0.1
       '@types/mime': 3.0.4
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/source-list-map@0.1.2': {}
 
@@ -14996,7 +15009,7 @@ snapshots:
 
   '@types/type-is@1.6.3':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
 
   '@types/uglify-js@3.17.1':
     dependencies:
@@ -15021,13 +15034,13 @@ snapshots:
 
   '@types/webpack-sources@3.2.0':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@types/source-list-map': 0.1.2
       source-map: 0.7.4
 
   '@types/webpack@4.41.38':
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@types/tapable': 1.0.8
       '@types/uglify-js': 3.17.1
       '@types/webpack-sources': 3.2.0
@@ -15358,13 +15371,13 @@ snapshots:
     transitivePeerDependencies:
       - rollup
 
-  '@unocss/astro@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@unocss/astro@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@unocss/core': 0.61.0
       '@unocss/reset': 0.61.0
-      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     optionalDependencies:
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
 
@@ -15444,7 +15457,7 @@ snapshots:
       gzip-size: 6.0.0
       sirv: 2.0.4
 
-  '@unocss/nuxt@0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))':
+  '@unocss/nuxt@0.61.0(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))':
     dependencies:
       '@nuxt/kit': 3.12.1(rollup@4.18.0)
       '@unocss/config': 0.61.0
@@ -15457,9 +15470,9 @@ snapshots:
       '@unocss/preset-web-fonts': 0.61.0
       '@unocss/preset-wind': 0.61.0
       '@unocss/reset': 0.61.0
-      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@unocss/webpack': 0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28))
-      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - postcss
       - rollup
@@ -15490,7 +15503,7 @@ snapshots:
       - vite
       - webpack
 
-  '@unocss/nuxt@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))':
+  '@unocss/nuxt@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(webpack@5.91.0(@swc/core@1.5.28))':
     dependencies:
       '@nuxt/kit': 3.12.1(rollup@4.18.0)
       '@unocss/config': 0.61.0
@@ -15503,9 +15516,9 @@ snapshots:
       '@unocss/preset-web-fonts': 0.61.0
       '@unocss/preset-wind': 0.61.0
       '@unocss/reset': 0.61.0
-      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@unocss/webpack': 0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28))
-      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - postcss
       - rollup
@@ -15713,7 +15726,7 @@ snapshots:
     transitivePeerDependencies:
       - rollup
 
-  '@unocss/vite@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@unocss/vite@0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
@@ -15725,7 +15738,7 @@ snapshots:
       chokidar: 3.6.0
       fast-glob: 3.3.2
       magic-string: 0.30.10
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
 
@@ -15858,7 +15871,7 @@ snapshots:
       '@edge-runtime/node-utils': 2.3.0
       '@edge-runtime/primitives': 4.1.0
       '@edge-runtime/vm': 3.2.0
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@vercel/build-utils': 8.2.2
       '@vercel/error-utils': 2.0.2
       '@vercel/nft': 0.27.2(encoding@0.1.13)
@@ -15872,7 +15885,7 @@ snapshots:
       node-fetch: 2.6.9(encoding@0.1.13)
       path-to-regexp: 6.2.1
       ts-morph: 12.0.0
-      ts-node: 10.9.1(@swc/core@1.5.28)(@types/node@20.14.7)(typescript@4.9.5)
+      ts-node: 10.9.1(@swc/core@1.5.28)(@types/node@20.14.8)(typescript@4.9.5)
       typescript: 4.9.5
       undici: 5.28.4
     transitivePeerDependencies:
@@ -15943,22 +15956,22 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@babel/core': 7.24.7
       '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7)
       '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.7)
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
       vue: 3.4.27(typescript@5.5.2)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitejs/plugin-vue-jsx@4.0.0(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vitejs/plugin-vue-jsx@4.0.0(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@babel/core': 7.24.6
       '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.6)
       '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.6)
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
       vue: 3.4.27(typescript@5.5.2)
     transitivePeerDependencies:
       - supports-color
@@ -15983,9 +15996,9 @@ snapshots:
       vite: 5.2.12(@types/node@20.14.2)(terser@5.31.1)
       vue: 3.4.27(typescript@5.5.2)
 
-  '@vitejs/plugin-vue@5.0.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vitejs/plugin-vue@5.0.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
       vue: 3.4.27(typescript@5.5.2)
 
   '@vitejs/plugin-vue@5.0.5(vite@5.2.8(@types/node@20.11.17)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
@@ -15993,7 +16006,7 @@ snapshots:
       vite: 5.2.8(@types/node@20.11.17)(terser@5.31.1)
       vue: 3.4.27(typescript@5.5.2)
 
-  '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1))':
+  '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
@@ -16008,7 +16021,7 @@ snapshots:
       std-env: 3.7.0
       strip-literal: 2.1.0
       test-exclude: 6.0.0
-      vitest: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1)
+      vitest: 1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -16248,12 +16261,12 @@ snapshots:
       - unocss
       - vite
 
-  '@vue/devtools-applet@7.1.3(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vue/devtools-applet@7.1.3(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
-      '@vue/devtools-core': 7.2.1(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-core': 7.2.1(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-shared': 7.2.1
-      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
       lodash-es: 4.17.21
       perfect-debounce: 1.0.0
       shiki: 1.3.0
@@ -16283,7 +16296,7 @@ snapshots:
       '@vue/devtools-core': 7.2.1(vite@5.2.12(@types/node@20.11.17)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-shared': 7.2.1
-      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
       lodash-es: 4.17.21
       perfect-debounce: 1.0.0
       shiki: 1.3.0
@@ -16308,12 +16321,12 @@ snapshots:
       - unocss
       - vite
 
-  '@vue/devtools-applet@7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vue/devtools-applet@7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
-      '@vue/devtools-core': 7.2.1(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-core': 7.2.1(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-shared': 7.2.1
-      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
+      '@vue/devtools-ui': 7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))
       lodash-es: 4.17.21
       perfect-debounce: 1.0.0
       shiki: 1.3.0
@@ -16362,14 +16375,14 @@ snapshots:
       - vite
       - vue
 
-  '@vue/devtools-core@7.1.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vue/devtools-core@7.1.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-shared': 7.2.1
       mitt: 3.0.1
       nanoid: 3.3.7
       pathe: 1.1.2
-      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - vite
       - vue
@@ -16398,26 +16411,26 @@ snapshots:
       - vite
       - vue
 
-  '@vue/devtools-core@7.2.1(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
+  '@vue/devtools-core@7.2.1(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.2))
       '@vue/devtools-shared': 7.2.1
       mitt: 3.0.1
       nanoid: 3.3.7
       pathe: 1.1.2
-      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - vite
       - vue
 
-  '@vue/devtools-core@7.3.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))':
+  '@vue/devtools-core@7.3.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))':
     dependencies:
       '@vue/devtools-kit': 7.3.2
       '@vue/devtools-shared': 7.3.2
       mitt: 3.0.1
       nanoid: 3.3.7
       pathe: 1.1.2
-      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite-hot-client: 0.2.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - vite
 
@@ -16483,7 +16496,7 @@ snapshots:
       - sortablejs
       - universal-cookie
 
-  '@vue/devtools-ui@7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))':
+  '@vue/devtools-ui@7.2.1(@unocss/reset@0.61.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@unocss/reset': 0.61.0
       '@vue/devtools-shared': 7.2.1
@@ -16492,7 +16505,7 @@ snapshots:
       '@vueuse/integrations': 10.9.0(axios@1.7.2)(focus-trap@7.5.4)(vue@3.4.27(typescript@5.5.2))
       colord: 2.9.3
       focus-trap: 7.5.4
-      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      unocss: 0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       vue: 3.4.27(typescript@5.5.2)
     transitivePeerDependencies:
       - '@vue/composition-api'
@@ -16669,13 +16682,13 @@ snapshots:
       - supports-color
       - vue
 
-  '@vueuse/nuxt@10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))':
+  '@vueuse/nuxt@10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@nuxt/kit': 3.12.1(rollup@4.18.0)
       '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.5.2))
       '@vueuse/metadata': 10.11.0
       local-pkg: 0.5.0
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       vue-demi: 0.14.8(vue@3.4.27(typescript@5.5.2))
     transitivePeerDependencies:
       - '@vue/composition-api'
@@ -16683,13 +16696,13 @@ snapshots:
       - supports-color
       - vue
 
-  '@vueuse/nuxt@10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))':
+  '@vueuse/nuxt@10.11.0(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vue@3.4.27(typescript@5.5.2))':
     dependencies:
       '@nuxt/kit': 3.12.1(rollup@4.18.0)
       '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.5.2))
       '@vueuse/metadata': 10.11.0
       local-pkg: 0.5.0
-      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
+      nuxt: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2))
       vue-demi: 0.14.8(vue@3.4.27(typescript@5.5.2))
     transitivePeerDependencies:
       - '@vue/composition-api'
@@ -17072,7 +17085,7 @@ snapshots:
     transitivePeerDependencies:
       - rollup
 
-  astro@4.11.0(@types/node@20.14.7)(terser@5.31.1)(typescript@5.5.2):
+  astro@4.11.0(@types/node@20.14.8)(terser@5.31.1)(typescript@5.5.2):
     dependencies:
       '@astrojs/compiler': 2.8.0
       '@astrojs/internal-helpers': 0.4.0
@@ -17131,8 +17144,8 @@ snapshots:
       tsconfck: 3.1.0(typescript@5.5.2)
       unist-util-visit: 5.0.0
       vfile: 6.0.1
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vitefu: 0.2.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vitefu: 0.2.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       which-pm: 2.2.0
       yargs-parser: 21.1.1
       zod: 3.22.4
@@ -18179,6 +18192,8 @@ snapshots:
 
   es-module-lexer@1.5.3: {}
 
+  es-module-lexer@1.5.4: {}
+
   es-set-tostringtag@2.0.3:
     dependencies:
       get-intrinsic: 1.2.4
@@ -19807,7 +19822,7 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.14.2
+      '@types/node': 20.14.8
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -20222,8 +20237,6 @@ snapshots:
 
   markdown-table@3.0.3: {}
 
-  marked@4.3.0: {}
-
   match-sorter@6.3.1:
     dependencies:
       '@babel/runtime': 7.24.4
@@ -21388,15 +21401,15 @@ snapshots:
       - vue-tsc
       - xml2js
 
-  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
+  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
     dependencies:
       '@nuxt/devalue': 2.0.2
-      '@nuxt/devtools': 1.3.3(@unocss/reset@0.61.0)(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/devtools': 1.3.3(@unocss/reset@0.61.0)(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(@unocss/reset@0.61.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       '@nuxt/telemetry': 2.5.4(rollup@4.18.0)
       '@nuxt/ui-templates': 1.3.4
-      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.7)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.8)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))
       '@unhead/dom': 1.9.12
       '@unhead/ssr': 1.9.12
       '@unhead/vue': 1.9.12(vue@3.4.27(typescript@5.5.2))
@@ -21448,7 +21461,7 @@ snapshots:
       vue-router: 4.3.3(vue@3.4.27(typescript@5.5.2))
     optionalDependencies:
       '@parcel/watcher': 2.4.1
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
     transitivePeerDependencies:
       - '@azure/app-configuration'
       - '@azure/cosmos'
@@ -21504,15 +21517,15 @@ snapshots:
       - vue-tsc
       - xml2js
 
-  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
       '@nuxt/devalue': 2.0.2
-      '@nuxt/devtools': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/devtools': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       '@nuxt/telemetry': 2.5.4(rollup@4.18.0)
       '@nuxt/ui-templates': 1.3.4
-      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.7)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.8)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue@3.4.27(typescript@5.5.2))
       '@unhead/dom': 1.9.12
       '@unhead/ssr': 1.9.12
       '@unhead/vue': 1.9.12(vue@3.4.27(typescript@5.5.2))
@@ -21564,7 +21577,7 @@ snapshots:
       vue-router: 4.3.3(vue@3.4.27(typescript@5.5.2))
     optionalDependencies:
       '@parcel/watcher': 2.4.1
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
     transitivePeerDependencies:
       - '@azure/app-configuration'
       - '@azure/cosmos'
@@ -21620,15 +21633,15 @@ snapshots:
       - vue-tsc
       - xml2js
 
-  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
+  nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
     dependencies:
       '@nuxt/devalue': 2.0.2
-      '@nuxt/devtools': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/devtools': 1.3.3(nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.8)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue@3.4.27(typescript@5.5.2))
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
       '@nuxt/schema': 3.11.2(rollup@4.18.0)
       '@nuxt/telemetry': 2.5.4(rollup@4.18.0)
       '@nuxt/ui-templates': 1.3.4
-      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.7)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))
+      '@nuxt/vite-builder': 3.11.2(@types/node@20.14.8)(eslint@8.57.0)(optionator@0.9.3)(rollup@4.18.0)(terser@5.31.1)(typescript@5.5.2)(vue-tsc@2.0.21(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2))
       '@unhead/dom': 1.9.12
       '@unhead/ssr': 1.9.12
       '@unhead/vue': 1.9.12(vue@3.4.27(typescript@5.5.2))
@@ -21680,7 +21693,7 @@ snapshots:
       vue-router: 4.3.3(vue@3.4.27(typescript@5.5.2))
     optionalDependencies:
       '@parcel/watcher': 2.4.1
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
     transitivePeerDependencies:
       - '@azure/app-configuration'
       - '@azure/cosmos'
@@ -23014,6 +23027,10 @@ snapshots:
     dependencies:
       '@shikijs/core': 1.7.0
 
+  shiki@1.9.0:
+    dependencies:
+      '@shikijs/core': 1.9.0
+
   side-channel@1.0.5:
     dependencies:
       call-bind: 1.0.7
@@ -23069,7 +23086,7 @@ snapshots:
 
   sitemap@8.0.0:
     dependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       '@types/sax': 1.2.7
       arg: 5.0.2
       sax: 1.3.0
@@ -23562,14 +23579,14 @@ snapshots:
       '@ts-morph/common': 0.23.0
       code-block-writer: 13.0.1
 
-  ts-node@10.9.1(@swc/core@1.5.28)(@types/node@20.14.7)(typescript@4.9.5):
+  ts-node@10.9.1(@swc/core@1.5.28)(@types/node@20.14.8)(typescript@4.9.5):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       acorn: 8.11.3
       acorn-walk: 8.3.2
       arg: 4.1.3
@@ -23712,13 +23729,14 @@ snapshots:
       is-typed-array: 1.1.13
       possible-typed-array-names: 1.0.0
 
-  typedoc@0.25.13(typescript@4.9.5):
+  typedoc@0.26.2(typescript@4.9.5):
     dependencies:
       lunr: 2.3.9
-      marked: 4.3.0
+      markdown-it: 14.1.0
       minimatch: 9.0.4
-      shiki: 0.14.7
+      shiki: 1.9.0
       typescript: 4.9.5
+      yaml: 2.4.5
 
   typescript@4.9.5: {}
 
@@ -24010,9 +24028,9 @@ snapshots:
       - supports-color
       - vite
 
-  unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
-      '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@unocss/cli': 0.61.0(rollup@4.18.0)
       '@unocss/core': 0.61.0
       '@unocss/extractor-arbitrary-variants': 0.61.0
@@ -24031,10 +24049,10 @@ snapshots:
       '@unocss/transformer-compile-class': 0.61.0
       '@unocss/transformer-directives': 0.61.0
       '@unocss/transformer-variant-group': 0.61.0
-      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     optionalDependencies:
       '@unocss/webpack': 0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28))
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - postcss
       - rollup
@@ -24070,9 +24088,9 @@ snapshots:
       - rollup
       - supports-color
 
-  unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  unocss@0.61.0(@unocss/webpack@0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28)))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
-      '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@unocss/cli': 0.61.0(rollup@4.18.0)
       '@unocss/core': 0.61.0
       '@unocss/extractor-arbitrary-variants': 0.61.0
@@ -24091,10 +24109,10 @@ snapshots:
       '@unocss/transformer-compile-class': 0.61.0
       '@unocss/transformer-directives': 0.61.0
       '@unocss/transformer-variant-group': 0.61.0
-      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     optionalDependencies:
       '@unocss/webpack': 0.61.0(rollup@4.18.0)(webpack@5.91.0(@swc/core@1.5.28))
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - postcss
       - rollup
@@ -24404,9 +24422,9 @@ snapshots:
     dependencies:
       vite: 5.2.12(@types/node@20.14.2)(terser@5.31.1)
 
-  vite-hot-client@0.2.3(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vite-hot-client@0.2.3(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
 
   vite-node@1.6.0(@types/node@20.11.17)(terser@5.31.1):
     dependencies:
@@ -24442,13 +24460,13 @@ snapshots:
       - supports-color
       - terser
 
-  vite-node@1.6.0(@types/node@20.14.7)(terser@5.31.1):
+  vite-node@1.6.0(@types/node@20.14.8)(terser@5.31.1):
     dependencies:
       cac: 6.7.14
       debug: 4.3.5
       pathe: 1.1.2
       picocolors: 1.0.0
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -24507,7 +24525,7 @@ snapshots:
       typescript: 5.5.2
       vue-tsc: 2.0.21(typescript@5.5.2)
 
-  vite-plugin-checker@0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
+  vite-plugin-checker@0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))(vue-tsc@2.0.21(typescript@5.5.2)):
     dependencies:
       '@babel/code-frame': 7.24.7
       ansi-escapes: 4.3.2
@@ -24520,7 +24538,7 @@ snapshots:
       semver: 7.6.2
       strip-ansi: 6.0.1
       tiny-invariant: 1.3.1
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
       vscode-languageclient: 7.0.0
       vscode-languageserver: 7.0.0
       vscode-languageserver-textdocument: 1.0.11
@@ -24567,7 +24585,7 @@ snapshots:
       - rollup
       - supports-color
 
-  vite-plugin-inspect@0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vite-plugin-inspect@0.8.4(@nuxt/kit@3.11.2(rollup@4.18.0))(rollup@4.18.0)(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
       '@antfu/utils': 0.7.7
       '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
@@ -24578,14 +24596,14 @@ snapshots:
       perfect-debounce: 1.0.0
       picocolors: 1.0.1
       sirv: 2.0.4
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     optionalDependencies:
       '@nuxt/kit': 3.11.2(rollup@4.18.0)
     transitivePeerDependencies:
       - rollup
       - supports-color
 
-  vite-plugin-inspect@0.8.4(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vite-plugin-inspect@0.8.4(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
       '@antfu/utils': 0.7.7
       '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
@@ -24596,21 +24614,21 @@ snapshots:
       perfect-debounce: 1.0.0
       picocolors: 1.0.1
       sirv: 2.0.4
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - rollup
       - supports-color
 
-  vite-plugin-vue-devtools@7.3.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vite-plugin-vue-devtools@7.3.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
-      '@vue/devtools-core': 7.3.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      '@vue/devtools-core': 7.3.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
       '@vue/devtools-kit': 7.3.2
       '@vue/devtools-shared': 7.3.2
       execa: 8.0.1
       sirv: 2.0.4
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
-      vite-plugin-inspect: 0.8.4(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
-      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1))
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
+      vite-plugin-inspect: 0.8.4(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
+      vite-plugin-vue-inspector: 5.1.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1))
     transitivePeerDependencies:
       - '@nuxt/kit'
       - rollup
@@ -24646,7 +24664,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  vite-plugin-vue-inspector@5.1.2(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vite-plugin-vue-inspector@5.1.2(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     dependencies:
       '@babel/core': 7.24.7
       '@babel/plugin-proposal-decorators': 7.23.5(@babel/core@7.24.7)
@@ -24657,7 +24675,7 @@ snapshots:
       '@vue/compiler-dom': 3.4.27
       kolorist: 1.8.0
       magic-string: 0.30.10
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -24691,13 +24709,13 @@ snapshots:
       fsevents: 2.3.3
       terser: 5.31.1
 
-  vite@5.2.12(@types/node@20.14.7)(terser@5.31.1):
+  vite@5.2.12(@types/node@20.14.8)(terser@5.31.1):
     dependencies:
       esbuild: 0.20.2
       postcss: 8.4.38
       rollup: 4.18.0
     optionalDependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       fsevents: 2.3.3
       terser: 5.31.1
 
@@ -24711,19 +24729,19 @@ snapshots:
       fsevents: 2.3.3
       terser: 5.31.1
 
-  vite@5.2.8(@types/node@20.14.7)(terser@5.31.1):
+  vite@5.2.8(@types/node@20.14.8)(terser@5.31.1):
     dependencies:
       esbuild: 0.20.2
       postcss: 8.4.38
       rollup: 4.13.0
     optionalDependencies:
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       fsevents: 2.3.3
       terser: 5.31.1
 
-  vitefu@0.2.5(vite@5.2.12(@types/node@20.14.7)(terser@5.31.1)):
+  vitefu@0.2.5(vite@5.2.12(@types/node@20.14.8)(terser@5.31.1)):
     optionalDependencies:
-      vite: 5.2.12(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.12(@types/node@20.14.8)(terser@5.31.1)
 
   vitepress-plugin-search@1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.0.0-beta.7(@algolia/client-search@4.20.0)(@types/node@20.11.17)(@types/react@17.0.75)(axios@1.7.2)(react-dom@18.2.0(react@17.0.2))(react@17.0.2)(search-insights@2.6.0)(terser@5.31.1)(typescript@5.5.2))(vue@3.4.27(typescript@5.5.2)):
     dependencies:
@@ -24827,7 +24845,7 @@ snapshots:
       - typescript
       - universal-cookie
 
-  vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.7)(happy-dom@14.12.3)(terser@5.31.1):
+  vitest@1.6.0(@edge-runtime/vm@3.2.0)(@types/node@20.14.8)(happy-dom@14.12.3)(terser@5.31.1):
     dependencies:
       '@vitest/expect': 1.6.0
       '@vitest/runner': 1.6.0
@@ -24846,12 +24864,12 @@ snapshots:
       strip-literal: 2.1.0
       tinybench: 2.6.0
       tinypool: 0.8.3
-      vite: 5.2.8(@types/node@20.14.7)(terser@5.31.1)
-      vite-node: 1.6.0(@types/node@20.14.7)(terser@5.31.1)
+      vite: 5.2.8(@types/node@20.14.8)(terser@5.31.1)
+      vite-node: 1.6.0(@types/node@20.14.8)(terser@5.31.1)
       why-is-node-running: 2.2.2
     optionalDependencies:
       '@edge-runtime/vm': 3.2.0
-      '@types/node': 20.14.7
+      '@types/node': 20.14.8
       happy-dom: 14.12.3
     transitivePeerDependencies:
       - less
@@ -25006,7 +25024,7 @@ snapshots:
       browserslist: 4.23.1
       chrome-trace-event: 1.0.4
       enhanced-resolve: 5.17.0
-      es-module-lexer: 1.5.3
+      es-module-lexer: 1.5.4
       eslint-scope: 5.1.1
       events: 3.3.0
       glob-to-regexp: 0.4.1
diff --git a/templates/astro/README.md b/templates/astro/README.md
index d43d75f4..a55a0fcb 100644
--- a/templates/astro/README.md
+++ b/templates/astro/README.md
@@ -17,28 +17,49 @@ Go to [Documentation > Requirements](https://frontends.shopware.com/framework/re
 
 In order to have a different API connected to the app, change two lines of code in [./src/entrypoints/\_shopware.ts](./src/entrypoints/_shopware.ts):
 
-```js
-// src/entrypoints/_shopware.ts
+<!-- automd:file src="./src/entrypoints/_shopware.ts" code -->
+
+```ts [_shopware.ts]
+import type { App } from "vue";
+import { createShopwareContext } from "@shopware-pwa/composables-next/dist";
+import Cookies from "js-cookie";
+
+import { createAPIClient } from "@shopware/api-client";
+import type { operations } from "@shopware/api-client/store-api-types";
 
 export default (app: App) => {
-   const apiInstance = createAPIClient<operations>({
-    baseURL:
-      import.meta.env.API_URL ||
-      "https://demo-frontends.shopware.store/store-api", // CHANGE here or in .env.* file
+  const shopwareEndpoint =
+    import.meta.env.API_URL ||
+    "https://demo-frontends.shopware.store/store-api";
+
+  const apiClient = createAPIClient<operations>({
+    baseURL: shopwareEndpoint,
     accessToken:
-      import.meta.env.API_ACCESS_TOKEN || "SWSCBHFSNTVMAWNZDNFKSHLAYW", // CHANGE here or in .env.* file
+      import.meta.env.API_ACCESS_TOKEN || "SWSCBHFSNTVMAWNZDNFKSHLAYW",
     contextToken: Cookies.get("sw-context-token"),
-    onContextChanged(newContextToken: string) {
-      Cookies.set("sw-context-token", newContextToken, {
-        expires: 365, // days
-        path: "/",
-        sameSite: "lax",
-      });
-    },
   });
+
+  apiClient.hook("onContextChanged", (newContextToken) => {
+    Cookies.set("sw-context-token", newContextToken, {
+      expires: 365, // days
+      path: "/",
+      sameSite: "lax",
+      secure: shopwareEndpoint.startsWith("https://"),
+    });
+  });
+
+  // create a Shopware context plugin and inject it to the Vue app
+  const shopwareContext = createShopwareContext(app, {
+    devStorefrontUrl: null,
+  });
+  // register a plugin
+  app.provide("apiClient", apiClient);
+  app.use(shopwareContext);
 };
 ```
 
+<!-- /automd -->
+
 ## Customize
 
 Now, you are free to use the `@shopware-pwa/composables-next` package in the application. You can start from [Session.vue](./src/components/Session.vue).
diff --git a/templates/astro/src/entrypoints/_shopware.ts b/templates/astro/src/entrypoints/_shopware.ts
index c43d0b96..6e08776f 100644
--- a/templates/astro/src/entrypoints/_shopware.ts
+++ b/templates/astro/src/entrypoints/_shopware.ts
@@ -6,20 +6,24 @@ import { createAPIClient } from "@shopware/api-client";
 import type { operations } from "@shopware/api-client/store-api-types";
 
 export default (app: App) => {
-  const apiInstance = createAPIClient<operations>({
-    baseURL:
-      import.meta.env.API_URL ||
-      "https://demo-frontends.shopware.store/store-api",
+  const shopwareEndpoint =
+    import.meta.env.API_URL ||
+    "https://demo-frontends.shopware.store/store-api";
+
+  const apiClient = createAPIClient<operations>({
+    baseURL: shopwareEndpoint,
     accessToken:
       import.meta.env.API_ACCESS_TOKEN || "SWSCBHFSNTVMAWNZDNFKSHLAYW",
     contextToken: Cookies.get("sw-context-token"),
-    onContextChanged(newContextToken: string) {
-      Cookies.set("sw-context-token", newContextToken, {
-        expires: 365, // days
-        path: "/",
-        sameSite: "lax",
-      });
-    },
+  });
+
+  apiClient.hook("onContextChanged", (newContextToken) => {
+    Cookies.set("sw-context-token", newContextToken, {
+      expires: 365, // days
+      path: "/",
+      sameSite: "lax",
+      secure: shopwareEndpoint.startsWith("https://"),
+    });
   });
 
   // create a Shopware context plugin and inject it to the Vue app
@@ -27,6 +31,6 @@ export default (app: App) => {
     devStorefrontUrl: null,
   });
   // register a plugin
-  app.provide("apiClient", apiInstance);
+  app.provide("apiClient", apiClient);
   app.use(shopwareContext);
 };
diff --git a/templates/vue-blank/package.json b/templates/vue-blank/package.json
index ba63a83a..f2ff7da0 100644
--- a/templates/vue-blank/package.json
+++ b/templates/vue-blank/package.json
@@ -13,7 +13,7 @@
     "@shopware-pwa/composables-next": "canary",
     "@shopware-pwa/nuxt3-module": "canary",
     "@shopware/api-client": "canary",
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vueuse/nuxt": "10.11.0",
     "nuxt": "3.11.2",
     "typescript": "5.5.2",
diff --git a/templates/vue-demo-store/api-types/storeApiTypes.d.ts b/templates/vue-demo-store/api-types/storeApiTypes.d.ts
index 8a3bcd11..432235bf 100644
--- a/templates/vue-demo-store/api-types/storeApiTypes.d.ts
+++ b/templates/vue-demo-store/api-types/storeApiTypes.d.ts
@@ -610,6 +610,8 @@ export type Schemas = {
   Cart: {
     /** An affiliate tracking code */
     affiliateCode?: string | null;
+    /** @enum {string} */
+    apiAlias: "cart";
     /** A campaign tracking code */
     campaignCode?: string | null;
     /** A comment that can be added to the cart. */
@@ -4781,7 +4783,9 @@ export type Schemas = {
     /** Format: date-time */
     updatedAt?: string;
   };
-  SalesChannelContext: components["schemas"]["ArrayStruct"] & {
+  SalesChannelContext: {
+    /** @enum {string} */
+    apiAlias: "sales_channel_context";
     /** Core context with general configuration values and state */
     context?: {
       currencyFactor?: number;
@@ -4808,8 +4812,7 @@ export type Schemas = {
       name?: string;
     };
     paymentMethod?: components["schemas"]["PaymentMethod"];
-    /** Information about the current sales channel */
-    salesChannel: components["schemas"]["SalesChannel"]; // TODO: [OpenAPI][SalesChannelContext] - salesChannel should be required and points to entity
+    salesChannel: components["schemas"]["SalesChannel"];
     shippingLocation?: {
       address?: components["schemas"]["CustomerAddress"];
       /** @enum {string} */
@@ -7542,9 +7545,7 @@ export type operations = {
       "sw-language-id"?: string;
     };
     body?: components["schemas"]["Criteria"];
-    response: {
-      elements?: components["schemas"]["Currency"][];
-    } & components["schemas"]["EntitySearchResult"];
+    response: components["schemas"]["Currency"][];
     responseCode: 200;
   };
   "getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}": {
diff --git a/templates/vue-demo-store/app.vue b/templates/vue-demo-store/app.vue
index 971d78bf..1481c5e6 100644
--- a/templates/vue-demo-store/app.vue
+++ b/templates/vue-demo-store/app.vue
@@ -20,6 +20,8 @@ const sessionContextData = ref<Schemas["SalesChannelContext"]>();
 const contextResponse = await apiClient.invoke("readContext get /context");
 sessionContextData.value = contextResponse.data;
 
+useBroadcastChannelSync();
+
 // If you enable runtimeConfig.shopware.useUserContextInSSR, then you can use this code to share session between server and client.
 // const { data: sessionContextData } = await useAsyncData(
 //   "sessionContext",
diff --git a/templates/vue-demo-store/components/account/AccountMenu.vue b/templates/vue-demo-store/components/account/AccountMenu.vue
index 7991d60a..75f408f5 100644
--- a/templates/vue-demo-store/components/account/AccountMenu.vue
+++ b/templates/vue-demo-store/components/account/AccountMenu.vue
@@ -1,11 +1,16 @@
 <script setup lang="ts">
+import { onClickOutside } from "@vueuse/core";
+
 const { isLoggedIn, logout, user } = useUser();
+const accountMenu = ref(null);
 
 const loginModalController = useModal();
 const localePath = useLocalePath();
 const { formatLink } = useInternationalization(localePath);
 const isAccountMenuOpen = ref(false);
 
+onClickOutside(accountMenu, () => (isAccountMenuOpen.value = false));
+
 async function invokeLogout() {
   try {
     await logout();
@@ -85,6 +90,7 @@ async function invokeLogout() {
               >
                 <div
                   v-if="isAccountMenuOpen"
+                  ref="accountMenu"
                   :class="[isAccountMenuOpen ? 'block' : 'hidden']"
                   class="z-20 origin-top-right absolute right-0 top-2 mt-2 w-48 rounded-md shadow-lg py-1 bg-white ring-1 ring-black ring-opacity-5 focus:outline-none"
                   role="menu"
diff --git a/templates/vue-demo-store/components/checkout/CheckoutSideCart.vue b/templates/vue-demo-store/components/checkout/CheckoutSideCart.vue
index 7e51a02f..fc93f081 100644
--- a/templates/vue-demo-store/components/checkout/CheckoutSideCart.vue
+++ b/templates/vue-demo-store/components/checkout/CheckoutSideCart.vue
@@ -63,15 +63,15 @@ const { formatLink } = useInternationalization(localePath);
         <p>Subtotal</p>
         <SharedPrice :value="totalPrice" data-testid="cart-subtotal" />
       </div>
-      <p class="mt-0.5 text-sm text-secondary-500">
+      <p class="mt-2 text-sm text-secondary-500">
         Shipping and taxes calculated at checkout.
       </p>
       <div class="mt-6">
         <NuxtLink
-          class="flex items-center justify-center rounded-md border border-transparent px-6 py-3 text-base font-medium text-white shadow-sm bg-primary hover:bg-dark"
+          class="flex items-center justify-center rounded-md border border-transparent px-6 py-3 text-base font-medium shadow-sm"
           :class="{
-            'bg-secondary-400': isEmpty,
-            'hover:bg-secondary-400': isEmpty,
+            '!text-[#bcc1c7] bg-[#f9f9f9] cursor-default': isEmpty,
+            'text-white bg-primary hover:bg-dark': !isEmpty,
           }"
           :to="formatLink(isEmpty ? '' : '/checkout')"
           data-testid="cart-checkout-link"
diff --git a/templates/vue-demo-store/composables/useBroadcastChannelSync.ts b/templates/vue-demo-store/composables/useBroadcastChannelSync.ts
new file mode 100644
index 00000000..03153e69
--- /dev/null
+++ b/templates/vue-demo-store/composables/useBroadcastChannelSync.ts
@@ -0,0 +1,59 @@
+import type { Schemas } from "#shopware";
+
+export function useSyncChannel<Entity>(
+  name: string,
+): [Ref<Entity | undefined>, (data: Entity) => void] {
+  const { data, post } = useBroadcastChannel<Entity, Entity>({
+    name,
+  });
+
+  return [data, post];
+}
+
+function isEntity<T extends { apiAlias: string }>(
+  data: T,
+  apiAlias: T["apiAlias"],
+): data is T {
+  return data?.apiAlias === apiAlias;
+}
+
+/**
+ * Sync basic state like session/cart data between tabs
+ */
+export const useBroadcastChannelSync = createSharedComposable(() => {
+  const { apiClient } = useShopwareContext();
+
+  // Synchronize CART data
+  const { refreshCart } = useCart();
+  const [cartData, notifyCartDataChanged] =
+    useSyncChannel<Schemas["Cart"]>("shopware-cart");
+  watch([cartData], () => {
+    refreshCart(cartData.value);
+  });
+
+  // Synchronize SESSION data
+  const { setContext } = useSessionContext();
+  const [sessionData, notifySessionDataChanged] = useSyncChannel<
+    Schemas["SalesChannelContext"]
+  >("shopware-session-data");
+  watch([sessionData], () => {
+    setContext(sessionData.value!);
+  });
+
+  // Listen for API responses and update the shared state
+  apiClient.hook("onSuccessResponse", (response) => {
+    // for cart
+    if (isEntity<Schemas["Cart"]>(<Schemas["Cart"]>response._data, "cart")) {
+      notifyCartDataChanged(<Schemas["Cart"]>response._data);
+    }
+    // for session data
+    else if (
+      isEntity<Schemas["SalesChannelContext"]>(
+        <Schemas["SalesChannelContext"]>response._data,
+        "sales_channel_context",
+      )
+    ) {
+      notifySessionDataChanged(<Schemas["SalesChannelContext"]>response._data);
+    }
+  });
+});
diff --git a/templates/vue-demo-store/composables/useShopwareContext.ts b/templates/vue-demo-store/composables/useShopwareContext.ts
index d5700b23..9a1bbbfa 100644
--- a/templates/vue-demo-store/composables/useShopwareContext.ts
+++ b/templates/vue-demo-store/composables/useShopwareContext.ts
@@ -10,10 +10,6 @@ export function useShopwareContext() {
     throw new Error("Critical error. Shopware context is not provided.");
 
   return {
-    /**
-     * @deprecated use `apiClient` instead
-     */
-    apiInstance: shopwareContext.apiInstance,
     apiClient,
     devStorefrontUrl: shopwareContext.devStorefrontUrl,
   };
diff --git a/templates/vue-demo-store/pages/checkout/index.vue b/templates/vue-demo-store/pages/checkout/index.vue
index 34d8e696..dfad64c6 100644
--- a/templates/vue-demo-store/pages/checkout/index.vue
+++ b/templates/vue-demo-store/pages/checkout/index.vue
@@ -60,6 +60,15 @@ watch([isLoggedIn, isGuestSession], ([isLogged, isLoggedGuest]) => {
   }
 });
 
+/**
+ * Broadcast channel logout refresh
+ */
+watch(isLoggedIn, async (newValue, oldValue) => {
+  if (!newValue && oldValue) {
+    location.reload();
+  }
+});
+
 const selectedShippingMethod = computed({
   get(): string {
     return shippingMethod.value?.id || "";
diff --git a/templates/vue-vite-blank/package.json b/templates/vue-vite-blank/package.json
index dd5186a7..943193da 100644
--- a/templates/vue-vite-blank/package.json
+++ b/templates/vue-vite-blank/package.json
@@ -15,7 +15,7 @@
     "vue": "3.4.27"
   },
   "devDependencies": {
-    "@types/node": "20.14.7",
+    "@types/node": "20.14.8",
     "@vitejs/plugin-vue": "5.0.5",
     "typescript": "5.5.2",
     "vite": "5.2.13",


Test patch:
diff --git a/packages/api-client-next/src/createAdminApiClient.test.ts b/packages/api-client-next/src/createAdminApiClient.test.ts
index 810519b6..a8b8048c 100644
--- a/packages/api-client-next/src/createAdminApiClient.test.ts
+++ b/packages/api-client-next/src/createAdminApiClient.test.ts
@@ -155,8 +155,8 @@ describe("createAdminAPIClient", () => {
         client_id: "my-client-id",
         client_secret: "my-client-secret-token",
       },
-      onAuthChange: onAuthChangeSpy,
     });
+    client.hook("onAuthChange", onAuthChangeSpy);
     const res = await client.invoke("getOrderList get /order", {});
     expect(authEndpointSpy).toHaveBeenCalledWith({
       client_id: "my-client-id",
@@ -202,8 +202,8 @@ describe("createAdminAPIClient", () => {
         client_id: "my-client-id",
         client_secret: "my-client-secret-token",
       },
-      onAuthChange: onAuthChangeSpy,
     });
+    client.hook("onAuthChange", onAuthChangeSpy);
     const res = await client.invoke("getOrderList get /order", {});
     expect(res.data).toEqual({ orderResponse: 123 });
 
diff --git a/packages/api-client-next/src/createApiClient.test.ts b/packages/api-client-next/src/createApiClient.test.ts
index da035d3d..c85de7f1 100644
--- a/packages/api-client-next/src/createApiClient.test.ts
+++ b/packages/api-client-next/src/createApiClient.test.ts
@@ -309,34 +309,6 @@ describe("createAPIClient", () => {
     expect(errorCallback).toHaveBeenCalled();
   });
 
-  it("should display deprecation message at the console when onContextChanged method is used", async () => {
-    const app = createApp().use(
-      "/context",
-      eventHandler(async (event) => {
-        setHeader(event, "sw-context-token", "789");
-        return {};
-      }),
-    );
-
-    const consoleErrorSpy = vi
-      .spyOn(console, "warn")
-      .mockImplementationOnce(() => {});
-    const contextChangedMock = vi.fn().mockImplementation(() => {});
-
-    const baseURL = await createPortAndGetUrl(app);
-
-    const client = createAPIClient<operations>({
-      baseURL,
-      accessToken: "123",
-      contextToken: "456",
-      onContextChanged: contextChangedMock,
-    });
-
-    await client.invoke("readContext get /context");
-
-    expect(consoleErrorSpy).toHaveBeenCalled();
-  });
-
   it("should allow to abort request", async () => {
     const app = createApp().use(
       "/context",
diff --git a/packages/api-client-next/src/tests/updateSessionContext.e2e.test.ts b/packages/api-client-next/src/tests/updateSessionContext.e2e.test.ts
new file mode 100644
index 00000000..52d46dbd
--- /dev/null
+++ b/packages/api-client-next/src/tests/updateSessionContext.e2e.test.ts
@@ -0,0 +1,186 @@
+import { describe, expect, it } from "vitest";
+import { createAPIClient } from "../createAPIClient";
+import type { operations } from "../../api-types/storeApiTypes";
+
+const baseURL = "https://demo-frontends.shopware.store/store-api";
+const accessToken = "SWSCBHFSNTVMAWNZDNFKSHLAYW";
+
+describe("updateSessionContext", () => {
+  describe("update session currency", () => {
+    it("should update session currency", async () => {
+      const apiInstance = createAPIClient<operations>({
+        baseURL,
+        accessToken,
+      });
+
+      const sessionResponse = await apiInstance.invoke(
+        "readContext get /context",
+      );
+
+      const currentIsoCode = sessionResponse.data.currency?.isoCode;
+      expect(currentIsoCode).toEqual("EUR");
+
+      const availableCurrencies = await apiInstance.invoke(
+        "readCurrency post /currency",
+      );
+      const differentCurrency = availableCurrencies.data.find(
+        (currency) => currency.isoCode === "PLN",
+      );
+
+      await apiInstance.invoke("updateContext patch /context", {
+        body: {
+          currencyId: differentCurrency?.id,
+        },
+      });
+
+      const updatedSessionContext = await apiInstance.invoke(
+        "readContext get /context",
+      );
+      const updatedCurrencyIsoCode =
+        updatedSessionContext.data.currency?.isoCode;
+      expect(updatedCurrencyIsoCode).toEqual("PLN");
+    });
+
+    it("should fetch product with changed currency after session update", async () => {
+      const apiInstance = createAPIClient<operations>({
+        baseURL,
+        accessToken,
+      });
+
+      const sessionResponse = await apiInstance.invoke(
+        "readContext get /context",
+      );
+
+      const currentIsoCode = sessionResponse.data.currency?.isoCode;
+      expect(currentIsoCode).toEqual("EUR");
+
+      const firstProductResponse = await apiInstance.invoke(
+        "readProduct post /product",
+        {
+          body: {
+            ids: ["47b8141e5d8b4aceb25014367e955da3"],
+          },
+        },
+      );
+      const firstProductPrice =
+        firstProductResponse.data.elements[0].calculatedPrice.unitPrice;
+      expect(firstProductPrice).toBeGreaterThan(0);
+
+      const availableCurrencies = await apiInstance.invoke(
+        "readCurrency post /currency",
+      );
+      const differentCurrency = availableCurrencies.data.find(
+        (currency) => currency.isoCode === "PLN",
+      );
+      await apiInstance.invoke("updateContext patch /context", {
+        body: {
+          currencyId: differentCurrency?.id,
+        },
+      });
+
+      const productResponse = await apiInstance.invoke(
+        "readProduct post /product",
+        {
+          body: {
+            ids: ["47b8141e5d8b4aceb25014367e955da3"],
+          },
+        },
+      );
+      const newProductPrice =
+        productResponse.data.elements[0].calculatedPrice.unitPrice;
+      expect(newProductPrice).toBeGreaterThan(0);
+      expect(newProductPrice).not.toEqual(firstProductPrice);
+    });
+  });
+
+  describe("update session language", () => {
+    it("should update session language", async () => {
+      const apiInstance = createAPIClient<operations>({
+        baseURL,
+        accessToken,
+      });
+
+      const sessionResponse = await apiInstance.invoke(
+        "readContext get /context",
+      );
+
+      const currentLanguageId =
+        sessionResponse.data.context!.languageIdChain![0];
+      expect(currentLanguageId).toEqual("2fbb5fe2e29a4d70aa5854ce7ce3e20b");
+
+      const availableLanguages = await apiInstance.invoke(
+        "readLanguages post /language",
+      );
+
+      const differentLanguage = availableLanguages.data.elements.find(
+        (language) => language.id !== currentLanguageId,
+      );
+
+      await apiInstance.invoke("updateContext patch /context", {
+        body: {
+          languageId: differentLanguage!.id,
+        },
+      });
+
+      const updatedSessionContext = await apiInstance.invoke(
+        "readContext get /context",
+      );
+      const updatedLanguageId =
+        updatedSessionContext.data.context!.languageIdChain![0];
+      expect(updatedLanguageId).toEqual(differentLanguage?.id);
+    });
+
+    it("should fetch product with changed language after session update", async () => {
+      const apiInstance = createAPIClient<operations>({
+        baseURL,
+        accessToken,
+      });
+
+      const sessionResponse = await apiInstance.invoke(
+        "readContext get /context",
+      );
+
+      const currentLanguageId =
+        sessionResponse.data.context!.languageIdChain![0];
+      expect(currentLanguageId).toEqual("2fbb5fe2e29a4d70aa5854ce7ce3e20b");
+
+      const firstProductResponse = await apiInstance.invoke(
+        "readProduct post /product",
+        {
+          body: {
+            ids: ["47b8141e5d8b4aceb25014367e955da3"],
+          },
+        },
+      );
+      const firstProductName =
+        firstProductResponse.data.elements[0].translated.name;
+      expect(firstProductName).not.toBe("");
+
+      const availableLanguages = await apiInstance.invoke(
+        "readLanguages post /language",
+      );
+
+      const differentLanguage = availableLanguages.data.elements.find(
+        (language) => language.name === "Polski",
+      );
+
+      await apiInstance.invoke("updateContext patch /context", {
+        body: {
+          languageId: differentLanguage!.id,
+        },
+      });
+
+      const productResponse = await apiInstance.invoke(
+        "readProduct post /product",
+        {
+          body: {
+            ids: ["47b8141e5d8b4aceb25014367e955da3"],
+          },
+        },
+      );
+      const newProductName = productResponse.data.elements[0].translated.name;
+      expect(newProductName).not.toBe("");
+      expect(newProductName).not.toEqual(firstProductName);
+    });
+  });
+});
diff --git a/packages/composables/src/_test/useSetup.ts b/packages/composables/src/_test/useSetup.ts
index 226529ad..1261d90b 100644
--- a/packages/composables/src/_test/useSetup.ts
+++ b/packages/composables/src/_test/useSetup.ts
@@ -4,11 +4,7 @@ import { defineComponent, h } from "vue";
 import { defu } from "defu";
 
 type Injections = {
-  shopware: {
-    apiInstance: {
-      config: Record<string, unknown>;
-    };
-  };
+  shopware: unknown;
   apiClient: {
     invoke: ReturnType<typeof vi.fn>;
   };
@@ -16,11 +12,7 @@ type Injections = {
 
 export function useSetup<V>(setup: () => V, customMocks?: Partial<Injections>) {
   const defaultInjections: Injections = {
-    shopware: {
-      apiInstance: {
-        config: {},
-      },
-    },
+    shopware: {},
     apiClient: { invoke: customMocks?.apiClient?.invoke ?? vi.fn() },
   };
 
diff --git a/packages/composables/src/useCartItem.test.ts b/packages/composables/src/useCartItem.test.ts
index b280fe7d..cc955983 100644
--- a/packages/composables/src/useCartItem.test.ts
+++ b/packages/composables/src/useCartItem.test.ts
@@ -1,5 +1,5 @@
 import { useCartItem } from "./useCartItem";
-import { describe, expect, it } from "vitest";
+import { beforeEach, describe, expect, it, vi } from "vitest";
 import { useSetup } from "./_test";
 import { ref } from "vue";
 import type { Ref } from "vue";
@@ -8,7 +8,24 @@ import Cart from "./mocks/Cart";
 
 const lineItem = Cart.lineItems[0];
 
+const removeItemSpy = vi.fn();
+const changeProductQuantitySpy = vi.fn();
+vi.mock("./useCart.ts", async () => {
+  return {
+    useCart: () => {
+      return {
+        removeItem: removeItemSpy,
+        changeProductQuantity: changeProductQuantitySpy,
+      };
+    },
+  };
+});
+
 describe("useCartItem", () => {
+  beforeEach(() => {
+    vi.clearAllMocks();
+  });
+
   it("init cart item", () => {
     const { vm } = useSetup(() =>
       useCartItem(ref(lineItem) as unknown as Ref<Schemas["LineItem"]>),
@@ -28,37 +45,82 @@ describe("useCartItem", () => {
     expect(vm.itemOptions).toStrictEqual([]);
   });
 
-  it("remove item", () => {
-    const { vm, injections } = useSetup(() =>
-      useCartItem(ref(lineItem) as unknown as Ref<Schemas["LineItem"]>),
+  it("should show item options", async () => {
+    const payload = {
+      options: [
+        {
+          group: "test",
+          option: "test",
+          translated: {
+            group: "test",
+            option: "test",
+          },
+        },
+      ],
+    } as Schemas["ProductJsonApi"];
+
+    const { vm } = useSetup(() =>
+      useCartItem(
+        ref({
+          type: "product",
+          payload,
+        } as Schemas["LineItem"]),
+      ),
     );
-    injections.apiClient.invoke.mockResolvedValue({ data: {} });
-    vm.removeItem();
 
-    expect(injections.apiClient.invoke).toHaveBeenCalledWith(
-      expect.stringContaining("removeLineItem"),
-      expect.objectContaining({
-        body: {
-          ids: [lineItem.id],
-        },
-      }),
+    expect(vm.itemOptions).toStrictEqual(payload.options);
+  });
+
+  it("should show default empty options", async () => {
+    const payload = {} as Schemas["ProductJsonApi"];
+
+    const { vm } = useSetup(() =>
+      useCartItem(
+        ref({
+          type: "product",
+          payload,
+        } as Schemas["LineItem"]),
+      ),
     );
+
+    expect(vm.itemOptions).toStrictEqual([]);
   });
 
-  it("get product item seo url data", () => {
-    const { vm, injections } = useSetup(() =>
+  it("should remove item from the cart", async () => {
+    const { vm } = useSetup(() =>
       useCartItem(ref(lineItem) as unknown as Ref<Schemas["LineItem"]>),
     );
-    injections.apiClient.invoke.mockResolvedValue({ data: {} });
-    vm.getProductItemSeoUrlData();
+    const mockedResponse = {
+      test: 123,
+    };
+    removeItemSpy.mockResolvedValueOnce(mockedResponse);
+    const result = await vm.removeItem();
 
-    expect(injections.apiClient.invoke).toHaveBeenCalledWith(
-      expect.stringContaining("readProductDetail"),
-      expect.objectContaining({
-        pathParams: {
-          productId: lineItem.id,
-        },
-      }),
+    expect(removeItemSpy).toHaveBeenCalledWith(lineItem);
+    expect(result).toEqual(mockedResponse);
+  });
+
+  it("should change item quantity", async () => {
+    const { vm } = useSetup(() =>
+      useCartItem(ref(lineItem) as unknown as Ref<Schemas["LineItem"]>),
     );
+    const mockedResponse = {
+      test: 123,
+    };
+    changeProductQuantitySpy.mockResolvedValueOnce(mockedResponse);
+    const result = await vm.changeItemQuantity(5);
+
+    expect(changeProductQuantitySpy).toHaveBeenCalledWith({
+      quantity: 5,
+      id: lineItem.id,
+    });
+    expect(result).toEqual(mockedResponse);
+
+    // @ts-expect-error it should not be allowed by typescript, but still should work properly
+    vm.changeItemQuantity("6");
+    expect(changeProductQuantitySpy).toHaveBeenCalledWith({
+      quantity: 6,
+      id: lineItem.id,
+    });
   });
 });
diff --git a/packages/helpers/src/_parseUrlQuery.test.ts b/packages/helpers/src/_parseUrlQuery.test.ts
deleted file mode 100644
index 03b68560..00000000
--- a/packages/helpers/src/_parseUrlQuery.test.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { _parseUrlQuery } from "./urlHelpers";
-
-describe("_parseUrlQuery", () => {
-  it("should return an empty object if query is null", () => {
-    const query = null;
-    const result = _parseUrlQuery(query);
-    expect(result).toEqual({});
-  });
-
-  it("should return an empty object if query is not an object", () => {
-    const query = "invalid query";
-    const result = _parseUrlQuery(query);
-    expect(result).toEqual({});
-  });
-
-  it("should parse JSON values in the query", () => {
-    const query = {
-      param1: '{"key": "value"}',
-      param2: "[1, 2, 3]",
-    };
-    const result = _parseUrlQuery(query);
-    expect(result.param1).toEqual({ key: "value" });
-    expect(result.param2).toEqual([1, 2, 3]);
-  });
-
-  it("should handle invalid JSON values in the query", () => {
-    const query = {
-      param1: '{"key": "value}',
-      param2: "invalid json",
-    };
-    const result = _parseUrlQuery(query);
-    expect(result.param1).toBeUndefined();
-    expect(result.param2).toBe("invalid json");
-  });
-});
diff --git a/packages/helpers/src/debounce.test.ts b/packages/helpers/src/debounce.test.ts
deleted file mode 100644
index 47338abb..00000000
--- a/packages/helpers/src/debounce.test.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
-import { _debounce } from "./_debounce";
-describe("Shopware helpers - debounce", () => {
-  beforeEach(() => {
-    // tell vitest we use mocked time
-    vi.useFakeTimers();
-  });
-
-  afterEach(() => {
-    // restoring date after each test run
-    vi.useRealTimers();
-  });
-  it("should invoke passed function in default timeout", () => {
-    const func = vi.fn();
-    const debouncedFunc = _debounce(func);
-    debouncedFunc();
-    expect(func).not.toBeCalled();
-    vi.runAllTimers();
-    expect(func).toHaveBeenCalledTimes(1);
-  });
-  it("should invoke debounce two times and clear the previous invocation", () => {
-    const func = vi.fn();
-    const debouncedFunc = _debounce(func, 500);
-    debouncedFunc();
-    expect(func).not.toBeCalled();
-    debouncedFunc();
-    vi.runOnlyPendingTimers();
-    expect(func).toHaveBeenCalledTimes(1);
-  });
-});
diff --git a/packages/helpers/src/index.test.ts b/packages/helpers/src/index.test.ts
index 971daa9c..5775bc7d 100644
--- a/packages/helpers/src/index.test.ts
+++ b/packages/helpers/src/index.test.ts
@@ -5,8 +5,6 @@ describe("helpers - test global API", () => {
   it("global API should match snapshot", () => {
     expect(helpers).toMatchInlineSnapshot(`
       {
-        "_debounce": [Function],
-        "_parseUrlQuery": [Function],
         "buildUrlPrefix": [Function],
         "canUseQuoteActions": [Function],
         "downloadFile": [Function],
@@ -30,7 +28,6 @@ describe("helpers - test global API", () => {
         "getProductRatingAverage": [Function],
         "getProductReviews": [Function],
         "getProductRoute": [Function],
-        "getProductThumbnailUrl": [Function],
         "getProductTierPrices": [Function],
         "getProductUrl": [Function],
         "getShippingMethodDeliveryTime": [Function],
diff --git a/packages/helpers/src/media/getBiggestThumbnailUrl.test.ts b/packages/helpers/src/media/getBiggestThumbnailUrl.test.ts
index cada5bf8..987265bc 100644
--- a/packages/helpers/src/media/getBiggestThumbnailUrl.test.ts
+++ b/packages/helpers/src/media/getBiggestThumbnailUrl.test.ts
@@ -1,5 +1,5 @@
 import { describe, expect, it } from "vitest";
-import { getBiggestThumbnailUrl } from "./image";
+import { getBiggestThumbnailUrl } from "./getBiggestThumbnailUrl";
 
 describe("getBiggestThumbnailUrl", () => {
   it("should return undefined if media is undefined", () => {
diff --git a/packages/helpers/src/media/getSmallestThumbnailUrl.test.ts b/packages/helpers/src/media/getSmallestThumbnailUrl.test.ts
index 78837d46..43a29a81 100644
--- a/packages/helpers/src/media/getSmallestThumbnailUrl.test.ts
+++ b/packages/helpers/src/media/getSmallestThumbnailUrl.test.ts
@@ -1,5 +1,5 @@
 import { describe, expect, it } from "vitest";
-import { getSmallestThumbnailUrl } from "./image";
+import { getSmallestThumbnailUrl } from "./getSmallestThumbnailUrl";
 
 describe("getSmallestThumbnailUrl", () => {
   it("should return undefined if media is undefined", () => {
diff --git a/packages/helpers/src/media/getSrcSetForMedia.test.ts b/packages/helpers/src/media/getSrcSetForMedia.test.ts
index bf4fe1a5..cd52f125 100644
--- a/packages/helpers/src/media/getSrcSetForMedia.test.ts
+++ b/packages/helpers/src/media/getSrcSetForMedia.test.ts
@@ -1,5 +1,5 @@
 import { describe, expect, it } from "vitest";
-import { getSrcSetForMedia } from "./image";
+import { getSrcSetForMedia } from "./getSrcSetForMedia";
 
 describe("getSrcSetForMedia", () => {
   it("should return an empty string if media is undefined", () => {