+
+
+```
diff --git a/apps/docs/vue/getting-started/mutation.md b/apps/docs/vue/getting-started/mutation.md
new file mode 100644
index 00000000..c4628956
--- /dev/null
+++ b/apps/docs/vue/getting-started/mutation.md
@@ -0,0 +1,111 @@
+---
+sidebar_position: 4
+---
+
+# Mutation
+
+The `useMutation` composable allow you to sign & submit transaction to a chain.
+
+## Connect wallet & accounts
+
+Follow the [Connect wallets](./connect-wallets.mdx) guide to get this set up.
+
+## Choose the signer
+
+There are multiple way to select the account used for signing.
+
+### 1. Via dependency injection
+
+```vue
+
+```
+
+### 2. Passing signer to the composable
+
+```vue
+
+```
+
+### 2. Passing signer to the final submission
+
+```vue
+
+```
+
+## Submitting transaction
+
+```vue
+
+
+
+
No transaction submitted yet
+
Submitting transaction...
+
Error submitting transaction!
+
+ Submitted tx with hash: {{ status.txHash }}, with the current state of:
+ {{ remarkState.type }}
+
+
+```
+
+## Watching transactions
+
+It’s common to watch for all transactions throughout the application to display an appropriate loading state or toast. This can be easily achieved with the [`useMutationEffect`](/api/vue/function/useMutationEffect) composable.
+
+```vue
+
+```
diff --git a/apps/docs/vue/getting-started/query.md b/apps/docs/vue/getting-started/query.md
new file mode 100644
index 00000000..29478e74
--- /dev/null
+++ b/apps/docs/vue/getting-started/query.md
@@ -0,0 +1,166 @@
+---
+sidebar_position: 2
+---
+
+# Query
+
+The [`useQuery`](/api/vue/function/useQuery) composable allow you to read any data from chain, while maintaining updates, concurrency, caching & deduplication behind the scene for you.
+
+## Async handling
+
+[`useQuery`](/api/vue/function/useQuery) utilize Vue's Suspense API for data fetching & error handling.
+
+```vue title="async-component.vue"
+
+
+
+
Active era: {{ activeEra.toLocaleString() }}
+
+```
+
+```vue title="app.vue"
+
+
+
+
+
+ Loading...
+
+
+```
+
+## Fetching multiple data
+
+Fetching multiple data can be done by chaining queries together, [`useQuery`](/api/vue/function/useQuery) (with TypeScript) will automatically infer that you want to fetch multiple data concurrently & will return an array of data instead.
+
+```vue
+
+```
+
+Multiple queries of the same type can also be fetched using [`callApis`](/api/core/class/Query#callApis) & [`readStorages`](/api/core/class/Query#readStorages).
+
+```vue
+
+```
+
+## Conditional query
+
+Use a falsy value (`undefined`, `null` or `false`) to conditionally fetch data. If the query builder returns a falsy value, ReactiveDOT will not execute the query.
+
+```vue
+
+```
+
+## Refreshing queries
+
+Certain query, like runtime API calls & reading of storage entries doesn't create any subscriptions. In order to get the latest data, they must be manually refreshed.
+
+```vue
+
+
+
+
+
{{ pendingRewards.toLocaleString() }}
+
+
+
+```
+
+## Retry failed query
+
+Error from queries can be reset using `ErrorBoundary` & [`useQueryErrorResetter`](/api/vue/function/useQueryErrorResetter) composable.
+
+```vue
+
+
+
+
+
+ Oops, something went wrong!
+
+
+
+
+
+ Loading...
+
+
+```
diff --git a/apps/docs/vue/getting-started/setup.mdx b/apps/docs/vue/getting-started/setup.mdx
new file mode 100644
index 00000000..a5cf9e40
--- /dev/null
+++ b/apps/docs/vue/getting-started/setup.mdx
@@ -0,0 +1,182 @@
+---
+sidebar_position: 1
+---
+
+import Admonition from "@theme/Admonition";
+import TabItem from "@theme/TabItem";
+import Tabs from "@theme/Tabs";
+
+# Setup
+
+This walks you through the process of creating a simple ReactiveDOT application.
+
+
+ This project is under active development, and the API may change at any time.
+
+
+## Installation
+
+First add ReactiveDOT, along with required packages as dependencies to your Vue project.
+
+```bash npm2yarn
+npm install @reactive-dot/vue polkadot-api
+```
+
+## Download & sync metadata
+
+Next, download the latest metadata from the chain you want to connect to and generate the types.
+
+```sh
+# `papi add` is the command
+# `dot` is the name we're giving to this chain (can be any JS variable name)
+# `-n polkadot` specifies to download the metadata from the well-known chain polkadot
+npx papi add dot -n polkadot
+# Wait for the latest metadata to download, then generate the types:
+npx papi
+```
+
+:::info
+
+For more information on metadata syncing and type generation, please refer to this [documentation](https://papi.how/codegen) provided by [Polkadot-API](https://papi.how/).
+
+:::
+
+## Create config
+
+{/* prettier-ignore-start */}
+
+
+
+
+{/* prettier-ignore-end */}
+
+```ts title="config.ts"
+// `dot` is the name we gave to `npx papi add`
+import { dot } from "@polkadot-api/descriptors";
+import { defineConfig } from "@reactive-dot/core";
+import { InjectedWalletProvider } from "@reactive-dot/core/wallets.js";
+import { chainSpec } from "polkadot-api/chains/polkadot";
+import { getSmProvider } from "polkadot-api/sm-provider";
+import { startFromWorker } from "polkadot-api/smoldot/from-worker";
+
+const smoldot = startFromWorker(
+ new Worker(new URL("polkadot-api/smoldot/worker", import.meta.url), {
+ type: "module",
+ }),
+);
+
+export const config = defineConfig({
+ chains: {
+ // "polkadot" here can be any unique string value
+ polkadot: {
+ descriptor: dot,
+ provider: getSmProvider(smoldot.addChain({ chainSpec })),
+ },
+ },
+ wallets: [new InjectedWalletProvider()],
+});
+```
+
+{/* prettier-ignore-start */}
+
+
+
+
+{/* prettier-ignore-end */}
+
+```ts title="config.ts"
+import { dot } from "@polkadot-api/descriptors";
+import { getWsProvider } from "@polkadot-api/ws-provider/web";
+import { defineConfig } from "@reactive-dot/core";
+import { InjectedWalletProvider } from "@reactive-dot/core/wallets.js";
+
+export const config = defineConfig({
+ chains: {
+ polkadot: {
+ descriptor: dot,
+ provider: getWsProvider("wss://polkadot-rpc.publicnode.com"),
+ },
+ },
+ wallets: [new InjectedWalletProvider()],
+});
+```
+
+{/* prettier-ignore-start */}
+
+
+
+
+{/* prettier-ignore-end */}
+
+## Add type information
+
+The type declarations extension here will be used to provide you with the right type definitions when using composables.
+
+```ts title="reactive-dot.d.ts"
+import type { config } from "./config.js";
+
+declare module "@reactive-dot/core" {
+ export interface Register {
+ config: typeof config;
+ }
+}
+```
+
+## Install the plugin
+
+```tsx title="index.ts"
+import App from "./app.vue";
+import { config } from "./config.js";
+import { ReactiveDotPlugin } from "@reactive-dot/vue";
+import { createApp } from "vue";
+
+createApp(App).use(ReactiveDotPlugin, config).mount("#root");
+```
+
+## Provide the target chain ID
+
+```vue title="app.vue"
+
+
+
+
+
+```
+
+## Use ReactiveDOT
+
+```vue title="my-component.vue"
+
+
+
+
+
+
+
Address: {{ account.address }}
+
Name: {{ account.name }}
+
+
+
+
+ Latest block timestamp:
+ {{ new Date(Number(queryResult[0])).toLocaleString() }}
+
+
Total issuance: {{ queryResult[1].toString() }}
+
+
+
+```
diff --git a/apps/docs/vue/guides/_category_.json b/apps/docs/vue/guides/_category_.json
new file mode 100644
index 00000000..b07efb99
--- /dev/null
+++ b/apps/docs/vue/guides/_category_.json
@@ -0,0 +1,7 @@
+{
+ "label": "Guides",
+ "position": 2,
+ "link": {
+ "type": "generated-index"
+ }
+}
diff --git a/apps/docs/vue/guides/multichain.md b/apps/docs/vue/guides/multichain.md
new file mode 100644
index 00000000..eecf2e5c
--- /dev/null
+++ b/apps/docs/vue/guides/multichain.md
@@ -0,0 +1,193 @@
+---
+sidebar_position: 1
+---
+
+# Multichain
+
+## Setup
+
+Multichain setup can be done by adding extra chain configurations, after having followed this guide [here](../getting-started/setup.mdx).
+
+### Download & sync metadata
+
+Download the latest metadata from all chains you want to connect to and generate the types.
+
+```sh
+npx papi add dot -n polkadot
+npx papi add ksm -n ksmcc3
+npx papi add wnd -n westend2
+npx papi
+```
+
+### Add type information
+
+```ts title="reactive-dot.d.ts"
+import type { config } from "./config.js";
+
+declare module "@reactive-dot/core" {
+ export interface Register {
+ config: typeof config;
+ }
+}
+```
+
+### Configure chains
+
+```ts title="config.ts"
+import type { dot, ksm, wnd } from "@polkadot-api/descriptors";
+import { defineConfig } from "@reactive-dot/core";
+
+export const config = defineConfig({
+ chains: {
+ polkadot: {
+ descriptor: dot,
+ // ...
+ },
+ kusama: {
+ descriptor: ksm,
+ // ...
+ },
+ westend: {
+ descriptor: wnd,
+ // ...
+ },
+ },
+ //...
+});
+```
+
+## Chain selection
+
+Chain selection can be done either at the Context or Composable level.
+
+### Dependency injection
+
+```vue
+
+
+
+
+
+
+```
+
+### Composable
+
+All composables provide an option to specify which chain to target.
+
+```vue
+
+```
+
+## Chain narrowing
+
+By default, ReactiveDOT merges type definitions from all the chains in the config. For instance, if your DApp is set up to work with Polkadot, Kusama, and Westend, the following code will fail because the Bounties pallet is available only on Polkadot and Kusama, not on Westend:
+
+```vue
+
+```
+
+To resolve this, you can explicitly specify the chain to query, which will override the chain ID provided by context:
+
+```vue
+
+```
+
+Alternatively, if you want to keep using the chain ID provided by context, you can use the following pattern:
+
+```vue
+
+```
+
+Finally, if your application primarily uses a few chains but interacts with many other supporting chains, you can use the `targetChains` option:
+
+```ts
+import { defineConfig } from "@reactive-dot/core";
+
+const config = defineConfig({
+ chains: {
+ polkadot: {
+ // ...
+ },
+ polkadot_asset_hub: {
+ // ...
+ },
+ polkadot_people: {
+ // ...
+ },
+ polkadot_collectives: {
+ // ...
+ },
+ polkadot_bridge_hub: {
+ // ...
+ },
+ },
+ // This will restrict the default chain types used by composables
+ // to just Polkadot when no explicit `chainId` is provided
+ targetChains: ["polkadot"],
+ // ...
+});
+```
diff --git a/apps/docs/vue/guides/number-utility.md b/apps/docs/vue/guides/number-utility.md
new file mode 100644
index 00000000..f5a24d28
--- /dev/null
+++ b/apps/docs/vue/guides/number-utility.md
@@ -0,0 +1,92 @@
+---
+sidebar_position: 2
+---
+
+# Number utility
+
+## Denominated number
+
+To handle complexity around [planck unit](https://wiki.polkadot.network/docs/learn-DOT#the-planck-unit) used in Polkadot, a utility class [`DenominatedNumber`](/api/utils/class/DenominatedNumber) is provided by [`@reactive-dot/utils`](https://reactivedot.dev/api/utils).
+
+```ts
+import { DenominatedNumber } from "@reactive-dot/utils";
+
+// Denominated numbers are created with a planck value and a decimal places number
+
+const numberFromPlanck = new DenominatedNumber(10_000_000_000n, 10);
+
+console.log(numberFromPlanck.valueOf()); // 10
+
+// Denominated number can also be created from number instead of planck
+
+const numberFromNumber = DenominatedNumber.fromNumber(10, 10);
+
+console.log(numberFromNumber.planck); // 10000000000n
+
+// A string denomination can optionally be added for locale string conversion capability
+
+const numberWithDenomination = DenominatedNumber.fromNumber(10, 10, "DOT");
+
+console.log(numberWithDenomination.toLocaleString("en-NZ")); // DOT 10.00
+
+console.log(numberWithDenomination.toLocaleString("de-DE")); // 10,00 DOT
+
+// Arithmetics
+
+let dotAmount = DenominatedNumber.fromNumber(10, 10, "DOT");
+
+// Arithmetic operations can be performed using the number's planck value
+
+dotAmount = dotAmount.mapFromPlanck((planck) => planck + 5_000_000_000n);
+
+console.log(dotAmount.toLocaleString()); // DOT 10.50
+
+// Arithmetic operations can also be carried out with the number value
+// instead of planck if possible lost of precision is acceptable
+
+dotAmount = dotAmount.mapFromNumber((number) => (number * 2) / 4);
+
+console.log(dotAmount.toLocaleString()); // DOT 5.25
+```
+
+## Native token
+
+The [`useNativeToken`](/api/vue/function/useNativeToken) composable is also provided for easy conversion from planck and/or number value to native token amount.
+
+```vue
+
+```
+
+## Spendable balance
+
+The [`useSpendableBalance`](/api/vue/function/useSpendableBalance) composable can be used to get the [spendable balance](https://wiki.polkadot.network/docs/learn-account-balances) of an account(s).
+
+```vue
+
+```
diff --git a/apps/docs/vue/guides/usinng-papi.md b/apps/docs/vue/guides/usinng-papi.md
new file mode 100644
index 00000000..fcb0e730
--- /dev/null
+++ b/apps/docs/vue/guides/usinng-papi.md
@@ -0,0 +1,59 @@
+---
+sidebar_position: 3
+---
+
+# Using Polkadot-API (PAPI)
+
+ReactiveDOT is designed as a convenient layer over [PAPI](https://papi.how/) for enhanced developer quality of life. For more advanced use cases and data manipulation, it's recommended to use [PAPI](https://papi.how/) directly. You can access PAPI APIs through two composables: [`useClient`](/api/vue/function/useClient) and [`useTypedApi`](/api/vue/function/useTypedApi).
+
+## Polkadot client
+
+`PolkadotClient` interface shapes the top-level API for `polkadot-api`. You can find the full documentation [here](https://papi.how/client).
+
+```vue
+
+```
+
+## Typed API
+
+The `TypedApi` allows easy interaction with the runtime metadata, with a great developer experience. You can find the full documentation [here](https://papi.how/typed).
+
+```ts
+import { useTypedApi } from "@reactive-dot/vue";
+
+function Component() {
+ const typedApi = useTypedApi();
+
+ useEffect(() => {
+ typedApi.event.Balances.Burned.watch(({ amount }) => amount > 10n ** 10n)
+ .pipe(take(5))
+ .forEach(console.log);
+ }, [typedApi]);
+}
+```
+
+```vue
+
+```