diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 1d7ac851e..1a2e0d826 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,3 +1,9 @@
{
- "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "esbenp.prettier-vscode",
+ "clinyong.vscode-css-modules",
+ "vunguyentuan.vscode-css-variables",
+ "vunguyentuan.vscode-postcss"
+ ]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 972153487..068482665 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -19,5 +19,12 @@
{
"mode": "auto"
}
+ ],
+ "cssVariables.lookupFiles": [
+ "**/*.css",
+ "**/*.scss",
+ "**/*.sass",
+ "**/*.less",
+ "node_modules/@mantine/core/styles.css"
]
}
diff --git a/apps/xmtp.chat/README.md b/apps/xmtp.chat/README.md
new file mode 100644
index 000000000..3180c2a3b
--- /dev/null
+++ b/apps/xmtp.chat/README.md
@@ -0,0 +1,19 @@
+# xmtp.chat app
+
+Use this React app as a tool to start building an app with XMTP.
+
+The app is built using the [XMTP client browser SDK](/sdks/browser-sdk/README.md), [React](https://react.dev/), and [RainbowKit](https://www.rainbowkit.com/).
+
+To keep up with the latest React app developments, see the [Issues tab](https://github.com/xmtp/xmtp-js/issues) in this repo.
+
+To learn more about XMTP and get answers to frequently asked questions, see the [XMTP documentation](https://xmtp.org/docs).
+
+### Limitations
+
+This React app isn't a complete solution. For example, the list of conversations doesn't update when new messages arrive in existing conversations.
+
+## Useful commands
+
+- `yarn clean`: Removes `node_modules` and `.turbo` folders
+- `yarn dev`: Runs the app in development mode
+- `yarn typecheck`: Runs `tsc`
diff --git a/examples/react-vite-browser-sdk/index.html b/apps/xmtp.chat/index.html
similarity index 74%
rename from examples/react-vite-browser-sdk/index.html
rename to apps/xmtp.chat/index.html
index 31cf5d729..3533b8512 100644
--- a/examples/react-vite-browser-sdk/index.html
+++ b/apps/xmtp.chat/index.html
@@ -3,7 +3,8 @@
- XMTP V3 Browser SDK Example
+
+ XMTP Browser Developer Tools
diff --git a/apps/xmtp.chat/package.json b/apps/xmtp.chat/package.json
new file mode 100644
index 000000000..98ad855fc
--- /dev/null
+++ b/apps/xmtp.chat/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "@xmtp/xmtp.chat",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "exports": {
+ ".": "./src/index.ts"
+ },
+ "main": "src/index.ts",
+ "scripts": {
+ "build": "vite build",
+ "clean": "rm -rf .turbo && rm -rf node_modules && yarn clean:dist",
+ "clean:dist": "rm -rf dist",
+ "dev": "vite",
+ "typecheck": "tsc"
+ },
+ "dependencies": {
+ "@mantine/core": "^7.14.3",
+ "@mantine/form": "^7.14.3",
+ "@mantine/hooks": "^7.14.3",
+ "@mantine/modals": "^7.14.3",
+ "@mantine/notifications": "^7.14.3",
+ "@tanstack/react-query": "^5.61.5",
+ "@xmtp/browser-sdk": "^0.0.13",
+ "@xmtp/content-type-group-updated": "^2.0.0",
+ "@xmtp/content-type-primitives": "^2.0.0",
+ "@xmtp/content-type-reaction": "^2.0.0",
+ "@xmtp/content-type-remote-attachment": "^2.0.0",
+ "@xmtp/content-type-reply": "^2.0.0",
+ "@xmtp/content-type-text": "^2.0.0",
+ "date-fns": "^4.1.0",
+ "react": "^18.3.1",
+ "react-18-blockies": "^1.0.6",
+ "react-confetti": "^6.1.0",
+ "react-dom": "^18.3.1",
+ "react-router": "^7.0.2",
+ "uint8array-extras": "^1.4.0",
+ "viem": "^2.21.52",
+ "wagmi": "^2.13.2"
+ },
+ "devDependencies": {
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.1",
+ "@vitejs/plugin-react": "^4.3.3",
+ "postcss": "^8.4.49",
+ "postcss-preset-mantine": "^1.17.0",
+ "postcss-simple-vars": "^7.0.1",
+ "tsconfig": "workspace:*",
+ "typescript": "^5.7.2",
+ "vite": "^6.0.2"
+ }
+}
diff --git a/apps/xmtp.chat/postcss.config.cjs b/apps/xmtp.chat/postcss.config.cjs
new file mode 100644
index 000000000..e817f567b
--- /dev/null
+++ b/apps/xmtp.chat/postcss.config.cjs
@@ -0,0 +1,14 @@
+module.exports = {
+ plugins: {
+ "postcss-preset-mantine": {},
+ "postcss-simple-vars": {
+ variables: {
+ "mantine-breakpoint-xs": "36em",
+ "mantine-breakpoint-sm": "48em",
+ "mantine-breakpoint-md": "62em",
+ "mantine-breakpoint-lg": "75em",
+ "mantine-breakpoint-xl": "88em",
+ },
+ },
+ },
+};
diff --git a/apps/xmtp.chat/public/favicon.ico b/apps/xmtp.chat/public/favicon.ico
new file mode 100644
index 000000000..f12d61770
Binary files /dev/null and b/apps/xmtp.chat/public/favicon.ico differ
diff --git a/examples/react-vite-browser-sdk/public/xmtp-icon.png b/apps/xmtp.chat/public/xmtp-icon.png
similarity index 100%
rename from examples/react-vite-browser-sdk/public/xmtp-icon.png
rename to apps/xmtp.chat/public/xmtp-icon.png
diff --git a/apps/xmtp.chat/src/assets/xmtp-icon.png b/apps/xmtp.chat/src/assets/xmtp-icon.png
new file mode 100644
index 000000000..6c610d7d8
Binary files /dev/null and b/apps/xmtp.chat/src/assets/xmtp-icon.png differ
diff --git a/apps/xmtp.chat/src/components/Actions.tsx b/apps/xmtp.chat/src/components/Actions.tsx
new file mode 100644
index 000000000..1bc350512
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Actions.tsx
@@ -0,0 +1,38 @@
+import { Button, Flex, useMatches } from "@mantine/core";
+import { useEffect, useRef } from "react";
+import { useNavigate } from "react-router";
+import { useClient } from "../hooks/useClient";
+import { IconMessagePlus } from "../icons/IconMessagePlus";
+import { useRefManager } from "./RefManager";
+
+export const Actions: React.FC = () => {
+ const { client } = useClient();
+ const navigate = useNavigate();
+ const { setRef } = useRefManager();
+ const ref = useRef(null);
+ const label: React.ReactNode = useMatches({
+ base: ,
+ sm: "New conversation",
+ });
+ const px = useMatches({
+ base: "xs",
+ sm: "md",
+ });
+ const handleClick = () => {
+ void navigate("/conversations/new");
+ };
+
+ useEffect(() => {
+ setRef("new-conversation-button", ref);
+ }, []);
+
+ return (
+ client && (
+
+
+ {label}
+
+
+ )
+ );
+};
diff --git a/apps/xmtp.chat/src/components/AddressBadge.tsx b/apps/xmtp.chat/src/components/AddressBadge.tsx
new file mode 100644
index 000000000..43c762d2e
--- /dev/null
+++ b/apps/xmtp.chat/src/components/AddressBadge.tsx
@@ -0,0 +1,68 @@
+import { Badge, Flex, Text, Tooltip } from "@mantine/core";
+import { useClipboard } from "@mantine/hooks";
+import { shortAddress } from "../helpers/address";
+
+export type AddressTooltipLabelProps = {
+ address: string;
+};
+
+export const AddressTooltipLabel: React.FC = ({
+ address,
+}) => {
+ return (
+
+ {address}
+
+ click to copy
+
+
+ );
+};
+
+export type AddressBadgeProps = {
+ address: string;
+};
+
+export const AddressBadge: React.FC = ({ address }) => {
+ const clipboard = useClipboard({ timeout: 1000 });
+
+ const handleCopy = () => {
+ clipboard.copy(address);
+ };
+
+ const handleKeyboardCopy = (event: React.KeyboardEvent) => {
+ if (event.key === "Enter" || event.key === " ") {
+ handleCopy();
+ }
+ };
+
+ return (
+ Copied!
+ ) : (
+
+ )
+ }
+ withArrow
+ events={{ hover: true, focus: true, touch: true }}>
+
+ {shortAddress(address)}
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/App.module.css b/apps/xmtp.chat/src/components/App.module.css
new file mode 100644
index 000000000..9e50b8ada
--- /dev/null
+++ b/apps/xmtp.chat/src/components/App.module.css
@@ -0,0 +1,13 @@
+@media (max-width: 48em) {
+ .main {
+ --app-shell-footer-offset: 0px !important;
+ }
+
+ .navbar {
+ --app-shell-footer-offset: 0px !important;
+ }
+
+ .footer {
+ --app-shell-footer-height: 0px;
+ }
+}
diff --git a/apps/xmtp.chat/src/components/App.tsx b/apps/xmtp.chat/src/components/App.tsx
new file mode 100644
index 000000000..99101c36f
--- /dev/null
+++ b/apps/xmtp.chat/src/components/App.tsx
@@ -0,0 +1,115 @@
+import {
+ AppShell,
+ Button,
+ Group,
+ Modal,
+ Stack,
+ Text,
+ Title,
+} from "@mantine/core";
+import { useDisclosure } from "@mantine/hooks";
+import { useEffect, useState } from "react";
+import { useLocation, useNavigate } from "react-router";
+import { useClient } from "../hooks/useClient";
+import classes from "./App.module.css";
+import { AppFooter } from "./AppFooter";
+import { AppHeader } from "./AppHeader";
+import { Main } from "./Main";
+import { Navbar } from "./Navbar";
+
+export const App: React.FC = () => {
+ const [opened, { toggle }] = useDisclosure();
+ const [collapsed, setCollapsed] = useState(true);
+ const [unhandledRejectionError, setUnhandledRejectionError] = useState<
+ string | null
+ >(null);
+ const { client } = useClient();
+ const location = useLocation();
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ if (!client && location.pathname !== "/") {
+ void navigate("/");
+ return;
+ }
+
+ if (
+ location.pathname.startsWith("/conversations") ||
+ location.pathname.startsWith("/identity")
+ ) {
+ setCollapsed(false);
+ } else {
+ setCollapsed(true);
+ }
+
+ if (location.pathname === "/" && client) {
+ void navigate("/conversations");
+ }
+ }, [location.pathname, client, navigate]);
+
+ useEffect(() => {
+ const handleUnhandledRejection = (event: PromiseRejectionEvent) => {
+ setUnhandledRejectionError(
+ (event.reason as Error).message || "Unknown error",
+ );
+ };
+ window.addEventListener("unhandledrejection", handleUnhandledRejection);
+ return () => {
+ window.removeEventListener(
+ "unhandledrejection",
+ handleUnhandledRejection,
+ );
+ };
+ }, []);
+
+ return (
+ <>
+ {unhandledRejectionError && (
+ {
+ setUnhandledRejectionError(null);
+ }}
+ withCloseButton={false}
+ centered>
+
+ Application error
+ {unhandledRejectionError}
+
+ {
+ setUnhandledRejectionError(null);
+ }}>
+ OK
+
+
+
+
+ )}
+
+
+
+
+
+ {client && }
+
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/AppFooter.tsx b/apps/xmtp.chat/src/components/AppFooter.tsx
new file mode 100644
index 000000000..1c1d67b2e
--- /dev/null
+++ b/apps/xmtp.chat/src/components/AppFooter.tsx
@@ -0,0 +1,67 @@
+import { Anchor, Box, Flex, Group, Image, Text } from "@mantine/core";
+import logo from "../assets/xmtp-icon.png";
+
+export const AppFooter: React.FC = () => {
+ return (
+ <>
+
+
+
+
+
+ XMTP
+
+
+
+
+
+
+ Contribute
+
+
+ •
+
+
+ Report an issue
+
+
+ •
+
+
+ Documentation
+
+
+ •
+
+
+ Forums
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/AppHeader.module.css b/apps/xmtp.chat/src/components/AppHeader.module.css
new file mode 100644
index 000000000..0065fe918
--- /dev/null
+++ b/apps/xmtp.chat/src/components/AppHeader.module.css
@@ -0,0 +1,6 @@
+.button {
+ background-color: light-dark(
+ var(--mantine-color-gray-0),
+ var(--mantine-color-dark-8)
+ );
+}
diff --git a/apps/xmtp.chat/src/components/AppHeader.tsx b/apps/xmtp.chat/src/components/AppHeader.tsx
new file mode 100644
index 000000000..2a68c0fa4
--- /dev/null
+++ b/apps/xmtp.chat/src/components/AppHeader.tsx
@@ -0,0 +1,51 @@
+import { Burger, Button, Flex } from "@mantine/core";
+import { useNavigate } from "react-router";
+import { shortAddress } from "../helpers/address";
+import { useClient } from "../hooks/useClient";
+import { Actions } from "./Actions";
+import classes from "./AppHeader.module.css";
+import { Connection } from "./Connection";
+
+export type AppHeaderProps = {
+ collapsed?: boolean;
+ opened: boolean;
+ toggle: () => void;
+};
+
+export const AppHeader: React.FC = ({
+ collapsed,
+ opened,
+ toggle,
+}) => {
+ const { client } = useClient();
+ const navigate = useNavigate();
+
+ const handleClick = () => {
+ void navigate("/identity");
+ };
+
+ return (
+
+
+ {!collapsed && (
+
+ )}
+
+ {client && (
+
+ {shortAddress(client.accountAddress)}
+
+ )}
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/BadgeWithCopy.module.css b/apps/xmtp.chat/src/components/BadgeWithCopy.module.css
new file mode 100644
index 000000000..0cf272788
--- /dev/null
+++ b/apps/xmtp.chat/src/components/BadgeWithCopy.module.css
@@ -0,0 +1,11 @@
+.badge {
+ background-color: light-dark(
+ var(--mantine-color-gray-1),
+ var(--mantine-color-dark-5)
+ );
+ color: light-dark(var(--mantine-color-light-4), var(--mantine-color-dark-1));
+}
+
+.button {
+ color: light-dark(var(--mantine-color-light-4), var(--mantine-color-dark-1));
+}
diff --git a/apps/xmtp.chat/src/components/BadgeWithCopy.tsx b/apps/xmtp.chat/src/components/BadgeWithCopy.tsx
new file mode 100644
index 000000000..3ab559628
--- /dev/null
+++ b/apps/xmtp.chat/src/components/BadgeWithCopy.tsx
@@ -0,0 +1,71 @@
+import { Badge, Button, Text, Tooltip } from "@mantine/core";
+import { useClipboard } from "@mantine/hooks";
+import { IconCopy } from "../icons/IconCopy";
+import classes from "./BadgeWithCopy.module.css";
+
+type CopyIconProps = {
+ value: string;
+};
+
+const CopyIcon: React.FC = ({ value }) => {
+ const clipboard = useClipboard({ timeout: 1000 });
+
+ const handleCopy = () => {
+ clipboard.copy(value);
+ };
+
+ const handleKeyboardCopy = (
+ event: React.KeyboardEvent,
+ ) => {
+ if (event.key === "Enter" || event.key === " ") {
+ handleCopy();
+ }
+ };
+
+ return (
+ Copied!
+ ) : (
+ {value}
+ )
+ }
+ withArrow
+ events={{ hover: true, focus: true, touch: true }}>
+
+
+
+
+ );
+};
+
+export type BadgeWithCopyProps = {
+ value: string;
+};
+
+export const BadgeWithCopy: React.FC = ({ value }) => {
+ return (
+ }>
+ {value}
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/CodeWithCopy.tsx b/apps/xmtp.chat/src/components/CodeWithCopy.tsx
new file mode 100644
index 000000000..524ab99bd
--- /dev/null
+++ b/apps/xmtp.chat/src/components/CodeWithCopy.tsx
@@ -0,0 +1,21 @@
+import { Box, Code } from "@mantine/core";
+import { CopyButton } from "./CopyButton";
+
+type CodeWithCopyProps = {
+ code: string;
+};
+
+export const CodeWithCopy: React.FC = ({ code }) => {
+ return (
+
+
+ {code}
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Composer.tsx b/apps/xmtp.chat/src/components/Composer.tsx
new file mode 100644
index 000000000..f156370f3
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Composer.tsx
@@ -0,0 +1,45 @@
+import { Button, Flex, TextInput } from "@mantine/core";
+import type { Conversation } from "@xmtp/browser-sdk";
+import { useState } from "react";
+import { useConversation } from "../hooks/useConversation";
+
+export type ComposerProps = {
+ conversation: Conversation;
+};
+
+export const Composer: React.FC = ({ conversation }) => {
+ const { send, sending } = useConversation(conversation);
+ const [message, setMessage] = useState("");
+
+ const handleSend = async () => {
+ await send(message);
+ setMessage("");
+ };
+
+ return (
+
+ {
+ if (event.key === "Enter") {
+ void handleSend();
+ }
+ }}
+ onChange={(e) => {
+ setMessage(e.target.value);
+ }}
+ />
+ void handleSend()}>
+ Send
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Connection.tsx b/apps/xmtp.chat/src/components/Connection.tsx
new file mode 100644
index 000000000..90f8f8198
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Connection.tsx
@@ -0,0 +1,136 @@
+import { Button, Flex, Loader, Text, useMatches } from "@mantine/core";
+import { useLocalStorage } from "@mantine/hooks";
+import type { ClientOptions, XmtpEnv } from "@xmtp/browser-sdk";
+import { useEffect, useRef } from "react";
+import { hexToUint8Array, uint8ArrayToHex } from "uint8array-extras";
+import { type Hex } from "viem";
+import { generatePrivateKey } from "viem/accounts";
+import { useConnect, useDisconnect, useWalletClient } from "wagmi";
+import { injected } from "wagmi/connectors";
+import { createEphemeralSigner, createSigner } from "../helpers/createSigner";
+import { useClient } from "../hooks/useClient";
+import { IconLogout } from "../icons/IconLogout";
+import { IconUser } from "../icons/IconUser";
+import { useRefManager } from "./RefManager";
+import { Settings } from "./Settings";
+
+export const Disconnect: React.FC = () => {
+ const { disconnect } = useDisconnect();
+ const { disconnect: disconnectClient } = useClient();
+ const label: React.ReactNode = useMatches({
+ base: ,
+ sm: "Disconnect",
+ });
+ const px = useMatches({
+ base: "xs",
+ sm: "md",
+ });
+
+ const handleDisconnect = () => {
+ disconnect(undefined, {
+ onSuccess: () => {
+ disconnectClient();
+ },
+ });
+ };
+ return (
+
+ {label}
+
+ );
+};
+
+export const Connect: React.FC = () => {
+ const { setRef } = useRefManager();
+ const ref = useRef(null);
+ const { initialize, initializing } = useClient();
+ const [encryptionKey] = useLocalStorage({
+ key: "XMTP_ENCRYPTION_KEY",
+ defaultValue: uint8ArrayToHex(crypto.getRandomValues(new Uint8Array(32))),
+ });
+ const [env] = useLocalStorage({
+ key: "XMTP_NETWORK",
+ defaultValue: "dev",
+ });
+ const [useEphemeralAccount] = useLocalStorage({
+ key: "XMTP_USE_EPHEMERAL_ACCOUNT",
+ defaultValue: false,
+ });
+ const [ephemeralAccountKey, setEphemeralAccountKey] =
+ useLocalStorage({
+ key: "XMTP_EPHEMERAL_ACCOUNT_KEY",
+ defaultValue: null,
+ });
+ const [loggingLevel] = useLocalStorage({
+ key: "XMTP_LOGGING_LEVEL",
+ defaultValue: "off",
+ });
+ const { connect } = useConnect();
+ const { data } = useWalletClient();
+ const label: React.ReactNode = useMatches({
+ base: ,
+ sm: "Connect",
+ });
+ const px = useMatches({
+ base: "xs",
+ sm: "md",
+ });
+
+ useEffect(() => {
+ setRef("connect-wallet-button", ref);
+ }, []);
+
+ useEffect(() => {
+ if (data?.account) {
+ void initialize({
+ encryptionKey: hexToUint8Array(encryptionKey),
+ env,
+ loggingLevel,
+ signer: createSigner(data.account.address, data),
+ });
+ }
+ }, [data, env]);
+
+ const handleConnect = () => {
+ const connectEphemeralAccount = async () => {
+ const key = ephemeralAccountKey || generatePrivateKey();
+ if (!ephemeralAccountKey) {
+ setEphemeralAccountKey(key);
+ }
+ const signer = createEphemeralSigner(key);
+ await initialize({
+ encryptionKey: hexToUint8Array(encryptionKey),
+ env,
+ loggingLevel,
+ signer,
+ });
+ };
+ if (!useEphemeralAccount) {
+ connect({ connector: injected() });
+ } else {
+ void connectEphemeralAccount();
+ }
+ };
+
+ return initializing ? (
+
+
+ Connecting...
+
+ ) : (
+
+ {label}
+
+ );
+};
+
+export const Connection: React.FC = () => {
+ const { client } = useClient();
+ return (
+
+ {!client && }
+ {client && }
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Conversation.tsx b/apps/xmtp.chat/src/components/Conversation.tsx
new file mode 100644
index 000000000..5f962d797
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Conversation.tsx
@@ -0,0 +1,104 @@
+import {
+ Button,
+ Flex,
+ Group,
+ LoadingOverlay,
+ ScrollArea,
+ Stack,
+ Text,
+ Title,
+} from "@mantine/core";
+import type { Conversation as XmtpConversation } from "@xmtp/browser-sdk";
+import { useEffect } from "react";
+import { Link, Outlet } from "react-router";
+import { useBodyClass } from "../hooks/useBodyClass";
+import { useConversation } from "../hooks/useConversation";
+import { Composer } from "./Composer";
+import { Messages } from "./Messages";
+import classes from "./ScrollFade.module.css";
+
+export type ConversationProps = {
+ conversation?: XmtpConversation;
+ loading: boolean;
+};
+
+export const Conversation: React.FC = ({
+ conversation,
+ loading,
+}) => {
+ useBodyClass("main-flex-layout");
+ const {
+ messages,
+ getMessages,
+ loading: conversationLoading,
+ syncing: conversationSyncing,
+ } = useConversation(conversation);
+
+ useEffect(() => {
+ const loadMessages = async () => {
+ await getMessages();
+ };
+ void loadMessages();
+ }, [conversation?.id]);
+
+ const handleSync = async () => {
+ await getMessages(undefined, true);
+ };
+
+ return (
+ <>
+
+ {conversation && (
+ <>
+
+ {conversation.name ? (
+ {conversation.name}
+ ) : (
+
+ Untitled
+
+ )}
+
+
+ Manage
+
+ void handleSync()}>
+ Sync
+
+
+
+
+ {loading || conversationLoading || messages.length === 0 ? (
+
+ {messages.length === 0 && No messages }
+
+ ) : (
+
+
+
+ )}
+
+
+
+ >
+ )}
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/ConversationCard.module.css b/apps/xmtp.chat/src/components/ConversationCard.module.css
new file mode 100644
index 000000000..faf885f92
--- /dev/null
+++ b/apps/xmtp.chat/src/components/ConversationCard.module.css
@@ -0,0 +1,8 @@
+.root:hover {
+ background-color: var(--mantine-color-default-hover);
+ cursor: pointer;
+}
+
+.root:focus {
+ border-color: var(--mantine-primary-color-filled);
+}
diff --git a/apps/xmtp.chat/src/components/ConversationCard.tsx b/apps/xmtp.chat/src/components/ConversationCard.tsx
new file mode 100644
index 000000000..1fd3ea5ab
--- /dev/null
+++ b/apps/xmtp.chat/src/components/ConversationCard.tsx
@@ -0,0 +1,84 @@
+import { Card, Flex, Stack, Text } from "@mantine/core";
+import {
+ SortDirection,
+ type Conversation,
+ type DecodedMessage,
+} from "@xmtp/browser-sdk";
+import { formatDistanceToNow } from "date-fns";
+import { useEffect, useState } from "react";
+import { useNavigate } from "react-router";
+import { nsToDate } from "../helpers/date";
+import { useConversation } from "../hooks/useConversation";
+import styles from "./ConversationCard.module.css";
+
+export type ConversationCardProps = {
+ conversation: Conversation;
+};
+
+export const ConversationCard: React.FC = ({
+ conversation,
+}) => {
+ const [memberCount, setMemberCount] = useState(0);
+ const navigate = useNavigate();
+ const [messageCount, setMessageCount] = useState(0);
+ const [lastMessage, setLastMessage] = useState(null);
+ const { getMessages } = useConversation(conversation);
+
+ useEffect(() => {
+ const loadMessages = async () => {
+ const messages = await getMessages({
+ direction: SortDirection.Descending,
+ limit: 1n,
+ });
+ setLastMessage(messages[0] ?? null);
+ setMessageCount(messages.length);
+ };
+ void loadMessages();
+ }, [conversation]);
+
+ useEffect(() => {
+ void conversation.members().then((members) => {
+ setMemberCount(members.length);
+ });
+ }, [conversation.id]);
+
+ return (
+ {
+ if (e.key === "Enter") {
+ void navigate(`/conversations/${conversation.id}`);
+ }
+ }}
+ onClick={() => void navigate(`/conversations/${conversation.id}`)}
+ style={{ cursor: "pointer" }}
+ classNames={{ root: styles.root }}>
+
+
+
+ {conversation.name || "Untitled"}
+
+
+
+ {memberCount} member{memberCount !== 1 ? "s" : ""}, {messageCount}{" "}
+ message{messageCount !== 1 ? "s" : ""}
+
+ {lastMessage && (
+
+ Last message sent{" "}
+ {formatDistanceToNow(nsToDate(lastMessage.sentAtNs), {
+ addSuffix: true,
+ })}
+
+ )}
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Conversations.tsx b/apps/xmtp.chat/src/components/Conversations.tsx
new file mode 100644
index 000000000..07d530f60
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Conversations.tsx
@@ -0,0 +1,5 @@
+import { Outlet } from "react-router";
+
+export const Conversations: React.FC = () => {
+ return ;
+};
diff --git a/apps/xmtp.chat/src/components/ConversationsNavbar.tsx b/apps/xmtp.chat/src/components/ConversationsNavbar.tsx
new file mode 100644
index 000000000..fd57826c6
--- /dev/null
+++ b/apps/xmtp.chat/src/components/ConversationsNavbar.tsx
@@ -0,0 +1,69 @@
+import {
+ AppShell,
+ Badge,
+ Button,
+ Group,
+ LoadingOverlay,
+ ScrollArea,
+ Stack,
+ Text,
+} from "@mantine/core";
+import type { Conversation } from "@xmtp/browser-sdk";
+import { useEffect, useState } from "react";
+import { useConversations } from "../hooks/useConversations";
+import { ConversationCard } from "./ConversationCard";
+
+export const ConversationsNavbar: React.FC = () => {
+ const { list, loading, syncing } = useConversations();
+ const [conversations, setConversations] = useState([]);
+
+ useEffect(() => {
+ const loadConversations = async () => {
+ const conversations = await list();
+ setConversations(conversations);
+ };
+ void loadConversations();
+ }, []);
+
+ const handleSync = async () => {
+ const conversations = await list(undefined, true);
+ setConversations(conversations);
+ };
+
+ return (
+ <>
+ {loading && }
+
+
+
+
+
+ Conversations
+
+
+ {conversations.length}
+
+
+ void handleSync()}>
+ Sync
+
+
+
+
+
+ {conversations.length === 0 ? (
+ No conversations found
+ ) : (
+
+ {conversations.map((conversation) => (
+
+ ))}
+
+ )}
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/CopyButton.module.css b/apps/xmtp.chat/src/components/CopyButton.module.css
new file mode 100644
index 000000000..1575c85f3
--- /dev/null
+++ b/apps/xmtp.chat/src/components/CopyButton.module.css
@@ -0,0 +1,3 @@
+.button {
+ color: light-dark(var(--mantine-color-light-4), var(--mantine-color-dark-1));
+}
diff --git a/apps/xmtp.chat/src/components/CopyButton.tsx b/apps/xmtp.chat/src/components/CopyButton.tsx
new file mode 100644
index 000000000..89b743ad0
--- /dev/null
+++ b/apps/xmtp.chat/src/components/CopyButton.tsx
@@ -0,0 +1,47 @@
+import { Button, Text, Tooltip } from "@mantine/core";
+import { useClipboard } from "@mantine/hooks";
+import { IconCopy } from "../icons/IconCopy";
+import classes from "./CopyButton.module.css";
+
+type CopyButtonProps = {
+ value: string;
+};
+
+export const CopyButton: React.FC = ({ value }) => {
+ const clipboard = useClipboard({ timeout: 1000 });
+
+ const handleCopy = () => {
+ clipboard.copy(value);
+ };
+
+ const handleKeyboardCopy = (
+ event: React.KeyboardEvent,
+ ) => {
+ if (event.key === "Enter" || event.key === " ") {
+ handleCopy();
+ }
+ };
+
+ return (
+ Copied!
+ ) : (
+ Copy
+ )
+ }
+ withArrow
+ events={{ hover: true, focus: true, touch: true }}>
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/DateLabel.tsx b/apps/xmtp.chat/src/components/DateLabel.tsx
new file mode 100644
index 000000000..705a21422
--- /dev/null
+++ b/apps/xmtp.chat/src/components/DateLabel.tsx
@@ -0,0 +1,64 @@
+import { Flex, Text, Tooltip } from "@mantine/core";
+import { useClipboard } from "@mantine/hooks";
+import { formatRFC3339, intlFormat } from "date-fns";
+
+export type DateLabelTooltipProps = {
+ date: Date;
+};
+
+export const DateLabelTooltip: React.FC = ({ date }) => {
+ return (
+
+ {formatRFC3339(date, { fractionDigits: 3 })}
+
+ click to copy
+
+
+ );
+};
+
+export type DateLabelProps = {
+ date: Date;
+};
+
+export const DateLabel: React.FC = ({ date }) => {
+ const clipboard = useClipboard({ timeout: 1000 });
+
+ const handleCopy = () => {
+ clipboard.copy(formatRFC3339(date, { fractionDigits: 3 }));
+ };
+
+ const handleKeyboardCopy = (event: React.KeyboardEvent) => {
+ if (event.key === "Enter" || event.key === " ") {
+ handleCopy();
+ }
+ };
+
+ return (
+ Copied!
+ ) : (
+
+ )
+ }
+ withArrow
+ events={{ hover: true, focus: true, touch: true }}>
+
+ {intlFormat(date, {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ })}
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Identity.tsx b/apps/xmtp.chat/src/components/Identity.tsx
new file mode 100644
index 000000000..9b46b5c11
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Identity.tsx
@@ -0,0 +1,151 @@
+import {
+ Button,
+ FocusTrap,
+ Group,
+ LoadingOverlay,
+ Modal,
+ Paper,
+ ScrollArea,
+ Stack,
+ Text,
+ Title,
+} from "@mantine/core";
+import { useEffect, useState } from "react";
+import { useNavigate } from "react-router";
+import { useBodyClass } from "../hooks/useBodyClass";
+import { useClient } from "../hooks/useClient";
+import { useIdentity } from "../hooks/useIdentity";
+import { BadgeWithCopy } from "./BadgeWithCopy";
+import { InstallationTable } from "./InstallationTable";
+import classes from "./ScrollFade.module.css";
+
+export const Identity: React.FC = () => {
+ useBodyClass("main-flex-layout");
+ const { client } = useClient();
+ const navigate = useNavigate();
+ const {
+ installations,
+ revokeAllOtherInstallations,
+ revoking,
+ sync,
+ syncing,
+ } = useIdentity(true);
+ const [revokeInstallationError, setRevokeInstallationError] = useState<
+ string | null
+ >(null);
+
+ const handleRevokeAllOtherInstallations = async () => {
+ try {
+ await revokeAllOtherInstallations();
+ await sync();
+ } catch (error) {
+ setRevokeInstallationError((error as Error).message || "Unknown error");
+ }
+ };
+
+ useEffect(() => {
+ if (!client) {
+ void navigate("/");
+ }
+ }, [client]);
+
+ return (
+ <>
+ {revokeInstallationError && (
+ {
+ setRevokeInstallationError(null);
+ }}
+ withCloseButton={false}
+ centered>
+
+ Revoke installation error
+ {revokeInstallationError}
+
+ {
+ setRevokeInstallationError(null);
+ }}>
+ OK
+
+
+
+
+ )}
+
+
+
+ Identity
+
+ {client && (
+
+
+
+
+
+ Address
+
+
+
+
+
+ Inbox ID
+
+ {/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */}
+
+
+
+
+ Installation ID
+
+ {/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */}
+
+
+
+
+ Installations
+
+
+ {installations.length === 0 && (
+ No other installations found
+ )}
+ {installations.length > 0 && (
+ <>
+
+
+
+ void handleRevokeAllOtherInstallations()
+ }>
+ Revoke all other installations
+
+
+ >
+ )}
+
+
+
+ )}
+
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/IdentityNavbar.tsx b/apps/xmtp.chat/src/components/IdentityNavbar.tsx
new file mode 100644
index 000000000..cf66a488e
--- /dev/null
+++ b/apps/xmtp.chat/src/components/IdentityNavbar.tsx
@@ -0,0 +1,19 @@
+import { Box, Button } from "@mantine/core";
+import { useNavigate } from "react-router";
+import { IconArrowLeft } from "../icons/IconArrowLeft";
+
+export const IdentityNavbar: React.FC = () => {
+ const navigate = useNavigate();
+
+ return (
+
+ }
+ variant="transparent"
+ size="md"
+ onClick={() => void navigate("/conversations")}>
+ Conversations
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/InstallationTable.tsx b/apps/xmtp.chat/src/components/InstallationTable.tsx
new file mode 100644
index 000000000..11331e5b9
--- /dev/null
+++ b/apps/xmtp.chat/src/components/InstallationTable.tsx
@@ -0,0 +1,95 @@
+import { Button, Table, Text, useMatches } from "@mantine/core";
+import type { SafeInstallation } from "@xmtp/browser-sdk";
+import { formatDistanceToNow } from "date-fns";
+import { nsToDate } from "../helpers/date";
+import { useIdentity } from "../hooks/useIdentity";
+import { BadgeWithCopy } from "./BadgeWithCopy";
+
+type InstallationTableRowProps = {
+ installation: SafeInstallation;
+ refreshInstallations: () => Promise;
+ setRevokeInstallationError: React.Dispatch<
+ React.SetStateAction
+ >;
+};
+
+const InstallationTableRow: React.FC = ({
+ installation,
+ refreshInstallations,
+ setRevokeInstallationError,
+}) => {
+ const { revokeInstallation, revoking } = useIdentity();
+
+ const handleRevokeInstallation = async (installationIdBytes: Uint8Array) => {
+ try {
+ await revokeInstallation(installationIdBytes);
+ await refreshInstallations();
+ } catch (error) {
+ setRevokeInstallationError((error as Error).message || "Unknown error");
+ }
+ };
+
+ const maw = useMatches({
+ base: "12rem",
+ sm: "20rem",
+ });
+
+ return (
+
+
+
+
+
+
+ {formatDistanceToNow(nsToDate(installation.clientTimestampNs ?? 0n), {
+ addSuffix: true,
+ })}
+
+
+
+ void handleRevokeInstallation(installation.bytes)}>
+ Revoke
+
+
+
+ );
+};
+
+type InstallationTableProps = {
+ installations: SafeInstallation[];
+ refreshInstallations: () => Promise;
+ setRevokeInstallationError: React.Dispatch<
+ React.SetStateAction
+ >;
+};
+
+export const InstallationTable: React.FC = ({
+ installations,
+ refreshInstallations,
+ setRevokeInstallationError,
+}) => {
+ return (
+
+
+
+ Installation ID
+ Created
+
+
+
+
+ {installations.map((installation) => (
+
+ ))}
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/LoadConversation.tsx b/apps/xmtp.chat/src/components/LoadConversation.tsx
new file mode 100644
index 000000000..0429eab2d
--- /dev/null
+++ b/apps/xmtp.chat/src/components/LoadConversation.tsx
@@ -0,0 +1,29 @@
+import type { Conversation as XmtpConversation } from "@xmtp/browser-sdk";
+import { useEffect, useState } from "react";
+import { useParams } from "react-router";
+import { useBodyClass } from "../hooks/useBodyClass";
+import { useConversations } from "../hooks/useConversations";
+import { Conversation } from "./Conversation";
+
+export const LoadConversation: React.FC = () => {
+ useBodyClass("main-flex-layout");
+ const { conversationId } = useParams();
+ const { getConversationById, loading } = useConversations();
+ const [conversation, setConversation] = useState<
+ XmtpConversation | undefined
+ >(undefined);
+
+ useEffect(() => {
+ const loadConversation = async () => {
+ if (conversationId) {
+ const conversation = await getConversationById(conversationId);
+ if (conversation) {
+ setConversation(conversation);
+ }
+ }
+ };
+ void loadConversation();
+ }, [conversationId]);
+
+ return ;
+};
diff --git a/apps/xmtp.chat/src/components/LoggingSelect.tsx b/apps/xmtp.chat/src/components/LoggingSelect.tsx
new file mode 100644
index 000000000..255f37e19
--- /dev/null
+++ b/apps/xmtp.chat/src/components/LoggingSelect.tsx
@@ -0,0 +1,37 @@
+import { Flex, NativeSelect, Text } from "@mantine/core";
+import { useLocalStorage } from "@mantine/hooks";
+import { type ClientOptions } from "@xmtp/browser-sdk";
+import { useDisconnect } from "wagmi";
+import { useClient } from "../hooks/useClient";
+
+export const LoggingSelect: React.FC = () => {
+ const { disconnect } = useDisconnect();
+ const { disconnect: disconnectClient } = useClient();
+ const [logging, setLogging] = useLocalStorage({
+ key: "XMTP_LOGGING_LEVEL",
+ defaultValue: "off",
+ });
+
+ const handleChange = (event: React.ChangeEvent) => {
+ setLogging(event.currentTarget.value as ClientOptions["loggingLevel"]);
+ disconnect(undefined, {
+ onSuccess: () => {
+ disconnectClient();
+ },
+ });
+ };
+
+ return (
+
+
+ LOGGING
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Main.css b/apps/xmtp.chat/src/components/Main.css
new file mode 100644
index 000000000..7ab337938
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Main.css
@@ -0,0 +1,13 @@
+body.main-flex-layout main {
+ display: flex;
+ flex-direction: column;
+ height: 100dvh;
+ background-color: light-dark(
+ var(--mantine-color-gray-0),
+ var(--mantine-color-dark-8)
+ );
+}
+
+#root > canvas {
+ z-index: 9999 !important;
+}
diff --git a/apps/xmtp.chat/src/components/Main.tsx b/apps/xmtp.chat/src/components/Main.tsx
new file mode 100644
index 000000000..df3c64248
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Main.tsx
@@ -0,0 +1,25 @@
+import "./Main.css";
+import { Route, Routes } from "react-router";
+import { Conversations } from "./Conversations";
+import { Identity } from "./Identity";
+import { LoadConversation } from "./LoadConversation";
+import { ManageConversation } from "./ManageConversation";
+import { MessageModal } from "./MessageModal";
+import { NewConversation } from "./NewConversation";
+import { SelectConversation } from "./SelectConversation";
+import { Welcome } from "./Welcome";
+
+export const Main: React.FC = () => (
+
+ } />
+ }>
+ } />
+ } />
+ }>
+ } />
+
+ } />
+
+ } />
+
+);
diff --git a/apps/xmtp.chat/src/components/ManageConversation.tsx b/apps/xmtp.chat/src/components/ManageConversation.tsx
new file mode 100644
index 000000000..34c2018e4
--- /dev/null
+++ b/apps/xmtp.chat/src/components/ManageConversation.tsx
@@ -0,0 +1,830 @@
+import {
+ Badge,
+ Button,
+ FocusTrap,
+ Group,
+ LoadingOverlay,
+ Modal,
+ NativeSelect,
+ Paper,
+ ScrollArea,
+ Stack,
+ Text,
+ Textarea,
+ TextInput,
+ Title,
+ Tooltip,
+} from "@mantine/core";
+import {
+ GroupPermissionsOptions,
+ MetadataField,
+ PermissionPolicy,
+ PermissionUpdateType,
+ type ConsentState,
+ type Conversation,
+ type PermissionPolicySet,
+ type SafeGroupMember,
+} from "@xmtp/browser-sdk";
+import { useEffect, useMemo, useRef, useState } from "react";
+import { useNavigate, useParams } from "react-router";
+import { isValidLongWalletAddress } from "../helpers/address";
+import { useBodyClass } from "../hooks/useBodyClass";
+import { useClient } from "../hooks/useClient";
+import { useConversations } from "../hooks/useConversations";
+import { BadgeWithCopy } from "./BadgeWithCopy";
+import classes from "./ScrollFade.module.css";
+
+type AnyFn = (...args: unknown[]) => unknown;
+type ClassProperties = {
+ [K in keyof C as C[K] extends AnyFn ? never : K]: C[K];
+};
+type PolicySet = ClassProperties;
+
+export const ManageConversation: React.FC = () => {
+ useBodyClass("main-flex-layout");
+ const { conversationId } = useParams();
+ const { client } = useClient();
+ const { getConversationById, loading } = useConversations();
+ const navigate = useNavigate();
+ const [isLoading, setIsLoading] = useState(false);
+ const [address, setAddress] = useState("");
+ const [addressError, setAddressError] = useState(null);
+ const [members, setMembers] = useState([]);
+ const [addedMembers, setAddedMembers] = useState([]);
+ const [removedMembers, setRemovedMembers] = useState([]);
+ const [permissionsPolicy, setPermissionsPolicy] =
+ useState(GroupPermissionsOptions.AllMembers);
+ const [policySet, setPolicySet] = useState({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Allow,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Allow,
+ updateGroupNamePolicy: PermissionPolicy.Allow,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Allow,
+ });
+ const [updateConversationError, setUpdateConversationError] = useState<
+ string | null
+ >(null);
+ const consentStateRef = useRef(0);
+ const [consentState, setConsentState] = useState(0);
+ const [conversation, setConversation] = useState(null);
+ const [name, setName] = useState("");
+ const [description, setDescription] = useState("");
+ const [imageUrl, setImageUrl] = useState("");
+ const [pinnedFrameUrl, setPinnedFrameUrl] = useState("");
+
+ const policyTooltip = useMemo(() => {
+ if (permissionsPolicy === GroupPermissionsOptions.AllMembers) {
+ return "All members of the group can perform group actions";
+ } else if (permissionsPolicy === GroupPermissionsOptions.AdminOnly) {
+ return "Only admins can perform group actions";
+ }
+ return "Custom policy as defined below";
+ }, [permissionsPolicy]);
+
+ useEffect(() => {
+ if (
+ permissionsPolicy === GroupPermissionsOptions.AllMembers ||
+ permissionsPolicy === GroupPermissionsOptions.CustomPolicy
+ ) {
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Allow,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Allow,
+ updateGroupNamePolicy: PermissionPolicy.Allow,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Allow,
+ });
+ } else {
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Admin,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Admin,
+ updateGroupNamePolicy: PermissionPolicy.Admin,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Admin,
+ });
+ }
+ }, [permissionsPolicy]);
+
+ useEffect(() => {
+ if (members.some((member) => member.accountAddresses.includes(address))) {
+ setAddressError("Duplicate address");
+ } else if (address && !isValidLongWalletAddress(address)) {
+ setAddressError("Invalid address");
+ } else {
+ setAddressError(null);
+ }
+ }, [members, address]);
+
+ const handleUpdate = async () => {
+ if (!client) {
+ setUpdateConversationError("Client not initialized");
+ return;
+ }
+ setIsLoading(true);
+ try {
+ if (name !== conversation?.name) {
+ await conversation?.updateName(name);
+ }
+ if (description !== conversation?.description) {
+ await conversation?.updateDescription(description);
+ }
+ if (imageUrl !== conversation?.imageUrl) {
+ await conversation?.updateImageUrl(imageUrl);
+ }
+ if (pinnedFrameUrl !== conversation?.pinnedFrameUrl) {
+ await conversation?.updatePinnedFrameUrl(pinnedFrameUrl);
+ }
+ if (addedMembers.length > 0) {
+ await conversation?.addMembers(addedMembers);
+ }
+ if (removedMembers.length > 0) {
+ await conversation?.removeMembersByInboxId(
+ removedMembers.map((member) => member.inboxId),
+ );
+ }
+
+ if (consentState !== consentStateRef.current) {
+ await conversation?.updateConsentState(consentState);
+ }
+
+ const permissions = await conversation?.permissions();
+ if (
+ permissions?.policyType !== permissionsPolicy &&
+ permissionsPolicy !== GroupPermissionsOptions.CustomPolicy
+ ) {
+ switch (permissionsPolicy) {
+ case GroupPermissionsOptions.AllMembers: {
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddMember,
+ PermissionPolicy.Deny,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveMember,
+ PermissionPolicy.Admin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddAdmin,
+ PermissionPolicy.SuperAdmin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveAdmin,
+ PermissionPolicy.SuperAdmin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Allow,
+ MetadataField.GroupName,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Allow,
+ MetadataField.Description,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Allow,
+ MetadataField.ImageUrlSquare,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Allow,
+ MetadataField.PinnedFrameUrl,
+ );
+ break;
+ }
+ case GroupPermissionsOptions.AdminOnly: {
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddMember,
+ PermissionPolicy.Admin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveMember,
+ PermissionPolicy.Admin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddAdmin,
+ PermissionPolicy.SuperAdmin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveAdmin,
+ PermissionPolicy.SuperAdmin,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Admin,
+ MetadataField.GroupName,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Admin,
+ MetadataField.Description,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Admin,
+ MetadataField.ImageUrlSquare,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ PermissionPolicy.Admin,
+ MetadataField.PinnedFrameUrl,
+ );
+ }
+ }
+ }
+ if (permissionsPolicy === GroupPermissionsOptions.CustomPolicy) {
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddMember,
+ policySet.addMemberPolicy,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveMember,
+ policySet.removeMemberPolicy,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.AddAdmin,
+ policySet.addAdminPolicy,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.RemoveAdmin,
+ policySet.removeAdminPolicy,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ policySet.updateGroupNamePolicy,
+ MetadataField.GroupName,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ policySet.updateGroupDescriptionPolicy,
+ MetadataField.Description,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ policySet.updateGroupImageUrlSquarePolicy,
+ MetadataField.ImageUrlSquare,
+ );
+ await conversation?.updatePermission(
+ PermissionUpdateType.UpdateMetadata,
+ policySet.updateGroupPinnedFrameUrlPolicy,
+ MetadataField.PinnedFrameUrl,
+ );
+ }
+ void navigate(`/conversations/${conversationId}`);
+ } catch (error) {
+ setUpdateConversationError(
+ `Failed to update conversation: ${error as Error}`,
+ );
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleAddMember = () => {
+ setAddedMembers([...addedMembers, address]);
+ setAddress("");
+ setAddressError(null);
+ };
+
+ useEffect(() => {
+ const loadConversation = async () => {
+ if (client && conversationId) {
+ const conversation = await getConversationById(conversationId);
+ if (conversation) {
+ setConversation(conversation);
+ setName(conversation.name ?? "");
+ setDescription(conversation.description ?? "");
+ setImageUrl(conversation.imageUrl ?? "");
+ setPinnedFrameUrl(conversation.pinnedFrameUrl ?? "");
+ const consentState = await conversation.consentState();
+ setConsentState(consentState);
+ consentStateRef.current = consentState;
+ const members = await conversation.members();
+ setMembers(members);
+ const permissions = await conversation.permissions();
+ const policyType = permissions.policyType;
+ switch (policyType) {
+ case GroupPermissionsOptions.AllMembers:
+ setPermissionsPolicy(GroupPermissionsOptions.AllMembers);
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Allow,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Allow,
+ updateGroupNamePolicy: PermissionPolicy.Allow,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Allow,
+ });
+ break;
+ case GroupPermissionsOptions.AdminOnly:
+ setPermissionsPolicy(GroupPermissionsOptions.AdminOnly);
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Admin,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Admin,
+ updateGroupNamePolicy: PermissionPolicy.Admin,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Admin,
+ });
+ break;
+ case GroupPermissionsOptions.CustomPolicy:
+ setPermissionsPolicy(GroupPermissionsOptions.CustomPolicy);
+ setPolicySet(permissions.policySet);
+ break;
+ }
+ } else {
+ void navigate("/conversations");
+ }
+ } else {
+ void navigate("/conversations");
+ }
+ };
+ void loadConversation();
+ }, [client, conversationId]);
+
+ return (
+ <>
+ {updateConversationError && (
+ {
+ setUpdateConversationError(null);
+ }}
+ withCloseButton={false}
+ centered>
+
+ Error
+ {updateConversationError}
+
+ {
+ setUpdateConversationError(null);
+ }}>
+ OK
+
+
+
+
+ )}
+
+
+
+
+ {conversation?.name || "Untitled"}
+
+
+
+
+
+ Properties
+
+ Name
+ {
+ setName(event.target.value);
+ }}
+ />
+
+
+ Description
+
+
+ Image URL
+ {
+ setImageUrl(event.target.value);
+ }}
+ />
+
+
+ Pinned frame URL
+ {
+ setPinnedFrameUrl(event.target.value);
+ }}
+ />
+
+
+
+
+
+ Consent
+
+ Consent state
+ {
+ setConsentState(
+ parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as ConsentState,
+ );
+ }}
+ data={[
+ { value: "0", label: "Unknown" },
+ { value: "1", label: "Allowed" },
+ { value: "2", label: "Denied" },
+ ]}
+ />
+
+
+
+
+
+
+ Permissions
+
+ Policy
+
+ {
+ setPermissionsPolicy(
+ parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as GroupPermissionsOptions,
+ );
+ }}
+ data={[
+ { value: "0", label: "All members" },
+ { value: "1", label: "Admins only" },
+ { value: "2", label: "Custom policy" },
+ ]}
+ />
+
+
+
+
+ Add members
+ {
+ setPolicySet({
+ ...policySet,
+ addMemberPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Remove members
+ {
+ setPolicySet({
+ ...policySet,
+ removeMemberPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Add admins
+ {
+ setPolicySet({
+ ...policySet,
+ addAdminPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Remove admins
+ {
+ setPolicySet({
+ ...policySet,
+ removeAdminPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group name
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupNamePolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group description
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupDescriptionPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group image
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupImageUrlSquarePolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group pinned frame
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupPinnedFrameUrlPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+
+
+
+ Members
+
+
+ {
+ setAddress(event.target.value);
+ }}
+ onKeyDown={(event) => {
+ if (event.key === "Enter") {
+ handleAddMember();
+ }
+ }}
+ />
+
+
+ Add
+
+
+
+
+ Added members
+
+ {addedMembers.length}
+
+
+
+ {addedMembers.map((member) => (
+
+
+ {member}
+
+ {
+ setAddedMembers(
+ addedMembers.filter((m) => m !== member),
+ );
+ }}>
+ Remove
+
+
+ ))}
+
+
+
+
+ Removed members
+
+ {removedMembers.length}
+
+
+
+ {removedMembers.map((member) => (
+
+
+ {member.accountAddresses.join(", ")}
+
+ {
+ setRemovedMembers(
+ removedMembers.filter(
+ (m) => m.inboxId !== member.inboxId,
+ ),
+ );
+ setMembers([...members, member]);
+ }}>
+ Restore
+
+
+ ))}
+
+
+
+
+ Members
+
+ {members.length}
+
+
+
+ {members.map((member) => (
+
+
+ {
+ setMembers(
+ members.filter(
+ (m) => m.inboxId !== member.inboxId,
+ ),
+ );
+ setRemovedMembers([...removedMembers, member]);
+ }}>
+ Remove
+
+
+ ))}
+
+
+
+
+
+
+
+ void navigate(`/conversations/${conversationId}`)}>
+ Cancel
+
+ void handleUpdate()}>Update
+
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Message.module.css b/apps/xmtp.chat/src/components/Message.module.css
new file mode 100644
index 000000000..0bc4ce6c8
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Message.module.css
@@ -0,0 +1,8 @@
+.root:hover {
+ background-color: var(--mantine-color-default-hover);
+ cursor: pointer;
+}
+
+.root:focus {
+ border-color: var(--mantine-color-blue-outline);
+}
diff --git a/apps/xmtp.chat/src/components/Message.tsx b/apps/xmtp.chat/src/components/Message.tsx
new file mode 100644
index 000000000..691f5bcc8
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Message.tsx
@@ -0,0 +1,66 @@
+import { Flex, Paper, Stack, Text } from "@mantine/core";
+import type { DecodedMessage } from "@xmtp/browser-sdk";
+import { intlFormat } from "date-fns";
+import { useNavigate } from "react-router";
+import { shortAddress } from "../helpers/address";
+import { nsToDate } from "../helpers/date";
+import { useClient } from "../hooks/useClient";
+import classes from "./Message.module.css";
+import { MessageContent } from "./MessageContent";
+
+export type MessageProps = {
+ message: DecodedMessage;
+};
+
+export const Message: React.FC = ({ message }) => {
+ const { client } = useClient();
+ const isSender = client?.inboxId === message.senderInboxId;
+ const align = isSender ? "right" : "left";
+ const navigate = useNavigate();
+
+ return (
+
+ {
+ if (e.key === "Enter") {
+ void navigate(
+ `/conversations/${message.conversationId}/message/${message.id}`,
+ );
+ }
+ }}
+ className={classes.root}
+ onClick={() =>
+ void navigate(
+ `/conversations/${message.conversationId}/message/${message.id}`,
+ )
+ }>
+
+
+
+ {shortAddress(message.senderInboxId)}
+
+
+ {intlFormat(nsToDate(message.sentAtNs), {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ })}
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/MessageContent.tsx b/apps/xmtp.chat/src/components/MessageContent.tsx
new file mode 100644
index 000000000..901e6d23e
--- /dev/null
+++ b/apps/xmtp.chat/src/components/MessageContent.tsx
@@ -0,0 +1,22 @@
+import { Code, Paper } from "@mantine/core";
+
+export type MessageContentProps = {
+ content: string;
+};
+
+export const MessageContent: React.FC = ({ content }) => {
+ return typeof content === "string" ? (
+
+ {content}
+
+ ) : (
+
+ {JSON.stringify(content, null, 2)}
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/MessageModal.tsx b/apps/xmtp.chat/src/components/MessageModal.tsx
new file mode 100644
index 000000000..b82e3b638
--- /dev/null
+++ b/apps/xmtp.chat/src/components/MessageModal.tsx
@@ -0,0 +1,126 @@
+import {
+ Center,
+ Modal,
+ ScrollArea,
+ Stack,
+ Tabs,
+ Text,
+ useMatches,
+} from "@mantine/core";
+import { type DecodedMessage } from "@xmtp/browser-sdk";
+import { useEffect, useState } from "react";
+import { useNavigate, useParams } from "react-router";
+import { useConversations } from "../hooks/useConversations";
+import { CodeWithCopy } from "./CodeWithCopy";
+import { MessageProperties } from "./MessageProperties";
+
+export const MessageModal: React.FC = () => {
+ const { messageId } = useParams();
+ const { getMessageById, loading } = useConversations();
+ const navigate = useNavigate();
+ const [message, setMessage] = useState(undefined);
+
+ const fullScreen = useMatches({
+ base: true,
+ sm: false,
+ });
+
+ const contentHeight = useMatches({
+ base: "auto",
+ sm: 500,
+ });
+
+ useEffect(() => {
+ if (!messageId) return;
+ const loadMessage = async () => {
+ const message = await getMessageById(messageId);
+ setMessage(message);
+ };
+ void loadMessage();
+ }, [messageId]);
+
+ return (
+ void navigate(-1)}
+ title={
+
+ Message details
+
+ }>
+ {!message && loading && (
+
+ Loading...
+
+ )}
+ {message && (
+
+
+
+ Properties
+ Encoded content
+ Decoded content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/MessageProperties.tsx b/apps/xmtp.chat/src/components/MessageProperties.tsx
new file mode 100644
index 000000000..841d2db82
--- /dev/null
+++ b/apps/xmtp.chat/src/components/MessageProperties.tsx
@@ -0,0 +1,83 @@
+import { Stack, Text } from "@mantine/core";
+import { type DecodedMessage } from "@xmtp/browser-sdk";
+import { intlFormat } from "date-fns";
+import { useMemo } from "react";
+import { nsToDate } from "../helpers/date";
+import { BadgeWithCopy } from "./BadgeWithCopy";
+
+export type MessagePropertiesProps = {
+ message: DecodedMessage;
+};
+
+export const MessageProperties: React.FC = ({
+ message,
+}) => {
+ const deliveryStatus = useMemo(() => {
+ switch (message.deliveryStatus) {
+ case "published":
+ return "Published";
+ case "failed":
+ return "Failed";
+ case "unpublished":
+ return "Unpublished";
+ }
+ }, [message]);
+
+ const messageKind = useMemo(() => {
+ switch (message.kind) {
+ case "application":
+ return "Application";
+ case "membership_change":
+ return "Membership Change";
+ }
+ }, [message]);
+
+ return (
+
+
+
+ Message ID
+
+
+
+
+
+ Conversation ID
+
+
+
+
+
+ Message kind
+
+
+
+
+
+ Sender inbox ID
+
+
+
+
+
+ Delivery status
+
+
+
+
+
+ Sent at
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Messages.tsx b/apps/xmtp.chat/src/components/Messages.tsx
new file mode 100644
index 000000000..f2e3f0884
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Messages.tsx
@@ -0,0 +1,23 @@
+import { Center, Stack, Text } from "@mantine/core";
+import type { DecodedMessage } from "@xmtp/browser-sdk";
+import { Message } from "./Message";
+
+export type ConversationProps = {
+ messages: DecodedMessage[];
+};
+
+export const Messages: React.FC = ({ messages }) => {
+ return (
+
+ {messages.length > 0 ? (
+ messages.map((message) => (
+
+ ))
+ ) : (
+
+ No messages
+
+ )}
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Navbar.tsx b/apps/xmtp.chat/src/components/Navbar.tsx
new file mode 100644
index 000000000..292f11701
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Navbar.tsx
@@ -0,0 +1,11 @@
+import { Route, Routes } from "react-router";
+import { ConversationsNavbar } from "./ConversationsNavbar";
+import { IdentityNavbar } from "./IdentityNavbar";
+
+export const Navbar: React.FC = () => (
+
+
+ } />
+ } />
+
+);
diff --git a/apps/xmtp.chat/src/components/NetworkSelect.tsx b/apps/xmtp.chat/src/components/NetworkSelect.tsx
new file mode 100644
index 000000000..9cb5f512c
--- /dev/null
+++ b/apps/xmtp.chat/src/components/NetworkSelect.tsx
@@ -0,0 +1,42 @@
+import { Flex, NativeSelect, Text, Tooltip } from "@mantine/core";
+import { useLocalStorage } from "@mantine/hooks";
+import { ApiUrls, type XmtpEnv } from "@xmtp/browser-sdk";
+import { useDisconnect } from "wagmi";
+import { useClient } from "../hooks/useClient";
+
+export const NetworkSelect: React.FC = () => {
+ const { disconnect } = useDisconnect();
+ const { disconnect: disconnectClient } = useClient();
+ const [network, setNetwork] = useLocalStorage({
+ key: "XMTP_NETWORK",
+ defaultValue: "dev",
+ });
+
+ const handleChange = (event: React.ChangeEvent) => {
+ setNetwork(event.currentTarget.value as XmtpEnv);
+ disconnect(undefined, {
+ onSuccess: () => {
+ disconnectClient();
+ },
+ });
+ };
+
+ return (
+
+
+ NETWORK
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/NewConversation.tsx b/apps/xmtp.chat/src/components/NewConversation.tsx
new file mode 100644
index 000000000..c07cc32b7
--- /dev/null
+++ b/apps/xmtp.chat/src/components/NewConversation.tsx
@@ -0,0 +1,548 @@
+import {
+ Badge,
+ Button,
+ FocusTrap,
+ Group,
+ LoadingOverlay,
+ Modal,
+ NativeSelect,
+ Paper,
+ ScrollArea,
+ Stack,
+ Switch,
+ Text,
+ Textarea,
+ TextInput,
+ Title,
+ Tooltip,
+} from "@mantine/core";
+import {
+ GroupPermissionsOptions,
+ PermissionPolicy,
+ type PermissionPolicySet,
+} from "@xmtp/browser-sdk";
+import { useEffect, useMemo, useState } from "react";
+import { useNavigate } from "react-router";
+import { isValidLongWalletAddress } from "../helpers/address";
+import { useBodyClass } from "../hooks/useBodyClass";
+import { useConversations } from "../hooks/useConversations";
+import classes from "./ScrollFade.module.css";
+
+type AnyFn = (...args: unknown[]) => unknown;
+type ClassProperties = {
+ [K in keyof C as C[K] extends AnyFn ? never : K]: C[K];
+};
+type PolicySet = ClassProperties;
+
+export const NewConversation: React.FC = () => {
+ useBodyClass("main-flex-layout");
+ const navigate = useNavigate();
+ const { newGroup, newDm, loading } = useConversations();
+ const [address, setAddress] = useState("");
+ const [addressError, setAddressError] = useState(null);
+ const [members, setMembers] = useState([]);
+ const [isDmGroup, setIsDmGroup] = useState(false);
+ const [permissionsPolicy, setPermissionsPolicy] =
+ useState(GroupPermissionsOptions.AllMembers);
+ const [policySet, setPolicySet] = useState({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Allow,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Allow,
+ updateGroupNamePolicy: PermissionPolicy.Allow,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Allow,
+ });
+ const [createConversationError, setCreateConversationError] = useState<
+ string | null
+ >(null);
+
+ const [name, setName] = useState("");
+ const [description, setDescription] = useState("");
+ const [imageUrl, setImageUrl] = useState("");
+ const [pinnedFrameUrl, setPinnedFrameUrl] = useState("");
+
+ const policyTooltip = useMemo(() => {
+ if (permissionsPolicy === GroupPermissionsOptions.AllMembers) {
+ return "All members of the group can perform group actions";
+ } else if (permissionsPolicy === GroupPermissionsOptions.AdminOnly) {
+ return "Only admins can perform group actions";
+ }
+ return "Custom policy as defined below";
+ }, [permissionsPolicy]);
+
+ useEffect(() => {
+ if (
+ permissionsPolicy === GroupPermissionsOptions.AllMembers ||
+ permissionsPolicy === GroupPermissionsOptions.CustomPolicy
+ ) {
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Allow,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Allow,
+ updateGroupNamePolicy: PermissionPolicy.Allow,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Allow,
+ });
+ } else {
+ setPolicySet({
+ addAdminPolicy: PermissionPolicy.Admin,
+ addMemberPolicy: PermissionPolicy.Admin,
+ removeAdminPolicy: PermissionPolicy.Admin,
+ removeMemberPolicy: PermissionPolicy.Admin,
+ updateGroupDescriptionPolicy: PermissionPolicy.Admin,
+ updateGroupImageUrlSquarePolicy: PermissionPolicy.Admin,
+ updateGroupNamePolicy: PermissionPolicy.Admin,
+ updateGroupPinnedFrameUrlPolicy: PermissionPolicy.Admin,
+ });
+ }
+ }, [permissionsPolicy]);
+
+ useEffect(() => {
+ if (members.includes(address)) {
+ setAddressError("Duplicate address");
+ } else if (address && !isValidLongWalletAddress(address)) {
+ setAddressError("Invalid address");
+ } else {
+ setAddressError(null);
+ }
+ }, [members, address]);
+
+ const handleCreate = async () => {
+ if (isDmGroup && members.length === 0) {
+ setCreateConversationError(
+ "Direct message groups must have at least one member",
+ );
+ return;
+ }
+ const conversation = isDmGroup
+ ? await newDm(members[0])
+ : await newGroup(members, {
+ description,
+ imageUrlSquare: imageUrl,
+ pinnedFrameUrl,
+ name,
+ permissions: permissionsPolicy,
+ customPermissionPolicySet:
+ permissionsPolicy === GroupPermissionsOptions.CustomPolicy
+ ? policySet
+ : undefined,
+ });
+ void navigate(`/conversations/${conversation.id}`);
+ };
+
+ const handleAddMember = () => {
+ setMembers([...members, address]);
+ setAddress("");
+ setAddressError(null);
+ };
+
+ return (
+ <>
+ {createConversationError && (
+ {
+ setCreateConversationError(null);
+ }}
+ withCloseButton={false}
+ centered>
+
+ Error
+ {createConversationError}
+
+ {
+ setCreateConversationError(null);
+ }}>
+ OK
+
+
+
+
+ )}
+
+
+
+ New conversation
+
+
+
+
+
+ Properties
+ 1}
+ label="Direct message group"
+ size="md"
+ checked={isDmGroup}
+ onChange={(event) => {
+ setIsDmGroup(event.currentTarget.checked);
+ }}
+ labelPosition="left"
+ />
+
+
+ Name
+ {
+ setName(event.target.value);
+ }}
+ />
+
+
+ Description
+
+
+ Image URL
+ {
+ setImageUrl(event.target.value);
+ }}
+ />
+
+
+ Pinned frame URL
+ {
+ setPinnedFrameUrl(event.target.value);
+ }}
+ />
+
+
+
+
+
+
+ Permissions
+
+ Policy
+
+ {
+ setPermissionsPolicy(
+ parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as GroupPermissionsOptions,
+ );
+ }}
+ data={[
+ { value: "0", label: "All members" },
+ { value: "1", label: "Admins only" },
+ { value: "2", label: "Custom policy" },
+ ]}
+ />
+
+
+
+
+ Add members
+ {
+ setPolicySet({
+ ...policySet,
+ addMemberPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Remove members
+ {
+ setPolicySet({
+ ...policySet,
+ removeMemberPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Add admins
+ {
+ setPolicySet({
+ ...policySet,
+ addAdminPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Remove admins
+ {
+ setPolicySet({
+ ...policySet,
+ removeAdminPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group name
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupNamePolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group description
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupDescriptionPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group image
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupImageUrlSquarePolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+ Update group pinned frame
+ {
+ setPolicySet({
+ ...policySet,
+ updateGroupPinnedFrameUrlPolicy: parseInt(
+ event.currentTarget.value,
+ 10,
+ ) as PermissionPolicy,
+ });
+ }}
+ data={[
+ { value: "0", label: "Everyone" },
+ { value: "1", label: "Disabled" },
+ { value: "2", label: "Admins only" },
+ { value: "3", label: "Super admins only" },
+ ]}
+ />
+
+
+
+
+
+ Members
+
+
+ {
+ setAddress(event.target.value);
+ }}
+ onKeyDown={(event) => {
+ if (event.key === "Enter") {
+ handleAddMember();
+ }
+ }}
+ />
+
+ 0) ||
+ addressError !== null
+ }
+ onClick={handleAddMember}>
+ Add
+
+
+
+
+ Added members
+
+ {members.length}
+
+
+
+ {members.map((member) => (
+
+
+ {member}
+
+ {
+ setMembers(members.filter((m) => m !== member));
+ }}>
+ Remove
+
+
+ ))}
+
+
+
+
+
+
+
+ void navigate("/conversations")}>
+ Cancel
+
+ void handleCreate()}>Create
+
+
+
+ >
+ );
+};
diff --git a/apps/xmtp.chat/src/components/RefManager.tsx b/apps/xmtp.chat/src/components/RefManager.tsx
new file mode 100644
index 000000000..d0154738a
--- /dev/null
+++ b/apps/xmtp.chat/src/components/RefManager.tsx
@@ -0,0 +1,62 @@
+import { createContext, useContext, useMemo, useState } from "react";
+
+type RefManagerContextType = {
+ getRef: (id: string) => React.RefObject | undefined;
+ setRef: (id: string, ref: React.RefObject) => void;
+ removeRef: (id: string) => void;
+};
+
+const RefManagerContext = createContext({
+ getRef: () => undefined,
+ setRef: () => {},
+ removeRef: () => {},
+});
+
+export const RefManagerProvider = ({
+ children,
+}: {
+ children: React.ReactNode;
+}) => {
+ const [refs, setRefs] = useState>>(
+ new Map(),
+ );
+
+ const getRef = (id: string) => {
+ return refs.get(id);
+ };
+
+ const setRef = (id: string, ref: React.RefObject) => {
+ setRefs((prevRefs) => {
+ const newRefs = new Map(prevRefs);
+ newRefs.set(id, ref);
+ return newRefs;
+ });
+ };
+
+ const removeRef = (id: string) => {
+ setRefs((prevRefs) => {
+ const newRefs = new Map(prevRefs);
+ newRefs.delete(id);
+ return newRefs;
+ });
+ };
+
+ const value = useMemo(
+ () => ({
+ getRef,
+ setRef,
+ removeRef,
+ }),
+ [refs],
+ );
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useRefManager = () => {
+ return useContext(RefManagerContext);
+};
diff --git a/apps/xmtp.chat/src/components/ScrollFade.module.css b/apps/xmtp.chat/src/components/ScrollFade.module.css
new file mode 100644
index 000000000..dcc41afbc
--- /dev/null
+++ b/apps/xmtp.chat/src/components/ScrollFade.module.css
@@ -0,0 +1,36 @@
+.root {
+ flex-grow: 1;
+ --gradient-color: light-dark(
+ var(--mantine-color-gray-0),
+ var(--mantine-color-dark-8)
+ );
+ position: relative;
+}
+
+.root::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 20px;
+ background: linear-gradient(to top, transparent, var(--gradient-color) 20px);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.root::after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 20px;
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ var(--gradient-color) 20px
+ );
+ pointer-events: none;
+ z-index: 1;
+}
diff --git a/apps/xmtp.chat/src/components/SelectConversation.tsx b/apps/xmtp.chat/src/components/SelectConversation.tsx
new file mode 100644
index 000000000..a4c68bd82
--- /dev/null
+++ b/apps/xmtp.chat/src/components/SelectConversation.tsx
@@ -0,0 +1,31 @@
+import { Button, Stack, Text, Title, useMatches } from "@mantine/core";
+import { useRefManager } from "./RefManager";
+
+export const SelectConversation = () => {
+ const { getRef } = useRefManager();
+ const px = useMatches({
+ base: "5%",
+ sm: "10%",
+ });
+
+ return (
+
+
+ No conversation selected
+
+ Select a conversation in the left sidebar to display its messages, or
+ create a new conversation by clicking the{" "}
+ {
+ getRef("new-conversation-button")?.current?.click();
+ }}>
+ New conversation
+ {" "}
+ button.
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Settings.tsx b/apps/xmtp.chat/src/components/Settings.tsx
new file mode 100644
index 000000000..0d62bb0d1
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Settings.tsx
@@ -0,0 +1,44 @@
+import { Button, FocusTrap, Popover, Stack, useMatches } from "@mantine/core";
+import React, { useEffect, useRef } from "react";
+import { IconSettings } from "../icons/IconSettings";
+import { LoggingSelect } from "./LoggingSelect";
+import { NetworkSelect } from "./NetworkSelect";
+import { useRefManager } from "./RefManager";
+import { UseEphemeralAccountOption } from "./UseEphemeralAccountOption";
+
+export const Settings: React.FC = () => {
+ const { setRef } = useRefManager();
+ const ref = useRef(null);
+ const label: React.ReactNode = useMatches({
+ base: ,
+ sm: "Settings",
+ });
+
+ useEffect(() => {
+ setRef("settings-button", ref);
+ }, []);
+
+ const px = useMatches({
+ base: "xs",
+ sm: "md",
+ });
+
+ return (
+
+
+
+ {label}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/UseEphemeralAccountOption.tsx b/apps/xmtp.chat/src/components/UseEphemeralAccountOption.tsx
new file mode 100644
index 000000000..e7becf41c
--- /dev/null
+++ b/apps/xmtp.chat/src/components/UseEphemeralAccountOption.tsx
@@ -0,0 +1,53 @@
+import { Box, Flex, Switch, Text, Tooltip } from "@mantine/core";
+import { useLocalStorage } from "@mantine/hooks";
+import React from "react";
+import { useDisconnect } from "wagmi";
+import { useClient } from "../hooks/useClient";
+import { IconInfoCircle } from "../icons/IconInfoCircle";
+
+const UseEphemeralAccountLabel = () => {
+ return (
+
+ Use ephemeral account
+
+
+
+
+
+
+ );
+};
+
+export const UseEphemeralAccountOption: React.FC = () => {
+ const { disconnect } = useDisconnect();
+ const { disconnect: disconnectClient } = useClient();
+ const [checked, setChecked] = useLocalStorage({
+ key: "XMTP_USE_EPHEMERAL_ACCOUNT",
+ defaultValue: false,
+ });
+
+ const handleChange = (event: React.ChangeEvent) => {
+ setChecked(event.currentTarget.checked);
+ disconnect(undefined, {
+ onSuccess: () => {
+ disconnectClient();
+ },
+ });
+ };
+
+ return (
+ }
+ />
+ );
+};
diff --git a/apps/xmtp.chat/src/components/Welcome.tsx b/apps/xmtp.chat/src/components/Welcome.tsx
new file mode 100644
index 000000000..a84e269df
--- /dev/null
+++ b/apps/xmtp.chat/src/components/Welcome.tsx
@@ -0,0 +1,79 @@
+import {
+ Anchor,
+ Badge,
+ Button,
+ List,
+ Stack,
+ Text,
+ Title,
+ useMatches,
+} from "@mantine/core";
+import { useLocalStorage } from "@mantine/hooks";
+import type { XmtpEnv } from "@xmtp/browser-sdk";
+import { useRefManager } from "./RefManager";
+
+export const Welcome = () => {
+ const { getRef } = useRefManager();
+ const [network] = useLocalStorage({
+ key: "XMTP_NETWORK",
+ defaultValue: "dev",
+ });
+
+ const px = useMatches({
+ base: "5%",
+ sm: "10%",
+ });
+
+ return (
+
+
+ XMTP.chat is built for devs, by devs
+
+ Learn to build with XMTP—using an app built with XMTP
+
+
+
+ Get started
+
+
+ Click{" "}
+ {
+ getRef("connect-wallet-button")?.current?.click();
+ }}>
+ Connect
+ {" "}
+ to connect a wallet to the{" "}
+
+ {network}
+ {" "}
+ network
+
+
+ To use an ephemeral wallet, switch networks, or enable logging click{" "}
+ {
+ getRef("settings-button")?.current?.click();
+ }}>
+ Settings
+
+
+
+ Feedback
+
+ Your feedback is incredibly important to the success of this tool. If
+ you find any bugs or have suggestions, please let us know by{" "}
+
+ filing an issue
+ {" "}
+ on GitHub.
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/components/XMTPContext.tsx b/apps/xmtp.chat/src/components/XMTPContext.tsx
new file mode 100644
index 000000000..b66830ffe
--- /dev/null
+++ b/apps/xmtp.chat/src/components/XMTPContext.tsx
@@ -0,0 +1,50 @@
+import type { Client } from "@xmtp/browser-sdk";
+import { createContext, useMemo, useState } from "react";
+
+export type XMTPContextValue = {
+ /**
+ * The XMTP client instance
+ */
+ client?: Client;
+ /**
+ * Set the XMTP client instance
+ */
+ setClient: React.Dispatch>;
+ /**
+ * Set whether to show confetti
+ */
+ setConfetti: React.Dispatch>;
+};
+
+export const XMTPContext = createContext({
+ setClient: () => {},
+ setConfetti: () => {},
+});
+
+export type XMTPProviderProps = React.PropsWithChildren & {
+ /**
+ * Initial XMTP client instance
+ */
+ client?: Client;
+};
+
+export const XMTPProvider: React.FC = ({
+ children,
+ client: initialClient,
+}) => {
+ const [client, setClient] = useState(initialClient);
+ const [confetti, setConfetti] = useState(false);
+
+ // memo-ize the context value to prevent unnecessary re-renders
+ const value = useMemo(
+ () => ({
+ client,
+ setClient,
+ confetti,
+ setConfetti,
+ }),
+ [client, confetti],
+ );
+
+ return {children} ;
+};
diff --git a/examples/react-vite-browser-sdk/src/globals.d.ts b/apps/xmtp.chat/src/globals.d.ts
similarity index 62%
rename from examples/react-vite-browser-sdk/src/globals.d.ts
rename to apps/xmtp.chat/src/globals.d.ts
index a774196a4..071558746 100644
--- a/examples/react-vite-browser-sdk/src/globals.d.ts
+++ b/apps/xmtp.chat/src/globals.d.ts
@@ -1,10 +1,3 @@
-interface ImportMeta {
- env: {
- VITE_PROJECT_ID?: string;
- VITE_ENCRYPTION_KEY?: string;
- };
-}
-
declare module "*.module.css" {
const classes: { [key: string]: string };
export default classes;
diff --git a/apps/xmtp.chat/src/helpers/address.ts b/apps/xmtp.chat/src/helpers/address.ts
new file mode 100644
index 000000000..780146f20
--- /dev/null
+++ b/apps/xmtp.chat/src/helpers/address.ts
@@ -0,0 +1,7 @@
+export const isValidLongWalletAddress = (
+ address: string,
+): address is `0x${string}` =>
+ address.startsWith("0x") && address.length === 42;
+
+export const shortAddress = (address: string): string =>
+ `${address.substring(0, 6)}...${address.substring(address.length - 4)}`;
diff --git a/apps/xmtp.chat/src/helpers/createSigner.ts b/apps/xmtp.chat/src/helpers/createSigner.ts
new file mode 100644
index 000000000..a5ff27190
--- /dev/null
+++ b/apps/xmtp.chat/src/helpers/createSigner.ts
@@ -0,0 +1,32 @@
+import type { Signer } from "@xmtp/browser-sdk";
+import { toBytes, type Hex, type WalletClient } from "viem";
+import { privateKeyToAccount } from "viem/accounts";
+
+export const createEphemeralSigner = (privateKey: Hex): Signer => {
+ const account = privateKeyToAccount(privateKey);
+ return {
+ getAddress: () => account.address,
+ signMessage: async (message: string) => {
+ const signature = await account.signMessage({
+ message,
+ });
+ return toBytes(signature);
+ },
+ };
+};
+
+export const createSigner = (
+ address: `0x${string}`,
+ walletClient: WalletClient,
+): Signer => {
+ return {
+ getAddress: () => address,
+ signMessage: async (message: string) => {
+ const signature = await walletClient.signMessage({
+ account: address,
+ message,
+ });
+ return toBytes(signature);
+ },
+ };
+};
diff --git a/apps/xmtp.chat/src/helpers/date.ts b/apps/xmtp.chat/src/helpers/date.ts
new file mode 100644
index 000000000..b15e9987b
--- /dev/null
+++ b/apps/xmtp.chat/src/helpers/date.ts
@@ -0,0 +1,3 @@
+export function nsToDate(ns: bigint): Date {
+ return new Date(Number(ns / 1_000_000n));
+}
diff --git a/apps/xmtp.chat/src/helpers/errors.ts b/apps/xmtp.chat/src/helpers/errors.ts
new file mode 100644
index 000000000..f9f54ba89
--- /dev/null
+++ b/apps/xmtp.chat/src/helpers/errors.ts
@@ -0,0 +1,5 @@
+export class ClientNotFoundError extends Error {
+ constructor(context: string) {
+ super(`XMTP client is required when ${context}`);
+ }
+}
diff --git a/apps/xmtp.chat/src/hooks/useBodyClass.ts b/apps/xmtp.chat/src/hooks/useBodyClass.ts
new file mode 100644
index 000000000..d28bdca16
--- /dev/null
+++ b/apps/xmtp.chat/src/hooks/useBodyClass.ts
@@ -0,0 +1,10 @@
+import { useEffect } from "react";
+
+export const useBodyClass = (className: string) => {
+ useEffect(() => {
+ document.body.classList.add(className);
+ return () => {
+ document.body.classList.remove(className);
+ };
+ }, []);
+};
diff --git a/apps/xmtp.chat/src/hooks/useClient.ts b/apps/xmtp.chat/src/hooks/useClient.ts
new file mode 100644
index 000000000..7359cf92e
--- /dev/null
+++ b/apps/xmtp.chat/src/hooks/useClient.ts
@@ -0,0 +1,87 @@
+import { Client, type ClientOptions, type Signer } from "@xmtp/browser-sdk";
+import { useCallback, useContext, useRef, useState } from "react";
+import { XMTPContext } from "../components/XMTPContext";
+
+export type InitializeClientOptions = {
+ encryptionKey: Uint8Array;
+ env?: ClientOptions["env"];
+ loggingLevel?: ClientOptions["loggingLevel"];
+ signer: Signer;
+};
+
+/**
+ * This hook allows you to initialize, disconnect, and access the XMTP client
+ * instance. It also exposes the error and initializing states of the client.
+ */
+export const useClient = (onError?: (error: Error) => void) => {
+ const [initializing, setInitializing] = useState(false);
+ const [error, setError] = useState(null);
+ // client is initializing
+ const initializingRef = useRef(false);
+
+ const { client, setClient } = useContext(XMTPContext);
+
+ /**
+ * Initialize an XMTP client
+ */
+ const initialize = useCallback(
+ async ({
+ encryptionKey,
+ env,
+ loggingLevel,
+ signer,
+ }: InitializeClientOptions) => {
+ // only initialize a client if one doesn't already exist
+ if (!client) {
+ // if the client is already initializing, don't do anything
+ if (initializingRef.current) {
+ return undefined;
+ }
+
+ // flag the client as initializing
+ initializingRef.current = true;
+
+ // reset error state
+ setError(null);
+ // reset initializing state
+ setInitializing(true);
+
+ let xmtpClient: Client;
+
+ try {
+ // create a new XMTP client
+ xmtpClient = await Client.create(signer, encryptionKey, {
+ env,
+ loggingLevel,
+ });
+ setClient(xmtpClient);
+ } catch (e) {
+ setClient(undefined);
+ setError(e as Error);
+ onError?.(e as Error);
+ // re-throw error for upstream consumption
+ throw e;
+ } finally {
+ initializingRef.current = false;
+ setInitializing(false);
+ }
+
+ return xmtpClient;
+ }
+ return client;
+ },
+ [client, onError],
+ );
+
+ const disconnect = useCallback(() => {
+ setClient(undefined);
+ }, [client, setClient]);
+
+ return {
+ client,
+ disconnect,
+ error,
+ initialize,
+ initializing,
+ };
+};
diff --git a/apps/xmtp.chat/src/hooks/useConversation.ts b/apps/xmtp.chat/src/hooks/useConversation.ts
new file mode 100644
index 000000000..6651c54f5
--- /dev/null
+++ b/apps/xmtp.chat/src/hooks/useConversation.ts
@@ -0,0 +1,69 @@
+import type {
+ Conversation,
+ DecodedMessage,
+ SafeListMessagesOptions,
+} from "@xmtp/browser-sdk";
+import { useState } from "react";
+import { ClientNotFoundError } from "../helpers/errors";
+import { useClient } from "./useClient";
+
+export const useConversation = (conversation?: Conversation) => {
+ const { client } = useClient();
+ const [loading, setLoading] = useState(false);
+ const [syncing, setSyncing] = useState(false);
+ const [sending, setSending] = useState(false);
+ const [messages, setMessages] = useState([]);
+
+ const getMessages = async (
+ options?: SafeListMessagesOptions,
+ syncFromNetwork: boolean = false,
+ ) => {
+ if (!client) {
+ throw new ClientNotFoundError("fetching messages");
+ }
+
+ if (syncFromNetwork) {
+ await sync();
+ }
+
+ setLoading(true);
+
+ try {
+ const msgs = (await conversation?.messages(options)) ?? [];
+ setMessages(msgs);
+ return msgs;
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const sync = async () => {
+ if (!client) {
+ throw new ClientNotFoundError("syncing messages");
+ }
+
+ setSyncing(true);
+
+ try {
+ await conversation?.sync();
+ } finally {
+ setSyncing(false);
+ }
+ };
+
+ const send = async (message: string) => {
+ if (!client) {
+ throw new ClientNotFoundError("sending message");
+ }
+
+ setSending(true);
+
+ try {
+ await conversation?.send(message);
+ } finally {
+ setSending(false);
+ }
+ };
+
+ return { sync, loading, syncing, getMessages, send, sending, messages };
+};
diff --git a/apps/xmtp.chat/src/hooks/useConversations.ts b/apps/xmtp.chat/src/hooks/useConversations.ts
new file mode 100644
index 000000000..3db92e6fd
--- /dev/null
+++ b/apps/xmtp.chat/src/hooks/useConversations.ts
@@ -0,0 +1,123 @@
+import type {
+ SafeCreateGroupOptions,
+ SafeListConversationsOptions,
+} from "@xmtp/browser-sdk";
+import { useState } from "react";
+import { ClientNotFoundError } from "../helpers/errors";
+import { useClient } from "./useClient";
+
+export const useConversations = () => {
+ const { client } = useClient();
+ const [loading, setLoading] = useState(false);
+ const [syncing, setSyncing] = useState(false);
+
+ const list = async (
+ options?: SafeListConversationsOptions,
+ syncFromNetwork: boolean = false,
+ ) => {
+ if (!client) {
+ throw new ClientNotFoundError("fetching conversations");
+ }
+
+ if (syncFromNetwork) {
+ setLoading(true);
+ await sync();
+ setLoading(false);
+ }
+
+ const convos = await client.conversations.list(options);
+ return convos;
+ };
+
+ const sync = async () => {
+ if (!client) {
+ throw new ClientNotFoundError("syncing conversations");
+ }
+
+ setSyncing(true);
+
+ try {
+ await client.conversations.sync();
+ } finally {
+ setSyncing(false);
+ }
+ };
+
+ const getConversationById = async (conversationId: string) => {
+ if (!client) {
+ throw new ClientNotFoundError("fetching a conversation by ID");
+ }
+
+ setLoading(true);
+
+ try {
+ const conversation =
+ await client.conversations.getConversationById(conversationId);
+ return conversation;
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const getMessageById = async (messageId: string) => {
+ if (!client) {
+ throw new ClientNotFoundError("fetching a message by ID");
+ }
+
+ setLoading(true);
+
+ try {
+ const message = await client.conversations.getMessageById(messageId);
+ return message;
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const newGroup = async (
+ members: string[],
+ options: SafeCreateGroupOptions,
+ ) => {
+ if (!client) {
+ throw new ClientNotFoundError("creating a new group");
+ }
+
+ setLoading(true);
+
+ try {
+ const conversation = await client.conversations.newGroup(
+ members,
+ options,
+ );
+ return conversation;
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const newDm = async (member: string) => {
+ if (!client) {
+ throw new ClientNotFoundError("creating a new DM");
+ }
+
+ setLoading(true);
+
+ try {
+ const conversation = await client.conversations.newDm(member);
+ return conversation;
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return {
+ getConversationById,
+ getMessageById,
+ list,
+ loading,
+ newDm,
+ newGroup,
+ sync,
+ syncing,
+ };
+};
diff --git a/apps/xmtp.chat/src/hooks/useIdentity.ts b/apps/xmtp.chat/src/hooks/useIdentity.ts
new file mode 100644
index 000000000..8b1bd2cd4
--- /dev/null
+++ b/apps/xmtp.chat/src/hooks/useIdentity.ts
@@ -0,0 +1,81 @@
+import type { SafeInstallation } from "@xmtp/browser-sdk";
+import { useEffect, useState } from "react";
+import { ClientNotFoundError } from "../helpers/errors";
+import { useClient } from "./useClient";
+
+export const useIdentity = (syncOnMount: boolean = false) => {
+ const { client } = useClient();
+ const [syncing, setSyncing] = useState(false);
+ const [revoking, setRevoking] = useState(false);
+ const [inboxId, setInboxId] = useState(null);
+ const [recoveryAddress, setRecoveryAddress] = useState(null);
+ const [accountAddresses, setAccountAddresses] = useState([]);
+ const [installations, setInstallations] = useState([]);
+
+ useEffect(() => {
+ if (syncOnMount) {
+ void sync();
+ }
+ }, []);
+
+ const sync = async () => {
+ if (!client) {
+ throw new ClientNotFoundError("syncing");
+ }
+
+ setSyncing(true);
+
+ try {
+ const inboxState = await client.inboxState(true);
+ setInboxId(inboxState.inboxId);
+ setAccountAddresses(inboxState.accountAddresses);
+ setRecoveryAddress(inboxState.recoveryAddress);
+ const installations = inboxState.installations.filter(
+ (installation) => installation.id !== client.installationId,
+ );
+ setInstallations(installations);
+ } finally {
+ setSyncing(false);
+ }
+ };
+
+ const revokeInstallation = async (installationIdBytes: Uint8Array) => {
+ if (!client) {
+ throw new ClientNotFoundError("revoking an installation");
+ }
+
+ setRevoking(true);
+
+ try {
+ await client.revokeInstallations([installationIdBytes]);
+ } finally {
+ setRevoking(false);
+ }
+ };
+
+ const revokeAllOtherInstallations = async () => {
+ if (!client) {
+ throw new ClientNotFoundError("revoking all other installations");
+ }
+
+ setRevoking(true);
+
+ try {
+ await client.revokeAllOtherInstallations();
+ } finally {
+ setRevoking(false);
+ }
+ };
+
+ return {
+ accountAddresses,
+ inboxId,
+ installations,
+ recoveryAddress,
+ revokeAllOtherInstallations,
+ revokeInstallation,
+ revoking,
+ sync,
+ syncing,
+ };
+};
diff --git a/apps/xmtp.chat/src/icons/IconArrowLeft.tsx b/apps/xmtp.chat/src/icons/IconArrowLeft.tsx
new file mode 100644
index 000000000..0fe37f54d
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconArrowLeft.tsx
@@ -0,0 +1,23 @@
+export type IconArrowLeftProps = {
+ size?: number;
+};
+
+export const IconArrowLeft: React.FC = ({ size = 16 }) => {
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconCopy.tsx b/apps/xmtp.chat/src/icons/IconCopy.tsx
new file mode 100644
index 000000000..8f19acba9
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconCopy.tsx
@@ -0,0 +1,22 @@
+export type IconCopyProps = {
+ size?: number;
+};
+
+export const IconCopy: React.FC = ({ size = 16 }) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconInfoCircle.tsx b/apps/xmtp.chat/src/icons/IconInfoCircle.tsx
new file mode 100644
index 000000000..fef077029
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconInfoCircle.tsx
@@ -0,0 +1,25 @@
+export type IconInfoCircleProps = {
+ size?: number;
+};
+
+export const IconInfoCircle: React.FC = ({
+ size = 16,
+}) => {
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconLogout.tsx b/apps/xmtp.chat/src/icons/IconLogout.tsx
new file mode 100644
index 000000000..d40a30884
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconLogout.tsx
@@ -0,0 +1,23 @@
+export type IconLogoutProps = {
+ size?: number;
+};
+
+export const IconLogout: React.FC = ({ size = 16 }) => {
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconMessagePlus.tsx b/apps/xmtp.chat/src/icons/IconMessagePlus.tsx
new file mode 100644
index 000000000..11f1af6cf
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconMessagePlus.tsx
@@ -0,0 +1,27 @@
+export type IconMessagePlusProps = {
+ size?: number;
+};
+
+export const IconMessagePlus: React.FC = ({
+ size = 16,
+}) => {
+ return (
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconSettings.tsx b/apps/xmtp.chat/src/icons/IconSettings.tsx
new file mode 100644
index 000000000..045d2a5bb
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconSettings.tsx
@@ -0,0 +1,22 @@
+export type IconSettingsProps = {
+ size?: number;
+};
+
+export const IconSettings: React.FC = ({ size = 16 }) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/icons/IconUser.tsx b/apps/xmtp.chat/src/icons/IconUser.tsx
new file mode 100644
index 000000000..168d79f4f
--- /dev/null
+++ b/apps/xmtp.chat/src/icons/IconUser.tsx
@@ -0,0 +1,22 @@
+export type IconUserProps = {
+ size?: number;
+};
+
+export const IconUser: React.FC = ({ size = 16 }) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/apps/xmtp.chat/src/main.tsx b/apps/xmtp.chat/src/main.tsx
new file mode 100644
index 000000000..5bfc034cf
--- /dev/null
+++ b/apps/xmtp.chat/src/main.tsx
@@ -0,0 +1,36 @@
+import "@mantine/core/styles.css";
+import { MantineProvider } from "@mantine/core";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { createRoot } from "react-dom/client";
+import { BrowserRouter } from "react-router";
+import { createConfig, http, WagmiProvider } from "wagmi";
+import { base, mainnet } from "wagmi/chains";
+import { App } from "./components/App";
+import { RefManagerProvider } from "./components/RefManager";
+import { XMTPProvider } from "./components/XMTPContext";
+
+const queryClient = new QueryClient();
+
+export const config = createConfig({
+ chains: [mainnet],
+ transports: {
+ [mainnet.id]: http(),
+ [base.id]: http(),
+ },
+});
+
+createRoot(document.getElementById("root") as HTMLElement).render(
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+);
diff --git a/apps/xmtp.chat/tsconfig.json b/apps/xmtp.chat/tsconfig.json
new file mode 100644
index 000000000..059531cfc
--- /dev/null
+++ b/apps/xmtp.chat/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "tsconfig/react-app.json",
+ "include": ["src", "vite.config.ts", "postcss.config.cjs"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/examples/react-vite-browser-sdk/vite.config.ts b/apps/xmtp.chat/vite.config.ts
similarity index 83%
rename from examples/react-vite-browser-sdk/vite.config.ts
rename to apps/xmtp.chat/vite.config.ts
index 675f09667..3d7f96fe2 100644
--- a/examples/react-vite-browser-sdk/vite.config.ts
+++ b/apps/xmtp.chat/vite.config.ts
@@ -5,8 +5,7 @@ import { defineConfig } from "vite";
export default defineConfig({
plugins: [react()],
optimizeDeps: {
- exclude: ["@xmtp/browser-sdk"],
- include: ["@xmtp/proto"],
+ exclude: ["@xmtp/wasm-bindings"],
},
server: {
headers: {
diff --git a/examples/react-vite-browser-sdk/.env.example b/examples/react-vite-browser-sdk/.env.example
deleted file mode 100644
index b435a22a9..000000000
--- a/examples/react-vite-browser-sdk/.env.example
+++ /dev/null
@@ -1,2 +0,0 @@
-VITE_PROJECT_ID= # Your Reown (https://reown.com/) project ID
-VITE_ENCRYPTION_KEY= # 32 byte hex string
diff --git a/examples/react-vite-browser-sdk/README.md b/examples/react-vite-browser-sdk/README.md
deleted file mode 100644
index 740c222c3..000000000
--- a/examples/react-vite-browser-sdk/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# React Vite example app
-
-Use this React Vite example app as a tool to start building an app with XMTP. This basic messaging app has an intentionally unopinionated UI to help make it easier for you to build with.
-
-The app is built using the [XMTP client SDK for browsers](/sdks/browser-sdk/README.md), [React](https://react.dev/), and [Vite](https://vitejs.dev/).
-
-To keep up with the latest example app developments, see the [Issues tab](https://github.com/xmtp/xmtp-js/issues) in this repo.
-
-To learn more about XMTP and get answers to frequently asked questions, see the [XMTP documentation](https://xmtp.org/docs).
-
-## Limitations
-
-This example app isn't a complete solution. For example, the list of conversations doesn't update when new messages arrive in existing conversations.
-
-## Developing
-
-1. In `sdks/browser-sdk`, run `yarn build` to build the browser SDK.
-2. In `examples/react-vite-browser-sdk`, run `yarn dev` to start the development server.
-
-## Useful commands
-
-- `yarn clean`: Removes `node_modules`, `dist`, and `.turbo` folders
-- `yarn dev`: Launches the example app and watches for changes, which will trigger a rebuild
-- `yarn typecheck`: Runs `tsc`
diff --git a/examples/react-vite-browser-sdk/package.json b/examples/react-vite-browser-sdk/package.json
deleted file mode 100644
index 1dd3c9239..000000000
--- a/examples/react-vite-browser-sdk/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@xmtp/react-vite-browser-sdk-example",
- "version": "0.0.0",
- "private": true,
- "type": "module",
- "scripts": {
- "clean": "rm -rf .turbo && rm -rf node_modules && yarn clean:dist",
- "clean:dist": "rm -rf dist",
- "dev": "vite",
- "typecheck": "tsc"
- },
- "dependencies": {
- "@rainbow-me/rainbowkit": "^2.2.0",
- "@tanstack/react-query": "^5.60.5",
- "@wagmi/core": "^2.14.6",
- "@xmtp/browser-sdk": "workspace:*",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "viem": "^2.17.4",
- "wagmi": "^2.12.33"
- },
- "devDependencies": {
- "@types/react": "^18.3.12",
- "@types/react-dom": "^18.3.1",
- "@vitejs/plugin-react": "^4.3.3",
- "autoprefixer": "^10.4.20",
- "postcss": "^8.4.49",
- "postcss-preset-env": "^10.1.1",
- "tsconfig": "workspace:*",
- "typescript": "^5.6.3",
- "vite": "^5.4.11"
- }
-}
diff --git a/examples/react-vite-browser-sdk/postcss.config.cjs b/examples/react-vite-browser-sdk/postcss.config.cjs
deleted file mode 100644
index eaccdea29..000000000
--- a/examples/react-vite-browser-sdk/postcss.config.cjs
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- plugins: {
- "postcss-preset-env": {},
- },
-};
diff --git a/examples/react-vite-browser-sdk/src/App.tsx b/examples/react-vite-browser-sdk/src/App.tsx
deleted file mode 100644
index 5e428d82f..000000000
--- a/examples/react-vite-browser-sdk/src/App.tsx
+++ /dev/null
@@ -1,253 +0,0 @@
-import {
- Conversation,
- type Client,
- type DecodedMessage,
-} from "@xmtp/browser-sdk";
-import { useState } from "react";
-import { createClient } from "./createClient";
-
-export const App = () => {
- const [client, setClient] = useState(undefined);
- const [conversations, setConversations] = useState([]);
- const [messages, setMessages] = useState>(
- new Map(),
- );
-
- const handleCreateClient = async () => {
- setClient(await createClient("key1"));
- };
-
- const handleResetClient = () => {
- if (client) {
- client.close();
- }
- setClient(undefined);
- setConversations([]);
- setMessages(new Map());
- };
-
- const handleListGroups = async () => {
- if (client) {
- const groups = await client.conversations.list();
- setConversations(groups);
- }
- };
-
- const handleUpdateGroupName = async (groupId: string, elementId: string) => {
- if (client) {
- const conversation = new Conversation(client, groupId);
- await conversation.sync();
- const element = document.getElementById(elementId) as HTMLInputElement;
- const name = element.value;
- await conversation.updateName(name);
- element.value = "";
- await handleListGroups();
- }
- };
-
- const handleUpdateGroupDescription = async (
- groupId: string,
- elementId: string,
- ) => {
- if (client) {
- const conversation = new Conversation(client, groupId);
- await conversation.sync();
- const element = document.getElementById(elementId) as HTMLInputElement;
- const description = element.value;
- await conversation.updateDescription(description);
- element.value = "";
- await handleListGroups();
- }
- };
-
- const handleListGroupMessages = async (groupId: string) => {
- if (client) {
- const conversation = new Conversation(client, groupId);
- await conversation.sync();
- const groupMessages = await conversation.messages();
- setMessages((prevMessages) => {
- const newMessages = new Map(prevMessages);
- newMessages.set(groupId, groupMessages);
- return newMessages;
- });
- }
- };
-
- const handleSendGroupMessage = async (groupId: string, elementId: string) => {
- if (client) {
- const conversation = new Conversation(client, groupId);
- await conversation.sync();
- const element = document.getElementById(elementId) as HTMLInputElement;
- const message = element.value;
- await conversation.send(message);
- element.value = "";
- }
- };
-
- const handleCreateGroup = async () => {
- if (client) {
- const element = document.getElementById(
- "create-group-name",
- ) as HTMLInputElement;
- const name = element.value;
- const group = await client.conversations.newGroup([]);
- await group.sync();
- await group.updateName(name);
- element.value = "";
- await handleListGroups();
- }
- };
-
- const handleSyncGroup = async (groupId: string) => {
- if (client) {
- const conversation = new Conversation(client, groupId);
- await conversation.sync();
- await handleListGroupMessages(groupId);
- }
- };
-
- return (
-
-
XMTP V3
-
- {!client && (
- void handleCreateClient()} type="button">
- Create client
-
- )}
- {client && (
- <>
- {
- handleResetClient();
- }}
- type="button">
- Reset client
-
- void handleListGroups()} type="button">
- List groups
-
- >
- )}
-
- {client && (
- <>
-
-
Client details
-
-
Address:
-
{client.accountAddress}
-
-
-
Inbox ID:
-
{client.inboxId}
-
-
-
Installation ID:
-
{client.installationId}
-
-
-
-
-
- void handleCreateGroup()} type="button">
- Create group
-
-
-
- >
- )}
- {conversations.length > 0 && (
-
-
Conversations
-
- {conversations.map((conversation) => (
-
-
{conversation.id}
-
-
-
-
- void handleUpdateGroupName(
- conversation.id,
- `group-name-${conversation.id}`,
- )
- }
- type="button">
- Update group name
-
-
-
-
-
- void handleUpdateGroupDescription(
- conversation.id,
- `group-description-${conversation.id}`,
- )
- }
- type="button">
- Update group description
-
-
-
- void handleSyncGroup(conversation.id)}
- type="button">
- Sync group
-
-
- void handleListGroupMessages(conversation.id)
- }
- type="button">
- List messages
-
-
-
-
-
- void handleSendGroupMessage(
- conversation.id,
- `group-send-message-${conversation.id}`,
- )
- }
- type="button">
- Send message
-
-
-
-
-
Name:
-
{conversation.name}
-
-
-
Description:
-
{conversation.description}
-
- {messages.get(conversation.id) && (
-
-
Messages
- {messages.get(conversation.id)?.map((message) => (
-
-
{JSON.stringify(message.content, null, 2)}
-
- ))}
-
- )}
-
- ))}
-
-
- )}
-
- );
-};
diff --git a/examples/react-vite-browser-sdk/src/createClient.ts b/examples/react-vite-browser-sdk/src/createClient.ts
deleted file mode 100644
index 5c1dec9bd..000000000
--- a/examples/react-vite-browser-sdk/src/createClient.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Client, type Signer } from "@xmtp/browser-sdk";
-import { toBytes } from "viem/utils";
-import { createWallet } from "./wallets";
-
-export const createClient = async (walletKey: string) => {
- const encryptionKeyHex = import.meta.env.VITE_ENCRYPTION_KEY;
- if (!encryptionKeyHex) {
- throw new Error("VITE_ENCRYPTION_KEY must be set in the environment");
- }
- const encryptionBytes = toBytes(encryptionKeyHex);
- const wallet = createWallet(walletKey);
- const signer: Signer = {
- getAddress: () => wallet.account.address,
- signMessage: async (message: string) => {
- const signature = await wallet.signMessage({
- message,
- });
- return toBytes(signature);
- },
- };
- const client = await Client.create(signer, encryptionBytes);
- return client;
-};
diff --git a/examples/react-vite-browser-sdk/src/index.css b/examples/react-vite-browser-sdk/src/index.css
deleted file mode 100644
index cf988d17b..000000000
--- a/examples/react-vite-browser-sdk/src/index.css
+++ /dev/null
@@ -1,111 +0,0 @@
-:root {
- font-family: "SF Pro Rounded", Inter, system-ui, Avenir, Helvetica, Arial,
- sans-serif;
- line-height: 1.3;
- font-weight: 400;
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- -webkit-text-size-adjust: 100%;
-}
-
-body {
- margin: 0;
- min-width: 320px;
- height: 100vh;
- display: flex;
- flex-direction: column;
- color: #213547;
- background-color: #fff;
-}
-
-#root {
- flex-grow: 1;
- display: flex;
- flex-direction: column;
-}
-
-#root > [data-rk] {
- flex-grow: 1;
- display: flex;
- flex-direction: column;
-}
-
-.App {
- width: 800px;
- margin: 0 auto;
- padding: 20px;
-}
-
-.App h1 {
- text-align: center;
- margin-top: 0;
-}
-
-.Actions {
- display: flex;
- gap: 10px;
- justify-content: center;
- padding: 20px;
-}
-
-.ClientDetail {
- display: flex;
- gap: 10px;
- justify-content: space-between;
-}
-
-.ConversationActions {
- display: flex;
- gap: 10px;
- justify-content: center;
- align-items: center;
- padding: 10px;
-}
-
-.ConversationAction {
- padding: 6px;
- border: 1px solid #213547;
- border-radius: 6px;
- background-color: #f0f0f0;
- display: flex;
- gap: 2px;
- flex-direction: column;
-}
-
-.ConversationWrapper {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-
-.Conversation {
- border: 1px solid #213547;
- border-radius: 10px;
- padding: 10px;
-}
-
-.Conversation > h3 {
- margin-top: 0;
-}
-
-.ConversationDetail {
- display: flex;
- gap: 10px;
- justify-content: space-between;
-}
-
-.ConversationMessages {
- display: flex;
- flex-direction: column;
- gap: 4px;
-}
-
-.ConversationMessage {
- border: 1px solid #213547;
- border-radius: 6px;
- padding: 4px;
- background-color: #f0f0f0;
- text-wrap: pretty;
-}
diff --git a/examples/react-vite-browser-sdk/src/main.tsx b/examples/react-vite-browser-sdk/src/main.tsx
deleted file mode 100644
index ba5dd8a1b..000000000
--- a/examples/react-vite-browser-sdk/src/main.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import "@rainbow-me/rainbowkit/styles.css";
-import { getDefaultConfig, RainbowKitProvider } from "@rainbow-me/rainbowkit";
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import { http } from "@wagmi/core";
-import { mainnet } from "@wagmi/core/chains";
-import { StrictMode } from "react";
-import { createRoot } from "react-dom/client";
-import { WagmiProvider } from "wagmi";
-import { App } from "./App";
-import "./index.css";
-
-const projectId = import.meta.env.VITE_PROJECT_ID;
-if (!projectId) {
- throw new Error("VITE_PROJECT_ID must be set in the environment");
-}
-
-export const config = getDefaultConfig({
- appName: "XMTP V3 Browser SDK Example",
- projectId,
- chains: [mainnet],
- transports: {
- [mainnet.id]: http(),
- },
-});
-
-const queryClient = new QueryClient();
-
-createRoot(document.getElementById("root") as HTMLElement).render(
-
-
-
-
-
-
-
-
- ,
-);
diff --git a/examples/react-vite-browser-sdk/src/wallets.ts b/examples/react-vite-browser-sdk/src/wallets.ts
deleted file mode 100644
index a2b438a7c..000000000
--- a/examples/react-vite-browser-sdk/src/wallets.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import {
- createWalletClient,
- http,
- type PrivateKeyAccount,
- type Transport,
- type WalletClient,
-} from "viem";
-import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
-import { mainnet } from "viem/chains";
-
-const keys: Record = {
- // address: 0xb879f1d8FD73EC057c02D681880169e5721a6d7F
- key1: "0xf8ced372cdb9a67bed1843650a89a59859369bf9900c0bc75741f2740e93cb04",
- // address: 0x7ad9d3892D5EEC0586920D3E0ac813aaeF881488
- key2: "0xb562d61bc9fe203a639dfc0c3f875b3411fe8ae211c5722ab9124a1009bda32a",
- // address: 0x73655B77df59d378d396918C3426cc5219EfB3c8
- key3: "0x724028dcbf931ff1f2730ad76c0b7b8b07dbf7f0a56408be3e305be1b81edfe0",
- // address: 0x5aB557A6b8FF7D7a9A42F223fAA376A4732Eb15a
- key4: "0x4420cde3d475a038739d1d47cfd690799c0f2e1b84d871c24f221c2dee4e4121",
- // address: 0x38F966794cf349f2c91116e94f587Fc3aafDC3F4
- key5: "0xd34cc37587785349013f3f10cadbe7bf8dfeb8a95c86724887e58816b734fcfb",
-};
-
-export const createWallet = (
- key: keyof typeof keys,
-): WalletClient =>
- createWalletClient({
- account: privateKeyToAccount(keys[key] ?? generatePrivateKey()),
- chain: mainnet,
- transport: http(),
- });
diff --git a/examples/react-vite-browser-sdk/tsconfig.json b/examples/react-vite-browser-sdk/tsconfig.json
deleted file mode 100644
index ce1c7e0fd..000000000
--- a/examples/react-vite-browser-sdk/tsconfig.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "extends": "tsconfig/react-app.json",
- "include": ["src", "vite.config.ts", "postcss.config.cjs"]
-}
diff --git a/package.json b/package.json
index a11bd93d3..0f88cc308 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,7 @@
"private": true,
"type": "module",
"workspaces": [
+ "apps/*",
"content-types/*",
"examples/*",
"packages/*",
diff --git a/yarn.lock b/yarn.lock
index c3acf5bc4..605570bbc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -26,7 +26,7 @@ __metadata:
languageName: node
linkType: hard
-"@adraffy/ens-normalize@npm:1.11.0":
+"@adraffy/ens-normalize@npm:1.11.0, @adraffy/ens-normalize@npm:^1.10.1":
version: 1.11.0
resolution: "@adraffy/ens-normalize@npm:1.11.0"
checksum: 10/abef75f21470ea43dd6071168e092d2d13e38067e349e76186c78838ae174a46c3e18ca50921d05bea6ec3203074147c9e271f8cb6531d1c2c0e146f3199ddcb
@@ -318,7 +318,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5":
+"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.5.5":
version: 7.25.7
resolution: "@babel/runtime@npm:7.25.7"
dependencies:
@@ -327,6 +327,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.8.7":
+ version: 7.26.0
+ resolution: "@babel/runtime@npm:7.26.0"
+ dependencies:
+ regenerator-runtime: "npm:^0.14.0"
+ checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699
+ languageName: node
+ linkType: hard
+
"@babel/template@npm:^7.25.7":
version: 7.25.7
resolution: "@babel/template@npm:7.25.7"
@@ -681,496 +690,6 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/cascade-layer-name-parser@npm:^2.0.4":
- version: 2.0.4
- resolution: "@csstools/cascade-layer-name-parser@npm:2.0.4"
- peerDependencies:
- "@csstools/css-parser-algorithms": ^3.0.4
- "@csstools/css-tokenizer": ^3.0.3
- checksum: 10/8c1d92f7840ecb402bce9b5770c9eb8ae000f42cb317a069cb10172a4e63d4dcbe1961f8bcf35f5106f8d162066f2bac3923e151d7cb5380b10fc265a62db5ea
- languageName: node
- linkType: hard
-
-"@csstools/color-helpers@npm:^5.0.1":
- version: 5.0.1
- resolution: "@csstools/color-helpers@npm:5.0.1"
- checksum: 10/4cb25b34997c9b0e9f401833e27942636494bc3c7fda5c6633026bc3fdfdda1c67be68ea048058bfba449a86ec22332e23b4ec5982452c50b67880c4cb13a660
- languageName: node
- linkType: hard
-
-"@csstools/css-calc@npm:^2.1.0":
- version: 2.1.0
- resolution: "@csstools/css-calc@npm:2.1.0"
- peerDependencies:
- "@csstools/css-parser-algorithms": ^3.0.4
- "@csstools/css-tokenizer": ^3.0.3
- checksum: 10/2a7dc753a43dd73fb987aad036a90a497ab43fe4ab7c0da1b4d4cae449e98e5a6cb2a36c715ac7dd136e63b8767c957274124f174c44aee0cc2b075b1507f93f
- languageName: node
- linkType: hard
-
-"@csstools/css-color-parser@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/css-color-parser@npm:3.0.6"
- dependencies:
- "@csstools/color-helpers": "npm:^5.0.1"
- "@csstools/css-calc": "npm:^2.1.0"
- peerDependencies:
- "@csstools/css-parser-algorithms": ^3.0.4
- "@csstools/css-tokenizer": ^3.0.3
- checksum: 10/ca06bed7c2857a8963906e38394cb8c5da7f28cce03e6ad5642e7f2c204173af2c305e8fee9169fbc48de268e875cdc2e258569813635e9155d94137cdd7ea7d
- languageName: node
- linkType: hard
-
-"@csstools/css-parser-algorithms@npm:^3.0.4":
- version: 3.0.4
- resolution: "@csstools/css-parser-algorithms@npm:3.0.4"
- peerDependencies:
- "@csstools/css-tokenizer": ^3.0.3
- checksum: 10/dfb6926218d9f8ba25d8b43ea46c03863c819481f8c55e4de4925780eaab9e6bcd6bead1d56b4ef82d09fcd9d69a7db2750fa9db08eece9470fd499dc76d0edb
- languageName: node
- linkType: hard
-
-"@csstools/css-tokenizer@npm:^3.0.3":
- version: 3.0.3
- resolution: "@csstools/css-tokenizer@npm:3.0.3"
- checksum: 10/6baa3160e426e1f177b8f10d54ec7a4a596090f65a05f16d7e9e4da049962a404eabc5f885f4867093702c259cd4080ac92a438326e22dea015201b3e71f5bbb
- languageName: node
- linkType: hard
-
-"@csstools/media-query-list-parser@npm:^4.0.2":
- version: 4.0.2
- resolution: "@csstools/media-query-list-parser@npm:4.0.2"
- peerDependencies:
- "@csstools/css-parser-algorithms": ^3.0.4
- "@csstools/css-tokenizer": ^3.0.3
- checksum: 10/8aae6337d21255d34e4f6dc6df213566e35bb769fe131006ea4200b643773f3213f8ed0ab011cd85dbe3426766c408d0fe1d04d18e821add9ae7f29cda0a8b26
- languageName: node
- linkType: hard
-
-"@csstools/postcss-cascade-layers@npm:^5.0.1":
- version: 5.0.1
- resolution: "@csstools/postcss-cascade-layers@npm:5.0.1"
- dependencies:
- "@csstools/selector-specificity": "npm:^5.0.0"
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/ca0a3e324d914567f36e9ec48da290c9d10e9315dc77632f14ec8a8c608fd3b573ca146eb8aa81382013d998c4896f6ac53af48c71b23d0b3fa1b4ea5441b599
- languageName: node
- linkType: hard
-
-"@csstools/postcss-color-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-color-function@npm:4.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/72d18020560053707281fbc99b3d36621bb4c70d8c9fbdb123514023ead2f4c542f1520ec4a503ae743e54ce9595ec9da9616659678b837243cda7d8d2dd6864
- languageName: node
- linkType: hard
-
-"@csstools/postcss-color-mix-function@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/postcss-color-mix-function@npm:3.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/839845f987eb61b1200b5bad380f55bbdf0992ff5b69d152892aed6b405c33ddefdc9767c3ae7c2a34519a3dc8a89e955e3c03adcc7b268d844a965e01fa3a9e
- languageName: node
- linkType: hard
-
-"@csstools/postcss-content-alt-text@npm:^2.0.4":
- version: 2.0.4
- resolution: "@csstools/postcss-content-alt-text@npm:2.0.4"
- dependencies:
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/8198b43dac4dfdcb630bd18bd7c065252e8133a7252815fed13d9ec38b3ffae9400832997763fe2ceb45a490c072d1f2d725d520cf4f2950a4448f27b11998be
- languageName: node
- linkType: hard
-
-"@csstools/postcss-exponential-functions@npm:^2.0.5":
- version: 2.0.5
- resolution: "@csstools/postcss-exponential-functions@npm:2.0.5"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/b97292a76189a59762b37fa85672a07c29178599bc707fc56bc7485ed76beabe936f0688f5b0c8a50585733b3d5d4aab4aa3c0d5d6368bbabc8a66d669ad4f59
- languageName: node
- linkType: hard
-
-"@csstools/postcss-font-format-keywords@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0"
- dependencies:
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/63091d4748cfc5a51e3c288cd620f058a4e776ba15da6180edaee94aaad9c4e92076f575d064dabc00b28966b33dd1e59f84a6ca6a66aed59556ef92a0dfed45
- languageName: node
- linkType: hard
-
-"@csstools/postcss-gamut-mapping@npm:^2.0.6":
- version: 2.0.6
- resolution: "@csstools/postcss-gamut-mapping@npm:2.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/2af752d7b2ffe25f3172d601f967260432f2ff8b5648906ae2a0855dcd151f38301a5c32945701feef44696bfc28b74b15daed18c492e95abb6d60ccd2e77eee
- languageName: node
- linkType: hard
-
-"@csstools/postcss-gradients-interpolation-method@npm:^5.0.6":
- version: 5.0.6
- resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/5cd8b917c7d803a4417fce5dfb1bd0ac4986f49ab9916ba2195d09cb9873d2f2cf811a26575192f8fe00a430717ff27c79b2c619ccefc03bda1054ddc6afc616
- languageName: node
- linkType: hard
-
-"@csstools/postcss-hwb-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-hwb-function@npm:4.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/67502638e091b2e5150285cb5ca0d55d66cbdff8f12340aad5359ded0d26f12c789a161258c84109f4087ed9615782ca3ef8dc61351ea03636f8b6e00340408c
- languageName: node
- linkType: hard
-
-"@csstools/postcss-ic-unit@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-ic-unit@npm:4.0.0"
- dependencies:
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/1d88e7d3aa906fb7e50ceff27533c9ed424135ac876b2c05f45d4c006adadb0e7234fd702fa50d2201763b2d8202d8d720984d8c4505bad02e2f4c86aabec53c
- languageName: node
- linkType: hard
-
-"@csstools/postcss-initial@npm:^2.0.0":
- version: 2.0.0
- resolution: "@csstools/postcss-initial@npm:2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/d4187cb05cf1765f923228a9d1720f129ff7670fb5a6c53a8d09562d61951d344479bf78641b1af772f02a5627d8de2b8576d7194828a30f3ffcd7ed98d49795
- languageName: node
- linkType: hard
-
-"@csstools/postcss-is-pseudo-class@npm:^5.0.1":
- version: 5.0.1
- resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.1"
- dependencies:
- "@csstools/selector-specificity": "npm:^5.0.0"
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/2f7cedf387f54cd061c4f4c2689fc9cac0dfe8f2c8d527e49ce49b810abccbb17a67f0b536de31486472609da5ae9bdef372ea9be1079231a3a1d87f5a48c173
- languageName: node
- linkType: hard
-
-"@csstools/postcss-light-dark-function@npm:^2.0.7":
- version: 2.0.7
- resolution: "@csstools/postcss-light-dark-function@npm:2.0.7"
- dependencies:
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/cf614b5bdb3cc7bebf98408d03cdfc26a11a1b2175c5c14a516d7c6f39d5a5623f18bfa4754f9dbf0d3bfba7a320a3aa18258aa5095642cb560ffd3f2eea167b
- languageName: node
- linkType: hard
-
-"@csstools/postcss-logical-float-and-clear@npm:^3.0.0":
- version: 3.0.0
- resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/793d9a89c28d4809a83b6111d321f60947a59f119d61046e5c4023ce2caedbb221298e69b6df38995e51b763545807db7b03da47e47461622f32928fec92b65f
- languageName: node
- linkType: hard
-
-"@csstools/postcss-logical-overflow@npm:^2.0.0":
- version: 2.0.0
- resolution: "@csstools/postcss-logical-overflow@npm:2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/bf73ea1d7754f59773af5a7b434e9eaa2ce05c8fe7aa26a726dce8f2a42abb0f5686fbf9672d25912250226174c35f2c5737ca072d21f8b68420500b7449fe58
- languageName: node
- linkType: hard
-
-"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0":
- version: 2.0.0
- resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/bf043fdad02b9578fc2dcddb409b014a15dee65a9813ceb583237dff1caf807e18101f68bde2b0d8b685139d823114ab8deed6da3027878d11a945755824d3b1
- languageName: node
- linkType: hard
-
-"@csstools/postcss-logical-resize@npm:^3.0.0":
- version: 3.0.0
- resolution: "@csstools/postcss-logical-resize@npm:3.0.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/3be1133a9ac27e0a0d73b19d573adc00ad78a697522eaf6c9de90260882ba8ff0904c7ab3e68379ee7724e28661c4b497cb665e258214bc8355f4a0d91021c46
- languageName: node
- linkType: hard
-
-"@csstools/postcss-logical-viewport-units@npm:^3.0.3":
- version: 3.0.3
- resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.3"
- dependencies:
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/bdcca654792f13959a5c657576daafb0bb87c359f6e8d2bec93e21c89418531258968688554e7bef44ab5455f6de04d1bd49f438d7ef8d75653446e0b08ddf8d
- languageName: node
- linkType: hard
-
-"@csstools/postcss-media-minmax@npm:^2.0.5":
- version: 2.0.5
- resolution: "@csstools/postcss-media-minmax@npm:2.0.5"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/media-query-list-parser": "npm:^4.0.2"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/945883f784bf1ab0bbcec84cc75333ef564f586a9b4357ef75f548a52242ab0d6155e543799168172a82136256985dd78bbd3e658f11b58d922158f2b5fadcc2
- languageName: node
- linkType: hard
-
-"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.4":
- version: 3.0.4
- resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.4"
- dependencies:
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/media-query-list-parser": "npm:^4.0.2"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/4604a9a9cf4599089edf847c14307833e02b2cbf99e3328770bb61d9adef2077b43d5bedf4b84509d3e0962d97d37a1a29980a2c6db38076a830c34f896a998d
- languageName: node
- linkType: hard
-
-"@csstools/postcss-nested-calc@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-nested-calc@npm:4.0.0"
- dependencies:
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/f334861687d7e3a4b9c26940e767a06f07e0095cab405a5b086fca407d6f743c57b552d4504ba7d5b1700a97da3507a41bf3bc2d126a26028b79f96ea38b6af5
- languageName: node
- linkType: hard
-
-"@csstools/postcss-normalize-display-values@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-normalize-display-values@npm:4.0.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/750093837486da6dd0cc66183fe9909a18485f23610669806b708ab9942c721a773997cde37fd7ee085aca3d6de065ffd5609c77df5e2f303d67af106e53726e
- languageName: node
- linkType: hard
-
-"@csstools/postcss-oklab-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-oklab-function@npm:4.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/5bfc9116473adc5bf55ad33f9d9bab2ec4a994b86a20462fb847bbf38471f785e445dab5869c230a609ec80e28a78fcdb6b381b47853369ab904d7fcde9db819
- languageName: node
- linkType: hard
-
-"@csstools/postcss-progressive-custom-properties@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-progressive-custom-properties@npm:4.0.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/6f0e6dc8c7a58d9c6296c73fea8585bc618fa36a97efd4648b065ec0d11b805c0c3e9b23e1ddf1a1c7d442ec7abd06190e21d467f406bab800cfcd0dfbeafb33
- languageName: node
- linkType: hard
-
-"@csstools/postcss-random-function@npm:^1.0.1":
- version: 1.0.1
- resolution: "@csstools/postcss-random-function@npm:1.0.1"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/9cf429d2b99d0190c6082ee44be4e8498126e65521c34f11955ddec139ca4aaf8dd8d8f20ca8d96556e2f8ea98cc584f6feccbcf90249e78d9cd2fc9c85a0087
- languageName: node
- linkType: hard
-
-"@csstools/postcss-relative-color-syntax@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/a2f0e70e7596ccb64ba4a092208f1b42acc83f8e3c5cbd67c2a1ee74ec92f72c5ac53b638f8eaea48b53575337e36fa3ae7886301c216c565b9b6a2fb3a3f958
- languageName: node
- linkType: hard
-
-"@csstools/postcss-scope-pseudo-class@npm:^4.0.1":
- version: 4.0.1
- resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/043667ad54b3a26e619d6c16129c1f4d8f8c7cd1c52443475aa7782dbc411390c23bd2fe41ea9c6a3f280594abbcdd9d4117a3d7c27cd2a77e31e6fd11e29fc0
- languageName: node
- linkType: hard
-
-"@csstools/postcss-sign-functions@npm:^1.1.0":
- version: 1.1.0
- resolution: "@csstools/postcss-sign-functions@npm:1.1.0"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/2818032372d9a2ab1362d071bee20e2091a99b68ddeef6920d82fcf87d926205d364676c52727a1274ce038146c7beae7e934e250d941301326918c02002e704
- languageName: node
- linkType: hard
-
-"@csstools/postcss-stepped-value-functions@npm:^4.0.5":
- version: 4.0.5
- resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.5"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/ca4cd8f8699268228d194f7c108bbc55df941980dda3cd658f34f7f63ac7d117acadb329f0cdbe013338983fd3b6dbb762ec789fb898f9052ed428daa39c4e38
- languageName: node
- linkType: hard
-
-"@csstools/postcss-text-decoration-shorthand@npm:^4.0.1":
- version: 4.0.1
- resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.1"
- dependencies:
- "@csstools/color-helpers": "npm:^5.0.1"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/0036be59e643c8251db6c2d729a1828d8f2fadddecf8dd11dd68f7289778c676da14d7a7c1d0f6c859f174f69f535734a6267f269673d0521cb9a98b1680d17b
- languageName: node
- linkType: hard
-
-"@csstools/postcss-trigonometric-functions@npm:^4.0.5":
- version: 4.0.5
- resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.5"
- dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/d9d23acef6e5569f7d838d3a065727c8a5a1e44986ae320d63492a88b8f17cd6606177bdf042a50faf945d4b0aea33b82b18736f0b97e3f8c746adf31dbe8a6b
- languageName: node
- linkType: hard
-
-"@csstools/postcss-unset-value@npm:^4.0.0":
- version: 4.0.0
- resolution: "@csstools/postcss-unset-value@npm:4.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/af65b1c59fe93fa15ad6e5a6edbfd6fe89a3c6e19118a4729592f623c1f55b14518f2de3e8ef2bb6838b1540ebffc9df1a4f1e097dea44abf0faeefeb93d1f58
- languageName: node
- linkType: hard
-
-"@csstools/selector-resolve-nested@npm:^3.0.0":
- version: 3.0.0
- resolution: "@csstools/selector-resolve-nested@npm:3.0.0"
- peerDependencies:
- postcss-selector-parser: ^7.0.0
- checksum: 10/2059b6d1931d157162fb4a79ebdea614cf2b0024609f5e5cba4aa44a80367b25503c22c49bff99de4fa5fa921ce713cc642fa8aa562f3535e8d0126e6b41778e
- languageName: node
- linkType: hard
-
-"@csstools/selector-specificity@npm:^5.0.0":
- version: 5.0.0
- resolution: "@csstools/selector-specificity@npm:5.0.0"
- peerDependencies:
- postcss-selector-parser: ^7.0.0
- checksum: 10/8df1a01a1fa52b66c7ba0286e1c77d1faff45009876f09ddcac542a1c4bca9f34ee92a10acf056b8e7b7ac93679c1635496c6cdfd7d88dbaff2b6afd1eb823ec
- languageName: node
- linkType: hard
-
-"@csstools/utilities@npm:^2.0.0":
- version: 2.0.0
- resolution: "@csstools/utilities@npm:2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/c9c8d82063ec5156d56b056c9124fed95714f05d7c1a64043174b0559aa099989f17a826579f22045384defe152e32d6355b7a9660cfed96819f43fccf277941
- languageName: node
- linkType: hard
-
"@ecies/ciphers@npm:^0.2.1":
version: 0.2.1
resolution: "@ecies/ciphers@npm:0.2.1"
@@ -1180,13 +699,6 @@ __metadata:
languageName: node
linkType: hard
-"@emotion/hash@npm:^0.9.0":
- version: 0.9.2
- resolution: "@emotion/hash@npm:0.9.2"
- checksum: 10/379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387
- languageName: node
- linkType: hard
-
"@esbuild/aix-ppc64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/aix-ppc64@npm:0.21.5"
@@ -1194,6 +706,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/aix-ppc64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/aix-ppc64@npm:0.24.0"
+ conditions: os=aix & cpu=ppc64
+ languageName: node
+ linkType: hard
+
"@esbuild/android-arm64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/android-arm64@npm:0.21.5"
@@ -1201,6 +720,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/android-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/android-arm64@npm:0.24.0"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/android-arm@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/android-arm@npm:0.21.5"
@@ -1208,6 +734,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/android-arm@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/android-arm@npm:0.24.0"
+ conditions: os=android & cpu=arm
+ languageName: node
+ linkType: hard
+
"@esbuild/android-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/android-x64@npm:0.21.5"
@@ -1215,6 +748,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/android-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/android-x64@npm:0.24.0"
+ conditions: os=android & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/darwin-arm64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/darwin-arm64@npm:0.21.5"
@@ -1222,6 +762,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/darwin-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/darwin-arm64@npm:0.24.0"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/darwin-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/darwin-x64@npm:0.21.5"
@@ -1229,6 +776,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/darwin-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/darwin-x64@npm:0.24.0"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/freebsd-arm64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/freebsd-arm64@npm:0.21.5"
@@ -1236,6 +790,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/freebsd-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/freebsd-arm64@npm:0.24.0"
+ conditions: os=freebsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/freebsd-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/freebsd-x64@npm:0.21.5"
@@ -1243,6 +804,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/freebsd-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/freebsd-x64@npm:0.24.0"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-arm64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-arm64@npm:0.21.5"
@@ -1250,6 +818,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-arm64@npm:0.24.0"
+ conditions: os=linux & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-arm@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-arm@npm:0.21.5"
@@ -1257,6 +832,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-arm@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-arm@npm:0.24.0"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-ia32@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-ia32@npm:0.21.5"
@@ -1264,6 +846,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-ia32@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-ia32@npm:0.24.0"
+ conditions: os=linux & cpu=ia32
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-loong64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-loong64@npm:0.21.5"
@@ -1271,6 +860,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-loong64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-loong64@npm:0.24.0"
+ conditions: os=linux & cpu=loong64
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-mips64el@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-mips64el@npm:0.21.5"
@@ -1278,6 +874,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-mips64el@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-mips64el@npm:0.24.0"
+ conditions: os=linux & cpu=mips64el
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-ppc64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-ppc64@npm:0.21.5"
@@ -1285,6 +888,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-ppc64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-ppc64@npm:0.24.0"
+ conditions: os=linux & cpu=ppc64
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-riscv64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-riscv64@npm:0.21.5"
@@ -1292,6 +902,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-riscv64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-riscv64@npm:0.24.0"
+ conditions: os=linux & cpu=riscv64
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-s390x@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-s390x@npm:0.21.5"
@@ -1299,6 +916,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-s390x@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-s390x@npm:0.24.0"
+ conditions: os=linux & cpu=s390x
+ languageName: node
+ linkType: hard
+
"@esbuild/linux-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/linux-x64@npm:0.21.5"
@@ -1306,6 +930,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/linux-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/linux-x64@npm:0.24.0"
+ conditions: os=linux & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/netbsd-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/netbsd-x64@npm:0.21.5"
@@ -1313,6 +944,20 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/netbsd-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/netbsd-x64@npm:0.24.0"
+ conditions: os=netbsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/openbsd-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/openbsd-arm64@npm:0.24.0"
+ conditions: os=openbsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/openbsd-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/openbsd-x64@npm:0.21.5"
@@ -1320,6 +965,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/openbsd-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/openbsd-x64@npm:0.24.0"
+ conditions: os=openbsd & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/sunos-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/sunos-x64@npm:0.21.5"
@@ -1327,6 +979,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/sunos-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/sunos-x64@npm:0.24.0"
+ conditions: os=sunos & cpu=x64
+ languageName: node
+ linkType: hard
+
"@esbuild/win32-arm64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/win32-arm64@npm:0.21.5"
@@ -1334,6 +993,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/win32-arm64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/win32-arm64@npm:0.24.0"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@esbuild/win32-ia32@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/win32-ia32@npm:0.21.5"
@@ -1341,6 +1007,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/win32-ia32@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/win32-ia32@npm:0.24.0"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
"@esbuild/win32-x64@npm:0.21.5":
version: 0.21.5
resolution: "@esbuild/win32-x64@npm:0.21.5"
@@ -1348,6 +1021,13 @@ __metadata:
languageName: node
linkType: hard
+"@esbuild/win32-x64@npm:0.24.0":
+ version: 0.24.0
+ resolution: "@esbuild/win32-x64@npm:0.24.0"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0":
version: 4.4.0
resolution: "@eslint-community/eslint-utils@npm:4.4.0"
@@ -1887,10 +1567,62 @@ __metadata:
languageName: node
linkType: hard
-"@fastify/busboy@npm:^2.0.0":
- version: 2.1.1
- resolution: "@fastify/busboy@npm:2.1.1"
- checksum: 10/2bb8a7eca8289ed14c9eb15239bc1019797454624e769b39a0b90ed204d032403adc0f8ed0d2aef8a18c772205fa7808cf5a1b91f21c7bfc7b6032150b1062c5
+"@fastify/busboy@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "@fastify/busboy@npm:2.1.1"
+ checksum: 10/2bb8a7eca8289ed14c9eb15239bc1019797454624e769b39a0b90ed204d032403adc0f8ed0d2aef8a18c772205fa7808cf5a1b91f21c7bfc7b6032150b1062c5
+ languageName: node
+ linkType: hard
+
+"@floating-ui/core@npm:^1.6.0":
+ version: 1.6.8
+ resolution: "@floating-ui/core@npm:1.6.8"
+ dependencies:
+ "@floating-ui/utils": "npm:^0.2.8"
+ checksum: 10/87d52989c3d2cc80373bc153b7a40814db3206ce7d0b2a2bdfb63e2ff39ffb8b999b1b0ccf28e548000ebf863bf16e2bed45eab4c4d287a5dbe974ef22368d82
+ languageName: node
+ linkType: hard
+
+"@floating-ui/dom@npm:^1.0.0":
+ version: 1.6.12
+ resolution: "@floating-ui/dom@npm:1.6.12"
+ dependencies:
+ "@floating-ui/core": "npm:^1.6.0"
+ "@floating-ui/utils": "npm:^0.2.8"
+ checksum: 10/5c8e5fdcd3843140a606ab6dc6c12ad740f44e66b898966ef877393faaede0bbe14586e1049e2c2f08856437da8847e884a2762e78275fefa65a5a9cd71e580d
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react-dom@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "@floating-ui/react-dom@npm:2.1.2"
+ dependencies:
+ "@floating-ui/dom": "npm:^1.0.0"
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: 10/2a67dc8499674e42ff32c7246bded185bb0fdd492150067caf9568569557ac4756a67787421d8604b0f241e5337de10762aee270d9aeef106d078a0ff13596c4
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react@npm:^0.26.28":
+ version: 0.26.28
+ resolution: "@floating-ui/react@npm:0.26.28"
+ dependencies:
+ "@floating-ui/react-dom": "npm:^2.1.2"
+ "@floating-ui/utils": "npm:^0.2.8"
+ tabbable: "npm:^6.0.0"
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: 10/7f8e6b27db48b68ca94756687af21857be04e7360ac922d7c8e22411f2895df6384af7bd40f4b48663d3cc5809bb5c6574cd9c9ea15543ec747b9a8e1c8c3008
+ languageName: node
+ linkType: hard
+
+"@floating-ui/utils@npm:^0.2.8":
+ version: 0.2.8
+ resolution: "@floating-ui/utils@npm:0.2.8"
+ checksum: 10/3e3ea3b2de06badc4baebdf358b3dbd77ccd9474a257a6ef237277895943db2acbae756477ec64de65a2a1436d94aea3107129a1feeef6370675bf2b161c1abc
languageName: node
linkType: hard
@@ -2102,6 +1834,81 @@ __metadata:
languageName: node
linkType: hard
+"@mantine/core@npm:^7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/core@npm:7.14.3"
+ dependencies:
+ "@floating-ui/react": "npm:^0.26.28"
+ clsx: "npm:^2.1.1"
+ react-number-format: "npm:^5.4.2"
+ react-remove-scroll: "npm:^2.6.0"
+ react-textarea-autosize: "npm:8.5.5"
+ type-fest: "npm:^4.27.0"
+ peerDependencies:
+ "@mantine/hooks": 7.14.3
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+ checksum: 10/53c6313aaf169e2de8f0ed36ad7f3cb29ec1427ea9978312b3147441f4707728efaa7d8d6be62169a4ab2fa78442243b7ced5db1409b09fb194795918b3dc3ca
+ languageName: node
+ linkType: hard
+
+"@mantine/form@npm:^7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/form@npm:7.14.3"
+ dependencies:
+ fast-deep-equal: "npm:^3.1.3"
+ klona: "npm:^2.0.6"
+ peerDependencies:
+ react: ^18.x || ^19.x
+ checksum: 10/60f16bcd299021dd9ed06573353b0bc54f875e1884e94939d770960ecc09aeb2d960720f3eef67c39ab852c66ccd6875d65de8d08adba727dbce83a52f185dfc
+ languageName: node
+ linkType: hard
+
+"@mantine/hooks@npm:^7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/hooks@npm:7.14.3"
+ peerDependencies:
+ react: ^18.x || ^19.x
+ checksum: 10/fefb52b9c99e1824306f01c51e18bc920335098ecc421edf34cd07f97e9ae2de8e9e04f8a36d9d44ced3c246a0e6a310306a87d5479b75ee5aff56ef8b21f746
+ languageName: node
+ linkType: hard
+
+"@mantine/modals@npm:^7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/modals@npm:7.14.3"
+ peerDependencies:
+ "@mantine/core": 7.14.3
+ "@mantine/hooks": 7.14.3
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+ checksum: 10/f513d9b74257074b434f961920868815ba1c7d5b30a7ed7a3e780b2476f484fe54bb52cb5144a2bd97d049cb3b710d81380403061d48124a4e3932ff580a96b2
+ languageName: node
+ linkType: hard
+
+"@mantine/notifications@npm:^7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/notifications@npm:7.14.3"
+ dependencies:
+ "@mantine/store": "npm:7.14.3"
+ react-transition-group: "npm:4.4.5"
+ peerDependencies:
+ "@mantine/core": 7.14.3
+ "@mantine/hooks": 7.14.3
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+ checksum: 10/3754eb948b8989cd4986796289665aac6899b63bd03e20b468c8c8eb3237695f97827cfc369d8c8f988b917df3d4a9b8a98d4670aaf4a35852b068a091ee88a7
+ languageName: node
+ linkType: hard
+
+"@mantine/store@npm:7.14.3":
+ version: 7.14.3
+ resolution: "@mantine/store@npm:7.14.3"
+ peerDependencies:
+ react: ^18.x || ^19.x
+ checksum: 10/3ea301edc9cf84b39efb19fb7db8d0671aa641fe31f9f500cd56146f9ad317445c8dfa3ef5ade329e9abc5337f84ca2ad43333fe5f237114388089dae5c7240f
+ languageName: node
+ linkType: hard
+
"@manypkg/find-root@npm:^1.1.0":
version: 1.1.0
resolution: "@manypkg/find-root@npm:1.1.0"
@@ -2301,9 +2108,9 @@ __metadata:
languageName: node
linkType: hard
-"@metamask/sdk-communication-layer@npm:0.30.0":
- version: 0.30.0
- resolution: "@metamask/sdk-communication-layer@npm:0.30.0"
+"@metamask/sdk-communication-layer@npm:0.31.0":
+ version: 0.31.0
+ resolution: "@metamask/sdk-communication-layer@npm:0.31.0"
dependencies:
bufferutil: "npm:^4.0.8"
date-fns: "npm:^2.29.3"
@@ -2312,68 +2119,47 @@ __metadata:
uuid: "npm:^8.3.2"
peerDependencies:
cross-fetch: ^4.0.0
- eciesjs: ^0.3.16
- eventemitter2: ^6.4.7
+ eciesjs: "*"
+ eventemitter2: ^6.4.9
readable-stream: ^3.6.2
socket.io-client: ^4.5.1
- checksum: 10/a68f67abbff258f89d3179869f85f7353e36ea26d2ba1e226a43959701207dff1015c5c2536a2a7afd72c8414131e451c84df9b926079f8b930c299328342b92
+ checksum: 10/e5d2b1c5d50b5a92b20606941fb167a97bf6d9c41eac72e3c4b501ba545da5679e81b97bb1cbf9ff497ad30791057423c8f7841cd9d190ad53460916a224f757
languageName: node
linkType: hard
-"@metamask/sdk-install-modal-web@npm:0.30.0":
- version: 0.30.0
- resolution: "@metamask/sdk-install-modal-web@npm:0.30.0"
+"@metamask/sdk-install-modal-web@npm:0.31.0":
+ version: 0.31.0
+ resolution: "@metamask/sdk-install-modal-web@npm:0.31.0"
dependencies:
- qr-code-styling: "npm:^1.6.0-rc.1"
- peerDependencies:
- i18next: 23.11.5
- react: ^18.2.0
- react-dom: ^18.2.0
- react-native: "*"
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
- react-native:
- optional: true
- checksum: 10/b1ea701706fcbb734c6e780bb3a28e4fe2cea99b8e03faf4330b0fe2682b0ec31d35c79fab4bd007584937d32602f4eb0f09ae1c1dd0fdec927de229014e1c6d
+ "@paulmillr/qr": "npm:^0.2.1"
+ checksum: 10/86be2c85e643fa77f704c2e44c83e06d013e6b4c803b2a2a6d9351ca6890b830d573c70919568fa7cf9cd6c7bc422116c61e3aa7e8a1ba3262c1a1b3c6e518f9
languageName: node
linkType: hard
-"@metamask/sdk@npm:0.30.1":
- version: 0.30.1
- resolution: "@metamask/sdk@npm:0.30.1"
+"@metamask/sdk@npm:0.31.0":
+ version: 0.31.0
+ resolution: "@metamask/sdk@npm:0.31.0"
dependencies:
+ "@babel/runtime": "npm:^7.26.0"
"@metamask/onboarding": "npm:^1.0.1"
"@metamask/providers": "npm:16.1.0"
- "@metamask/sdk-communication-layer": "npm:0.30.0"
- "@metamask/sdk-install-modal-web": "npm:0.30.0"
+ "@metamask/sdk-communication-layer": "npm:0.31.0"
+ "@metamask/sdk-install-modal-web": "npm:0.31.0"
+ "@paulmillr/qr": "npm:^0.2.1"
bowser: "npm:^2.9.0"
cross-fetch: "npm:^4.0.0"
debug: "npm:^4.3.4"
- eciesjs: "npm:^0.4.8"
+ eciesjs: "npm:^0.4.11"
eth-rpc-errors: "npm:^4.0.3"
- eventemitter2: "npm:^6.4.7"
- i18next: "npm:23.11.5"
- i18next-browser-languagedetector: "npm:7.1.0"
+ eventemitter2: "npm:^6.4.9"
obj-multiplex: "npm:^1.0.0"
pump: "npm:^3.0.0"
- qrcode-terminal-nooctal: "npm:^0.12.1"
- react-native-webview: "npm:^11.26.0"
readable-stream: "npm:^3.6.2"
socket.io-client: "npm:^4.5.1"
+ tslib: "npm:^2.6.0"
util: "npm:^0.12.4"
uuid: "npm:^8.3.2"
- peerDependencies:
- react: ^18.2.0
- react-dom: ^18.2.0
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
- checksum: 10/a30e975de75493daefcd34eebf37ebbe13a9aa811cf5acb82f727742f86fdef3a051f9abd209478e0f9c65efa0d4ea5010d4efcdb0d5701c05e317172ac30dfc
+ checksum: 10/df0396db1ee940bf92d5f3692e89a7cc1f9632c4afb11d1f3c28d83b600859ad2f4ca39216142d0f81a170b1a77092e9c32363b10e19c3e48c524385ef5b30b2
languageName: node
linkType: hard
@@ -2564,6 +2350,15 @@ __metadata:
languageName: node
linkType: hard
+"@noble/curves@npm:~1.7.0":
+ version: 1.7.0
+ resolution: "@noble/curves@npm:1.7.0"
+ dependencies:
+ "@noble/hashes": "npm:1.6.0"
+ checksum: 10/2a11ef4895907d0b241bd3b72f9e6ebe56f0e705949bfd5efe003f25233549f620d287550df2d24ad56a1f953b82ec5f7cf4bd7cb78b1b2e76eb6dd516d44cf8
+ languageName: node
+ linkType: hard
+
"@noble/hashes@npm:1.3.2":
version: 1.3.2
resolution: "@noble/hashes@npm:1.3.2"
@@ -2585,6 +2380,13 @@ __metadata:
languageName: node
linkType: hard
+"@noble/hashes@npm:1.6.0":
+ version: 1.6.0
+ resolution: "@noble/hashes@npm:1.6.0"
+ checksum: 10/b44b043b02adbecd33596adeed97d9f9864c24a2410f7ac3b847986c2ecf1f6f0df76024b3f1b14d6ea954932960d88898fe551fb9d39844a8b870e9f9044ea1
+ languageName: node
+ linkType: hard
+
"@noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2":
version: 1.3.3
resolution: "@noble/hashes@npm:1.3.3"
@@ -2592,6 +2394,13 @@ __metadata:
languageName: node
linkType: hard
+"@noble/hashes@npm:~1.6.0":
+ version: 1.6.1
+ resolution: "@noble/hashes@npm:1.6.1"
+ checksum: 10/74d9ad7b1437a22ba3b877584add3367587fbf818113152f293025d20d425aa74c191d18d434797312f2270458bc9ab3241c34d14ec6115fb16438b3248f631f
+ languageName: node
+ linkType: hard
+
"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:^1.7.1":
version: 1.7.1
resolution: "@noble/secp256k1@npm:1.7.1"
@@ -2919,6 +2728,13 @@ __metadata:
languageName: node
linkType: hard
+"@paulmillr/qr@npm:^0.2.1":
+ version: 0.2.1
+ resolution: "@paulmillr/qr@npm:0.2.1"
+ checksum: 10/69ee9002124496c4c7ed31f376c6f4a8fa1e86d71a14b420b22133baeab416af1349ae173d93e73a9627c2d9813d0a4bc84a64efa4e125436909f7d6d1d39785
+ languageName: node
+ linkType: hard
+
"@pkgjs/parseargs@npm:^0.11.0":
version: 0.11.0
resolution: "@pkgjs/parseargs@npm:0.11.0"
@@ -3013,27 +2829,6 @@ __metadata:
languageName: node
linkType: hard
-"@rainbow-me/rainbowkit@npm:^2.2.0":
- version: 2.2.0
- resolution: "@rainbow-me/rainbowkit@npm:2.2.0"
- dependencies:
- "@vanilla-extract/css": "npm:1.15.5"
- "@vanilla-extract/dynamic": "npm:2.1.2"
- "@vanilla-extract/sprinkles": "npm:1.6.3"
- clsx: "npm:2.1.1"
- qrcode: "npm:1.5.4"
- react-remove-scroll: "npm:2.6.0"
- ua-parser-js: "npm:^1.0.37"
- peerDependencies:
- "@tanstack/react-query": ">=5.0.0"
- react: ">=18"
- react-dom: ">=18"
- viem: 2.x
- wagmi: ^2.9.0
- checksum: 10/5848d39c2b34b533481ed636e44de2cde9d25cbe3fc5bebd77ce1e60ebddcb5cbfc3bfc3ecbc93a74c0fc8ddff4a4b098e2174b6a35a45231a0351e54ccd3ed4
- languageName: node
- linkType: hard
-
"@rollup/plugin-json@npm:^6.1.0":
version: 6.1.0
resolution: "@rollup/plugin-json@npm:6.1.0"
@@ -3113,6 +2908,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-android-arm-eabi@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.0"
+ conditions: os=android & cpu=arm
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-android-arm64@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-android-arm64@npm:4.24.0"
@@ -3127,6 +2929,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-android-arm64@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-android-arm64@npm:4.28.0"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-darwin-arm64@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-darwin-arm64@npm:4.24.0"
@@ -3141,6 +2950,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-darwin-arm64@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-darwin-arm64@npm:4.28.0"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-darwin-x64@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-darwin-x64@npm:4.24.0"
@@ -3155,6 +2971,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-darwin-x64@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-darwin-x64@npm:4.28.0"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-freebsd-arm64@npm:4.27.3":
version: 4.27.3
resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.3"
@@ -3162,6 +2985,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-freebsd-arm64@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.0"
+ conditions: os=freebsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-freebsd-x64@npm:4.27.3":
version: 4.27.3
resolution: "@rollup/rollup-freebsd-x64@npm:4.27.3"
@@ -3169,6 +2999,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-freebsd-x64@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-freebsd-x64@npm:4.28.0"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0"
@@ -3183,6 +3020,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.0"
+ conditions: os=linux & cpu=arm & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-arm-musleabihf@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.0"
@@ -3197,6 +3041,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-arm-musleabihf@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.0"
+ conditions: os=linux & cpu=arm & libc=musl
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-arm64-gnu@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.0"
@@ -3211,6 +3062,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-arm64-gnu@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.0"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-arm64-musl@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.0"
@@ -3225,6 +3083,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-arm64-musl@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.0"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0"
@@ -3239,6 +3104,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.0"
+ conditions: os=linux & cpu=ppc64 & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-riscv64-gnu@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.0"
@@ -3253,6 +3125,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-riscv64-gnu@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.0"
+ conditions: os=linux & cpu=riscv64 & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-s390x-gnu@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.0"
@@ -3267,6 +3146,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-s390x-gnu@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.0"
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-x64-gnu@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.0"
@@ -3281,6 +3167,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-x64-gnu@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.0"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-linux-x64-musl@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.0"
@@ -3295,6 +3188,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-linux-x64-musl@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.0"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-win32-arm64-msvc@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.0"
@@ -3309,6 +3209,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-win32-arm64-msvc@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.0"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-win32-ia32-msvc@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.0"
@@ -3323,6 +3230,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-win32-ia32-msvc@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.0"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
"@rollup/rollup-win32-x64-msvc@npm:4.24.0":
version: 4.24.0
resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.0"
@@ -3337,6 +3251,13 @@ __metadata:
languageName: node
linkType: hard
+"@rollup/rollup-win32-x64-msvc@npm:4.28.0":
+ version: 4.28.0
+ resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.0"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
"@safe-global/safe-apps-provider@npm:0.18.4":
version: 0.18.4
resolution: "@safe-global/safe-apps-provider@npm:0.18.4"
@@ -3371,6 +3292,13 @@ __metadata:
languageName: node
linkType: hard
+"@scure/base@npm:~1.2.1":
+ version: 1.2.1
+ resolution: "@scure/base@npm:1.2.1"
+ checksum: 10/f7bdd17618ccae7a74c8cbe410a235e4adbe54aa8afe4e2fb1294338aa92f6fd04b1f1f5dea60552f638b5f5e3e74902b7baf59d3954e5e42c0a36c6baa2ebe0
+ languageName: node
+ linkType: hard
+
"@scure/bip32@npm:1.3.2":
version: 1.3.2
resolution: "@scure/bip32@npm:1.3.2"
@@ -3404,6 +3332,17 @@ __metadata:
languageName: node
linkType: hard
+"@scure/bip32@npm:^1.5.0":
+ version: 1.6.0
+ resolution: "@scure/bip32@npm:1.6.0"
+ dependencies:
+ "@noble/curves": "npm:~1.7.0"
+ "@noble/hashes": "npm:~1.6.0"
+ "@scure/base": "npm:~1.2.1"
+ checksum: 10/2efb81ed9a7b8d5d35233e10abebc114544a3783a2a32b9fb60e1e9a67965b272c9d17910e1649083b69c8ceb80241b05b59dbeb7a5b18ea34e497aed3f16709
+ languageName: node
+ linkType: hard
+
"@scure/bip39@npm:1.2.1":
version: 1.2.1
resolution: "@scure/bip39@npm:1.2.1"
@@ -3434,6 +3373,16 @@ __metadata:
languageName: node
linkType: hard
+"@scure/bip39@npm:^1.4.0":
+ version: 1.5.0
+ resolution: "@scure/bip39@npm:1.5.0"
+ dependencies:
+ "@noble/hashes": "npm:~1.6.0"
+ "@scure/base": "npm:~1.2.1"
+ checksum: 10/b795ee31ac4c10603bf3b726cc0e5cf43834a68f05a535e0baf2162772bac100de470b4c6cf7ddbecb95d7a3fb82b8a959badced406c329ab696cd89104194bc
+ languageName: node
+ linkType: hard
+
"@shikijs/core@npm:1.22.0":
version: 1.22.0
resolution: "@shikijs/core@npm:1.22.0"
@@ -3700,21 +3649,21 @@ __metadata:
languageName: node
linkType: hard
-"@tanstack/query-core@npm:5.60.5":
- version: 5.60.5
- resolution: "@tanstack/query-core@npm:5.60.5"
- checksum: 10/2c85ed3a26db31ea9fb2e44f94afee4564c8a5e47fc2c9f4e7a3b477e90642d1330ecdbc48f3b503205401772cedd94545eff23e628badd2bff5509b1da62e94
+"@tanstack/query-core@npm:5.61.5":
+ version: 5.61.5
+ resolution: "@tanstack/query-core@npm:5.61.5"
+ checksum: 10/e84a9dbd93cf5fa7abe7d4ba607e054cf15621194e1ec0145e05b826c0a27123947f0cc937cafe6254fb2289c0013b2283796f8c3844c0a19ed6082fb70a6632
languageName: node
linkType: hard
-"@tanstack/react-query@npm:^5.60.5":
- version: 5.60.5
- resolution: "@tanstack/react-query@npm:5.60.5"
+"@tanstack/react-query@npm:^5.61.5":
+ version: 5.61.5
+ resolution: "@tanstack/react-query@npm:5.61.5"
dependencies:
- "@tanstack/query-core": "npm:5.60.5"
+ "@tanstack/query-core": "npm:5.61.5"
peerDependencies:
react: ^18 || ^19
- checksum: 10/00a5ef74ceb50f6bbacec2545392de65d3d9e6dc6de2a7107943460a83d1988eb66740f40b8682c8de0e9a1faff76256ab1584a816c70dd4ff9205dedc209f0a
+ checksum: 10/ae2108b03cc4b02c0dd08ddab44a157cdfa9949ccf5d4f4f7aa2d11ff345b3bc7a405138322ad99a538f476a77b2a188eb199119806df507cc988f09e8b34535
languageName: node
linkType: hard
@@ -4014,7 +3963,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/react@npm:^18.3.12":
+"@types/react@npm:^18.3.3":
version: 18.3.12
resolution: "@types/react@npm:18.3.12"
dependencies:
@@ -4204,51 +4153,6 @@ __metadata:
languageName: node
linkType: hard
-"@vanilla-extract/css@npm:1.15.5":
- version: 1.15.5
- resolution: "@vanilla-extract/css@npm:1.15.5"
- dependencies:
- "@emotion/hash": "npm:^0.9.0"
- "@vanilla-extract/private": "npm:^1.0.6"
- css-what: "npm:^6.1.0"
- cssesc: "npm:^3.0.0"
- csstype: "npm:^3.0.7"
- dedent: "npm:^1.5.3"
- deep-object-diff: "npm:^1.1.9"
- deepmerge: "npm:^4.2.2"
- lru-cache: "npm:^10.4.3"
- media-query-parser: "npm:^2.0.2"
- modern-ahocorasick: "npm:^1.0.0"
- picocolors: "npm:^1.0.0"
- checksum: 10/4820caea8f7d63d5e691c72d3d324a09707040afa6b0abaaf0fea7d9ee1c133a19e5f3a383fd903453680cd0d698de0428ad2a7316e0c5e9771ffd79d813ddf6
- languageName: node
- linkType: hard
-
-"@vanilla-extract/dynamic@npm:2.1.2":
- version: 2.1.2
- resolution: "@vanilla-extract/dynamic@npm:2.1.2"
- dependencies:
- "@vanilla-extract/private": "npm:^1.0.6"
- checksum: 10/576b22e3f1a61abad2bc758d95f6f9eae9418f1bb6c8366211e82da7eed97ac8cf9b69fea3239832ccba280dab93d5b1def4290f64943b295f146fca78049d2d
- languageName: node
- linkType: hard
-
-"@vanilla-extract/private@npm:^1.0.6":
- version: 1.0.6
- resolution: "@vanilla-extract/private@npm:1.0.6"
- checksum: 10/50463610da0fc9069b3e2b33b6222ea2f005487432db9110ea430e474e29b3b756bcd1fffd47b87536358829d47bce6510398f050b5f6de07ee1e4e92eeade5a
- languageName: node
- linkType: hard
-
-"@vanilla-extract/sprinkles@npm:1.6.3":
- version: 1.6.3
- resolution: "@vanilla-extract/sprinkles@npm:1.6.3"
- peerDependencies:
- "@vanilla-extract/css": ^1.0.0
- checksum: 10/74f8e2b189c0d48e279f1b85b5fedebf1f615ab31839964cf3861f2c5cf574567c0caeddf9c8b11327d81213f81d195efc79f136b725e6013b6d645d238d5c2b
- languageName: node
- linkType: hard
-
"@vitejs/plugin-react@npm:^4.3.3":
version: 4.3.3
resolution: "@vitejs/plugin-react@npm:4.3.3"
@@ -4426,30 +4330,30 @@ __metadata:
languageName: node
linkType: hard
-"@wagmi/connectors@npm:5.4.0":
- version: 5.4.0
- resolution: "@wagmi/connectors@npm:5.4.0"
+"@wagmi/connectors@npm:5.5.2":
+ version: 5.5.2
+ resolution: "@wagmi/connectors@npm:5.5.2"
dependencies:
"@coinbase/wallet-sdk": "npm:4.2.3"
- "@metamask/sdk": "npm:0.30.1"
+ "@metamask/sdk": "npm:0.31.0"
"@safe-global/safe-apps-provider": "npm:0.18.4"
"@safe-global/safe-apps-sdk": "npm:9.1.0"
"@walletconnect/ethereum-provider": "npm:2.17.0"
cbw-sdk: "npm:@coinbase/wallet-sdk@3.9.3"
peerDependencies:
- "@wagmi/core": 2.14.6
+ "@wagmi/core": 2.15.1
typescript: ">=5.0.4"
viem: 2.x
peerDependenciesMeta:
typescript:
optional: true
- checksum: 10/9486b9d51d10644010a67a09ed11a05fd4db3f980e26630e80245a5c4ab0f6dda8afc830c6de5c56ea94522094a2b4bde3a9864bece3338eb4e3b7dbc844a288
+ checksum: 10/64b2af25ae66935878cb6573b4ee63f4bbdd3a04da0eb20fcdd8b90dabdac07a8b12ac0ecbe781d891e34470effc48e111c5625cbde8b2390a09d3ec30924037
languageName: node
linkType: hard
-"@wagmi/core@npm:2.14.6, @wagmi/core@npm:^2.14.6":
- version: 2.14.6
- resolution: "@wagmi/core@npm:2.14.6"
+"@wagmi/core@npm:2.15.1":
+ version: 2.15.1
+ resolution: "@wagmi/core@npm:2.15.1"
dependencies:
eventemitter3: "npm:5.0.1"
mipd: "npm:0.0.7"
@@ -4463,7 +4367,7 @@ __metadata:
optional: true
typescript:
optional: true
- checksum: 10/3862660a83179e612bd357967b29b85ecd16f29030cb192eb5380f8fc7fd19ed49852b3315a012e9c2506b746dd1af870d07e9de322a3774dad2189775d3970e
+ checksum: 10/bd10997206bb478c3a63d16aa93a6c7f652730b72a3e5d4a3952cca9f25d9836391f6c6574e4443c5a2d9bff3b53a6c5ec37a269c6447b669fd1511636de19bc
languageName: node
linkType: hard
@@ -4793,7 +4697,7 @@ __metadata:
languageName: node
linkType: hard
-"@xmtp/browser-sdk@workspace:*, @xmtp/browser-sdk@workspace:sdks/browser-sdk":
+"@xmtp/browser-sdk@npm:^0.0.13, @xmtp/browser-sdk@workspace:sdks/browser-sdk":
version: 0.0.0-use.local
resolution: "@xmtp/browser-sdk@workspace:sdks/browser-sdk"
dependencies:
@@ -4906,7 +4810,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@xmtp/content-type-reaction@workspace:content-types/content-type-reaction":
+"@xmtp/content-type-reaction@npm:^2.0.0, @xmtp/content-type-reaction@workspace:content-types/content-type-reaction":
version: 0.0.0-use.local
resolution: "@xmtp/content-type-reaction@workspace:content-types/content-type-reaction"
dependencies:
@@ -4950,7 +4854,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@xmtp/content-type-remote-attachment@workspace:*, @xmtp/content-type-remote-attachment@workspace:content-types/content-type-remote-attachment":
+"@xmtp/content-type-remote-attachment@npm:^2.0.0, @xmtp/content-type-remote-attachment@workspace:*, @xmtp/content-type-remote-attachment@workspace:content-types/content-type-remote-attachment":
version: 0.0.0-use.local
resolution: "@xmtp/content-type-remote-attachment@workspace:content-types/content-type-remote-attachment"
dependencies:
@@ -4975,7 +4879,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@xmtp/content-type-reply@workspace:content-types/content-type-reply":
+"@xmtp/content-type-reply@npm:^2.0.0, @xmtp/content-type-reply@workspace:content-types/content-type-reply":
version: 0.0.0-use.local
resolution: "@xmtp/content-type-reply@workspace:content-types/content-type-reply"
dependencies:
@@ -5212,30 +5116,6 @@ __metadata:
languageName: node
linkType: hard
-"@xmtp/react-vite-browser-sdk-example@workspace:examples/react-vite-browser-sdk":
- version: 0.0.0-use.local
- resolution: "@xmtp/react-vite-browser-sdk-example@workspace:examples/react-vite-browser-sdk"
- dependencies:
- "@rainbow-me/rainbowkit": "npm:^2.2.0"
- "@tanstack/react-query": "npm:^5.60.5"
- "@types/react": "npm:^18.3.12"
- "@types/react-dom": "npm:^18.3.1"
- "@vitejs/plugin-react": "npm:^4.3.3"
- "@wagmi/core": "npm:^2.14.6"
- "@xmtp/browser-sdk": "workspace:*"
- autoprefixer: "npm:^10.4.20"
- postcss: "npm:^8.4.49"
- postcss-preset-env: "npm:^10.1.1"
- react: "npm:^18.3.1"
- react-dom: "npm:^18.3.1"
- tsconfig: "workspace:*"
- typescript: "npm:^5.6.3"
- viem: "npm:^2.17.4"
- vite: "npm:^5.4.11"
- wagmi: "npm:^2.12.33"
- languageName: unknown
- linkType: soft
-
"@xmtp/rollup-plugin-resolve-extensions@npm:1.0.1, @xmtp/rollup-plugin-resolve-extensions@npm:^1.0.1":
version: 1.0.1
resolution: "@xmtp/rollup-plugin-resolve-extensions@npm:1.0.1"
@@ -5338,6 +5218,44 @@ __metadata:
languageName: unknown
linkType: soft
+"@xmtp/xmtp.chat@workspace:apps/xmtp.chat":
+ version: 0.0.0-use.local
+ resolution: "@xmtp/xmtp.chat@workspace:apps/xmtp.chat"
+ dependencies:
+ "@mantine/core": "npm:^7.14.3"
+ "@mantine/form": "npm:^7.14.3"
+ "@mantine/hooks": "npm:^7.14.3"
+ "@mantine/modals": "npm:^7.14.3"
+ "@mantine/notifications": "npm:^7.14.3"
+ "@tanstack/react-query": "npm:^5.61.5"
+ "@types/react": "npm:^18.3.3"
+ "@types/react-dom": "npm:^18.3.1"
+ "@vitejs/plugin-react": "npm:^4.3.3"
+ "@xmtp/browser-sdk": "npm:^0.0.13"
+ "@xmtp/content-type-group-updated": "npm:^2.0.0"
+ "@xmtp/content-type-primitives": "npm:^2.0.0"
+ "@xmtp/content-type-reaction": "npm:^2.0.0"
+ "@xmtp/content-type-remote-attachment": "npm:^2.0.0"
+ "@xmtp/content-type-reply": "npm:^2.0.0"
+ "@xmtp/content-type-text": "npm:^2.0.0"
+ date-fns: "npm:^4.1.0"
+ postcss: "npm:^8.4.49"
+ postcss-preset-mantine: "npm:^1.17.0"
+ postcss-simple-vars: "npm:^7.0.1"
+ react: "npm:^18.3.1"
+ react-18-blockies: "npm:^1.0.6"
+ react-confetti: "npm:^6.1.0"
+ react-dom: "npm:^18.3.1"
+ react-router: "npm:^7.0.2"
+ tsconfig: "workspace:*"
+ typescript: "npm:^5.7.2"
+ uint8array-extras: "npm:^1.4.0"
+ viem: "npm:^2.21.52"
+ vite: "npm:^6.0.2"
+ wagmi: "npm:^2.13.2"
+ languageName: unknown
+ linkType: soft
+
"abbrev@npm:^1.0.0":
version: 1.1.1
resolution: "abbrev@npm:1.1.1"
@@ -5367,7 +5285,7 @@ __metadata:
languageName: node
linkType: hard
-"abitype@npm:1.0.6":
+"abitype@npm:1.0.6, abitype@npm:^1.0.6":
version: 1.0.6
resolution: "abitype@npm:1.0.6"
peerDependencies:
@@ -5666,24 +5584,6 @@ __metadata:
languageName: node
linkType: hard
-"autoprefixer@npm:^10.4.19, autoprefixer@npm:^10.4.20":
- version: 10.4.20
- resolution: "autoprefixer@npm:10.4.20"
- dependencies:
- browserslist: "npm:^4.23.3"
- caniuse-lite: "npm:^1.0.30001646"
- fraction.js: "npm:^4.3.7"
- normalize-range: "npm:^0.1.2"
- picocolors: "npm:^1.0.1"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.1.0
- bin:
- autoprefixer: bin/autoprefixer
- checksum: 10/d3c4b562fc4af2393623a0207cc336f5b9f94c4264ae1c316376904c279702ce2b12dc3f27205f491195d1e29bb52ffc269970ceb0f271f035fadee128a273f7
- languageName: node
- linkType: hard
-
"available-typed-arrays@npm:^1.0.7":
version: 1.0.7
resolution: "available-typed-arrays@npm:1.0.7"
@@ -5850,7 +5750,7 @@ __metadata:
languageName: node
linkType: hard
-"browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0":
+"browserslist@npm:^4.24.0":
version: 4.24.0
resolution: "browserslist@npm:4.24.0"
dependencies:
@@ -5984,6 +5884,13 @@ __metadata:
languageName: node
linkType: hard
+"camelcase-css@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "camelcase-css@npm:2.0.1"
+ checksum: 10/1cec2b3b3dcb5026688a470b00299a8db7d904c4802845c353dbd12d9d248d3346949a814d83bfd988d4d2e5b9904c07efe76fecd195a1d4f05b543e7c0b56b1
+ languageName: node
+ linkType: hard
+
"camelcase@npm:^5.0.0":
version: 5.3.1
resolution: "camelcase@npm:5.3.1"
@@ -5998,13 +5905,6 @@ __metadata:
languageName: node
linkType: hard
-"caniuse-lite@npm:^1.0.30001646":
- version: 1.0.30001667
- resolution: "caniuse-lite@npm:1.0.30001667"
- checksum: 10/5f0c48abb806737c422f05d0d9dda72facc25ee8adbae2c2ea9c57b87d9c2fa9ad8c3f6d54f21aca4e31ee1742cb5dd1543bf6b9133e3f77f79a645876322414
- languageName: node
- linkType: hard
-
"caniuse-lite@npm:^1.0.30001663":
version: 1.0.30001669
resolution: "caniuse-lite@npm:1.0.30001669"
@@ -6213,13 +6113,6 @@ __metadata:
languageName: node
linkType: hard
-"clsx@npm:2.1.1":
- version: 2.1.1
- resolution: "clsx@npm:2.1.1"
- checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919
- languageName: node
- linkType: hard
-
"clsx@npm:^1.2.1":
version: 1.2.1
resolution: "clsx@npm:1.2.1"
@@ -6227,6 +6120,13 @@ __metadata:
languageName: node
linkType: hard
+"clsx@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "clsx@npm:2.1.1"
+ checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919
+ languageName: node
+ linkType: hard
+
"color-convert@npm:^1.9.0":
version: 1.9.3
resolution: "color-convert@npm:1.9.3"
@@ -6352,6 +6252,13 @@ __metadata:
languageName: node
linkType: hard
+"cookie@npm:^1.0.1":
+ version: 1.0.2
+ resolution: "cookie@npm:1.0.2"
+ checksum: 10/f5817cdc84d8977761b12549eba29435e675e65c7fef172bc31737788cd8adc83796bf8abe6d950554e7987325ad2d9ac2971c5bd8ff0c4f81c145f82e4ab1be
+ languageName: node
+ linkType: hard
+
"core-util-is@npm:~1.0.0":
version: 1.0.3
resolution: "core-util-is@npm:1.0.3"
@@ -6428,46 +6335,6 @@ __metadata:
languageName: node
linkType: hard
-"css-blank-pseudo@npm:^7.0.1":
- version: 7.0.1
- resolution: "css-blank-pseudo@npm:7.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/bbe45955d0cb5a803f63f44f68b565cd1df41e737aca391262f9e9c8f2b86600fad18fbf9c5f48ba0cf10891647662831bc29019c02bcfc697c65ba649d18a1b
- languageName: node
- linkType: hard
-
-"css-has-pseudo@npm:^7.0.1":
- version: 7.0.1
- resolution: "css-has-pseudo@npm:7.0.1"
- dependencies:
- "@csstools/selector-specificity": "npm:^5.0.0"
- postcss-selector-parser: "npm:^7.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/4a66c4337c4b14f3c75199900ab0497bbe81ed87b439496836fe2bfd0068ac1068e36f1be8a245d854aeb4c3e4bcf2e167b86b4c51b482192dc0d636beff6d89
- languageName: node
- linkType: hard
-
-"css-prefers-color-scheme@npm:^10.0.0":
- version: 10.0.0
- resolution: "css-prefers-color-scheme@npm:10.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/b09055fdb8250c5f83b396bb310f7df48955cac6ff5dedb52f271af089a568b0c7b442461a24c533ffbe3f406ab39a043713264c32b9c75a625c8aaa48551714
- languageName: node
- linkType: hard
-
-"css-what@npm:^6.1.0":
- version: 6.1.0
- resolution: "css-what@npm:6.1.0"
- checksum: 10/c67a3a2d0d81843af87f8bf0a4d0845b0f952377714abbb2884e48942409d57a2110eabee003609d02ee487b054614bdfcfc59ee265728ff105bd5aa221c1d0e
- languageName: node
- linkType: hard
-
"css.escape@npm:^1.5.1":
version: 1.5.1
resolution: "css.escape@npm:1.5.1"
@@ -6475,13 +6342,6 @@ __metadata:
languageName: node
linkType: hard
-"cssdb@npm:^8.2.1":
- version: 8.2.1
- resolution: "cssdb@npm:8.2.1"
- checksum: 10/a18f4e858b6c0365c601437feffbefab8f08e29182a1e6e4986ebef489361da96034282d480a99c71690d825a6327f8e418b6f2a058019a144f3ad5914c696cb
- languageName: node
- linkType: hard
-
"cssesc@npm:^3.0.0":
version: 3.0.0
resolution: "cssesc@npm:3.0.0"
@@ -6491,7 +6351,7 @@ __metadata:
languageName: node
linkType: hard
-"csstype@npm:^3.0.2, csstype@npm:^3.0.7":
+"csstype@npm:^3.0.2":
version: 3.1.3
resolution: "csstype@npm:3.1.3"
checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade
@@ -6507,6 +6367,13 @@ __metadata:
languageName: node
linkType: hard
+"date-fns@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "date-fns@npm:4.1.0"
+ checksum: 10/d5f6e9de5bbc52310f786099e18609289ed5e30af60a71e0646784c8185ddd1d0eebcf7c96b7faaaefc4a8366f3a3a4244d099b6d0866ee2bec80d1361e64342
+ languageName: node
+ linkType: hard
+
"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:~4.3.1, debug@npm:~4.3.2":
version: 4.3.7
resolution: "debug@npm:4.3.7"
@@ -6533,18 +6400,6 @@ __metadata:
languageName: node
linkType: hard
-"dedent@npm:^1.5.3":
- version: 1.5.3
- resolution: "dedent@npm:1.5.3"
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
- checksum: 10/e5277f6268f288649503125b781a7b7a2c9b22d011139688c0b3619fe40121e600eb1f077c891938d4b2428bdb6326cc3c77a763e4b1cc681bd9666ab1bad2a1
- languageName: node
- linkType: hard
-
"deep-eql@npm:^5.0.1":
version: 5.0.2
resolution: "deep-eql@npm:5.0.2"
@@ -6559,20 +6414,6 @@ __metadata:
languageName: node
linkType: hard
-"deep-object-diff@npm:^1.1.9":
- version: 1.1.9
- resolution: "deep-object-diff@npm:1.1.9"
- checksum: 10/b9771cc1ca08a34e408309eaab967bd2ab697684abdfa1262f4283ced8230a9ace966322f356364ff71a785c6e9cc356b7596582e900da5726e6b87d4b2a1463
- languageName: node
- linkType: hard
-
-"deepmerge@npm:^4.2.2":
- version: 4.3.1
- resolution: "deepmerge@npm:4.3.1"
- checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529
- languageName: node
- linkType: hard
-
"define-data-property@npm:^1.1.4":
version: 1.1.4
resolution: "define-data-property@npm:1.1.4"
@@ -6695,6 +6536,16 @@ __metadata:
languageName: node
linkType: hard
+"dom-helpers@npm:^5.0.1":
+ version: 5.2.1
+ resolution: "dom-helpers@npm:5.2.1"
+ dependencies:
+ "@babel/runtime": "npm:^7.8.7"
+ csstype: "npm:^3.0.2"
+ checksum: 10/bed2341adf8864bf932b3289c24f35fdd99930af77df46688abf2d753ff291df49a15850c874d686d9be6ec4e1c6835673906e64dbd8b2839d227f117a11fd41
+ languageName: node
+ linkType: hard
+
"duplexer@npm:0.1.1":
version: 0.1.1
resolution: "duplexer@npm:0.1.1"
@@ -6728,7 +6579,7 @@ __metadata:
languageName: node
linkType: hard
-"eciesjs@npm:^0.4.8":
+"eciesjs@npm:^0.4.11":
version: 0.4.12
resolution: "eciesjs@npm:0.4.12"
dependencies:
@@ -6963,6 +6814,89 @@ __metadata:
languageName: node
linkType: hard
+"esbuild@npm:^0.24.0":
+ version: 0.24.0
+ resolution: "esbuild@npm:0.24.0"
+ dependencies:
+ "@esbuild/aix-ppc64": "npm:0.24.0"
+ "@esbuild/android-arm": "npm:0.24.0"
+ "@esbuild/android-arm64": "npm:0.24.0"
+ "@esbuild/android-x64": "npm:0.24.0"
+ "@esbuild/darwin-arm64": "npm:0.24.0"
+ "@esbuild/darwin-x64": "npm:0.24.0"
+ "@esbuild/freebsd-arm64": "npm:0.24.0"
+ "@esbuild/freebsd-x64": "npm:0.24.0"
+ "@esbuild/linux-arm": "npm:0.24.0"
+ "@esbuild/linux-arm64": "npm:0.24.0"
+ "@esbuild/linux-ia32": "npm:0.24.0"
+ "@esbuild/linux-loong64": "npm:0.24.0"
+ "@esbuild/linux-mips64el": "npm:0.24.0"
+ "@esbuild/linux-ppc64": "npm:0.24.0"
+ "@esbuild/linux-riscv64": "npm:0.24.0"
+ "@esbuild/linux-s390x": "npm:0.24.0"
+ "@esbuild/linux-x64": "npm:0.24.0"
+ "@esbuild/netbsd-x64": "npm:0.24.0"
+ "@esbuild/openbsd-arm64": "npm:0.24.0"
+ "@esbuild/openbsd-x64": "npm:0.24.0"
+ "@esbuild/sunos-x64": "npm:0.24.0"
+ "@esbuild/win32-arm64": "npm:0.24.0"
+ "@esbuild/win32-ia32": "npm:0.24.0"
+ "@esbuild/win32-x64": "npm:0.24.0"
+ dependenciesMeta:
+ "@esbuild/aix-ppc64":
+ optional: true
+ "@esbuild/android-arm":
+ optional: true
+ "@esbuild/android-arm64":
+ optional: true
+ "@esbuild/android-x64":
+ optional: true
+ "@esbuild/darwin-arm64":
+ optional: true
+ "@esbuild/darwin-x64":
+ optional: true
+ "@esbuild/freebsd-arm64":
+ optional: true
+ "@esbuild/freebsd-x64":
+ optional: true
+ "@esbuild/linux-arm":
+ optional: true
+ "@esbuild/linux-arm64":
+ optional: true
+ "@esbuild/linux-ia32":
+ optional: true
+ "@esbuild/linux-loong64":
+ optional: true
+ "@esbuild/linux-mips64el":
+ optional: true
+ "@esbuild/linux-ppc64":
+ optional: true
+ "@esbuild/linux-riscv64":
+ optional: true
+ "@esbuild/linux-s390x":
+ optional: true
+ "@esbuild/linux-x64":
+ optional: true
+ "@esbuild/netbsd-x64":
+ optional: true
+ "@esbuild/openbsd-arm64":
+ optional: true
+ "@esbuild/openbsd-x64":
+ optional: true
+ "@esbuild/sunos-x64":
+ optional: true
+ "@esbuild/win32-arm64":
+ optional: true
+ "@esbuild/win32-ia32":
+ optional: true
+ "@esbuild/win32-x64":
+ optional: true
+ bin:
+ esbuild: bin/esbuild
+ checksum: 10/500f83a1216d6548053007b85c070d8293395db344605b17418c6cf1217e5e8d338fa77fc8af27c23faa121c5528e5b0004d46d3a0cdeb87d48f1b5fa0164bc5
+ languageName: node
+ linkType: hard
+
"escalade@npm:^3.1.1, escalade@npm:^3.2.0":
version: 3.2.0
resolution: "escalade@npm:3.2.0"
@@ -6970,13 +6904,6 @@ __metadata:
languageName: node
linkType: hard
-"escape-string-regexp@npm:2.0.0":
- version: 2.0.0
- resolution: "escape-string-regexp@npm:2.0.0"
- checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395
- languageName: node
- linkType: hard
-
"escape-string-regexp@npm:^1.0.5":
version: 1.0.5
resolution: "escape-string-regexp@npm:1.0.5"
@@ -7299,7 +7226,7 @@ __metadata:
languageName: node
linkType: hard
-"eventemitter2@npm:^6.4.7":
+"eventemitter2@npm:^6.4.9":
version: 6.4.9
resolution: "eventemitter2@npm:6.4.9"
checksum: 10/b829b1c6b11e15926b635092b5ad62b4463d1c928859831dcae606e988cf41893059e3541f5a8209d21d2f15314422ddd4d84d20830b4bf44978608d15b06b08
@@ -7397,7 +7324,7 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2":
+"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2":
version: 3.3.2
resolution: "fast-glob@npm:3.3.2"
dependencies:
@@ -7546,13 +7473,6 @@ __metadata:
languageName: node
linkType: hard
-"fraction.js@npm:^4.3.7":
- version: 4.3.7
- resolution: "fraction.js@npm:4.3.7"
- checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5
- languageName: node
- linkType: hard
-
"fs-extra@npm:^10.0.0":
version: 10.1.0
resolution: "fs-extra@npm:10.1.0"
@@ -8160,24 +8080,6 @@ __metadata:
languageName: node
linkType: hard
-"i18next-browser-languagedetector@npm:7.1.0":
- version: 7.1.0
- resolution: "i18next-browser-languagedetector@npm:7.1.0"
- dependencies:
- "@babel/runtime": "npm:^7.19.4"
- checksum: 10/3b06c8a5df09092cffc0b6637b542bb572e8a25dcba97d0d8a5e5dd7539b90bf00000f3a279654693f4b5908c5fc4d1d4f3766dfb461dacab46be3d071266384
- languageName: node
- linkType: hard
-
-"i18next@npm:23.11.5":
- version: 23.11.5
- resolution: "i18next@npm:23.11.5"
- dependencies:
- "@babel/runtime": "npm:^7.23.2"
- checksum: 10/3a8e0d5d2b9ac6c6fa8c2180452aaf816d60e1cc790da69d6be515feec85553f8af9fcc19414ade1a621f08236e84f38df4415a8234919fa97fa2e35624e86b6
- languageName: node
- linkType: hard
-
"iconv-lite@npm:^0.4.24":
version: 0.4.24
resolution: "iconv-lite@npm:0.4.24"
@@ -8274,7 +8176,7 @@ __metadata:
languageName: node
linkType: hard
-"invariant@npm:2.2.4, invariant@npm:^2.2.4":
+"invariant@npm:^2.2.4":
version: 2.2.4
resolution: "invariant@npm:2.2.4"
dependencies:
@@ -8768,6 +8670,13 @@ __metadata:
languageName: node
linkType: hard
+"klona@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "klona@npm:2.0.6"
+ checksum: 10/ed7e2c9af58cb646e758e60b75dec24bf72466066290f78c515a2bae23a06fa280f11ff3210c43b94a18744954aa5358f9d46583d5e4c36da073ecc3606355c4
+ languageName: node
+ linkType: hard
+
"levn@npm:^0.4.1":
version: 0.4.1
resolution: "levn@npm:0.4.1"
@@ -8928,7 +8837,7 @@ __metadata:
languageName: node
linkType: hard
-"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0":
+"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
dependencies:
@@ -9138,15 +9047,6 @@ __metadata:
languageName: node
linkType: hard
-"media-query-parser@npm:^2.0.2":
- version: 2.0.2
- resolution: "media-query-parser@npm:2.0.2"
- dependencies:
- "@babel/runtime": "npm:^7.12.5"
- checksum: 10/9dff3ed135149944717a8687567f4fda1d39d28637f265c6ce7efe5ed55cd88ed49136c912ee0c7f3a6e5debc50b1ff969db609d862318f1af97f48752b08b0b
- languageName: node
- linkType: hard
-
"merge-stream@npm:^2.0.0":
version: 2.0.0
resolution: "merge-stream@npm:2.0.0"
@@ -9451,13 +9351,6 @@ __metadata:
languageName: node
linkType: hard
-"modern-ahocorasick@npm:^1.0.0":
- version: 1.0.1
- resolution: "modern-ahocorasick@npm:1.0.1"
- checksum: 10/ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e
- languageName: node
- linkType: hard
-
"motion@npm:10.16.2":
version: 10.16.2
resolution: "motion@npm:10.16.2"
@@ -9715,13 +9608,6 @@ __metadata:
languageName: node
linkType: hard
-"normalize-range@npm:^0.1.2":
- version: 0.1.2
- resolution: "normalize-range@npm:0.1.2"
- checksum: 10/9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184
- languageName: node
- linkType: hard
-
"npm-bundled@npm:^3.0.0":
version: 3.0.1
resolution: "npm-bundled@npm:3.0.1"
@@ -9827,6 +9713,13 @@ __metadata:
languageName: node
linkType: hard
+"object-assign@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "object-assign@npm:4.1.1"
+ checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
+ languageName: node
+ linkType: hard
+
"ofetch@npm:^1.3.4":
version: 1.4.1
resolution: "ofetch@npm:1.4.1"
@@ -9923,6 +9816,26 @@ __metadata:
languageName: node
linkType: hard
+"ox@npm:0.1.2":
+ version: 0.1.2
+ resolution: "ox@npm:0.1.2"
+ dependencies:
+ "@adraffy/ens-normalize": "npm:^1.10.1"
+ "@noble/curves": "npm:^1.6.0"
+ "@noble/hashes": "npm:^1.5.0"
+ "@scure/bip32": "npm:^1.5.0"
+ "@scure/bip39": "npm:^1.4.0"
+ abitype: "npm:^1.0.6"
+ eventemitter3: "npm:5.0.1"
+ peerDependencies:
+ typescript: ">=5.4.0"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10/cba00f13289599ff03cee3dbc19167c1d0f01829379d119f962b4e951ee2bf0d14491c7a45974e6a2a745117b13b22e9e4131d285e1f5247ea4e1cbc43c5c3d8
+ languageName: node
+ linkType: hard
+
"p-filter@npm:^2.1.0":
version: 2.1.0
resolution: "p-filter@npm:2.1.0"
@@ -10157,13 +10070,6 @@ __metadata:
languageName: node
linkType: hard
-"picocolors@npm:^1.0.1":
- version: 1.1.0
- resolution: "picocolors@npm:1.1.0"
- checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb
- languageName: node
- linkType: hard
-
"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
version: 2.3.1
resolution: "picomatch@npm:2.3.1"
@@ -10293,383 +10199,70 @@ __metadata:
languageName: node
linkType: hard
-"postcss-attribute-case-insensitive@npm:^7.0.1":
- version: 7.0.1
- resolution: "postcss-attribute-case-insensitive@npm:7.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/18829dfc6dd2f6b1ca82afa8555f07ec8ac5687fe95612e353aa601b842bdec05ca78fc96016dba2b7d32607b31e085e5087fda00e1e0dfdc6c2a1b07b1b15c2
- languageName: node
- linkType: hard
-
-"postcss-clamp@npm:^4.1.0":
- version: 4.1.0
- resolution: "postcss-clamp@npm:4.1.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4.6
- checksum: 10/fb38286d3e607a8b11ef28c89272bd572a077f5a496e2838c3996697bbc4cfb8f7a5be4b4a8987e6b0223db48c9ce5683c9d840f7afe54210ab0f77127628415
- languageName: node
- linkType: hard
-
-"postcss-color-functional-notation@npm:^7.0.6":
- version: 7.0.6
- resolution: "postcss-color-functional-notation@npm:7.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/60c53e2f75ae8bc19de34be4ed10a66476c160ef634db43193c59581d08b5cc3972024bad4660f7e10c65ba09883d4d599353050869ab839b19cbd7012f83cdc
- languageName: node
- linkType: hard
-
-"postcss-color-hex-alpha@npm:^10.0.0":
- version: 10.0.0
- resolution: "postcss-color-hex-alpha@npm:10.0.0"
- dependencies:
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/2dbbd66d76522c7d281c292589360f21806b6dd31a582484e7e4a848e5244d645d5c5e1b6c6219dd5fb7333808cd94a27dd0d2e1db093d043668ed7b42db59ad
- languageName: node
- linkType: hard
-
-"postcss-color-rebeccapurple@npm:^10.0.0":
- version: 10.0.0
- resolution: "postcss-color-rebeccapurple@npm:10.0.0"
- dependencies:
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/8ca0ee2b6b45ff62abdfc9b6757d8832d398c2e47dd705759485b685f544eaed81ec00f050a1bad67ffb5e6243332085a09807d47526ce3b43456b027119e0ae
- languageName: node
- linkType: hard
-
-"postcss-custom-media@npm:^11.0.5":
- version: 11.0.5
- resolution: "postcss-custom-media@npm:11.0.5"
- dependencies:
- "@csstools/cascade-layer-name-parser": "npm:^2.0.4"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/media-query-list-parser": "npm:^4.0.2"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/4899ee7ba6fa8db8c639ee82074ad1941f73df53ec9afc6146820638ab0dc260f7a9692dead8872ad7497442bffba97f867d7615356e87e9d4b4b1a8168b837c
- languageName: node
- linkType: hard
-
-"postcss-custom-properties@npm:^14.0.4":
- version: 14.0.4
- resolution: "postcss-custom-properties@npm:14.0.4"
- dependencies:
- "@csstools/cascade-layer-name-parser": "npm:^2.0.4"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/69271500e2530a736c888cc34c2c3fa92d5bd95f261ba43073807dacba91df41cb1eeb2d137f4038662f5ff921b45bc1d05f66d6f2a79a9b468de0cb91571c19
- languageName: node
- linkType: hard
-
-"postcss-custom-selectors@npm:^8.0.4":
- version: 8.0.4
- resolution: "postcss-custom-selectors@npm:8.0.4"
- dependencies:
- "@csstools/cascade-layer-name-parser": "npm:^2.0.4"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/7b815a82a2fe53c7538fd0cdbeb4db1d404da40c3044dfd1429ebbffd680da12649a3c9aed6f0c976676f98606a7f234c38d8a1490d76bbdda831fde8aeac408
- languageName: node
- linkType: hard
-
-"postcss-dir-pseudo-class@npm:^9.0.1":
- version: 9.0.1
- resolution: "postcss-dir-pseudo-class@npm:9.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/7f6212fe7f2a83e95d85df14208df3edb75b6b8f89ad865fdfbd1abf5765b6649ff46bb7ff56f7788ff8cfe60546ff305cc2fd2f9b1f9e1647a4386507714070
- languageName: node
- linkType: hard
-
-"postcss-double-position-gradients@npm:^6.0.0":
- version: 6.0.0
- resolution: "postcss-double-position-gradients@npm:6.0.0"
- dependencies:
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/c8f8ad9bdfd003c3956dad884db3d69e68e5022db3debe483c90c99a272a3ba15d417a08616899b972e0b2ceb5705c721b1c85344db33bc2785c9f0cf8eb5ec0
- languageName: node
- linkType: hard
-
-"postcss-focus-visible@npm:^10.0.1":
- version: 10.0.1
- resolution: "postcss-focus-visible@npm:10.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/47c038ccf139bad6a4c12cf59c5ac78acbac96ae0517ae08d5db676680d585ae7943e22328bd0d31876d6bacc24e4b717b5f809d26218d76989f7b9a44369793
- languageName: node
- linkType: hard
-
-"postcss-focus-within@npm:^9.0.1":
- version: 9.0.1
- resolution: "postcss-focus-within@npm:9.0.1"
- dependencies:
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/cfaef831e370b25787953450271096fc4dbf61de70291e38c2a3e355cb183432bcb6f4cbd8ebef34617d20cd711982a2918b8d5688ed179f43d1d2cc4cb58c7e
- languageName: node
- linkType: hard
-
-"postcss-font-variant@npm:^5.0.0":
- version: 5.0.0
- resolution: "postcss-font-variant@npm:5.0.0"
- peerDependencies:
- postcss: ^8.1.0
- checksum: 10/738328282cf71750f6efc72d72017f938a6e76c9c49602aae4cc4337beac6d13e72a4ade608567293cb87cad2af502e6aaef652fdcc500e09b4aba38c3e32fc6
- languageName: node
- linkType: hard
-
-"postcss-gap-properties@npm:^6.0.0":
- version: 6.0.0
- resolution: "postcss-gap-properties@npm:6.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/8fa8a208fe254ddfcb0442072a6232576efa1fc3deea917be6d3a0c25dfcb855cc6806572e42a098aa0276a5ad3917f19b269409f5ce1f22d233c0072d72f823
- languageName: node
- linkType: hard
-
-"postcss-image-set-function@npm:^7.0.0":
- version: 7.0.0
- resolution: "postcss-image-set-function@npm:7.0.0"
- dependencies:
- "@csstools/utilities": "npm:^2.0.0"
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/44c1e7d8586b36e9a55cc63dde4cc9f2b2632861d51bc8aebc1aca9045de2052b243bed3d0f9838334f3584d19bf04a4d308ed3fea671af30dd404e319fae252
- languageName: node
- linkType: hard
-
-"postcss-lab-function@npm:^7.0.6":
- version: 7.0.6
- resolution: "postcss-lab-function@npm:7.0.6"
- dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
- "@csstools/css-parser-algorithms": "npm:^3.0.4"
- "@csstools/css-tokenizer": "npm:^3.0.3"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/utilities": "npm:^2.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/b8184b90a15caa08efe8133be60158c505ff6c5d36c975b7172b0cfcf4c10e4a0e0840c041fab27f8bf34a119aa8dc3aa9630ac4e86d08272a5cfd168cddf40d
- languageName: node
- linkType: hard
-
-"postcss-logical@npm:^8.0.0":
- version: 8.0.0
- resolution: "postcss-logical@npm:8.0.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/bdaceacdc80b9b03e2af9e8eb5c195a96cd0a525836a362db357574293189c5ec0f581c71d1ec97856cfbb9ebd4239c24a0593e1f4e32b59aa878a98b5a6ae27
- languageName: node
- linkType: hard
-
-"postcss-nesting@npm:^13.0.1":
- version: 13.0.1
- resolution: "postcss-nesting@npm:13.0.1"
- dependencies:
- "@csstools/selector-resolve-nested": "npm:^3.0.0"
- "@csstools/selector-specificity": "npm:^5.0.0"
- postcss-selector-parser: "npm:^7.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/80ab17f5269bfda988b87e18dd387be84436e3215fd509745b91b3f5569fe522462521da1ad4204415de0fa16ac1c1cfebcb50e4963cf1ee8c28f6cc48505fc8
- languageName: node
- linkType: hard
-
-"postcss-opacity-percentage@npm:^3.0.0":
- version: 3.0.0
- resolution: "postcss-opacity-percentage@npm:3.0.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/dc813113f05f91f1c87ab3c125911f9e5989d1f3fc7cc5586a165901a63c0d02077d134df844391ea5624088680c6b3cee75bc33b8efdcaf340a91046e47e4e1
- languageName: node
- linkType: hard
-
-"postcss-overflow-shorthand@npm:^6.0.0":
- version: 6.0.0
- resolution: "postcss-overflow-shorthand@npm:6.0.0"
- dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/80f07e0beb97b7ac5dac590802591fc93392b0d7a9678e17998b4d34ee0cca637665232c7ea88b3a4342192bc9a2a4f5c757ad86b837a5fd59d083d37cc7da16
- languageName: node
- linkType: hard
-
-"postcss-page-break@npm:^3.0.4":
- version: 3.0.4
- resolution: "postcss-page-break@npm:3.0.4"
- peerDependencies:
- postcss: ^8
- checksum: 10/a7d08c945fc691f62c77ac701e64722218b14ec5c8fc1972b8af9c21553492d40808cf95e61b9697b1dacaf7e6180636876d7fee314f079e6c9e39ac1b1edc6f
- languageName: node
- linkType: hard
-
-"postcss-place@npm:^10.0.0":
- version: 10.0.0
- resolution: "postcss-place@npm:10.0.0"
+"postcss-js@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "postcss-js@npm:4.0.1"
dependencies:
- postcss-value-parser: "npm:^4.2.0"
- peerDependencies:
- postcss: ^8.4
- checksum: 10/738cd0dc2412cf573bcfb2f7dce8e1cd21887f61c8808f55114f08fb8fbf03715e957fdd8859241eecebe400a5202771f513610b04e0f17c7742f6a5ea3bafb3
- languageName: node
- linkType: hard
-
-"postcss-preset-env@npm:^10.1.1":
- version: 10.1.1
- resolution: "postcss-preset-env@npm:10.1.1"
- dependencies:
- "@csstools/postcss-cascade-layers": "npm:^5.0.1"
- "@csstools/postcss-color-function": "npm:^4.0.6"
- "@csstools/postcss-color-mix-function": "npm:^3.0.6"
- "@csstools/postcss-content-alt-text": "npm:^2.0.4"
- "@csstools/postcss-exponential-functions": "npm:^2.0.5"
- "@csstools/postcss-font-format-keywords": "npm:^4.0.0"
- "@csstools/postcss-gamut-mapping": "npm:^2.0.6"
- "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.6"
- "@csstools/postcss-hwb-function": "npm:^4.0.6"
- "@csstools/postcss-ic-unit": "npm:^4.0.0"
- "@csstools/postcss-initial": "npm:^2.0.0"
- "@csstools/postcss-is-pseudo-class": "npm:^5.0.1"
- "@csstools/postcss-light-dark-function": "npm:^2.0.7"
- "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0"
- "@csstools/postcss-logical-overflow": "npm:^2.0.0"
- "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0"
- "@csstools/postcss-logical-resize": "npm:^3.0.0"
- "@csstools/postcss-logical-viewport-units": "npm:^3.0.3"
- "@csstools/postcss-media-minmax": "npm:^2.0.5"
- "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4"
- "@csstools/postcss-nested-calc": "npm:^4.0.0"
- "@csstools/postcss-normalize-display-values": "npm:^4.0.0"
- "@csstools/postcss-oklab-function": "npm:^4.0.6"
- "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/postcss-random-function": "npm:^1.0.1"
- "@csstools/postcss-relative-color-syntax": "npm:^3.0.6"
- "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1"
- "@csstools/postcss-sign-functions": "npm:^1.1.0"
- "@csstools/postcss-stepped-value-functions": "npm:^4.0.5"
- "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1"
- "@csstools/postcss-trigonometric-functions": "npm:^4.0.5"
- "@csstools/postcss-unset-value": "npm:^4.0.0"
- autoprefixer: "npm:^10.4.19"
- browserslist: "npm:^4.23.1"
- css-blank-pseudo: "npm:^7.0.1"
- css-has-pseudo: "npm:^7.0.1"
- css-prefers-color-scheme: "npm:^10.0.0"
- cssdb: "npm:^8.2.1"
- postcss-attribute-case-insensitive: "npm:^7.0.1"
- postcss-clamp: "npm:^4.1.0"
- postcss-color-functional-notation: "npm:^7.0.6"
- postcss-color-hex-alpha: "npm:^10.0.0"
- postcss-color-rebeccapurple: "npm:^10.0.0"
- postcss-custom-media: "npm:^11.0.5"
- postcss-custom-properties: "npm:^14.0.4"
- postcss-custom-selectors: "npm:^8.0.4"
- postcss-dir-pseudo-class: "npm:^9.0.1"
- postcss-double-position-gradients: "npm:^6.0.0"
- postcss-focus-visible: "npm:^10.0.1"
- postcss-focus-within: "npm:^9.0.1"
- postcss-font-variant: "npm:^5.0.0"
- postcss-gap-properties: "npm:^6.0.0"
- postcss-image-set-function: "npm:^7.0.0"
- postcss-lab-function: "npm:^7.0.6"
- postcss-logical: "npm:^8.0.0"
- postcss-nesting: "npm:^13.0.1"
- postcss-opacity-percentage: "npm:^3.0.0"
- postcss-overflow-shorthand: "npm:^6.0.0"
- postcss-page-break: "npm:^3.0.4"
- postcss-place: "npm:^10.0.0"
- postcss-pseudo-class-any-link: "npm:^10.0.1"
- postcss-replace-overflow-wrap: "npm:^4.0.0"
- postcss-selector-not: "npm:^8.0.1"
+ camelcase-css: "npm:^2.0.1"
peerDependencies:
- postcss: ^8.4
- checksum: 10/e0cf7acacaebd055a361d854b8a912d0feff7fe5019caf363b56a43e4661a8e3a9a1c284333893e9472b00e49b75231f1434b6595af60d06691bfd27b89da83e
+ postcss: ^8.4.21
+ checksum: 10/ef2cfe8554daab4166cfcb290f376e7387964c36503f5bd42008778dba735685af8d4f5e0aba67cae999f47c855df40a1cd31ae840e0df320ded36352581045e
languageName: node
linkType: hard
-"postcss-pseudo-class-any-link@npm:^10.0.1":
- version: 10.0.1
- resolution: "postcss-pseudo-class-any-link@npm:10.0.1"
+"postcss-mixins@npm:^9.0.4":
+ version: 9.0.4
+ resolution: "postcss-mixins@npm:9.0.4"
dependencies:
- postcss-selector-parser: "npm:^7.0.0"
+ fast-glob: "npm:^3.2.11"
+ postcss-js: "npm:^4.0.0"
+ postcss-simple-vars: "npm:^7.0.0"
+ sugarss: "npm:^4.0.1"
peerDependencies:
- postcss: ^8.4
- checksum: 10/376525d1a6fa223d908deb884b93d5cb76f4fa7431c090a8ada63e5ee9657bec7bf8e23eff1c36264c051c5a653928e38392165a862b7c5bf5e39e9364383fce
+ postcss: ^8.2.14
+ checksum: 10/71b850cf5ebf55f92668ce6b927f0859f4aec199c8425a660562c25d757cc13be86a0dec8f32a5757094356d8b49e724a109b3f2b97118e79958b11bbcd5d0e0
languageName: node
linkType: hard
-"postcss-replace-overflow-wrap@npm:^4.0.0":
- version: 4.0.0
- resolution: "postcss-replace-overflow-wrap@npm:4.0.0"
+"postcss-nested@npm:^6.0.1":
+ version: 6.2.0
+ resolution: "postcss-nested@npm:6.2.0"
+ dependencies:
+ postcss-selector-parser: "npm:^6.1.1"
peerDependencies:
- postcss: ^8.0.3
- checksum: 10/0629ec17deae65e27dc3059ecec1c6bc833ee65291093b476fce151ab0af45c9e1a56ce250eb9ec4bbc306c19ab318cc982fdbcca8651d347d7dfaa3c9fc9201
+ postcss: ^8.2.14
+ checksum: 10/d7f6ba6bfd03d42f84689a0630d4e393c421bb53723f16fe179a840f03ed17763b0fe494458577d2a015e857e0ec27c7e194909ffe209ee5f0676aec39737317
languageName: node
linkType: hard
-"postcss-selector-not@npm:^8.0.1":
- version: 8.0.1
- resolution: "postcss-selector-not@npm:8.0.1"
+"postcss-preset-mantine@npm:^1.17.0":
+ version: 1.17.0
+ resolution: "postcss-preset-mantine@npm:1.17.0"
dependencies:
- postcss-selector-parser: "npm:^7.0.0"
+ postcss-mixins: "npm:^9.0.4"
+ postcss-nested: "npm:^6.0.1"
peerDependencies:
- postcss: ^8.4
- checksum: 10/28c1f7863ac85016ecd695304ee1eb21b1128eacba333d6d4540fd93691c58ff6329ac323b6a640f2da918e95c7b58e8f534c8b6e2ed016f6e31cdfdc743edbc
+ postcss: ">=8.0.0"
+ checksum: 10/1fd27b9e90f24765b2c99675387fba0831fc0a318aafd2fbbc41c5ab0cc65edef5ec06037bfb284c2e0300043f51d9eabd6f6d17f9a5afb8a434a36466cd6818
languageName: node
linkType: hard
-"postcss-selector-parser@npm:^7.0.0":
- version: 7.0.0
- resolution: "postcss-selector-parser@npm:7.0.0"
+"postcss-selector-parser@npm:^6.1.1":
+ version: 6.1.2
+ resolution: "postcss-selector-parser@npm:6.1.2"
dependencies:
cssesc: "npm:^3.0.0"
util-deprecate: "npm:^1.0.2"
- checksum: 10/0e92be7281e2b440a8be8cf207de40a24ca7bc765577916499614d5a47827a3e658206728cc559db96803e554270516104aad919a04f91bfa8914ccef1ba14ca
+ checksum: 10/190034c94d809c115cd2f32ee6aade84e933450a43ec3899c3e78e7d7b33efd3a2a975bb45d7700b6c5b196c06a7d9acf3f1ba6f1d87032d9675a29d8bca1dd3
languageName: node
linkType: hard
-"postcss-value-parser@npm:^4.2.0":
- version: 4.2.0
- resolution: "postcss-value-parser@npm:4.2.0"
- checksum: 10/e4e4486f33b3163a606a6ed94f9c196ab49a37a7a7163abfcd469e5f113210120d70b8dd5e33d64636f41ad52316a3725655421eb9a1094f1bcab1db2f555c62
+"postcss-simple-vars@npm:^7.0.0, postcss-simple-vars@npm:^7.0.1":
+ version: 7.0.1
+ resolution: "postcss-simple-vars@npm:7.0.1"
+ peerDependencies:
+ postcss: ^8.2.1
+ checksum: 10/42b3cec6ea48ed48e7e280689b0e7f7ec96fac0020be49de0f198af9a162eb7543358e2c7c8db296fe3c8261a0037bf32d188715393edf1d5ede258a6990dfcc
languageName: node
linkType: hard
@@ -10821,6 +10414,17 @@ __metadata:
languageName: node
linkType: hard
+"prop-types@npm:^15.6.2":
+ version: 15.8.1
+ resolution: "prop-types@npm:15.8.1"
+ dependencies:
+ loose-envify: "npm:^1.4.0"
+ object-assign: "npm:^4.1.1"
+ react-is: "npm:^16.13.1"
+ checksum: 10/7d959caec002bc964c86cdc461ec93108b27337dabe6192fb97d69e16a0c799a03462713868b40749bfc1caf5f57ef80ac3e4ffad3effa636ee667582a75e2c0
+ languageName: node
+ linkType: hard
+
"property-information@npm:^6.0.0":
version: 6.5.0
resolution: "property-information@npm:6.5.0"
@@ -10893,31 +10497,6 @@ __metadata:
languageName: node
linkType: hard
-"qr-code-styling@npm:^1.6.0-rc.1":
- version: 1.6.0-rc.1
- resolution: "qr-code-styling@npm:1.6.0-rc.1"
- dependencies:
- qrcode-generator: "npm:^1.4.3"
- checksum: 10/5654e75497eae7123143bd8fc87afae3b03e01b24f7cbd2c08df20e84f412d0ac1309191c89c9590396b8d38ba37ef15ea6461713c7cea0c710f8a2dbdeec892
- languageName: node
- linkType: hard
-
-"qrcode-generator@npm:^1.4.3":
- version: 1.4.4
- resolution: "qrcode-generator@npm:1.4.4"
- checksum: 10/65b2bba237d1f230eba0d08ae4267d04f326859c2265775ade99191be1b522158b623fcc0b613bbfc9d4edbbafb928fc41c66d61053b333f2eb0bcedb2ebadca
- languageName: node
- linkType: hard
-
-"qrcode-terminal-nooctal@npm:^0.12.1":
- version: 0.12.1
- resolution: "qrcode-terminal-nooctal@npm:0.12.1"
- bin:
- qrcode-terminal: bin/qrcode-terminal.js
- checksum: 10/8f437f9e95d8211c3b4eb3de572abd8e9695efa51b327e68e843fcbc2f017e32d6407caf4d8a8dca64d2d1270cf1cc1b16ebb6f2a69a1f891df430e8efdef66a
- languageName: node
- linkType: hard
-
"qrcode@npm:1.5.3":
version: 1.5.3
resolution: "qrcode@npm:1.5.3"
@@ -10932,19 +10511,6 @@ __metadata:
languageName: node
linkType: hard
-"qrcode@npm:1.5.4":
- version: 1.5.4
- resolution: "qrcode@npm:1.5.4"
- dependencies:
- dijkstrajs: "npm:^1.0.1"
- pngjs: "npm:^5.0.0"
- yargs: "npm:^15.3.1"
- bin:
- qrcode: bin/qrcode
- checksum: 10/9a1b61760e4ea334545a0f54bbc11c537aba0a17cf52cab9fa1b07f8a1337eed0bc6f7fde41b197f2c82c249bc48728983bfaf861bb7ecb29dc597b2ae33c424
- languageName: node
- linkType: hard
-
"query-string@npm:7.1.3":
version: 7.1.3
resolution: "query-string@npm:7.1.3"
@@ -10994,6 +10560,26 @@ __metadata:
languageName: node
linkType: hard
+"react-18-blockies@npm:^1.0.6":
+ version: 1.0.6
+ resolution: "react-18-blockies@npm:1.0.6"
+ peerDependencies:
+ react: ">=18.2.0"
+ checksum: 10/62d203eefe13894267f40587e200125b76b4064789936121f4dbb804a2c68da31c89522ed87e97cfd9034e6815f99b5810d3b7a8658bf1fdc2db29bebad21442
+ languageName: node
+ linkType: hard
+
+"react-confetti@npm:^6.1.0":
+ version: 6.1.0
+ resolution: "react-confetti@npm:6.1.0"
+ dependencies:
+ tween-functions: "npm:^1.2.0"
+ peerDependencies:
+ react: ^16.3.0 || ^17.0.1 || ^18.0.0
+ checksum: 10/33423767c42362b29e0c8fd09f60bcf40d64aeb721fd63564f85c61357706a6080563ec40f33435d210d5b5b1af7277aef4545deccf771d08785a3cb19749470
+ languageName: node
+ linkType: hard
+
"react-dom@npm:^18.3.1":
version: 18.3.1
resolution: "react-dom@npm:18.3.1"
@@ -11006,6 +10592,13 @@ __metadata:
languageName: node
linkType: hard
+"react-is@npm:^16.13.1":
+ version: 16.13.1
+ resolution: "react-is@npm:16.13.1"
+ checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf
+ languageName: node
+ linkType: hard
+
"react-is@npm:^17.0.1":
version: 17.0.2
resolution: "react-is@npm:17.0.2"
@@ -11013,16 +10606,13 @@ __metadata:
languageName: node
linkType: hard
-"react-native-webview@npm:^11.26.0":
- version: 11.26.1
- resolution: "react-native-webview@npm:11.26.1"
- dependencies:
- escape-string-regexp: "npm:2.0.0"
- invariant: "npm:2.2.4"
+"react-number-format@npm:^5.4.2":
+ version: 5.4.2
+ resolution: "react-number-format@npm:5.4.2"
peerDependencies:
- react: "*"
- react-native: "*"
- checksum: 10/d64123c73e7795096434135a1bec2aef5caf71a4c1c95b1416cc528bc55f5c4a89df2d311ad3637594f120e864b5798e2c4ea4eb7153bf938ad167c54e7a7e61
+ react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ checksum: 10/d56bf3e132c7b1c51081e8f8be520344c1e43956e31070bb752e2a0fdb6d73b615695a82d4c4c04e6e1c105ee0d998f35949feef5a542a39f875112b0a746607
languageName: node
linkType: hard
@@ -11049,7 +10639,7 @@ __metadata:
languageName: node
linkType: hard
-"react-remove-scroll@npm:2.6.0":
+"react-remove-scroll@npm:^2.6.0":
version: 2.6.0
resolution: "react-remove-scroll@npm:2.6.0"
dependencies:
@@ -11068,6 +10658,24 @@ __metadata:
languageName: node
linkType: hard
+"react-router@npm:^7.0.2":
+ version: 7.0.2
+ resolution: "react-router@npm:7.0.2"
+ dependencies:
+ "@types/cookie": "npm:^0.6.0"
+ cookie: "npm:^1.0.1"
+ set-cookie-parser: "npm:^2.6.0"
+ turbo-stream: "npm:2.4.0"
+ peerDependencies:
+ react: ">=18"
+ react-dom: ">=18"
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ checksum: 10/f8bf5f7810388d4da81444d5e816135306aadd0340a26d645eb171e2b4c4a6d7f5a810f1d27e25ae0f006b949f7cf66fcf399f2af79f48341752a6651b2b30cb
+ languageName: node
+ linkType: hard
+
"react-style-singleton@npm:^2.2.1":
version: 2.2.1
resolution: "react-style-singleton@npm:2.2.1"
@@ -11085,6 +10693,34 @@ __metadata:
languageName: node
linkType: hard
+"react-textarea-autosize@npm:8.5.5":
+ version: 8.5.5
+ resolution: "react-textarea-autosize@npm:8.5.5"
+ dependencies:
+ "@babel/runtime": "npm:^7.20.13"
+ use-composed-ref: "npm:^1.3.0"
+ use-latest: "npm:^1.2.1"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ checksum: 10/07b8085d6d4b6e12939bc40a415410f3309f2afdd0aeb0990523c209a98df3a347f8708046879525394048a6a31825f35f5856e1566bb47f794f6cdc4b994c32
+ languageName: node
+ linkType: hard
+
+"react-transition-group@npm:4.4.5":
+ version: 4.4.5
+ resolution: "react-transition-group@npm:4.4.5"
+ dependencies:
+ "@babel/runtime": "npm:^7.5.5"
+ dom-helpers: "npm:^5.0.1"
+ loose-envify: "npm:^1.4.0"
+ prop-types: "npm:^15.6.2"
+ peerDependencies:
+ react: ">=16.6.0"
+ react-dom: ">=16.6.0"
+ checksum: 10/ca32d3fd2168c976c5d90a317f25d5f5cd723608b415fb3b9006f9d793c8965c619562d0884503a3e44e4b06efbca4fdd1520f30e58ca3e00a0890e637d55419
+ languageName: node
+ linkType: hard
+
"react@npm:^18.3.1":
version: 18.3.1
resolution: "react@npm:18.3.1"
@@ -11421,6 +11057,75 @@ __metadata:
languageName: node
linkType: hard
+"rollup@npm:^4.23.0":
+ version: 4.28.0
+ resolution: "rollup@npm:4.28.0"
+ dependencies:
+ "@rollup/rollup-android-arm-eabi": "npm:4.28.0"
+ "@rollup/rollup-android-arm64": "npm:4.28.0"
+ "@rollup/rollup-darwin-arm64": "npm:4.28.0"
+ "@rollup/rollup-darwin-x64": "npm:4.28.0"
+ "@rollup/rollup-freebsd-arm64": "npm:4.28.0"
+ "@rollup/rollup-freebsd-x64": "npm:4.28.0"
+ "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.0"
+ "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.0"
+ "@rollup/rollup-linux-arm64-gnu": "npm:4.28.0"
+ "@rollup/rollup-linux-arm64-musl": "npm:4.28.0"
+ "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.0"
+ "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.0"
+ "@rollup/rollup-linux-s390x-gnu": "npm:4.28.0"
+ "@rollup/rollup-linux-x64-gnu": "npm:4.28.0"
+ "@rollup/rollup-linux-x64-musl": "npm:4.28.0"
+ "@rollup/rollup-win32-arm64-msvc": "npm:4.28.0"
+ "@rollup/rollup-win32-ia32-msvc": "npm:4.28.0"
+ "@rollup/rollup-win32-x64-msvc": "npm:4.28.0"
+ "@types/estree": "npm:1.0.6"
+ fsevents: "npm:~2.3.2"
+ dependenciesMeta:
+ "@rollup/rollup-android-arm-eabi":
+ optional: true
+ "@rollup/rollup-android-arm64":
+ optional: true
+ "@rollup/rollup-darwin-arm64":
+ optional: true
+ "@rollup/rollup-darwin-x64":
+ optional: true
+ "@rollup/rollup-freebsd-arm64":
+ optional: true
+ "@rollup/rollup-freebsd-x64":
+ optional: true
+ "@rollup/rollup-linux-arm-gnueabihf":
+ optional: true
+ "@rollup/rollup-linux-arm-musleabihf":
+ optional: true
+ "@rollup/rollup-linux-arm64-gnu":
+ optional: true
+ "@rollup/rollup-linux-arm64-musl":
+ optional: true
+ "@rollup/rollup-linux-powerpc64le-gnu":
+ optional: true
+ "@rollup/rollup-linux-riscv64-gnu":
+ optional: true
+ "@rollup/rollup-linux-s390x-gnu":
+ optional: true
+ "@rollup/rollup-linux-x64-gnu":
+ optional: true
+ "@rollup/rollup-linux-x64-musl":
+ optional: true
+ "@rollup/rollup-win32-arm64-msvc":
+ optional: true
+ "@rollup/rollup-win32-ia32-msvc":
+ optional: true
+ "@rollup/rollup-win32-x64-msvc":
+ optional: true
+ fsevents:
+ optional: true
+ bin:
+ rollup: dist/bin/rollup
+ checksum: 10/e604ff8d866818fff5b15864eab09011b497117774de413a566c17bda5fc6878ea101b6124421e29d7c3478280b8e6a864b2b1f1c7c4422e7fe31cb6846a09fc
+ languageName: node
+ linkType: hard
+
"rollup@npm:^4.27.3":
version: 4.27.3
resolution: "rollup@npm:4.27.3"
@@ -11586,6 +11291,13 @@ __metadata:
languageName: node
linkType: hard
+"set-cookie-parser@npm:^2.6.0":
+ version: 2.7.1
+ resolution: "set-cookie-parser@npm:2.7.1"
+ checksum: 10/c92b1130032693342bca13ea1b1bc93967ab37deec4387fcd8c2a843c0ef2fd9a9f3df25aea5bb3976cd05a91c2cf4632dd6164d6e1814208fb7d7e14edd42b4
+ languageName: node
+ linkType: hard
+
"set-function-length@npm:^1.2.1":
version: 1.2.2
resolution: "set-function-length@npm:1.2.2"
@@ -12093,6 +11805,15 @@ __metadata:
languageName: node
linkType: hard
+"sugarss@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "sugarss@npm:4.0.1"
+ peerDependencies:
+ postcss: ^8.3.3
+ checksum: 10/d8c2f5a91c943d5f98930456f32f10c9ea2dca1a17634097d08063d6fc83c2c23c4fc5c5d6620010f763ef92dc31a00a626e433c2db9abd62a718c2c59624471
+ languageName: node
+ linkType: hard
+
"superstruct@npm:^1.0.3":
version: 1.0.4
resolution: "superstruct@npm:1.0.4"
@@ -12142,6 +11863,13 @@ __metadata:
languageName: node
linkType: hard
+"tabbable@npm:^6.0.0":
+ version: 6.2.0
+ resolution: "tabbable@npm:6.2.0"
+ checksum: 10/980fa73476026e99dcacfc0d6e000d41d42c8e670faf4682496d30c625495e412c4369694f2a15cf1e5252d22de3c396f2b62edbe8d60b5dadc40d09e3f2dde3
+ languageName: node
+ linkType: hard
+
"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1":
version: 6.2.1
resolution: "tar@npm:6.2.1"
@@ -12340,6 +12068,13 @@ __metadata:
languageName: node
linkType: hard
+"tslib@npm:^2.6.0":
+ version: 2.8.1
+ resolution: "tslib@npm:2.8.1"
+ checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7
+ languageName: node
+ linkType: hard
+
"tuf-js@npm:^1.1.7":
version: 1.1.7
resolution: "tuf-js@npm:1.1.7"
@@ -12379,6 +12114,13 @@ __metadata:
languageName: node
linkType: hard
+"turbo-stream@npm:2.4.0":
+ version: 2.4.0
+ resolution: "turbo-stream@npm:2.4.0"
+ checksum: 10/7079bbc82b58340f783144cd669cc7e598288523103a8d68bb8a4c6bb28c64eccb71d389b33aab07788d3a9030638b795709e15cb8486f722b1cdac59cb58afc
+ languageName: node
+ linkType: hard
+
"turbo-windows-64@npm:2.3.0":
version: 2.3.0
resolution: "turbo-windows-64@npm:2.3.0"
@@ -12422,6 +12164,13 @@ __metadata:
languageName: node
linkType: hard
+"tween-functions@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "tween-functions@npm:1.2.0"
+ checksum: 10/f145f39187aacfe6e3c6bfe8452be4061a569b8e1e75c28169c55b7cdf519daa1877c79a8a2cdc902b68f49b67b8478f34818ff02529d27ae5aa0545e7fbdc06
+ languageName: node
+ linkType: hard
+
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"
@@ -12452,6 +12201,13 @@ __metadata:
languageName: node
linkType: hard
+"type-fest@npm:^4.27.0":
+ version: 4.30.0
+ resolution: "type-fest@npm:4.30.0"
+ checksum: 10/46c733df4feb87dfd281fba4fa3913dc38b45136be35adffbcef95e13414105a4669476c1f8686680b9c98e59ed5dc85efe42caf67adbaa04f48dfc41f8330fa
+ languageName: node
+ linkType: hard
+
"typedoc@npm:^0.26.11":
version: 0.26.11
resolution: "typedoc@npm:0.26.11"
@@ -12504,6 +12260,16 @@ __metadata:
languageName: node
linkType: hard
+"typescript@npm:^5.7.2":
+ version: 5.7.2
+ resolution: "typescript@npm:5.7.2"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10/4caa3904df69db9d4a8bedc31bafc1e19ffb7b24fbde2997a1633ae1398d0de5bdbf8daf602ccf3b23faddf1aeeb9b795223a2ed9c9a4fdcaf07bfde114a401a
+ languageName: node
+ linkType: hard
+
"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin":
version: 5.6.3
resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=8c6c40"
@@ -12514,12 +12280,13 @@ __metadata:
languageName: node
linkType: hard
-"ua-parser-js@npm:^1.0.37":
- version: 1.0.39
- resolution: "ua-parser-js@npm:1.0.39"
+"typescript@patch:typescript@npm%3A^5.7.2#optional!builtin":
+ version: 5.7.2
+ resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=8c6c40"
bin:
- ua-parser-js: script/cli.js
- checksum: 10/dd4026b6ece8a34a0d39b6de5542154c4506077d8def8647a300a29e1b3ffa0e23f5c8eeeb8101df6162b7b3eb3597d0b4adb031ae6104cbdb730d6ebc07f3c0
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10/ff27fc124bceb8969be722baa38af945b2505767cf794de3e2715e58f61b43780284060287d651fcbbdfb6f917f4653b20f4751991f17e0706db389b9bb3f75d
languageName: node
linkType: hard
@@ -12837,6 +12604,41 @@ __metadata:
languageName: node
linkType: hard
+"use-composed-ref@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "use-composed-ref@npm:1.3.0"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ checksum: 10/f771cbadfdc91e03b7ab9eb32d0fc0cc647755711801bf507e891ad38c4bbc5f02b2509acadf9c965ec9c5f2f642fd33bdfdfb17b0873c4ad0a9b1f5e5e724bf
+ languageName: node
+ linkType: hard
+
+"use-isomorphic-layout-effect@npm:^1.1.1":
+ version: 1.1.2
+ resolution: "use-isomorphic-layout-effect@npm:1.1.2"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10/fd3787ed19f6cfbf70e2c5822d01bebbf96b00968195840d5ad61082b8e6ca7a8e2e46270c4096537d18a38ea57f4e4e9668cce5eec36fa4697ddba2ef1203fd
+ languageName: node
+ linkType: hard
+
+"use-latest@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "use-latest@npm:1.2.1"
+ dependencies:
+ use-isomorphic-layout-effect: "npm:^1.1.1"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10/b0cbdd91f32e9a7fb4cd9d54934bef55dd6dbe90e2853506405e7c2ca78ca61dd34a6241f7138110a5013da02366138708f23f417c63524ad27aa43afa4196d6
+ languageName: node
+ linkType: hard
+
"use-sidecar@npm:^1.1.2":
version: 1.1.2
resolution: "use-sidecar@npm:1.1.2"
@@ -12995,7 +12797,7 @@ __metadata:
languageName: node
linkType: hard
-"viem@npm:^2.1.1, viem@npm:^2.17.4":
+"viem@npm:^2.1.1":
version: 2.21.21
resolution: "viem@npm:2.21.21"
dependencies:
@@ -13061,6 +12863,50 @@ __metadata:
languageName: node
linkType: hard
+"viem@npm:^2.17.4":
+ version: 2.21.53
+ resolution: "viem@npm:2.21.53"
+ dependencies:
+ "@noble/curves": "npm:1.6.0"
+ "@noble/hashes": "npm:1.5.0"
+ "@scure/bip32": "npm:1.5.0"
+ "@scure/bip39": "npm:1.4.0"
+ abitype: "npm:1.0.6"
+ isows: "npm:1.0.6"
+ ox: "npm:0.1.2"
+ webauthn-p256: "npm:0.0.10"
+ ws: "npm:8.18.0"
+ peerDependencies:
+ typescript: ">=5.0.4"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10/fe41684a63b4d493b7cfb7f30451d5275c51dda196047c949710f05cf920bb22d5f3ff16375d1854797b0f0c8f5c31c0dd8720826f135e2b3040e2067d18b88f
+ languageName: node
+ linkType: hard
+
+"viem@npm:^2.21.52":
+ version: 2.21.52
+ resolution: "viem@npm:2.21.52"
+ dependencies:
+ "@noble/curves": "npm:1.6.0"
+ "@noble/hashes": "npm:1.5.0"
+ "@scure/bip32": "npm:1.5.0"
+ "@scure/bip39": "npm:1.4.0"
+ abitype: "npm:1.0.6"
+ isows: "npm:1.0.6"
+ ox: "npm:0.1.2"
+ webauthn-p256: "npm:0.0.10"
+ ws: "npm:8.18.0"
+ peerDependencies:
+ typescript: ">=5.0.4"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10/d30346ebc74237a922a62704780bbf7f49cfa11477e743aa8a2c0c9c184c7f290f93c5c5f34e357ae88fee08ea81e108fe8bea44bf61f9774d4d515f5038b9d4
+ languageName: node
+ linkType: hard
+
"vite-node@npm:2.1.3":
version: 2.1.3
resolution: "vite-node@npm:2.1.3"
@@ -13177,6 +13023,58 @@ __metadata:
languageName: node
linkType: hard
+"vite@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "vite@npm:6.0.2"
+ dependencies:
+ esbuild: "npm:^0.24.0"
+ fsevents: "npm:~2.3.3"
+ postcss: "npm:^8.4.49"
+ rollup: "npm:^4.23.0"
+ peerDependencies:
+ "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: ">=1.21.0"
+ less: "*"
+ lightningcss: ^1.21.0
+ sass: "*"
+ sass-embedded: "*"
+ stylus: "*"
+ sugarss: "*"
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ peerDependenciesMeta:
+ "@types/node":
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+ bin:
+ vite: bin/vite.js
+ checksum: 10/24fea725676da1812ec0f073d1748a09f6fd8552a86b9b2b3002326d8cb8ada72e0abfe0837b00077412dc5bbd1773aec38d1fc3462709b0ecc1512332b5d2a0
+ languageName: node
+ linkType: hard
+
"vitest@npm:^2.1.3":
version: 2.1.3
resolution: "vitest@npm:2.1.3"
@@ -13226,12 +13124,12 @@ __metadata:
languageName: node
linkType: hard
-"wagmi@npm:^2.12.33":
- version: 2.12.33
- resolution: "wagmi@npm:2.12.33"
+"wagmi@npm:^2.13.2":
+ version: 2.13.2
+ resolution: "wagmi@npm:2.13.2"
dependencies:
- "@wagmi/connectors": "npm:5.4.0"
- "@wagmi/core": "npm:2.14.6"
+ "@wagmi/connectors": "npm:5.5.2"
+ "@wagmi/core": "npm:2.15.1"
use-sync-external-store: "npm:1.2.0"
peerDependencies:
"@tanstack/react-query": ">=5.0.0"
@@ -13241,7 +13139,7 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
- checksum: 10/34db51d4330791e21e0a1d7ff3de2c09e429b6d7638c01e9a31cbb67ed2e3af04531778f6ec1b8ca4afa41d3c6e7e1081dd2482940446906a6f08920d9dce8b3
+ checksum: 10/3a1811af06d586b8d54a7f59e7e4d9c58d08f0873efe0ca36d0ecde72b0d6b6729eb309be70e79d69f9290e9cb6da333f47201212138fded1290e62308e8f85d
languageName: node
linkType: hard