From db64a53bd4ddbd05badf789773804aada365b75f Mon Sep 17 00:00:00 2001 From: Tamas Date: Tue, 11 Feb 2025 14:37:42 +0100 Subject: [PATCH 1/5] init --- examples/multichain/.gitignore | 24 + examples/multichain/README.md | 50 + examples/multichain/eslint.config.js | 28 + examples/multichain/index.html | 13 + examples/multichain/package.json | 29 + examples/multichain/public/vite.svg | 1 + examples/multichain/src/App.css | 42 + examples/multichain/src/App.tsx | 35 + examples/multichain/src/assets/react.svg | 1 + examples/multichain/src/index.css | 68 ++ examples/multichain/src/main.tsx | 10 + examples/multichain/src/vite-env.d.ts | 1 + examples/multichain/tsconfig.app.json | 26 + examples/multichain/tsconfig.json | 7 + examples/multichain/tsconfig.node.json | 24 + examples/multichain/vite.config.ts | 7 + pnpm-lock.yaml | 1187 +++++++++++++++++++++- 17 files changed, 1549 insertions(+), 4 deletions(-) create mode 100644 examples/multichain/.gitignore create mode 100644 examples/multichain/README.md create mode 100644 examples/multichain/eslint.config.js create mode 100644 examples/multichain/index.html create mode 100644 examples/multichain/package.json create mode 100644 examples/multichain/public/vite.svg create mode 100644 examples/multichain/src/App.css create mode 100644 examples/multichain/src/App.tsx create mode 100644 examples/multichain/src/assets/react.svg create mode 100644 examples/multichain/src/index.css create mode 100644 examples/multichain/src/main.tsx create mode 100644 examples/multichain/src/vite-env.d.ts create mode 100644 examples/multichain/tsconfig.app.json create mode 100644 examples/multichain/tsconfig.json create mode 100644 examples/multichain/tsconfig.node.json create mode 100644 examples/multichain/vite.config.ts diff --git a/examples/multichain/.gitignore b/examples/multichain/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/examples/multichain/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/multichain/README.md b/examples/multichain/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/examples/multichain/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/examples/multichain/eslint.config.js b/examples/multichain/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/examples/multichain/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/examples/multichain/index.html b/examples/multichain/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/examples/multichain/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/examples/multichain/package.json b/examples/multichain/package.json new file mode 100644 index 0000000..e014094 --- /dev/null +++ b/examples/multichain/package.json @@ -0,0 +1,29 @@ +{ + "name": "multichain", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.19.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.19.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.18", + "globals": "^15.14.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.22.0", + "vite": "^6.1.0" + } +} diff --git a/examples/multichain/public/vite.svg b/examples/multichain/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/examples/multichain/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/multichain/src/App.css b/examples/multichain/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/examples/multichain/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/examples/multichain/src/App.tsx b/examples/multichain/src/App.tsx new file mode 100644 index 0000000..3d7ded3 --- /dev/null +++ b/examples/multichain/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/examples/multichain/src/assets/react.svg b/examples/multichain/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/examples/multichain/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/multichain/src/index.css b/examples/multichain/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/examples/multichain/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/multichain/src/main.tsx b/examples/multichain/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/examples/multichain/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/examples/multichain/src/vite-env.d.ts b/examples/multichain/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/multichain/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/multichain/tsconfig.app.json b/examples/multichain/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/examples/multichain/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/multichain/tsconfig.json b/examples/multichain/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/examples/multichain/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/multichain/tsconfig.node.json b/examples/multichain/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/examples/multichain/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/multichain/vite.config.ts b/examples/multichain/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/examples/multichain/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de8af2a..25cd82a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,49 @@ importers: specifier: 5.5.4 version: 5.5.4 + examples/multichain: + dependencies: + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@eslint/js': + specifier: ^9.19.0 + version: 9.20.0 + '@types/react': + specifier: ^19.0.8 + version: 19.0.8 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.8) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.1.0(@types/node@20.17.6)(jiti@2.4.1)(yaml@2.6.1)) + eslint: + specifier: ^9.19.0 + version: 9.20.0(jiti@2.4.1) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.0.0(eslint@9.20.0(jiti@2.4.1)) + eslint-plugin-react-refresh: + specifier: ^0.4.18 + version: 0.4.19(eslint@9.20.0(jiti@2.4.1)) + globals: + specifier: ^15.14.0 + version: 15.14.0 + typescript: + specifier: ~5.7.2 + version: 5.7.3 + typescript-eslint: + specifier: ^8.22.0 + version: 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + vite: + specifier: ^6.1.0 + version: 6.1.0(@types/node@20.17.6)(jiti@2.4.1)(yaml@2.6.1) + examples/quickstart: dependencies: '@radix-ui/react-dropdown-menu': @@ -172,6 +215,77 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.8': + resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.8': + resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.26.0': resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} engines: {node: '>=6.9.0'} @@ -180,6 +294,18 @@ packages: resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} + '@babel/template@7.26.8': + resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.8': + resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} + engines: {node: '>=6.9.0'} + '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -199,6 +325,156 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -213,6 +489,14 @@ packages: resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.11.0': + resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.9.0': resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -225,6 +509,10 @@ packages: resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.20.0': + resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -233,6 +521,10 @@ packages: resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ethereumjs/common@3.2.0': resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} @@ -975,6 +1267,101 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@rollup/rollup-android-arm-eabi@4.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1101,12 +1488,27 @@ packages: '@turbo/workspaces@1.13.4': resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/gensync@1.0.4': + resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} + '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} @@ -1139,12 +1541,20 @@ packages: peerDependencies: '@types/react': ^19.0.0 + '@types/react-dom@19.0.3': + resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + peerDependencies: + '@types/react': ^19.0.0 + '@types/react@18.3.0': resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/react@19.0.8': + resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -1165,6 +1575,14 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.24.0': + resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/parser@8.15.0': resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1175,10 +1593,21 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.24.0': + resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/scope-manager@8.15.0': resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.24.0': + resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.15.0': resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1189,10 +1618,21 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.24.0': + resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/types@8.15.0': resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.24.0': + resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.15.0': resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1202,6 +1642,12 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.24.0': + resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@8.15.0': resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1212,10 +1658,27 @@ packages: typescript: optional: true + '@typescript-eslint/utils@8.24.0': + resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/visitor-keys@8.15.0': resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.24.0': + resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@wagmi/connectors@5.7.4': resolution: {integrity: sha512-ubecKH0grfkfjTB17l1V6Gj4SCMTvCtie7Bq0oQdjqA3Z7zf+F/RAwZoehxkPnSyeK6pFotUlUSr82J3bNhPqA==} peerDependencies: @@ -1503,6 +1966,11 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1547,6 +2015,9 @@ packages: caniuse-lite@1.0.30001683: resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} + caniuse-lite@1.0.30001699: + resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1654,6 +2125,9 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} @@ -1829,6 +2303,9 @@ packages: resolution: {integrity: sha512-DGejvMCihsRAmKRFQiL6KZDE34vWVd0gvXlykFq1aEzJy/rD65AVyAIUZKZOvgvaP9ATQRcHGEZV5DfgrgjA4w==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} + electron-to-chromium@1.5.97: + resolution: {integrity: sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==} + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -1886,6 +2363,15 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1976,6 +2462,11 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react-refresh@0.4.19: + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' + eslint-plugin-react@7.37.2: resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} engines: {node: '>=4'} @@ -2009,6 +2500,16 @@ packages: jiti: optional: true + eslint@9.20.0: + resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2167,6 +2668,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2220,6 +2725,10 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2228,6 +2737,10 @@ packages: resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -2586,6 +3099,11 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2606,6 +3124,11 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -2694,6 +3217,9 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -2791,6 +3317,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2855,6 +3386,9 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3121,6 +3655,10 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + engines: {node: ^10 || ^12 || >=14} + preact@10.25.2: resolution: {integrity: sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==} @@ -3192,6 +3730,10 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -3297,6 +3839,11 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -3617,6 +4164,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3711,10 +4264,22 @@ packages: typescript: optional: true + typescript-eslint@8.24.0: + resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -3789,6 +4354,12 @@ packages: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -3879,6 +4450,46 @@ packages: typescript: optional: true + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + 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 + wagmi@2.14.8: resolution: {integrity: sha512-m7oMF/rqsTwYuBZzwyYskzhdkZxq6zJjY2le6Vz7We5Hih7hwJ7hLNU5TxMfhqjPRfsqXlWX9HLOszOipHxz8Q==} peerDependencies: @@ -3996,6 +4607,9 @@ packages: y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.6.1: resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} @@ -4035,11 +4649,104 @@ packages: use-sync-external-store: optional: true -snapshots: +snapshots: + + '@adraffy/ens-normalize@1.11.0': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.8': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@types/gensync': 1.0.4 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.8': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/parser@7.26.8': + dependencies: + '@babel/types': 7.26.8 - '@adraffy/ens-normalize@1.11.0': {} + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 - '@alloc/quick-lru@5.2.0': {} + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 '@babel/runtime-corejs3@7.26.0': dependencies: @@ -4050,6 +4757,29 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/template@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/traverse@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.8': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@coinbase/wallet-sdk@3.9.3': dependencies: bn.js: 5.2.1 @@ -4084,11 +4814,91 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0(jiti@2.4.1))': dependencies: eslint: 9.15.0(jiti@2.4.1) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0(jiti@2.4.1))': + dependencies: + eslint: 9.20.0(jiti@2.4.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.19.0': @@ -4099,6 +4909,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.11.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/core@0.9.0': {} '@eslint/eslintrc@3.2.0': @@ -4117,12 +4935,19 @@ snapshots: '@eslint/js@9.15.0': {} + '@eslint/js@9.20.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.3': dependencies: levn: 0.4.1 + '@eslint/plugin-kit@0.2.5': + dependencies: + '@eslint/core': 0.10.0 + levn: 0.4.1 + '@ethereumjs/common@3.2.0': dependencies: '@ethereumjs/util': 8.1.0 @@ -4861,6 +5686,63 @@ snapshots: '@radix-ui/rect@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.34.6': + optional: true + + '@rollup/rollup-android-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-x64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.6': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.6': + optional: true + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.4': {} @@ -5053,12 +5935,35 @@ snapshots: semver: 7.6.3 update-check: 1.5.4 + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.8 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 '@types/estree@1.0.6': {} + '@types/gensync@1.0.4': {} + '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 @@ -5085,12 +5990,16 @@ snapshots: '@types/react-dom@18.3.1': dependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.8 '@types/react-dom@19.0.2(@types/react@19.0.1)': dependencies: '@types/react': 19.0.1 + '@types/react-dom@19.0.3(@types/react@19.0.8)': + dependencies: + '@types/react': 19.0.8 + '@types/react@18.3.0': dependencies: '@types/prop-types': 15.7.13 @@ -5100,6 +6009,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/react@19.0.8': + dependencies: + csstype: 3.1.3 + '@types/through@0.0.33': dependencies: '@types/node': 20.17.6 @@ -5126,6 +6039,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + eslint: 9.20.0(jiti@2.4.1) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.15.0 @@ -5139,11 +6069,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + debug: 4.3.7 + eslint: 9.20.0(jiti@2.4.1) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.15.0': dependencies: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/scope-manager@8.24.0': + dependencies: + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.4) @@ -5156,8 +6103,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + debug: 4.3.7 + eslint: 9.20.0(jiti@2.4.1) + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.24.0': {} + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 8.15.0 @@ -5173,6 +6133,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@2.4.1)) @@ -5185,11 +6159,38 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@2.4.1)) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + eslint: 9.20.0(jiti@2.4.1) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.15.0': dependencies: '@typescript-eslint/types': 8.15.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.24.0': + dependencies: + '@typescript-eslint/types': 8.24.0 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@20.17.6)(jiti@2.4.1)(yaml@2.6.1))': + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.8) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.8) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.1.0(@types/node@20.17.6)(jiti@2.4.1)(yaml@2.6.1) + transitivePeerDependencies: + - supports-color + '@wagmi/connectors@5.7.4(@types/react@19.0.1)(@wagmi/core@2.16.3(@tanstack/query-core@5.62.7)(@types/react@19.0.1)(react@19.0.0)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react@19.0.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@coinbase/wallet-sdk': 4.2.3 @@ -5740,6 +6741,13 @@ snapshots: brorand@1.1.0: {} + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001699 + electron-to-chromium: 1.5.97 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -5789,6 +6797,8 @@ snapshots: caniuse-lite@1.0.30001683: {} + caniuse-lite@1.0.30001699: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5917,6 +6927,8 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 + convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} core-js-pure@3.39.0: {} @@ -6085,6 +7097,8 @@ snapshots: '@noble/curves': 1.7.0 '@noble/hashes': 1.6.1 + electron-to-chromium@1.5.97: {} + elliptic@6.6.1: dependencies: bn.js: 4.12.1 @@ -6215,6 +7229,36 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -6340,6 +7384,14 @@ snapshots: dependencies: eslint: 9.15.0(jiti@2.4.1) + eslint-plugin-react-hooks@5.0.0(eslint@9.20.0(jiti@2.4.1)): + dependencies: + eslint: 9.20.0(jiti@2.4.1) + + eslint-plugin-react-refresh@0.4.19(eslint@9.20.0(jiti@2.4.1)): + dependencies: + eslint: 9.20.0(jiti@2.4.1) + eslint-plugin-react@7.37.2(eslint@9.15.0(jiti@2.4.1)): dependencies: array-includes: 3.1.8 @@ -6417,6 +7469,47 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.20.0(jiti@2.4.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@2.4.1)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.11.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.20.0 + '@eslint/plugin-kit': 0.2.5 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.1 + transitivePeerDependencies: + - supports-color + espree@10.3.0: dependencies: acorn: 8.14.0 @@ -6610,6 +7703,8 @@ snapshots: functions-have-names@1.2.3: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-intrinsic@1.2.4: @@ -6686,10 +7781,14 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + globals@11.12.0: {} + globals@14.0.0: {} globals@15.12.0: {} + globals@15.14.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -7060,6 +8159,8 @@ snapshots: jsbn@1.1.0: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-rpc-engine@6.1.0: @@ -7077,6 +8178,8 @@ snapshots: dependencies: minimist: 1.2.8 + json5@2.2.3: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -7191,6 +8294,10 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lru-cache@7.18.3: {} lucide-react@0.468.0(react@19.0.0): @@ -7272,6 +8379,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@3.3.8: {} + natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -7335,6 +8444,8 @@ snapshots: mkdirp: 0.5.6 resolve: 1.22.8 + node-releases@2.0.19: {} + normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -7628,6 +8739,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.2: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact@10.25.2: {} prelude-ls@1.2.1: {} @@ -7707,6 +8824,8 @@ snapshots: react-is@16.13.1: {} + react-refresh@0.14.2: {} + react-remove-scroll-bar@2.3.8(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 @@ -7823,6 +8942,31 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.34.6: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 + fsevents: 2.3.3 + run-async@2.4.1: {} run-parallel@1.2.0: @@ -8198,6 +9342,10 @@ snapshots: dependencies: typescript: 5.5.4 + ts-api-utils@2.0.1(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + ts-interface-checker@0.1.13: {} ts-node@10.9.2(@types/node@20.17.6)(typescript@5.5.4): @@ -8306,8 +9454,20 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.7.3) + eslint: 9.20.0(jiti@2.4.1) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + typescript@5.5.4: {} + typescript@5.7.3: {} + ufo@1.5.4: {} uglify-js@3.19.3: @@ -8359,6 +9519,12 @@ snapshots: consola: 3.2.3 pathe: 1.1.2 + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -8447,6 +9613,17 @@ snapshots: - utf-8-validate - zod + vite@6.1.0(@types/node@20.17.6)(jiti@2.4.1)(yaml@2.6.1): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.2 + rollup: 4.34.6 + optionalDependencies: + '@types/node': 20.17.6 + fsevents: 2.3.3 + jiti: 2.4.1 + yaml: 2.6.1 + wagmi@2.14.8(@tanstack/query-core@5.62.7)(@tanstack/react-query@5.62.7(react@19.0.0))(@types/react@19.0.1)(bufferutil@4.0.8)(react@19.0.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@tanstack/react-query': 5.62.7(react@19.0.0) @@ -8587,6 +9764,8 @@ snapshots: y18n@4.0.3: {} + yallist@3.1.1: {} + yaml@2.6.1: {} yargs-parser@18.1.3: From 369be5a7226cd06e800555ed9e090135d0a47c27 Mon Sep 17 00:00:00 2001 From: Tamas Date: Fri, 14 Feb 2025 11:28:42 +0100 Subject: [PATCH 2/5] feat: ui and functionality --- examples/multichain/.gitignore | 1 + examples/multichain/index.html | 2 +- examples/multichain/package.json | 9 +- examples/multichain/public/metamask-logo.svg | 39 + examples/multichain/public/noise.svg | 1 + examples/multichain/src/App.tsx | 275 +++- examples/multichain/src/assets/react.svg | 1 - .../src/components/layout/background.tsx | 32 + .../multichain/src/components/ui/avatar.tsx | 74 ++ .../multichain/src/components/ui/checkbox.tsx | 25 + .../src/components/ui/close-button.tsx | 17 + .../src/components/ui/color-mode.tsx | 107 ++ .../multichain/src/components/ui/dialog.tsx | 62 + .../multichain/src/components/ui/drawer.tsx | 52 + .../multichain/src/components/ui/field.tsx | 33 + .../src/components/ui/input-group.tsx | 53 + .../src/components/ui/native-select.tsx | 57 + .../multichain/src/components/ui/popover.tsx | 59 + .../multichain/src/components/ui/provider.tsx | 15 + .../multichain/src/components/ui/radio.tsx | 24 + .../multichain/src/components/ui/select.tsx | 143 +++ .../multichain/src/components/ui/slider.tsx | 82 ++ .../multichain/src/components/ui/toaster.tsx | 43 + .../multichain/src/components/ui/tooltip.tsx | 46 + examples/multichain/src/index.css | 68 - examples/multichain/src/main.tsx | 12 +- examples/multichain/src/multichain/hooks.ts | 10 + .../multichain/src/multichain/provider.tsx | 20 + examples/multichain/vite.config.ts | 16 +- pnpm-lock.yaml | 1107 +++++++++++++++++ 30 files changed, 2381 insertions(+), 104 deletions(-) create mode 100644 examples/multichain/public/metamask-logo.svg create mode 100644 examples/multichain/public/noise.svg delete mode 100644 examples/multichain/src/assets/react.svg create mode 100644 examples/multichain/src/components/layout/background.tsx create mode 100644 examples/multichain/src/components/ui/avatar.tsx create mode 100644 examples/multichain/src/components/ui/checkbox.tsx create mode 100644 examples/multichain/src/components/ui/close-button.tsx create mode 100644 examples/multichain/src/components/ui/color-mode.tsx create mode 100644 examples/multichain/src/components/ui/dialog.tsx create mode 100644 examples/multichain/src/components/ui/drawer.tsx create mode 100644 examples/multichain/src/components/ui/field.tsx create mode 100644 examples/multichain/src/components/ui/input-group.tsx create mode 100644 examples/multichain/src/components/ui/native-select.tsx create mode 100644 examples/multichain/src/components/ui/popover.tsx create mode 100644 examples/multichain/src/components/ui/provider.tsx create mode 100644 examples/multichain/src/components/ui/radio.tsx create mode 100644 examples/multichain/src/components/ui/select.tsx create mode 100644 examples/multichain/src/components/ui/slider.tsx create mode 100644 examples/multichain/src/components/ui/toaster.tsx create mode 100644 examples/multichain/src/components/ui/tooltip.tsx delete mode 100644 examples/multichain/src/index.css create mode 100644 examples/multichain/src/multichain/hooks.ts create mode 100644 examples/multichain/src/multichain/provider.tsx diff --git a/examples/multichain/.gitignore b/examples/multichain/.gitignore index a547bf3..fcaa2b1 100644 --- a/examples/multichain/.gitignore +++ b/examples/multichain/.gitignore @@ -8,6 +8,7 @@ pnpm-debug.log* lerna-debug.log* node_modules +local_modules dist dist-ssr *.local diff --git a/examples/multichain/index.html b/examples/multichain/index.html index e4b78ea..90557e2 100644 --- a/examples/multichain/index.html +++ b/examples/multichain/index.html @@ -4,7 +4,7 @@ - Vite + React + TS + Metamask Multichain Example
diff --git a/examples/multichain/package.json b/examples/multichain/package.json index e014094..294e2c6 100644 --- a/examples/multichain/package.json +++ b/examples/multichain/package.json @@ -10,8 +10,15 @@ "preview": "vite preview" }, "dependencies": { + "@chakra-ui/react": "^3.8.0", + "@emotion/react": "^11.14.0", + "@metamask/providers": "^20.0.0", + "lucide-react": "^0.468.0", + "next-themes": "^0.4.4", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "react-icons": "^5.4.0", + "tslib": "^2.8.1" }, "devDependencies": { "@eslint/js": "^9.19.0", diff --git a/examples/multichain/public/metamask-logo.svg b/examples/multichain/public/metamask-logo.svg new file mode 100644 index 0000000..2056ddc --- /dev/null +++ b/examples/multichain/public/metamask-logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/multichain/public/noise.svg b/examples/multichain/public/noise.svg new file mode 100644 index 0000000..18410d0 --- /dev/null +++ b/examples/multichain/public/noise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/multichain/src/App.tsx b/examples/multichain/src/App.tsx index 3d7ded3..3ce535c 100644 --- a/examples/multichain/src/App.tsx +++ b/examples/multichain/src/App.tsx @@ -1,35 +1,256 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +"use client"; + +import { useState } from "react"; +import { useMultichain } from "./multichain/hooks.ts"; +import { + Container, + Flex, + Box, + Image, + createListCollection, + Text, + Link, +} from "@chakra-ui/react"; +import { Button } from "@chakra-ui/react"; +import { toaster } from "./components/ui/toaster" +import { ExternalLink } from "lucide-react"; +import { BackgroundNoise } from "./components/layout/background.tsx"; +import { NativeSelectField, NativeSelectRoot } from "./components/ui/native-select.tsx"; + +const EXTENSION_ID = "eklmonnmoaepkgaomjcefmimkkfikokn"; + +const networks = createListCollection({ + items: [ + { label: "Ethereum", value: "eip155:1" }, + { label: "Linea", value: "eip155:59144" }, + ], +}); function App() { - const [count, setCount] = useState(0) + const [isConnected, setIsConnected] = useState(false); + const [currentNetwork, setCurrentNetwork] = useState(["eip155:1"]); + const [userAddress, setUserAddress] = useState(null); + + const client = useMultichain(); + + const handleConnect = async () => { + try { + const connected = await client.connect({ extensionId: EXTENSION_ID }); + if (connected) { + const session = await client.createSession({ + requiredScopes: { + "eip155:1": { + methods: [], + notifications: ["accountsChanged", "chainChanged"], + }, + "eip155:59144": { + methods: [], + notifications: ["accountsChanged", "chainChanged"], + }, + }, + }); + console.log("session", session); + setIsConnected(true); + if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { + const address = session.sessionScopes["eip155:1"].accounts[0].split(':')[2]; + setUserAddress(address); + } + } + } catch (error) { + console.error("Failed to connect:", error); + setIsConnected(false); + } + }; + + const handleDisconnect = () => { + client.disconnect(); + setIsConnected(false); + }; + + const signMessage = async () => { + try { + const result = await client.invokeMethod({ + scope: "eip155:1", + request: { + method: "personal_sign", + params: [ + "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", + userAddress, + ], + }, + }); + console.log("result", result); + toaster.create({ + title: "Message Signed", + description: "Your message was successfully signed", + type: "success", + duration: 4000, + }); + } catch (error) { + toaster.create({ + title: "Signing Failed", + description: error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const fetchBlockNumber = async () => { + try { + const result = await client.invokeMethod({ + scope: currentNetwork[0], + request: { + method: "eth_blockNumber", + params: [], + }, + }); + const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format + toaster.create({ + title: "Block Number Retrieved", + description: `Latest block number: ${blockNum}`, + type: "success", + duration: 4000, + }); + } catch (error) { + console.error("Failed to fetch block number:", error); + toaster.create({ + title: "Failed to Fetch Block Number", + description: error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const handleNetworkChange = (details: { value: string[] }) => { + setCurrentNetwork(details.value); + }; return ( <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

+ + + + + Logo + + {isConnected && ( + + handleNetworkChange({ value: [e.target.value] })} + bg="white" + color="black" + borderRadius="sm" + border="none" + fontWeight="medium" + > + {networks.items.map((network) => ( + + ))} + + + )} + + + + + + {isConnected ? ( + + + + Wallet Actions + + + Try out these wallet interactions using the MetaMask Multichain SDK + + + + + + + + + + Learn More + + + + Documentation + + + GitHub Repository + + + API Reference + + + + + ) : ( + + + 🔒 + + + Not connected + + + Connect your wallet to get started + + + )} + + - ) + ); } -export default App +export default App; diff --git a/examples/multichain/src/assets/react.svg b/examples/multichain/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/examples/multichain/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/multichain/src/components/layout/background.tsx b/examples/multichain/src/components/layout/background.tsx new file mode 100644 index 0000000..88babe4 --- /dev/null +++ b/examples/multichain/src/components/layout/background.tsx @@ -0,0 +1,32 @@ +import { Box } from "@chakra-ui/react"; + +export function BackgroundNoise() { + return ( + + ); +} diff --git a/examples/multichain/src/components/ui/avatar.tsx b/examples/multichain/src/components/ui/avatar.tsx new file mode 100644 index 0000000..cd84664 --- /dev/null +++ b/examples/multichain/src/components/ui/avatar.tsx @@ -0,0 +1,74 @@ +"use client" + +import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react" +import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react" +import * as React from "react" + +type ImageProps = React.ImgHTMLAttributes + +export interface AvatarProps extends ChakraAvatar.RootProps { + name?: string + src?: string + srcSet?: string + loading?: ImageProps["loading"] + icon?: React.ReactElement + fallback?: React.ReactNode +} + +export const Avatar = React.forwardRef( + function Avatar(props, ref) { + const { name, src, srcSet, loading, icon, fallback, children, ...rest } = + props + return ( + + + {fallback} + + + {children} + + ) + }, +) + +interface AvatarFallbackProps extends ChakraAvatar.FallbackProps { + name?: string + icon?: React.ReactElement +} + +const AvatarFallback = React.forwardRef( + function AvatarFallback(props, ref) { + const { name, icon, children, ...rest } = props + return ( + + {children} + {name != null && children == null && <>{getInitials(name)}} + {name == null && children == null && ( + {icon} + )} + + ) + }, +) + +function getInitials(name: string) { + const names = name.trim().split(" ") + const firstName = names[0] != null ? names[0] : "" + const lastName = names.length > 1 ? names[names.length - 1] : "" + return firstName && lastName + ? `${firstName.charAt(0)}${lastName.charAt(0)}` + : firstName.charAt(0) +} + +interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {} + +export const AvatarGroup = React.forwardRef( + function AvatarGroup(props, ref) { + const { size, variant, borderless, ...rest } = props + return ( + + + + ) + }, +) diff --git a/examples/multichain/src/components/ui/checkbox.tsx b/examples/multichain/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..2a27c2f --- /dev/null +++ b/examples/multichain/src/components/ui/checkbox.tsx @@ -0,0 +1,25 @@ +import { Checkbox as ChakraCheckbox } from "@chakra-ui/react" +import * as React from "react" + +export interface CheckboxProps extends ChakraCheckbox.RootProps { + icon?: React.ReactNode + inputProps?: React.InputHTMLAttributes + rootRef?: React.Ref +} + +export const Checkbox = React.forwardRef( + function Checkbox(props, ref) { + const { icon, children, inputProps, rootRef, ...rest } = props + return ( + + + + {icon || } + + {children != null && ( + {children} + )} + + ) + }, +) diff --git a/examples/multichain/src/components/ui/close-button.tsx b/examples/multichain/src/components/ui/close-button.tsx new file mode 100644 index 0000000..94af488 --- /dev/null +++ b/examples/multichain/src/components/ui/close-button.tsx @@ -0,0 +1,17 @@ +import type { ButtonProps } from "@chakra-ui/react" +import { IconButton as ChakraIconButton } from "@chakra-ui/react" +import * as React from "react" +import { LuX } from "react-icons/lu" + +export type CloseButtonProps = ButtonProps + +export const CloseButton = React.forwardRef< + HTMLButtonElement, + CloseButtonProps +>(function CloseButton(props, ref) { + return ( + + {props.children ?? } + + ) +}) diff --git a/examples/multichain/src/components/ui/color-mode.tsx b/examples/multichain/src/components/ui/color-mode.tsx new file mode 100644 index 0000000..f93feab --- /dev/null +++ b/examples/multichain/src/components/ui/color-mode.tsx @@ -0,0 +1,107 @@ +"use client" + +import type { IconButtonProps, SpanProps } from "@chakra-ui/react" +import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react" +import { ThemeProvider, useTheme } from "next-themes" +import type { ThemeProviderProps } from "next-themes" +import * as React from "react" +import { LuMoon, LuSun } from "react-icons/lu" + +export interface ColorModeProviderProps extends ThemeProviderProps {} + +export function ColorModeProvider(props: ColorModeProviderProps) { + return ( + + ) +} + +export type ColorMode = "light" | "dark" + +export interface UseColorModeReturn { + colorMode: ColorMode + setColorMode: (colorMode: ColorMode) => void + toggleColorMode: () => void +} + +export function useColorMode(): UseColorModeReturn { + const { resolvedTheme, setTheme } = useTheme() + const toggleColorMode = () => { + setTheme(resolvedTheme === "dark" ? "light" : "dark") + } + return { + colorMode: resolvedTheme as ColorMode, + setColorMode: setTheme, + toggleColorMode, + } +} + +export function useColorModeValue(light: T, dark: T) { + const { colorMode } = useColorMode() + return colorMode === "dark" ? dark : light +} + +export function ColorModeIcon() { + const { colorMode } = useColorMode() + return colorMode === "dark" ? : +} + +interface ColorModeButtonProps extends Omit {} + +export const ColorModeButton = React.forwardRef< + HTMLButtonElement, + ColorModeButtonProps +>(function ColorModeButton(props, ref) { + const { toggleColorMode } = useColorMode() + return ( + }> + + + + + ) +}) + +export const LightMode = React.forwardRef( + function LightMode(props, ref) { + return ( + + ) + }, +) + +export const DarkMode = React.forwardRef( + function DarkMode(props, ref) { + return ( + + ) + }, +) diff --git a/examples/multichain/src/components/ui/dialog.tsx b/examples/multichain/src/components/ui/dialog.tsx new file mode 100644 index 0000000..89d68a5 --- /dev/null +++ b/examples/multichain/src/components/ui/dialog.tsx @@ -0,0 +1,62 @@ +import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface DialogContentProps extends ChakraDialog.ContentProps { + portalled?: boolean + portalRef?: React.RefObject + backdrop?: boolean +} + +export const DialogContent = React.forwardRef< + HTMLDivElement, + DialogContentProps +>(function DialogContent(props, ref) { + const { + children, + portalled = true, + portalRef, + backdrop = true, + ...rest + } = props + + return ( + + {backdrop && } + + + {children} + + + + ) +}) + +export const DialogCloseTrigger = React.forwardRef< + HTMLButtonElement, + ChakraDialog.CloseTriggerProps +>(function DialogCloseTrigger(props, ref) { + return ( + + + {props.children} + + + ) +}) + +export const DialogRoot = ChakraDialog.Root +export const DialogFooter = ChakraDialog.Footer +export const DialogHeader = ChakraDialog.Header +export const DialogBody = ChakraDialog.Body +export const DialogBackdrop = ChakraDialog.Backdrop +export const DialogTitle = ChakraDialog.Title +export const DialogDescription = ChakraDialog.Description +export const DialogTrigger = ChakraDialog.Trigger +export const DialogActionTrigger = ChakraDialog.ActionTrigger diff --git a/examples/multichain/src/components/ui/drawer.tsx b/examples/multichain/src/components/ui/drawer.tsx new file mode 100644 index 0000000..ccb96c8 --- /dev/null +++ b/examples/multichain/src/components/ui/drawer.tsx @@ -0,0 +1,52 @@ +import { Drawer as ChakraDrawer, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface DrawerContentProps extends ChakraDrawer.ContentProps { + portalled?: boolean + portalRef?: React.RefObject + offset?: ChakraDrawer.ContentProps["padding"] +} + +export const DrawerContent = React.forwardRef< + HTMLDivElement, + DrawerContentProps +>(function DrawerContent(props, ref) { + const { children, portalled = true, portalRef, offset, ...rest } = props + return ( + + + + {children} + + + + ) +}) + +export const DrawerCloseTrigger = React.forwardRef< + HTMLButtonElement, + ChakraDrawer.CloseTriggerProps +>(function DrawerCloseTrigger(props, ref) { + return ( + + + + ) +}) + +export const DrawerTrigger = ChakraDrawer.Trigger +export const DrawerRoot = ChakraDrawer.Root +export const DrawerFooter = ChakraDrawer.Footer +export const DrawerHeader = ChakraDrawer.Header +export const DrawerBody = ChakraDrawer.Body +export const DrawerBackdrop = ChakraDrawer.Backdrop +export const DrawerDescription = ChakraDrawer.Description +export const DrawerTitle = ChakraDrawer.Title +export const DrawerActionTrigger = ChakraDrawer.ActionTrigger diff --git a/examples/multichain/src/components/ui/field.tsx b/examples/multichain/src/components/ui/field.tsx new file mode 100644 index 0000000..dd3b66f --- /dev/null +++ b/examples/multichain/src/components/ui/field.tsx @@ -0,0 +1,33 @@ +import { Field as ChakraField } from "@chakra-ui/react" +import * as React from "react" + +export interface FieldProps extends Omit { + label?: React.ReactNode + helperText?: React.ReactNode + errorText?: React.ReactNode + optionalText?: React.ReactNode +} + +export const Field = React.forwardRef( + function Field(props, ref) { + const { label, children, helperText, errorText, optionalText, ...rest } = + props + return ( + + {label && ( + + {label} + + + )} + {children} + {helperText && ( + {helperText} + )} + {errorText && ( + {errorText} + )} + + ) + }, +) diff --git a/examples/multichain/src/components/ui/input-group.tsx b/examples/multichain/src/components/ui/input-group.tsx new file mode 100644 index 0000000..5d8fb32 --- /dev/null +++ b/examples/multichain/src/components/ui/input-group.tsx @@ -0,0 +1,53 @@ +import type { BoxProps, InputElementProps } from "@chakra-ui/react" +import { Group, InputElement } from "@chakra-ui/react" +import * as React from "react" + +export interface InputGroupProps extends BoxProps { + startElementProps?: InputElementProps + endElementProps?: InputElementProps + startElement?: React.ReactNode + endElement?: React.ReactNode + children: React.ReactElement + startOffset?: InputElementProps["paddingStart"] + endOffset?: InputElementProps["paddingEnd"] +} + +export const InputGroup = React.forwardRef( + function InputGroup(props, ref) { + const { + startElement, + startElementProps, + endElement, + endElementProps, + children, + startOffset = "6px", + endOffset = "6px", + ...rest + } = props + + const child = + React.Children.only>(children) + + return ( + + {startElement && ( + + {startElement} + + )} + {React.cloneElement(child, { + ...(startElement && { + ps: `calc(var(--input-height) - ${startOffset})`, + }), + ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), + ...children.props, + })} + {endElement && ( + + {endElement} + + )} + + ) + }, +) diff --git a/examples/multichain/src/components/ui/native-select.tsx b/examples/multichain/src/components/ui/native-select.tsx new file mode 100644 index 0000000..9e6ebf5 --- /dev/null +++ b/examples/multichain/src/components/ui/native-select.tsx @@ -0,0 +1,57 @@ +"use client" + +import { NativeSelect as Select } from "@chakra-ui/react" +import * as React from "react" + +interface NativeSelectRootProps extends Select.RootProps { + icon?: React.ReactNode +} + +export const NativeSelectRoot = React.forwardRef< + HTMLDivElement, + NativeSelectRootProps +>(function NativeSelect(props, ref) { + const { icon, children, ...rest } = props + return ( + + {children} + {icon} + + ) +}) + +interface NativeSelectItem { + value: string + label: string + disabled?: boolean +} + +interface NativeSelectField extends Select.FieldProps { + items?: Array +} + +export const NativeSelectField = React.forwardRef< + HTMLSelectElement, + NativeSelectField +>(function NativeSelectField(props, ref) { + const { items: itemsProp, children, ...rest } = props + + const items = React.useMemo( + () => + itemsProp?.map((item) => + typeof item === "string" ? { label: item, value: item } : item, + ), + [itemsProp], + ) + + return ( + + {children} + {items?.map((item) => ( + + ))} + + ) +}) diff --git a/examples/multichain/src/components/ui/popover.tsx b/examples/multichain/src/components/ui/popover.tsx new file mode 100644 index 0000000..3320659 --- /dev/null +++ b/examples/multichain/src/components/ui/popover.tsx @@ -0,0 +1,59 @@ +import { Popover as ChakraPopover, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface PopoverContentProps extends ChakraPopover.ContentProps { + portalled?: boolean + portalRef?: React.RefObject +} + +export const PopoverContent = React.forwardRef< + HTMLDivElement, + PopoverContentProps +>(function PopoverContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) +}) + +export const PopoverArrow = React.forwardRef< + HTMLDivElement, + ChakraPopover.ArrowProps +>(function PopoverArrow(props, ref) { + return ( + + + + ) +}) + +export const PopoverCloseTrigger = React.forwardRef< + HTMLButtonElement, + ChakraPopover.CloseTriggerProps +>(function PopoverCloseTrigger(props, ref) { + return ( + + + + ) +}) + +export const PopoverTitle = ChakraPopover.Title +export const PopoverDescription = ChakraPopover.Description +export const PopoverFooter = ChakraPopover.Footer +export const PopoverHeader = ChakraPopover.Header +export const PopoverRoot = ChakraPopover.Root +export const PopoverBody = ChakraPopover.Body +export const PopoverTrigger = ChakraPopover.Trigger diff --git a/examples/multichain/src/components/ui/provider.tsx b/examples/multichain/src/components/ui/provider.tsx new file mode 100644 index 0000000..fd0331b --- /dev/null +++ b/examples/multichain/src/components/ui/provider.tsx @@ -0,0 +1,15 @@ +"use client" + +import { ChakraProvider, defaultSystem } from "@chakra-ui/react" +import { + ColorModeProvider, + type ColorModeProviderProps, +} from "./color-mode" + +export function Provider(props: ColorModeProviderProps) { + return ( + + + + ) +} diff --git a/examples/multichain/src/components/ui/radio.tsx b/examples/multichain/src/components/ui/radio.tsx new file mode 100644 index 0000000..b3919d0 --- /dev/null +++ b/examples/multichain/src/components/ui/radio.tsx @@ -0,0 +1,24 @@ +import { RadioGroup as ChakraRadioGroup } from "@chakra-ui/react" +import * as React from "react" + +export interface RadioProps extends ChakraRadioGroup.ItemProps { + rootRef?: React.Ref + inputProps?: React.InputHTMLAttributes +} + +export const Radio = React.forwardRef( + function Radio(props, ref) { + const { children, inputProps, rootRef, ...rest } = props + return ( + + + + {children && ( + {children} + )} + + ) + }, +) + +export const RadioGroup = ChakraRadioGroup.Root diff --git a/examples/multichain/src/components/ui/select.tsx b/examples/multichain/src/components/ui/select.tsx new file mode 100644 index 0000000..99d84e6 --- /dev/null +++ b/examples/multichain/src/components/ui/select.tsx @@ -0,0 +1,143 @@ +"use client" + +import type { CollectionItem } from "@chakra-ui/react" +import { Select as ChakraSelect, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface SelectTriggerProps extends ChakraSelect.ControlProps { + clearable?: boolean +} + +export const SelectTrigger = React.forwardRef< + HTMLButtonElement, + SelectTriggerProps +>(function SelectTrigger(props, ref) { + const { children, clearable, ...rest } = props + return ( + + {children} + + {clearable && } + + + + ) +}) + +const SelectClearTrigger = React.forwardRef< + HTMLButtonElement, + ChakraSelect.ClearTriggerProps +>(function SelectClearTrigger(props, ref) { + return ( + + + + ) +}) + +interface SelectContentProps extends ChakraSelect.ContentProps { + portalled?: boolean + portalRef?: React.RefObject +} + +export const SelectContent = React.forwardRef< + HTMLDivElement, + SelectContentProps +>(function SelectContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) +}) + +export const SelectItem = React.forwardRef< + HTMLDivElement, + ChakraSelect.ItemProps +>(function SelectItem(props, ref) { + const { item, children, ...rest } = props + return ( + + {children} + + + ) +}) + +interface SelectValueTextProps + extends Omit { + children?(items: CollectionItem[]): React.ReactNode +} + +export const SelectValueText = React.forwardRef< + HTMLSpanElement, + SelectValueTextProps +>(function SelectValueText(props, ref) { + const { children, ...rest } = props + return ( + + + {(select) => { + const items = select.selectedItems + if (items.length === 0) return props.placeholder + if (children) return children(items) + if (items.length === 1) + return select.collection.stringifyItem(items[0]) + return `${items.length} selected` + }} + + + ) +}) + +export const SelectRoot = React.forwardRef< + HTMLDivElement, + ChakraSelect.RootProps +>(function SelectRoot(props, ref) { + return ( + + {props.asChild ? ( + props.children + ) : ( + <> + + {props.children} + + )} + + ) +}) as ChakraSelect.RootComponent + +interface SelectItemGroupProps extends ChakraSelect.ItemGroupProps { + label: React.ReactNode +} + +export const SelectItemGroup = React.forwardRef< + HTMLDivElement, + SelectItemGroupProps +>(function SelectItemGroup(props, ref) { + const { children, label, ...rest } = props + return ( + + {label} + {children} + + ) +}) + +export const SelectLabel = ChakraSelect.Label +export const SelectItemText = ChakraSelect.ItemText diff --git a/examples/multichain/src/components/ui/slider.tsx b/examples/multichain/src/components/ui/slider.tsx new file mode 100644 index 0000000..55a7283 --- /dev/null +++ b/examples/multichain/src/components/ui/slider.tsx @@ -0,0 +1,82 @@ +import { Slider as ChakraSlider, For, HStack } from "@chakra-ui/react" +import * as React from "react" + +export interface SliderProps extends ChakraSlider.RootProps { + marks?: Array + label?: React.ReactNode + showValue?: boolean +} + +export const Slider = React.forwardRef( + function Slider(props, ref) { + const { marks: marksProp, label, showValue, ...rest } = props + const value = props.defaultValue ?? props.value + + const marks = marksProp?.map((mark) => { + if (typeof mark === "number") return { value: mark, label: undefined } + return mark + }) + + const hasMarkLabel = !!marks?.some((mark) => mark.label) + + return ( + + {label && !showValue && ( + {label} + )} + {label && showValue && ( + + {label} + + + )} + + + + + + + + + ) + }, +) + +function SliderThumbs(props: { value?: number[] }) { + const { value } = props + return ( + + {(_, index) => ( + + + + )} + + ) +} + +interface SliderMarksProps { + marks?: Array +} + +const SliderMarks = React.forwardRef( + function SliderMarks(props, ref) { + const { marks } = props + if (!marks?.length) return null + + return ( + + {marks.map((mark, index) => { + const value = typeof mark === "number" ? mark : mark.value + const label = typeof mark === "number" ? undefined : mark.label + return ( + + + {label} + + ) + })} + + ) + }, +) diff --git a/examples/multichain/src/components/ui/toaster.tsx b/examples/multichain/src/components/ui/toaster.tsx new file mode 100644 index 0000000..df6c2c3 --- /dev/null +++ b/examples/multichain/src/components/ui/toaster.tsx @@ -0,0 +1,43 @@ +"use client" + +import { + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, +} from "@chakra-ui/react" + +export const toaster = createToaster({ + placement: "bottom-end", + pauseOnPageIdle: true, +}) + +export const Toaster = () => { + return ( + + + {(toast) => ( + + {toast.type === "loading" ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.meta?.closable && } + + )} + + + ) +} diff --git a/examples/multichain/src/components/ui/tooltip.tsx b/examples/multichain/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..43a8a6c --- /dev/null +++ b/examples/multichain/src/components/ui/tooltip.tsx @@ -0,0 +1,46 @@ +import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react" +import * as React from "react" + +export interface TooltipProps extends ChakraTooltip.RootProps { + showArrow?: boolean + portalled?: boolean + portalRef?: React.RefObject + content: React.ReactNode + contentProps?: ChakraTooltip.ContentProps + disabled?: boolean +} + +export const Tooltip = React.forwardRef( + function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props + + if (disabled) return children + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ) + }, +) diff --git a/examples/multichain/src/index.css b/examples/multichain/src/index.css deleted file mode 100644 index 6119ad9..0000000 --- a/examples/multichain/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/examples/multichain/src/main.tsx b/examples/multichain/src/main.tsx index bef5202..e34ff47 100644 --- a/examples/multichain/src/main.tsx +++ b/examples/multichain/src/main.tsx @@ -1,10 +1,18 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import './index.css' +// import './index.css' import App from './App.tsx' +import { Provider as ChakraProvider } from "./components/ui/provider" +import { MultichainProvider } from './multichain/provider.tsx' +import { Toaster } from "./components/ui/toaster" createRoot(document.getElementById('root')!).render( - + + + + + + , ) diff --git a/examples/multichain/src/multichain/hooks.ts b/examples/multichain/src/multichain/hooks.ts new file mode 100644 index 0000000..285db5e --- /dev/null +++ b/examples/multichain/src/multichain/hooks.ts @@ -0,0 +1,10 @@ +import { useContext } from "react"; +import { MultichainContext } from "./provider"; + +export const useMultichain = () => { + const client = useContext(MultichainContext); + if (!client) { + throw new Error("Multichain client not found"); + } + return client; +}; diff --git a/examples/multichain/src/multichain/provider.tsx b/examples/multichain/src/multichain/provider.tsx new file mode 100644 index 0000000..69385a2 --- /dev/null +++ b/examples/multichain/src/multichain/provider.tsx @@ -0,0 +1,20 @@ +import { createContext, type ReactNode, type FC, useRef } from 'react'; +import { MetamaskMultichain } from '@metamask/sdk-multichain'; + + +export const MultichainContext = createContext(null); + +type Props = { + children: ReactNode; +} + +export const MultichainProvider: FC = ({ children }) => { + const client = useRef(new MetamaskMultichain()); + + return ( + + {children} + + ); +}; + diff --git a/examples/multichain/vite.config.ts b/examples/multichain/vite.config.ts index 8b0f57b..6a93c6e 100644 --- a/examples/multichain/vite.config.ts +++ b/examples/multichain/vite.config.ts @@ -1,7 +1,15 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], -}) + plugins: [react()], + resolve: { + alias: [ + { + find: "@metamask/sdk-multichain", + replacement: "/local_modules/@metamask/sdk-multichain", + }, + ], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25cd82a..07d8990 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,12 +20,33 @@ importers: examples/multichain: dependencies: + '@chakra-ui/react': + specifier: ^3.8.0 + version: 3.8.0(@emotion/react@11.14.0(@types/react@19.0.8)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.0.8)(react@19.0.0) + '@metamask/providers': + specifier: ^20.0.0 + version: 20.0.0(webextension-polyfill@0.10.0) + lucide-react: + specifier: ^0.468.0 + version: 0.468.0(react@19.0.0) + next-themes: + specifier: ^0.4.4 + version: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 react-dom: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) + react-icons: + specifier: ^5.4.0 + version: 5.4.0(react@19.0.0) + tslib: + specifier: ^2.8.1 + version: 2.8.1 devDependencies: '@eslint/js': specifier: ^9.19.0 @@ -219,6 +240,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@ark-ui/react@4.9.1': + resolution: {integrity: sha512-grnfoSUrGxN0VMgtf4yvpMgin2T4ERINqYm3x/XKny+q2iIO76PD7yjNP7IW+CDmNxy3QPOidcvRiCyy6x0LGA==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -306,6 +333,13 @@ packages: resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} engines: {node: '>=6.9.0'} + '@chakra-ui/react@3.8.0': + resolution: {integrity: sha512-UOkDxxMYHqQ6z/ExMcLYnjIIj2Ulu6syAkrpSueYmzLlG93cljkMCze5y9GXh/M6fyQEbLBuDVesULTqMmHuiA==} + peerDependencies: + '@emotion/react': '>=11' + react: '>=18' + react-dom: '>=18' + '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -325,6 +359,50 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -681,6 +759,12 @@ packages: cpu: [x64] os: [win32] + '@internationalized/date@3.7.0': + resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} + + '@internationalized/number@3.6.0': + resolution: {integrity: sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -716,6 +800,10 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} + '@metamask/json-rpc-engine@10.0.3': + resolution: {integrity: sha512-p01QhlLIiTFXivEJCRx0LXEvPUaUPCedI9A8qV9jcLGGNSj1UTWM9GeifoeTweOMdmpIk5Rxg10H9f0JPUC9Ig==} + engines: {node: ^18.18 || >=20} + '@metamask/json-rpc-engine@7.3.3': resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -728,6 +816,10 @@ packages: resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} engines: {node: '>=16.0.0'} + '@metamask/json-rpc-middleware-stream@8.0.6': + resolution: {integrity: sha512-wE2CfuNZHnWbSjLEPCCb4MSyWgbQBUI5cslGZb+uRdXNzYOM/RDfq8FAdl6HhjmldHKdBFCW0L3kDr8frgahqA==} + engines: {node: ^18.18 || >=20} + '@metamask/object-multiplex@2.1.0': resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} engines: {node: ^16.20 || ^18.16 || >=20} @@ -739,10 +831,20 @@ packages: resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} engines: {node: ^18.18 || >=20} + '@metamask/providers@20.0.0': + resolution: {integrity: sha512-DbTTBAJYGbEQUXOhF/vsmV2Ge8h5RRBKtc+YgeWge5Xa9p1VunaZxTcmQe7XpU0Vs5yHWkbLeZxyxz/571Cn8g==} + engines: {node: ^18.18 || >=20} + peerDependencies: + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + '@metamask/rpc-errors@6.4.0': resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} engines: {node: '>=16.0.0'} + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + '@metamask/safe-event-emitter@2.0.0': resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} @@ -769,6 +871,10 @@ packages: resolution: {integrity: sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==} engines: {node: '>=16.0.0'} + '@metamask/utils@11.1.0': + resolution: {integrity: sha512-lhR3sEZisT6hVBrnS3Ftgg9FRUFca0/5fcxDA+5paqLo4YYE6euV7622l0Qi3yMwy4mlgrrDTBiPSTXtCUKrdg==} + engines: {node: ^18.18 || ^20.14 || >=22} + '@metamask/utils@5.0.2': resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} engines: {node: '>=14.0.0'} @@ -902,6 +1008,9 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@pandacss/is-valid-prop@0.41.0': + resolution: {integrity: sha512-BE6h6CsJk14ugIRrsazJtN3fcg+KDFRat1Bs93YFKH6jd4DOb1yUyVvC70jKqPVvg70zEcV8acZ7VdcU5TLu+w==} + '@parcel/watcher-android-arm64@2.5.0': resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} engines: {node: '>= 10.0.0'} @@ -1530,6 +1639,9 @@ packages: '@types/node@20.17.6': resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -1782,6 +1894,207 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + '@zag-js/accordion@0.82.1': + resolution: {integrity: sha512-DWaElpm6RhntW8zVPMfd+s461FuXi6rv4pDPpXb4xCAJ0KTkBzS6PFxoBLL+11Mjv9XioaBoJatIGOCF8GAtTA==} + + '@zag-js/anatomy@0.82.1': + resolution: {integrity: sha512-wpgU7LyU9St3o/ft8Nkundi7MkW37vN1hYc2E7VA/R6mun0qiANsEf83ymIlAYnovLC6WUlBso9xwqejr6wRCg==} + + '@zag-js/aria-hidden@0.82.1': + resolution: {integrity: sha512-KSz9oMY9rn1N3k3tFTKHlU66eQf8XZ/gy/ex27J0ykZoaYJplWQerSZvVakbILeh+rtpvdiTNaSgrCAwYwvAPA==} + + '@zag-js/auto-resize@0.82.1': + resolution: {integrity: sha512-adOB7Y4p4i6b8GJv4V6qhlK1YRj4Ejs5I+eWFd8Rx535uQIcxEEVtpEAD5SRYg5PNk1ikaT+GCoHnTadGj6PuA==} + + '@zag-js/avatar@0.82.1': + resolution: {integrity: sha512-XjRvDRmBxwy5OtIzlQOpf7zNk4g0b/uA7qZve5Hz0R7yWOu+NFlbFv0GsvRfgyYMCT5J0xBu271EG9FJq3QKyw==} + + '@zag-js/carousel@0.82.1': + resolution: {integrity: sha512-MO9+9oedxdKynxgvLLzXs+VQSOhu+GvsCLV4fBt7nMBMGIRHtRSzXHRNRkO0aqbsO/nKQ8TFH7GYzI1NqT/y4A==} + + '@zag-js/checkbox@0.82.1': + resolution: {integrity: sha512-yD/h8ao/JTljEo+zthpKzTy/f9fqOlJ7Nd6psPoSKZy2MRGD0TDUbOjravb3icVgjTLCiaPVWMWdonny08Me6A==} + + '@zag-js/clipboard@0.82.1': + resolution: {integrity: sha512-r1r3vwozs+lyNgccR3OfmYAydP0cJbIHGsgDKGuempinqv6xIoptHOkFgWNd6Kxz/3MnxP+BMEy6fZzECXkhdQ==} + + '@zag-js/collapsible@0.82.1': + resolution: {integrity: sha512-TuggUoXRVBOwACksi63TsN2rOukzUpe6oVMUvp9MaQaDbg9gpw0JzLTrdAaHfE+bhgXAb3EjN6wcZjq8zBctZQ==} + + '@zag-js/collection@0.82.1': + resolution: {integrity: sha512-uteM+xWZlWhRQe5biA5QWyva9PdzXONs+bpycUtZt8MakQgPmhW2whY9r1aW5NFVb/ScTwGAIGB3Eyc6Npz7Wg==} + + '@zag-js/color-picker@0.82.1': + resolution: {integrity: sha512-/MShDVBFNnXResLzeyWyKApeHuB9rmUeJo3WD/Bl6rTwjmvVCKRYguIe1SQviOokMLjuAyh0YWXdKMQw0HvMqQ==} + + '@zag-js/color-utils@0.82.1': + resolution: {integrity: sha512-BMSYcBeypGX0wCLszU2jxWBRUmd5/wPDJ59Y3Zwl9yNld0gtMnuBLSUeokMcG0UVQ/BxkyrWu3VDkKTUYKprqQ==} + + '@zag-js/combobox@0.82.1': + resolution: {integrity: sha512-Me3a0Sw4dTtmBRmbLGO/C1LJ4btZwbd5RLYnf8RPhEnqGJ5Z05i+ffWEe+SNBvpQO14njqBcF6P8VypVD/Ro1A==} + + '@zag-js/core@0.82.1': + resolution: {integrity: sha512-Ux0fkt1PumcqLwExcEozCMEfKBxtd2JlnitXo4hR3lJW5q9G52FkgWDyPSrhblyTkX+7RgxViZTMnHxaXs99jg==} + + '@zag-js/date-picker@0.82.1': + resolution: {integrity: sha512-f+4CV29+hcQ3Yw9hh0yyVRANONIUEWIrPS1fpnrrUNtIC0Y7f1Ajx+x089X9VxgQhwreK1sEwpnrL2vIqy+9+A==} + peerDependencies: + '@internationalized/date': '>=3.0.0' + + '@zag-js/date-utils@0.82.1': + resolution: {integrity: sha512-z9sHtgV4fvtXsqLaTD4/o+D+H5wumLYhIw/Bj3yC41gR5oa4Wo9QifRT9DBfvuokmXsrnRZ8k32hUtWoYb6M/A==} + peerDependencies: + '@internationalized/date': '>=3.0.0' + + '@zag-js/dialog@0.82.1': + resolution: {integrity: sha512-oqi+6Y/rx6ZKxg3s9r6bIuo33x+5+UDhvrlk31kE3LWgU1KJjVV0VEkFMK9B1SJTY7IizhlWMyDx+JXJ+jOy5Q==} + + '@zag-js/dismissable@0.82.1': + resolution: {integrity: sha512-vs+zkORzaeNzX4Wsy4OkW1AVce7l4Tc6DHZq8gqNB5SvhK+5wEPl6EmacQRvZyoCxi2m6xpaI98UkLCmVJKU+Q==} + + '@zag-js/dom-query@0.82.1': + resolution: {integrity: sha512-KFtbqDUykQur587hyrGi8LL8GfTS2mqBpIT0kL3E+S63Mq7U84i+hGf3VyNuInMB5ONpkNEk5JN4G9/HWQ6pAQ==} + + '@zag-js/editable@0.82.1': + resolution: {integrity: sha512-V5i3kYSHFJYj8914nBf4VKKtm6m59gG482vm20As4EnLcwGFrOBbm4HXUgsKq0wYSLy/lTtvMrUT8Iqudye2gw==} + + '@zag-js/element-rect@0.82.1': + resolution: {integrity: sha512-xXUjmeIUdxkxic5bepp6fVqN9Qs+54PXCAUl6g/DtJecQVmVooIfa3SLSULhany4aR4mlGojp5TJxvSpUBA58Q==} + + '@zag-js/element-size@0.82.1': + resolution: {integrity: sha512-k1rOE6NhoULI9d5pt2qVUxWCQVEf3OTPH8UDnbsdf11xn+hMCzRYd9lekUdVGrcHHGvEK+W6iAfWZnlwsJsmow==} + + '@zag-js/file-upload@0.82.1': + resolution: {integrity: sha512-6cgJsy9bf2DB0v+CVq1L4g4aCePTpfWsV4C0HC+82K+OSPomiIPsQS87wo4+eAcy3z+80Qh+uglZCFAwkW8W+g==} + + '@zag-js/file-utils@0.82.1': + resolution: {integrity: sha512-/u86hMd+E5UCrrY9akDAExkO7sgPA1lXzWC9gSX4LSxHATk7Vo4o5+4LiE1MX4WZRytOhtxAycJzNDVpqzmppQ==} + + '@zag-js/focus-trap@0.82.1': + resolution: {integrity: sha512-z5OzmR8O3n2043Lwhp1qcizNHXvzc/Xteb3hWmxbX9hR3k0wHJeMXMj3GTDO0FBixRt+d8iHEmt3/8CkI72mqw==} + + '@zag-js/focus-visible@0.82.1': + resolution: {integrity: sha512-b87FqZO6e9RmTY4msEzwZ3hZ8pRuPd2vbR2b6SlXr6ohtmGKlGgBGO4kmarZN/ClE+7VOnOEqIicatRBEgX9bw==} + + '@zag-js/highlight-word@0.82.1': + resolution: {integrity: sha512-lS5r3V0l7Z53QyNwkxulYp5QYA9mFkU+3XsZqfM6cBjh+wmGE1xeIwknAmFtYvuYNK37AwT7pp5z0Rm1Ep6WVQ==} + + '@zag-js/hover-card@0.82.1': + resolution: {integrity: sha512-fp9t/PNXODwxXR1X+VzgYeSpgoJ+M3W/qvuA2stgPI4kEinwKEssSlP2sH6gTmQVZKL8SV1jiNQinVh00NE85g==} + + '@zag-js/i18n-utils@0.82.1': + resolution: {integrity: sha512-YcTIqka6+/YoH2VRBMnv3CvTjHdUo/NG2nMenAB9Wq0MLTn+TAtcsujenz7ckJcgayVhFAchWNhwK9+/cs1dAw==} + + '@zag-js/interact-outside@0.82.1': + resolution: {integrity: sha512-WcWJB5kM41fDM6YMGC3ZEPVn1q3Nrm+cAFkllRJrRY4+bUKXmtN8bqDaRKghP+dG5CXz66SiM6xBvDE4nqtK5Q==} + + '@zag-js/live-region@0.82.1': + resolution: {integrity: sha512-BmSXc41y1uOra/UV1lt8BurWkuwne/+c371IJCK6l+MWsO0ufq1lrjfx4cyFf5yhVcPRkhv/b/0i+7RxfDSK1A==} + + '@zag-js/menu@0.82.1': + resolution: {integrity: sha512-faAlQZYeWHcGH8nIxBYh7HHfVjSKsHV8yUsbhMD0XkePWM6eB+dPRd/Fc3DeT8ieM8+sUODnTHEuxar0i48v4w==} + + '@zag-js/number-input@0.82.1': + resolution: {integrity: sha512-QIQlxlxM78+TkEhPEGlTbkBR3G2ngm5vhc3BFw4sG6ABMyre8TiIH37EqQB7EGKyAcuz6QwPk3AervHMFKe4YQ==} + + '@zag-js/pagination@0.82.1': + resolution: {integrity: sha512-1Rsd3cSnlewefNB1RBI0ymK5wlgiBcK42H1IrJIhly6+SXDAhp0Oc45ofsCzpfhkQ4be+A9Cb30ayc6J4ZU2kA==} + + '@zag-js/pin-input@0.82.1': + resolution: {integrity: sha512-P7UN7rIt03YHt05SuK+kZ9mhl4AfvCvaSGB/9KzEq5r6p1D3lc4+0LVkkOvL2EEB8vbGY/y5BNcvaF2jPQPH5Q==} + + '@zag-js/popover@0.82.1': + resolution: {integrity: sha512-zZ8H/jcjaXcLRX4dBcmandexeKV/5cBOt4AUVEnd3/X5NFFkA2Njz8rpQFcNRZl814NxG4RCchIu8kmonmUKCA==} + + '@zag-js/popper@0.82.1': + resolution: {integrity: sha512-vQTmVUs6aLGqKmWb+FnLDntsulvd/sCvgndeTmwOHRW8PBwPb86aDnvNrNosBSS+Kk9p6CMJwWZ6CuPWR5Kf7Q==} + + '@zag-js/presence@0.82.1': + resolution: {integrity: sha512-eZeAkq2s7NYCiNVMvkWL2Or458hZj71u7ygCt6skA18sO1ZksY+qIFqj99leCov+fesz06Hf8bxZz5029t/Wjg==} + + '@zag-js/progress@0.82.1': + resolution: {integrity: sha512-Fy1EjUda7o7e/yTKbZgKKayGOsHxkjLG+x0AakHmbR/k2VKbM4QuFHB9RJLlqNd9a+m/BzS1kEKWzCJ7/mXL9Q==} + + '@zag-js/qr-code@0.82.1': + resolution: {integrity: sha512-E1N1o1dPVuhWkcrg6urut2aaCqrc16OeE9VJh1mAGIUknF3p0QScH+ql7J/n9r8WOa21xyF6HLKhnWVPRQmHGg==} + + '@zag-js/radio-group@0.82.1': + resolution: {integrity: sha512-YTqP4Ok2YEmEXCEiNW2tufZ6svt4sh7KHqrHZq81vPAJMKKhVosP6LnZvmt4dVn6tKJ0OU8idwFVtPM5jSAWoA==} + + '@zag-js/rating-group@0.82.1': + resolution: {integrity: sha512-ULl0OA207b6Ilsr2QWt4dbx58hA/NnyCmHpvv1pAYSlH3K0Es5b25B80Cc5jM/3NK3yqoY81OkS9U8lxmpWo+A==} + + '@zag-js/react@0.82.1': + resolution: {integrity: sha512-CZivUTFQ4TdRKTN+9wpWAo0lEZlMnbjJPVn2VJVpcz+eRNUeoVzevkNY/OzAqdV3mp+VtdNabQn1fAz8ngViPQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@zag-js/rect-utils@0.82.1': + resolution: {integrity: sha512-gXmvj1wK9FeToOCzvoZ5gycqUNRzfeqd84uwJeG9zA8SVdoyEnoAji8IAynneq8t3LbiNUcu37wjTw0dcWM6ig==} + + '@zag-js/remove-scroll@0.82.1': + resolution: {integrity: sha512-68cvXvqgNOlucbnGKRyephk8Qg8wb4xpjgUdmF9xQwICdY/uhW2p4ZGJ4471TDCDIlpoBrJPYsWqV2oWH3QNfA==} + + '@zag-js/scroll-snap@0.82.1': + resolution: {integrity: sha512-HL3MkBpWx4Cw0+h1UP/PnvLP3Z1T+F5mkeS8HWmiP+KPzhtFiEBRrve+xk7h7BMXifteg2UZy53ZiZfJeGsd3w==} + + '@zag-js/select@0.82.1': + resolution: {integrity: sha512-cc6D8Iz+Ewnx9L0J63QGqC2bbiwzCEcJVE/j4OZDcy4Qk3lqr3qA09uuJbQxAi7yvIeB44DIEt9ryTZPkZbgiw==} + + '@zag-js/signature-pad@0.82.1': + resolution: {integrity: sha512-s8ae88OpAafkpuqimO9beUiVTn3FG+bnWeWnYQOLtNYMCNHzQbVZp9QBNbOoUpNcDT14mx9rfZe98BqfiMohFw==} + + '@zag-js/slider@0.82.1': + resolution: {integrity: sha512-qXVvXbDRq6Cla036M9OH6plO7ubefM7k65NJQKjtITDua+VliKQLXj9BrdPLT9K96wWntW+D/TiZXE+JNbR4ow==} + + '@zag-js/splitter@0.82.1': + resolution: {integrity: sha512-eMNncj+pcepYTf+51s4ysDS/tjtKXswpwsSQR0AeNqCE3SW3TGzHOM0+uheyjgv9EmDGDrr3Imdo0PCkq3bqug==} + + '@zag-js/steps@0.82.1': + resolution: {integrity: sha512-N/LVOPbpQGtqpnNsdgZsQytpvXVoJ9Uldo8G38Q7892wwhVx63L0qLaiOK+SkU7kUTueOh109HezZ67nq3sadw==} + + '@zag-js/store@0.82.1': + resolution: {integrity: sha512-uWlVivLZBCuAEXrXOITM1srwfBtAnT8kBYVPElrT5aSO9gkV1YC/g+YdFRol7KKOg12qO561CPKReVfilmtAKg==} + + '@zag-js/switch@0.82.1': + resolution: {integrity: sha512-lIZsOs5nG9TkPs75+OK5THprEO0u3NAiLnEJ489KEFautVX/GMwAWvGHNFS7CcCpLZv+EpVKAPAdmGfEphrzhA==} + + '@zag-js/tabs@0.82.1': + resolution: {integrity: sha512-1uwNRvy8LyUTCAWjL1kD7BexOZ0sHrZ4OnUwDNuaWbqxUjtzoe+ftvcLXvmwFMmrns7o1SVnjqkgSVKuE4mcDA==} + + '@zag-js/tags-input@0.82.1': + resolution: {integrity: sha512-1mY8nCNMQgMwWBV5zX0bUcIgstqKjvFOAuYhGLIxbQPbgX7lP8Kr3nuhABh0oC0KnWaKfOMlItir2k795G4KMQ==} + + '@zag-js/time-picker@0.82.1': + resolution: {integrity: sha512-nWKx3yyHFBUBPOTDFhi3du4wWlQe8wY0EoeWLQN6bpJSF4qo/BosTZJkUHm//FgUdwdhQBFOAsrlrJ0vL4qvNA==} + peerDependencies: + '@internationalized/date': '>=3.0.0' + + '@zag-js/timer@0.82.1': + resolution: {integrity: sha512-uG4xCrYHgDZJgvW+71ROQX0xIkqMup37ZpNSLS2f5eD5DO1n/9NYLztA1YyeCJyv1aEDsZreeJLJvNDElgXA2A==} + + '@zag-js/toast@0.82.1': + resolution: {integrity: sha512-4dL99zHXQg8j7ReJAR9zLAp5lNKMS4Nm+THnJaKsA0TF5QkELGnsZz47oKhFY0aQn46paxMLVagLqQ0+2i6D1w==} + + '@zag-js/toggle-group@0.82.1': + resolution: {integrity: sha512-8YaYKFz3ciiQhlTFScrvqH3Ke6UMDQLSgMEsCcERBYatd6TxkJwlFiBzpksIDsZpmloBrylyItJvqmzj9jt6Ig==} + + '@zag-js/tooltip@0.82.1': + resolution: {integrity: sha512-ewF/1h2INDJlzYnoIigcWFWim56ezhfl7YGKgqLBdxBoRvZHyhRIfR8bbddVZk4k144gXsMVMeXwS6VEt6D0eQ==} + + '@zag-js/tour@0.82.1': + resolution: {integrity: sha512-Oo4ZA3vG2sYEotfrWVXfIV1KW0Z+s91U+2YPtM2sOLnhetEVXxj/AwAruZfvS6WOcTI7D9UBrrQolY94fdZeOA==} + + '@zag-js/tree-view@0.82.1': + resolution: {integrity: sha512-xvYwaL49ffC8nnb+ENgNtkSZE1jMh8tm1E777AqBqnrhJZ28+FA9Sk8YDuWIWhNOV/r4n97jTXqj4SAGCrlAMQ==} + + '@zag-js/types@0.82.1': + resolution: {integrity: sha512-Nr/CU/z/SZWDL92P2u9VDZL9JUxY8L1P7dGI0CmDKHlEHk1+vzqg3UnVkUKkZ5eVMNLtloHbrux5X9Gmkl39WQ==} + + '@zag-js/utils@0.82.1': + resolution: {integrity: sha512-JUGdEjstrzB0G2AJqzQiURIl6UZ1ONYgby/pqBKX57LO5LxasQXk9oNZh8+ZAvePNC/lKqqTtyyI02YQB4XwkA==} + abitype@1.0.7: resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} peerDependencies: @@ -1927,6 +2240,10 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2125,6 +2442,9 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2137,6 +2457,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -2332,6 +2656,9 @@ packages: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-abstract@1.23.5: resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} @@ -2573,6 +2900,12 @@ packages: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + extension-port-stream@4.2.0: + resolution: {integrity: sha512-i5IgiPVMVrHN+Zx8PRjvFsOw8L1A3sboVwPZghDjW9Yp1BMmBDE6mCcTNu4xMXPYduBOwI3CBK7wd72LcOyD6g==} + engines: {node: '>=12.0.0'} + peerDependencies: + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -2620,6 +2953,9 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2819,6 +3155,9 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -2901,6 +3240,9 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -3107,6 +3449,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} @@ -3332,6 +3677,12 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} + next-themes@0.4.4: + resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@15.1.0: resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -3526,6 +3877,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} @@ -3562,6 +3917,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + perfect-freehand@1.2.2: + resolution: {integrity: sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3686,9 +4044,15 @@ packages: proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-compare@3.0.1: + resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-memoize@3.0.1: + resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -3727,6 +4091,11 @@ packages: peerDependencies: react: 19.0.0-rc-5c56b873-20241107 + react-icons@5.4.0: + resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} + peerDependencies: + react: '*' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3971,6 +4340,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -4080,6 +4453,9 @@ packages: babel-plugin-macros: optional: true + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4610,6 +4986,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yaml@2.6.1: resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} @@ -4660,6 +5040,63 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@ark-ui/react@4.9.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@internationalized/date': 3.7.0 + '@zag-js/accordion': 0.82.1 + '@zag-js/anatomy': 0.82.1 + '@zag-js/auto-resize': 0.82.1 + '@zag-js/avatar': 0.82.1 + '@zag-js/carousel': 0.82.1 + '@zag-js/checkbox': 0.82.1 + '@zag-js/clipboard': 0.82.1 + '@zag-js/collapsible': 0.82.1 + '@zag-js/collection': 0.82.1 + '@zag-js/color-picker': 0.82.1 + '@zag-js/color-utils': 0.82.1 + '@zag-js/combobox': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/date-picker': 0.82.1(@internationalized/date@3.7.0) + '@zag-js/date-utils': 0.82.1(@internationalized/date@3.7.0) + '@zag-js/dialog': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/editable': 0.82.1 + '@zag-js/file-upload': 0.82.1 + '@zag-js/file-utils': 0.82.1 + '@zag-js/focus-trap': 0.82.1 + '@zag-js/highlight-word': 0.82.1 + '@zag-js/hover-card': 0.82.1 + '@zag-js/i18n-utils': 0.82.1 + '@zag-js/menu': 0.82.1 + '@zag-js/number-input': 0.82.1 + '@zag-js/pagination': 0.82.1 + '@zag-js/pin-input': 0.82.1 + '@zag-js/popover': 0.82.1 + '@zag-js/presence': 0.82.1 + '@zag-js/progress': 0.82.1 + '@zag-js/qr-code': 0.82.1 + '@zag-js/radio-group': 0.82.1 + '@zag-js/rating-group': 0.82.1 + '@zag-js/react': 0.82.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@zag-js/select': 0.82.1 + '@zag-js/signature-pad': 0.82.1 + '@zag-js/slider': 0.82.1 + '@zag-js/splitter': 0.82.1 + '@zag-js/steps': 0.82.1 + '@zag-js/switch': 0.82.1 + '@zag-js/tabs': 0.82.1 + '@zag-js/tags-input': 0.82.1 + '@zag-js/time-picker': 0.82.1(@internationalized/date@3.7.0) + '@zag-js/timer': 0.82.1 + '@zag-js/toast': 0.82.1 + '@zag-js/toggle-group': 0.82.1 + '@zag-js/tooltip': 0.82.1 + '@zag-js/tour': 0.82.1 + '@zag-js/tree-view': 0.82.1 + '@zag-js/types': 0.82.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -4780,6 +5217,19 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@chakra-ui/react@3.8.0(@emotion/react@11.14.0(@types/react@19.0.8)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@ark-ui/react': 4.9.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@19.0.8)(react@19.0.0) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + '@pandacss/is-valid-prop': 0.41.0 + csstype: 3.1.3 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + '@coinbase/wallet-sdk@3.9.3': dependencies: bn.js: 5.2.1 @@ -4814,6 +5264,74 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.0.8)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.8 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + '@esbuild/aix-ppc64@0.24.2': optional: true @@ -5073,6 +5591,14 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@internationalized/date@3.7.0': + dependencies: + '@swc/helpers': 0.5.15 + + '@internationalized/number@3.6.0': + dependencies: + '@swc/helpers': 0.5.15 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5118,6 +5644,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/json-rpc-engine@10.0.3': + dependencies: + '@metamask/rpc-errors': 7.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 11.1.0 + transitivePeerDependencies: + - supports-color + '@metamask/json-rpc-engine@7.3.3': dependencies: '@metamask/rpc-errors': 6.4.0 @@ -5143,6 +5677,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/json-rpc-middleware-stream@8.0.6': + dependencies: + '@metamask/json-rpc-engine': 10.0.3 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 11.1.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + '@metamask/object-multiplex@2.1.0': dependencies: once: 1.4.0 @@ -5169,6 +5712,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/providers@20.0.0(webextension-polyfill@0.10.0)': + dependencies: + '@metamask/json-rpc-engine': 10.0.3 + '@metamask/json-rpc-middleware-stream': 8.0.6 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 7.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 11.1.0 + detect-browser: 5.3.0 + extension-port-stream: 4.2.0(webextension-polyfill@0.10.0) + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + '@metamask/rpc-errors@6.4.0': dependencies: '@metamask/utils': 9.3.0 @@ -5176,6 +5736,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/rpc-errors@7.0.2': + dependencies: + '@metamask/utils': 11.1.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + '@metamask/safe-event-emitter@2.0.0': {} '@metamask/safe-event-emitter@3.1.2': {} @@ -5228,6 +5795,20 @@ snapshots: '@metamask/superstruct@3.1.0': {} + '@metamask/utils@11.1.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.1.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + debug: 4.3.7 + pony-cause: 2.1.11 + semver: 7.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + '@metamask/utils@5.0.2': dependencies: '@ethereumjs/tx': 4.2.0 @@ -5375,6 +5956,8 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@pandacss/is-valid-prop@0.41.0': {} + '@parcel/watcher-android-arm64@2.5.0': optional: true @@ -5986,6 +6569,8 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/parse-json@4.0.2': {} + '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.1': @@ -6550,6 +7135,463 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 + '@zag-js/accordion@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/anatomy@0.82.1': {} + + '@zag-js/aria-hidden@0.82.1': {} + + '@zag-js/auto-resize@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/avatar@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/carousel@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/scroll-snap': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/checkbox@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-visible': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/clipboard@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/collapsible@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/collection@0.82.1': + dependencies: + '@zag-js/utils': 0.82.1 + + '@zag-js/color-picker@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/color-utils': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/color-utils@0.82.1': + dependencies: + '@zag-js/utils': 0.82.1 + + '@zag-js/combobox@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/aria-hidden': 0.82.1 + '@zag-js/collection': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/core@0.82.1': + dependencies: + '@zag-js/store': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/date-picker@0.82.1(@internationalized/date@3.7.0)': + dependencies: + '@internationalized/date': 3.7.0 + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/date-utils': 0.82.1(@internationalized/date@3.7.0) + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/live-region': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/date-utils@0.82.1(@internationalized/date@3.7.0)': + dependencies: + '@internationalized/date': 3.7.0 + + '@zag-js/dialog@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/aria-hidden': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-trap': 0.82.1 + '@zag-js/remove-scroll': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/dismissable@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + '@zag-js/interact-outside': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/dom-query@0.82.1': + dependencies: + '@zag-js/types': 0.82.1 + + '@zag-js/editable@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/interact-outside': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/element-rect@0.82.1': {} + + '@zag-js/element-size@0.82.1': {} + + '@zag-js/file-upload@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/file-utils': 0.82.1 + '@zag-js/i18n-utils': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/file-utils@0.82.1': + dependencies: + '@zag-js/i18n-utils': 0.82.1 + + '@zag-js/focus-trap@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/focus-visible@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/highlight-word@0.82.1': {} + + '@zag-js/hover-card@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/i18n-utils@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/interact-outside@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/live-region@0.82.1': {} + + '@zag-js/menu@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/rect-utils': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/number-input@0.82.1': + dependencies: + '@internationalized/number': 3.6.0 + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/pagination@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/pin-input@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/popover@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/aria-hidden': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-trap': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/remove-scroll': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/popper@0.82.1': + dependencies: + '@floating-ui/dom': 1.6.12 + '@zag-js/dom-query': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/presence@0.82.1': + dependencies: + '@zag-js/core': 0.82.1 + '@zag-js/types': 0.82.1 + + '@zag-js/progress@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/qr-code@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + proxy-memoize: 3.0.1 + uqr: 0.1.2 + + '@zag-js/radio-group@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/element-rect': 0.82.1 + '@zag-js/focus-visible': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/rating-group@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/react@0.82.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@zag-js/core': 0.82.1 + '@zag-js/store': 0.82.1 + '@zag-js/types': 0.82.1 + proxy-compare: 3.0.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@zag-js/rect-utils@0.82.1': {} + + '@zag-js/remove-scroll@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/scroll-snap@0.82.1': + dependencies: + '@zag-js/dom-query': 0.82.1 + + '@zag-js/select@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/collection': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/signature-pad@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + perfect-freehand: 1.2.2 + + '@zag-js/slider@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/element-size': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/splitter@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/steps@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/store@0.82.1': + dependencies: + proxy-compare: 3.0.1 + + '@zag-js/switch@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-visible': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/tabs@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/element-rect': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/tags-input@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/auto-resize': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/interact-outside': 0.82.1 + '@zag-js/live-region': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/time-picker@0.82.1(@internationalized/date@3.7.0)': + dependencies: + '@internationalized/date': 3.7.0 + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/timer@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/toast@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/toggle-group@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/tooltip@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-visible': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/tour@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dismissable': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/focus-trap': 0.82.1 + '@zag-js/interact-outside': 0.82.1 + '@zag-js/popper': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/tree-view@0.82.1': + dependencies: + '@zag-js/anatomy': 0.82.1 + '@zag-js/collection': 0.82.1 + '@zag-js/core': 0.82.1 + '@zag-js/dom-query': 0.82.1 + '@zag-js/types': 0.82.1 + '@zag-js/utils': 0.82.1 + + '@zag-js/types@0.82.1': + dependencies: + csstype: 3.1.3 + + '@zag-js/utils@0.82.1': {} + abitype@1.0.7(typescript@5.5.4): optionalDependencies: typescript: 5.5.4 @@ -6706,6 +7748,12 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -6927,6 +7975,8 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-es@1.2.2: {} @@ -6935,6 +7985,14 @@ snapshots: core-util-is@1.0.3: {} + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + crc-32@1.2.2: {} create-require@1.1.1: {} @@ -7138,6 +8196,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.23.5: dependencies: array-buffer-byte-length: 1.0.1 @@ -7599,6 +8661,11 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + extension-port-stream@4.2.0(webextension-polyfill@0.10.0): + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -7649,6 +8716,8 @@ snapshots: filter-obj@1.1.0: {} + find-root@1.1.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -7884,6 +8953,10 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 @@ -7989,6 +9062,8 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.6 + is-arrayish@0.2.1: {} + is-arrayish@0.3.2: optional: true @@ -8163,6 +9238,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-rpc-engine@6.1.0: dependencies: '@metamask/safe-event-emitter': 2.0.0 @@ -8387,6 +9464,11 @@ snapshots: netmask@2.0.2: {} + next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 15.1.0 @@ -8622,6 +9704,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + pascal-case@2.0.1: dependencies: camel-case: 3.0.0 @@ -8650,6 +9739,8 @@ snapshots: pathe@1.1.2: {} + perfect-freehand@1.2.2: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -8776,8 +9867,14 @@ snapshots: proxy-compare@2.5.1: {} + proxy-compare@3.0.1: {} + proxy-from-env@1.1.0: {} + proxy-memoize@3.0.1: + dependencies: + proxy-compare: 3.0.1 + pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -8822,6 +9919,10 @@ snapshots: react: 19.0.0-rc-5c56b873-20241107 scheduler: 0.25.0-rc-5c56b873-20241107 + react-icons@5.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + react-is@16.13.1: {} react-refresh@0.14.2: {} @@ -9132,6 +10233,8 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.5.7: {} + source-map@0.6.1: {} split-on-first@1.1.0: {} @@ -9238,6 +10341,8 @@ snapshots: client-only: 0.0.1 react: 19.0.0 + stylis@4.2.0: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -9766,6 +10871,8 @@ snapshots: yallist@3.1.1: {} + yaml@1.10.2: {} + yaml@2.6.1: {} yargs-parser@18.1.3: From bb7fe6d52c119b6afc5d89e2f79b6ccb5f94b57e Mon Sep 17 00:00:00 2001 From: Tamas Date: Fri, 14 Feb 2025 12:25:49 +0100 Subject: [PATCH 3/5] chore: tidy --- examples/multichain/.gitignore | 2 + examples/multichain/README.md | 129 +++++++++++---- examples/multichain/src/App.tsx | 156 ++++++------------ .../src/components/app/card-container.tsx | 31 ++++ .../src/components/app/network-dropdown.tsx | 32 ++++ .../components/app/not-connected-state.tsx | 23 +++ examples/multichain/src/constants.tsx | 12 ++ .../multichain/src/multichain/provider.tsx | 6 +- 8 files changed, 242 insertions(+), 149 deletions(-) create mode 100644 examples/multichain/src/components/app/card-container.tsx create mode 100644 examples/multichain/src/components/app/network-dropdown.tsx create mode 100644 examples/multichain/src/components/app/not-connected-state.tsx create mode 100644 examples/multichain/src/constants.tsx diff --git a/examples/multichain/.gitignore b/examples/multichain/.gitignore index fcaa2b1..b42dedc 100644 --- a/examples/multichain/.gitignore +++ b/examples/multichain/.gitignore @@ -23,3 +23,5 @@ dist-ssr *.njsproj *.sln *.sw? + +llm.txt \ No newline at end of file diff --git a/examples/multichain/README.md b/examples/multichain/README.md index 74872fd..2efedd0 100644 --- a/examples/multichain/README.md +++ b/examples/multichain/README.md @@ -1,50 +1,107 @@ -# React + TypeScript + Vite +# MetaMask Multichain SDK Example -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +A React application demonstrating how to integrate and use the MetaMask Multichain SDK to interact with multiple blockchain networks. -Currently, two official plugins are available: +## Features -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh +- Connect to MetaMask across multiple networks +- Switch between Ethereum and Linea networks +- Sign messages using the connected wallet +- Fetch blockchain data (latest block numbers) -## Expanding the ESLint configuration +## Prerequisites -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: +- Node.js +- pnpm +- MetaMask extension installed in your browser +- Local copy of the MetaMask Multichain SDK -- Configure the top-level `parserOptions` property like this: +## Setup -```js -export default tseslint.config({ - languageOptions: { - // other options... - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - }, -}) +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` +3. Create a `local_modules` directory and add the MetaMask Multichain SDK + +## Development + +```bash +pnpm dev +``` + +## Implementation Details + +### Provider Setup + +```typescript +// src/multichain/provider.tsx +import { createContext, type ReactNode, useMemo } from 'react'; +import { MetamaskMultichain } from '@metamask/sdk-multichain'; + +export const MultichainContext = createContext(null); + +export const MultichainProvider = ({ children }: { children: ReactNode }) => { + const client = useMemo(() => new MetamaskMultichain(), []); + return ( + + {children} + + ); +}; ``` -- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` -- Optionally add `...tseslint.configs.stylisticTypeChecked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: +### Usage Example -```js -// eslint.config.js -import react from 'eslint-plugin-react' +```typescript +// Connect to MetaMask +const connected = await client.connect({ extensionId: EXTENSION_ID }); -export default tseslint.config({ - // Set the react version - settings: { react: { version: '18.3' } }, - plugins: { - // Add the react plugin - react, +// Create a session +const session = await client.createSession({ + requiredScopes: { + "eip155:1": { + methods: [], + notifications: [], + }, + "eip155:59144": { + methods: [], + notifications: [], + }, }, - rules: { - // other rules... - // Enable its recommended rules - ...react.configs.recommended.rules, - ...react.configs['jsx-runtime'].rules, +}); + +// Sign a message +await client.invokeMethod({ + scope: "eip155:1", + request: { + method: "personal_sign", + params: [message, address], + }, +}); + +// Fetch block number +await client.invokeMethod({ + scope: network, + request: { + method: "eth_blockNumber", + params: [], }, -}) +}); +``` + +## Available Networks + +- Ethereum (eip155:1) +- Linea (eip155:59144) + +## Project Structure (relevant files) + ``` +src/ + multichain/ # SDK integration + hooks.ts # React hooks for SDK access + provider.tsx # SDK context provider + constants.tsx # Network configurations +``` \ No newline at end of file diff --git a/examples/multichain/src/App.tsx b/examples/multichain/src/App.tsx index 3ce535c..9b9ab03 100644 --- a/examples/multichain/src/App.tsx +++ b/examples/multichain/src/App.tsx @@ -1,34 +1,19 @@ "use client"; import { useState } from "react"; +import { Container, Flex, Box, Image, Link, Button } from "@chakra-ui/react"; import { useMultichain } from "./multichain/hooks.ts"; -import { - Container, - Flex, - Box, - Image, - createListCollection, - Text, - Link, -} from "@chakra-ui/react"; -import { Button } from "@chakra-ui/react"; -import { toaster } from "./components/ui/toaster" import { ExternalLink } from "lucide-react"; +import { toaster } from "./components/ui/toaster" import { BackgroundNoise } from "./components/layout/background.tsx"; -import { NativeSelectField, NativeSelectRoot } from "./components/ui/native-select.tsx"; - -const EXTENSION_ID = "eklmonnmoaepkgaomjcefmimkkfikokn"; - -const networks = createListCollection({ - items: [ - { label: "Ethereum", value: "eip155:1" }, - { label: "Linea", value: "eip155:59144" }, - ], -}); +import { EXTENSION_ID, NETWORKS } from "./constants.tsx"; +import { NetworkDropdown } from "./components/app/network-dropdown.tsx"; +import { NotConnectedState } from "./components/app/not-connected-state.tsx"; +import { CardContainer } from "./components/app/card-container.tsx"; function App() { const [isConnected, setIsConnected] = useState(false); - const [currentNetwork, setCurrentNetwork] = useState(["eip155:1"]); + const [currentNetwork, setCurrentNetwork] = useState(NETWORKS[0].value); const [userAddress, setUserAddress] = useState(null); const client = useMultichain(); @@ -36,28 +21,32 @@ function App() { const handleConnect = async () => { try { const connected = await client.connect({ extensionId: EXTENSION_ID }); + if (connected) { const session = await client.createSession({ requiredScopes: { "eip155:1": { methods: [], - notifications: ["accountsChanged", "chainChanged"], + notifications: [], }, "eip155:59144": { methods: [], - notifications: ["accountsChanged", "chainChanged"], + notifications: [], }, }, }); - console.log("session", session); + + console.log("[handleConnect] session", session); + setIsConnected(true); + if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { const address = session.sessionScopes["eip155:1"].accounts[0].split(':')[2]; setUserAddress(address); } } } catch (error) { - console.error("Failed to connect:", error); + console.error("[handleConnect] failed to connect:", error); setIsConnected(false); } }; @@ -67,7 +56,7 @@ function App() { setIsConnected(false); }; - const signMessage = async () => { + const handleSignMessage = async () => { try { const result = await client.invokeMethod({ scope: "eip155:1", @@ -79,7 +68,9 @@ function App() { ], }, }); - console.log("result", result); + + console.log("[signMessage] result", result); + toaster.create({ title: "Message Signed", description: "Your message was successfully signed", @@ -96,16 +87,20 @@ function App() { } }; - const fetchBlockNumber = async () => { + const handleFetchBlockNumber = async () => { try { const result = await client.invokeMethod({ - scope: currentNetwork[0], + scope: currentNetwork, request: { method: "eth_blockNumber", params: [], }, }); + + console.log("[fetchBlockNumber] result", result); + const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format + toaster.create({ title: "Block Number Retrieved", description: `Latest block number: ${blockNum}`, @@ -113,7 +108,8 @@ function App() { duration: 4000, }); } catch (error) { - console.error("Failed to fetch block number:", error); + console.error("[fetchBlockNumber] failed to fetch block number:", error); + toaster.create({ title: "Failed to Fetch Block Number", description: error instanceof Error ? error.message : "An error occurred", @@ -123,8 +119,8 @@ function App() { } }; - const handleNetworkChange = (details: { value: string[] }) => { - setCurrentNetwork(details.value); + const handleNetworkChange = (value: string) => { + setCurrentNetwork(value); }; return ( @@ -136,24 +132,9 @@ function App() { Logo {isConnected && ( - - handleNetworkChange({ value: [e.target.value] })} - bg="white" - color="black" - borderRadius="sm" - border="none" - fontWeight="medium" - > - {networks.items.map((network) => ( - - ))} - - + )} + - - + - - - Learn More - - + Documentation - + GitHub Repository - + API Reference - + ) : ( - - - 🔒 - - - Not connected - - - Connect your wallet to get started - - + )} diff --git a/examples/multichain/src/components/app/card-container.tsx b/examples/multichain/src/components/app/card-container.tsx new file mode 100644 index 0000000..edf60fc --- /dev/null +++ b/examples/multichain/src/components/app/card-container.tsx @@ -0,0 +1,31 @@ +import { Box, Text } from "@chakra-ui/react"; +import type { ReactNode } from "react"; + +type Props = { + title: string; + description?: string; + children: ReactNode; +} + +export function CardContainer({ title, description, children }: Props) { + return ( + + + {title} + + {description && ( + + {description} + + )} + + {children} + + + ); +} \ No newline at end of file diff --git a/examples/multichain/src/components/app/network-dropdown.tsx b/examples/multichain/src/components/app/network-dropdown.tsx new file mode 100644 index 0000000..23d8082 --- /dev/null +++ b/examples/multichain/src/components/app/network-dropdown.tsx @@ -0,0 +1,32 @@ +import { createListCollection } from "@chakra-ui/react"; +import { NETWORKS } from "../../constants.tsx"; +import { NativeSelectField, NativeSelectRoot } from "../ui/native-select.tsx"; + +const networks = createListCollection({ items: NETWORKS }); + +type NetworkDropdownProps = { + network: string; + onNetworkChange: (value: string) => void; +}; + +export const NetworkDropdown = ({ network, onNetworkChange }: NetworkDropdownProps) => { + return ( + + onNetworkChange(e.target.value)} + bg="white" + color="black" + borderRadius="sm" + border="none" + fontWeight="medium" + > + {networks.items.map((network) => ( + + ))} + + + ); +}; \ No newline at end of file diff --git a/examples/multichain/src/components/app/not-connected-state.tsx b/examples/multichain/src/components/app/not-connected-state.tsx new file mode 100644 index 0000000..7c962a6 --- /dev/null +++ b/examples/multichain/src/components/app/not-connected-state.tsx @@ -0,0 +1,23 @@ +import { Flex, Box, Text } from "@chakra-ui/react"; + +export function NotConnectedState() { + return ( + + + 🔒 + + + Not connected + + + Connect your wallet to get started + + + ); +} diff --git a/examples/multichain/src/constants.tsx b/examples/multichain/src/constants.tsx new file mode 100644 index 0000000..2a6e41d --- /dev/null +++ b/examples/multichain/src/constants.tsx @@ -0,0 +1,12 @@ +export const EXTENSION_ID = "eklmonnmoaepkgaomjcefmimkkfikokn"; + +export const NETWORKS = [ + { + label: "Ethereum", + value: "eip155:1", + }, + { + label: "Linea", + value: "eip155:59144", + }, +]; diff --git a/examples/multichain/src/multichain/provider.tsx b/examples/multichain/src/multichain/provider.tsx index 69385a2..1145a5b 100644 --- a/examples/multichain/src/multichain/provider.tsx +++ b/examples/multichain/src/multichain/provider.tsx @@ -1,4 +1,4 @@ -import { createContext, type ReactNode, type FC, useRef } from 'react'; +import { createContext, type ReactNode, type FC, useMemo } from 'react'; import { MetamaskMultichain } from '@metamask/sdk-multichain'; @@ -9,10 +9,10 @@ type Props = { } export const MultichainProvider: FC = ({ children }) => { - const client = useRef(new MetamaskMultichain()); + const client = useMemo(() => new MetamaskMultichain(), []); return ( - + {children} ); From 7ef29139aae59c8b58047ff488f2d01d08582c5f Mon Sep 17 00:00:00 2001 From: Tamas Date: Fri, 14 Feb 2025 12:38:01 +0100 Subject: [PATCH 4/5] format --- examples/multichain/src/App.css | 42 -- examples/multichain/src/App.tsx | 381 ++++++++++-------- .../src/components/app/card-container.tsx | 15 +- .../src/components/app/network-dropdown.tsx | 7 +- .../components/app/not-connected-state.tsx | 10 +- .../multichain/src/components/ui/avatar.tsx | 110 ++--- .../multichain/src/components/ui/checkbox.tsx | 40 +- .../src/components/ui/close-button.tsx | 26 +- .../src/components/ui/color-mode.tsx | 158 ++++---- .../multichain/src/components/ui/dialog.tsx | 102 ++--- .../multichain/src/components/ui/drawer.tsx | 84 ++-- .../multichain/src/components/ui/field.tsx | 56 +-- .../src/components/ui/input-group.tsx | 92 ++--- .../src/components/ui/native-select.tsx | 82 ++-- .../multichain/src/components/ui/popover.tsx | 92 ++--- .../multichain/src/components/ui/provider.tsx | 19 +- .../multichain/src/components/ui/radio.tsx | 36 +- .../multichain/src/components/ui/select.tsx | 216 +++++----- .../multichain/src/components/ui/slider.tsx | 130 +++--- .../multichain/src/components/ui/toaster.tsx | 74 ++-- .../multichain/src/components/ui/tooltip.tsx | 78 ++-- examples/multichain/src/main.tsx | 33 +- .../multichain/src/multichain/provider.tsx | 8 +- pnpm-lock.yaml | 33 +- 24 files changed, 938 insertions(+), 986 deletions(-) delete mode 100644 examples/multichain/src/App.css diff --git a/examples/multichain/src/App.css b/examples/multichain/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/examples/multichain/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/examples/multichain/src/App.tsx b/examples/multichain/src/App.tsx index 9b9ab03..32b3bbf 100644 --- a/examples/multichain/src/App.tsx +++ b/examples/multichain/src/App.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { Container, Flex, Box, Image, Link, Button } from "@chakra-ui/react"; import { useMultichain } from "./multichain/hooks.ts"; import { ExternalLink } from "lucide-react"; -import { toaster } from "./components/ui/toaster" +import { toaster } from "./components/ui/toaster"; import { BackgroundNoise } from "./components/layout/background.tsx"; import { EXTENSION_ID, NETWORKS } from "./constants.tsx"; import { NetworkDropdown } from "./components/app/network-dropdown.tsx"; @@ -12,181 +12,210 @@ import { NotConnectedState } from "./components/app/not-connected-state.tsx"; import { CardContainer } from "./components/app/card-container.tsx"; function App() { - const [isConnected, setIsConnected] = useState(false); - const [currentNetwork, setCurrentNetwork] = useState(NETWORKS[0].value); - const [userAddress, setUserAddress] = useState(null); - - const client = useMultichain(); - - const handleConnect = async () => { - try { - const connected = await client.connect({ extensionId: EXTENSION_ID }); - - if (connected) { - const session = await client.createSession({ - requiredScopes: { - "eip155:1": { - methods: [], - notifications: [], - }, - "eip155:59144": { - methods: [], - notifications: [], - }, - }, - }); - - console.log("[handleConnect] session", session); - - setIsConnected(true); - - if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { - const address = session.sessionScopes["eip155:1"].accounts[0].split(':')[2]; - setUserAddress(address); - } - } - } catch (error) { - console.error("[handleConnect] failed to connect:", error); - setIsConnected(false); - } - }; - - const handleDisconnect = () => { - client.disconnect(); - setIsConnected(false); - }; - - const handleSignMessage = async () => { - try { - const result = await client.invokeMethod({ - scope: "eip155:1", - request: { - method: "personal_sign", - params: [ - "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", - userAddress, - ], - }, - }); - - console.log("[signMessage] result", result); - - toaster.create({ - title: "Message Signed", - description: "Your message was successfully signed", - type: "success", - duration: 4000, - }); - } catch (error) { - toaster.create({ - title: "Signing Failed", - description: error instanceof Error ? error.message : "An error occurred", - type: "error", - duration: 4000, - }); - } - }; - - const handleFetchBlockNumber = async () => { - try { - const result = await client.invokeMethod({ - scope: currentNetwork, - request: { - method: "eth_blockNumber", - params: [], - }, - }); - - console.log("[fetchBlockNumber] result", result); - - const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format - - toaster.create({ - title: "Block Number Retrieved", - description: `Latest block number: ${blockNum}`, - type: "success", - duration: 4000, - }); - } catch (error) { - console.error("[fetchBlockNumber] failed to fetch block number:", error); - - toaster.create({ - title: "Failed to Fetch Block Number", - description: error instanceof Error ? error.message : "An error occurred", - type: "error", - duration: 4000, - }); - } - }; - - const handleNetworkChange = (value: string) => { - setCurrentNetwork(value); - }; - - return ( - <> - - - - - Logo - - {isConnected && ( - - )} - - - - - - - {isConnected ? ( - - - - - - - - - - - - Documentation - - - GitHub Repository - - - API Reference - - - - - ) : ( - - )} - - - - ); + const [isConnected, setIsConnected] = useState(false); + const [currentNetwork, setCurrentNetwork] = useState(NETWORKS[0].value); + const [userAddress, setUserAddress] = useState(null); + + const client = useMultichain(); + + const handleConnect = async () => { + try { + const connected = await client.connect({ extensionId: EXTENSION_ID }); + + if (connected) { + const session = await client.createSession({ + requiredScopes: { + "eip155:1": { + methods: [], + notifications: [], + }, + "eip155:59144": { + methods: [], + notifications: [], + }, + }, + }); + + console.log("[handleConnect] session", session); + + setIsConnected(true); + + if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { + const address = + session.sessionScopes["eip155:1"].accounts[0].split(":")[2]; + setUserAddress(address); + } + } + } catch (error) { + console.error("[handleConnect] failed to connect:", error); + setIsConnected(false); + } + }; + + const handleDisconnect = () => { + client.disconnect(); + setIsConnected(false); + }; + + const handleSignMessage = async () => { + try { + const result = await client.invokeMethod({ + scope: "eip155:1", + request: { + method: "personal_sign", + params: [ + "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", + userAddress, + ], + }, + }); + + console.log("[signMessage] result", result); + + toaster.create({ + title: "Message Signed", + description: "Your message was successfully signed", + type: "success", + duration: 4000, + }); + } catch (error) { + toaster.create({ + title: "Signing Failed", + description: + error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const handleFetchBlockNumber = async () => { + try { + const result = await client.invokeMethod({ + scope: currentNetwork, + request: { + method: "eth_blockNumber", + params: [], + }, + }); + + console.log("[fetchBlockNumber] result", result); + + const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format + + toaster.create({ + title: "Block Number Retrieved", + description: `Latest block number: ${blockNum}`, + type: "success", + duration: 4000, + }); + } catch (error) { + console.error("[fetchBlockNumber] failed to fetch block number:", error); + + toaster.create({ + title: "Failed to Fetch Block Number", + description: + error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const handleNetworkChange = (value: string) => { + setCurrentNetwork(value); + }; + + return ( + <> + + + + + Logo + + {isConnected && ( + + )} + + + + + + + {isConnected ? ( + + + + + + + + + + + + Documentation + + + GitHub Repository + + + API Reference + + + + + ) : ( + + )} + + + + ); } export default App; diff --git a/examples/multichain/src/components/app/card-container.tsx b/examples/multichain/src/components/app/card-container.tsx index edf60fc..5eec4fd 100644 --- a/examples/multichain/src/components/app/card-container.tsx +++ b/examples/multichain/src/components/app/card-container.tsx @@ -5,16 +5,11 @@ type Props = { title: string; description?: string; children: ReactNode; -} +}; export function CardContainer({ title, description, children }: Props) { return ( - + {title} @@ -23,9 +18,7 @@ export function CardContainer({ title, description, children }: Props) { {description} )} - - {children} - + {children} ); -} \ No newline at end of file +} diff --git a/examples/multichain/src/components/app/network-dropdown.tsx b/examples/multichain/src/components/app/network-dropdown.tsx index 23d8082..49d3d9d 100644 --- a/examples/multichain/src/components/app/network-dropdown.tsx +++ b/examples/multichain/src/components/app/network-dropdown.tsx @@ -9,7 +9,10 @@ type NetworkDropdownProps = { onNetworkChange: (value: string) => void; }; -export const NetworkDropdown = ({ network, onNetworkChange }: NetworkDropdownProps) => { +export const NetworkDropdown = ({ + network, + onNetworkChange, +}: NetworkDropdownProps) => { return ( ); -}; \ No newline at end of file +}; diff --git a/examples/multichain/src/components/app/not-connected-state.tsx b/examples/multichain/src/components/app/not-connected-state.tsx index 7c962a6..eecfcb4 100644 --- a/examples/multichain/src/components/app/not-connected-state.tsx +++ b/examples/multichain/src/components/app/not-connected-state.tsx @@ -2,13 +2,7 @@ import { Flex, Box, Text } from "@chakra-ui/react"; export function NotConnectedState() { return ( - + 🔒 @@ -18,6 +12,6 @@ export function NotConnectedState() { Connect your wallet to get started - + ); } diff --git a/examples/multichain/src/components/ui/avatar.tsx b/examples/multichain/src/components/ui/avatar.tsx index cd84664..e0824f8 100644 --- a/examples/multichain/src/components/ui/avatar.tsx +++ b/examples/multichain/src/components/ui/avatar.tsx @@ -1,74 +1,74 @@ -"use client" +"use client"; -import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react" -import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react" -import * as React from "react" +import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react"; +import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react"; +import * as React from "react"; -type ImageProps = React.ImgHTMLAttributes +type ImageProps = React.ImgHTMLAttributes; export interface AvatarProps extends ChakraAvatar.RootProps { - name?: string - src?: string - srcSet?: string - loading?: ImageProps["loading"] - icon?: React.ReactElement - fallback?: React.ReactNode + name?: string; + src?: string; + srcSet?: string; + loading?: ImageProps["loading"]; + icon?: React.ReactElement; + fallback?: React.ReactNode; } export const Avatar = React.forwardRef( - function Avatar(props, ref) { - const { name, src, srcSet, loading, icon, fallback, children, ...rest } = - props - return ( - - - {fallback} - - - {children} - - ) - }, -) + function Avatar(props, ref) { + const { name, src, srcSet, loading, icon, fallback, children, ...rest } = + props; + return ( + + + {fallback} + + + {children} + + ); + }, +); interface AvatarFallbackProps extends ChakraAvatar.FallbackProps { - name?: string - icon?: React.ReactElement + name?: string; + icon?: React.ReactElement; } const AvatarFallback = React.forwardRef( - function AvatarFallback(props, ref) { - const { name, icon, children, ...rest } = props - return ( - - {children} - {name != null && children == null && <>{getInitials(name)}} - {name == null && children == null && ( - {icon} - )} - - ) - }, -) + function AvatarFallback(props, ref) { + const { name, icon, children, ...rest } = props; + return ( + + {children} + {name != null && children == null && <>{getInitials(name)}} + {name == null && children == null && ( + {icon} + )} + + ); + }, +); function getInitials(name: string) { - const names = name.trim().split(" ") - const firstName = names[0] != null ? names[0] : "" - const lastName = names.length > 1 ? names[names.length - 1] : "" - return firstName && lastName - ? `${firstName.charAt(0)}${lastName.charAt(0)}` - : firstName.charAt(0) + const names = name.trim().split(" "); + const firstName = names[0] != null ? names[0] : ""; + const lastName = names.length > 1 ? names[names.length - 1] : ""; + return firstName && lastName + ? `${firstName.charAt(0)}${lastName.charAt(0)}` + : firstName.charAt(0); } interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {} export const AvatarGroup = React.forwardRef( - function AvatarGroup(props, ref) { - const { size, variant, borderless, ...rest } = props - return ( - - - - ) - }, -) + function AvatarGroup(props, ref) { + const { size, variant, borderless, ...rest } = props; + return ( + + + + ); + }, +); diff --git a/examples/multichain/src/components/ui/checkbox.tsx b/examples/multichain/src/components/ui/checkbox.tsx index 2a27c2f..9316291 100644 --- a/examples/multichain/src/components/ui/checkbox.tsx +++ b/examples/multichain/src/components/ui/checkbox.tsx @@ -1,25 +1,25 @@ -import { Checkbox as ChakraCheckbox } from "@chakra-ui/react" -import * as React from "react" +import { Checkbox as ChakraCheckbox } from "@chakra-ui/react"; +import * as React from "react"; export interface CheckboxProps extends ChakraCheckbox.RootProps { - icon?: React.ReactNode - inputProps?: React.InputHTMLAttributes - rootRef?: React.Ref + icon?: React.ReactNode; + inputProps?: React.InputHTMLAttributes; + rootRef?: React.Ref; } export const Checkbox = React.forwardRef( - function Checkbox(props, ref) { - const { icon, children, inputProps, rootRef, ...rest } = props - return ( - - - - {icon || } - - {children != null && ( - {children} - )} - - ) - }, -) + function Checkbox(props, ref) { + const { icon, children, inputProps, rootRef, ...rest } = props; + return ( + + + + {icon || } + + {children != null && ( + {children} + )} + + ); + }, +); diff --git a/examples/multichain/src/components/ui/close-button.tsx b/examples/multichain/src/components/ui/close-button.tsx index 94af488..90cb245 100644 --- a/examples/multichain/src/components/ui/close-button.tsx +++ b/examples/multichain/src/components/ui/close-button.tsx @@ -1,17 +1,17 @@ -import type { ButtonProps } from "@chakra-ui/react" -import { IconButton as ChakraIconButton } from "@chakra-ui/react" -import * as React from "react" -import { LuX } from "react-icons/lu" +import type { ButtonProps } from "@chakra-ui/react"; +import { IconButton as ChakraIconButton } from "@chakra-ui/react"; +import * as React from "react"; +import { LuX } from "react-icons/lu"; -export type CloseButtonProps = ButtonProps +export type CloseButtonProps = ButtonProps; export const CloseButton = React.forwardRef< - HTMLButtonElement, - CloseButtonProps + HTMLButtonElement, + CloseButtonProps >(function CloseButton(props, ref) { - return ( - - {props.children ?? } - - ) -}) + return ( + + {props.children ?? } + + ); +}); diff --git a/examples/multichain/src/components/ui/color-mode.tsx b/examples/multichain/src/components/ui/color-mode.tsx index f93feab..887b9e4 100644 --- a/examples/multichain/src/components/ui/color-mode.tsx +++ b/examples/multichain/src/components/ui/color-mode.tsx @@ -1,107 +1,107 @@ -"use client" +"use client"; -import type { IconButtonProps, SpanProps } from "@chakra-ui/react" -import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react" -import { ThemeProvider, useTheme } from "next-themes" -import type { ThemeProviderProps } from "next-themes" -import * as React from "react" -import { LuMoon, LuSun } from "react-icons/lu" +import type { IconButtonProps, SpanProps } from "@chakra-ui/react"; +import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react"; +import { ThemeProvider, useTheme } from "next-themes"; +import type { ThemeProviderProps } from "next-themes"; +import * as React from "react"; +import { LuMoon, LuSun } from "react-icons/lu"; export interface ColorModeProviderProps extends ThemeProviderProps {} export function ColorModeProvider(props: ColorModeProviderProps) { - return ( - - ) + return ( + + ); } -export type ColorMode = "light" | "dark" +export type ColorMode = "light" | "dark"; export interface UseColorModeReturn { - colorMode: ColorMode - setColorMode: (colorMode: ColorMode) => void - toggleColorMode: () => void + colorMode: ColorMode; + setColorMode: (colorMode: ColorMode) => void; + toggleColorMode: () => void; } export function useColorMode(): UseColorModeReturn { - const { resolvedTheme, setTheme } = useTheme() - const toggleColorMode = () => { - setTheme(resolvedTheme === "dark" ? "light" : "dark") - } - return { - colorMode: resolvedTheme as ColorMode, - setColorMode: setTheme, - toggleColorMode, - } + const { resolvedTheme, setTheme } = useTheme(); + const toggleColorMode = () => { + setTheme(resolvedTheme === "dark" ? "light" : "dark"); + }; + return { + colorMode: resolvedTheme as ColorMode, + setColorMode: setTheme, + toggleColorMode, + }; } export function useColorModeValue(light: T, dark: T) { - const { colorMode } = useColorMode() - return colorMode === "dark" ? dark : light + const { colorMode } = useColorMode(); + return colorMode === "dark" ? dark : light; } export function ColorModeIcon() { - const { colorMode } = useColorMode() - return colorMode === "dark" ? : + const { colorMode } = useColorMode(); + return colorMode === "dark" ? : ; } interface ColorModeButtonProps extends Omit {} export const ColorModeButton = React.forwardRef< - HTMLButtonElement, - ColorModeButtonProps + HTMLButtonElement, + ColorModeButtonProps >(function ColorModeButton(props, ref) { - const { toggleColorMode } = useColorMode() - return ( - }> - - - - - ) -}) + const { toggleColorMode } = useColorMode(); + return ( + }> + + + + + ); +}); export const LightMode = React.forwardRef( - function LightMode(props, ref) { - return ( - - ) - }, -) + function LightMode(props, ref) { + return ( + + ); + }, +); export const DarkMode = React.forwardRef( - function DarkMode(props, ref) { - return ( - - ) - }, -) + function DarkMode(props, ref) { + return ( + + ); + }, +); diff --git a/examples/multichain/src/components/ui/dialog.tsx b/examples/multichain/src/components/ui/dialog.tsx index 89d68a5..8f81a0a 100644 --- a/examples/multichain/src/components/ui/dialog.tsx +++ b/examples/multichain/src/components/ui/dialog.tsx @@ -1,62 +1,62 @@ -import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react" -import { CloseButton } from "./close-button" -import * as React from "react" +import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react"; +import { CloseButton } from "./close-button"; +import * as React from "react"; interface DialogContentProps extends ChakraDialog.ContentProps { - portalled?: boolean - portalRef?: React.RefObject - backdrop?: boolean + portalled?: boolean; + portalRef?: React.RefObject; + backdrop?: boolean; } export const DialogContent = React.forwardRef< - HTMLDivElement, - DialogContentProps + HTMLDivElement, + DialogContentProps >(function DialogContent(props, ref) { - const { - children, - portalled = true, - portalRef, - backdrop = true, - ...rest - } = props + const { + children, + portalled = true, + portalRef, + backdrop = true, + ...rest + } = props; - return ( - - {backdrop && } - - - {children} - - - - ) -}) + return ( + + {backdrop && } + + + {children} + + + + ); +}); export const DialogCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraDialog.CloseTriggerProps + HTMLButtonElement, + ChakraDialog.CloseTriggerProps >(function DialogCloseTrigger(props, ref) { - return ( - - - {props.children} - - - ) -}) + return ( + + + {props.children} + + + ); +}); -export const DialogRoot = ChakraDialog.Root -export const DialogFooter = ChakraDialog.Footer -export const DialogHeader = ChakraDialog.Header -export const DialogBody = ChakraDialog.Body -export const DialogBackdrop = ChakraDialog.Backdrop -export const DialogTitle = ChakraDialog.Title -export const DialogDescription = ChakraDialog.Description -export const DialogTrigger = ChakraDialog.Trigger -export const DialogActionTrigger = ChakraDialog.ActionTrigger +export const DialogRoot = ChakraDialog.Root; +export const DialogFooter = ChakraDialog.Footer; +export const DialogHeader = ChakraDialog.Header; +export const DialogBody = ChakraDialog.Body; +export const DialogBackdrop = ChakraDialog.Backdrop; +export const DialogTitle = ChakraDialog.Title; +export const DialogDescription = ChakraDialog.Description; +export const DialogTrigger = ChakraDialog.Trigger; +export const DialogActionTrigger = ChakraDialog.ActionTrigger; diff --git a/examples/multichain/src/components/ui/drawer.tsx b/examples/multichain/src/components/ui/drawer.tsx index ccb96c8..6e5aa18 100644 --- a/examples/multichain/src/components/ui/drawer.tsx +++ b/examples/multichain/src/components/ui/drawer.tsx @@ -1,52 +1,52 @@ -import { Drawer as ChakraDrawer, Portal } from "@chakra-ui/react" -import { CloseButton } from "./close-button" -import * as React from "react" +import { Drawer as ChakraDrawer, Portal } from "@chakra-ui/react"; +import { CloseButton } from "./close-button"; +import * as React from "react"; interface DrawerContentProps extends ChakraDrawer.ContentProps { - portalled?: boolean - portalRef?: React.RefObject - offset?: ChakraDrawer.ContentProps["padding"] + portalled?: boolean; + portalRef?: React.RefObject; + offset?: ChakraDrawer.ContentProps["padding"]; } export const DrawerContent = React.forwardRef< - HTMLDivElement, - DrawerContentProps + HTMLDivElement, + DrawerContentProps >(function DrawerContent(props, ref) { - const { children, portalled = true, portalRef, offset, ...rest } = props - return ( - - - - {children} - - - - ) -}) + const { children, portalled = true, portalRef, offset, ...rest } = props; + return ( + + + + {children} + + + + ); +}); export const DrawerCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraDrawer.CloseTriggerProps + HTMLButtonElement, + ChakraDrawer.CloseTriggerProps >(function DrawerCloseTrigger(props, ref) { - return ( - - - - ) -}) + return ( + + + + ); +}); -export const DrawerTrigger = ChakraDrawer.Trigger -export const DrawerRoot = ChakraDrawer.Root -export const DrawerFooter = ChakraDrawer.Footer -export const DrawerHeader = ChakraDrawer.Header -export const DrawerBody = ChakraDrawer.Body -export const DrawerBackdrop = ChakraDrawer.Backdrop -export const DrawerDescription = ChakraDrawer.Description -export const DrawerTitle = ChakraDrawer.Title -export const DrawerActionTrigger = ChakraDrawer.ActionTrigger +export const DrawerTrigger = ChakraDrawer.Trigger; +export const DrawerRoot = ChakraDrawer.Root; +export const DrawerFooter = ChakraDrawer.Footer; +export const DrawerHeader = ChakraDrawer.Header; +export const DrawerBody = ChakraDrawer.Body; +export const DrawerBackdrop = ChakraDrawer.Backdrop; +export const DrawerDescription = ChakraDrawer.Description; +export const DrawerTitle = ChakraDrawer.Title; +export const DrawerActionTrigger = ChakraDrawer.ActionTrigger; diff --git a/examples/multichain/src/components/ui/field.tsx b/examples/multichain/src/components/ui/field.tsx index dd3b66f..56ff70e 100644 --- a/examples/multichain/src/components/ui/field.tsx +++ b/examples/multichain/src/components/ui/field.tsx @@ -1,33 +1,33 @@ -import { Field as ChakraField } from "@chakra-ui/react" -import * as React from "react" +import { Field as ChakraField } from "@chakra-ui/react"; +import * as React from "react"; export interface FieldProps extends Omit { - label?: React.ReactNode - helperText?: React.ReactNode - errorText?: React.ReactNode - optionalText?: React.ReactNode + label?: React.ReactNode; + helperText?: React.ReactNode; + errorText?: React.ReactNode; + optionalText?: React.ReactNode; } export const Field = React.forwardRef( - function Field(props, ref) { - const { label, children, helperText, errorText, optionalText, ...rest } = - props - return ( - - {label && ( - - {label} - - - )} - {children} - {helperText && ( - {helperText} - )} - {errorText && ( - {errorText} - )} - - ) - }, -) + function Field(props, ref) { + const { label, children, helperText, errorText, optionalText, ...rest } = + props; + return ( + + {label && ( + + {label} + + + )} + {children} + {helperText && ( + {helperText} + )} + {errorText && ( + {errorText} + )} + + ); + }, +); diff --git a/examples/multichain/src/components/ui/input-group.tsx b/examples/multichain/src/components/ui/input-group.tsx index 5d8fb32..ab61cbb 100644 --- a/examples/multichain/src/components/ui/input-group.tsx +++ b/examples/multichain/src/components/ui/input-group.tsx @@ -1,53 +1,53 @@ -import type { BoxProps, InputElementProps } from "@chakra-ui/react" -import { Group, InputElement } from "@chakra-ui/react" -import * as React from "react" +import type { BoxProps, InputElementProps } from "@chakra-ui/react"; +import { Group, InputElement } from "@chakra-ui/react"; +import * as React from "react"; export interface InputGroupProps extends BoxProps { - startElementProps?: InputElementProps - endElementProps?: InputElementProps - startElement?: React.ReactNode - endElement?: React.ReactNode - children: React.ReactElement - startOffset?: InputElementProps["paddingStart"] - endOffset?: InputElementProps["paddingEnd"] + startElementProps?: InputElementProps; + endElementProps?: InputElementProps; + startElement?: React.ReactNode; + endElement?: React.ReactNode; + children: React.ReactElement; + startOffset?: InputElementProps["paddingStart"]; + endOffset?: InputElementProps["paddingEnd"]; } export const InputGroup = React.forwardRef( - function InputGroup(props, ref) { - const { - startElement, - startElementProps, - endElement, - endElementProps, - children, - startOffset = "6px", - endOffset = "6px", - ...rest - } = props + function InputGroup(props, ref) { + const { + startElement, + startElementProps, + endElement, + endElementProps, + children, + startOffset = "6px", + endOffset = "6px", + ...rest + } = props; - const child = - React.Children.only>(children) + const child = + React.Children.only>(children); - return ( - - {startElement && ( - - {startElement} - - )} - {React.cloneElement(child, { - ...(startElement && { - ps: `calc(var(--input-height) - ${startOffset})`, - }), - ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), - ...children.props, - })} - {endElement && ( - - {endElement} - - )} - - ) - }, -) + return ( + + {startElement && ( + + {startElement} + + )} + {React.cloneElement(child, { + ...(startElement && { + ps: `calc(var(--input-height) - ${startOffset})`, + }), + ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), + ...children.props, + })} + {endElement && ( + + {endElement} + + )} + + ); + }, +); diff --git a/examples/multichain/src/components/ui/native-select.tsx b/examples/multichain/src/components/ui/native-select.tsx index 9e6ebf5..a98f7f3 100644 --- a/examples/multichain/src/components/ui/native-select.tsx +++ b/examples/multichain/src/components/ui/native-select.tsx @@ -1,57 +1,57 @@ -"use client" +"use client"; -import { NativeSelect as Select } from "@chakra-ui/react" -import * as React from "react" +import { NativeSelect as Select } from "@chakra-ui/react"; +import * as React from "react"; interface NativeSelectRootProps extends Select.RootProps { - icon?: React.ReactNode + icon?: React.ReactNode; } export const NativeSelectRoot = React.forwardRef< - HTMLDivElement, - NativeSelectRootProps + HTMLDivElement, + NativeSelectRootProps >(function NativeSelect(props, ref) { - const { icon, children, ...rest } = props - return ( - - {children} - {icon} - - ) -}) + const { icon, children, ...rest } = props; + return ( + + {children} + {icon} + + ); +}); interface NativeSelectItem { - value: string - label: string - disabled?: boolean + value: string; + label: string; + disabled?: boolean; } interface NativeSelectField extends Select.FieldProps { - items?: Array + items?: Array; } export const NativeSelectField = React.forwardRef< - HTMLSelectElement, - NativeSelectField + HTMLSelectElement, + NativeSelectField >(function NativeSelectField(props, ref) { - const { items: itemsProp, children, ...rest } = props - - const items = React.useMemo( - () => - itemsProp?.map((item) => - typeof item === "string" ? { label: item, value: item } : item, - ), - [itemsProp], - ) - - return ( - - {children} - {items?.map((item) => ( - - ))} - - ) -}) + const { items: itemsProp, children, ...rest } = props; + + const items = React.useMemo( + () => + itemsProp?.map((item) => + typeof item === "string" ? { label: item, value: item } : item, + ), + [itemsProp], + ); + + return ( + + {children} + {items?.map((item) => ( + + ))} + + ); +}); diff --git a/examples/multichain/src/components/ui/popover.tsx b/examples/multichain/src/components/ui/popover.tsx index 3320659..ed8b105 100644 --- a/examples/multichain/src/components/ui/popover.tsx +++ b/examples/multichain/src/components/ui/popover.tsx @@ -1,59 +1,59 @@ -import { Popover as ChakraPopover, Portal } from "@chakra-ui/react" -import { CloseButton } from "./close-button" -import * as React from "react" +import { Popover as ChakraPopover, Portal } from "@chakra-ui/react"; +import { CloseButton } from "./close-button"; +import * as React from "react"; interface PopoverContentProps extends ChakraPopover.ContentProps { - portalled?: boolean - portalRef?: React.RefObject + portalled?: boolean; + portalRef?: React.RefObject; } export const PopoverContent = React.forwardRef< - HTMLDivElement, - PopoverContentProps + HTMLDivElement, + PopoverContentProps >(function PopoverContent(props, ref) { - const { portalled = true, portalRef, ...rest } = props - return ( - - - - - - ) -}) + const { portalled = true, portalRef, ...rest } = props; + return ( + + + + + + ); +}); export const PopoverArrow = React.forwardRef< - HTMLDivElement, - ChakraPopover.ArrowProps + HTMLDivElement, + ChakraPopover.ArrowProps >(function PopoverArrow(props, ref) { - return ( - - - - ) -}) + return ( + + + + ); +}); export const PopoverCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraPopover.CloseTriggerProps + HTMLButtonElement, + ChakraPopover.CloseTriggerProps >(function PopoverCloseTrigger(props, ref) { - return ( - - - - ) -}) + return ( + + + + ); +}); -export const PopoverTitle = ChakraPopover.Title -export const PopoverDescription = ChakraPopover.Description -export const PopoverFooter = ChakraPopover.Footer -export const PopoverHeader = ChakraPopover.Header -export const PopoverRoot = ChakraPopover.Root -export const PopoverBody = ChakraPopover.Body -export const PopoverTrigger = ChakraPopover.Trigger +export const PopoverTitle = ChakraPopover.Title; +export const PopoverDescription = ChakraPopover.Description; +export const PopoverFooter = ChakraPopover.Footer; +export const PopoverHeader = ChakraPopover.Header; +export const PopoverRoot = ChakraPopover.Root; +export const PopoverBody = ChakraPopover.Body; +export const PopoverTrigger = ChakraPopover.Trigger; diff --git a/examples/multichain/src/components/ui/provider.tsx b/examples/multichain/src/components/ui/provider.tsx index fd0331b..b8082b5 100644 --- a/examples/multichain/src/components/ui/provider.tsx +++ b/examples/multichain/src/components/ui/provider.tsx @@ -1,15 +1,12 @@ -"use client" +"use client"; -import { ChakraProvider, defaultSystem } from "@chakra-ui/react" -import { - ColorModeProvider, - type ColorModeProviderProps, -} from "./color-mode" +import { ChakraProvider, defaultSystem } from "@chakra-ui/react"; +import { ColorModeProvider, type ColorModeProviderProps } from "./color-mode"; export function Provider(props: ColorModeProviderProps) { - return ( - - - - ) + return ( + + + + ); } diff --git a/examples/multichain/src/components/ui/radio.tsx b/examples/multichain/src/components/ui/radio.tsx index b3919d0..c41d47a 100644 --- a/examples/multichain/src/components/ui/radio.tsx +++ b/examples/multichain/src/components/ui/radio.tsx @@ -1,24 +1,24 @@ -import { RadioGroup as ChakraRadioGroup } from "@chakra-ui/react" -import * as React from "react" +import { RadioGroup as ChakraRadioGroup } from "@chakra-ui/react"; +import * as React from "react"; export interface RadioProps extends ChakraRadioGroup.ItemProps { - rootRef?: React.Ref - inputProps?: React.InputHTMLAttributes + rootRef?: React.Ref; + inputProps?: React.InputHTMLAttributes; } export const Radio = React.forwardRef( - function Radio(props, ref) { - const { children, inputProps, rootRef, ...rest } = props - return ( - - - - {children && ( - {children} - )} - - ) - }, -) + function Radio(props, ref) { + const { children, inputProps, rootRef, ...rest } = props; + return ( + + + + {children && ( + {children} + )} + + ); + }, +); -export const RadioGroup = ChakraRadioGroup.Root +export const RadioGroup = ChakraRadioGroup.Root; diff --git a/examples/multichain/src/components/ui/select.tsx b/examples/multichain/src/components/ui/select.tsx index 99d84e6..939a005 100644 --- a/examples/multichain/src/components/ui/select.tsx +++ b/examples/multichain/src/components/ui/select.tsx @@ -1,143 +1,143 @@ -"use client" +"use client"; -import type { CollectionItem } from "@chakra-ui/react" -import { Select as ChakraSelect, Portal } from "@chakra-ui/react" -import { CloseButton } from "./close-button" -import * as React from "react" +import type { CollectionItem } from "@chakra-ui/react"; +import { Select as ChakraSelect, Portal } from "@chakra-ui/react"; +import { CloseButton } from "./close-button"; +import * as React from "react"; interface SelectTriggerProps extends ChakraSelect.ControlProps { - clearable?: boolean + clearable?: boolean; } export const SelectTrigger = React.forwardRef< - HTMLButtonElement, - SelectTriggerProps + HTMLButtonElement, + SelectTriggerProps >(function SelectTrigger(props, ref) { - const { children, clearable, ...rest } = props - return ( - - {children} - - {clearable && } - - - - ) -}) + const { children, clearable, ...rest } = props; + return ( + + {children} + + {clearable && } + + + + ); +}); const SelectClearTrigger = React.forwardRef< - HTMLButtonElement, - ChakraSelect.ClearTriggerProps + HTMLButtonElement, + ChakraSelect.ClearTriggerProps >(function SelectClearTrigger(props, ref) { - return ( - - - - ) -}) + return ( + + + + ); +}); interface SelectContentProps extends ChakraSelect.ContentProps { - portalled?: boolean - portalRef?: React.RefObject + portalled?: boolean; + portalRef?: React.RefObject; } export const SelectContent = React.forwardRef< - HTMLDivElement, - SelectContentProps + HTMLDivElement, + SelectContentProps >(function SelectContent(props, ref) { - const { portalled = true, portalRef, ...rest } = props - return ( - - - - - - ) -}) + const { portalled = true, portalRef, ...rest } = props; + return ( + + + + + + ); +}); export const SelectItem = React.forwardRef< - HTMLDivElement, - ChakraSelect.ItemProps + HTMLDivElement, + ChakraSelect.ItemProps >(function SelectItem(props, ref) { - const { item, children, ...rest } = props - return ( - - {children} - - - ) -}) + const { item, children, ...rest } = props; + return ( + + {children} + + + ); +}); interface SelectValueTextProps - extends Omit { - children?(items: CollectionItem[]): React.ReactNode + extends Omit { + children?(items: CollectionItem[]): React.ReactNode; } export const SelectValueText = React.forwardRef< - HTMLSpanElement, - SelectValueTextProps + HTMLSpanElement, + SelectValueTextProps >(function SelectValueText(props, ref) { - const { children, ...rest } = props - return ( - - - {(select) => { - const items = select.selectedItems - if (items.length === 0) return props.placeholder - if (children) return children(items) - if (items.length === 1) - return select.collection.stringifyItem(items[0]) - return `${items.length} selected` - }} - - - ) -}) + const { children, ...rest } = props; + return ( + + + {(select) => { + const items = select.selectedItems; + if (items.length === 0) return props.placeholder; + if (children) return children(items); + if (items.length === 1) + return select.collection.stringifyItem(items[0]); + return `${items.length} selected`; + }} + + + ); +}); export const SelectRoot = React.forwardRef< - HTMLDivElement, - ChakraSelect.RootProps + HTMLDivElement, + ChakraSelect.RootProps >(function SelectRoot(props, ref) { - return ( - - {props.asChild ? ( - props.children - ) : ( - <> - - {props.children} - - )} - - ) -}) as ChakraSelect.RootComponent + return ( + + {props.asChild ? ( + props.children + ) : ( + <> + + {props.children} + + )} + + ); +}) as ChakraSelect.RootComponent; interface SelectItemGroupProps extends ChakraSelect.ItemGroupProps { - label: React.ReactNode + label: React.ReactNode; } export const SelectItemGroup = React.forwardRef< - HTMLDivElement, - SelectItemGroupProps + HTMLDivElement, + SelectItemGroupProps >(function SelectItemGroup(props, ref) { - const { children, label, ...rest } = props - return ( - - {label} - {children} - - ) -}) + const { children, label, ...rest } = props; + return ( + + {label} + {children} + + ); +}); -export const SelectLabel = ChakraSelect.Label -export const SelectItemText = ChakraSelect.ItemText +export const SelectLabel = ChakraSelect.Label; +export const SelectItemText = ChakraSelect.ItemText; diff --git a/examples/multichain/src/components/ui/slider.tsx b/examples/multichain/src/components/ui/slider.tsx index 55a7283..1005c68 100644 --- a/examples/multichain/src/components/ui/slider.tsx +++ b/examples/multichain/src/components/ui/slider.tsx @@ -1,82 +1,82 @@ -import { Slider as ChakraSlider, For, HStack } from "@chakra-ui/react" -import * as React from "react" +import { Slider as ChakraSlider, For, HStack } from "@chakra-ui/react"; +import * as React from "react"; export interface SliderProps extends ChakraSlider.RootProps { - marks?: Array - label?: React.ReactNode - showValue?: boolean + marks?: Array; + label?: React.ReactNode; + showValue?: boolean; } export const Slider = React.forwardRef( - function Slider(props, ref) { - const { marks: marksProp, label, showValue, ...rest } = props - const value = props.defaultValue ?? props.value + function Slider(props, ref) { + const { marks: marksProp, label, showValue, ...rest } = props; + const value = props.defaultValue ?? props.value; - const marks = marksProp?.map((mark) => { - if (typeof mark === "number") return { value: mark, label: undefined } - return mark - }) + const marks = marksProp?.map((mark) => { + if (typeof mark === "number") return { value: mark, label: undefined }; + return mark; + }); - const hasMarkLabel = !!marks?.some((mark) => mark.label) + const hasMarkLabel = !!marks?.some((mark) => mark.label); - return ( - - {label && !showValue && ( - {label} - )} - {label && showValue && ( - - {label} - - - )} - - - - - - - - - ) - }, -) + return ( + + {label && !showValue && ( + {label} + )} + {label && showValue && ( + + {label} + + + )} + + + + + + + + + ); + }, +); function SliderThumbs(props: { value?: number[] }) { - const { value } = props - return ( - - {(_, index) => ( - - - - )} - - ) + const { value } = props; + return ( + + {(_, index) => ( + + + + )} + + ); } interface SliderMarksProps { - marks?: Array + marks?: Array; } const SliderMarks = React.forwardRef( - function SliderMarks(props, ref) { - const { marks } = props - if (!marks?.length) return null + function SliderMarks(props, ref) { + const { marks } = props; + if (!marks?.length) return null; - return ( - - {marks.map((mark, index) => { - const value = typeof mark === "number" ? mark : mark.value - const label = typeof mark === "number" ? undefined : mark.label - return ( - - - {label} - - ) - })} - - ) - }, -) + return ( + + {marks.map((mark, index) => { + const value = typeof mark === "number" ? mark : mark.value; + const label = typeof mark === "number" ? undefined : mark.label; + return ( + + + {label} + + ); + })} + + ); + }, +); diff --git a/examples/multichain/src/components/ui/toaster.tsx b/examples/multichain/src/components/ui/toaster.tsx index df6c2c3..9c3eb50 100644 --- a/examples/multichain/src/components/ui/toaster.tsx +++ b/examples/multichain/src/components/ui/toaster.tsx @@ -1,43 +1,43 @@ -"use client" +"use client"; import { - Toaster as ChakraToaster, - Portal, - Spinner, - Stack, - Toast, - createToaster, -} from "@chakra-ui/react" + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, +} from "@chakra-ui/react"; export const toaster = createToaster({ - placement: "bottom-end", - pauseOnPageIdle: true, -}) + placement: "bottom-end", + pauseOnPageIdle: true, +}); export const Toaster = () => { - return ( - - - {(toast) => ( - - {toast.type === "loading" ? ( - - ) : ( - - )} - - {toast.title && {toast.title}} - {toast.description && ( - {toast.description} - )} - - {toast.action && ( - {toast.action.label} - )} - {toast.meta?.closable && } - - )} - - - ) -} + return ( + + + {(toast) => ( + + {toast.type === "loading" ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.meta?.closable && } + + )} + + + ); +}; diff --git a/examples/multichain/src/components/ui/tooltip.tsx b/examples/multichain/src/components/ui/tooltip.tsx index 43a8a6c..92613e5 100644 --- a/examples/multichain/src/components/ui/tooltip.tsx +++ b/examples/multichain/src/components/ui/tooltip.tsx @@ -1,46 +1,46 @@ -import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react" -import * as React from "react" +import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react"; +import * as React from "react"; export interface TooltipProps extends ChakraTooltip.RootProps { - showArrow?: boolean - portalled?: boolean - portalRef?: React.RefObject - content: React.ReactNode - contentProps?: ChakraTooltip.ContentProps - disabled?: boolean + showArrow?: boolean; + portalled?: boolean; + portalRef?: React.RefObject; + content: React.ReactNode; + contentProps?: ChakraTooltip.ContentProps; + disabled?: boolean; } export const Tooltip = React.forwardRef( - function Tooltip(props, ref) { - const { - showArrow, - children, - disabled, - portalled = true, - content, - contentProps, - portalRef, - ...rest - } = props + function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props; - if (disabled) return children + if (disabled) return children; - return ( - - {children} - - - - {showArrow && ( - - - - )} - {content} - - - - - ) - }, -) + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ); + }, +); diff --git a/examples/multichain/src/main.tsx b/examples/multichain/src/main.tsx index e34ff47..749157d 100644 --- a/examples/multichain/src/main.tsx +++ b/examples/multichain/src/main.tsx @@ -1,18 +1,17 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -// import './index.css' -import App from './App.tsx' -import { Provider as ChakraProvider } from "./components/ui/provider" -import { MultichainProvider } from './multichain/provider.tsx' -import { Toaster } from "./components/ui/toaster" +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; +import { Provider as ChakraProvider } from "./components/ui/provider"; +import { MultichainProvider } from "./multichain/provider.tsx"; +import { Toaster } from "./components/ui/toaster"; -createRoot(document.getElementById('root')!).render( - - - - - - - - , -) +createRoot(document.getElementById("root")!).render( + + + + + + + + , +); diff --git a/examples/multichain/src/multichain/provider.tsx b/examples/multichain/src/multichain/provider.tsx index 1145a5b..176b998 100644 --- a/examples/multichain/src/multichain/provider.tsx +++ b/examples/multichain/src/multichain/provider.tsx @@ -1,12 +1,11 @@ -import { createContext, type ReactNode, type FC, useMemo } from 'react'; -import { MetamaskMultichain } from '@metamask/sdk-multichain'; - +import { createContext, type ReactNode, type FC, useMemo } from "react"; +import { MetamaskMultichain } from "@metamask/sdk-multichain"; export const MultichainContext = createContext(null); type Props = { children: ReactNode; -} +}; export const MultichainProvider: FC = ({ children }) => { const client = useMemo(() => new MetamaskMultichain(), []); @@ -17,4 +16,3 @@ export const MultichainProvider: FC = ({ children }) => { ); }; - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07d8990..055ba89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3012,10 +3012,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.2.6: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} @@ -3085,9 +3081,6 @@ packages: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -7672,7 +7665,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.5 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 is-string: 1.0.7 array-union@2.1.0: {} @@ -8261,12 +8254,12 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 - has-symbols: 1.0.3 + has-symbols: 1.1.0 internal-slot: 1.0.7 iterator.prototype: 1.1.3 safe-array-concat: 1.1.2 @@ -8776,14 +8769,6 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.1.0 - hasown: 2.0.2 - get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 @@ -8874,10 +8859,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.6 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -10278,9 +10259,9 @@ snapshots: es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-symbols: 1.1.0 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 From 4f8dbcfadb7c785f8fcb9879b65126222f29b60c Mon Sep 17 00:00:00 2001 From: Tamas Date: Fri, 14 Feb 2025 12:41:12 +0100 Subject: [PATCH 5/5] tab -> space --- examples/multichain/biome.json | 31 ++ examples/multichain/eslint.config.js | 28 -- examples/multichain/src/App.tsx | 408 +++++++++--------- .../src/components/app/card-container.tsx | 32 +- .../src/components/app/network-dropdown.tsx | 46 +- .../components/app/not-connected-state.tsx | 26 +- .../src/components/layout/background.tsx | 56 +-- .../multichain/src/components/ui/avatar.tsx | 94 ++-- .../multichain/src/components/ui/checkbox.tsx | 34 +- .../src/components/ui/close-button.tsx | 14 +- .../src/components/ui/color-mode.tsx | 136 +++--- .../multichain/src/components/ui/dialog.tsx | 74 ++-- .../multichain/src/components/ui/drawer.tsx | 56 +-- .../multichain/src/components/ui/field.tsx | 50 +-- .../src/components/ui/input-group.tsx | 84 ++-- .../src/components/ui/native-select.tsx | 72 ++-- .../multichain/src/components/ui/popover.tsx | 66 +-- .../multichain/src/components/ui/provider.tsx | 10 +- .../multichain/src/components/ui/radio.tsx | 28 +- .../multichain/src/components/ui/select.tsx | 188 ++++---- .../multichain/src/components/ui/slider.tsx | 122 +++--- .../multichain/src/components/ui/toaster.tsx | 66 +-- .../multichain/src/components/ui/tooltip.tsx | 72 ++-- examples/multichain/src/constants.tsx | 16 +- examples/multichain/src/main.tsx | 16 +- examples/multichain/src/multichain/hooks.ts | 10 +- .../multichain/src/multichain/provider.tsx | 14 +- 27 files changed, 926 insertions(+), 923 deletions(-) create mode 100644 examples/multichain/biome.json delete mode 100644 examples/multichain/eslint.config.js diff --git a/examples/multichain/biome.json b/examples/multichain/biome.json new file mode 100644 index 0000000..f85e6eb --- /dev/null +++ b/examples/multichain/biome.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/examples/multichain/eslint.config.js b/examples/multichain/eslint.config.js deleted file mode 100644 index 092408a..0000000 --- a/examples/multichain/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' - -export default tseslint.config( - { ignores: ['dist'] }, - { - extends: [js.configs.recommended, ...tseslint.configs.recommended], - files: ['**/*.{ts,tsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...reactHooks.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -) diff --git a/examples/multichain/src/App.tsx b/examples/multichain/src/App.tsx index 32b3bbf..1ff7cf1 100644 --- a/examples/multichain/src/App.tsx +++ b/examples/multichain/src/App.tsx @@ -12,210 +12,210 @@ import { NotConnectedState } from "./components/app/not-connected-state.tsx"; import { CardContainer } from "./components/app/card-container.tsx"; function App() { - const [isConnected, setIsConnected] = useState(false); - const [currentNetwork, setCurrentNetwork] = useState(NETWORKS[0].value); - const [userAddress, setUserAddress] = useState(null); - - const client = useMultichain(); - - const handleConnect = async () => { - try { - const connected = await client.connect({ extensionId: EXTENSION_ID }); - - if (connected) { - const session = await client.createSession({ - requiredScopes: { - "eip155:1": { - methods: [], - notifications: [], - }, - "eip155:59144": { - methods: [], - notifications: [], - }, - }, - }); - - console.log("[handleConnect] session", session); - - setIsConnected(true); - - if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { - const address = - session.sessionScopes["eip155:1"].accounts[0].split(":")[2]; - setUserAddress(address); - } - } - } catch (error) { - console.error("[handleConnect] failed to connect:", error); - setIsConnected(false); - } - }; - - const handleDisconnect = () => { - client.disconnect(); - setIsConnected(false); - }; - - const handleSignMessage = async () => { - try { - const result = await client.invokeMethod({ - scope: "eip155:1", - request: { - method: "personal_sign", - params: [ - "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", - userAddress, - ], - }, - }); - - console.log("[signMessage] result", result); - - toaster.create({ - title: "Message Signed", - description: "Your message was successfully signed", - type: "success", - duration: 4000, - }); - } catch (error) { - toaster.create({ - title: "Signing Failed", - description: - error instanceof Error ? error.message : "An error occurred", - type: "error", - duration: 4000, - }); - } - }; - - const handleFetchBlockNumber = async () => { - try { - const result = await client.invokeMethod({ - scope: currentNetwork, - request: { - method: "eth_blockNumber", - params: [], - }, - }); - - console.log("[fetchBlockNumber] result", result); - - const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format - - toaster.create({ - title: "Block Number Retrieved", - description: `Latest block number: ${blockNum}`, - type: "success", - duration: 4000, - }); - } catch (error) { - console.error("[fetchBlockNumber] failed to fetch block number:", error); - - toaster.create({ - title: "Failed to Fetch Block Number", - description: - error instanceof Error ? error.message : "An error occurred", - type: "error", - duration: 4000, - }); - } - }; - - const handleNetworkChange = (value: string) => { - setCurrentNetwork(value); - }; - - return ( - <> - - - - - Logo - - {isConnected && ( - - )} - - - - - - - {isConnected ? ( - - - - - - - - - - - - Documentation - - - GitHub Repository - - - API Reference - - - - - ) : ( - - )} - - - - ); + const [isConnected, setIsConnected] = useState(false); + const [currentNetwork, setCurrentNetwork] = useState(NETWORKS[0].value); + const [userAddress, setUserAddress] = useState(null); + + const client = useMultichain(); + + const handleConnect = async () => { + try { + const connected = await client.connect({ extensionId: EXTENSION_ID }); + + if (connected) { + const session = await client.createSession({ + requiredScopes: { + "eip155:1": { + methods: [], + notifications: [], + }, + "eip155:59144": { + methods: [], + notifications: [], + }, + }, + }); + + console.log("[handleConnect] session", session); + + setIsConnected(true); + + if (session.sessionScopes["eip155:1"]?.accounts?.[0]) { + const address = + session.sessionScopes["eip155:1"].accounts[0].split(":")[2]; + setUserAddress(address); + } + } + } catch (error) { + console.error("[handleConnect] failed to connect:", error); + setIsConnected(false); + } + }; + + const handleDisconnect = () => { + client.disconnect(); + setIsConnected(false); + }; + + const handleSignMessage = async () => { + try { + const result = await client.invokeMethod({ + scope: "eip155:1", + request: { + method: "personal_sign", + params: [ + "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", + userAddress, + ], + }, + }); + + console.log("[signMessage] result", result); + + toaster.create({ + title: "Message Signed", + description: "Your message was successfully signed", + type: "success", + duration: 4000, + }); + } catch (error) { + toaster.create({ + title: "Signing Failed", + description: + error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const handleFetchBlockNumber = async () => { + try { + const result = await client.invokeMethod({ + scope: currentNetwork, + request: { + method: "eth_blockNumber", + params: [], + }, + }); + + console.log("[fetchBlockNumber] result", result); + + const blockNum = Number.parseInt(result as string, 16).toLocaleString(); // Convert hex to decimal and format + + toaster.create({ + title: "Block Number Retrieved", + description: `Latest block number: ${blockNum}`, + type: "success", + duration: 4000, + }); + } catch (error) { + console.error("[fetchBlockNumber] failed to fetch block number:", error); + + toaster.create({ + title: "Failed to Fetch Block Number", + description: + error instanceof Error ? error.message : "An error occurred", + type: "error", + duration: 4000, + }); + } + }; + + const handleNetworkChange = (value: string) => { + setCurrentNetwork(value); + }; + + return ( + <> + + + + + Logo + + {isConnected && ( + + )} + + + + + + + {isConnected ? ( + + + + + + + + + + + + Documentation + + + GitHub Repository + + + API Reference + + + + + ) : ( + + )} + + + + ); } export default App; diff --git a/examples/multichain/src/components/app/card-container.tsx b/examples/multichain/src/components/app/card-container.tsx index 5eec4fd..2e4446c 100644 --- a/examples/multichain/src/components/app/card-container.tsx +++ b/examples/multichain/src/components/app/card-container.tsx @@ -2,23 +2,23 @@ import { Box, Text } from "@chakra-ui/react"; import type { ReactNode } from "react"; type Props = { - title: string; - description?: string; - children: ReactNode; + title: string; + description?: string; + children: ReactNode; }; export function CardContainer({ title, description, children }: Props) { - return ( - - - {title} - - {description && ( - - {description} - - )} - {children} - - ); + return ( + + + {title} + + {description && ( + + {description} + + )} + {children} + + ); } diff --git a/examples/multichain/src/components/app/network-dropdown.tsx b/examples/multichain/src/components/app/network-dropdown.tsx index 49d3d9d..fed86bd 100644 --- a/examples/multichain/src/components/app/network-dropdown.tsx +++ b/examples/multichain/src/components/app/network-dropdown.tsx @@ -5,31 +5,31 @@ import { NativeSelectField, NativeSelectRoot } from "../ui/native-select.tsx"; const networks = createListCollection({ items: NETWORKS }); type NetworkDropdownProps = { - network: string; - onNetworkChange: (value: string) => void; + network: string; + onNetworkChange: (value: string) => void; }; export const NetworkDropdown = ({ - network, - onNetworkChange, + network, + onNetworkChange, }: NetworkDropdownProps) => { - return ( - - onNetworkChange(e.target.value)} - bg="white" - color="black" - borderRadius="sm" - border="none" - fontWeight="medium" - > - {networks.items.map((network) => ( - - ))} - - - ); + return ( + + onNetworkChange(e.target.value)} + bg="white" + color="black" + borderRadius="sm" + border="none" + fontWeight="medium" + > + {networks.items.map((network) => ( + + ))} + + + ); }; diff --git a/examples/multichain/src/components/app/not-connected-state.tsx b/examples/multichain/src/components/app/not-connected-state.tsx index eecfcb4..50c5bb9 100644 --- a/examples/multichain/src/components/app/not-connected-state.tsx +++ b/examples/multichain/src/components/app/not-connected-state.tsx @@ -1,17 +1,17 @@ import { Flex, Box, Text } from "@chakra-ui/react"; export function NotConnectedState() { - return ( - - - 🔒 - - - Not connected - - - Connect your wallet to get started - - - ); + return ( + + + 🔒 + + + Not connected + + + Connect your wallet to get started + + + ); } diff --git a/examples/multichain/src/components/layout/background.tsx b/examples/multichain/src/components/layout/background.tsx index 88babe4..7714640 100644 --- a/examples/multichain/src/components/layout/background.tsx +++ b/examples/multichain/src/components/layout/background.tsx @@ -1,32 +1,32 @@ import { Box } from "@chakra-ui/react"; export function BackgroundNoise() { - return ( - - ); + return ( + + ); } diff --git a/examples/multichain/src/components/ui/avatar.tsx b/examples/multichain/src/components/ui/avatar.tsx index e0824f8..94e2582 100644 --- a/examples/multichain/src/components/ui/avatar.tsx +++ b/examples/multichain/src/components/ui/avatar.tsx @@ -7,68 +7,68 @@ import * as React from "react"; type ImageProps = React.ImgHTMLAttributes; export interface AvatarProps extends ChakraAvatar.RootProps { - name?: string; - src?: string; - srcSet?: string; - loading?: ImageProps["loading"]; - icon?: React.ReactElement; - fallback?: React.ReactNode; + name?: string; + src?: string; + srcSet?: string; + loading?: ImageProps["loading"]; + icon?: React.ReactElement; + fallback?: React.ReactNode; } export const Avatar = React.forwardRef( - function Avatar(props, ref) { - const { name, src, srcSet, loading, icon, fallback, children, ...rest } = - props; - return ( - - - {fallback} - - - {children} - - ); - }, + function Avatar(props, ref) { + const { name, src, srcSet, loading, icon, fallback, children, ...rest } = + props; + return ( + + + {fallback} + + + {children} + + ); + }, ); interface AvatarFallbackProps extends ChakraAvatar.FallbackProps { - name?: string; - icon?: React.ReactElement; + name?: string; + icon?: React.ReactElement; } const AvatarFallback = React.forwardRef( - function AvatarFallback(props, ref) { - const { name, icon, children, ...rest } = props; - return ( - - {children} - {name != null && children == null && <>{getInitials(name)}} - {name == null && children == null && ( - {icon} - )} - - ); - }, + function AvatarFallback(props, ref) { + const { name, icon, children, ...rest } = props; + return ( + + {children} + {name != null && children == null && <>{getInitials(name)}} + {name == null && children == null && ( + {icon} + )} + + ); + }, ); function getInitials(name: string) { - const names = name.trim().split(" "); - const firstName = names[0] != null ? names[0] : ""; - const lastName = names.length > 1 ? names[names.length - 1] : ""; - return firstName && lastName - ? `${firstName.charAt(0)}${lastName.charAt(0)}` - : firstName.charAt(0); + const names = name.trim().split(" "); + const firstName = names[0] != null ? names[0] : ""; + const lastName = names.length > 1 ? names[names.length - 1] : ""; + return firstName && lastName + ? `${firstName.charAt(0)}${lastName.charAt(0)}` + : firstName.charAt(0); } interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {} export const AvatarGroup = React.forwardRef( - function AvatarGroup(props, ref) { - const { size, variant, borderless, ...rest } = props; - return ( - - - - ); - }, + function AvatarGroup(props, ref) { + const { size, variant, borderless, ...rest } = props; + return ( + + + + ); + }, ); diff --git a/examples/multichain/src/components/ui/checkbox.tsx b/examples/multichain/src/components/ui/checkbox.tsx index 9316291..6f2c86d 100644 --- a/examples/multichain/src/components/ui/checkbox.tsx +++ b/examples/multichain/src/components/ui/checkbox.tsx @@ -2,24 +2,24 @@ import { Checkbox as ChakraCheckbox } from "@chakra-ui/react"; import * as React from "react"; export interface CheckboxProps extends ChakraCheckbox.RootProps { - icon?: React.ReactNode; - inputProps?: React.InputHTMLAttributes; - rootRef?: React.Ref; + icon?: React.ReactNode; + inputProps?: React.InputHTMLAttributes; + rootRef?: React.Ref; } export const Checkbox = React.forwardRef( - function Checkbox(props, ref) { - const { icon, children, inputProps, rootRef, ...rest } = props; - return ( - - - - {icon || } - - {children != null && ( - {children} - )} - - ); - }, + function Checkbox(props, ref) { + const { icon, children, inputProps, rootRef, ...rest } = props; + return ( + + + + {icon || } + + {children != null && ( + {children} + )} + + ); + }, ); diff --git a/examples/multichain/src/components/ui/close-button.tsx b/examples/multichain/src/components/ui/close-button.tsx index 90cb245..8dc4448 100644 --- a/examples/multichain/src/components/ui/close-button.tsx +++ b/examples/multichain/src/components/ui/close-button.tsx @@ -6,12 +6,12 @@ import { LuX } from "react-icons/lu"; export type CloseButtonProps = ButtonProps; export const CloseButton = React.forwardRef< - HTMLButtonElement, - CloseButtonProps + HTMLButtonElement, + CloseButtonProps >(function CloseButton(props, ref) { - return ( - - {props.children ?? } - - ); + return ( + + {props.children ?? } + + ); }); diff --git a/examples/multichain/src/components/ui/color-mode.tsx b/examples/multichain/src/components/ui/color-mode.tsx index 887b9e4..bd42058 100644 --- a/examples/multichain/src/components/ui/color-mode.tsx +++ b/examples/multichain/src/components/ui/color-mode.tsx @@ -10,98 +10,98 @@ import { LuMoon, LuSun } from "react-icons/lu"; export interface ColorModeProviderProps extends ThemeProviderProps {} export function ColorModeProvider(props: ColorModeProviderProps) { - return ( - - ); + return ( + + ); } export type ColorMode = "light" | "dark"; export interface UseColorModeReturn { - colorMode: ColorMode; - setColorMode: (colorMode: ColorMode) => void; - toggleColorMode: () => void; + colorMode: ColorMode; + setColorMode: (colorMode: ColorMode) => void; + toggleColorMode: () => void; } export function useColorMode(): UseColorModeReturn { - const { resolvedTheme, setTheme } = useTheme(); - const toggleColorMode = () => { - setTheme(resolvedTheme === "dark" ? "light" : "dark"); - }; - return { - colorMode: resolvedTheme as ColorMode, - setColorMode: setTheme, - toggleColorMode, - }; + const { resolvedTheme, setTheme } = useTheme(); + const toggleColorMode = () => { + setTheme(resolvedTheme === "dark" ? "light" : "dark"); + }; + return { + colorMode: resolvedTheme as ColorMode, + setColorMode: setTheme, + toggleColorMode, + }; } export function useColorModeValue(light: T, dark: T) { - const { colorMode } = useColorMode(); - return colorMode === "dark" ? dark : light; + const { colorMode } = useColorMode(); + return colorMode === "dark" ? dark : light; } export function ColorModeIcon() { - const { colorMode } = useColorMode(); - return colorMode === "dark" ? : ; + const { colorMode } = useColorMode(); + return colorMode === "dark" ? : ; } interface ColorModeButtonProps extends Omit {} export const ColorModeButton = React.forwardRef< - HTMLButtonElement, - ColorModeButtonProps + HTMLButtonElement, + ColorModeButtonProps >(function ColorModeButton(props, ref) { - const { toggleColorMode } = useColorMode(); - return ( - }> - - - - - ); + const { toggleColorMode } = useColorMode(); + return ( + }> + + + + + ); }); export const LightMode = React.forwardRef( - function LightMode(props, ref) { - return ( - - ); - }, + function LightMode(props, ref) { + return ( + + ); + }, ); export const DarkMode = React.forwardRef( - function DarkMode(props, ref) { - return ( - - ); - }, + function DarkMode(props, ref) { + return ( + + ); + }, ); diff --git a/examples/multichain/src/components/ui/dialog.tsx b/examples/multichain/src/components/ui/dialog.tsx index 8f81a0a..e954059 100644 --- a/examples/multichain/src/components/ui/dialog.tsx +++ b/examples/multichain/src/components/ui/dialog.tsx @@ -3,52 +3,52 @@ import { CloseButton } from "./close-button"; import * as React from "react"; interface DialogContentProps extends ChakraDialog.ContentProps { - portalled?: boolean; - portalRef?: React.RefObject; - backdrop?: boolean; + portalled?: boolean; + portalRef?: React.RefObject; + backdrop?: boolean; } export const DialogContent = React.forwardRef< - HTMLDivElement, - DialogContentProps + HTMLDivElement, + DialogContentProps >(function DialogContent(props, ref) { - const { - children, - portalled = true, - portalRef, - backdrop = true, - ...rest - } = props; + const { + children, + portalled = true, + portalRef, + backdrop = true, + ...rest + } = props; - return ( - - {backdrop && } - - - {children} - - - - ); + return ( + + {backdrop && } + + + {children} + + + + ); }); export const DialogCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraDialog.CloseTriggerProps + HTMLButtonElement, + ChakraDialog.CloseTriggerProps >(function DialogCloseTrigger(props, ref) { - return ( - - - {props.children} - - - ); + return ( + + + {props.children} + + + ); }); export const DialogRoot = ChakraDialog.Root; diff --git a/examples/multichain/src/components/ui/drawer.tsx b/examples/multichain/src/components/ui/drawer.tsx index 6e5aa18..447c57a 100644 --- a/examples/multichain/src/components/ui/drawer.tsx +++ b/examples/multichain/src/components/ui/drawer.tsx @@ -3,42 +3,42 @@ import { CloseButton } from "./close-button"; import * as React from "react"; interface DrawerContentProps extends ChakraDrawer.ContentProps { - portalled?: boolean; - portalRef?: React.RefObject; - offset?: ChakraDrawer.ContentProps["padding"]; + portalled?: boolean; + portalRef?: React.RefObject; + offset?: ChakraDrawer.ContentProps["padding"]; } export const DrawerContent = React.forwardRef< - HTMLDivElement, - DrawerContentProps + HTMLDivElement, + DrawerContentProps >(function DrawerContent(props, ref) { - const { children, portalled = true, portalRef, offset, ...rest } = props; - return ( - - - - {children} - - - - ); + const { children, portalled = true, portalRef, offset, ...rest } = props; + return ( + + + + {children} + + + + ); }); export const DrawerCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraDrawer.CloseTriggerProps + HTMLButtonElement, + ChakraDrawer.CloseTriggerProps >(function DrawerCloseTrigger(props, ref) { - return ( - - - - ); + return ( + + + + ); }); export const DrawerTrigger = ChakraDrawer.Trigger; diff --git a/examples/multichain/src/components/ui/field.tsx b/examples/multichain/src/components/ui/field.tsx index 56ff70e..4cb5529 100644 --- a/examples/multichain/src/components/ui/field.tsx +++ b/examples/multichain/src/components/ui/field.tsx @@ -2,32 +2,32 @@ import { Field as ChakraField } from "@chakra-ui/react"; import * as React from "react"; export interface FieldProps extends Omit { - label?: React.ReactNode; - helperText?: React.ReactNode; - errorText?: React.ReactNode; - optionalText?: React.ReactNode; + label?: React.ReactNode; + helperText?: React.ReactNode; + errorText?: React.ReactNode; + optionalText?: React.ReactNode; } export const Field = React.forwardRef( - function Field(props, ref) { - const { label, children, helperText, errorText, optionalText, ...rest } = - props; - return ( - - {label && ( - - {label} - - - )} - {children} - {helperText && ( - {helperText} - )} - {errorText && ( - {errorText} - )} - - ); - }, + function Field(props, ref) { + const { label, children, helperText, errorText, optionalText, ...rest } = + props; + return ( + + {label && ( + + {label} + + + )} + {children} + {helperText && ( + {helperText} + )} + {errorText && ( + {errorText} + )} + + ); + }, ); diff --git a/examples/multichain/src/components/ui/input-group.tsx b/examples/multichain/src/components/ui/input-group.tsx index ab61cbb..992eb0f 100644 --- a/examples/multichain/src/components/ui/input-group.tsx +++ b/examples/multichain/src/components/ui/input-group.tsx @@ -3,51 +3,51 @@ import { Group, InputElement } from "@chakra-ui/react"; import * as React from "react"; export interface InputGroupProps extends BoxProps { - startElementProps?: InputElementProps; - endElementProps?: InputElementProps; - startElement?: React.ReactNode; - endElement?: React.ReactNode; - children: React.ReactElement; - startOffset?: InputElementProps["paddingStart"]; - endOffset?: InputElementProps["paddingEnd"]; + startElementProps?: InputElementProps; + endElementProps?: InputElementProps; + startElement?: React.ReactNode; + endElement?: React.ReactNode; + children: React.ReactElement; + startOffset?: InputElementProps["paddingStart"]; + endOffset?: InputElementProps["paddingEnd"]; } export const InputGroup = React.forwardRef( - function InputGroup(props, ref) { - const { - startElement, - startElementProps, - endElement, - endElementProps, - children, - startOffset = "6px", - endOffset = "6px", - ...rest - } = props; + function InputGroup(props, ref) { + const { + startElement, + startElementProps, + endElement, + endElementProps, + children, + startOffset = "6px", + endOffset = "6px", + ...rest + } = props; - const child = - React.Children.only>(children); + const child = + React.Children.only>(children); - return ( - - {startElement && ( - - {startElement} - - )} - {React.cloneElement(child, { - ...(startElement && { - ps: `calc(var(--input-height) - ${startOffset})`, - }), - ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), - ...children.props, - })} - {endElement && ( - - {endElement} - - )} - - ); - }, + return ( + + {startElement && ( + + {startElement} + + )} + {React.cloneElement(child, { + ...(startElement && { + ps: `calc(var(--input-height) - ${startOffset})`, + }), + ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), + ...children.props, + })} + {endElement && ( + + {endElement} + + )} + + ); + }, ); diff --git a/examples/multichain/src/components/ui/native-select.tsx b/examples/multichain/src/components/ui/native-select.tsx index a98f7f3..2cd023b 100644 --- a/examples/multichain/src/components/ui/native-select.tsx +++ b/examples/multichain/src/components/ui/native-select.tsx @@ -4,54 +4,54 @@ import { NativeSelect as Select } from "@chakra-ui/react"; import * as React from "react"; interface NativeSelectRootProps extends Select.RootProps { - icon?: React.ReactNode; + icon?: React.ReactNode; } export const NativeSelectRoot = React.forwardRef< - HTMLDivElement, - NativeSelectRootProps + HTMLDivElement, + NativeSelectRootProps >(function NativeSelect(props, ref) { - const { icon, children, ...rest } = props; - return ( - - {children} - {icon} - - ); + const { icon, children, ...rest } = props; + return ( + + {children} + {icon} + + ); }); interface NativeSelectItem { - value: string; - label: string; - disabled?: boolean; + value: string; + label: string; + disabled?: boolean; } interface NativeSelectField extends Select.FieldProps { - items?: Array; + items?: Array; } export const NativeSelectField = React.forwardRef< - HTMLSelectElement, - NativeSelectField + HTMLSelectElement, + NativeSelectField >(function NativeSelectField(props, ref) { - const { items: itemsProp, children, ...rest } = props; - - const items = React.useMemo( - () => - itemsProp?.map((item) => - typeof item === "string" ? { label: item, value: item } : item, - ), - [itemsProp], - ); - - return ( - - {children} - {items?.map((item) => ( - - ))} - - ); + const { items: itemsProp, children, ...rest } = props; + + const items = React.useMemo( + () => + itemsProp?.map((item) => + typeof item === "string" ? { label: item, value: item } : item, + ), + [itemsProp], + ); + + return ( + + {children} + {items?.map((item) => ( + + ))} + + ); }); diff --git a/examples/multichain/src/components/ui/popover.tsx b/examples/multichain/src/components/ui/popover.tsx index ed8b105..0262a89 100644 --- a/examples/multichain/src/components/ui/popover.tsx +++ b/examples/multichain/src/components/ui/popover.tsx @@ -3,51 +3,51 @@ import { CloseButton } from "./close-button"; import * as React from "react"; interface PopoverContentProps extends ChakraPopover.ContentProps { - portalled?: boolean; - portalRef?: React.RefObject; + portalled?: boolean; + portalRef?: React.RefObject; } export const PopoverContent = React.forwardRef< - HTMLDivElement, - PopoverContentProps + HTMLDivElement, + PopoverContentProps >(function PopoverContent(props, ref) { - const { portalled = true, portalRef, ...rest } = props; - return ( - - - - - - ); + const { portalled = true, portalRef, ...rest } = props; + return ( + + + + + + ); }); export const PopoverArrow = React.forwardRef< - HTMLDivElement, - ChakraPopover.ArrowProps + HTMLDivElement, + ChakraPopover.ArrowProps >(function PopoverArrow(props, ref) { - return ( - - - - ); + return ( + + + + ); }); export const PopoverCloseTrigger = React.forwardRef< - HTMLButtonElement, - ChakraPopover.CloseTriggerProps + HTMLButtonElement, + ChakraPopover.CloseTriggerProps >(function PopoverCloseTrigger(props, ref) { - return ( - - - - ); + return ( + + + + ); }); export const PopoverTitle = ChakraPopover.Title; diff --git a/examples/multichain/src/components/ui/provider.tsx b/examples/multichain/src/components/ui/provider.tsx index b8082b5..c1f896c 100644 --- a/examples/multichain/src/components/ui/provider.tsx +++ b/examples/multichain/src/components/ui/provider.tsx @@ -4,9 +4,9 @@ import { ChakraProvider, defaultSystem } from "@chakra-ui/react"; import { ColorModeProvider, type ColorModeProviderProps } from "./color-mode"; export function Provider(props: ColorModeProviderProps) { - return ( - - - - ); + return ( + + + + ); } diff --git a/examples/multichain/src/components/ui/radio.tsx b/examples/multichain/src/components/ui/radio.tsx index c41d47a..365e1d2 100644 --- a/examples/multichain/src/components/ui/radio.tsx +++ b/examples/multichain/src/components/ui/radio.tsx @@ -2,23 +2,23 @@ import { RadioGroup as ChakraRadioGroup } from "@chakra-ui/react"; import * as React from "react"; export interface RadioProps extends ChakraRadioGroup.ItemProps { - rootRef?: React.Ref; - inputProps?: React.InputHTMLAttributes; + rootRef?: React.Ref; + inputProps?: React.InputHTMLAttributes; } export const Radio = React.forwardRef( - function Radio(props, ref) { - const { children, inputProps, rootRef, ...rest } = props; - return ( - - - - {children && ( - {children} - )} - - ); - }, + function Radio(props, ref) { + const { children, inputProps, rootRef, ...rest } = props; + return ( + + + + {children && ( + {children} + )} + + ); + }, ); export const RadioGroup = ChakraRadioGroup.Root; diff --git a/examples/multichain/src/components/ui/select.tsx b/examples/multichain/src/components/ui/select.tsx index 939a005..6588013 100644 --- a/examples/multichain/src/components/ui/select.tsx +++ b/examples/multichain/src/components/ui/select.tsx @@ -6,137 +6,137 @@ import { CloseButton } from "./close-button"; import * as React from "react"; interface SelectTriggerProps extends ChakraSelect.ControlProps { - clearable?: boolean; + clearable?: boolean; } export const SelectTrigger = React.forwardRef< - HTMLButtonElement, - SelectTriggerProps + HTMLButtonElement, + SelectTriggerProps >(function SelectTrigger(props, ref) { - const { children, clearable, ...rest } = props; - return ( - - {children} - - {clearable && } - - - - ); + const { children, clearable, ...rest } = props; + return ( + + {children} + + {clearable && } + + + + ); }); const SelectClearTrigger = React.forwardRef< - HTMLButtonElement, - ChakraSelect.ClearTriggerProps + HTMLButtonElement, + ChakraSelect.ClearTriggerProps >(function SelectClearTrigger(props, ref) { - return ( - - - - ); + return ( + + + + ); }); interface SelectContentProps extends ChakraSelect.ContentProps { - portalled?: boolean; - portalRef?: React.RefObject; + portalled?: boolean; + portalRef?: React.RefObject; } export const SelectContent = React.forwardRef< - HTMLDivElement, - SelectContentProps + HTMLDivElement, + SelectContentProps >(function SelectContent(props, ref) { - const { portalled = true, portalRef, ...rest } = props; - return ( - - - - - - ); + const { portalled = true, portalRef, ...rest } = props; + return ( + + + + + + ); }); export const SelectItem = React.forwardRef< - HTMLDivElement, - ChakraSelect.ItemProps + HTMLDivElement, + ChakraSelect.ItemProps >(function SelectItem(props, ref) { - const { item, children, ...rest } = props; - return ( - - {children} - - - ); + const { item, children, ...rest } = props; + return ( + + {children} + + + ); }); interface SelectValueTextProps - extends Omit { - children?(items: CollectionItem[]): React.ReactNode; + extends Omit { + children?(items: CollectionItem[]): React.ReactNode; } export const SelectValueText = React.forwardRef< - HTMLSpanElement, - SelectValueTextProps + HTMLSpanElement, + SelectValueTextProps >(function SelectValueText(props, ref) { - const { children, ...rest } = props; - return ( - - - {(select) => { - const items = select.selectedItems; - if (items.length === 0) return props.placeholder; - if (children) return children(items); - if (items.length === 1) - return select.collection.stringifyItem(items[0]); - return `${items.length} selected`; - }} - - - ); + const { children, ...rest } = props; + return ( + + + {(select) => { + const items = select.selectedItems; + if (items.length === 0) return props.placeholder; + if (children) return children(items); + if (items.length === 1) + return select.collection.stringifyItem(items[0]); + return `${items.length} selected`; + }} + + + ); }); export const SelectRoot = React.forwardRef< - HTMLDivElement, - ChakraSelect.RootProps + HTMLDivElement, + ChakraSelect.RootProps >(function SelectRoot(props, ref) { - return ( - - {props.asChild ? ( - props.children - ) : ( - <> - - {props.children} - - )} - - ); + return ( + + {props.asChild ? ( + props.children + ) : ( + <> + + {props.children} + + )} + + ); }) as ChakraSelect.RootComponent; interface SelectItemGroupProps extends ChakraSelect.ItemGroupProps { - label: React.ReactNode; + label: React.ReactNode; } export const SelectItemGroup = React.forwardRef< - HTMLDivElement, - SelectItemGroupProps + HTMLDivElement, + SelectItemGroupProps >(function SelectItemGroup(props, ref) { - const { children, label, ...rest } = props; - return ( - - {label} - {children} - - ); + const { children, label, ...rest } = props; + return ( + + {label} + {children} + + ); }); export const SelectLabel = ChakraSelect.Label; diff --git a/examples/multichain/src/components/ui/slider.tsx b/examples/multichain/src/components/ui/slider.tsx index 1005c68..e3eaf52 100644 --- a/examples/multichain/src/components/ui/slider.tsx +++ b/examples/multichain/src/components/ui/slider.tsx @@ -2,81 +2,81 @@ import { Slider as ChakraSlider, For, HStack } from "@chakra-ui/react"; import * as React from "react"; export interface SliderProps extends ChakraSlider.RootProps { - marks?: Array; - label?: React.ReactNode; - showValue?: boolean; + marks?: Array; + label?: React.ReactNode; + showValue?: boolean; } export const Slider = React.forwardRef( - function Slider(props, ref) { - const { marks: marksProp, label, showValue, ...rest } = props; - const value = props.defaultValue ?? props.value; + function Slider(props, ref) { + const { marks: marksProp, label, showValue, ...rest } = props; + const value = props.defaultValue ?? props.value; - const marks = marksProp?.map((mark) => { - if (typeof mark === "number") return { value: mark, label: undefined }; - return mark; - }); + const marks = marksProp?.map((mark) => { + if (typeof mark === "number") return { value: mark, label: undefined }; + return mark; + }); - const hasMarkLabel = !!marks?.some((mark) => mark.label); + const hasMarkLabel = !!marks?.some((mark) => mark.label); - return ( - - {label && !showValue && ( - {label} - )} - {label && showValue && ( - - {label} - - - )} - - - - - - - - - ); - }, + return ( + + {label && !showValue && ( + {label} + )} + {label && showValue && ( + + {label} + + + )} + + + + + + + + + ); + }, ); function SliderThumbs(props: { value?: number[] }) { - const { value } = props; - return ( - - {(_, index) => ( - - - - )} - - ); + const { value } = props; + return ( + + {(_, index) => ( + + + + )} + + ); } interface SliderMarksProps { - marks?: Array; + marks?: Array; } const SliderMarks = React.forwardRef( - function SliderMarks(props, ref) { - const { marks } = props; - if (!marks?.length) return null; + function SliderMarks(props, ref) { + const { marks } = props; + if (!marks?.length) return null; - return ( - - {marks.map((mark, index) => { - const value = typeof mark === "number" ? mark : mark.value; - const label = typeof mark === "number" ? undefined : mark.label; - return ( - - - {label} - - ); - })} - - ); - }, + return ( + + {marks.map((mark, index) => { + const value = typeof mark === "number" ? mark : mark.value; + const label = typeof mark === "number" ? undefined : mark.label; + return ( + + + {label} + + ); + })} + + ); + }, ); diff --git a/examples/multichain/src/components/ui/toaster.tsx b/examples/multichain/src/components/ui/toaster.tsx index 9c3eb50..a2b882c 100644 --- a/examples/multichain/src/components/ui/toaster.tsx +++ b/examples/multichain/src/components/ui/toaster.tsx @@ -1,43 +1,43 @@ "use client"; import { - Toaster as ChakraToaster, - Portal, - Spinner, - Stack, - Toast, - createToaster, + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, } from "@chakra-ui/react"; export const toaster = createToaster({ - placement: "bottom-end", - pauseOnPageIdle: true, + placement: "bottom-end", + pauseOnPageIdle: true, }); export const Toaster = () => { - return ( - - - {(toast) => ( - - {toast.type === "loading" ? ( - - ) : ( - - )} - - {toast.title && {toast.title}} - {toast.description && ( - {toast.description} - )} - - {toast.action && ( - {toast.action.label} - )} - {toast.meta?.closable && } - - )} - - - ); + return ( + + + {(toast) => ( + + {toast.type === "loading" ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.meta?.closable && } + + )} + + + ); }; diff --git a/examples/multichain/src/components/ui/tooltip.tsx b/examples/multichain/src/components/ui/tooltip.tsx index 92613e5..66fb414 100644 --- a/examples/multichain/src/components/ui/tooltip.tsx +++ b/examples/multichain/src/components/ui/tooltip.tsx @@ -2,45 +2,45 @@ import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react"; import * as React from "react"; export interface TooltipProps extends ChakraTooltip.RootProps { - showArrow?: boolean; - portalled?: boolean; - portalRef?: React.RefObject; - content: React.ReactNode; - contentProps?: ChakraTooltip.ContentProps; - disabled?: boolean; + showArrow?: boolean; + portalled?: boolean; + portalRef?: React.RefObject; + content: React.ReactNode; + contentProps?: ChakraTooltip.ContentProps; + disabled?: boolean; } export const Tooltip = React.forwardRef( - function Tooltip(props, ref) { - const { - showArrow, - children, - disabled, - portalled = true, - content, - contentProps, - portalRef, - ...rest - } = props; + function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props; - if (disabled) return children; + if (disabled) return children; - return ( - - {children} - - - - {showArrow && ( - - - - )} - {content} - - - - - ); - }, + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ); + }, ); diff --git a/examples/multichain/src/constants.tsx b/examples/multichain/src/constants.tsx index 2a6e41d..f015e09 100644 --- a/examples/multichain/src/constants.tsx +++ b/examples/multichain/src/constants.tsx @@ -1,12 +1,12 @@ export const EXTENSION_ID = "eklmonnmoaepkgaomjcefmimkkfikokn"; export const NETWORKS = [ - { - label: "Ethereum", - value: "eip155:1", - }, - { - label: "Linea", - value: "eip155:59144", - }, + { + label: "Ethereum", + value: "eip155:1", + }, + { + label: "Linea", + value: "eip155:59144", + }, ]; diff --git a/examples/multichain/src/main.tsx b/examples/multichain/src/main.tsx index 749157d..5aec98e 100644 --- a/examples/multichain/src/main.tsx +++ b/examples/multichain/src/main.tsx @@ -6,12 +6,12 @@ import { MultichainProvider } from "./multichain/provider.tsx"; import { Toaster } from "./components/ui/toaster"; createRoot(document.getElementById("root")!).render( - - - - - - - - , + + + + + + + + , ); diff --git a/examples/multichain/src/multichain/hooks.ts b/examples/multichain/src/multichain/hooks.ts index 285db5e..6bbef9f 100644 --- a/examples/multichain/src/multichain/hooks.ts +++ b/examples/multichain/src/multichain/hooks.ts @@ -2,9 +2,9 @@ import { useContext } from "react"; import { MultichainContext } from "./provider"; export const useMultichain = () => { - const client = useContext(MultichainContext); - if (!client) { - throw new Error("Multichain client not found"); - } - return client; + const client = useContext(MultichainContext); + if (!client) { + throw new Error("Multichain client not found"); + } + return client; }; diff --git a/examples/multichain/src/multichain/provider.tsx b/examples/multichain/src/multichain/provider.tsx index 176b998..bc91a3f 100644 --- a/examples/multichain/src/multichain/provider.tsx +++ b/examples/multichain/src/multichain/provider.tsx @@ -4,15 +4,15 @@ import { MetamaskMultichain } from "@metamask/sdk-multichain"; export const MultichainContext = createContext(null); type Props = { - children: ReactNode; + children: ReactNode; }; export const MultichainProvider: FC = ({ children }) => { - const client = useMemo(() => new MetamaskMultichain(), []); + const client = useMemo(() => new MetamaskMultichain(), []); - return ( - - {children} - - ); + return ( + + {children} + + ); };